集成学习
集成学习通过构建并结合多个学习器来完成学习任务,有时也被称为多分类器系统。如下图显示出集成学习的一般结构:先产生一组“个体学习器”,再用某种策略将它们结合起来,个体学习器通常由一个现有的学习算法从训练数据中产生,例如C4.5决策树算法,BP神经网络等。个体学习器可以是相同的类型的学习器也可以是不同类型的,相同类型的称为“基学习器”,不同的称为“组件学习器”或者“个体学习器”。
集成学习通过将多个学习器进行结合,常可获得单一学习器显著优越的泛化性能,这对“弱学习器”(泛化性能略高于随机猜测的学习器)尤为明显,因此集成学习的很多理论都是针对弱学习器进行的。
例如在一个二分类任务中,假定三个分类器在三个测试样本上的表现如下图,其中$\surd$表示分类正确,$\times $表示分类错误,集成学习通过“少数服从多数”的原则来产生结果。这个简单的例子显示出:要获得好的集成,个体学习器应“好而不同”,即个体学习器要一定的“准确性”,即学习器不能太坏,并且要有“多样性”,即学习器间应具有差异。
考虑二分类的问题$y\in\{-1,+1\}$和真实函数$f$,假定基分类器的错误率为$\epsilon$,即对每个基分类器$h_{i}$有
$P(h_{i}\neq f(x))=\epsilon$
假设集成通过简单投票法结合T个基分类器,若有超过半数的基分类器正确,则集成分类就正确:
$H(x)=sign(\sum_{i=1}^{T}h_{i}(x))$
假设基分类器的错误率相对独立,则由$Hoeffding$不等式可知,集成的错误率为:
$P(H(x)\neq f(x))=\sum_{k=0}^{|T/2|}\binom{T}{k}(1-\epsilon)^{k}\epsilon^{T-k}\leq exp(-\frac{1}{2}T(1-2\epsilon)^{2})$
上式显示出,随着集成中个体分类器数目T的增大,集成的错误率将指数级下降,最终趋于0。
上面的假设是个体分类器中时相对独立的,在现实任务中,个体学习器是为解决同一个问题训练出来的,它们显然不可能独立。事实上,个体学习器的“准确性”和“多样性”本身就存在冲突。
根据个体学习器的生成方式,目前的集成学习方法大致可以分为2大类,即个体学习器间存在强依赖关系,必须串行生成的序列化方法,以及个体学习器间不存在强依赖关系、可同时生成的并行化方法,前者的代表是$Boosting$,后者的代表是$Bagging$和“随机森林”。
Boosting:
是一族可将弱学习器提升为强学习器的算法,这族算法的工作机制类似:先从初始训练集训练出一个基学习器,再根据基学习器的表现对训练样本分布进行调整,使得先前基学习器做错的训练样本在后续受到更多关注,然后j基于调整后的样本分布来训练下一个基学习器;如此重复进行,直至基学习器数目达到事先指定的值T,最终将这T个基学习器进行加权结合。
AdaBoost(基学习器的线性组合,二分类问题):
$H(x)=\sum_{t=1}^{T}a_{t}h_{t}(x)$
来最小化指数损失函数:
$\iota_{exp} (H|D)=E_{x\sim D}[e^{-f(x)H(x)}]$
若$H(x)$能令指数损失函数最小化,则考虑损失函数对$H(x)$求偏导($f(x)\in \{-1,+1\}$):
$\frac{\partial \iota_{exp} (H|D)}{\partial H(x)}=-e^{-H(x)}P(f(x)=1|x)+e^{H(x)}P(f(x)=-1|x)$
令上式等于零:
$H(x)=\frac{1}{2}ln\frac{P(f(x)=1|x)}{P(f(x)=-1|x)}$
因此有:
$sign(H(x))=sign(\frac{1}{2}ln\frac{P(f(x)=1|x)}{P(f(x)=-1|x)})$
$=\left\{\begin{matrix}1,P(f(x)=1|x) > P(f(x)=-1|x)\\ -1,P(f(x)=1|x) < P(f(x)=-1|x)\end{matrix}\right.$
$=\underset{y \in \{-1,+1\}}{arg\ max}\ P(f(x)=y|x)$
这意味着$sign(H(x))$达到了贝叶斯最优的错误率,即指数损失函数和0/1损失函数是等价的。指数损失函数可以代替0/1损失函数,它具有更好的数学性质(连续可微的)
在AdaBoost算法中,第一个基分类器$h_{1}$是通过直接将基学习器算法用于初始数据分布而得,此后迭代的生成$h_{t}$和$a_{t}$,当基分类器$h_{t}$基于分布$D_{t}$产生后,该基分类器的权重$a_{t}$应使得$a_{t}h_{t}$最小化指数损失函数:
$\iota_{exp}(a_{t}h_{t}|D_{t})=E_{x\sim D_{t}}[e^{-f(x)a_{t}h_{t}}]$
$=E_{x\sim D_{t}}[e^{-a_{t}}\mathbb{I}(f(x)=h_{t}(x))+e^{a_{t}}\mathbb{I}(f(x)\neq h_{t}(x))]$
$=e^{-a_{t}}(1-\epsilon_{t})+e^{a_{t}}\epsilon_{t}$
考虑指数损失函数的导数:
$\frac{\partial \iota_{exp}(a_{t}h_{t}|D_{t})}{\partial a_{t}}=-e^{-a_{t}}(1-\epsilon_{t})+e^{a_{t}}\epsilon_{t}$
令上式等于零:
$a_{t}=\frac{1}{2}ln(\frac{1-\epsilon_{t}}{\epsilon_{t}})$
这就是Adaboost的权重迭代公式。
Adaboost算法在获得$H_{t-1}$之后样本分布将进行调整,使下一轮的基学习器$h_{t}$能纠正$H_{t-1}$的一些错误,理想的$h_{t}$能纠正$H_{t-1}$的全部错误,即最小化:
$\iota_{exp}(H_{t-1}+h_{t}|D)=E_{x\sim D}[e^{-f(x)(H_{t-1}(x)+h_{t}(x))}]=E_{x\sim D}[e^{-f(x)H_{t-1}(x)}e^{-f(x)h_{t}(x)}]$
注意到$f^{2}(x)=h_{t}^{2}(x)=1$,则$e^{-f(x)h_{t}(x)}$泰勒展开:
$\iota_{exp}(H_{t-1}+h_{t}|D)\simeq E_{x\sim D}[e^{-f(x)H_{t-1}(x)}(1-f(x)h_{t}(x)+\frac{f^{2}(x)h_{t}^{2}(x)}{2})]$
$=E_{x\sim D}[e^{-f(x)H_{t-1}(x)}(1-f(x)h_{t}(x)+\frac{1}{2})]$
于是理想的基学习器是:
$h_{t}(x)=\underset{h}{arg\ min}\ \iota_{exp}(H_{t-1}+h_{t}|D)$
$=\underset{h}{arg\ min}\ E_{x\sim D}[e^{-f(x)H_{t-1}(x)}(1-f(x)h_{t}(x)+\frac{1}{2})]$
$=\underset{h}{arg\ max}\ E_{x\sim D}[e^{-f(x)H_{t-1}(x)}f(x)h_{t}(x)]$(因为$E_{x\sim D}[e^{-f(x)H_{t-1}(x)}]$是一个常数)
$=\underset{h}{arg\ max}\ E_{x\sim D}[\frac{e^{-f(x)H_{t-1}(x)}}{E_{x\sim D}[e^{-f(x)H_{t-1}(x)}]}f(x)h_{t}(x)]$
因为$E_{x\sim D}[e^{-f(x)H_{t-1}(x)}]$是一个常数,令$D_{t}$表示一个分布:
$D_{t}(x)=\frac{D_{t}(x)e^{-f(x)H_{t-1}(x)}}{E_{x\sim D}[e^{-f(x)H_{t-1}(x)}]}$
即:
$D_{t}(x)$是$X$
$\frac{e^{-f(x)H_{t-1}(x)}}{E_{x\sim D}[e^{-f(x)H_{t-1}(x)}]}$是分布概率
则根据数学期望的定义,则等价于令:
$h_{t}(x)=\underset{h}{arg\ max}\ E_{x\sim D}[\frac{e^{-f(x)H_{t-1}(x)}}{E_{x\sim D}[e^{-f(x)H_{t-1}(x)}]}f(x)h(x)]$
$\underset{h}{arg\ max}\ E_{x\sim D_{t}}[f(x)h(x)]$
由于$f(x),h(x)\in \{-1,+1\}$,令:
$f(x)h(x)=1-2\mathbb{I}(f(x)\neq h(x))$
则理想的基学习器:
$\underset{h}{arg\ min}\ E_{x\sim D_{t}}[f(x)\neq h(x)]$
考虑到$D_{t}$和$D_{t+1}$的关系:
$D_{t+1}(x)=\frac{D(x)e^{-f(x)H_{t}(x)}}{E_{x\sim D}[e^{-f(x)H_{t}(x)}]}$
$=\frac{D(x)e^{-f(x)H_{t-1}(x)}e^{-f(x)a_{t}h_{t}(x)}}{E_{x\sim D}[e^{-f(x)H_{t}(x)}]}$
$=D(x)e^{-f(x)a_{t}h_{t}(x)}\frac{E_{x\sim D}[e^{-f(x)H_{t-1}(x)}]}{E_{x\sim D}[e^{-f(x)H_{t}(x)}]}$
这就是样本分布的更新公式
Bagging和随机森林
由上述可知,欲得到泛化性能强的集成,集成中的个体学习器应尽可能相互独立,虽然独立在现实任务中无法做到,但可以设法使基学习器尽可能具有较大的差异。给定一个训练数据集,一种可能的做法是对训练样本进行采样,产生出若干个不同的子集,再从每一个数据子集中训练出一个基学习器、因为训练集的不同,我们获得的基学习器具有较大的差异。
Bagging(注重降低方差):
是并行式集成学习方法最著名的代表,它基于自助采样法,给定包含m个样本的数据集,我们先随机抽取出一个样本放入采样集中,再把该样本放回初始数据集,使得下次抽样时该样本仍有可能被选中,这样经过m次随机采样操作,我们得到含m个样本的采样集,初始训练集中有的样本在采样集中多次出现,有的则从未出现过,初始训练集中约有63.2%的样本出现在采样集中。
我们可采样出T个含m个训练样本的采样集,然后基于每一个采样集训练出一个基学习器,再将这些基学习器进行结合,这是Bagging的基本流程。在对预测输出进行结合时,Bagging通常对分类任务使用简单投票法,对回归任务使用简单平均法,如果出现票数相同的情况则随机选择或者进一步考察学习器投票的置信度来确定。
随机森林(RF):
是Bagging的一个扩展变体,RF在以决策树为基学习器构建Bagging集成的基础上,进一步在决策树的训练过程中引入了随机属性选择,具体来说,传统决策树在选择划分属性时是在当前节点是属性集合(假设有d个属性)中选择一个最优属性;而在RF中,对基决策树的每一个节点,先从该节点的属性集合中随机选择一个包含k个属性的子集,然后再从这个子集中选择一个最优属性用于划分,这里的参数k控制了随机性的引入程度,推荐$k=log_{2}d$
随机森林简单、容易实现、计算开销小而且在很多现实任务中展现出强大的性能。随机森林只是对Bagging做出了小的改动,但是与Bagging不同的是RF的基学习器的多样性不仅来自于样本的扰动还有属性的扰动。
结合策略:
学习器结合可能从三个方面带来好处:
1.从统计方面来看,由于学习任务的假设空间往往很大,可能有多个假设在训练集上达到同等的性能,此时若使用单学习器可能因误选而导致泛化性能不佳,结合多个学习器则会减少这一风险。
2.从计算方面来看,学习算法往往会陷入局部极小,有点局部极小点,所对应的泛化性能可能很糟糕,而通过多次运行之后进行结合,可降低陷入糟糕局部极小点的风险。
3.从表示的方面来看,某些学习任务的真实假设可能不在当前学习算法所考虑的假设空间中,此时若使用单学习器则肯定无效,而通过学习多个学习器,由于相应的假设空间有所扩大,有可能学得更好的近似。
假设集成包含$T$个基学习器$\{h_{1},h_{2},h_{3}...h_{T}\}$,其中在示例$x$上的输出为$h_{i}(x)$。
平均法:对数值型输出$h_{i}(x)\in R$,最常见的集合策略是使用平均法
简单平均法:
$H(x)=\frac{1}{T}\sum_{i=1}^{T}h_{i}(x)$
加权平均法:
$H(x)=\sum_{i=1}^{T}w_{i}h_{i}(x)$
其中$w_{i}$是个体学习器$h_{i}$的权重,通常要求$w_{i}>0,\sum_{i=1}^{T}w_{i}=1$,权重可由基学习器的方差等来衡量。
投票法:我们将$h_{i}$在样本$x$上的预测输出表示为一个$N$维向量$(h_{i}^{1}(x),h_{i}^{2}(x),h_{i}^{3}(x),...h_{i}^{N}(x))$,其中$h_{i}^{j}(x)$是$h_{j}$在类别标记$c_{j}$上的输出。
绝对多数投票法:
$H(x)=\left\{\begin{matrix}c_{j},if\ \sum_{i=1}^{T}h_{i}^{j}(x)>0.5\sum_{k=1}^{N}\sum_{i=1}^{T}h_{i}^{k}(x)\\ reject,otherwise\end{matrix}\right.$
即若某标记得票过半数,则预测为该标记,否则拒绝预测
相对多数投票法:
$H(x)=c_{\underset{j}{arg\ max\sum_{i=1}^{T}h_{i}^{j}(x)}}$
即预测为得票最多的标记,若同时有多个标记获最高票,则随机抽取。
加权投票法:
$H(x)=c_{\underset{j}{arg\ max\sum_{i=1}^{T}w_{i}h_{i}^{j}(x)}}$
类似加权平均法。
学习法:单训练数据很多时,一种更为强大的结合策略是使用“学习法”即通过另一个学习器来进行结合。Stacking是学习算法的典型代表,这里我们把个体学习器称为初级学习器,用于结合的学习器称为次级学习器或元学习器。
Stacking先从初始训练集训练出初级学习器,然后生成一个新数据集用于训练次级学习器。在这个新训练集中,初级学习器的输出被当作样例输入特征,而初始样本的标记仍被当作样例标记。