#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 не имеет отношения к этому вопросу.