我正在尝试使用 ML.NET 为销售分析应用程序设置销售预测算法。我刚刚开始学习 ML.NET,并按照 Microsoft 的教程完成了所有工作。 https://github.com/dotnet/machinelearning-samples/tree/master/samples/csharp/end-to-end-apps/Regression-SalesForecast
这是源模型
public class SalesSummaryGeneralizedDTO
{
public float ProductId { get; set; }
public float SalesQty { get; set; }
public float Day { get; set; }
public float Month { get; set; }
}
这是预测模型:
public class SalesPredictionDTO
{
public int SalesQty { get; set; }
public int ProductId { get; set; }
}
主要代码:
var salesGeneralized = await _saleRepository.GetSalesForPeriod(DateTime.Now.AddYears(-1), DateTime.Now);
var mlContext = new MLContext();
var trainingDataView = mlContext.Data.ReadFromEnumerable(salesGeneralized);
var trainer = mlContext.Regression.Trainers.FastTreeTweedie(labelColumn: DefaultColumnNames.Label, featureColumn: DefaultColumnNames.Features);
var trainingPipeline =
mlContext.Transforms.Concatenate("NumFeatures", nameof(SalesSummaryGeneralizedDTO.Day), nameof(SalesSummaryGeneralizedDTO.Month))
.Append(mlContext.Transforms.Categorical.OneHotEncoding(outputColumnName: "CatFeatures", inputColumnName: nameof(SalesSummaryGeneralizedDTO.ProductId)))
.Append(mlContext.Transforms.Concatenate(DefaultColumnNames.Features, "NumFeatures", "CatFeatures"))
.Append(mlContext.Transforms.CopyColumns(outputColumnName: DefaultColumnNames.Label, inputColumnName: nameof(SalesSummaryGeneralizedDTO.SalesQty)))
.Append(trainer);
var model = trainingPipeline.Fit(trainingDataView);
var predictionEngine = model.CreatePredictionEngine<SalesSummaryGeneralizedDTO, SalesPredictionDTO>(mlContext);
var samplePredictionData = new SalesSummaryGeneralizedDTO
{
ProductId = 7.0f,
Day = 14.0f,
Month = 12.0f
};
var prediction = predictionEngine.Predict(samplePredictionData);
我提供“功能”ProductId、月份和日期,并希望看到 SalesQty 的估计值,但预测总是返回 SalesQty = 0。
微软的文档没有提供太多帮助。提前感谢您对此的任何建议!
编辑:
原来微软的教程缺少一个重要的说明,所以问题出在列映射上。在挖掘其中一个教程的源代码时,我注意到预测结果列的名称是“Score”,所以现在预测正在返回一个值。我的“SalesPredictionDTO”缺少一个属性,我将在下面发布。此外,教程的源代码没有用于 Score 映射属性的 getter 和 setter,不知道它是否重要,但它可以工作。
public class SalesPredictionDTO
{
[ColumnName("Score")]
public int SalesQty;
public int ProductId { get; set; }
}