sklearn.ансамбль.AdaBoostClassifier не может получить SVM в качестве базовой оценки?

я выполняю задачу классификации текста. Теперь я хочу использовать ensemble.AdaBoostClassifier С LinearSVC as base_estimator. Однако, когда я пытаюсь запустить код

clf = AdaBoostClassifier(svm.LinearSVC(),n_estimators=50, learning_rate=1.0,    algorithm='SAMME.R')
clf.fit(X, y)

ошибка. TypeError: AdaBoostClassifier with algorithm='SAMME.R' requires that the weak learner supports the calculation of class probabilities with a predict_proba method

первый вопрос не svm.LinearSVC() вычислить вероятности классов ? Как заставить его рассчитать вероятности?

затем я изменяю параметр algorithm и снова запустите код.

clf = AdaBoostClassifier(svm.LinearSVC(),n_estimators=50, learning_rate=1.0, algorithm='SAMME')
clf.fit(X, y)

в этот раз TypeError: fit() got an unexpected keyword argument 'sample_weight' происходит. Как говорится в AdaBoostClassifier, Sample weights. If None, the sample weights are initialized to 1 / n_samples. даже если я назначаю целое число n_samples, ошибка произошла.

второй вопрос: что значит n_samples в смысле? Как решить эту проблему?

надеюсь, кто-нибудь может мне помочь.

согласно комментарию @jme, однако, после попытки

clf = AdaBoostClassifier(svm.SVC(kernel='linear',probability=True),n_estimators=10,  learning_rate=1.0, algorithm='SAMME.R')
clf.fit(X, y)

программа не может получить результат, и память, используемая на сервере, остается неизменной.

в третий вопрос как я могу сделать AdaBoostClassifier работы с SVC как base_estimator?

4 ответов


правильный ответ будет зависеть именно от того, что вы ищете. LinearSVC не может предсказывать вероятности классов (требуется алгоритмом по умолчанию, используемым AdaBoostClassifier) и не поддерживает sample_weight.

вы должны знать, что машина вектора поддержки номинально не предсказывает вероятности классов. Они вычисляются с использованием масштабирования Platt (или расширения масштабирования Platt в случае нескольких классов), техника, которая имеет известные проблемы. Если вам нужно меньше " искусственного" вероятности классов, SVM может быть не так.

С учетом сказанного, я считаю, что наиболее удовлетворительным ответом на ваш вопрос будет тот, который дал Грэм. То есть,

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

clf = AdaBoostClassifier(SVC(probability=True, kernel='linear'), ...)

у вас есть другие варианты. Вы можете использовать SGDClassifier с функцией потери шарнира и установить AdaBoostClassifier для использования алгоритма SAMME (который не требует функции predict_proba, но требует поддержки sample_weight):

from sklearn.linear_model import SGDClassifier

clf = AdaBoostClassifier(SGDClassifier(loss='hinge'), algorithm='SAMME', ...)

возможно, лучшим ответом будет чтобы использовать классификатор, который имеет встроенную поддержку вероятностей классов, например логистическую регрессию, если вы хотите использовать алгоритм по умолчанию для AdaBoostClassifier. Вы можете сделать это с помощью scikit.линейная модель.LogisticRegression или использование SGDClassifier с функцией потери журнала, как используется в коде, предоставленном Kris.

надеюсь, что это поможет, если вам интересно, что такое масштабирование Platt,проверьте оригинальный документ Джона Платта здесь.


вам нужно использовать ученика, который имеет метод predict_proba, так как это недоступно в LinearSVC, попробуйте SVC с ядром, установленным в "linear"

clf = AdaBoostClassifier(svm.SVC(probability=True,kernel='linear'),n_estimators=50,       learning_rate=1.0, algorithm='SAMME')
clf.fit(X, y)

хотя я не уверен, что это даст идентичные результаты LinearSVC, из документации он говорит:

похож на SVC с параметром kernel= ' linear’, но реализован с точки зрения liblinear, а не libsvm, поэтому он имеет большую гибкость в выборе штрафов и функций потерь и должен масштабироваться лучше (для большого количества проб).

также упоминает что-то об одном против всех и одном против одного с точки зрения того, как они отличаются.


на самом деле LinearSVC можно применить к AdaBoostClassifier без масштабирования вывода SVC через масштабирование Platt, и это AdaBoost.Первоначально алгоритм M1 был разработан для, классификатор принимает {-1, 1} в качестве вывода. Выбор алгоритма по умолчанию в AdaBoostClassifier-AdaBoost.Алгоритм SAMME [2] (указание "SAMME.R " в аргументе ключевого слова алгоритма), который предназначен для классификации нескольких классов.

однако ваш LinearSVC AdaBoost не сможет предоставить predict_proba. На с другой стороны, если вы хотите сохранить знак на выходе вместо установки SVM-выхода в сигмовидную кривую для обеспечения вероятности. Затем вы меняете алгоритм из SAMME.R для SAMME-это простой способ сделать.

[1] Y. Freund, R. Шапир," теоретико-решение обобщение он-лайн обучения и применение к повышению", 1995.
[2] Чжу, Х. Цзоу, С. Россет, т. Гесте, "мульти-класс тем", 2009


у меня просто была аналогичная проблема, пытаясь использовать AdaBoostClassifier С LogisticRegression. В документах упоминается, что слабый классификатор (или base_estimator) должно быть fit метод, который принимает необязательный элемент sample_weight=... аргумент ключевого слова, cf. вопрос #18306416.

если вы хотите использовать SVM или логистическую регрессию с AdaBoost, вы используете стохастический классификатор градиентного спуска sklearn с loss='hinge' (svm) или loss='log' (логистика), например,

from sklearn.linear_model import SGDClassifier
from sklearn.ensemble import AdaBoostClassifier

clf = AdaBoostClassifier(SGDClassifier(loss='log'), ...)

YMMV