ML.NET 示例:回歸之銷售預測
寫在前面
準備近期將微軟的machinelearning-samples翻譯成中文,水平有限,如有錯漏,請大家多多指正。
如果有朋友對此感興趣,可以加入我:https://github.com/feiyun0112/machinelearning-samples.zh-cn
eShopDashboardML - 銷售預測
ML.NET 版本 | API 類型 | 狀態 | 應用程序類型 | 數據類型 | 場景 | 機器學習任務 | 算法 |
---|---|---|---|---|---|---|---|
v0.7 | 動態 API | 最新版本 | ASP.NET Core Web應用程序和控制臺應用程序 | SQL Server 和 .csv 文件 | 銷售預測 | 回歸 | FastTreeTweedie 回歸 |
eShopDashboardML是一個使用ML.NET 進行(每個產品和每個地區)銷售預測的Web應用程序。
概述
這個終端示例應用程序通過展現以下主題著重介紹ML.NET API的用法:
- 如何訓練,建立和生成ML模型
- 使用.NET Core實現一個控制臺應用程序。
- 如何使用經過訓練的ML模型做下個月的銷售預測
- 使用ASP.NET Core Razor實現一個獨立的,單體Web應用程序。
該應用程序還使用一個SQL Server數據庫存儲常規產品目錄和訂單信息,就像許多使用SQL Server的典型Web應用程序一樣。在本例中,由於它是一個示例,因此默認情況下使用localdb SQL數據庫,因此不需要設置真正的SQL Server。在第一次運行Web應用程序時,將創建localdb數據庫並包含示例數據。
如果要使用真正的SQL Server或Azure SQL數據庫,只需更改應用程序中的連接字符串即可。
這是Web應用程序的一個銷售預測屏幕截圖示例:
演練:如何設置
了解如何在 Visual Studio 中設置以及對代碼的進一步說明:
在 Visual Studio 中設置 eShopDashboard 並運行Web應用程序
- 創建和訓練您的ML模型
- 此步驟是可選的,因為Web應用程序已配置為使用預先訓練的模型。 但是,您可以創建自己的訓練模型,並將預先訓練的模型與您自己的模型交換。
演練:ML.NET代碼實現
問題
這個問題是基於之前的銷售情況圍繞地區和產品進行銷售預測
數據集
為了解決這個問題,您建立了兩個獨立的ML模型,它們以以下數據集作為輸入:
數據集 | 列 |
---|---|
products stats | next, productId, year, month, units, avg, count, max, min, prev |
country stats | next, country, year, month, max, min, std, count, sales, med, prev |
ML 任務 - 回歸
這個示例的ML任務是回歸,它是一個有監督的機器學習任務,用於從一組相關的特征/變量中預測下一個周期的值(在本例中是銷售預測)。
解決方案
為了解決這個問題,首先我們將建立ML模型,同時根據現有數據訓練每個模型,評估其有多好,最後使用模型預測銷售。
註意,該示例實現了兩個獨立的模型:
- 下一個周期(月)產品需求預測模型
- 下一個周期(月)地區銷售預測模型
當然,當學習/研究此示例時,您可以只關註其中一個場景/模型。
1. 建立模型
您需要實現的第一步是定義要從數據集文件加載的數據列,如下面的代碼所示:
建立並訓練模型
var textLoader = mlContext.Data.TextReader(new TextLoader.Arguments
{
Column = new[] {
new TextLoader.Column("next", DataKind.R4, 0 ),
new TextLoader.Column("productId", DataKind.Text, 1 ),
new TextLoader.Column("year", DataKind.R4, 2 ),
new TextLoader.Column("month", DataKind.R4, 3 ),
new TextLoader.Column("units", DataKind.R4, 4 ),
new TextLoader.Column("avg", DataKind.R4, 5 ),
new TextLoader.Column("count", DataKind.R4, 6 ),
new TextLoader.Column("max", DataKind.R4, 7 ),
new TextLoader.Column("min", DataKind.R4, 8 ),
new TextLoader.Column("prev", DataKind.R4, 9 )
},
HasHeader = true,
Separator = ","
});
然後,下一步是構建轉換管道,並指定要使用什麽訓練器/算法。
在本例中,您將進行以下轉換:
- 連接當前特征生成名為NumFeatures的新列
- 使用獨熱編碼轉換productId
- 連接所有生成的特征生成名為‘Features‘的新列
- 復制“next”列將其重命名為“Label”
- 指定“Fast Tree Tweedie”訓練器作為算法應用於模型
在設計管道之後,您可以將數據集加載到DataView中,而且此步驟只是配置,DataView是延遲加載,在下一步訓練模型之前數據不會被加載。
var trainingPipeline = mlContext.Transforms.Concatenate(outputColumn: "NumFeatures", "year", "month", "units", "avg", "count", "max", "min", "prev" )
.Append(mlContext.Transforms.Categorical.OneHotEncoding(inputColumn:"productId", outputColumn:"CatFeatures"))
.Append(mlContext.Transforms.Concatenate(outputColumn: "Features", "NumFeatures", "CatFeatures"))
.Append(mlContext.Transforms.CopyColumns("next", "Label"))
.Append(trainer = mlContext.Regression.Trainers.FastTreeTweedie("Label", "Features"));
var trainingDataView = textLoader.Read(dataPath);
2. 訓練模型
在建立管道之後,我們通過使用所選算法擬合或使用訓練數據來訓練預測模型。 在該步驟中,模型被建立,訓練並作為對象返回:
var model = trainingPipeline.Fit(trainingDataView);
3. 評估模型
在本例中,模型的評估是在使用交叉驗證方法訓練模型之前執行的,因此您將獲得指示模型準確度的指標。
var crossValidationResults = mlContext.Regression.CrossValidate(trainingDataView, trainingPipeline, numFolds: 6, labelColumn: "Label");
ConsoleHelper.PrintRegressionFoldsAverageMetrics(trainer.ToString(), crossValidationResults);
4. 保存模型供最終用戶的應用程序稍後使用
一旦創建和評估了模型,就可以將它保存到.ZIP文件中,任何最終用戶的應用程序都可以通過以下代碼使用它:
using (var file = File.OpenWrite(outputModelPath))
model.SaveTo(mlContext, file);
5. 用簡單的測試預測試用模型
簡單地說,您可以從.ZIP文件中加載模型,創建一些示例數據,創建“預測函數”,最後進行預測。
ITransformer trainedModel;
using (var stream = File.OpenRead(outputModelPath))
{
trainedModel = mlContext.Model.Load(stream);
}
var predictionFunct = trainedModel.MakePredictionFunction<ProductData, ProductUnitPrediction>(mlContext);
Console.WriteLine("** Testing Product 1 **");
// Build sample data
ProductData dataSample = new ProductData()
{
productId = "263",
month = 10,
year = 2017,
avg = 91,
max = 370,
min = 1,
count = 10,
prev = 1675,
units = 910
};
//model.Predict() predicts the nextperiod/month forecast to the one provided
ProductUnitPrediction prediction = predictionFunct.Predict(dataSample);
Console.WriteLine($"Product: {dataSample.productId}, month: {dataSample.month + 1}, year: {dataSample.year} - Real value (units): 551, Forecast Prediction (units): {prediction.Score}");
引用
eShopDashboardML數據集是基於UCI(http://archive.ics.uci.edu/ml/datasets/online+retail) 的一個公共在線零售數據集
Daqing Chen, Sai Liang Sain, 和 Kun Guo, 在線零售業的數據挖掘: 基於RFM模型的數據挖掘客戶細分案例研究, 數據庫營銷與客戶戰略管理雜誌, Vol. 19, No. 3, pp. 197a€“208, 2012 (印刷前在線發布: 27 August 2012. doi: 10.1057/dbm.2012.17).
ML.NET 示例:回歸之銷售預測