AI時代的網站與手機App建置與開發Part14 - 使用ML.NET建立推薦系統
·
摘要
推薦功能在戈IT系統中的應用極廣, 從商品推薦, 人才推薦. 商品貨架陳列, 甚至開店選址, 都在推薦功能涵蓋的範疇. 在這篇文章中我們將要為大家介紹如何運用Microsoft ML.NET實作推薦系統.
·
認識推薦系統
如何建立一個好的推薦系統必須要考慮許多層面, 包括:依據使用者曾經購買或搜尋過的商品特徵推薦相似的商品, 推薦銷售狀況最佳或被瀏覽次數最高的商品, 依據相同特質的使用者的喜好商品進行推薦, 依據最新到貨商品, 依據伴隨購買的商品進行推薦(例如購買自行車會伴隨購買頭盔和水壼), 依據常識推薦商品(例如購買香煙可以推薦買打火機), 或是依據人口學的相關特性, 例如使用者的年齡, 性別, 收入, 教育程度, 或是居住地等資訊進行商品推薦. 除了上述傳統的商品推薦策略以外, 也可以導入機器學習技術建立先進的商品推薦系統.
·
準備訓練資料
首先請到以下的網址下載使用者觀賞電影之後留下的評點資料:recommendation-ratings-train.csv, 其內容如表1所示
表1: 使用者觀賞電影之後留下的評點記錄
|
userId |
movieId |
Rating |
timestamp |
|
1 |
110 |
1.0 |
1425941529 |
|
1 |
147 |
4.5 |
1425942435 |
|
1 |
858 |
5.0 |
1425941523 |
|
1 |
1221 |
5.0 |
1425941546 |
|
1 |
1246 |
5.0 |
1425941556 |
表1所示的觀賞電影的評點記錄中, 各個欄位的詳細說明如下:
|
欄位名稱 |
欄位說明 |
|
userId |
使用者編號 |
|
movieId |
電影編號 |
|
rating |
使用者觀賞電影後留下的評點記錄 |
|
timestamp |
使用者觀賞電影後留下評點記錄的時間點 |
·
使用ML.NET實作推薦系統
請啟動Visual Studio建立型態為[ASP.NET Core MVC應用程式(Model-View-Controller)]型態的專案, 然後使用滑鼠右鍵點選[方案總管]視窗中的專案名稱, 執行[加入 | 機器學習模型]功能, 做好之後請選擇[建議], 您就會看到選擇機器學習執行環境的畫面, 如圖1所示;
圖1: 選擇機器學習執行環境的畫面
請選擇[本機CPU]做為機器學習環境. 點選[下一步], 您會看到輸入訓練資料的畫面, 如圖2所示:
圖2: 輸入訓練資料的畫面
點選圖2畫面中的[瀏覽]鍵, 瀏覽到預先準備好的訓練資料, 於[要預測的資料行]選擇: rating, , 於[使用者資料行]選擇: userId, 於[項目資料行]選擇: movieId, 點選[下一步]鍵, 您就會看到執行訓練的畫面, 如圖3所示:
圖3: 執行訓練的畫面
點選[開始訓練], 靜待訓練完成.
訓練完成後, 您就會看到如圖4的畫面, 如果對訓練結果不滿意, 可以增加訓練時間, 或是設定[進階定型選項], 再按下[再次訓練]謀求改善.
·
認識Matrix Factorization Algorithm
您可以從圖4的畫面看到ML.NET使用了知名的Matrix Factorization Algorithm演算法預測使用者對電影的推薦分數, 這個演算法在Netflix的有獎競賽中因有效預測影片的推薦分數而廣為人知.
Matrix
Factorization Algorithm會利用使用者過去行為的相似程度推測使用者對推薦內容的接受程度(喜好程度), 常被用來建立有效的推薦系統.
參考資料: Fundamental
of Matrix Factorization For Recommender System
圖4: 訓練完成的畫面
如果滿意訓練結果, 可以按下[下一步]鍵, 您就會看到評估訓練妥的機器學習模型的畫面, 如圖5所示:
圖5: 評估訓練妥的機器學習模型的畫面
您可以於畫面中userId和movieId, 然後按下[預測]鍵, 就可以在圖5畫面的右方看到指定的使用者編號對指定的電影編號的指薦分數, 以及指定使用者編號的前5名指薦的電影編號和指薦分數.
評估完畢後按下圖5畫面中的[下一步], 您就會看到建立提供機器學習模型服務的Server程式和主控台應用程式程式, 如圖6所示:
圖6: 建立提供機器學習模型服務的Server程式和主控台應用程式程式
請注意如果您想建立提供機器學習服務給眾多的應用程式使用, 可以選擇點選圖6畫面中的[Web API]項目右方的[新增至解決方案]連結, Visual
Studio建立的Web API專案將會提供/predict端點供需要機器學習服務的應用程式呼叫使用. 如果所建立的機器學習模型只要支援自己建立的程式使用, 請點選圖6畫面中的[主控台應用程式]項目右方的[新增至解決方案]連結, 由Visual Studio建立叫用訓練妥機器學習模型的主控台應用程式專案.
請點選圖6畫面中的[Web API]項目右方的[新增至解決方案]連結, 執行建立[Web API]專案的動作, Visual Studio就會將訓練妥的機器學習模型部署到新建立的[Web API]專案當做Server程式.
做好之後請再點選圖6畫面中的[主控台應用程式]項目右方的[新增至解決方案]連結, 由Visual Studio建立叫用機器學習模型的主控台應用程式專案.
建立妥部署有機器學習模型的Server專案與主控台應用程式專案之後, 請使用Visual Studio設定啟動專案, 將啟動專案設定成叫用機器學習模型的主控台應用程式專案.
設定完成之後請執行專案, 您就會看到主控台應用程式專案將指定的使用者編號與指定的電影編號傳送給機器學習模型進行預測指薦分數的結果, 如圖7所示:
圖7: 主控台應用程式專案將指定的使用者編號與指定的電影編號傳送給機器學習模型評估的結果
· 取得指定使用者最推薦的前5部電影
如果想取得某一名使用者評論分數最高的前5部電影, 可能就需要寫一些程式碼, 例如以下的程式碼會使用MLContext類別提供的功能, 載入訓練資料, 以取得所有的電影編號, 再將取得的電影編號建立成ModelInput類別的物件, 交給機器學習模型進行預測, 取得預測的結果後, 將預測的電影評論分數由大至小排序, 並取出前5名評論分數最高的資料, 即為指定的使用者最推薦的前5部電影:
using
Microsoft.ML;
using MLModel_ConsoleApp;
MLContext mlc = new MLContext();
string Filename =
Path.Combine(AppDomain.CurrentDomain.BaseDirectory,
"recommendation-ratings-train.txt"); //載入電影評論資料
IDataView
dv=mlc.Data.LoadFromTextFile<MLModel.ModelInput>(
Filename,
separatorChar:',', hasHeader:true); //解析電影評論資料
//建立取用電影評論資料的Enumerator
IEnumerable<MLModel.ModelInput> e =
mlc.Data.CreateEnumerable<
MLModel.ModelInput>(dv,
reuseRowObject: true);
//建立存放電影評論預測結果的集合
List<MLModel.ModelOutput> Scores = new
List<MLModel.ModelOutput>();
//取用電影評論資料
foreach
(MLModel.ModelInput row in e)
{
//將取得的電影評論資料建立成ModelInput類別的物件
MLModel.ModelInput sampleData = new
MLModel.ModelInput()
{
UserId = 2F,
MovieId = row.MovieId,
};
//預測電影的評論分數
var predictionResult = MLModel.Predict(sampleData);
//將預測結果存入集合
Scores.Add(predictionResult);
}
//取出電影預測評論分數最高的5筆資料
foreach(MLModel.ModelOutput
mo in
Scores.OrderByDescending(p
=> p.Score).Skip(0).Take(5))
{
//輸出電影預測評論分數最高的5筆資料
Console.WriteLine(
$"UserId:{mo.UserId},
MovieId:{mo.MovieId}, Score:{mo.Score}");
}
執行上述的程式碼, 您將會看到如圖8顯示的結果畫面
圖8: 顯示預測評論分數最高的5部電影的畫面
·
後續處理
下一回我們將為大家示範如何將叫用部署有機器學習模型的Server專案程式碼移植到ASP.NET Core MVC網站專案或是MAUI跨平台手機App專案.








留言
張貼留言