【问题标题】:ML.NET, "Score Column" is missingML.NET,“分数列”缺失
【发布时间】:2018-09-14 15:29:32
【问题描述】:

我想在 ML.NET 中制作我的第一个应用程序。我赌威斯康星州Prognostic Breast Cancer Dataset。我自己生成 .csv 文件。该文件的一条记录如下所示:

B;11.62;18.18;76.38;408.8;0.1175;0.1483;0.102;0.05564;0.1957;0.07255;0.4101;1.74;3.027;27.85;0.01459;0.03206;0.04961;0.01841;0.01807;0.005217;13.36;25.4;88.14;528.1;0.178;0.2878;0.3186;0.1416;0.266;0.0927

它有 31 个不同的特征(列)。

我的 CancerData.cs 看起来像这样:

class CancerData
{

    [Column(ordinal: "0")]
    public string Diagnosis;

    [Column(ordinal: "1")]
    public float RadiusMean;

    [Column(ordinal: "2")]
    public float TextureMean;

    [Column(ordinal: "3")]
    public float PerimeterMean;

   //.........

   [Column(ordinal: "28")] 
    public float ConcavPointsWorst;

    [Column(ordinal: "29")]
    public float SymmetryWorst;

    [Column(ordinal: "30")]
    public float FractalDimensionWorst;

    [Column(ordinal: "31", name: "Label")]
    public string Label;
}

还有CancerPrediction.cs

class CancerPrediction
{
    [ColumnName("PredictedLabel")]
    public string Diagnosis;

}

我的Program.cs

class Program
{

    static void Main(string[] args)
    {
        PredictionModel<CancerData, CancerPrediction> model = Train();
        Evaluate(model);
    }

    public static PredictionModel<CancerData, CancerPrediction> Train()
    {
        var pipeline = new LearningPipeline();
        pipeline.Add(new TextLoader("Cancer-train.csv").CreateFrom<CancerData>(useHeader: true, separator: ';'));
        pipeline.Add(new Dictionarizer(("Diagnosis", "Label")));
        pipeline.Add(new ColumnConcatenator(outputColumn: "Features",
            "RadiusMean",
            "TextureMean",
            "PerimeterMean",
            //... all of the features
            "FractalDimensionWorst"));
        pipeline.Add(new StochasticDualCoordinateAscentBinaryClassifier());
        pipeline.Add(new PredictedLabelColumnOriginalValueConverter() { PredictedLabelColumn = "PredictedLabel" });
        PredictionModel<CancerData, CancerPrediction> model = pipeline.Train<CancerData, CancerPrediction>();
        model.WriteAsync(modelPath);
        return model;

    }

    public static void Evaluate(PredictionModel<CancerData, CancerPrediction> model)
    {
        var testData = new TextLoader("Cancer-test.csv").CreateFrom<CancerData>(useHeader: true, separator: ';');
        var evaluator = new ClassificationEvaluator();
        ClassificationMetrics metrics = evaluator.Evaluate(model, testData);
        var accuracy = Math.Round(metrics.AccuracyMicro, 2);
        Console.WriteLine("The accuracy is: " + accuracy);
        Console.ReadLine();
    }
}

我得到的是:

ArgumentOutOfRangeException:缺少分数列

ClassificationMetrics metrics = evaluator.Evaluate(model, testData); 方法上。

当我在CancerPrediction 中添加Score 列时,我仍然得到同样的异常。

我看到有人在StackOverflow 上遇到了同样的问题,但看起来没有答案,我无法对此发表评论,因为我没有足够的声誉。这是一个错误吗?也许我的数据没有准备好?我在ver. 0.5.0中使用ML.NET

感谢您的任何建议!

EDIT1:

当我添加到CancerPrediction.cs 那一行时:

class CancerPrediction
{
    [ColumnName("PredictedLabel")]
    public string PredictedDiagnosis;

    [ColumnName("Score")]
    public string Score; // => new column!
}

我得到一个例外:

System.InvalidOperationException: '无法将'R4' 类型的 IDataView 列'Score' 绑定到'System.String' 类型的字段或属性'Score'。'

排队:

PredictionModel<CancerData, CancerPrediction> model = pipeline.Train<CancerData, CancerPrediction>();

EDIT2

外观:

EDIT3

Separator 更改为',' 并加载不是我准备的原始数据集它仍然在大喊大叫,taht 没有Score,太烦人了

【问题讨论】:

  • 我认为Score 列必须是float,这可能就是您遇到第二个异常的原因。
  • @Jon 还是一样的Score not existing

标签: c# .net-core ml.net


【解决方案1】:

我相信我知道问题出在哪里。

您正在使用StochasticDualCoordinateAscentBinaryClassifier,它是一个二元分类器。

您正在尝试使用ClassificationEvaluator 评估结果,这是一个多类分类评估器。

我建议你使用BinaryClassificationEvaluator 来评估二元分类器模型。

确切的问题如下:评估者期望列'Score'是一个向量列,其中包含每个类的分数。它找到的是“分数”列,它是一个标量(只是正类的分数)。

所以它抛出了一些令人费解的消息

分数栏缺失

【讨论】:

  • 谢谢!现在它起作用了。遗憾的是,即使在文档中也缺乏有关该框架的信息
  • @michasaucer 我们正在开发新的 API,这将在错误消息中对用户更加友好。实际上,这个特定问题可能会变成编译时错误。
  • 老实说,我没有深入研究文档是我的错,因为这感觉就像我在 ML 方面缺乏经验一样。我对 ML.NET 的新功能感到非常兴奋,尤其是 Keras/TF 的 API 或其他使用 CNN 的实现来处理 imaged ;)
猜你喜欢
  • 2021-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多