Бесполезная модель SVM, мои данные бесполезны или я использую libsvm неправильно? - PullRequest
0 голосов
/ 15 мая 2019

Я пытаюсь использовать набор данных CBIS-DDSM для классификации злокачественных или доброкачественных опухолей молочной железы с помощью PCA и SVM.

Однако мои результаты поразительно плохи, и я работал над своей головой на прошлой неделе, пытаясь поправиться и больше говорить о результатах. Мой набор тестов имеет неправильный вес, доброкачественные случаи занимают 63% случаев, а моя точность без весов достигает максимума 63% при различных значениях C и Gamma. Когда я пытаюсь взвесить дисбаланс, я получаю точность около 50%, в основном бесполезная модель.

Я использую ядро ​​RBF со значениями гаммы и c, равными 1. Мои данные о тестировании и обучении можно найти в формате libsvm здесь:

TestSet с 50 компонентами от PCA TrainSet с 50 компонентами от PCA

Мои данные просто бесполезны или я что-то не так делаю с SVM? Мой код обучения / проверки можно увидеть здесь:

            trainingSet = SVMProblemHelper.Load(Configuration.Get("
            testSet = SVMProblemHelper.Load(Configuration.Get("TestSetLocation"));
            trainingSet = trainingSet.Normalize(SVMNormType.L2);
            testSet = testSet.Normalize(SVMNormType.L2);

            trainingSet.Save("trainset-normalized.txt");
            testSet.Save("testset-normalized.txt");

            SVMParameter parameter = new SVMParameter
            {
                Type = SVMType.C_SVC,
                Kernel = SVMKernelType.RBF,
                C = double.Parse(Configuration.Get("C")), // trying different values for both c and gamma, around 0.01 to 1000
                Gamma = double.Parse(Configuration.Get("Gamma")),
                Probability = false,
                WeightLabels = new int[] {0, 1},
                Weights = new double[] {1-0.63, 0.63} // have tried with and without these weights
            };

            Console.WriteLine("training svm");

            double[] crossValidationResults; // output labels
            int nFold = int.Parse(Configuration.Get("nFold"));
            trainingSet.CrossValidation(parameter, nFold, out crossValidationResults);

            // Evaluate the cross validation result
            // If it is not good enough, select the parameter set again
            double crossValidationAccuracy = trainingSet.EvaluateClassificationProblem(crossValidationResults);

            // Train the model, If your parameter set gives good result on cross validation
            SVMModel model = trainingSet.Train(parameter);

            // Save the model
            SVM.SaveModel(model, Configuration.Get("ModelLocation"));

            // Predict the instances in the test set
            double[] testResults = testSet.Predict(model);


            // Evaluate the test results
            double testAccuracy =
                testSet.EvaluateClassificationProblem(testResults, model.Labels, out var confusionMatrix);

            // Print the resutls
            Console.WriteLine("\n\nCross validation accuracy: " + crossValidationAccuracy);
            Console.WriteLine("\nTest accuracy: " + testAccuracy);
            Console.WriteLine("\nConfusion matrix:\n");

Я пытался использовать Extremes PCA, Accords PCA и наш собственный алгоритм, но без изменений. Наши входные картинки выглядят хорошо.

Редактировать: Я мог бы добавить, что вход в PCA, нормализованный 100x100 посевов опухоли в оттенках серого, иначе pca приспособлен к векторам длиной 10000.

...