Boosting:
AdaBoost (Adaptive Boosting)
Gradient Boosting Machines (GBM)梯度推进机
Gradient Boosted Regression Trees (GBRT)梯度提升回归树
Stacking:
由于学习随机森林需要了解bagging和决策树算法,下面依次进行
Bagging(Bootstrapped Aggregation的简称)特点各个弱学习器之间没有依赖关系,可以并行拟合训练。
对于给定数据处理任务,采用不同的模型、参数、特征训练出多个弱学习器,最后采用投票或者加权平均的方式输出最终结果。基学习器可以是相同的模型,也可以是不同的,一般使用的是同一种基学习器,最常用的是DT决策树。
随机采样(bootsrap)就是从我们的训练集里面采集固定个数的样本,但是每采集一个样本后,都将样本放回。也就是说,之前采集到的样本在放回后有可能继续被采集到。对于我们的Bagging算法,一般会随机采集和训练集样本数m一样个数的样本。这样得到的采样集和训练集样本的个数相同,但是样本内容不同。如果我们对有m个样本训练集做T次的随机采样,,则由于随机性,T个采样集各不相同。
注意到这和GBDT的子采样是不同的。GBDT的子采样是无放回采样,而Bagging的子采样是放回采样。
对于一个样本,它在某一次含m个样本的训练集的随机采样中,每次被采集到的概率是 1 m \frac{1}{m} m1。不被采集到的概率为 1 − 1 m 1-\frac{1}{m} 1−m1。如果m次采样都没有被采集中的概率是 ( 1 − 1 m ) m (1-\frac{1}{m})^m (1−m1)m。当m→∞时, ( 1 − 1 m ) m → 1 e ≃ 0.368 (1-\frac{1}{m})^m \to \frac{1}{e} \simeq 0.368 (1−m1)m→e1≃0.368。也就是说,在bagging的每轮随机采样中,训练集中大约有36.8%的数据没有被采样集采集中。
对于这部分大约36.8%的没有被采样到的数据,我们常常称之为袋外数据(Out Of Bag, 简称OOB)。这些数据没有参与训练集模型的拟合,因此可以用来检测模型的泛化能力。
bagging对于弱学习器没有限制,这和Adaboost一样。但是最常用的一般也是决策树和神经网络。
bagging的集合策略也比较简单,对于分类问题,通常使用简单投票法,得到最多票数的类别或者类别之一为最终的模型输出。对于回归问题,通常使用简单平均法,对T个弱学习器得到的回归结果进行算术平均得到最终的模型输出。
由于Bagging算法每次都进行采样来训练模型,因此泛化能力很强,对于降低模型的方差很有作用。当然对于训练集的拟合程度就会差一些,也就是模型的偏倚会大一些。
上面我们对bagging算法的原理做了总结,这里就对bagging算法的流程做一个总结。相对于Boosting系列的Adaboost和GBDT,bagging算法要简单的多。
输入为样本集 D = { ( x , y 1 ) , ( x 2 , y 2 ) , . . . ( x m , y m ) } D=\{(x_,y_1),(x_2,y_2), ...(x_m,y_m)\} D={(x,y1),(x2,y2),...(xm,ym)},弱学习器算法, 弱分类器迭代次数T。
输出为最终的强分类器f(x)
1)对于t=1,2…,T:
a)对训练集进行第t次随机采样,共采集m次,得到包含m个样本的采样集Dt
b)用采样集Dt训练第t个弱学习器Gt(x)
2) 如果是分类算法预测,则T个弱学习器投出最多票数的类别或者类别之一为最终类别。如果是回归算法,T个弱学习器得到的回归结果进行算术平均得到的值为最终的模型输出。
理解了bagging算法,随机森林(Random Forest,以下简称RF)就好理解了。它是Bagging算法的进化版,也就是说,它的思想仍然是bagging,但是进行了独有的改进。我们现在就来看看RF算法改进了什么。
首先,RF使用了CART决策树作为弱学习器,这让我们想到了梯度提示树GBDT。第二,在使用决策树的基础上,RF对决策树的建立做了改进,对于普通的决策树,我们会在节点上所有的n个样本特征中选择一个最优的特征来做决策树的左右子树划分,但是RF通过随机选择节点上的一部分样本特征,这个数字小于n,假设为n1,然后在这些随机选择的n1个样本特征中,选择一个最优的特征来做决策树的左右子树划分。这样进一步增强了模型的泛化能力。
那么下面讲决策树的生成,看随机森林中的树是怎么生成的。
CART分回归树和分类树,这里选择分类树的方法讲解。
分类树用基尼指数选择最优特征,并决定该特征的最优二值切分点。
基尼值Gini(D):从数据集D中随机抽取两个样本,起类别标记不一致的概率,故Gini
(D)值越小,数据集D的纯度越高。
基尼系数公式如下:
G i n i ( D ) = ∑ k = 1 ∣ y ∣ p k ( 1 − p k ) = 1 − ∑ k = 1 ∣ y ∣ p k 2 Gini(D) =\sum_{k=1}^{|y|}p_k(1-p_k)= 1-\sum_{k=1}^{|y|}p_k^2 Gini(D)=k=1∑∣y∣pk(1−pk)=1−k=1∑∣y∣pk2
基尼指数值越大,样本集合的不确定性越大,这一点和熵类似
具体CART生成算法:
对分类树而言,CART用Gini系数最小化准则来进行特征选择,生成二叉树。 CART生成算法如下:
输入:训练数据集D,停止计算的条件:
输出:CART决策树。
根据训练数据集,从根结点开始,递归地对每个结点进行以下操作,构建二叉决策树:
算法停止计算的条件是结点中的样本个数小于预定阈值,或样本集的Gini系数小于预定阈值(样本基本属于同一类),或者没有更多特征。
鉴于决策树容易过拟合的缺点,随机森林采用多个决策树的投票机制来改善决策树,我们假设随机森林使用了m棵决策树,那么就需要产生m个一定数量的样本集来训练每一棵树。
随机森林的生成方法:
1.从样本集中通过重采样的方式随机选择n个样本
2.假设样本中的特征数量为a,再从这些特征中,随机选择k个特征,用建立决策树的方式选择最佳分割点,构建决策树树
3.重复m次,产生m棵决策树
4.多数投票机制来进行预测
(需要注意的一点是,这里m是指循环的次数,n是指样本的数目,n个样本构成训练的样本集,而m次循环中又会产生m个这样的样本集)
随机森林是一个比较优秀的模型,在我的项目的使用效果上来看,它对于多维特征的数据集分类有很高的效率,还可以做特征重要性的选择。运行效率和准确率较高,实现起来也比较简单。但是在数据噪音比较大的情况下会过拟合,过拟合的缺点对于随机森林来说还是较为致命的。
随机森林中的随机性主要体现在两个方面:
随机采样:随机森林在计算每棵树时,从全部训练样本(样本数为n)中选取一个可能有重复的、大小同样为m的数据集进行训练(即booststrap采样)。
随机选取特征:在每个节点随机选取所有特征中的部分特征,用来计算最佳分割方式。