机器学习系列(三十七)——集成学习与随机森林

集成学习的原理

如果你随机向多个人询问一个复杂的决策问题 ,然后综合他们的决策,通过投票的办法选出最终决策,在许多情况下 ,你会发现 ,这个汇总的决策相当的好,这被称为群体智慧。同样,如果你聚合一组预测器(分类器或回归器)的预测,得到的预测结果也往往比最好的单个预测器要好。这样的一组预测器,我们称为集成,所以这种技术,也被称为集成学习
在生活中随处可见集成学习的例子,比如你知道一部新电影,但不知道到底值不值得看,于是你去问身边的几个朋友,如果他们大多数都觉得好看,你最终也决定去看,这就是一种“集成学习”。在机器学习竞赛中获胜的解决方案通常都涉及多种集成方法。
现在假设有一个分类任务,我们已经训练好了一些分类器,包括一个Logistic分类器、一个 SVM 分类器、一个RF分类器 、 一个 K- 近邻分类器等等。每个分类器的准确率约为70% 。

集成学习

这时,要创建出一个更好的分类器,最简单的办单就是聚合每个分类器的预测,然后将得票最多的结果作为预测类别。这种大多数投票分类器被称为硬投票分类器

硬投票

我们会发现,这个投票分类器的准确率通常比集成中最好的分类器还要高。
相应地,我们有软投票分类器,它是一种概率平均的决策分类器。(本篇后面会介绍)
事实上,即使每个分类器都是弱学习器(意味着它仅比随机猜测好一 点),通过集成依然可以实现一个强学习器(高准确率),只要有足够大数量数据且足够多种类的弱学习器就可以。
为什么会这样呢?来类比一个情况:假设你有一个略微偏倚的硬币,它有 51%的可能正面数字朝上,49%的可能背面花朝上。如果你掷这样的一枚硬币1000 次,你大致会得到差不多510次数字和490次花,所以正面是大多数。而如果你做数学计算,你会发现,“在1000次投掷后,大多数为正面朝上”这件事的概率为:
\sum_{i=501}^{1000}C_{1000}^{i}0.51^{i}0.49^{1000-i}

这个结果接近 75%,比单独投掷一次要大很多。事情的关键就在这个概率上。如果假设有一个决策,每个决策器有60%的概率给出正确决策,那么500个这样的决策器综合的结果就将有99.999%的概率给出正确决策!
\sum_{i=251}^{500}C_{500}^{i}0.51^{i}0.49^{500-i}

这就是集成学习的威力,理论上只要集成分类器中每个分类器的分类准确率比随机猜测准确率高,则只要这个集成学习器中有足够多的这样的分类器,就一定会获得接近100%准确率的性能。下面以一个具体的例子来感受一下集成学习的威力,首先用make_moons生成二类别模拟数据:

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
x,y = datasets.make_moons(n_samples=500,noise=0.3,random_state=42)
plt.scatter(x[y==0,0],x[y==0,1])
plt.scatter(x[y==1,0],x[y==1,1])
plt.show()
数据集图示

接下来训练三个分类器,Logistic,SVM,DecisionTree,并分别查看准确率:

from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(x,y,random_state=42)
from sklearn.linear_model import LogisticRegression
log_clf=LogisticRegression()
log_clf.fit(x_train,y_train)
log_clf.score(x_test,y_test)
log
from sklearn.svm import SVC
svm_clf = SVC()
svm_clf.fit(x_train,y_train)
svm_clf.score(x_test,y_test)
svm
from sklearn.tree import DecisionTreeClassifier
dt_clf = DecisionTreeClassifier()
dt_clf.fit(x_train,y_train)
dt_clf.score(x_test,y_test)
dt

接下来使用少数服从多数的投票方式重新对测试集进行分类预测,并查看准确率:

y_predict1 = log_clf.predict(x_test)
y_predict2 = svm_clf.predict(x_test)
y_predict3 = dt_clf.predict(x_test)
y_predict = np.array((y_predict1 + y_predict2 + y_predict3) >= 2,dtype='int')
'''综合3个算法给出预测'''
from sklearn.metrics import accuracy_score
accuracy_score(y_test,y_predict)
投票决策

由结果看出,之前的三个分类器最高的准确率都不到90%,而综合三者的决策,准确率达到了90.4%。可见相比于单独的分类,集成学习确实提高了预测准确率。

sklearn中的集成学习

上述过程在sklearn中可以用VotingClassifier封装(hard voting):

'''硬投票'''
from sklearn.ensemble import VotingClassifier
voting_clf = VotingClassifier(estimators=[
    ('log_clf',LogisticRegression()),
    ('svm_clf',SVC()),
    ('dt_clf',DecisionTreeClassifier(random_state=666))
],voting = 'hard')
voting_clf.fit(x_train,y_train)
voting_clf.score(x_test,y_test)

准确率:

VotingClassifier

这里只是演示操作,实际使用voting classifier时会先把使用的单个算法的超参调至最优,再使用voting classifier。
soft voting
对应于hard voting,soft voting是一种基于概率平均的投票,所以soft voting要求集成中每个模型都能计算分类概率。 逻辑回归本身就是基于概率的,knn可进行概率转化,决策树也可以,SVM转概率比较麻烦,不过也可以,具体转化方式这里不做具体介绍。为什么要有soft voting呢?
这是因为,在很多情况下一人一票的少数服从多数的决策结果是非常不好的,比如下面这种情况,对某个样本5个模型预测的分类结果:

  • 模型1:A-0.99,B-0.1
    模型2:A-0.49,B-0.51
    模型3:A-0.45,B-0.55
    模型4:A-0.90,B-0.10
    模型5:A-0.40,B-0.60

如果按投票的规则,A-2,B-3,最终结果应为B,但是观察数据发现,模型1和4非常确信样本应当属于A类,而其它模型并没有这么确定,如模型2对A和B几乎是一半一半,所以分类为A好像更加合理。
soft voting就是基于概率的加权进行分类,按soft voting思想,属于各个类别的集成预测分类概率为各个模型预测概率的平均值,计算可得最终投票的结果为A类。
下面在sklearn中使用soft voting,其实就是把voting参数设置为soft,不过要注意的是SVC要使用soft voting必须将probability设置为true:

voting_clf2 = VotingClassifier(estimators=[
    ('log_clf',LogisticRegression()),
    ('svm_clf',SVC(probability=True)),
    ('dt_clf',DecisionTreeClassifier(random_state=666))
],voting = 'soft')
voting_clf2.fit(x_train,y_train)
voting_clf2.score(x_test,y_test)

准确率:

soft_voting

可见soft voting比hard voting有更好的效果。

子模型进行集成学习

前面我们知道,一个集成分类器中,若其中每个分类器的分类正确的概率都大于随机猜测的概率,则理论上只要这个集成学习器中有足够多的分类器,一定会获得非常非常强的性能(准确率逼近1)。
但一个问题是,虽然有很多机器学习算法,可算法种类毕竟是有限的,从投票来看,这么少的算法还是不够,如何集成更多算法进行集成学习呢? 那就是创建更多子模型,集成更多子模型的意见,来获得更强的决策效果。而且子模型之间不能一致,要有差异性。即子模型最好是完全独立的,彼此的错误毫不相关,这样集成方法的效果最优。这种差异性是通过每个子模型只看样本数据的一部分实现的。
对于取数据,取样方式分为放回取样Bagging和不放回取样Pasting,更常用的是Bagging方式,统计学中叫bootstrap。

随机森林Random Forest

随机森林(下称RF)就是集成学习的一种,它的子模型是一棵一棵的决策树,决策树作为一种非参数学习算法,使用它创建子模型更能产生差异性。下面使用放回抽样方式构建一个含有500个决策树的RF分类器对本篇之前的数据做分类:

from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import BaggingClassifier
bagging_clf = BaggingClassifier(DecisionTreeClassifier(),
                                n_estimators = 500#集成500个
                                ,max_samples=100
                                ,bootstrap=True)
bagging_clf.fit(x,y)
bagging_clf.score_
RF_500

相应地我们可以增加子模型的个数为1000再看分类结果:

'''增加子模型数量'''
bagging_clf2 = BaggingClassifier(DecisionTreeClassifier(),
                                n_estimators = 1000
                                ,max_samples=100
                                ,bootstrap=True)
bagging_clf2.fit(x_train,y_train)
bagging_clf2.score(x_test,y_test)
RF_1000

可见创建更多子模型的RF效果确实是更好的,但是由于数据本身存在噪音或错误样本,我们的算法不会像理论推导那样可以有接近100%的准确率。不过使用集成学习还是会有很好的结果。另外可以调节其中max_samples参数、DecisionTreeClassifier构造参数等来进一步获得更好的结果。

更多关于集成学习将在下篇继续介绍。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,219评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,363评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,933评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,020评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,400评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,640评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,896评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,597评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,327评论 1 244
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,581评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,072评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,399评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,054评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,849评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,672评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,585评论 2 270

推荐阅读更多精彩内容