机器学习笔记(九)---- 集成学习(ensemble learning)

举报
云上有未来 发表于 2019/09/19 16:56:49 2019/09/19
【摘要】 集成学习不是一种具体的算法,而是在机器学习中为了提升预测精度而采取的一种或多种策略。其原理是通过构建多个弱监督模型并使用一定策略得到一个更好更全面的强监督模型。

集成学习不是一种具体的算法,而是在机器学习中为了提升预测精度而采取的一种或多种策略。其原理是通过构建多个弱监督模型并使用一定策略得到一个更好更全面的强监督模型。集成学习简单的示例图如下:


集成学习简单的示例图.png

                    

       通过训练得到若干个个体学习器,并通过一定策略得到一个集成学习器。

       集成方式因为学习算法的不同又分为“同质”和“异质”,如果个体学习器中只包含一种学习算法,例如都是决策树,或都是神经网络,这样的集成就是同质集成,如果个体学习器中包含了多种学习算法,则称为异质集成。

       集成学习的目的是得到一个比单一学习器预测性能更好的集成学习器,这就要求个体学习器“好而不同”,要求个体学习器有一定的准确性,同时又有一定的差异性。

       下图是西瓜书中的一个图示,浅显易懂地表示出了个体学习器对集成学习效果的影响,用四个字来归纳就是“好而不同”

       西瓜书中的一个图示.png

       现在的集成学习大致可以分为两大类:Boosting和Bagging。

       Boosting:个体学习器间存在强依赖关系,根据其表现,对训练样本进行调整,使得之前分类错误的样本后续更受关注,用改变后的样本学习下一个分类器。重复学习N个分类器。

       Bagging:个体学习器间不存在强依赖关系,可同时训练生成,要求个体学习器之间有较大的差异性。


-- Boosting

        Boosting的算法原理如下图:

        Boosting方法可以看做是一个不断迭代训练的方法,首先用初始权重训练一个弱分类器1,根据1的误差来更新训练样本的权重,正确的样本权重下降,错误样本的权重变高,使得前一个分类器中分类错误的样本在下一个弱分类器训练中得到更多的重视。这样经过T个迭代后,得到T个弱分类器,将这T个弱分类器通过一定策略进行组合,最后得到效果较好的强分类器。

        Adaboost是Boosting方法的典型代表,下面以Adaboost为例简单讲述下整个集成学习的过程。

        1、如下图1所示,有两类共10个数据样本,开始时,训练数据中每个样本被赋予一个相等的初始权重,都为0.1,构成权重向量D

Adaboost.png

        2、在训练集上训练出一个弱分类器并计算该分类器的错误率和分类器权重,我们采用直线对数据集进行分类(实际情况中可能是决策树等经典学习算法),从图上来看,有3个数据样本分类错误,可根据公式计算误差误差.png、分类器权重分类器权重1.png=分类器权重2.png,然后再根据公式分别更新正确分类样本权重和错误分类样本权重;

        正确分类样本权重更新:正确分类样本权重更新.png

        错误分类样本权重更新:错误分类样本权重更新.png

                     错误分类样本权重更新1.png

        3、第二次迭代再进行分类,如下图,同样有3个点分错了,分类器2的错误率和分类器权重根据公式可计算如下:

                       第二次迭代再进行分类.png

        4、第三次迭代进行分类,同样可以计算出分类器3的错误率和分类器权重:

                   第三次迭代进行分类.png

        5、将每个弱分类器按照分类结果与分类器权重相乘累加的形式组合起来,如果得到的分类结果误差为0或者分类器数目达到用户指定的值,则迭代结束。本例经过3次迭代,最后的集成分类器分类效果如下:

               最后的集成分类器分类效果.png

        sklearn中已经实现了Adaboost的方法,可直接调用,下面示例代码展示了采用单一分类器和Adaboost方法的准确率的差别,可以看到集成学习在分类准确率上有明显的提升。


-

Python 代码


01import pandas as pd
02from sklearn import datasets
03from sklearn.cross_validation import train_test_split
04from sklearn.metrics import accuracy_score
05from sklearn.ensemble import AdaBoostClassifier
06from sklearn import tree
07
08breast_data = datasets.load_breast_cancer()
09data = pd.DataFrame(datasets.load_breast_cancer().data)
10data.columns = breast_data['feature_names']
11
12data_np = breast_data['data']
13target_np = breast_data['target']
14x_train, x_test, y_train, y_test = train_test_split(data_np,target_np,test_size = 0.3,random_state = 0)
15
16# 采用一个弱分类器(决策树)进行分类
17model = tree.DecisionTreeClassifier()
18model.fit(x_train, y_train)
19y_pred = model.predict(x_test)
20print(accuracy_score(y_test, y_pred))
21
22# 基分类器采用决策树的Adaboost分类,迭代10次
23model = AdaBoostClassifier(n_estimators=10, algorithm='SAMME')
24model.fit(x_train, y_train)
25y_pred = model.predict(x_test)
26print(accuracy_score(y_test, y_pred))
27=============================================================
280.9064327485380117
290.9473684210526315


-- Bagging

        Bagging的算法原理如下图:

        Boosting的算法原理.png

        bagging相比boosting最大的不同在于多个弱学习器之间没有依赖关系,可以并行训练生成,通过T次对训练样本的随机采样(有放回的随机采样),可以得到T个训练集,进而可以训练出T个弱分类器。再将这T个分类器按照一定策略进行结合,最终得到分类准确率较高的集成分类器。

        随机森林是最有代表性的bagging方法,它是以决策树为基学习算法,通过多个采样训练集训练多个决策树,并通过投票(Voting)或是加权投票的策略确定分类结果的强分类器。

        如下示例代码展示了随机森林在sklearn中是如何应用的,同样相比单一的决策树模型,随机森林的分类准确率也有较大的提升:

-

Python 代码


01import pandas as pd
02from sklearn import datasets
03from sklearn.cross_validation import train_test_split
04from sklearn.metrics import accuracy_score
05from sklearn import tree
06from sklearn.ensemble import RandomForestClassifier
07
08breast_data = datasets.load_breast_cancer()
09data = pd.DataFrame(datasets.load_breast_cancer().data)
10data.columns = breast_data['feature_names']
11
12data_np = breast_data['data']
13target_np = breast_data['target']
14x_train, x_test, y_train, y_test = train_test_split(data_np,target_np, test_size = 0.3,random_state = 0)
15
16
17# 通过决策树模型进行预测
18model = tree.DecisionTreeClassifier()
19model.fit(x_train, y_train)
20y_pred = model.predict(x_test)
21print(accuracy_score(y_test, y_pred))
22
23# 通过随机森林进行分类预测
24model = RandomForestClassifier()
25model.fit(x_train, y_train)
26y_pred = model.predict(x_test)
27print(accuracy_score(y_test, y_pred))
28================================================
290.9181286549707602
300.9649122807017544


本文来自作者周捷

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。