Правильный способ написать функцию стоимости в SVM в Matlab - не в состоянии понять матрицу 'Cost' - PullRequest
0 голосов
/ 08 июня 2018

Я хочу применить SVM к несбалансированному набору данных и answer1 , answer2 предположить, что это можно сделать, настроив параметры функции fitcsvm.Несмотря на это, SVM, возможно, не является хорошим выбором для несбалансированных данных, но я хочу увидеть результат для образовательных целей.

Как настроить параметры в SVM, чтобы повысить наказание за ошибку неправильной классификации для истинного класса (помечен как 1), поскольку мои данные, естественно, несбалансированы и имеют меньшее количество 1 в отличие от 0 (false).Только 2% помечены как 1.

  • Набор данных содержит 1473 образца (98%), помеченных как 0, и 27 образцов (2%) как 1.

  • * 1021.* Учебные данные имеют 1000 образцов, помеченных как 0 и 12 образцов как 1.
  • Данные испытаний имеют 473 образца (97%) как 0 и 15 образцов (3%)как 1.Я применил двойной штраф к 1, используя матрицу затрат, c, как показано ниже:
c=[0 2.2;1 0];
model = fitcsvm(train_x,train_y,'KernelFunction', 'rbf', 'Cost',c);
[predLabel,score] = predict(model,test_x);

Результат -

Precision for label 0: 9.692623e-01
Precision for label 1: NaN
Recall for label 0: 1
Recall for label 1: 0

Accuracy = 96.9%
Average err = 0.03

Матрица путаницы:

    473     0
    15     0

Ответ в векторе predict - все 1 метки.Очевидно, что матрица затрат работает неправильно.Я не совсем понимаю, глядя на матрицу затрат, наказываю ли я ошибочную классификацию 0 (класс большинства) или 1 (класс меньшинства).Почему первый ряд и первый элемент столбца = 0, а другой - 2. Пожалуйста, помогите.

Ответы [ 2 ]

0 голосов
/ 17 июня 2018

Судя по вашим результатам, оба класса принадлежат одному и тому же дистрибутиву.Попробуйте передискретизировать свои тренировочные данные (генерируя больше положительных образцов, используя имеющиеся у вас положительные образцы), и построить свою модель на этом, а затем протестировать свою модель на тестировании.

0 голосов
/ 11 июня 2018

Это может быть показано с использованием некоторых тестовых данных, например, следующих:

rng(42)
X = randn(1000, 2);
y = rand(1000, 1) >= 0.98;
X(y==1, :) = X(y==1, :) + [2, 2];

Простой SVM с функцией ядра Гаусса не будет хорошо работать из-за дисбаланса класса:

model = fitcsvm(X, y, 'KernelFunction', 'rbf')
confusionmat(y, model.predict(X))

ans =

   979     2
    14     5

Как вы уже признали, параметр 'Cost' может использоваться для компенсации дисбаланса путем наложения более высокого штрафа за неправильную классификацию класса меньшинства.В двумерном случае матрица затрат строится следующим образом:

[ Cost(0, 0),    Cost(0, 1)
  Cost(1, 0),    Cost(1, 1) ]

Теперь Cost(0, 0) - это стоимость отнесения выборки, принадлежащей к классу 0, к классу 0.Это правильная классификация, поэтому обычно стоимость устанавливается равной 0. Далее Cost(0, 1) - это стоимость классификации точки, принадлежащей к классу 0, как класса 1, то есть неправильная классификация.

В вашем примере класс 0 более вероятен, чем класс 1, поэтому мы должны наложить низкое наказание на классификацию выборки из класса 0 (большинство) в качестве класса 1 (меньшинство), ивысокий штраф за отнесение выборки из класса 1 (меньшинство) к классу 0 (большинство).Таким образом, Cost(0, 1) должно быть низким, а Cost(1, 0) должно быть высоким.

Установив c = [0, 2.2; 1, 0], вы сделали обратное - вы посоветовали функции fitcsvm скорее классифицировать миноритарную выборку как большинство, чем противоположную.:

c = [0, 2.2; 1, 0];
model = fitcsvm(X, y, 'KernelFunction', 'rbf', 'Cost', c);
confusionmat(y, model.predict(X))

ans =

   981     0
    19     0

Если вы используете те же веса в матрице затрат c, но переключаете Cost(0, 1) и Cost(1, 0), тогда произойдет желаемый эффект:

c = [0, 1; 2.2, 0];
model = fitcsvm(X, y, 'KernelFunction', 'rbf', 'Cost', c);
confusionmat(y, model.predict(X))

ans =

   973     8
     7    12

Это действительно улучшает наш результат: в целом мы имеем схожее количество ошибочных классификаций: 15 вместо 16 общих ошибочных классификаций, но 12 из 19 выборок из класса меньшинства верны с новой моделью по сравнению с 5 ранее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...