首页 > 解决方案 > 在 ML.NET 中更新经过训练的模型

问题描述

这个例子展示了如何使用矩阵分解来构建推荐系统。这个例子特别适用于只有两个相关 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 或示例。我最终在 ML.NET 的官方 github 上留下了一个问题,但到目前为止我还没有得到任何答案。

问题很简单,简而言之,如何在 ML.NET 中更新经过训练的模型?链接相关的信息来源也将不胜感激。

标签: machine-learningmatrix-factorizationml.net

解决方案


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

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

推荐阅读