【发布时间】: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