【发布时间】:2019-06-29 07:20:08
【问题描述】:
我正在使用 ML.NET 二进制分类算法和威斯康星乳腺癌数据。训练模型后,我发现每个实例都被评估为假。 在我的测试文件中,我有 100 个实例。 75 个负片和 25 个正片。所以从指标来看,准确率是 0.75,负精度是 0.75。这意味着所有实例都以 0(假)进行评估。
private static string trainingDataPath = Path.Combine(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "uploads"), "data.csv");
private static string testDataPath = Path.Combine(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "uploads"), "test.csv");
public bool checkDiagnostic (BreastCancerData input)
{
// set up a new machine learning context
var mlContext = new MLContext();
// load training and test data
var trainingDataView = mlContext.Data.LoadFromTextFile<BreastCancerData>(trainingDataPath, hasHeader: false, separatorChar: ',');
var testDataView = mlContext.Data.LoadFromTextFile<BreastCancerData>(testDataPath, hasHeader: false, separatorChar: ',');
// Preview the data.
//var dataPreview = trainingDataView.Preview(maxRows:700);
//var dataPreview2 = testDataView.Preview();
// the rest of the training code goes here...
var trainer = mlContext.BinaryClassification.Trainers.LinearSvm("Label", "Features");
var trainingPipeline = mlContext.Transforms.Concatenate(outputColumnName: "Features", nameof(BreastCancerData.AreaMean),
nameof(BreastCancerData.AreaSe), nameof(BreastCancerData.AreaWorst), nameof(BreastCancerData.CompactnessMean),
nameof(BreastCancerData.CompactnessSe), nameof(BreastCancerData.CompactnessWorst), nameof(BreastCancerData.ConcavePointsMean),
nameof(BreastCancerData.ConcavePointsSe), nameof(BreastCancerData.ConcavePointsWorst), nameof(BreastCancerData.ConcavityMean),
nameof(BreastCancerData.ConcavitySe), nameof(BreastCancerData.ConcavityWorst), nameof(BreastCancerData.FractalDimensionMean),
nameof(BreastCancerData.FractalDimensionSe), nameof(BreastCancerData.FractalDimensionWorst), nameof(BreastCancerData.Id),
nameof(BreastCancerData.PerimeterMean), nameof(BreastCancerData.PerimeterSe), nameof(BreastCancerData.PerimeterWorst),
nameof(BreastCancerData.RadiusMean), nameof(BreastCancerData.RadiusSe), nameof(BreastCancerData.SmoothnessMean),
nameof(BreastCancerData.SmoothnessSe), nameof(BreastCancerData.SmoothnessWorst), nameof(BreastCancerData.SymmetryMean),
nameof(BreastCancerData.SymmetrySe), nameof(BreastCancerData.SymmetryWorst), nameof(BreastCancerData.TextureMean),
nameof(BreastCancerData.TextureSe), nameof(BreastCancerData.TextureWorst))
.Append(mlContext.Transforms.CopyColumns(outputColumnName: "Label", inputColumnName: nameof(BreastCancerData.Diagnosis)))
.Append(trainer);
// Preview the result of training and transformation.
var transformationPreview = trainingPipeline.Preview(trainingDataView, maxRows: 700);
try
{
var model = trainingPipeline.Fit(trainingDataView);
using (var file = File.OpenWrite(Path.Combine(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "uploads"), "model.ZIP")))
mlContext.Model.Save(model, trainingDataView.Schema, file);
ITransformer trainedModel;
using (var stream = File.OpenRead(Path.Combine(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "uploads"), "model.ZIP")))
{
trainedModel = mlContext.Model.Load(stream, out var modelInputSchema);
}
var predictionEngine = mlContext.Model.CreatePredictionEngine<BreastCancerData, BreastCancerPrediction>(trainedModel);
Console.WriteLine("** Testing Product 1 **");
// Predict
BreastCancerPrediction prediction = predictionEngine.Predict(input);
Console.WriteLine($"Product: {input.Id} - Diagnostic: {prediction.Prediction}");
BinaryClassificationMetrics metrics = mlContext.BinaryClassification.EvaluateNonCalibrated(model.Transform(testDataView), "Label");
Console.WriteLine($"Accuracy: {metrics.Accuracy:P2}");
Console.WriteLine($"Negative Precision: {metrics.NegativePrecision:P2}");
Console.WriteLine($"Positive Precision: {metrics.PositivePrecision:P2}");
Console.WriteLine($"Positive Recall: {metrics.PositiveRecall:P2}");
Console.WriteLine($"Negative Recall: {metrics.NegativeRecall:P2}");
Console.WriteLine($"Area Precision: {metrics.AreaUnderRocCurve:P2}");
return prediction.Prediction;
}
catch (Exception e)
{
}
return false;
编辑 1:
public class BreastCancerData
{
[LoadColumn(0)]
public float Id { get; set; }
[LoadColumn(1)]
public bool Diagnosis { get; set; }
[LoadColumn(2)]
public float RadiusMean { get; set; }
[LoadColumn(3)]
public float TextureMean { get; set; }
[LoadColumn(4)]
public float PerimeterMean { get; set; }
[LoadColumn(5)]
public float AreaMean { get; set; }
[LoadColumn(6)]
public float SmoothnessMean { get; set; }
[LoadColumn(7)]
public float CompactnessMean { get; set; }
[LoadColumn(8)]
public float ConcavityMean { get; set; }
[LoadColumn(9)]
public float ConcavePointsMean { get; set; }
[LoadColumn(10)]
public float SymmetryMean { get; set; }
[LoadColumn(11)]
public float FractalDimensionMean { get; set; }
[LoadColumn(12)]
public float RadiusSe { get; set; }
[LoadColumn(13)]
public float TextureSe { get; set; }
[LoadColumn(14)]
public float PerimeterSe { get; set; }
[LoadColumn(15)]
public float AreaSe { get; set; }
[LoadColumn(16)]
public float SmoothnessSe { get; set; }
[LoadColumn(17)]
public float CompactnessSe { get; set; }
[LoadColumn(18)]
public float ConcavitySe { get; set; }
[LoadColumn(19)]
public float ConcavePointsSe { get; set; }
[LoadColumn(20)]
public float SymmetrySe { get; set; }
[LoadColumn(21)]
public float FractalDimensionSe { get; set; }
[LoadColumn(22)]
public float RadiusWorst { get; set; }
[LoadColumn(23)]
public float TextureWorst { get; set; }
[LoadColumn(24)]
public float PerimeterWorst { get; set; }
[LoadColumn(25)]
public float AreaWorst { get; set; }
[LoadColumn(26)]
public float SmoothnessWorst { get; set; }
[LoadColumn(27)]
public float CompactnessWorst { get; set; }
[LoadColumn(28)]
public float ConcavityWorst { get; set; }
[LoadColumn(29)]
public float ConcavePointsWorst { get; set; }
[LoadColumn(30)]
public float SymmetryWorst { get; set; }
[LoadColumn(31)]
public float FractalDimensionWorst { get; set; }
}
public class BreastCancerPrediction : BreastCancerData
{
[ColumnName("PredictedLabel")]
public bool Prediction { get; set; }
}
请不要看我使用了这么多的属性而不是向量。
【问题讨论】:
标签: c# .net machine-learning ml.net