一些传统的机器学习模型结构十分简单,例如决策树。这类模型虽然容易构建,但是往往也伴随着较差的学习能力。那么是否有一种办法能够将多个简单的机器学习模型结合起来,以发挥出更优秀的性能呢?答案就是本文的主角----集成学习
ensemble learning
。
一、什么是集成学习
所谓集成学习ensemble learning
,就是将多个简单的基学习器base learner
集成起来,根据多个基学习器的预测结果得到集成模型的预测输出。通俗地讲,就是将"三个臭皮匠,赛过诸葛亮"的思想实践到机器学习中,一个基学习器的输出结果可能不准确,但同时用多个基学习器进行预测的结果准确率则会大大提高。
顺便一提,
ensemble
的读法类似于"昂桑薄",而不是"茵森薄"
集成模型中包含 T T T 个基学习器,这 T T T 个基学习器通过一个集成模块结合起来得到一个输出,例如:
根据上面的示例不难发现,当集成模型中的不同基学习器过于相似的时候,集成将变得毫无意义,而当不同基学习器之间完全不同时(即单个基学习器准确率过于低下),集成则会起到一个反作用。因此,好的基学习器应当具有一定的差异性,同时还能够保持充足的准确率。
根据基学习器的产生方式,集成学习模型通常可以分为两个类别:
Boosting
:一种序列化方法,基学习器之间存在强依赖关系,且必须串行生成Bagging
:一种并行化方法,基学习器之间不存在相互依赖且同时生成
二、Boosting
与Bagging
2.1 Boosting
Boosting
是一种将弱学习器逐渐提升boost
为强学习器的集成算法,其核心思想如下:
首先使用初始数据集训练一个基学习器 h 0 h_0 h0,然后根据 h 0 h_0 h0 的预测结果调整数据集的分布,使训练过程更侧重于 h 0 h_0 h0 预测错误的样本。然后使用调整后的数据集训练一个新的基学习器 h 1 h_1 h1 ,如此往复,直到训练的基学习器数量达到集成模型的指定值 T T T ,最后对 T T T 个基学习器进行集成即可。
Boosting
集成算法的代表有AdaBoost
以及各种提升树算法。
2.2 Bagging
与随机森林
区别于Boosting
,Bagging
是一种并行化的集成算法,其名字来源于自助采样集成Bootstrap AGGregatING
。Bagging
首先通过自助采样法bootstrap sampling
对原始数据集采样得到
T
T
T 个同样大小的采样集,然后在这
T
T
T 个采样集上分别训练得到一个基学习器。最后分类任务一般使用简单的投票法进行集成输出,回归任务则使用平均法进行集成输出。
所谓自助采样法,就是对原始数据集 D D D 进行 m m m 次有放回采样,从而得到一个大小为 m m m 的采样集。这种做法会改变原始数据的分布,但同时也能保证数据集的规模不变。
随机森林Random Forest, RF
是一类特殊的Bagging
算法,其以决策树模型作为基学习器,并在传统的Bagging
框架上额外引入了随机的属性选择。对于传统的决策树模型,其划分属性的选择算法是在当前节点所有属性中进行最优选择,而作为随机森林基学习器的决策树模型则是从当前节点所有属性中抽样一个大小为
k
k
k 的子集,然后在这个子集上进行最优选择。
关于 k k k 值的选择,当其等于当前节点所有属性的数量 m m m 时,
RF
基学习器与普通决策树无异,当其等于1
时,划分属性的选择算法会退化成随机选择。一般情况下,推荐 k k k 的最优取值为 log 2 d \log_2d log2d 。
三、集成策略
假设一共有 T T T 个基学习器,每个基学习器表示为 h ( x ) h(x) h(x) ,集成模型表示为 H ( x ) H(x) H(x)
3.1 平均法
对于简单的用于完成回归任务的集成模型,一般采用平均法。平均法根据平均策略又可以分为简单平均和加权平均。
- 简单平均: H ( x ) = 1 T ∑ i = 1 T h i ( x ) H(x)=\frac{1}{T}\sum_{i=1}^{T}{h_i(x)} H(x)=T1i=1∑Thi(x)
- 加权平均: H ( x ) = ∑ i = 1 T w i h i ( x ) , w i ∈ [ 0 , 1 ] , ∑ i T w i = 1 H(x)=\sum_{i=1}^{T}{w_ih_i(x)},\ w_i\in[0,1],\ \sum_i^Tw_i=1 H(x)=i=1∑Twihi(x), wi∈[0,1], i∑Twi=1
在实际实现中,加权平均的权重一般通过学习得到。例如:
统计得到各个基学习器的损失 d i d_i di ,将其取倒数得到 θ i = 1 / d i \theta_i=1/d_i θi=1/di,那么对于每一个基学习器,其权重如下:
w i = θ i ∑ i = 1 T θ i w_i=\frac{\theta_i}{\sum_{i=1}^T\theta_i} wi=∑i=1Tθiθi
一般情况下,对于基学习器性能相差较大的集成模型,应当采用加权平均策略,而对于基学习器性能接近的集成模型,则应当采用简单平均策略。
3.2 投票法
对于标签为 c = { c 1 , c 2 , c 3 , . . . , c n } c=\{c_1,c_2,c_3,...,c_n\} c={c1,c2,c3,...,cn} 的数据集,假设基学习器的输出为 h i ( x ) = { h i 1 , h i 2 , h i 3 , . . . , h i n } h_i(x)=\{h_i^1,h_i^2,h_i^3,...,h_i^n\} hi(x)={hi1,hi2,hi3,...,hin}, h i j h_i^j hij 的取值为
0
或1
对于简单的用于完成分类任务的集成模型,一般采用投票法。根据投票的选择策略,则又可以分为绝对多数投票、相对多数投票以及加权投票。
- 绝对多数投票
majority voting
:若某个预测值的得票数超过总票数的一半,则将其作为输出,否则不输出。数学表示如下: H ( x ) = { c k , if ∑ i = 1 T h i k ( x ) > 0.5 ∑ j = 1 N ∑ i = 1 T h i j ( x ) null , otherwise H(x)=\begin{cases}c_k,\qquad&\text{if}\ \sum_{i=1}^T{h_i^k(x)}>0.5\sum_{j=1}^N\sum_{i=1}^T{h_i^j(x)}\\\text{null},&\text{otherwise}\end{cases} H(x)={ck,null,if ∑i=1Thik(x)>0.5∑j=1N∑i=1Thij(x)otherwise - 相对多数投票
plurality voting
:不管票数多少,将得票数最高的标签作为模型输出。数学表示如下: H ( x ) = c k , k = arg max j ∑ i = 1 T h i j ( x ) H(x)=c_k,\ k=\argmax_j{\sum_{i=1}^T{h_i^j(x)}} H(x)=ck, k=jargmaxi=1∑Thij(x) - 加权投票
weighted voting
:基于相对多数投票的改进,在其票数统计过程中引入权重概念。数学表示如下: H ( x ) = c k , k = arg max j ∑ i = 1 T w i h i j ( x ) H(x)=c_k,\ k=\argmax_j{\sum_{i=1}^T{w_ih_i^j(x)}} H(x)=ck, k=jargmaxi=1∑Twihij(x)
一般情况下,对于可靠性要求较高而不要求必须进行输出的模型,应当采用绝对多数投票策略,而当要求模型必须进行输出时,则可以根据情况选择相对多数投票或者加权投票策略。
3.3 学习法
学习法是一种更强大的集成策略,除了原本的
T
T
T 个基学习器(在学习法中又叫初级学习器)之外,学习集成法还提供了一个次级学习器(又叫元学习器meta-learner
)来学习基学习器的集成策略。
学习法的经典代表为Stacking
算法,其基本思想如下:先从原始数据集
D
D
D 中学得
T
T
T 个初级学习器,然后根据初级学习器的预测结果生成一个新的数据集
D
′
D'
D′,最后使用
D
′
D'
D′ 来训练次级学习器。在
D
′
D'
D′ 中,初级学习器对于一个样本
x
i
x_i
xi 的
T
T
T 个输出将作为一个新的样本
x
i
′
x'_i
xi′,而
x
i
x_i
xi 的标签
y
i
y_i
yi 则也将作为
x
i
′
x'_i
xi′ 的标签。
伪代码表示如下:
# m为样本数, h表示初级学习器, f表示次级学习器
D' = []
h = [h1, h2, h3,..., hT]
for each i in [1, 2, 3,..., m]:
x' = []
for each j in [1, 2, 3,..., T]:
x' append h[j](x[i])
D' append [x', y[i]]
out = f(D')