【问题标题】:AdaBoostClassifier and the 'SAMME.R’ AlgorithmAdaBoostClassifier 和“SAMME.R”算法
【发布时间】:2019-07-21 11:49:59
【问题描述】:

解决实际问题需要一段时间,所以请多多包涵。 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 兼容的分类器支持计算类概率?

谢谢。

【问题讨论】:

    标签: scikit-learn ensemble-learning adaboost


    【解决方案1】:

    我很确定当文档提到“必须支持类概率的计算”时,他们的意思是有一个 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: AdaBoostClassifier with algorithm='SAMME.R' 要求弱学习器 支持使用 predict_proba 方法计算类概率。 请更改基本估算器或设置 algorithm='SAMME'。

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

    【讨论】:

    • 很好的答案 - 很好地解决了错误!只有一条评论 - 你说:“你最终将 31 个分类器中的 24 个作为 base_estimatorAdaBoostClassifier 的潜在选项” - 这 24 个分类器支持 类概率;但 ABC 还需要支持样本加权。因此,在 31 个分类器中 - 支持 both 要求的数量是(鼓声!) - 17!
    • 是否有任何文档说明如何为原生不被接受的分类器实现这些方法,以使其正常工作?
    猜你喜欢
    • 2015-11-06
    • 2013-06-09
    • 2018-05-24
    • 2015-05-11
    • 2019-09-02
    • 2013-08-20
    • 2015-12-16
    • 1970-01-01
    • 2016-01-05
    相关资源
    最近更新 更多