【问题标题】:ML.NET algorithm is evaluating instances regarding breast cancer always falseML.NET 算法正在评估有关乳腺癌的实例总是错误的
【发布时间】: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


    【解决方案1】:

    好的,所以我通过删除Id 属性解决了这个问题。现在,使用 SDCA 算法的准确率是 97.x%。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-20
      • 1970-01-01
      • 1970-01-01
      • 2021-09-27
      • 1970-01-01
      • 2019-03-06
      • 2020-09-08
      • 1970-01-01
      相关资源
      最近更新 更多