Действительно низкая точность с SVM + matlab и libsvm - PullRequest
1 голос
/ 29 марта 2012

Я не могу понять низкую точность, полученную при запуске SVM на речевых векторах. Я перекрестно подтвердил, что данные не ошибочны, и даже использовал наивный байесовский классификатор, чтобы получить хорошие результаты.

Прежде всего я должен отметить, что я подтвердил, что не использую одни и те же файлы для обучения и тестирования.

У меня есть набор данных для положительного и отрицательного класса, который я использую для обучения

  pos = ones(size(PositiveTraining,1),1);
  neg = ones(size(NegativeTraining,1),1)*-1;



  Training = [ PositiveTraining ; NegativeTraining ];
  TrainingLabels = [pos;neg];

  model = svmtrain( TrainingLabels , Training, '-t 0' );

После получения модели я тестирую векторы, используя следующий код

testing_label_vector = ones(size(mfcc,1),1); % where mfcc is my testing matrix
[predicted_label, a, b ] = svmpredict(testing_label_vector, File.mfcc, model );
edges = [-1,1];
hist = histc( predicted_label , edges )

Однако я нахожу точность в диапазоне от 0% до 13% максимум.

Есть что-то, что я делаю неправильно?

Если данные верны, может ли кто-нибудь подсказать мне, как я могу повысить точность классификатора?

1 Ответ

4 голосов
/ 30 марта 2012

Вам нужно сделать выбор параметров - вы просто используете параметры по умолчанию.SVM очень чувствителен к своим параметрам.У линейного ядра нет параметров, но у вас все еще есть параметр штрафа C. Этот параметр обменивается между большим запасом и неправильно классифицированными тренировочными точками.Больший C будет означать, что классификатор будет пытаться правильно классифицировать все тренировочные точки, но это может не очень хорошо обобщать.Меньшая C позволит неправильно классифицировать некоторые точки, чтобы получить модель, которая менее чувствительна к шуму.Значение C отличается для каждого набора данных, так как оно сильно зависит от масштабирования и распределения и т. Д. Также возможно, что ваш набор данных не является линейно разделимым, даже для низких значений C, поэтому, возможно, нелинейное ядро ​​будет работать лучшенапример ядро ​​RBF, которое популярно.Однако имейте в виду, что в этих ядрах больше параметров, и они должны быть настроены для правильной работы.

Прочтите руководство, написанное авторами libsvm, в нем рассказывается о том, как делать выбор параметров, и даются другие практические советы дляиспользуя SVM для классификации.

Практическое руководство по поддержке векторной классификации от Chih-Wei Hsu, Chih-Chung Chang и Chih-Jen Lin

...