集成学习
集成学习(Ensemble Learning)通过构建并结合多个学习器来完成学习任务。集成学习通过将多个学习器进行结合,常可获得比单一学习器显著优越的泛化性能。这对“弱学习器”(Weak Learner)尤为明显。要获得好的集成,个体学习器应“好而不同”,即个体学习器要有一定的“准确性”,即学习器不能太坏,并且要有“多样性”(diversity),即学习器间具有差异。在个体学习器的误差相互独立的条件下,随着集成中个体分类器的数目
T
T
T的增大,集成的错误率将指数级下降,最终趋向于零。在现实任务中,个体学习器是为解决同一个问题训练出来的,它们显然不可能相互独立。事实上,个体学习器的“准确性”和“多样性”本身就存在冲突。一般地,准确性很好之后,要增加多样性就需牺牲准确性。根据个体学习器的生成方式,目前的集成学习方法可以分为两大类:第一个是个体学习器间存在强依赖关系、必须串行生成的Boosting方法;第二类是个体学习器间不存在强依赖关系、可以并行生成的Bagging方法。本小节主要梳理Bagging的方法,关于Boosting的方法会在后续章节梳理。
Bagging
想要得到泛化性能强的集成,个体学习器间应尽可能相互独立;虽然“独立”在现实任务中无法做到,但可以设法使基学习器尽可能具有较大的差异。给定一个训练数据集,一种可能的做法是对训练样本进行采样,产生出若干个不同的子集,再从每个数据子集中训练出一个基学习器。这样,由于训练数据不同,我们获得的基学习器可能具有比较大的差异。然而,为获得好的集成,我们同时还希望个体学习器不能太差。如果采样出的每个子集都完全不同,则每个基学习器只用到了一小部分训练数据,甚至不足以进行有效学习,这显然无法确保产出比较好的基学习器。为解决这个问题,我们可考虑使用相互有交叠的采样子集。Bagging是并行式集成学习方法最著名的代表。自助采样法(bootstrap sampling):给定包含m个样本的数据集,我们先随机取出一个样本放入采样集中,再把该样本放回初始数据集,使得下次采样时该样本仍有可能被选中,这样,经过
m
m
m此随机采样操作,初始训练集中有的样本在采用集中多次出现,有的则从未出现。照这样,我们可采样出
T
T
T个含
m
m
m个训练样本的采样集,然后基于每个采样集训练处一个基学习器,再将这些基学习器进行结合。这就是Bagging的基本流程。在对预测输出进行结合时,Bagging通常对份额里任务使用简单投票法。对回归任务使用简单平均法。若分类预测时出现两个类收到同样票数的情形,则最简单的做法是随机选择一个,也可进一步考察学习器投票的置信度来确定最终胜者。由于每个基学习器只使用了初始训练集中约63.2%的样本,剩下约36.8%的样本可用作验证集来对泛化性能进行“包外估计”(out-of-bag estimate)
随机森林
随机森林(Random Forest,简称RF)是Bagging的一个扩展变体。RF在以决策树为基学习器构建Bagging集成的基础上,进一步在决策树的训练过程中引入了随机属性选择。具体来说,传统决策树在选择划分属性时是在当前结点的属性集合(假设有
d
d
d个属性)中选择一个最优属性;而在RF中,对基决策树的每个结点,先从该节点的属性集合中随机选择一个包含
k
k
k个属性的子集,然后再从这个子集中选择一个最优属性用于划分。这里的参数
k
k
k控制了随机性的引入程度:若令
k
=
d
k=d
k=d,则基决策树的构建与传统决策树相同;若令
k
=
1
k=1
k=1,则是随机选择一个属性用于划分;一般情况下,推荐值
k
=
l
o
g
2
d
k = {log_2}d
k=log2d。与Bagging中基学习器的“多样性”仅通过样本扰动(通过对初始训练集采用)而来不同,随机森林中基学习器的多样性不仅来自样本扰动,还来自属性扰动,这就使得最终集成的泛化性能可通过个体学习器之间差异度的增加而进一步提升。
基学习器的结合策略
学习器结合可能带来下述三个好处:1、从统计方面来看,由于学习任务的假设空间往往很大,可能有多个假设在训练集上达到同等性能,此时若使用单学习器可能因误选而导致泛化性能不佳,结合多个学习器则会减少这一风险;第二,从计算的方面,学习算法往往会陷入局部极小,有的局部极小点所对应的泛化性能可能很糟糕,而通过多次运行之后进行结合,可降低陷入糟糕局部极小点的风险;第三,从表示的方面来看,某些学习任务的真是假设可能不在当前学习算法所考虑的假设空间中,此时若使用单学习器则肯定无效,而通过结合多个学习器,由于相应的假设空间有所扩大,有可能学得更好的近似。常见结合策略:简单平均法、加权平均法、投票法、学习法(Stacking)。
使用随机森林判断特征重要性
判断特征在每颗基决策树中的重要性,然后取平均值。一般而言可以使用基尼指数和袋外数据来进行评估。基于袋外数据的评估:对于一棵基决策树 ,用OOB样本可以得到误差
e
1
e_1
e1,然后随机改变OOB中的第
j
j
j列,保持其他列不变,对第
j
j
j列进行随机的上下置换,得到误差
e
2
e_2
e2。至此,可以用
e
1
−
e
2
e_1 - e_2
e1−e2来刻画特征
j
j
j的重要性。其依据就是,如果一个特征很重要,那么其变动后会非常影响测试误差,如果测试误差没有怎么改变,则说明特征j不重要。打乱特征列数据的方法:(1)使用uniform或者gaussian抽取随机值替换原特征;(2)通过permutation的方式将原来的所有
N
N
N个样本的第
j
j
j个特征值重新打乱分布(相当于重新洗牌)。
使用sklearn实现随机森林
from sklearn
.ensemble
import RandomForestClassifier
from sklearn
import datasets
, model_selection
iris
= datasets
.load_iris
()
X
= iris
.data
Y
= iris
.target
X_train
, X_test
, Y_train
, Y_test
= model_selection
.train_test_split
(X
, Y
, test_size
=0.2, random_state
=0)
print(X_train
.shape
)
print(X_test
.shape
)
rf
= RandomForestClassifier
()
rf
.fit
(X_train
, Y_train
)
print(rf
.feature_importances_
)
print(rf
.predict
(X_test
))
参考资料
周志华《机器学习》https://www.it610.com/article/1296670054393389056.htm