集成学习是通过构建并结合多个学习器来完成学习任务。其工作流程为:

    1)先产生一组“个体学习器”。在分类问题中,个体学习器也称为基类分类器

    2)再使用某种策略将它们结合起来。

  通常使用一种或者多种已有的学习算法从训练数据中产生个体学习器。通常选取个体学习器的准则是:

    1)个体学习器要有一定的准确性,预测能力不能太差

    2)个体学习器之间要有多样性,即学习器之间要有差异

  根据个体学习器的生成方式,目前的集成学习方法大概可以分为以下两类:

    1)Boosting算法:在Boosting算法中,个体学习器之间存在强依赖关系、必须串行生成

    2)Bagging算法:在Bagging算法中,个体学习器之间不存在强依赖关系、可同时生成。

1、Boosting(提升)算法

  Boosting就是一族可以将弱学习器提升为强学习器的算法。其工作原理类似,工作步骤如下:

    1)先从初始训练集训练出一个基学习器

    2)再根据基学习器的表现对训练样本权重进行调整,使得被先前的基学习器误判的训练样本在后续受到更多关注

    3)然后基于调整后的样本权重来训练下一个基学习器

    4)如此重复,直到基学习器数量达到给定的值M为止

    5)最终将这M个基学习器进行加权组合得到集成学习器

2、AdaBoost(适应的提升)算法

  AdaBoost算法具有自适应性,即它能够适应弱分类器各自的训练误差率。这也是它名字的由来。从偏差-方差分解的角度来看,AdaBoost主要关注降低偏差,因此AdaBoost能基于弱学习器构建出很强的集成学习器

  输入:训练数据集T,弱学习算法

  输出:集成分类器H(x)

  算法步骤:

    1)初始化训练数据的权重向量W<1>

    2)对m=1,2,...,M

      *使用权重向量W<m>的训练数据集学习,得到基分类器(根据输入的弱学习算法)

      *计算基分类器在训练数据集上的分类误差率em

      *若em>=1/2,算法终止,构建失败!

      *计算基分类器的系数αm

      *更新训练数据集的权重向量W<m+1>

    3)构建基于分类器的线性组合

#AdaBoost多类分类

  标准的AdaBoost算法仅能解决二分类问题,稍加改进后,也可解决多分类问题

  实验代码:

 1 import matplotlib.pyplot as plt
 2 import numpy as np
 3 from sklearn import datasets,cross_validation,ensemble
 4 
 5 def load_data_regression():
 6     diabetes=datasets.load_diabetes()
 7     return cross_validation.train_test_split(diabetes.data,diabetes.target,test_size=0.25,random_state=0)
 8 
 9 def load_data_classification():
10     digits=datasets.load_digits()
11     return cross_validation.train_test_split(digits.data,digits.target,test_size=0.25,random_state=0)
12 
13 
14 def test_AdaBoostClassifier(*data):
15     x_train,x_test,y_train,y_test=data
16     cls=ensemble.AdaBoostClassifier(learning_rate=0.1)
17     cls.fit(x_train,y_train)
18     fig=plt.figure()
19     ax=fig.add_subplot(1,1,1)
20     estimators=len(cls.estimators_)
21     X=range(1,estimators+1)
22     ax.plot(list(X),list(cls.staged_score(x_train,y_train)),label="Traing score")
23     ax.plot(list(X),list(cls.staged_score(x_test,y_test)),label="Testing score")
24     ax.set_xlabel("estimator num")
25     ax.set_ylabel("score")
26     ax.legend(loc="best")
27     ax.set_title("AdaBoostClassifier")
28     plt.show()
29 
30 def test_AdaBoostRegressor(*data):
31     x_train,x_test,y_train,y_test=data
32     regr=ensemble.AdaBoostRegressor()
33     regr.fit(x_train,y_train)
34     fig=plt.figure()
35     ax=fig.add_subplot(1,1,1)
36     estimators_num=len(regr.estimators_)
37     X=range(1,estimators_num+1)
38     ax.plot(list(X),list(regr.staged_score(x_train,y_train)),label="Traing score")
39     ax.plot(list(X),list(regr.staged_score(x_test,y_test)),label="Testing score")
40 
41     ax.set_xlabel("estimators num")
42     ax.set_ylabel("score")
43     ax.legend(loc="best")
44     ax.set_title("AdaBoostRegressor")
45     plt.show()
46 
47 
48 x_train,x_test,y_train,y_test=load_data_classification()
49 test_AdaBoostClassifier(x_train,x_test,y_train,y_test)
50 x_train,x_test,y_train,y_test=load_data_regression()
51 test_AdaBoostRegressor(x_train,x_test,y_train,y_test)

View Code