集成学习

集成学习通过构建并结合多个学习器完成学习任务,先产生一组个体学习器,再用某种策略将它们结合起来。个体学习器可以是同种类型的(同质集成),如全是决策树,也可以是不同类型的(异质),如同时包含决策树和神经网络。集成学习将多个学习器进行结合常常可以获得比单一学习器显著优越的泛化性能,此现象对弱学习器尤为明显。

想要通过集成学习获得好的结果,个体学习器应当是“好而不同”的,即个体学习器性能不能太差(准确性),其次学习器之间要有差异(多样性)。当个体学习器之间的错误率相互独立时,集成学习的错误率会随着集成中个体学习器的数目T的增大指数下降趋于 0 ,但是现实情况下个体学习器是为解决同一个问题训练出来的,不可能相互独立。实际情况是集成学习器的测试错误率一开始会随着T的上升而下降,降低到一定水平后不再下降。准确性和多样性之间存在冲突,其中一个提升另一个就会降低,而如何权衡这两者就是集成学习的核心问题。

根据个体学习器的生成方式,集成学习方法可以大致分为两类,一是个体学习器之间存在强依赖关系必须串行生成的序列化方法( Boosting ),二是个体学习器之间不存在强依赖关系可同时并行生成的并行化方法( Bagging 、随机森林)。


Boosting

 Boosting 算法首先基于初始训练集训练出一个基学习器,然后根据基学习器的表现对训练集样本分布进行调整,使得前面的基学习器预测错误的样本在后续受到更多关注,然后基于调整后的训练集训练下一个基学习器,如此重复直至基学习器数目达到事先设定的值,然后用这些学习器的加权和作为集成学习器。 Boosting 算法有三大要素,即损失函数、基学习器(一般是决策树)、集成方法,任何 Boosting 算法都围绕这三者构建,流程为: 1. 根据上一个基学习器 h_t 的结果计算损失函数 L 的值, 2. 针对 L 训练下一个基学习器, 3. 集成所有基学习器。从偏差-方差分解的角度看, Boosting 主要关注降低偏差。

Adaboost

 Adaboost 是 Boosting 算法的一种,假设训练集

D=\{(\vec{x}_1,y_1),...,(\vec{x}_n,y_n)\},

基学习算法

\Xi,

共训练 T 个基学习器。第 t 次学习时所用的训练集通过对 D 中的样品权重进行调整得到,方式为重抽样法(此外还有另一种方法即重赋权法,二者没有优劣之分),对 D 进行 n 次有放回抽样,每次抽样 D 中第 i 个样品被抽中的概率(注意是概率,即对 i 求和是 1 )和基于此抽样得到的数据集(用于训练第 t 个基学习器)为

\mathfrak{D}_t(i),\;\;D_t.

分类问题的Adaboost算法

1. 取

\mathfrak{D}_1(i)=\frac{1}{n},\;\;i=1,...,n.

即保持原始数据集不变。

2. 对

1\leqslant t \leqslant T,

根据

D, \;\;\mathfrak{D}_t(i)

抽样得到训练集 D_t ,从而得到基学习器

h_t = \Xi (D_t),

错误率

\varepsilon_t = P_{D_t}(h_t(\vec{x})\neq f(\vec{x})),

若其大于 0.5 (效果还不如乱猜),则终止整个算法,否则令

\alpha_t = \frac{1}{2}\textup{In} (\frac{1-\varepsilon_t}{\varepsilon_t}),

\mathfrak{D}_{t+1}(i)=\left\{\begin{matrix} \frac{\mathfrak{D}_{t}(i)}{Z_t} e^{-\alpha_t},\;if\;h_t(\vec{x})=f(\vec{x})\\ \frac{\mathfrak{D}_{t}(i)}{Z_t} e^{+\alpha_t},\;if\;h_t(\vec{x})\neq f(\vec{x}) \end{matrix}\right.

其中 f 是真实函数,其作用在 x_i 上等于 y_i (这里 alpha_t 是用指数损失函数推导出来的)。

3. 取集成学习器为

H(\vec{x})=\textup{sign}(\sum \limits_{t=1}^T\alpha_t h_t(\vec{x})).

上述算法中,由于 epsilon_t 小于等于 0.5 ,因此 alpha_t 大于等于 0 ,其随着错误率的下降而上升,表示表现越好的基学习器在集成学习器中的权重就越大, alpha_t 表达式中取了对数,因此权重不会随准确率上升而上升得过快。基学习器是决策树时决策树需要用 C4.5 算法。

回归问题的Adaboost R2算法

此部分参考文献Improving Regressors using Boosting Techniques。

 1. 取

\mathfrak{D}_1(i)=\frac{1}{n},\;\;i=1,...,n.

即保持原始数据集不变。

 2. 对

1\leqslant t \leqslant T,

根据

D, \;\;\mathfrak{D}_t(i)

抽样得到训练集 D_t ,从而得到基学习器

h_t = \Xi (D_t),

错误率

\varepsilon_t = \mathop{\mathrm{max}} \limits_{(\vec{x},y)\in D_t} |h_t(\vec{x})-y|,

对 D_t 中的第 i 个样品(简单起见仍记为( x_i,y_i))令

L_t^i=\frac{|h_t(\vec{x}_i)-y_i|}{\varepsilon_t },

此为线性损失,也可使用平方或指数损失。令

L_t=\sum\limits_{i=1}^{n}\mathfrak{D}_t(i)L_t^i,

若其大于 0.5 (即还不如乱猜),则终止整个算法,否则令

\alpha_t = \frac{L_t}{1-L_t},

\mathfrak{D}_{t+1}(i)=\frac{\mathfrak{D}_{t}(i)}{Z_t} \alpha_t^{1-L_t^i}.

 3. 取集成学习器为

H(\vec{x})=\textup{med}\{\alpha_1h_1(\vec{x}),...,\alpha_Th_T(\vec{x})\}\sum\limits_{t=1}^{T} \textup{In} (\frac{1}{\alpha_t}),

这里 med 表示取中位数。

GBDT

在求函数极小值时常用梯度下降法,用参数值减去损失函数梯度乘步长的公式更新参数值,梯度提升法借鉴了梯度下降的思想,可以看做函数空间上的梯度下降迭代,即迭代地选择指向负梯度方向的函数,从而优化函数空间上的损失函数。无论面向回归还是分类问题其基学习器一定是回归树(若是分类问题则通过 sigmoid 或 softmax 函数输出分类结果)。参考文献: The elements of statistical learning 。

回归问题的GBDT

训练数据集

D=\{(\vec{x}_1,y_1),...,(\vec{x}_n,y_n)\},

第 m 个学习器为

H_m(\vec{x})=\sum \limits_{t=1}^m\alpha_t h_t(\vec{x}),\;\;1\leqslant m \leqslant T.

强学器为

H(\vec{x})=H_T(\vec{x}).

2\leqslant t \leqslant T,

由梯度下降公式有

H_t=H_{t-1}-\alpha_t \nabla_{H_{t-1}} (\sum\limits_{i=1}^{n}L(y_i, H_{t-1}(\vec{x}_i))),

其中 L(y,H) 表示用学习器 H 拟合 y 的损失函数。对比 H_t 的形式可知

h_t=-\nabla_{H_{t-1}} (\sum\limits_{i=1}^{n}L(y_i, H_{t-1}(\vec{x}_i))),

我们将上式右边取名为“残差”,当损失函数取成平方损失

loss(H)=\sum\limits_{i=1}^{n}L(y_i, H)=\frac{1}{2}\sum\limits_{i=1}^{n}(y_i-H)^2

时,可知

-\nabla_{H_{t-1}} (\sum\limits_{i=1}^{n}L(y_i, H_{t-1}(\vec{x}_i)))=\sum\limits_{i=1}^{n}(y_i-H_{t-1}(\vec{x}_i)),

即 h_t 应当等于残差

r_i^{(t)}=y_i-H_{t-1}(\vec{x}_i)

之和,所以我们用数据

D_t=\{(\vec{x}_1,r_1^{(t)}),...,(\vec{x}_n,r_n^{(t)})\},

来训练 h_t 。步长 alpha_t 取成令

\sum\limits_{i=1}^{n}L(y_i, H_t(\vec{x}_i))=\sum\limits_{i=1}^{n}L(y_i, H_{t-1}(\vec{x}_i)+\alpha_th_t(\vec{x}_i)),

最小的 alpha 。

总结以上过程可得梯度提升算法为:

 1. 通过拟合原始数据得到第一个基学习器:

H_1 = h_1=\mathop{\mathrm{arg\;min}} \limits_{h} \sum\limits_{i=1}^{n}L(y_i, h(\vec{x}_i)),

 2. 对

2\leqslant t \leqslant T,

计算当前残差

r_i^{(t)}=y_i-H_{t-1}(\vec{x}_i), \;\; 1\leqslant i \leqslant n.

用数据集

D_t=\{(\vec{x}_1,r_1^{(t)}),...,(\vec{x}_n,r_n^{(t)})\},

来训练本轮基学习器  h_t 。并取

\alpha_t=\mathop{\mathrm{arg\;min}} \limits_{\alpha} \begin{pmatrix} \sum\limits_{i=1}^{n}L(y_i, H_{t-1}(\vec{x}_i)+\alpha_th_t(\vec{x}_i)) \end{pmatrix},

 3. 集成学习器为

H(\vec{x})=\sum \limits_{t=1}^T\alpha_t h_t(\vec{x}).

以上算法中基学习器取成回归决策树,则为梯度提升决策树算法( GBDT )。

 Friedman 对 GBDT 算法做出如下修改:设置对回归树划分的每个小矩形区域内都有一个单独的参数,即,基学习器(回归树)形式为

h_t(\vec{x}) = \sum\limits_{l=1}^{J_t} b_t^l \chi_{R_t^l}(\vec{x}),

其中 R_t^l 是回归树 h_t 划分的小矩形,卡方是指示函数。按原来的假设应当有

H_{t}(\vec{x})=H_{t-1}(\vec{x})+\alpha_t h_t(\vec{x}),

其中 alpha_t 是对整棵树生效的函数,现在我们抛弃回归树原有的参数 b_t^l ,令

H_{t}(\vec{x})=H_{t-1}(\vec{x})+ \sum\limits_{l=1}^{J_t} \alpha_t^l \chi_{R_t^l}(\vec{x}),

\alpha_t^l=\mathop{\mathrm{arg\;min}} \limits_{\alpha} (\sum\limits_{\vec{x}_i \in R_t^l}L(y_i, H_{t-1}(\vec{x}_i)+\alpha)).

注意这里是先训练回归树然后再求 alpha_t^l 。

分类问题的GBDT

回归问题中,用真实值减去预测值得到残差作为基学习器训练数据集的因变量值,但是在分类问题中,真实值和预测值都是类别,类别之间的相减是没有意义的。一种解决方案是,采用逻辑回归算法中的对数损失函数,用结果的预测概率值和真实概率值的差值作为残差。

假设因变量类别总数为 K 个,观测数据 y_i 是 K 维向量,其中第 k 个元素为 1 表示此数据点因变量是第 k 类,其他元素皆为 0 。此时分类问题的 GBDT 对任意 t 都需要训练 K 个回归树,每一个回归树用于预测一个类别的概率,输出记为 H_t^k(x) ,则使用 softmax 函数得到属于类别k的预测概率和残差分别为

p_t^{(k)}(\vec{x})=\frac{e^{H_t^{(k)}(\vec{x})}}{\sum\limits_{l=1}^{K}e^{H_t^{(l)}(\vec{x})}},\;\;y_i^{(k)}-p_t^{(k)}(\vec{x}).

算法为:

 1. 初始化(每个类别的概率都预测成 1/K ):

H_0^{(k)}(\vec{x})=0,\;1\leqslant k \leqslant K.

 2. 对 1<=t<=T ,重复如下步骤:

p_t^{(k)}(\vec{x}) = \frac{e^{H_{t-1}^{(k)}(\vec{x})}}{\sum\limits_{l=1}^{K}e^{H_{t-1}^{(l)}(\vec{x})}},\;\;k=1,2,...,K.

对 1<=k<=K ,重复以下步骤:

计算残差

r_{t,i}^{(k)} = y_i^{(k)}-p_t^{(k)}(\vec{x}_i),\;\;i=1,2,...,N.

用数据

D_t=\{(\vec{x}_1,r_{t,1}^{(k)} ),...,(\vec{x}_n,r_{t,n}^{(k)} )\},

训练回归树,得到分割的小矩形

R_t^{(k)}(j),\;\;j=1,2,...,J_t.

这里小矩形 R 很多,用j给它们编号。令

\gamma_t^{(k)}(j) = \frac{K-1}{K} [\sum\limits_{\vec{x}_i\in R_t^{(k)}(j)} r_{t,i}^{(k)}/\sum\limits_{\vec{x}_i\in R_t^{(k)}(j)} |r_{t,i}^{(k)}|(1-|r_{t,i}^{(k)}|)],\;\;j=1,2,...,J_t.

(上式根据损失函数推导得到),更新当前学习器

H_t^{(k)}(\vec{x})=H_{t-1}^{(k)}(\vec{x})+\sum\limits_{j=1}^{J_t}\gamma_t^{(k)}(j) \chi_{R_t^{(k)}(j)}(\vec{x}).

 3. 最终学习器为

H_T^{(k)}(\vec{x})=\sum\limits_{t=1}^{T}h_t^{(k)}(\vec{x}),\;\;1\leqslant k \leqslant K.


Bagging

并行式集成学习方法最著名的代表,其直接基于 bootstrap 抽样法。给定样本

D=\{(\vec{x}_1,y_1),...,(\vec{x}_n,y_n)\},

基学习器个数 T 。从 D 中有放回抽样(等可能) n 次得到新样本,在其上训练基学习器,这样的过程进行 T 次就得到了 T 个基学习器

h_1,...,h_T,

对分类任务,集成学习器

H(\vec{x})=\mathop{\mathrm{arg\;max}} \limits_{y} \sum\limits_{t=1}^{T} \chi_{\{h_t(\vec{x})=y\}},

其中卡方是指示函数,上式表示预测因变量时,将所有基学习器给出的预测类别中出现最多的那个类别作为预测值(简单投票法),若两个类别收到同样的票数,则可以随机选一个。

对回归任务,集成学习器

H(\vec{x})=\frac{1}{T}\sum\limits_{t=1}^{T}h_t(\vec{x}),

即简单平均法。

可以看出和 Adaboost 仅能解决二分类问题不同, Bagging 可以解决多分类和回归任务。

从偏差-方差分解的角度看, Bagging 主要关注降低偏差。

 Bagging 通过样本扰动来使基学习器具有多样性。

由 bootstrap 的相关知识可知从 D 中抽取出的新样本约含 D 的 63.2% ,因此我们可以对每个基学习器的训练集记录 D 里面不在其中的那些样品,将它们作为验证集。

随机森林

是 Bagging 的一个特例,随机森林的基学习器是引入了随机属性选择的决策树,和标准决策树的不同之处在于,后者选择划分属性时是在当前结点上的属性集(假设含有 d 个属性)中选择最优者,而前者首先从这 d 个属性中随机选择 k ( <d )个属性,再从这 k 个属性中选择最优划分属性,这一操作是为了通过引入随机性来提高多样性, k 越小随机性越大,一般取

k=\textup{\textup{}log}_2d.

随机森林中基学习器的多样性通过样本扰动和属性扰动实现。由于随机森林只训练一部分属性,因此训练效率比 Bagging 更高。

结合策略

除了前面提到的简单投票法和简单平均法外,还有其他类似的学习器结合策略。

对数值型输出,除了直接对学习器进行平均外,还可以用形式为

H(\vec{x})=\frac{1}{T}\sum\limits_{t=1}^{T}w_th_t(\vec{x}),\;w_t\geqslant 0,\;\sum\limits_{t=1}^{T}w_t=1

的加权平均法,加权平均法不一定由于简单平均法,一般来说基学习器之间性能差距很大的时候使用加权平均法(权重可以取成误差的倒数),性能相近时使用简单平均法。

对类别型输出,简单投票法又称相对多数投票法,即让所有基学习器给出各自的预测后选择被预测次数最多的类别作为最终预测结果,而绝对多数投票法则选择被预测比例大于 0.5 (被预测次数多于 T/2 )的类别作为最终预测结果,由于多分类问题可能不存在这样的类别,因此绝对多数投票法有可能拒绝预测,这一点在可靠性要求很高的学习任务中是一个较好的机制。此外还有和加权平均法类似的加权投票法,我们将学习器的输出形式改为元素为 0 或 1 的向量,向量长度等于类别总数 N ,第 m 个元素(用学习器上标 m 表示)取 1 表示学习器预测结果是第 m 类,此时其余元素取 0 ,加权投票法的预测结果是

H(\vec{x})=\mathop{\mathrm{arg\;max}} \limits_{1 \leqslant j \leqslant N} \sum\limits_{t=1}^{T} w_t h_t^j(\vec{x}).


Boosting和Bagging的区别

 1. 基学习器之间的关系: Boosting 的基学习器之间是串行的,基于前一个基学习器的训练结果去训练下一个基学习器, Bagging 的基学习器之间是并行、互相独立的训练。

 2. 集成方式: Bagging 的集成一般是两种,回归就用平均,分类就用投票,而 Boosting 的集成方式是多种多样的,每个算法都有其单独的集成方式,大体上是加权平均或使用输出函数(如 sigmoid 和 softmax )。

 3. 目标: Bagging 是在降低方差,提高稳定性(通过平均这一操作), Boosting 是在降低偏差,将若干弱分类器组合后变成强学习器。

 4. 对基学习器的要求:基学习器性能较差时 Bagging 可能失效, Boosting 则可以提升模型性能。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值