AI時代的網站與手機App建置與開發Part17 - 利用電子商務網站的購物歷史資料實作商品推薦系統
· 摘要
很多人說許多AI公司到現在也都沒有賺錢, 或者是說日AI到底有什麼人類需要的應用, 而這種應用能夠持續演進, 不會像早期的.COM, 有泡沫化的危機. 其實AI要賺錢很容易, AI只能和傳統的IT技術整合, 或位於IT系統的背後, 協助IT系統完成傳統的IT系統無法提供的功能, 傳統的IT系統的功能就可以更強大, 並進而賺到錢. 推薦系統就是一個很經典的案例, 房屋仲介員可以推薦物業給客戶, 人力網可以推薦人才給公司, 婚友網站也可以推薦婚友對象給註冊的會員, 有了推薦功能上述的網站就可以在與同類型的網站競爭中勝出, 賺到比同類型網站更多的錢也是必然的結果
身為電子商務領導廠商的Amazon的Amazon.com網站於2022年為Amazon公司貢獻了超過2000億美金的營收, 根據Amazon自己2021年發佈的報告, 高達35%的銷售成績來自推薦功能. 除此之外, 美國零售業的巨頭Walmart經典的啤酒與尿布的購物籃分析案例, 就是伴隨購買的推薦案例.
文章範例下載: https://github.com/CraigIII/ProductRecommedation.git
· 準備訓練資料
在這篇文章中, 我們將要利用Amazon.com網站本身統計的伴隨購買的商品資料(例如購買重機會伴隨購買防摔衣, 買香雞排會伴隨購買泡沫紅茶)實作推薦系統.
本篇文章使用的訓練資料是收集自Amazon.com網站的購物資料, 下載網址:Amazon
product co-purchasing network, March 02 2003.
圖1即為收集自Amazon.com的購物資料, 其中的FromNodeId欄位記錄的是使用購買的商品編號, 而ToNodeId欄位描述的是使用者購買了FromNodeId欄位的商品時會隨附購買的商品編號.
圖1: 收集自Amazon.com的購物資料
收集自Amazon.com的購物資料只有兩個欄位, FromNodeId和ToNodeId, 像這樣的資料無法透過Visual Studio提供的[加入 | 機器學習模型]功能支援的精靈實作推薦模型, 因為Visual Studio支援的[機器學習模型]需要的訓練資料至少要有[要預測的資料行], [使用者資料行], 和[項目資料行]三個欄位, 所以欲使用收集自Amazon.com的購物資料實作推薦系統, 我們就必須自行實作訓練推薦系統的程式碼.
· 使用ML.NET實作推薦系統
請啟動Visual Studio建立型態為[主控台應用程式]型態的專案, 如圖2所示;
圖2: 建立型態為[主控台應用程式]型態專案的畫面
請按下[下一步]鍵按指示完成建立專案的工作.
請使用滑鼠右鍵點選[方案總管]視窗中的專案名稱, 執行[管理NuGet套件]功能, 為專案加入[Microsoft.ML]套件, 如圖3所示:
圖3: 為專案加入[Microsoft.ML]套件的畫面
請勾選[包括搶鮮版], 點選[Microsoft.ML套件的4.0.0-preview.24162.2版], 再點選[安裝]鍵 為專案加入Microsoft.ML套件.
安裝完成後, 請點選[NuGet套件管理員]畫面中的[Microsoft.ML.Recommender套件的4.0.0-preview.24162.2版], 再點選[安裝]鍵為專案加入Microsoft.ML.Recommender套件, 如圖4所示:
圖4: 為專案加入[Microsoft.ML.Recommender]套件的畫面
做好之後, 請將下載並解壓縮妥的訓練資料加入到專案中, 並於[屬性]視窗將[複製到輸出目錄]屬性設定成:有更新時才複製.
· 建立必要的類別
請為專案加入以下PurchaseHistory類別, 負責描述使用者的購物記錄:
public class PurchaseHistory
{
[KeyType(count: 262111)]
public uint ProductId { get; set; }
[KeyType(count: 262111)]
public uint CoPurchaseProductId { get; set;
}
}
請為專案加入以下PurchasePrediction類別, 負責描述商品推薦分數::
public class PurchasePrediction
{
public float Score { get; set; }
}
· 實作商品推薦功能
請將Program.cs編輯成以下的樣子, 負責載入訓練資料, 用以訓練商品推薦模型:
using ConsoleApp;
using Microsoft.ML;
using Microsoft.ML.Data;
using Microsoft.ML.Trainers;
MLContext mlContext = new MLContext();
string FileName =
Path.Combine(AppDomain.CurrentDomain.BaseDirectory,
"Amazon0302.txt");
var data =
mlContext.Data.LoadFromTextFile(FileName,
columns: new[]
{
new TextLoader.Column("Label", DataKind.Single, 0),
new TextLoader.Column(name: nameof(PurchaseHistory.ProductId),
dataKind: DataKind.UInt32,
source: new[] { new TextLoader.Range(0) },
keyCount: new KeyCount(262111)),
new TextLoader.Column(name: nameof(PurchaseHistory.CoPurchaseProductId),
dataKind: DataKind.UInt32,
source: new[] { new TextLoader.Range(1) },
keyCount: new KeyCount(262111))
},
hasHeader: true,
separatorChar: '\t');
var split = mlContext.Data.TrainTestSplit(data, testFraction: 0.4);
var options = new
MatrixFactorizationTrainer.Options
{
MatrixColumnIndexColumnName = nameof(PurchaseHistory.ProductId),
MatrixRowIndexColumnName = nameof(PurchaseHistory.CoPurchaseProductId),
LabelColumnName = "Label",
LossFunction =
MatrixFactorizationTrainer.LossFunctionType.SquareLossOneClass,
Alpha = 0.01,
Lambda = 0.025,
C = 0.00001
};
var trainer = mlContext.Recommendation()
.Trainers
.MatrixFactorization(options);
var model = trainer.Fit(split.TrainSet);
var metrics = mlContext.Recommendation()
.Evaluate(model.Transform(split.TestSet));
Console.WriteLine($"RMSE: {metrics.RootMeanSquaredError}");
var predictionEngine = mlContext.Model
.CreatePredictionEngine<PurchaseHistory,
PurchasePrediction>(model);
var lines = File.ReadAllLines(FileName);
var products = new
List<PurchaseHistory>();
foreach (var line in lines)
{
if (!string.IsNullOrWhiteSpace(line) && !line.StartsWith('#'))
{
var parts = line.Split('\t');
products.Add(new PurchaseHistory
{
ProductId = uint.Parse(parts[0]),
CoPurchaseProductId =
uint.Parse(parts[1])
});
}
}
// Loop through the products and make
predictions
foreach (var product in products)
{
var prediction = predictionEngine.Predict(product);
if (prediction.Score > 0.75)
{
Console.WriteLine($"Product: {product.ProductId}, Co-purchased
Product:{product.CoPurchaseProductId}, Score: {prediction.Score:P2}");
}
}
做好之後請按下CTRL+F5組合鍵執行程式,您就會看到購買了指定的商品, 預測使用者會伴隨購買, 信心指數超過75%的其他商品編號, 如圖5所示, :
圖5: 顯示使用者購買了指定的商品, 推薦購買信心指數超過75%的其他商品的結果






留言
張貼留言