【问题标题】:How to predict integer values using ML.NET?如何使用 ML.NET 预测整数值?
【发布时间】:2018-05-23 21:16:07
【问题描述】:

我正在查看这里的 cs 文件:https://www.microsoft.com/net/learn/apps/machine-learning-and-ai/ml-dotnet/get-started/windows,一切正常。

现在我想改进示例:我想预测仅数字数据集而不是数字字符串数据集,例如预测七段显示的输出。

这是我超级简单的数据集,最后一列是我要预测的int数:

1,0,1,1,1,1,1,0
0,0,0,0,0,1,1,1
1,1,1,0,1,1,0,2
1,1,1,0,0,1,1,3
0,1,0,1,0,1,1,4
1,1,1,1,0,0,1,5
1,1,1,1,1,0,1,6
1,0,0,0,0,1,1,7
1,1,1,1,1,1,1,8
1,1,1,1,0,1,1,9

这是我的测试代码:

public class Digit
{
    [Column("0")] public float Up;

    [Column("1")] public float Middle;

    [Column("2")] public float Bottom;

    [Column("3")] public float UpLeft;
    [Column("4")] public float BottomLeft;
    [Column("5")] public float TopRight;
    [Column("6")] public float BottomRight;

    [Column("7")] [ColumnName("DigitValue")]
    public float DigitValue;
}

public class DigitPrediction
{
    [ColumnName("PredictedDigits")] public float PredictedDigits;
}

public PredictDigit()
{
    var pipeline = new LearningPipeline();
    var dataPath = Path.Combine("Segmenti", "segments.txt");
    pipeline.Add(new TextLoader<Digit>(dataPath, false, ","));
    pipeline.Add(new ColumnConcatenator("Label", "DigitValue"));
    pipeline.Add(new ColumnConcatenator("Features", "Up", "Middle", "Bottom", "UpLeft", "BottomLeft", "TopRight", "BottomRight"));
    pipeline.Add(new StochasticDualCoordinateAscentClassifier());
    var model = pipeline.Train<Digit, DigitPrediction>();
    var prediction = model.Predict(new Digit
    {
        Up = 1,
        Middle = 1,
        Bottom = 1,
        UpLeft = 1,
        BottomLeft = 1,
        TopRight = 1,
        BottomRight = 1,
    });

    Console.WriteLine($"Predicted digit is: {prediction.PredictedDigits}");
    Console.ReadLine();
}

您可以看到它与提供的示例非常相似,除了最后一列(“标签”)处理因为我需要预测一个数字而不是一个字符串。我尝试:

pipeline.Add(new ColumnConcatenator("Label", "DigitValue"));

但它不起作用,例外:

Training label column 'Label' type is not valid for multi-class: Vec<R4, 1>. Type must be R4 or R8.

我确定我错过了一些东西,但实际上我在互联网上找不到任何可以帮助我解决这个问题的东西。

更新

我发现数据集必须有一个像这样的Label 列:

[Column("7")] [ColumnName("Label")] public float Label;

还有DigitPredictionScore 列,如:

public class DigitPrediction
{
    [ColumnName("Score")] public float[] Score;
}

现在系统“工作”了,我得到了 prediction.Score 一个 Single[] 值,其中与较高值关联的索引是预测值。 这是正确的方法吗?

更新 2 - 完整的代码示例

按照答案和其他建议我得到了正确的结果,如果你需要它,你可以找到完整的代码here

【问题讨论】:

标签: c# machine-learning ml.net


【解决方案1】:

看来您需要将此字段添加到您的班级DigitPrediction

public class DigitPrediction
{
    [ColumnName("PredicatedLabel")]
    public uuint ExpectedDigit; // <-- This is the predicted value

    [ColumnName("Score")]
    public float[] Score; // <-- This is the probability that the predicted value is the right classification
}

我认为您需要更改将结果写入的行:

    Console.WriteLine($"Predicted digit is: {prediction.ExpectedDigit}");

还有一件事,API 中似乎存在一个错误,其中预期的数字会偏离 1,但如果您通过将 +1 加到预测值来移动它,它将是正确的值。我希望他们将来能解决这个问题,这是一个问题:(https://github.com/dotnet/machinelearning/issues/235)

【讨论】:

  • 谢谢,如果你想看看我将我的代码发布为 Github 存储库,我将其添加到我的答案中。
【解决方案2】:

您还可以尝试在 Pipeline 中将 ColumnConcatenator 与 ColumnCopier 交换为 Label 列。

pipeline.Add(new ColumnCopier ("Label", "DigitValue"));

这将指示管道哪一列是Label,但ColumnCopier的输出不会是向量,这与ColumnConcatenator的输出不同。

同样也可以添加一个 Score 列。

【讨论】:

    【解决方案3】:

    现在,必须遵循模式:

    • 列特征(所有特征 - 它们必须具有相同的类型)

    • 列标签(您的“答案”)

    如果原始数据集有另一个答案列,请使用:

    pipeline.Add(new ColumnCopier(("DigitValue", "Label")));
    

    第一个是源,第二个是目的地。如我所见,双 '(' 是必需的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-16
      • 1970-01-01
      • 2021-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多