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

写在前面

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

产品推荐 - 矩阵分解问题示例

ML.NET 版本 API 类型 状态 应用程序类型 数据类型 场景 机器学习任务 算法
v0.8 动态 API 最新版本 控制台应用程序 .txt 文件 推荐 矩阵分解 MatrixFactorizationTrainer (One Class)

在这个示例中,您可以看到如何使用ML.NET来构建产品推荐方案。

本示例中的推荐方式基于共同购买或经常一起购买的产品,这意味着它将根据客户的购买历史向客户推荐一组产品。

在这个示例中,基于经常一起购买的学习模型来推荐产品。

问题

在本教程中,我们将使用亚马逊共同购买产品数据集。

我们将使用One-Class因式分解机来构建我们的产品推荐器,它使用协同过滤方法。

我们介绍的one-class和其他因式分解机的区别在于,在这个数据集中,我们只有购买历史的信息。

我们没有评分或其他详细信息,如产品描述等。

“协同过滤”是在一个基本假设的情况下运作的,即如果某人A在一个问题上与某人B具有相同的意见,则在另一个问题上,相对其他随机选择的人,A更倾向于B的观点。

数据集

原始数据来自SNAP:
https://snap.stanford.edu/data/amazon0302.html

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

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

解决方案

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

1. 建立模型

建立模型包括:

  • https://snap.stanford.edu/data/amazon0302.html 下载并复制数据集文件Amazon0302.txt。
  • 使用以下内容替换列名:ProductID ProductID_Copurchased
  • 在读取器中,我们已经提供了KeyRange,并且产品ID已经编码,我们需要做的就是使用几个额外的参数调用MatrixFactorizationTrainer。

下面是用于建立模型的代码:


    //STEP 1: Create MLContext to be shared across the model creation workflow objects
    var ctx = new MLContext();

    //STEP 2: Create a reader by defining the schema for reading the product co-purchase dataset
    //        Do remember to replace amazon0302.txt with dataset from
              https://snap.stanford.edu/data/amazon0302.html
    var reader = ctx.Data.TextReader(new TextLoader.Arguments()
    {
        Separator = "tab",
        HasHeader = true,
        Column = new[]
        {
                new TextLoader.Column("Label", DataKind.R4, 0),
                new TextLoader.Column("ProductID", DataKind.U4, new [] { new TextLoader.Range(0) }, new KeyRange(0, 262110)),
                new TextLoader.Column("CoPurchaseProductID", DataKind.U4, new [] { new TextLoader.Range(1) }, new KeyRange(0, 262110))
            }
        });

        //STEP 3: Read the training data which will be used to train the movie recommendation model
        var traindata = reader.Read(new MultiFileSource(TrainingDataLocation));

        //STEP 4: Your data is already encoded so all you need to do is call the MatrixFactorization Trainer with a few extra hyperparameters:
        //        LossFunction, Alpa, Lambda and a few others like K and C as shown below.
        var est = ctx.Recommendation().Trainers.MatrixFactorization("ProductID", "CoPurchaseProductID",
                                     labelColumn: "Label",
                                     advancedSettings: s =>
                                     {
                                         s.LossFunction = MatrixFactorizationTrainer.LossFunctionType.SquareLossOneClass;
                                         s.Alpha = 0.01;
                                         s.Lambda = 0.025;
                                         // For better results use the following parameters
                                         //s.K = 100;
                                         //s.C = 0.00001;
                                     });

2. 训练模型

一旦定义了评估器,就可以根据可用的训练数据对评估器进行训练。

这将返回一个训练过的模型。


    //STEP 5: Train the model fitting to the DataSet
    //Please add Amazon0302.txt dataset from https://snap.stanford.edu/data/amazon0302.html to Data folder if FileNotFoundException is thrown.
    var model = est.Fit(traindata);

3. 使用模型

我们将通过创建预测引擎/函数来执行此模型的预测,如下所示。

    public class Copurchase_prediction
    {
        public float Score { get; set; }
    }

    public class ProductEntry
    {
        [KeyType(Contiguous = true, Count = 262111, Min = 0)]
        public uint ProductID { get; set; }

        [KeyType(Contiguous = true, Count = 262111, Min = 0)]
        public uint CoPurchaseProductID { get; set; }
        }

一旦创建了预测引擎,就可以预测两个产品被共同购买的分数。

    //STEP 6: Create prediction engine and predict the score for Product 63 being co-purchased with Product 3.
    //        The higher the score the higher the probability for this particular productID being co-purchased
    var predictionengine = model.MakePredictionFunction<ProductEntry, Copurchase_prediction>(ctx);
    var prediction = predictionengine.Predict(
                             new ProductEntry()
                             {
                             ProductID = 3,
                             CoPurchaseProductID = 63
                             });

原文地址:https://www.cnblogs.com/feiyun0112/p/10110581.html

时间: 2024-08-02 16:28:03

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

ML.NET 示例:目录

ML.NET 示例中文版,英文原版请访问:https://github.com/dotnet/machinelearning-samples ML.NET 示例 ML.NET 是一个跨平台的开源机器学习框架,使.NET开发人员使用机器学习变得很容易. 在这个GitHub 存储库中,我们提供了示例,这些示例将帮助您开始使用ML.NET,以及如何将ML.NET加入到现有的和新的.NET应用程序中. 注意: 请在机器学习存储库中打开与ML.NET框架相关的问题.请仅当您遇到此存储库中的示例问题时,才在

ALS矩阵分解推荐模型

其实通过模型来预测一个user对一个item的评分,思想类似线性回归做预测,大致如下 定义一个预测模型(数学公式), 然后确定一个损失函数, 将已有数据作为训练集, 不断迭代来最小化损失函数的值, 最终确定参数,把参数套到预测模型中做预测. 矩阵分解的预测模型是: 损失函数是: 我们就是要最小化损失函数,从而求得参数q和p. 矩阵分解模型的物理意义 我们希望学习到一个P代表user的特征,Q代表item的特征.特征的每一个维度代表一个隐性因子,比如对电影来说,这些隐性因子可能是导演,演员等.当然

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

在矩阵分解在协同过滤推荐算法中的应用中,我们对矩阵分解在推荐算法中的应用原理做了总结,这里我们就从实践的角度来用Spark学习矩阵分解推荐算法. 1. Spark推荐算法概述 在Spark MLlib中,推荐算法这块只实现了基于矩阵分解的协同过滤推荐算法.而基于的算法是FunkSVD算法,即将m个用户和n个物品对应的评分矩阵M分解为两个低维的矩阵:$$M_{m \times n}=P_{m \times k}^TQ_{k \times n}$$ 其中k为分解成低维的维数,一般远比m和n小.如果大

矩阵分解在协同过滤推荐算法中的应用

在协同过滤推荐算法总结中,我们讲到了用矩阵分解做协同过滤是广泛使用的方法,这里就对矩阵分解在协同过滤推荐算法中的应用做一个总结.(过年前最后一篇!祝大家新年快乐!明年的目标是写120篇机器学习,深度学习和NLP相关的文章) 1. 矩阵分解用于推荐算法要解决的问题 在推荐系统中,我们常常遇到的问题是这样的,我们有很多用户和物品,也有少部分用户对少部分物品的评分,我们希望预测目标用户对其他未评分物品的评分,进而将评分高的物品推荐给目标用户.比如下面的用户物品评分表: 用户\物品 物品1 物品2 物品

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

介绍: 推荐系统中最为主流与经典的技术之一是协同过滤技术(Collaborative Filtering),它是基于这样的假设:用户如果在过去对某些项目产生过兴趣,那么将来他很可能依然对其保持热忱.其中协同过滤技术又可根据是否采用了机器学习思想建模的不同划分为基于内存的协同过滤(Memory-based CF)与基于模型的协同过滤技术(Model-based CF).其中基于模型的协同过滤技术中尤为矩阵分解(Matrix Factorization)技术最为普遍和流行,因为它的可扩展性极好并且易

矩阵分解推荐算法(LMF)

首先我们现在有一个矩阵\(R_{mn}\),其中\(R_{ij}\)代表第\(i\)个用户对第\(j\)个商品的喜爱程度. \(LMF\)算法认为每个商品上面都有一些隐因子,而顾客的喜爱程度是由这些隐因子来决定的.因此便可以将\(R_{mn}\)分解成\(P_{mF} \times Q_{Fn}\)的形式. 矩阵\(P_{mF}\)代表了这\(m\)个用户对\(F\)个隐因子的喜爱程度,\(Q_{Fn}\)代表这\(F\)个隐因子在这\(n\)个商品上的分布概率. \[R'_{ij}=\sum_

矩阵分解

矩阵分解在推荐系统中的应用 浅谈矩阵分解在推荐系统中的应用 SVD在推荐系统中的应用 用于推荐系统的一种矩阵分解库:LibMF 基于矩阵分解的推荐算法,简单入门 - kobeshow

NMath矩阵分解的两种方式

概述:本教程为您介绍.Net唯一的数学与统计学运算库NMath,实现矩阵分解的两种方法. Nmath中包括用于构造和操作矩阵QR和奇异值分解的分解类.QR分解如下表示: 1 AP=QR 其中P是一个可置换矩阵,Q是正交的,且R为上梯形.矩阵A的奇异值分解(SVD)的形式表示为: 1 A=USV* 其中U和V是正交的,S是对角的,和V *表示一个真正的矩阵V或一个复杂的矩阵V的条目沿对角线S的共轭转置的奇异值. 接下来带来一个矩阵分解类的实例,下面代码示例为从FloatMatrix创建FloatQ

推荐系统中的矩阵分解演变方式

推荐算法主要分为基于内容的算法和协同过滤. 协同过滤的两种基本方法是基于邻居的方法(基于内容/物品的协同过滤)和隐语义模型. 矩阵分解乃是实现隐语义模型的基石. 矩阵分解根据用户对物品的评分, 推断出用户和物品的隐语义向量, 然后根据用户和物品的隐语义向量来进行推荐. 推荐系统用到的数据可以有显式评分和隐式评分. 显式评分时用户对物品的打分, 显式评分矩阵通常非常稀疏. 隐式评分是指用户的浏览, 购买, 搜索等历史记录, 表示的是用户行为的有无, 所以是一个密集矩阵. 1. 基本矩阵分解 矩阵分