在多个组合回归模型(ML.NET)中将列指定为要素和标签

时间:2019-10-13 21:02:24

标签: c# machine-learning ml.net

我正在使用ML.NET通过回归模型预测一系列值。我只对预测的一列(分数列)感兴趣。但是,某些其他列的值不适用于预测类。我不能将它们保留为0,因为这会破坏预测,所以我猜他们也必须被预测。

我在预测多个值时遇到了类似的问题hereanswer建议创建两个模型,但是我可以看到在每个模型中指定的要素列不包括另一个模型的标签列。因此,这意味着在进行预测时不会使用这些列。我是错误的,还是每个模型的标签列也应包含在另一个模型的功能列中?

下面是一些示例代码,试图在代码中进行解释:

public class FooInput
{
    public float Feature1 { get; set; }
    public float Feature2 { get; set; }
    public float Bar {get; set; }
    public float Baz {get; set; }
}

public class FooPrediction : FooInput
{
    public float BarPrediction { get; set; }
    public float BazPrediction { get; set; }
}

public ITransformer Train(IEnumerable<FooInput> data)
{
    var mlContext = new MLContext(0);
    var trainTestData = mlContext.Data.TrainTestSplit(mlContext.Data.LoadFromEnumerable(data));

    var pipelineBar = mlContext.Transforms.CopyColumns("Label", "Bar")
        .Append(mlContext.Transforms.CopyColumns("Score", "BarPrediction"))
        .Append(mlContext.Transforms.Concatenate("Features", "Feature1", "Feature2", "Baz"))
        .Append(mlContext.Regression.Trainers.FastTree());

    var pipelineBaz = mlContext.Transforms.CopyColumns("Label", "Baz")
        .Append(mlContext.Transforms.CopyColumns("Score", "BazPrediction"))
        .Append(mlContext.Transforms.Concatenate("Features", "Feature1", "Feature2", "Bar"))
        .Append(mlContext.Regression.Trainers.FastTree());

    return pipelineBar.Append(pipelineBaz).Fit(trainTestData.TestSet);
}

这实际上与上述答案相同,但增加了Baz作为要预测Bar的模型的特征,反之则增加了Bar作为要预测Baz的模型的功能。

这是正确的方法还是其他问题的答案达到了预期的结果,是因为每一列的预测都将利用加载的数据集中另一个预测列的值?

1 个答案:

答案 0 :(得分:1)

您可以使用的一种技术称为“ Imputation”,该技术将这些未知值替换为某些“猜测”值。估算只是替换数据集缺失值的过程。

在ML.NET中,您正在寻找的是ReplaceMissingValues转换。您可以在docs.microsoft.com上找到samples

您在上面讨论的技术也是一种估算的形式,您的未知数将由其他已知值中的预测值替换。这也可以。我想我会尝试两种形式,然后看看哪种形式最适合您的数据集。