一、集成学习(Ensemble Learning)
集成学习是指通过训练多个分类器,然后将这些分类器组合起来,来获得比单个分类器更优的性能(比最好的那个分类器还要好)。如果每个分类器都是同种类型的(比如都是决策树或者都是SVM等等),那么这些单个的分类器我们称为基学习器;如果集成中包含不同类型的分类器,这样的集成是异质的。需要注意的是,这些单个的分类器性能不一定要很好,只需要比随机猜测好就可以。在我们一般的经验中,如果把好的东西与坏的东西掺杂在一起,那么结果通常是比最坏的要好但比最好的要差一些。那么,为什么集成学习可以获得比最好的单一学习器更好的性能呢?这要从人们对一个问题的争论谈起,即,强可学习与弱可学习是否等价。
1、强可学习VS弱可学习
强可学习((Strong PAC Learnability):一个概念C在假设空间H下是强可学习的,是指存在一个算法A,对
弱可学习(Weak PAC Learnability)一个概念C在假设空间H下是弱可学习的,是指存在一个算法A和一个
也就是说,一个概念强可学习,那么其错误几乎可以很小;而一个弱可学习的概念,则只是比随机猜测好一点。
Rob Schapire证明了强可学习与弱可学习是等价的,于是在学习中如果存在弱学习算法,我们就可以通过组合多个弱学习算法来得到强学习算法。
如何选择学习器?
每个学习器应尽可能不相关,同时分类错误率小于0.5。分类器要有足够的多样性(Diversity)。如何获得这些不相关的学习器呢?一种方法是,对训练数据集采样,这样采样出的子集有差异,训练出来的学习器也就有较大的差异;另一种方法是,先训练一个分类器,然后根据这个分类器的表现改变训练数据的分布,使得被分类错误的样本有更大的权重。这样,集成学习方法可以分成两类,一类是bagging/随机森林,一类是提升算法(Boosting)。
二、Bagging与随机森林(Random Forest)、随机蕨(Random Fern)
1、决策树(Decision Tree)
决策树是一个常用的机器学习算法。它采用了分而治之的策略,也就是对一个分类问题,每次从学习得到的特征集中选取一个特征把输入数据分成两类。训练也就是生成决策树的时候,最关键的就是选择每个节点的划分标准。按照节点划分标准的不同,决策树可以分成三类:ID3、C4.5、CART。
ID3
ID3算法每次选择一个特征,使得样本集的信息量减少最大。这样,熵减少得最快,有望获得一棵深度最浅的树。具体是:已知训练样本集D(假设有C类),我们可以根据这个样本集中每一类出现的概率,算出样本集D包含的信息量。然后,从特征集X中选择一个特征x,则我们可以计算已知x的情况下各类的条件概率,然后计算出已知x的情况下D包含的信息量。也就是说,我们要选择一个x使得x与D相互包含的信息量最大:
C4.5
C4.5算法不直接用信息增益,而是使用信息增益率来选择最优划分。
CART
CART使用基尼指数来选择划分。基尼指数反映的是从数据集D中随机抽取两个样本,其类别标记不一致的概率。因此基尼指数越少,数据集D包含的信息量越少。CART在候选特征集中选取一个特征,使得划分后基尼指数最小。
防止过拟合
决策树防止过拟合的方法分别是:
- 剪枝:包括预剪枝、后剪枝
- 集成学习
实际经验表明,决策树划分标准的选择,如信息增益、信息增益率、基尼指数虽然对决策树的深度有较大影响,但对泛化性能影响有限。而剪枝对决策树泛化性能的影响是相当显著的。
2、Bagging集成
如前所述,训练每个分类器的时候,每次从训练数据集中采样,用样本集训练基分类器。Bagging是一种有放回的采样。也就是训练的时候使用了相互有交叠的子集。
3、随机森林(Random Forest)
- 随机森林在以决策树为基学习器构建bagging集成基础上做了一些修改:在决策树训练的过程中引入了随机的属性选择,对决策树的每个节点,从该节点的属性集中随机选择一个子集,然后再从这个子集中选择一个最优的属性作为划分。这种随机选择增强了基学习器的多样性。
- 引入选择属性的随机性,降低了单个决策树的性能,但随着学习器数目的增加,随机森林比Bagging收敛到更低的泛化误差。
三、提升算法(Boosting)
1、常用的提升算法包括Adaboost(自适应提升算法)、Gradient Boost(梯度提升)等。
Boosting算法的训练过程是:从初始训练集中训练出一个基学习器,再根据基学习器调整训练样本的分布,使得先前分类错误的样本获得更多的关注,然后用调整后的样本分布训练下一个基学习器。如此重复直到基学习器数目达到预定的值。最后输出是这T个学习器的某种加权。
2、提升算法的关键有两个,一是如何改变训练样本的分布;二是如何将弱分类器组合成强分类器。
Adaboost训练时提高那些被前一轮分类错误的样本的权值,而降低那些被分类正确的样本的权值;Gradient Boost每一次的计算都是为了减少上一次的残差,使得损失函数在梯度方向下降。
Adaboost算法
输入:训练集D={(x1,y1),(x2,y2),…,(xm,ym)};基学习算法
ε ;训练轮数T
过程:
1、D1(x)=1m
2、for t=1,2,3,…,T,do
ht=ε(D,Dt)
εt=Px∼Dt(ht(x)≠f(x))
ifεt>0.5 ,then break
αt=12ln1−εtεt
Dt+1(x)=Dt(x)Zt×{exp(−αt),if ht(x)=f(x)exp(αt),if ht(x)≠f(x)
end for
输出:H(x)=sign(ΣTt=1αtht(x))
参考文献:
[1]李航.统计学习方法
[2]周志华.机器学习