【问题标题】:ML.NET Regression FastTree predictions always return 0ML.NET 回归 FastTree 预测始终返回 0
【发布时间】:2019-07-06 10:47:03
【问题描述】:

我正在尝试使用 ML.NET 为 Sales Analytics 应用程序设置销售预测算法。我刚刚开始学习 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。

Microsoft 的文档没有提供太多帮助。 提前感谢您对此的任何建议!

编辑:

原来微软的教程缺少一个重要说明,所以问题出在列映射上。在挖掘其中一个教程的源代码时,我注意到预测结果列的名称是“Score”,所以现在预测正在返回一个值。 我的“SalesPredictionDTO”缺少一个属性,我将在下面发布。 另外教程的源代码中没有分数映射属性的getter和setter,不知道它是否重要,但它可以工作。

public class SalesPredictionDTO
{
    [ColumnName("Score")]
    public int SalesQty;
    public int ProductId { get; set; }
}

【问题讨论】:

  • 你有多少数据,是否平衡?对于您的模型,您获得了哪些指标? Day 和 Month 是否需要是分类值而不是数值?
  • @amy8374 我有一个大约 8k 销售记录的列表;指标是:平均 L1 损失:92.431;平均 L2 损失:23464.306;平均有效值:92.431;平均损失函数:23464.306;平均 R 平方:0.582;不知道分类和数字,因为我不知道两者之间有什么区别:)

标签: c# .net machine-learning ml.net


【解决方案1】:

我建议首先使用model.Transform(someTestData) 对测试数据集进行评分,检查转换后的数据,然后使用mlContext.Regression.Evaluate(transformedData) 评估算法。您可以使用mlContext.Regression.TrainTestSplit(allYourData, testFraction: 0.1) 拆分为训练集和测试集,或者将训练集本身用作测试集可能只是指示性的,但不是最佳实践。

只有当您对自己训练的预测模型感到满意时,我才会开始使用预测功能。

【讨论】:

  • 感谢您的建议!将来肯定会派上用场。我弄清楚是什么导致了最初的问题,这是一个映射问题,我会将其添加到我的帖子中。
猜你喜欢
  • 2018-12-06
  • 1970-01-01
  • 2018-12-10
  • 1970-01-01
  • 1970-01-01
  • 2017-09-05
  • 2019-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多