要花一些时间才能解决实际问题,所以请耐心等待。 The AdaBoost documentation指出“它是一个元估计器,首先将分类器拟合到原始数据集上,然后将分类器的其他副本拟合到同一数据集上,但调整了错误分类的实例的权重”。为此,必需的参数之一是base_estimator
。为了使base_estimator
与AdaBoostClassifer
一起使用,“需要支持样本加权”。
所以我的第一个问题是-哪些分类器支持样本加权?我做了一些研究,幸运的是,someone smarter than me had the answer。经过某种程度的更新,它可以这样运行:通过运行
from sklearn.utils.testing import all_estimators
print(all_estimators(type_filter='classifier'))
您将获得所有分类器的列表(结果是其中有31个!)。然后,如果您运行
import inspect
for name, clf in all_estimators(type_filter='classifier'):
if 'sample_weight' in inspect.getfullargspec(clf().fit)[0]:
print(name)
您可以获得所有支持样本加权的分类器的列表(出于好奇,其中有21个分类器)。
到目前为止,一切都很好。但是现在我们必须处理另一个AdaBoostClassifer
参数,即algorithm
。您有两个选择:{‘SAMME’, ‘SAMME.R’}, optional (default=’SAMME.R’)
。有人告诉我们“使用SAMME.R真正的提升算法base_estimator
必须支持类概率的计算”。这就是我卡住的地方。在线搜索时,我只能找到两个与“ SAMME.R”一起用作algorithm
的参数的分类器:DecisionTreeClassifier
(默认设置)和RandomForestClassifier
。
所以这是一个问题-21个与AdaBoostClassifer
兼容的其他分类器为类概率的计算提供了支持吗?
谢谢。
答案 0 :(得分:4)
我非常确定,当文档中提到“必须支持对类概率的计算”时,它们表示存在一种predict_proba
方法。
这是许多分类器用来返回给定观察结果的每个类的概率的方法。了解了这一点之后,您只需要检查具有predict_proba
方法的分类器即可:
for name, clf in all_estimators(type_filter='classifier'):
if hasattr(clf, 'predict_proba'):
print(clf, name)
<class 'sklearn.ensemble.weight_boosting.AdaBoostClassifier'> AdaBoostClassifier
<class 'sklearn.ensemble.bagging.BaggingClassifier'> BaggingClassifier
<class 'sklearn.naive_bayes.BernoulliNB'> BernoulliNB
<class 'sklearn.calibration.CalibratedClassifierCV'> CalibratedClassifierCV
<class 'sklearn.naive_bayes.ComplementNB'> ComplementNB
<class 'sklearn.tree.tree.DecisionTreeClassifier'> DecisionTreeClassifier
<class 'sklearn.tree.tree.ExtraTreeClassifier'> ExtraTreeClassifier
<class 'sklearn.ensemble.forest.ExtraTreesClassifier'> ExtraTreesClassifier
<class 'sklearn.naive_bayes.GaussianNB'> GaussianNB
<class 'sklearn.gaussian_process.gpc.GaussianProcessClassifier'> GaussianProcess
Classifier
<class 'sklearn.ensemble.gradient_boosting.GradientBoostingClassifier'> GradientBoosti
ngClassifier
<class 'sklearn.neighbors.classification.KNeighborsClassifier'> KNeighborsClassifier
<class 'sklearn.semi_supervised.label_propagation.LabelPropagation'> LabelPropagation
<class 'sklearn.semi_supervised.label_propagation.LabelSpreading'> LabelSpreading
<class 'sklearn.discriminant_analysis.LinearDiscriminantAnalysis'> LinearDiscriminantA
nalysis
<class 'sklearn.linear_model.logistic.LogisticRegression'> LogisticRegression
<class 'sklearn.linear_model.logistic.LogisticRegressionCV'> LogisticRegressionCV
<class 'sklearn.neural_network.multilayer_perceptron.MLPClassifier'> MLPClassifier
<class 'sklearn.naive_bayes.MultinomialNB'> MultinomialNB
<class 'sklearn.svm.classes.NuSVC'> NuSVC
<class 'sklearn.discriminant_analysis.QuadraticDiscriminantAnalysis'> QuadraticDiscrim
inantAnalysis
<class 'sklearn.ensemble.forest.RandomForestClassifier'> RandomForestClassifier
<class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> SGDClassifier
<class 'sklearn.svm.classes.SVC'> SVC
因此,您最终将31个分类器中的24个作为base_estimator
中AdaBoostClassifier
的潜在选项。
使用不正确的分类器作为base_estimator
返回的错误在这方面也很有帮助。
TypeError:算法='SAMME.R'的AdaBoostClassifier要求学习者弱 通过predict_proba方法支持类概率的计算。 请更改基本估算器或改为设置algorithm ='SAMME'。
如您所见,该错误专门指出您使用predict_proba
方法指向类。