Почему существует разница в результатах прогнозирования между AdaBoost с n_estimators=1, который использует SVC в качестве базовой оценки, и просто SVC

#python #scikit-learn #adaboost

Вопрос:

В настоящее время я использую ежедневные финансовые данные, чтобы соответствовать моим SVM и AdaBoost. Чтобы проверить свой результат, я попробовал AdaBoost с n_estimators=1, чтобы он возвращал тот же результат, что и при запуске одной SVM.

 from sklearn.ensemble import AdaBoostClassifier
from sklearn.svm import SVC


svm2 = SVC(C=box_const, kernel='rbf', degree=3, gamma='scale', coef0=0.0,
          shrinking=True, tol=0.001, cache_size=1000, class_weight='balanced',
          verbose=False, max_iter=-1, decision_function_shape='ovr', probability=True)
model2 = AdaBoostClassifier(base_estimator=svm2,
                           n_estimators=1,
                           algorithm='SAMME.R')


model2.fit(X_train, y_train)
svm2.fit(X_train, y_train)
 

Однако, напротив, я обнаружил, что, хотя я установил n_estimators=1, они дали другой результат прогнозирования. Я сделал что-то не так? Или есть какая-то особая причина для такого результата?

 >>> model2.predict(X_test)
array([1., 1., 1., 1., 1.])
>>> model2.base_estimator
SVC(C=1, cache_size=1000, class_weight='balanced', probability=True)
 
 >>> svm2.predict(X_test)
array([0., 1., 1., 0., 0.])
>>> svm2
SVC(C=1, cache_size=1000, class_weight='balanced', probability=True)
 

[Править]
Я обнаружил, что существует значительная разница в том, как я добавляю sample_weight в SVC scikit learn.

Когда я определяю свою модель как таковую

 svm2 = SVC(C=box_const, kernel='rbf', degree=3, gamma='scale', coef0=0.0,
          shrinking=True, tol=0.001, cache_size=1000, class_weight='balanced',
          verbose=False, max_iter=-1, decision_function_shape='ovr', probability=True)

 

Эти два метода дают одинаковые результаты прогнозирования

 svm2.fit(X, y, sample_weight=[1] * len(X))
svm2.fit(X, y)
 

пока

 svm2.fit(X, y, sample_weight=[1 / len(X)] * len(X))
 

дает разные результаты. Я считаю, что, поскольку AdaBoost инициализирует веса выборки 1 / len(X), возникает проблема такого рода. Я сделал что-то не так при вставке весов выборки в SVM?

Ответ №1:

На этот вопрос был дан ответ в статистике.СЕ несколько лет назад:
Масштабирование весов выборок в sklearn.svm.SVC
Смотрите также документацию:

sample_weight : массив, подобный форме (n_samples,), по умолчанию=Нет

Веса для каждой выборки. Масштабируйте C для каждого образца. Более высокие веса заставляют классификатор уделять больше внимания этим пунктам.

Подводя итог, веса выборок включаются в алгоритм SVM в sklearn путем изменения параметра регуляризации C . Вы можете компенсировать AdaBoost, увеличив параметр C в вашей базовой SVC версии .

Комментарии:

1. Спасибо. Это решение, похоже, решает основную проблему, с которой я сталкиваюсь.

Ответ №2:

Ты не сделал ничего плохого. Классификатор устанавливает новое случайное состояние каждый раз, когда вы его запускаете. Чтобы исправить это, просто установите random_state для параметра любое значение, которое вам нравится.

Напр.:

 AdaBoostClassifier(base_estimator=svm2,
                     n_estimators=1,
                     algorithm='SAMME.R',
                     random_state=21 
                   )
 

Для получения более подробной информации ознакомьтесь с официальной документацией

Комментарии:

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