本文详细介绍如何使用ML.NET开发一个产品销售预测系统,实现对2024年销售量和收入的预测。该系统使用时间序列分析方法,基于历史数据进行未来销售趋势的预测。
C#using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.ML.Data;
namespace App16
{
/// <summary>
/// 销售数据模型类
/// </summary>
public class SalesData
{
// 日期
[LoadColumn(0)]
public string Date { get; set; }
// 产品1的销售数量
[LoadColumn(1)]
public float QP1 { get; set; }
// 产品2的销售数量
[LoadColumn(2)]
public float QP2 { get; set; }
// 产品3的销售数量
[LoadColumn(3)]
public float QP3 { get; set; }
// 产品4的销售数量
[LoadColumn(4)]
public float QP4 { get; set; }
// 产品1的销售收入
[LoadColumn(5)]
public float SP1 { get; set; }
// 产品2的销售收入
[LoadColumn(6)]
public float SP2 { get; set; }
// 产品3的销售收入
[LoadColumn(7)]
public float SP3 { get; set; }
// 产品4的销售收入
[LoadColumn(8)]
public float SP4 { get; set; }
}
}
C#using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace App16
{
/// <summary>
/// 预测输出类
/// </summary>
public class ForecastOutput
{
public float[] Forecast { get; set; }
}
}
C#using Microsoft.ML;
namespace App16
{
internal class Program
{
private static readonly MLContext mlContext = new MLContext(seed: 1);
public static void Main(string[] args)
{
try
{
Console.WriteLine("开始加载销售数据...");
// 1. 加载数据
string dataPath = "statsfinal.csv";
IDataView dataView = mlContext.Data.LoadFromTextFile<SalesData>(
path: dataPath,
hasHeader: true,
separatorChar: ','
);
Console.WriteLine("数据加载完成,开始训练模型...");
// 2. 训练模型并预测
var predictions = TrainAndPredict(dataView);
// 3. 显示预测结果
DisplayPredictions(predictions);
}
catch (Exception ex)
{
Console.WriteLine($"发生错误: {ex.Message}");
}
}
/// <summary>
/// 训练模型并进行预测
/// </summary>
private static Dictionary<string, float[]> TrainAndPredict(IDataView dataView)
{
var predictions = new Dictionary<string, float[]>();
string[] columns = { "QP1", "QP2", "QP3", "QP4", "SP1", "SP2", "SP3", "SP4" };
foreach (var column in columns)
{
// 创建SSA预测管道
var forecastingPipeline = mlContext.Forecasting.ForecastBySsa(
outputColumnName: "Forecast",
inputColumnName: column,
windowSize: 12, // 使用12个月的窗口大小
seriesLength: 30, // 序列长度
trainSize: 100, // 训练大小
horizon: 12 // 预测未来12个月
);
// 训练模型
var transformedData = forecastingPipeline.Fit(dataView);
// 使用训练好的模型进行预测
var forecastData = transformedData.Transform(dataView);
// 获取预测结果
var forecasts = mlContext.Data.CreateEnumerable<ForecastOutput>(
forecastData, reuseRowObject: false).LastOrDefault();
if (forecasts != null && forecasts.Forecast != null)
{
predictions.Add(column, forecasts.Forecast);
}
}
return predictions;
}
/// <summary>
/// 显示预测结果
/// </summary>
private static void DisplayPredictions(Dictionary<string, float[]> predictions)
{
Console.WriteLine("\n2024年销售预测结果:");
Console.WriteLine("----------------------------------------");
// 显示每个产品的预测结果
for (int i = 0; i < 4; i++)
{
var quantityKey = $"QP{i + 1}";
var revenueKey = $"SP{i + 1}";
if (predictions.ContainsKey(quantityKey) && predictions.ContainsKey(revenueKey))
{
float totalQuantity = predictions[quantityKey].Sum();
float totalRevenue = predictions[revenueKey].Sum();
Console.WriteLine($"\n产品 {i + 1} 预测结果:");
Console.WriteLine($"年度销售数量预测: {totalQuantity:N0} 件");
Console.WriteLine($"年度销售收入预测: ¥{totalRevenue:N2}");
Console.WriteLine("\n月度预测明细:");
for (int month = 0; month < 12; month++)
{
Console.WriteLine($"{month + 1}月 - " +
$"预计销量: {predictions[quantityKey][month]:N0} 件, " +
$"预计收入: ¥{predictions[revenueKey][month]:N2}");
}
Console.WriteLine("----------------------------------------");
}
}
// 计算并显示年度总计
float yearTotalQuantity = 0;
float yearTotalRevenue = 0;
for (int i = 0; i < 4; i++)
{
var quantityKey = $"QP{i + 1}";
var revenueKey = $"SP{i + 1}";
if (predictions.ContainsKey(quantityKey) && predictions.ContainsKey(revenueKey))
{
yearTotalQuantity += predictions[quantityKey].Sum();
yearTotalRevenue += predictions[revenueKey].Sum();
}
}
Console.WriteLine("\n2024年总体预测汇总:");
Console.WriteLine($"总销售数量: {yearTotalQuantity:N0} 件");
Console.WriteLine($"总销售收入: ¥{yearTotalRevenue:N2}");
Console.WriteLine($"月平均销售数量: {(yearTotalQuantity / 12):N0} 件");
Console.WriteLine($"月平均销售收入: ¥{(yearTotalRevenue / 12):N2}");
}
}
}
C#// 加载CSV数据
IDataView dataView = mlContext.Data.LoadFromTextFile<SalesData>(
path: dataPath,
hasHeader: true,
separatorChar: ','
);
C#var forecastingPipeline = mlContext.Forecasting.ForecastBySsa(
outputColumnName: "Forecast",
inputColumnName: column,
windowSize: 12, // 使用12个月的窗口大小
seriesLength: 30, // 序列长度
trainSize: 100, // 训练大小
horizon: 12 // 预测未来12个月
);
C#var transformedData = forecastingPipeline.Fit(dataView);
var forecastData = transformedData.Transform(dataView);

XML<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.ML" Version="4.0.1" />
<PackageReference Include="Microsoft.ML.TimeSeries" Version="4.0.1" />
</ItemGroup>
<ItemGroup>
<None Update="statsfinal.csv">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>

C#// 关键参数说明
windowSize: 12, // 时间窗口大小,影响预测的季节性考虑
seriesLength: 30, // 序列长度,影响模型的学习范围
trainSize: 100, // 训练集大小
horizon: 12 // 预测未来的月份数
本文详细介绍了使用ML.NET开发销售预测系统的完整过程,从系统设计到具体实现,提供了一个可靠的解决方案。通过使用ML.NET的时间序列预测功能,我们能够准确预测未来的销售趋势,为业务决策提供有力支持。
该系统具有以下优势:
通过持续优化和改进,该系统可以更好地服务于企业的销售预测需求,帮助企业做出更明智的业务决策。
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!