Я пытаюсь использовать набор данных 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.