Boosistraping:意思是依靠你自己的资源,称为自助法,它是一种有放回的抽样方法,它是非参数统计中一种重要的估计统计量方差进而进行区间估计的统计方法。
其核心思想和基本步骤如下:
(1)采用重抽样技术从原始样本中抽取一定数量(自己给定)的样本,此过程允许重复抽样。
(2)根据抽出的样本计算统计量T。
(3)重复上述N次(一般大于1000),得到统计量T。
(4)计算上述N个统计量T的样本方差,得到统计量的方差。
应该说是Bootstrap是现代统计学较为流行的方法,小样本效果好,通过方差的估计可以构造置信区间等。
Bagging:bootstrap aggregating的缩写。Bagging即套袋法,其算法过程如下:
A)从原始样本集中抽取训练集。每轮从原始样本集中使用Bootstraping的方法抽取n个训练样本(在训练集中,有些样本可能被多次抽取到,而有些样本可能一次都没有被抽中)。共进行k轮抽取,得到k个训练集。(k个训练集之间是相互独立的)
B)每次使用一个训练集得到一个模型,k个训练集共得到k个模型。(注:这里并没有具体的分类算法或回归方法,我们可以根据具体问题采用不同的分类或回归方法,如决策树、感知器等)
C)对分类问题:将上步得到的k个模型采用投票的方式得到分类结果;对回归问题,计算上述模型的均值作为最后的结果。(所有模型的重要性相同)
Boosting:主要思想是将弱分类器组装成一个强分类器。在PAC(概率近似正确)学习框架下,则一定可以将弱分类器组装成一个强分类器。
其中主要的是adaboost(adaptive boosting)。初始化时对每一个训练赋予相同的权重1/n,然后用该学算法对训练集训练t轮,每次训练后,对训练失败的训练列赋予较大的权重,也就是让学习算法在后续的学习中集中对比较难的训练列进行训练(就是把训练分类错了的样本,再次拿出来训练,看它以后还敢出错不),从而得到一个预测函数序列h_1,h_m,其中h_i也有一定的权重,预测效果好的预测函数权重大,反之小。最终的预测函数H对分类问题采用有权重的投票方式,对回归问题采用加权平均的方式对
新样本判别。
类似bagging方法,但是训练是串行的,第K个分类器训练时,关注对前k-1分类器中错误,不是随机取样本,而是加大取这些分错的样本的权重。
关于Boosting的两个核心问题:
1)在每一轮如何改变训练数据的权值或概率分布?
通过提高那些在前一轮被弱分类器分错样例的权值,减小前一轮分对样例的权值,来使得分类器对误分的数据有较好的效果。
2)通过什么方式来组合弱分类器?
通过加法模型将弱分类器进行线性组合,比如AdaBoost通过加权多数表决的方式,即增大错误率小的分类器的权值,同时减小错误率较大的分类器的权值。
而提升树通过拟合残差的方式逐步减小残差,将每一步生成的模型叠加得到最终模型。
Bagging,Boosting二者之间的区别:
1)样本选择上:
Bagging:训练集是在原始集中有放回选取的,从原始集中选出的各轮训练集之间是独立的。
Boosting:每一轮的训练集不变,只是训练集中每个样例在分类器中的权重发生变化。而权值是根据上一轮的分类结果进行调整。
2)样例权重:
Bagging:使用均匀取样,每个样例的权重相等
Boosting:根据错误率不断调整样例的权值,错误率越大则权重越大。
3)预测函数:
Bagging:所有预测函数的权重相等。
Boosting:每个弱分类器都有相应的权重,对于分类误差小的分类器会有更大的权重。
4)并行计算:
Bagging:各个预测函数可以并行生成
Boosting:各个预测函数只能顺序生成,因为后一个模型参数需要前一轮模型的结果。
Gradient Boost(Mart,Treenet):boosting是一种思想,Gradient Boosting是一种实现Boosting的方法,它的主要思想是,每一次建立模型,是在之前建立模型损失函数的梯度下降方向。
损失函数描述的是模型的不靠谱程度,损失函数越大,说明模型越容易出错。如果我们的模型能够让损失函数持续的下降,说明我们的模型在不停的改进,而最好的方式就是让损失函数在其梯度的方向下降。
Rand Forest:随机森林,使用随机的方式建立一个森林,森林里面有很多的决策树组成,随机森林的每一课决策树之间是没有关联的。在得到森林之后,当有一个新的输入样本进入,就让森林中的每一颗决策树分别进行判断,看看这个样本属于那个类,然后看看哪一类被选择多,就预测为那一类。
在建立决策树的过程中,需要注意两点-采样和完全分裂。首先是两个随机采样的过程,random forest对输入的数据要经行行,列的采样。
对于行采样,采用有回放的方式,也就是在采样得到的样本集合中,可能有重复的样本。假设输入样本为N个,那么采样的样本也为n个。这样使得在训练的时候,每一颗树的输入样本都不是全部样本,使得相对不容易出现over-fitting。然后进行采样,从M个feature中,选择m个。
之后就是对采样之后的数据使用完全分裂的方式建立出决策树,这样决策树的某一个叶子节点要么是无法继续分裂,要么里面的所有样本都是指向的同一类分类。一般的决策树都有一个重要的步骤,剪枝,但是这里不这样干,由于之前的两个随机采样的过程保证了随机性,所以就算不剪枝,也不会over-fitting。
按这种算法得到的随机森林中的每一颗树都是很弱的,但是大家组合起来就很厉害了。可以这样比喻随机森林:每一颗决策树就是一个精通于某一个窄领域的专家,这样在随机森林中就有了很多个精通不同领域的专家,对于新的样本,可以用不同的角度看待它,最终由各个专家,投票得到结果。
总结
Bagging,Boosting都是把若干个分类器整合为一个分类器的方法,只是整合的方式不一样,最终得到不一样的效果,将不同的分类算法套入到此类算法框架中一定程度上会提高了原单一分类器的分类效果,但是也增大了计算量。
下面是将决策树与这些算法框架进行结合所得到的新的算法:
1)Bagging + 决策树 = 随机森林
2)AdaBoost + 决策树 = 提升树
3)Gradient Boosting + 决策树 = GBDT
为什么说bagging是减少variance,而boosting是减少bias?
首先解释一下什么是方差(variance)和偏差(bias),“Bias-Variance Decomposition” 是以测试集上的平方错误为基础的,假设我们的预测值为g(x),真实值为f(x),则均方误差为$$E((g(x)−f(x))^2) 。
g¯=E(g)代表算法的期望预测(如:可以用不同的数据集D1,D2,…,DK来得到g¯=1K∑kgk(x)),则有:
由上面的公式可知,偏差描述的是算法的预测的平均值和真实值的关系(可以想象成算法的拟合能力如何),而方差描述的是同一个算法在不同数据集上的预测值和所有数据集上的平均预测值之间的关系(可以想象成算法的稳定性如何)。
(ps:个人认为可以把偏差认为是单个模型的学习能力,而方差则描述的是同一个学习算法在不同数据集的不稳定性)
Bagging对样本重采样,对每一重采样得到的子样本集训练一个模型,最后取平均。由于子样本集的相似性以及使用的是同种模型,因此各模型有近似相等的bias和variance(事实上,各模型的分布也近似相同,但不独立)。由于,所以bagging后的bias和单个子模型的接近,一般来说不能显著降低bias。另一方面,若各子模型独立,则有,此时可以显著降低variance。若各子模型完全相同,则
,此时不会降低variance。bagging方法得到的各子模型是有一定相关性的,属于上面两个极端状况的中间态,因此可以一定程度降低variance。为了进一步降低variance,Random forest通过随机选取变量子集做拟合的方式de-correlated了各子模型(树),使得variance进一步降低。
(用公式可以一目了然:设有i.d.的n个随机变量,方差记为,两两变量之间的相关性为,则的方差为
,bagging降低的是第二项,random forest是同时降低两项。详见ESL p588公式15.1)
boosting从优化角度来看,是用forward-stagewise这种贪心法去最小化损失函数。例如,常见的AdaBoost即等价于用这种方法最小化exponential loss:。所谓forward-stagewise,就是在迭代的第n步,求解新的子模型f(x)及步长a(或者叫组合系数),来最小化,这里
是前n-1步得到的子模型的和。因此boosting是在sequential地最小化损失函数,其bias自然逐步下降。但由于是采取这种sequential、adaptive的策略,各子模型之间是强相关的,于是子模型之和并不能显著降低variance。所以说boosting主要还是靠降低bias来提升预测精度。