写在前面
准备近期将微软的 machinelearning-samples 翻译成中文, 水平有限, 如有错漏, 请大家多多指正.
如果有朋友对此感兴趣, 可以加入我:
电影推荐 - 矩阵分解示例
ML.NET 版本 | API 类型 | 状态 | 应用程序类型 | 数据类型 | 场景 | 机器学习任务 | 算法 |
---|---|---|---|---|---|---|---|
v0.7 | 动态 API | 最新版本 | 控制台应用程序 | .csv 文件 | 推荐 | 矩阵分解 | MatrixFactorizationTrainer |
在这个示例中, 您可以看到如何使用 ML.NET 来构建电影推荐引擎.
问题
在本教程中, 我们将使用 MovieLens 数据集, 其中包含电影评分, 标题, 流派等信息. 在构建我们的电影推荐引擎的方法方面, 我们将使用分解机, 它使用协同过滤方法.
"协同过滤" 是在一个基本假设的情况下运作的, 即如果某人 A 在一个问题上与某人 B 具有相同的意见, 则在另一个问题上, 相对其他随机选择的人, A 更倾向于 B 的观点.
使用 ML.NET, 我们支持以下三种推荐场景, 根据您的场景, 您可以从下面的列表中选择三种场景之一.
场景 | 算法 | 示例链接 |
---|---|---|
你有用户购买行为中的用户 Id、产品 Id 和评分。 | 矩阵分解 | 当前示例 |
你仅有用户购买行为中用户 Id 和产品 Id,但是没有评分。 这在来自在线商店的数据集中很常见,您可能只能访问客户的购买历史记录。 有了这种类型的推荐,你可以建立一个推荐引擎用来推荐经常购买的物品。 | One Class 矩阵分解 | 产品推荐器 |
您希望在您的推荐引擎中使用用户 Id、产品 Id 和评分之外的更多属性(特征),例如产品描述,产品价格等。 | 场感知分解机 | 基于分解机的电影推荐器 |
数据集
原始数据来自 MovieLens 数据集:
ML 任务 - 矩阵分解(推荐)
这个示例的 ML 任务是矩阵分解, 它是一个执行协同过滤的有监督的机器学习任务.
解决方案
要解决此问题, 您需要在现有训练数据上建立和训练 ML 模型, 评估其有多好(分析获得的指标), 最后您可以使用 / 测试模型来预测给定输入数据变量的需求.
1. 建立模型
建立模型包括:
定义映射到数据集的数据模式, 并使用 DataReader 读取(recommended-ratings-train.CSV 和 recommended-ratings-test.CSV)
矩阵分解需要对 userId,movieId 这两个特征进行编码
然后 MatrixFactorizationTrainer 将这两个已编码特征 (userId, movieId) 作为输入
下面是用于建立模型的代码:
- var mlcontext = new MLContext();
- var reader = mlcontext.Data.TextReader(new TextLoader.Arguments()
- {
- Separator = ",",
- HasHeader = true,
- Column = new[]
- {
- new TextLoader.Column("userId", DataKind.R4, 0),
- new TextLoader.Column("movieId", DataKind.R4, 1),
- new TextLoader.Column("Label", DataKind.R4, 2)
- }
- });
- IDataView trainingDataView = reader.Read(new MultiFileSource(TrainingDataLocation));
- var pipeline = mlcontext.Transforms.Categorical.MapValueToKey("userId", "userIdEncoded")
- .Append(mlcontext.Transforms.Categorical.MapValueToKey("movieId", "movieIdEncoded")
- .Append(new MatrixFactorizationTrainer(mlcontext, "Label","userIdEncoded", "movieIdEncoded")));
2. 训练模型
训练模型是在训练数据 (具有已知电影和用户评分) 上运行所选算法以调整模型参数的过程. 它是在评估器对象的 Fit()方法中实现的.
要执行训练, 您需要调用 Fit()方法访问在 DataView 对象中提供的训练数据集(recommendation-ratings-train.CSV 文件).
var model = pipeline.Fit(trainingDataView);
请注意, ML.NET 使用延迟加载方法处理数据, 所以实际上只有调用. Fit()方法时才真正在内存中加载数据.
3. 评估模型
我们需要这一步来总结我们的模型对新数据的准确性. 为此, 上一步中的模型针对未在训练中使用的另一个数据集运行(recommendation-ratings-test.CSV).
Evaluate() 比较测试数据集的预测值并生成各种指标, 例如准确性, 您可以进行研究.
- Console.WriteLine("=============== Evaluating the model ===============");
- IDataView testDataView = reader.Read(new MultiFileSource(TestDataLocation));
- var prediction = model.Transform(testDataView);
- var metrics = mlcontext.Regression.Evaluate(prediction, label: "Label", score: "Score");
4. 使用模型
训练模型后, 您可以使用 Predict()API 来预测特定电影 / 用户组合的评分.
- var predictionengine = model.MakePredictionFunction<MovieRating, MovieRatingPrediction>(mlcontext);
- var movieratingprediction = predictionengine.Predict(
- new MovieRating()
- {
- //Example rating prediction for userId = 6, movieId = 10 (GoldenEye)
- userId = predictionuserId,
- movieId = predictionmovieId
- }
- );
- Console.WriteLine("For userId:" + predictionuserId + "movie rating prediction (1 - 5 stars) for movie:" +
- movieService.Get(predictionmovieId).movieTitle + "is:" + Math.Round(movieratingprediction.Score,1));
请注意, 这是用矩阵分解进行电影推荐的一种方法. 还有其他的推荐方案, 我们也将为其建立示例.
来源: https://www.cnblogs.com/feiyun0112/p/10104881.html