ML.NET,“得分列”缺失

我想在ML.NET中创建我的第一个应用程序。 我打赌威斯康星预后乳腺癌数据集 。 我自己生成.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个不同的function(列)。

我的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 model = Train(); Evaluate(model); } public static PredictionModel Train() { var pipeline = new LearningPipeline(); pipeline.Add(new TextLoader("Cancer-train.csv").CreateFrom(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 model = pipeline.Train(); model.WriteAsync(modelPath); return model; } public static void Evaluate(PredictionModel model) { var testData = new TextLoader("Cancer-test.csv").CreateFrom(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 Column时,我仍然会得到相同的exception。

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

谢谢你的任何建议!

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 model = pipeline.Train(); 

EDIT2

看起来如何:

在此处输入图像描述

EDIT3

Separator更改为','并加载原始数据集,而不是我的预设,它仍在大喊大叫,但是没有Score ,所以很烦人

我相信我知道问题是什么。

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

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

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

确切的问题如下:评估者期望“得分”列是一个包含每个类得分的向量列。 它找到的是“得分”列,它是一个标量(只是积极类的得分)。

所以它抛出了一些有些复杂的信息

分数列缺失