ML.NET回归FastTree预测始终返回0

时间:2019-02-12 17:56:29

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

我正在尝试使用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,Month和Day,并希望看到SalesQty的估算值,但是预测总是返回SalesQty = 0。

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

编辑:

结果证明Microsoft的教程缺少重要说明,因此问题出在列映射。在研究其中一个教程的源代码时,我注意到预测结果列的名称为“ Score”,因此现在预测返回一个值。 我的“ SalesPredictionDTO”缺少一个属性,我将在下面发布。 另外,本教程的源代码没有对Score映射属性进行getter和setter的设置,不知道它是否重要,但是可以使用。

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

1 个答案:

答案 0 :(得分:0)

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

只有对训练的预测模型感到满意之后,我才开始使用预测功能。