添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

概览

Ensemble的方法主要有两大类: Bagging Boosting

  • Boosting主要关注 降低偏差 ,因此Boost能基于泛化性能相当弱的学习器构建出很强的集成;
  • Bagging主要关注 降低方差 ,因此它在不剪枝的决策树、神经网络等学习器上效用更为明显。
  • Boosting的个体学习器之间存在强依赖关系,必须 串行 生成;
  • Bagging的个体学习器之间不存在强依赖关系,可以同时生成即 并行化
  • Bagging

    基础Bagging

    先讲Bagging,Bagging是Bootstrap aggregation的缩写。所谓的 Bootstrap 有放回抽样 ,而这里的抽样指的是对数据样本的抽样。

    如果对于一个有$n$个样本的数据集$D$,有放回抽样$n’$个数据,那么当$n$足够大的时候,满足抽样出来的样本个数(无重复的个数)和原数据集的比例是:$(1 - 1/e) (≈63.2\%)$

    某个样本没有被抽中的概率是:$p_{not} = (1-\frac{1}{n})^n$
    $\frac{1}{p_{not}} = (\frac{n}{n-1})^{n} = (1+\frac{1}{n-1})^{n-1}(1+\frac{1}{n-1})$

    当n很大时,上式等于e(根据常用极限:$lim_{x\rightarrow∞}(1+\frac{1}{x})^x=e$)。

    因此,$p_{not} = (1-\frac{1}{n})^n = \frac{1}{e}$。
    回到Bagging, Bagging的基本做法

  • 1 从样本 有放回地 抽取n个样本;
  • 2 在所有的属性上,对这n个样本建立分类器;
  • 3 重复上述过程m次,得到m个分类器;
  • 4 将数据放在这m个分类器上分类,最终结果由所有分类器结果投票决定。
  • Bagging实践

    sklearn.ensemble.BaggingClassifier 提供了Bagging的模型。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    import numpy as np  
    from sklearn.tree import DecisionTreeClassifier
    from sklearn.model_selection import train_test_split
    from sklearn.ensemble import BaggingClassifier
    from sklearn import datasets

    #读取数据,划分训练集和测试集
    iris=datasets.load_iris()
    x=iris.data[: , :2]
    y=iris.target
    x_train, x_test, y_train, y_test = train_test_split(x, y, train_size=0.7, random_state=1)

    #模型训练
    # sklearn 自带的决策树分类器
    model1=DecisionTreeClassifier(max_depth=3)
    # sklearn自带的bagging分类器
    model2=BaggingClassifier(model1,n_estimators=100,max_samples=0.3)
    model1.fit(x_train,y_train)
    model2.fit(x_train,y_train)
    model1_pre=model1.predict(x_test)
    model2_pre=model2.predict(x_test)
    res1=model1_pre==y_test
    res2=model2_pre==y_test
    print '决策树测试集正确率%.2f%%'%np.mean(res1*100)
    print 'Bagging测试集正确率%.2f%%'%np.mean(res2*100)
    1
    2
    决策树测试集正确率75.56%
    Bagging测试集正确率77.78%

    随机森林

    随机森林(Random Forest, 简称RF)是Bagging的一个扩展变体。

    RF在Bagging的基础上,加入了 随机属性选择 ,即, 对特征进行无放回抽样 ,并且使用CART树。

    随机森林的基本做法

  • 1 首先在样本集中有放回的抽样n个样本;
  • 2 在所有的属性当中再随机选择K个属性;
  • 3 根据这n个样本的K个属性,建立CART树;
  • 4 重复以上过程m次,得到了m棵CART树;
  • 5 利用这m棵树对样本进行预测并投票。
  • 随机森林实践

    sklearn.ensemble.RandomForestClassifier 提供了随机森林的模型。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    import numpy as np  
    from sklearn.tree import DecisionTreeClassifier
    from sklearn.model_selection import train_test_split
    from sklearn.ensemble import RandomForestClassifier
    from sklearn import datasets

    #读取数据,划分训练集和测试集
    iris=datasets.load_iris()
    x=iris.data[:,:2]
    y=iris.target
    x_train, x_test, y_train, y_test = train_test_split(x, y, train_size=0.7, random_state=1)

    #模型训练
    model1=DecisionTreeClassifier(max_depth=3)
    model2=RandomForestClassifier(n_estimators=200, criterion='entropy', max_depth=3)
    model1.fit(x_train,y_train)
    model2.fit(x_train,y_train)
    model1_pre=model1.predict(x_train)
    model2_pre=model2.predict(x_train)
    res1=model1_pre==y_train
    res2=model2_pre==y_train
    print '决策树训练集正确率%.2f%%'%np.mean(res1*100)
    print '随机森林训练集正确率%.2f%%'%np.mean(res2*100)
    1
    2
    决策树训练集正确率83.81%
    随机森林训练集正确率85.71%

    Boosting

    Boosting(提升)通过 给样本设置不同的权值 ,每轮迭代调整权值。

    不同的提升算法之间的差别,一般是:

  • 如何更新 样本的权值
  • 如何组合每个分类器的预测,即,调整 分类器的权值 。 其中Adaboost中,样本权值是增加那些被错误分类的样本的权值,分类器$C_i$的重要性依赖于它的错误率。
  • AdaBoost

    直接看算法:

  • 1.初始化训练数据的权值分布:$D_1 = (w_{11}, …, w_{1i}, …, w_{1N},)$,$w_{1,i}=\frac{1}{N}$。(N是数据个数)
  • 对$m=1, …, M$(M是弱分类器的个数):
  •