SVM: объединение отдельных оценок для каждого параметра путем обучения SVM.

Привет всем специалистам по машинному обучению, я наивен в темах машинного обучения. Мои данные имеют шесть функций (6 обычных атрибутов) и 2 метки (1 специальный атрибут) (истина и ложь) (надеюсь, я использовал правильный термин). Я хочу объединить те функции, которые должны быть обучены SVM. Данные выглядят так: -

ZDis       ZAnch     ZSurf     Zval     ZDom     ZEntropy  Top5
0.48659   -0.20412  1.19243   0.15374  0.59667   1.34151   False
-0.10067  4.89898   -0.73677  0.22506  0.59667   1.34151   True
2.24837   -0.20412  -2.02291  0.22455  0.59667   1.34151   False
0.48659   -0.20412  1.19243   -0.06352 0.59667   1.34151   False
-0.68793  -0.20412  1.19243   0.12405  0.59667   1.34151   False
-2.02698  -0.40825  1.86371   0.07348  1.3272    -0.1242   False
-0.1807   2.44949   0.17865   0.07345  0.9401    0.1505    False
1.66557   2.44949   -1.50641  0.07381  0.9401    1.30135   False
1.11169   -0.40825  0.34716   0.07381  0.9401    -0.20225  True
1.5337    -0.40825  -0.01393  0.07381  -0.9954   0.53144   False
-0.01945  -0.48348  -1.16128  0.11035  2.02339   0.90237   False
-1.52944   3.23556  0.23428   0.11093  1.22613   -0.12973  False
0.43354   -0.48348  -2.20795  0.11093  1.22613   2.25734   False
2.84953   -0.48348  -2.20795  0.11093  1.49189   3.07609   True

Итак, я хочу сделать здесь total = X1*ZDis+X2*ZAnch+X3*ZSurf+X4*Zval+X5*ZDom+X6*ZEntropy, где X1..X6 — взвешенное значение, которое должно исходить от SVM. Я использовал Rapidminner, чтобы получить это значение веса для моих 40 примеров тренировочного набора, и результат ниже:

Total number of Support Vectors: 40
Bias (offset): -1.055
w[ZDis] = 0.076
w[ZAnch] = -0.058
w[ZSurf] = 0.057
w[Zval] = 0.010
w[ZDom] = 0.073
w[ZEntropy] = 0.077

Я не уверен, что сделал правильный подход или нет, поэтому мне нужна ваша помощь. Заранее спасибо. Также, если кто-то подскажет мне, как написать код для этой проблемы SVM на python, это тоже будет полезно для меня.

Спасибо, Паллаб.


Получив от вас обратную связь, я снова проанализировал свою проблему, где у меня есть 277 наборов данных, 8 из которых положительные, а 269 отрицательные с 8 функциями, поэтому он ясно показывает мне свой набор данных дисбаланса. как я уже говорил ранее, я хочу придать равную важность всем своим функциям, используя SVM по весу SVM, а затем хочу сделать ( w1*x1+w2*x2+...+w8*x8), что поможет мне извлечь истинный результат из моего набора данных. Данные такие: -

`NameOfMotif eval_Zscore dis_Zscore abind_Zscore surf_Zscore pfam_Zscore ptm_Zscore coil_Zscore entropy_Zscore TrueVsFalse
ptk_9 0.77428 0.2387 -0.39736 1.48274 0.61237 -0.21822 0.49111 0.44599 False
ptk_8 0.77494 -0.97317 -0.39736 -0.27357 -1.63299 -0.21822 0.6181 -0.04028 False
ptk_3 0.77591 1.45058 -0.39736 -0.1139 0.61237 4.58258 0.74509 -0.85069 True
ptk_6 0.77583 -2.18505 -0.39736 -0.27357 0.61237 -0.21822 -0.3343 -0.92281 False
ptk_22 0.55932 1.45058 -0.39736 0.70216 0.61237 -0.21822 1.25303 -2.17556 False
ptk_23 0.51159 -0.97317 -0.39736 1.05697 -1.63299 -0.21822 1.25303 0.77021 False
ptk_20 0.62907 0.2387 -0.39736 1.05697 0.61237 -0.21822 -0.22848 -1.21702 False
..............................................................................
scf-trcp1_1 0.17425 2.23675 -0.92125 -0.03478 1.20877 5.13288 1.31262 2.27655 True
scf-trcp1_3 0.17425 -1.068 -0.92125 -0.82472 -2.43745 -0.43743 0.48341 -0.59339 False
scf-trcp1_5 0.17425 0.41914 0.24523 -1.05041 0.23644 -0.43743 -0.02919 1.68523 False
scf-trcp1_7 0.17425 -1.63453 -0.92125 -1.25354 -1.82975 -0.43743 -2.0193 0.95051 False`

и мой вывод svm

kernel type polynomial
cross fold validation =5
c=100000.0
kernal degree = 1.0E-4
L-pos =2.0
L-neg =2.0
PerformanceVector:
accuracy: 84.60% +/- 23.58% (mikro: 84.48%)
ConfusionMatrix:
True:   False   True
False:  228 2
True:   41  6
precision: 31.08% +/- 25.51% (mikro: 12.77%) (positive class: True)
ConfusionMatrix:
True:   False   True
False:  228 2
True:   41  6
recall: 70.00% +/- 40.00% (mikro: 75.00%) (positive class: True)
ConfusionMatrix:
True:   False   True
False:  228 2
True:   41  6
AUC (optimistic): 0.793 +/- 0.184 (mikro: 0.793) (positive class: True)
AUC: 0.793 +/- 0.184 (mikro: 0.793) (positive class: True)
AUC (pessimistic): 0.793 +/- 0.184 (mikro: 0.793) (positive class: True)

Мой вопрос здесь, мой подход достаточно хорош сейчас? все параметры, которые я использовал для оптимизации SVM, в порядке? Я очень наивен в этом вопросе!! спасибо Паллаб


person Paul85    schedule 01.10.2013    source источник
comment
Почему вы не уверены, что это правильный подход? Вы тестировали свои параметры на тестовых данных?   -  person Eric Conner    schedule 01.10.2013
comment
Я проверил свои тестовые данные, специально вынул 5 примеров из своего тренировочного набора (теперь он содержит только 35 примеров), где в тестовом наборе 4 ложных и 1 истинный, но rapisminner дает мне 5 ложных результатов!!   -  person Paul85    schedule 01.10.2013


Ответы (2)


Вы используете линейную модель и предполагаете, что существует набор параметров, которые дадут вам ответ, просто вычислив sign( w1*x1+w2*x2+...+w5*x5 - b). Такие предположения редко имеют место для пространств низкой размерности. В вашем конкретном примере у вас всего 5 измерений и очень маленький тренировочный набор. Работа с такими небольшими данными — почти нет шансов, что какой-либо подход к машинному обучению даст хорошие результаты, поскольку все они являются статистическими методами. Трудно говорить о статистике 30 элементов.

На вопросы:

  • Чтобы попробовать это на питоне, взгляните на scikit-learn
  • Чтобы проверить свою модель, выполните перекрестную проверку — разделите данные, например, на 5 фрагментов (каждый из 7 примеров), затем обучите SVM на 4 таких фрагментах (28 баллов) и протестируйте оставшийся 1 фрагмент (7 баллов), повторите 5 раз, поэтому каждый блок используется ровно один раз для тестирования. Вычислить среднее значение полученной точности
  • Для работы с низкоразмерными нелинейно-разделимыми данными попробуйте использовать другие ядра, например, полиномиальные (с малой степенью) или, если это не работает, - RBF.
  • Помните, что SVM — это параметрическая модель. Вам необходимо выбрать правильные параметры, чтобы получить хорошие результаты. Для линейного SVM требуется параметр C — чем больше C, тем больше вы «заставляете» SVM правильно классифицировать данные (минимизируете количество ошибок классификации). При использовании ядер - вы получаете другие параметры (так что помимо C вы получаете d в полиноме и gamma в rbf). Выбор лучших параметров можно выполнить с помощью поиска по сетке (у scikit-learn есть процедуры для автоматизации этого, читайте документацию)
  • Стандартизация данных - общеизвестно, что многие модели ML (включая SVM) могут плохо работать с данными, где каждая функция имеет разный масштаб - похоже, это ваш случай (Zval кажется намного меньше, чем Zentropy) - чтобы избежать функции смещения, вы должны масштабировать их, например, до интервалов [-1,1] или нормализовать, чтобы каждый из них имел среднее значение 0 и дисперсию 1
person lejlot    schedule 02.10.2013
comment
Спасибо за полезную информацию, теперь попробую реализовать вашу идею в своей проблеме - person Paul85; 02.10.2013

Вы упоминаете, что, удерживая 5 записей, вы получили 5 ложных классификаций, из которых 4 были правильными и 1 неверным. Этой информации недостаточно, чтобы понять, хороша ли модель. Как сказано в предыдущем ответе, оцените производительность SVM на невидимых данных, выполнив перекрестную проверку (оператор RapidMiner называется X-Validation). Это даст вам представление о том, имеет ли модель вообще какую-либо ценность. Чтобы настроить параметры оператора SVM для улучшения модели, используйте оператор Loop Parameters и объедините его с перекрестной проверкой, чтобы получить предполагаемую производительность.

person Andrew Chisholm    schedule 05.10.2013