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