首页 > 解决方案 > 在 Microsoft ML 中,如何配置分数和预测标签输出

问题描述

我们正在评估 ML.Net,0.6 版,我对错误消息感到沮丧......我的问题,也许有人知道我做错了什么。

我有一个为 ML.Net 创建的类,它有特性和标签。在我添加的学习管道中

var pipeline = new LearningPipeline() {
    new TextLoader(_trainingFile.FullName).CreateFrom<MyClass>(useHeader: true, separator: separator),
    new ColumnCopier(("Trend", "Label")),
    new Dictionarizer("Label"),
    new CategoricalOneHotVectorizer("Trend"),
    new ColumnConcatenator("Features,"col1","col2",... "Trend"),
    new StochasticDualCoordinateAscentClassifier()
    {
        Shuffle = false,
    },
    new PredictedLabelColumnOriginalValueConverter()
    {
            PredictedLabelColumn="PredictedLabel"
    }
};

我的 Predict 类如下所示:

class MyPrediction
{
    [ColumnName("PredictedLabel")]
    public string PredictedLabels;

    [ColumnName("Score")]
    public float Scores;
}

趋势列是一个带有枚举标签的字符串。我进行了训练,效果很好,并不总是预测正确,但是当我添加分数列时出现错误。

无法将“Vec”类型的 IDataView 列“Score”绑定到“System.Single”类型的字段或属性“Scores”。

我需要做什么才能获得预测值和分数,欢迎提出建议。

标签: c#ml.net

解决方案


为了更广泛地回答,任何 ML.NET 训练的模型都是ITransformer. 这意味着它可以Transform()将输入数据集(“示例”)转换为输出数据集(“预测”)。

这种能力可以被称为“批量预测”:一旦你有了一个完整的示例数据集,你就可以通过调用Transform().

为了促进“示例到示例”的预测,我们添加了PredictionFunction成语。是一个完整的例子。

您可以从预测结果中“请求”任意数量的列:只需将相应的字段添加到您的“预测”类中,然后PredictionFunction将适当地填充它们。


推荐阅读