写在前面

准备近期将微软的machinelearning-samples翻译成中文,水平有限,如有错漏,请大家多多指正。

如果有朋友对此感兴趣,可以加入我:https://github.com/feiyun0112/machinelearning-samples.zh-cn

电影推荐 - 矩阵分解示例

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数据集:

http://files.grouplens.org/datasets/movielens/ml-latest-small.zip

ML 任务 - 矩阵分解(推荐)

这个示例的ML任务是矩阵分解,它是一个执行协同过滤的有监督的机器学习任务。

解决方案

要解决此问题,您需要在现有训练数据上建立和训练ML模型,评估其有多好(分析获得的指标),最后您可以使用/测试模型来预测给定输入数据变量的需求。

1. 建立模型

建立模型包括:

  • 定义映射到数据集的数据模式,并使用DataReader读取(recommended-ratings-train.csvrecommended-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));

请注意,这是用矩阵分解进行电影推荐的一种方法。还有其他的推荐方案,我们也将为其建立示例。

ML.NET 示例:推荐之矩阵分解的更多相关文章

  1. 推荐系统实践 0x0b 矩阵分解

    前言 推荐系统实践那本书基本上就更新到上一篇了,之后的内容会把各个算法拿来当专题进行讲解.在这一篇,我们将会介绍矩阵分解这一方法.一般来说,协同过滤算法(基于用户.基于物品)会有一个比较严重的问题,那 ...

  2. ML.NET 示例:推荐之One Class 矩阵分解

    写在前面 准备近期将微软的machinelearning-samples翻译成中文,水平有限,如有错漏,请大家多多指正. 如果有朋友对此感兴趣,可以加入我:https://github.com/fei ...

  3. ML.NET 示例:推荐之场感知分解机

    写在前面 准备近期将微软的machinelearning-samples翻译成中文,水平有限,如有错漏,请大家多多指正. 如果有朋友对此感兴趣,可以加入我:https://github.com/fei ...

  4. 【Math for ML】矩阵分解(Matrix Decompositions) (下)

    [Math for ML]矩阵分解(Matrix Decompositions) (上) I. 奇异值分解(Singular Value Decomposition) 1. 定义 Singular V ...

  5. HAWQ + MADlib 玩转数据挖掘之(四)——低秩矩阵分解实现推荐算法

    一.潜在因子(Latent Factor)推荐算法 本算法整理自知乎上的回答@nick lee.应用领域:"网易云音乐歌单个性化推荐"."豆瓣电台音乐推荐"等. ...

  6. 用Spark学习矩阵分解推荐算法

    在矩阵分解在协同过滤推荐算法中的应用中,我们对矩阵分解在推荐算法中的应用原理做了总结,这里我们就从实践的角度来用Spark学习矩阵分解推荐算法. 1. Spark推荐算法概述 在Spark MLlib ...

  7. 简单的基于矩阵分解的推荐算法-PMF, NMF

    介绍: 推荐系统中最为主流与经典的技术之一是协同过滤技术(Collaborative Filtering),它是基于这样的假设:用户如果在过去对某些项目产生过兴趣,那么将来他很可能依然对其保持热忱.其 ...

  8. 推荐算法之用矩阵分解做协调过滤——LFM模型

    隐语义模型(Latent factor model,以下简称LFM),是推荐系统领域上广泛使用的算法.它将矩阵分解应用于推荐算法推到了新的高度,在推荐算法历史上留下了光辉灿烂的一笔.本文将对 LFM ...

  9. Matrix Factorization SVD 矩阵分解

    Today we have learned the Matrix Factorization, and I want to record my study notes. Some kownledge ...

随机推荐

  1. 从头开始:详解MVVM、MVVMLight

    究竟为什么要学习MVVM? 相信大部分同学在刚开始接触MVVM的时候(包括我自己),心里默默在想这究竟是什么玩意?一个简单的功能要写一大段代码才能完成,在看到MVVM的核心目标: 1.让UI界面与逻辑 ...

  2. vs2017 代码格式化 文档排版 编辑 设置文档的格式

    vs

  3. 【合集】Hadoop 合集

    0. 说明 Hadoop 随笔的目录 1. HDFS 主要内容: [HDFS_1] HDFS 的概念和特性 [HDFS_2] HDFS 的 Shell 操作 [HDFS_3] HDFS 工作机制 [H ...

  4. php学习----运算符

    PHP 1.运算符 加减乘除与数学运算无异 但PHP的赋值运算符有两种,分别是: (1)"=":把右边表达式的值赋给左边的运算数.它将右边表达式值复制一份,交给左边的运算数.换而言 ...

  5. CISCO静态路由配置

    静态路由:手动添加路由条目到路由表中 优点:没有额外的路由cpu负担,节约带宽,增加网络安全性. 缺点:必须去了解整个拓扑结构,如果网络拓扑发生变化,需要在所有r路由上手动修改路由表. 实验拓扑如下: ...

  6. Sudoku 小项目

    Sudoku 小项目 - 软工第二次作业 Part 1 · 项目相关 Github 地址: https://github.com/TheSkyFucker/Sudoku 项目的更多信息以及所有开发文档 ...

  7. 删除window10没用的服务

    最近学习了下resin,出了个问题,它默认端口是8080,跟Tomcat冲突了,我在使用的时候遇到了个奇怪的事情,resin4.0一直占用着我的8080端口,哪怕我用dos命令把它强制停止,不出五秒钟 ...

  8. 设计模式のSingleton Pattern(单例模式)----创建模式

    单例模式没有什么好讲的,我们 举个例子 #region 单例定义 /// <summary> /// 类单例 /// </summary> private static Win ...

  9. WPF自定义控件(三)の扩展控件

    扩展控件,顾名思义就是对已有的控件进行扩展,一般继承于已有的原生控件,不排除继承于自定义的控件,不过这样做意义不大,因为既然都自定义了,为什么不一步到位呢,有些不同的需求也可以通过此来完成,不过类似于 ...

  10. BZOJ3378:[USACO]MooFest 狂欢节(树状数组)

    Description 每一年,约翰的N(1≤N≤20000)只奶牛参加奶牛狂欢节.这是一个全世界奶牛都参加的大联欢.狂欢节包括很多有趣的活动,比如干草堆叠大赛.跳牛栏大赛,奶牛之间有时还相互扎屁股取 ...