【机器学习算法】集成学习之Stacking,Bagging,AdaBoost

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Hemk340200600/article/details/85757935

1.模型融合(aggregation models)

  假如我们有多个模型,要怎么灵活运用将这些模型的结果呢?可以使用模型融合(aggregation models) 的方式,将n个模型的输出进一步融合成为一个输出,得到我们想要的结果,那么怎么融合多个模型呢?常见的方法有以下几种:

1.1 uniform blending

  核心思想:少数服从多数,民主投票
  如果知道n个模型的输出,每个模型有一票,则最终的输出:
H ( x ) = s i g n ( t = 1 T h t ( x ) ) H(x)=sign(\sum_{t=1}^T h_{t}(x))
  如果是多分类,则最终输出得票数最多的分类即可。
  如果是预测数值型输出,则最终的输出:
H ( x ) = 1 T t = 1 T h t ( x ) H(x)=\frac{1}{T}\sum_{t=1}^Th_{t}(x)
  可以证明融合之后的模型要比原先的效果好(更稳定):
a v g ( ( h t ( x ) f ( x ) ) 2 ) = a v g ( h t 2 2 h t f + f 2 ) = a v g ( h t 2 ) 2 H f + f 2 = a v g ( h t 2 ) H 2 + ( H f ) 2 = a v g ( h t 2 ) 2 H 2 + H 2 + ( H f ) 2 = a v g ( h t 2 2 h t H + H 2 ) + ( H f ) 2 = a v g ( ( h t H ) 2 ) + ( H f ) 2 \begin{aligned} avg((h_t(x)-f(x))^2) &= avg(h_t^2-2h_tf+f^2) \\ &= avg(h_t^2)-2Hf+f^2 \\ &= avg(h_t^2)-H^2+(H-f)^2 \\ &= avg(h_t^2)-2H^2+H^2 +(H-f)^2 \\ &= avg(h_t^2-2h_tH+H^2)+(H-f)^2 \\ &= avg((h_t-H)^2)+(H-f)^2 \end{aligned}
  其中, a v g ( ( h t ( x ) f ( x ) ) 2 ) avg((h_t(x)-f(x))^2) 代表原始模型的均方误差, ( H f ) 2 (H-f)^2 表示融合模型的军方误差,它们之间相差了一个 a v g ( ( h t H ) 2 ) avg((h_t-H)^2) ,因此有
a v g ( ( h t ( x ) f ( x ) ) 2 ) ( H f ) 2 avg((h_t(x)-f(x))^2) \ge (H-f)^2
  对于uniform blending,每个模型的输出要有所不同,这样融合之后的效果才有可能比单一的模型效果要好,否则平均下来得到的还是一样的结果。

1.2 Linear Bleading

  核心思想 :让每个模型投票,但是给不同模型不同的票数,即给予它们不同的权重。最终的输出为:
H ( x ) = s i g n ( t = 1 T α t h t ( x ) ) H(x)=sign(\sum_{t=1}^T \alpha_t·h_{t}(x))
此时要求解的目标为:
min a t 0 1 N ( y n t = 1 T a t h t ( x n ) ) 2 \min_{a_t\ge 0}\frac{1}{N}\left(y_n-\sum_{t=1}^Ta_th_t(x_n)\right )^2

1.3 Stacking (condition blending)

  核心思想 :让每个模型投票,但是在不同的条件下给不同模型不同的的权重,采用非线性的方式将模型的输出融合。这种方式比较强大,有过拟合的风险。
在这里插入图片描述
  stacking是一种分层模型集成框架。以两层为例,第一层由多个基学习器组成,其输入为原始训练集,第二层的模型则是以第一层基学习器的输出作为训练集进行再训练,从而得到完整的stacking模型。
  通常使用K-fold来实现Stacking,假设我们使用5折交叉验证,有10000行训练集,2500行验证集,对于一个模型来说,5次交叉验证会将10000个训练集分成5份,每份2000个数据,每次以其中一份作为测试集,这样10000个数据都会被测试一次,最终我们可以得到 10000 × 1 10000 \times 1 的矩阵 A 1 A_1 ,同时每次交叉验证的时候都会对验证集进行预测,每次都可以得到一个 2500 × 1 2500 \times 1 的矩阵,共得到5个。对于同一个样本的预测,我们使用平均的方式,最终5个矩阵合并为1个 2500 × 1 2500 \times 1 的矩阵 B 1 B_1 。由于我们是在融合多个模型,自然不止一个模型。假如我们还有模型 M o d e l 2 M o d e l 3 . . . M o d e l n Model_2,Model_3,...,Model_n ,对于每一个模型重复上述步骤,我们可以得到 A 2 , B 2 , A 3 , B 3 , . . . A n , B n A_2,B_2,A_3,B_3,...A_n,B_n 。将所有的A,B矩阵按列合并起来,得到 A t o t a l , B t o t a l A_{total},B_{total} 。以上步骤是Stacking第一层所完成的事情。
  将得到的 A t o t a l A_{total} 作为第二层的训练集, B t o t a l B_{total} 作为第二层的测试集,使用Liner Regression来总结所有模型的效果,得到最终的预测效果。

2. Bagging

  如果说,我们一开始并没有很多个模型,也就无法运用上面的技巧了。因此我们需要通过学习的方式来得到多个模型,一边决定怎么把它们合起来。其中,Bagging是一种通过Bootstraping学习得到多个模型并利用uniform blending来融合模型的方法。
  Bootstraping:从已有的样本中有放回地随机取n份样本。即同一个样本可能被取到多次。假如有10000个样本,可以迭代三千次,每次都取出一份bootstrap sample,每份bootstrap sample可以看做是新的数据,从而我们得到了3000个模型 h t h_t 。这是Bagging套袋法中一个重要的步骤。
  Bagging的算法过程如下:

  1. 从原始样本集中按照Bootstraping方法抽取n个样本,共进行k次,得到k组训练集。
  2. 使用k组训练集得到k个模型。
  3. 对于分类问题使用投票的方式得到分类结果,对于回归问题使用均值作为最后的结果。

  如果我们的模型对数据的随机性比较敏感的话,采用BAGging的方式得到的融合模型往往很有效果。

3. AdaBoost(Adaptive Boosting)

  在Bagging的过程中,每次Boostraping取到的样本都是独立随机的。而在模型融合的算法中,我们认为每个基分类器如果越不一样的,则融合得到的效果是最好的。考虑这样一种情况,在当前一轮取到的样本得到的模型 h t 1 h_{t1} ,如果让他在 h t 2 h_{t2} 的表现变得和抛硬币的情况一样,那么在 h t 2 h_{t2} 的样本就会使得 h t 2 h_{t2} h t 1 h_{t1} 的差别变大,也就是说两个分类器会得到很不一样的决策边界。
  而boostraping的过程其实就是在给样本赋予不同权重的过程,比如说,我们取到了3个样本1,,0个样本2,1个样本3,那么他们的权重就分别是3,0,1。要改变下一个模型的表现,其实只要修改它们的权重即可。令 ϵ \epsilon 表示当前模型下分类错误的比例。则我们的权重优化操作为:

  • 将正确分类的样本权重乘上 ϵ \epsilon
  • 将错误分类的样本权重乘上 1 ϵ 1-\epsilon

  或者我们进一步定义放缩因子 t = 1 ϵ ϵ t=\sqrt{\frac{1-\epsilon}{\epsilon}} ,则权重优化操作变为:

  • 将正确分类的样本权重除以 t t
  • 将错误分类的样本权重乘上 t t

  在通常 ϵ \epsilon 都要小于 1 2 \frac{1}{2} ,否则我们的基学习器就比抛硬币的概率还低了。此时 t 1 t\ge 1 ,则上面的式子表现为增大错误分类的权重,缩小正确分类的权重。经过上面的修正,当前模型的表现就会变成五五开的情况。
  通常一开始的权重u初始化为 1 N \frac{1}{N} ,即每个样本都取一次。
  那我们最终要怎么确定每个模型 h t h_t 在最终模型h中占用的权重呢?考虑模型有的可能变现较差,有的表现较好,那么给予不同的权重是一个合理的选择。对于一个表现良好的模型 h t h_t ,它的缩放因子t会更大,因此可以考虑使用 ln t \ln t 。当t越大时,错误率 ϵ \epsilon 越低,得到的权重越大,当t=1时,错误率 ϵ \epsilon 1 2 \frac{1}{2} ln t \ln t =0,即这样的模型不予考虑,因为他跟抛硬币没什么区别。
  最终我们得到Adaptive Boosting的算法流程如下:

  1. 初始化权重 u ( 1 ) = [ 1 N , 1 N , . . . , 1 N ] u^{(1)}=[\frac{1}{N},\frac{1}{N},...,\frac{1}{N}]
  2. 根据当前权重 u u 获得当前错误率 ϵ \epsilon 最小的模型
  3. 计算缩放因子 t = 1 ϵ ϵ t=\sqrt{\frac{1-\epsilon}{\epsilon}}
  4. 更新 u i + 1 u^{i+1} ,即将正确分类样本的权重除以t,将错误分类样本的权重乘以t。
  5. 计算当前模型在融合模型中的权重 α = ln t \alpha=\ln t
  6. 重复步骤2-5 T次。
  7. 得到最终模型 H ( x ) H(x)

猜你喜欢

转载自blog.csdn.net/Hemk340200600/article/details/85757935