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 中设置以及对代码的进一步说明:
-
- 此步骤是可选的,因为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. 197–208, 2012 (印刷前在线发布: 27 August 2012. doi: 10.1057/dbm.2012.17).
ML.NET 示例:回归之销售预测的更多相关文章
- ML.NET 示例:开篇
写在前面 准备近期将微软的machinelearning-samples翻译成中文,水平有限,如有错漏,请大家多多指正. 如果有朋友对此感兴趣,可以加入我:https://github.com/fei ...
- ML.NET 示例:目录
ML.NET 示例中文版:https://github.com/feiyun0112/machinelearning-samples.zh-cn 英文原版请访问:https://github.com/ ...
- ML.NET 示例:回归之价格预测
写在前面 准备近期将微软的machinelearning-samples翻译成中文,水平有限,如有错漏,请大家多多指正. 如果有朋友对此感兴趣,可以加入我:https://github.com/fei ...
- ML.NET 示例:聚类之客户细分
写在前面 准备近期将微软的machinelearning-samples翻译成中文,水平有限,如有错漏,请大家多多指正. 如果有朋友对此感兴趣,可以加入我:https://github.com/fei ...
- ML.NET 示例:深度学习之集成TensorFlow
写在前面 准备近期将微软的machinelearning-samples翻译成中文,水平有限,如有错漏,请大家多多指正. 如果有朋友对此感兴趣,可以加入我:https://github.com/fei ...
- ML.NET 示例:聚类之鸢尾花
写在前面 准备近期将微软的machinelearning-samples翻译成中文,水平有限,如有错漏,请大家多多指正. 如果有朋友对此感兴趣,可以加入我:https://github.com/fei ...
- ML.NET 示例:推荐之场感知分解机
写在前面 准备近期将微软的machinelearning-samples翻译成中文,水平有限,如有错漏,请大家多多指正. 如果有朋友对此感兴趣,可以加入我:https://github.com/fei ...
- ML.NET 示例:推荐之One Class 矩阵分解
写在前面 准备近期将微软的machinelearning-samples翻译成中文,水平有限,如有错漏,请大家多多指正. 如果有朋友对此感兴趣,可以加入我:https://github.com/fei ...
- ML.NET 示例:推荐之矩阵分解
写在前面 准备近期将微软的machinelearning-samples翻译成中文,水平有限,如有错漏,请大家多多指正. 如果有朋友对此感兴趣,可以加入我:https://github.com/fei ...
随机推荐
- The concurrent snapshot for publication 'xxx' is not available because it has not been fully generated or the Log Reader Agent is not running to activate it
在两台测试服务器部署了复制(发布订阅)后,发现订阅的表一直没有同步过来.重新生成过snapshot ,也重新初始化过订阅,都不能同步数据,后面检查Distributor To Subscriber H ...
- MyBatis笔记----多表关联查询两种方式实现
数据库 方式一:XML 按照下面类型建立article表 Article.java package com.ij34.model; public class Article { private int ...
- 【转载】Python中的垃圾回收机制
GC作为现代编程语言的自动内存管理机制,专注于两件事:1. 找到内存中无用的垃圾资源 2. 清除这些垃圾并把内存让出来给其他对象使用.GC彻底把程序员从资源管理的重担中解放出来,让他们有更多的时间放在 ...
- td 元素属性 noWrap 防止折行、撑开及文字换行
最近调试程序,遇到如下问题: 也就是这个表格里面的文字被换行了,究其原因,主要是td中的width之和超过了100%导致的.谷歌了好久,终于发现,可以用noWrap="noWrap" ...
- Python中关于with open file as 的用法
最近用到python来处理文本文件了,然后需要处理文件.发现python中提供的with open as 这个还是用的不错的!好的,废话不多说了,看下例子: with open('./sig ...
- C# -- 随机数(Random)的使用
使用随机数产生一组大乐透号码 1. C#代码 1 Console.WriteLine("===============大乐透===红色球==============="); Lis ...
- react & vue 项目创建的方式
创建reactApp的几种方式: create-react-app filename 适用于npm6及以下. npm init react-app filename 适用于npm6以上. npx c ...
- May 26. 2018 Week 21st Saturday
Do what you say, say what you do. 做你说过的,说你能做的. Be honest to yourself, and be honest to those people ...
- ZooKeeper Administrator's Guide A Guide to Deployment and Administration(吃别人嚼过的馍没意思,直接看官网资料)
Deployment System Requirements Supported Platforms Required Software Clustered (Multi-Server) Setup ...
- 网络协议 反扒机制 fidder 抓包工具
协议 http 协议: client 端 server 端交互的 一种形式 请求头信息: User-Agent: 情求载体的身份标识 connection: 'close' 连接状态 请求成功后 断开 ...