C# 在多重组合回归模型(ML.NET)中指定列作为特征和标签

C# 在多重组合回归模型(ML.NET)中指定列作为特征和标签,c#,machine-learning,ml.net,C#,Machine Learning,Ml.net,我正在使用ML.NET使用回归模型预测一系列值。我只对预测的一列(分数列)感兴趣。但是,其他一些列的值对于预测类不可用。我不能让它们保持在0,因为这会打乱预测,所以我想它们也必须被预测 我看到了一个关于预测多个值的类似问题。建议创建两个模型,但我可以看到,在每个模型中指定的要素列不包括另一个模型的标签列。因此,这意味着在进行预测时不会使用这些列。是我错了,还是每个模型的“标签”列也应该包含在另一个模型的“要素”列中 下面是一些示例代码,尝试用代码进行解释: public class FooInp

我正在使用ML.NET使用回归模型预测一系列值。我只对预测的一列(分数列)感兴趣。但是,其他一些列的值对于预测类不可用。我不能让它们保持在0,因为这会打乱预测,所以我想它们也必须被预测

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

下面是一些示例代码,尝试用代码进行解释:

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);
}
公共类输入
{
公共浮点功能1{get;set;}
公共浮点功能2{get;set;}
公共浮动条{get;set;}
公共浮点Baz{get;set;}
}
公共类FooPrediction:FooInput
{
公共浮点数{get;set;}
公共浮点数{get;set;}
}
公共ITransformer列车(IEnumerable data)
{
var mlContext=新的mlContext(0);
var trainttestdata=mlContext.Data.TrainTestSplit(mlContext.Data.LoadFromEnumerable(Data));
var pipelineBar=mlContext.Transforms.CopyColumns(“标签”、“栏”)
.Append(mlContext.Transforms.CopyColumns(“Score”、“BarPrediction”))
.Append(mlContext.Transforms.Concatenate(“Features”、“Feature1”、“Feature2”、“Baz”))
.Append(mlContext.Regression.Trainers.FastTree());
var pipelineBaz=mlContext.Transforms.CopyColumns(“标签”、“Baz”)
.Append(mlContext.Transforms.CopyColumns(“分数”、“预测”))
.Append(mlContext.Transforms.Concatenate(“Features”、“Feature1”、“Feature2”、“Bar”))
.Append(mlContext.Regression.Trainers.FastTree());
返回pipelineBar.Append(pipelineBaz.Fit)(trainTestData.TestSet);
}
这实际上与上述答案相同,但添加了
Baz
作为要预测
Bar
的模型的特征,反之,添加
Bar
作为要预测
Baz
的模型的特征


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

可以使用的一种技术是“插补”,它将这些未知值替换为一些“猜测”值。插补只是替换数据集缺失值的过程

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

您在上面讨论的技术也是一种插补形式,通过从其他已知值预测值来替换未知值。这也可以奏效。我想我会尝试这两种形式,看看什么最适合您的数据集。

谢谢您的回答(对延迟回复表示歉意)
ReplaceMissingValues
似乎只插入默认值、最小值、最大值或平均值,而不是尝试预测它们。我编码的插补技术是否没有使用ML更具预测性地插入缺失值?此外,我尝试将类似的技术应用于时间序列模型,但遇到了一个问题。也许你能看到这一点。