ML.NET 示例:推薦之矩陣分解
寫在前面
準備近期將微軟的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.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));
請注意,這是用矩陣分解進行電影推薦的一種方法。還有其他的推薦方案,我們也將為其建立示例。