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

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.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));
       

請注意,這是用矩陣分解進行電影推薦的一種方法。還有其他的推薦方案,我們也將為其建立示例。