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