我正在做一个文本分类任务。现在,我想将带有ensemble.AdaBoostClassifierLinearSVC用作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'发生。如AdaBoostClassifierSample 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)

程序无法获得结果,服务器上使用的内存保持不变。
第三个问题是,我如何使AdaBoostClassifierSVC一起作为基本估计量工作?

最佳答案

正确的答案取决于你到底在寻找什么。linearsvc无法预测类概率(ADaboostClassifier使用的默认算法所需),并且不支持样本权重。
您应该知道,支持向量机名义上并不预测类概率。它们是使用platt scaling(或在多类情况下platt scaling的扩展)计算的,这是一种已知问题的技术。如果您需要较少的“人工”类概率,那么SVM可能不是解决问题的方法。
有了这句话,我相信你问题中最令人满意的答案就是格雷厄姆给出的答案。也就是说,

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

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

你还有其他选择。您可以将sgdclassifier与铰链损失函数一起使用,并将adaboostclassifier设置为使用samme算法(不需要预测概率函数,但需要对样本权重的支持):
from sklearn.linear_model import SGDClassifier

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

如果您想使用为adaboostClassifier提供的默认算法,最好的答案可能是使用一个对类概率具有本机支持的分类器,比如逻辑回归。您可以使用scikit.linear_model.logisticregression或使用带有日志丢失函数的sgdclassifier(如kris提供的代码中所用)来完成此操作。
希望这有帮助,如果您对什么是platt scaling很好奇,check out the original paper by John Platt here

关于python - sklearn.ensemble.AdaBoostClassifier不能将SVM作为base_estimator加入?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27107205/

10-12 19:29