【问题标题】:LDA as base learner for AdaBoost in PythonLDA 作为 Python 中 AdaBoost 的基础学习器
【发布时间】:2018-08-24 17:05:48
【问题描述】:

我正在使用 AdaBoost 进行多类分类,将基学习器作为判别式(线性或二次)。我在 scikit-learn 或任何其他库中找不到任何功能来实现这个,我该怎么做?

【问题讨论】:

    标签: python scikit-learn classification adaboost


    【解决方案1】:

    虽然 scikit-learn 的 AdaBoostClassifier 允许您选择基本估计器(请参阅 documentation),但它需要估计器支持 sample_weight。看看source

    if not has_fit_parameter(self.base_estimator_, "sample_weight"):
        raise ValueError("%s doesn't support sample_weight."
                         % self.base_estimator_.__class__.__name__)
    

    很遗憾,LinearDiscriminantAnalysisQuadraticDiscriminantAnalysis 都不属于这一类。这是一个玩具示例:

    from sklearn.ensemble import AdaBoostClassifier
    from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
    from sklearn.discriminant_analysis import QuadraticDiscriminantAnalysis as QDA
    from sklearn.datasets import load_iris
    from sklearn.model_selection import train_test_split
    
    iris = load_iris()
    X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target)
    
    clf = AdaBoostClassifier(base_estimator=LDA())
    clf.fit(X_train, y_train)
    

    您将看到如下所示的回溯:

    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "//anaconda/lib/python2.7/site-packages/sklearn/ensemble/weight_boosting.py", line 411, in fit
        return super(AdaBoostClassifier, self).fit(X, y, sample_weight)
      File "//anaconda/lib/python2.7/site-packages/sklearn/ensemble/weight_boosting.py", line 128, in fit
        self._validate_estimator()
      File "//anaconda/lib/python2.7/site-packages/sklearn/ensemble/weight_boosting.py", line 429, in _validate_estimator
        % self.base_estimator_.__class__.__name__)
    ValueError: LinearDiscriminantAnalysis doesn't support sample_weight.
    

    这是您在 scikit-learn 中无法解决的要求。文档清楚地表明这是一个硬性要求:

    "...需要支持样本加权,以及正确的classes_n_classes_ 属性。"

    但是,如果您只是想使用一个 ensemble,那么您总是可以使用 bagging 而不是 boosting:

    from sklearn.ensemble import BaggingClassifier
    clf = BaggingClassifier(base_estimator=LDA())
    clf.fit(X_train, y_train)
    

    【讨论】:

    • 我正在做一个项目,我想比较 AdaBoost 在具有不同类型弱学习器的数据集上的性能。我在某处读过 LDA、QDA、感知器等确实属于弱学习者,因此这个问题。那我想我得用别的了,谢谢!
    猜你喜欢
    • 2023-04-10
    • 2012-07-06
    • 2017-01-01
    • 2018-02-06
    • 2010-12-08
    • 2013-08-20
    • 1970-01-01
    • 2015-09-16
    • 1970-01-01
    相关资源
    最近更新 更多