ML.NET 示例:推薦之場感知分解機

feiyun0112發表於2018-12-13

寫在前面

準備近期將微軟的machinelearning-samples翻譯成中文,水平有限,如有錯漏,請大家多多指正。
如果有朋友對此感興趣,可以加入我:https://github.com/feiyun0112/machinelearning-samples.zh-cn

Movie Recommender

ML.NET 版本 API 型別 狀態 應用程式型別 資料型別 場景 機器學習任務 演算法
v0.7 動態 API 需要升級到v0.8 終端應用程式 .csv 電影推薦 推薦 場感知分解機

Alt Text

概述

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中找到。

模型訓練遵循以下四個步驟來構建模型。 您可以先跳過程式碼並繼續。

Build -> Train -> Evaluate -> Consume

使用模型

通過以下步驟在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

相關文章