编辑
2025-11-27
C#
00

目录

项目概述
技术栈选择
系统架构设计
销售数据模型类
预测输出类
主程序
核心功能实现
数据加载与预处理
预测模型训练
预测执行
配置要求
项目配置
使用指南
数据准备
预测参数调优
总结

项目概述

本文详细介绍如何使用ML.NET开发一个产品销售预测系统,实现对2024年销售量和收入的预测。该系统使用时间序列分析方法,基于历史数据进行未来销售趋势的预测。

技术栈选择

  • 开发语言:C# (.NET 8.0+)
  • 机器学习框架ML.NET 4.0.1
  • 算法选择:SSA (Singular Spectrum Analysis) 时间序列预测
  • 数据格式:CSV文件存储

系统架构设计

销售数据模型类

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);

image.png

配置要求

项目配置

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>

使用指南

数据准备

  • CSV文件格式要求
  • 数据清洗建议
  • 格式规范

image.png

预测参数调优

C#
// 关键参数说明 windowSize: 12, // 时间窗口大小,影响预测的季节性考虑 seriesLength: 30, // 序列长度,影响模型的学习范围 trainSize: 100, // 训练集大小 horizon: 12 // 预测未来的月份数

总结

本文详细介绍了使用ML.NET开发销售预测系统的完整过程,从系统设计到具体实现,提供了一个可靠的解决方案。通过使用ML.NET的时间序列预测功能,我们能够准确预测未来的销售趋势,为业务决策提供有力支持。

该系统具有以下优势:

  • 预测准确度高
  • 使用简单便捷
  • 可扩展性强
  • 维护成本低

通过持续优化和改进,该系统可以更好地服务于企业的销售预测需求,帮助企业做出更明智的业务决策。

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!