我正在做一个文本分类任务。现在,我想将带有ensemble.AdaBoostClassifier
的LinearSVC
用作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
一起作为基本估计量工作? 最佳答案
正确的答案取决于你到底在寻找什么。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/