AI時代的網站與手機App建置與開發Part17 - 利用電子商務網站的購物歷史資料實作商品推薦系統

 ·       摘要

很多人說許多AI公司到現在也都沒有賺錢, 或者是說日AI到底有什麼人類需要的應用, 而這種應用能夠持續演進, 不會像早期的.COM, 有泡沫化的危機. 其實AI要賺錢很容易, AI只能和傳統的IT技術整合, 或位於IT系統的背後, 協助IT系統完成傳統的IT系統無法提供的功能, 傳統的IT系統的功能就可以更強大, 並進而賺到錢. 推薦系統就是一個很經典的案例,  房屋仲介員可以推薦物業給客戶, 人力網可以推薦人才給公司, 婚友網站也可以推薦婚友對象給註冊的會員, 有了推薦功能上述的網站就可以在與同類型的網站競爭中勝出, 賺到比同類型網站更多的錢也是必然的結果

身為電子商務領導廠商的AmazonAmazon.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的購物資料只有兩個欄位, FromNodeIdToNodeId, 像這樣的資料無法透過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%的其他商品的結果

留言

這個網誌中的熱門文章

AI時代的網站與手機App建置與開發Part27 - ML.NET與物件偵測

AI時代的網站與手機App建置與開發Part24 - ML.NET與圖片異常偵測

AI時代的網站與手機App建置與開發Part28 - 使用YOLO模型進行物件偵測