AdaBoostClassifier 和“SAMME.R”算法

Jac*_*ing 2 adaboost scikit-learn ensemble-learning

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

\n\n

所以我的第一个问题是 - 哪些分类器为样本加权提供支持?我做了一些研究,幸运的是,比我聪明的人找到了答案。稍微更新一下,它的工作原理如下:通过运行

\n\n
from sklearn.utils.testing import all_estimators \n\nprint(all_estimators(type_filter=\'classifier\'))\n
Run Code Online (Sandbox Code Playgroud)\n\n

您将获得所有分类器的列表(结果有 31 个!)。然后,如果你跑

\n\n
import inspect\n\nfor name, clf in all_estimators(type_filter=\'classifier\'):\n    if \'sample_weight\' in inspect.getfullargspec(clf().fit)[0]:\n        print(name)\n
Run Code Online (Sandbox Code Playgroud)\n\n

您可以获得为样本加权提供支持的所有分类器的列表(其中 21 个,出于好奇)。

\n\n

到目前为止,一切都很好。但现在我们必须处理另一个 AdaBoostClassifer参数,即algorithm。您有两个选择:{\xe2\x80\x98SAMME\xe2\x80\x99, \xe2\x80\x98SAMME.R\xe2\x80\x99}, optional (default=\xe2\x80\x99SAMME.R\xe2\x80\x99)。我们被告知“使用 SAMME.R 真实提升算法 base_estimator必须支持类概率的计算”。这就是我陷入困境的地方。在线搜索,我只能找到两个与 \xe2\x80\x98SAMME.R\xe2\x80\x99 一起使用的分类器作为algorithm: DecisionTreeClassifier(这是默认值)和 的参数RandomForestClassifier

\n\n

那么问题来了 - 21 个兼容的其他分类器中还有哪些AdaBoostClassifer为类别概率的计算提供支持?

\n\n

谢谢。

\n

Grr*_*Grr 5

我非常确定,当文档提到“必须支持类概率的计算”时,他们意味着有一种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
Run Code Online (Sandbox Code Playgroud)

因此,您最终会得到 31 个分类器中的 24 个作为base_estimatorin的潜在选项AdaBoostClassifier

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

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

正如您所看到的,该错误特别指出您使用该predict_proba方法的类。

  • 很好的答案 - 很好地捕获了错误!只有一条评论 - 你说:“你最终得到 31 个分类器中的 24 个作为 `AdaBoostClassifier` 中 `base_estimator` 的潜在选项” - 这 24 个分类器支持 **类概率**;但ABC还需要**样本加权**的支持。因此,在 31 个分类器中 - 支持 **两个 ** 要求的数量是(击鼓!) - 17! (2认同)