美文网首页
集成学习(8) - Bagging的原理与实现

集成学习(8) - Bagging的原理与实现

作者: 木头里有虫911 | 来源:发表于2021-04-17 20:26 被阅读0次

    0. 题首

    由于sklearn是python机器学习中最重要的库,几乎封装了所有常见的机器学习算法,因而这个库内容非常多。在学习有时候会有一种“不知庐山真面目,只缘身在此山中”的感觉。这个时候我们需要跳出现在学习的框架,站在更高的高度来俯视就可以获得全貌了。
    比如这次的bagging算法,和上一次的投票法Votting一样,都是集成在sklearn的ensemble模块中,这个时候我们打开sklearn的官方文档,可以一窥ensemble模块的全貌。如下:


    1.JPG

    可以看到sklearn.ensemble模块下封装了好多集成算法。除了我们之前学习的Voting和本期的Bagging意以外,常用的还有Adaboost、 GBDT、RandomForest等。通过这种一览全貌的做法,我们也可以熟悉那个方法封装在那个模块下面。因为sklearn的设计全面而博大精深,在使用的时候经常会遇到忘记某个模块的具体位置。

    1. Bagging原理概述

    Bagging是Bootstrap Aggregation的缩写,常翻译为装袋法。因而要了解bagging,先从Bootstrap说起。Bootstrap,即pull up by your own bootstraps,意思就是白手起家,自立更生的意思,因而bootstrap可以引申为自助采样法,它是一种有放回的抽样方法,目的为了得到统计量的分布以及置信区间,其算法过程如下:

    A)从原始样本集中抽取训练集。每轮从原始样本集中使用Bootstraping的方法抽取n个训练样本(在训练集中,有些样本可能被多次抽取到,而有些样本可能一次都没有被抽中)。共进行k轮抽取,得到k个训练集。(k个训练集之间是相互独立的)

    B)每次使用一个训练集得到一个模型,k个训练集共得到k个模型。(注:这里并没有具体的分类算法或回归方法,我们可以根据具体问题采用不同的分类或回归方法,如决策树、感知器等)

    C)对分类问题:将上步得到的k个模型采用投票的方式得到分类结果;对回归问题,计算上述模型的均值作为最后的结果。(所有模型的重要性相同)

    使用流程图更加直观:


    image.png

    bagging的集合策略也比较简单,对于分类问题,通常使用简单投票法,得到最多票数的类别或者类别之一为最终的模型输出。对于回归问题,通常使用简单平均法,对T个弱学习器得到的回归结果进行算术平均得到最终的模型输出。

    由于Bagging算法每次都进行采样来训练模型,因此泛化能力很强,对于降低模型的方差很有作用。当然对于训练集的拟合程度就会差一些,也就是模型的偏倚会大一些。

    2. 实例分析

    Sklearn为我们提供了
    [BaggingRegressor]与 [BaggingClassifier]
    两种Bagging方法的API,我们在这里通过一个完整的例子演示Bagging在分类问题上的具体应用。这里两种方法的默认基模型是树模型。

    # evaluate bagging algorithm for classification
    from numpy import mean
    from numpy import std
    from sklearn.datasets import make_classification
    from sklearn.model_selection import cross_val_score
    from sklearn.model_selection import RepeatedStratifiedKFold
    from sklearn.ensemble import BaggingClassifier
    

    我们创建一个含有1000个样本20维特征的随机分类数据集:

    # test classification dataset
    from sklearn.datasets import make_classification
    # define dataset
    X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=5)
    # summarize the dataset
    print(X.shape, y.shape)
    >>>
    (1000, 20) (1000,)
    

    我们将使用重复的分层k-fold交叉验证来评估该模型,一共重复3次,
    每次有10个fold。我们将评估该模型在所有重复交叉验证中性能的平均值和标准差。

    # evaluate bagging algorithm for classification
    from numpy import mean
    from numpy import std
    from sklearn.datasets import make_classification
    from sklearn.model_selection import cross_val_score
    from sklearn.model_selection import RepeatedStratifiedKFold
    from sklearn.ensemble import BaggingClassifier
    # define dataset
    X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=5)
    # define the model
    model = BaggingClassifier()
    # evaluate the model
    cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
    n_scores = cross_val_score(model, X, y, scoring='accuracy', cv=cv, n_jobs=-1, error_score='raise')
    # report performance
    print('Accuracy: %.3f (%.3f)' % (mean(n_scores), std(n_scores)))
    >>>
    Accuracy: 0.867 (0.034)
    

    最终模型的效果是Accuracy: 0.867 标准差0.034

    相关文章

      网友评论

          本文标题:集成学习(8) - Bagging的原理与实现

          本文链接:https://www.haomeiwen.com/subject/jlfplltx.html