了不起集成算法之随机森林与Adaboost
集成算法是非常万能和有效的,在很多机器学习和数据挖掘的竞赛上,或者是工业生产上都应用非常广泛,很多竞赛的高分都是用集成算法刷出来的,当然也是面试和笔试必考的算法。
一、集成算法
1.什么是集成算法
通俗讲,就是多个算法进行融合,并不是机器学习算法中的一种,只是将单独的机器学习算法放在一起做一个集成。
目的:提高机器学习效果,一个效果不好,那就三个臭皮匠顶一个诸葛亮!
比如决策树:可能一棵决策树效果并不是太好,所以构造10棵树,或100棵树让它变成一个森林就很厉害了。
2.如何去做这样的一个集成呢?
两个重点的集成方法:
先说第一个集成方法Bagging
以下为:Bagging集成思想和它的代表随机森林
Bagging的集成思想
训练多个分类器,预测概率取平均
解释:假如说,现在要训练一个分类器,或者说回归模型,但是无论怎么调参数都没办法达到一个很好的效果,就像决策树,效果不是很好,那就训练100棵决策树,每一棵决策树都是独立并行的进行训练,然后把每一棵树预测的结果加起来取一个平均,这就是Bagging 的思想。
先从Bagging的模型入手
Bagging模型
并行训练一堆分类器
最典型代表——随机森林 ( 将决策树进行Bagging的集成,这种集成之后的模型就叫作随机森林 )
Bagging 的关键词:并行的训练(意思是每一棵树都不需要利用其它树的结果,都是自己去训练自己的,彼此之间没有任何联系,所以Bagging就相当于是一堆学习器并行的进行训练,并且自己训练自己的,不会影响其它的学习器)
比如下面这个图:随机森林的示意图
随机是什么意思呢 ?
首先,我们都知道,随机森林里有很多树,那么问题来了,每一棵树都是一样的吗?当然是希望每一棵树都是有差异的,要是一模一样的话和一棵决策树有什么不同,那问题又来了。
怎么去实现每一棵树的差异化呢?
这儿就体现了随机的思想。随机就是:第一,里面的每一棵树它们使用的训练数据是随机选择的,比如说训练集里有10万个样本,训练的时候,每一棵树可能随机的去选择百分之六十到百分之八十的量;第二,特征也是随机选择的,可能特征有20多个特征,每一棵树选择特征的时候是随机的去选择,并不是都选。这就导致每一棵树训练数据不一样,最后每一棵决策树之间就会存在差异。
如下图,每一棵树它们的内部结构是不一样的。并且每一棵决策树预测的结果也是不确定的,有的预测成红色的类别,有的预测成了绿色的类别。这种差异可以提高泛化能力。
图解释:n棵决策树,在庞大的森林当中,决策树是作为基础学习器,也叫弱学习器。比如现在要做一个分类任务,有一个样本 ( Instance ),同时输入到这n棵决策树当中,每一棵决策树都会得到一个预测结果,比如说,第一个决策树将样本预测为A类别,第二棵决策树 将样本预测为B类别。每一棵树都有一个这样的预测结果。那最后这个样本到底属于哪个类别呢?
如果是分类的话,就会采取Majority-Voting ( 投票 ),意思是如果有100棵决策树,其中80棵预测为A,20棵预测为B类别。那最终样本就被预测为A类别。
如果说是回归任务的话,就取平均结果,比方要预测一下明天的气温是多少,假如我输入一个样——明天的一些特征 ( 天气、湿度等 ),那每一棵决策树都会对这个样本进行预测,每一棵树都会得到一个预测的温度,对这些结果取平均数,就是最后这个随机森林所预测的温度。
Bagging的集成思想
假如说,你现在要训练一个分类器,或者说回归模型,但是无论怎么调参数,都没办法达到很好的效果,比如说决策树,效果不是很好,那就训练100棵决策树,每一颗决策树都是独立并行的进行训练,然后把每一棵树预测的结果加起来取一个平均,这就是Bagging。
还有一个问题:
随机森林究竟集成多少棵树比较好呢?
实际上,这个参数是你自己去设置的,并不是说种的树越多,效果就一定越好。
如下图:横坐标表示树的数量,纵坐标表示准确率。我们发现,当决策树量比较少的时候,准确率的变化还是很明显的,也就是决策树越多效果越好,但是当决策树达到了一定量的时候,反而会看到它准确率的实际效果会下降,所以说,一般情况下,一百棵树,两百棵树差不多了,不会有太大的一个变化,五百棵树到底了。
第二种集成算法:
boosting集成思想和它的代表Adaboost
从弱学习器开始加强,通过加权来进行训练
典型代表:Adaboost、Xgboost
首先介绍:Adaboost :会根据前一次的分类效果调整数据权重。
解释:每一个训练样本都有一个权重,Adaboost算法会提高那些分错了的样本权重,比如说,上一次分类把某些样本分错了,那下一次再添加一个新的分类器的时候,会给之前分错的样本更大的权重(相当于更大的一个关注一样),会把之前分对了的样本,将它的权重降低,所以调整权重是Adaboost的一个非常重要的核心。
解释:如果某一个数据分类错了,那么下一次我就给它更大的关注(更大的权重)
最终的结果:每个学习器根据自身的准确性再来确定各自的权重,再求和
所以,这里会涉及到两个权重,数据会有各自的权重,每一个分类器自身也有权重。
下面通过一个例子来说明,这两种权重到底是如何操作的。
如下图所示:有十个样本点,每一个样本都知道它的类别,将这些样本作为训练数据,然后右图是对这些样本点进行了可视化,都画在了一个二维平面上,其中红色的点表示-1类别,蓝色的+号表示1类别,目的是做二分类。在这分类器不用决策树,用一个更加简单的分类器来做集成,如下图有三个分类器,这个图横坐标是X1,纵坐标是X2,表示的是两个特征,第一个分类器h1就是 **绿色 **的这条虚线,分类器h2就是 黑色 的这条虚线,分类器h3就是 黄色 的这条虚线。可以看到h1错分了3(5、7、8),h2分错三个点(3、4、6),h3分错三个点(1、2、9),现在想把这三个分类器进行集成,用Adaboost集成模型来集成,现在每一个基础分类器它们的准确率都是百分之70,这个准确率是比较低的,
Adaboost非常核心的问题就是调整权重
步骤:
第一步:
要做集成,就要从第一次迭代开始,先选出第一个分类器,先进行初始化,如下图,每一个训练样本被赋予相同的权值,比如说这里有十个样本,每个样本的权重就是十分之一,如果是十万个样本的话,每一个样本的权重就是十万分之一,
第二步:
如何选择第一个分类器?
选择 误差率最小 的分类器作为第一个分类器h1(误差率都是0.3,那就随便选一个作为h1吧 ! ),
误差率:某个分类器的误差率 = 错分样本的权重之和
eg : 比如这个例子中,就是每一个样本的权重都是0.1,分错了三个,所以是0.1 + 0.1 + 0.1=0.3
第三步:
接下来计算第一个分类器的权重:
到此为止,第一个分类器的权重已经设置好了,每个样本的权重也设置好了。
那接着下一步:
就要往里面去集成第二个基础学习器,这个时候,需要去调整每个样本的权重。
每串联一个决策树,都可以减少误差,这样会提高总体的效果,之前的权重,每个是0.1,在这个基础上提高那些分错了的样本的权重,然后减少那些分对样本的权重。
第一次时:可以看到h1错分了3(5、7、8),那就需要将h1错分了的这3点(5、7、8)的权重设置的大一点,其他样本点的权重设置的小一点,那问题又来了。
怎么去调整这个权重呢 ?
同样有现成的公式:
得到了每个样本点新的权重
第一次权重调整完之后,就可以得到第一个基础函数:
完成第一次迭代!现在开始第二次迭代 !也就是开始往里面集成第二个基础学习器了,
后面的过程就非常的相似了。
同样第一步:
在第二次设置了权重D2之后:选择误差率最小的分类器:
h2和h3误差一样小,就选h2作为第二分类器吧 !
算第二基础分类器的最终权重:
然后,我们就要进行第三次权重的更新了
从分类器权重可以看出,错误率小的那些分类器,它们的权重是慢慢变大的。
经过了三次集成之后,Adaboost模型就是如下这个样子,配上权重之后加起来,这个相当于是串联,因为每一次进行迭代的时候,都需要前面一次的结果,每次调整样本权重的时候都需要前面一次的样本权重。
那最终这个错误率就变成了0 !都分对了
它的分类边界就是如下图这个样子:
这是三个基础分类器:
这是最终的分类器:
验证一下这个分类器:
最终的这个分类器就会把属于这个区域内的点预测为-1类别 !
至此结束 !
这样的一个过程,需要大家把握两个点:
-
样本权重:每次往进集成新的学习器的时候,样本的权重在不断的进行调整,这是第一个权重的调整。
-
每个基础分类器的权重。
面试题:
对Adaboost是怎么理解的?
最后,总结理一下思路步骤!
首先,是初始化训练数据的权值分布D1。假设有N个训练样本数据,则每一个训练样本最开始时,都被赋予相同的权值:w1=1/N。
然后,训练弱分类器hi。具体训练过程是 : 如果某个训练样本点,被弱分类器hi准确地分类,那么在构造下一个训练集中,它对应的权值要减小 ; 相反,如果某个训练样本点被错误分类,那么它的权值就应该增大。权值更新过的样本集被用于训练下一个分类器,整个训练过程如此迭代地进行下去。
最后,将各个训练得到的弱分类器组合成一个强分类器。各个弱分类器的训练过程结束后,加大分类误差率小的弱分类器的权重,使其在最终的分类函数中起着较大的决定作用,而降低分类误差率大的弱分类器的权重,使其在最终的分类函数中起着较小的决定作用。换而言之,误差率低的弱分类器在最终分类器中占的权重较大,否则较小。
面试题:来讲一下对随机森林的理解
随机森林是一种以决策树为基础学习器的Bagging集成算法,随机森林当中的基础学习器是决策树,它们的在训练的时候,相当于是有放回的去随机选取训练数据,保证每一棵树选取训练数据的时候,原数据总量是一致的,并且随机的选取特征进行训练,这样保证基础决策树相互之间是存在差异的,这样可以提高泛化能力,回归任务是输出决策树的平均值,分类任务就是采取投票法,输出的哪个类别多,最后的结果就输出哪个类别,随机森林训练的效果是很高的,它是并行的进行训练,假如服务器比较多,服务器比较大,不同的服务器就可以训练不同的决策树,然后最后再做一个总和,这样并行的训练,它的速度是非常快的。