在 ML.NET 中更新经过训练的模型

Posted

技术标签:

【中文标题】在 ML.NET 中更新经过训练的模型【英文标题】:Update a trained model in ML.NET 【发布时间】:2019-06-02 16:58:45 【问题描述】:

这个example 展示了如何使用矩阵分解来构建推荐系统。这个例子特别适用于只有两个相关 id 的数据集,比如对应用户购买的用户 id 和产品 id。

基于这个例子,我准备了如下的输入数据。

[UserId] [ProductId]
3    1
3    15
3    23
5    9
5    1
8    2
8    1
.
.

并更改列名,使TextLoader

var reader = ctx.Data.TextReader(new TextLoader.Arguments()

     Separator = "tab",
     HasHeader = true,
     Column = new[]
     
              new TextLoader.Column("Label", DataKind.R4, 0),
              new TextLoader.Column("UserId", DataKind.U4, new []  new TextLoader.Range(0) , new KeyRange(0, 100000)),
              new TextLoader.Column("ProductId", DataKind.U4, new []  new TextLoader.Range(1) , new KeyRange(0, 300))
     
     );

效果很好。它推荐目标用户可以购买的产品列表,并带有个人分数。但是,它不适用于初始输入数据中不存在的新客户数据,例如UserId 1,它会根据预测给出分数NaN

重新训练模型可能是一个显而易见的答案,但每次有新数据进入时重新训练模型似乎是徒劳的。我认为肯定有一种方法可以更新现有模型,但我找不到相关文档、API 或随处取样。我最终离开了a question in the official github of ML.NET,但到目前为止我还没有得到任何答复。

问题很简单,简而言之,如何?链接相关信息源也将不胜感激。

【问题讨论】:

***.com/questions/52470794/… 【参考方案1】:

在此特定示例中,由于正在执行的任务,您仅限于模型训练时所依据的观察范围,并且可以对该集合进行预测。正如你所提到的,一个很好的方法是重新训练。我自己没有尝试过,但您可能想尝试以下方法之一:

    使用您要训练的新数据作为输入再次运行Fit 函数。模型不仅应该保留之前的训练,还应该使用您提供的其他数据重新训练。 将模型保存到文件,加载持久模型,运行Fit 函数,如上。

【讨论】:

我们是否确认在已经训练好的数据集上运行 Fit 可以达到我们预期的效果?如果没有,我会在今天晚些时候试一试,看看会发生什么。 那么,比尔,发生了什么事? 对此有何更新?【参考方案2】:

截至 2021 年:

这里详细描述了重新训练的过程:https://docs.microsoft.com/en-us/dotnet/machine-learning/how-to-guides/retrain-model-ml-net

【讨论】:

以上是关于在 ML.NET 中更新经过训练的模型的主要内容,如果未能解决你的问题,请参考以下文章

Ml.Net 图像分类增量学习

ML.NET机器学习API容器化与Azure DevOps实践:RESTful API

[.NET6]使用ML.NET+ONNX预训练模型整活B站经典《华强买瓜》

ML.NET Cookbook:(18)如何在文本数据上训练模型?

使用ML.NET+ONNX预训练模型整活B站经典《华强买瓜》

ML.NET Cookbook:(17)如何在分类数据上训练模型?