AdaBoostClassifier和“ SAMME.R”算法

时间:2019-02-27 17:05:41

标签: scikit-learn ensemble-learning adaboost

要花一些时间才能解决实际问题,所以请耐心等待。 The AdaBoost documentation指出“它是一个元估计器,首先将分类器拟合到原始数据集上,然后将分类器的其他副本拟合到同一数据集上,但调整了错误分类的实例的权重”。为此,必需的参数之一是base_estimator。为了使base_estimatorAdaBoostClassifer一起使用,“需要支持样本加权”。

所以我的第一个问题是-哪些分类器支持样本加权?我做了一些研究,幸运的是,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兼容的其他分类器为类概率的计算提供了支持吗?

谢谢。

1 个答案:

答案 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_estimatorAdaBoostClassifier的潜在选项。

使用不正确的分类器作为base_estimator返回的错误在这方面也很有帮助。

  

TypeError:算法='SAMME.R'的AdaBoostClassifier要求学习者弱   通过predict_proba方法支持类概率的计算。   请更改基本估算器或改为设置algorithm ='SAMME'。

如您所见,该错误专门指出您使用predict_proba方法指向类。