ML.NET 示例:推薦之場感知分解機
寫在前面
準備近期將微軟的machinelearning-samples翻譯成中文,水平有限,如有錯漏,請大家多多指正。
如果有朋友對此感興趣,可以加入我:https://github.com/feiyun0112/machinelearning-samples.zh-cn
Movie Recommender
ML.NET 版本 | API 型別 | 狀態 | 應用程式型別 | 資料型別 | 場景 | 機器學習任務 | 演算法 |
---|---|---|---|---|---|---|---|
v0.7 | 動態 API | 需要升級到v0.8 | 終端應用程式 | .csv | 電影推薦 | 推薦 | 場感知分解機 |
概述
MovieRecommender是一個簡單的應用程式,它構建和使用推薦模型。
這是一個關於如何使用推薦來增強現有ASP.NET應用程式的終端示例。
本示例從流行的Netflix應用程式中汲取了靈感,並且儘管這個示例主要關注電影推薦,但是可以很容易地應用於任何型別的產品推薦。
特點
- Web應用程式
- 這是一個終端ASP.NET應用程式,它包含了三個使用者'Ankit','Cesar','Gal'。然後,它使用ML.NET推薦模型給這三個使用者提供建議。
- 推薦模型
- 應用程式使用MovieLens資料集構建推薦模型。模型訓練程式碼使用基於協同過濾的推薦方法。
它如何工作?
訓練模型
Movie Recommender 使用基於協同過濾的推薦方法。
協同過濾的基本假設是,如果A(例如Gal)在某個問題上與B(例如Cesar)具有相同的觀點,則A(Gal)更有可能在另一個問題上具有和B(Cesar)相同的意見,而不是一個隨機的人。
對於此示例,我們使用 http://files.grouplens.org/datasets/movielens/ml-latest-small.zip 資料集。
模型訓練程式碼可以在MovieRecommender_Model中找到。
模型訓練遵循以下四個步驟來構建模型。 您可以先跳過程式碼並繼續。
使用模型
通過以下步驟在Controller中使用訓練的模型。
1. 建立ML.NET環境並載入已經訓練過的模型
// 1. Create the ML.NET environment and load the MoviesRecommendation Model
var ctx = new MLContext();
ITransformer loadedModel;
using (var stream = new FileStream(_movieService.GetModelPath(), FileMode.Open, FileAccess.Read, FileShare.Read))
{
loadedModel = ctx.Model.Load(stream);
}
2. 建立預測函式以預測一組電影推薦
//3. Create a prediction function
var predictionfunction = loadedModel.MakePredictionFunction<RatingData, RatingPrediction>(ctx);
List<Tuple<int, float>> ratings = new List<Tuple<int, float>>();
List<Tuple<int, int>> MovieRatings = _profileService.GetProfileWatchedMovies(id);
List<Movie> WatchedMovies = new List<Movie>();
foreach (Tuple<int, int> tuple in MovieRatings)
{
WatchedMovies.Add(_movieService.Get(tuple.Item1));
}
RatingPrediction prediction = null;
foreach (var movie in _movieService._trendingMovies)
{
// Call the Rating Prediction for each movie prediction
prediction = predictionfunction.Predict(new RatingData { userId = id.ToString(), movieId = movie.MovieID.ToString()});
// Normalize the prediction scores for the "ratings" b/w 0 - 100
var normalizedscore = Sigmoid(prediction.Score);
// Add the score for recommendation of each movie in the trending movie list
ratings.Add(Tuple.Create(movie.MovieID, normalizedscore));
}
3. 為要顯示的檢視提供評分預測
ViewData["watchedmovies"] = WatchedMovies;
ViewData["ratings"] = ratings;
ViewData["trendingmovies"] = _movieService._trendingMovies;
return View(activeprofile);
替代方法
這個示例顯示了許多可以用於ML.NET的推薦方法之一。根據您的特定場景,您可以選擇以下任何最適合您的用例的方法。
場景 | 演算法 | 示例連結 |
---|---|---|
您想使用諸如使用者Id、產品Id、評分、產品描述、產品價格等屬性(特性)作為推薦引擎。在這種場景中,場感知分解機是一種通用的方法,您可以使用它來構建推薦引擎 | 場感知分解機 | 當前示例 |
你有用使用者購買行為中的戶ID,產品和評分。對於這種情況,您應該使用矩陣分解法 | 矩陣分解 | 矩陣分解 - 推薦 |
你僅有使用者購買行為中使用者Id和產品Id,但是沒有評分。 這在來自線上商店的資料集中很常見,您可能只能訪問客戶的購買歷史記錄。 有了這種型別的推薦,你可以建立一個推薦引擎用來推薦經常購買的物品。 | One Class 矩陣分解 | Product Recommender |