1. 程式人生 > >ML.NET 示例:推薦之One Class 矩陣分解

ML.NET 示例:推薦之One Class 矩陣分解

exc together abi key defining oba ace 解決方案 ember

寫在前面

準備近期將微軟的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
                             });

ML.NET 示例:推薦之One Class 矩陣分解