1 引言

本文主要结合了李宏毅的机器学习课程之Ensemble和周志华的《机器学习》西瓜书两者的说法,对ensemble这一竞赛利器做了总结。
Ensemble主要可以分为bagging和boosting两种方法。其中,bagging适用于基模型复杂度比较高的情况(如树模型),其目的是为了减小variance,即阻止过拟合的情况。而boosting则是适用于基模型是弱学习器的情况,其目的是减小biases,基本上多弱模型都可以用(如果分类正确率低于50%,取个反就可以了)~

2 Bagging

个人觉得bagging其实和神经网络中的drop-out非常相似。我们只给每个模型看数据的一部分,不给它们看全貌,然后希望它们在这一部分上有比较好的学习结果,最后综合各个模型的结果,做一个blending,得到最终的结果。
Bagging在选取数据时,采用的是bootstrap的方法,即有放回的抽样。假设我们有 mmm 个样本的数据集 D" role="presentation" style="position: relative;">DDD 。我们希望利用有放回的抽样方法构造一个新的数据集 D′D′D',其样本个数仍旧是m。显然 DDD 中的一些数据会在 D′" role="presentation" style="position: relative;">D′D′D' 中重复出现,这也就意味着有一部分数据在 D′D′D' 中是不会出现的。

图1 bagging示意图(此图出自李宏毅的视频)
我们可以做一个简单的估计。样本在m次采样中,始终没有被采到的概率为 (1−1m)m(1−1m)m (1-\frac{1}{m})^m ,取极限的话为

limm→∞(1−1m)m→1e≈0.368limm→∞(1−1m)m→1e≈0.368

\lim_{m \rightarrow \infty} (1 - \frac{1}{m})^m \rightarrow \frac{1}{e} \approx 0.368
这一部分没有被采样到的数据可以作为验证集来使用,这个方法被称“包外估计”(out-of-bag estimate)。
根据该方法训练得到多个模型之后,可以取平均或者投票得到最终结果。
其中,随机森林便是一个典型的利用bagging方法的模型,只不过在随机森林当中,数据的特征也是随机选取的。

3 Boosting

Boosting的主要想法是在已有模型的基础上,重视被错分的样本,再训练一个模型来融合到原模型中,以此来提高模型的准确率,如此不断反复。那么如何重视被错分的样本呢?这就是boosting的一个有意思的地方了。它给每个样本赋予了一个权重,每次boosting之后,样本的权重就会被更新,而这里的权重直接影响了训练时的Loss function。

L(f)=∑nl(f(xn),yn)→L(f)=∑nunl(f(xn),yn)L(f)=∑nl(f(xn),yn)→L(f)=∑nunl(f(xn),yn)

L(f) = \sum_{n} l(f(x^n), y^n) \rightarrow L(f) = \sum_{n} u_nl(f(x^n), y^n)
式中, unun u_n 即为每个样本的权重。也就是说,现在我们的样本变成了这个样子
{(x1,y1,u1),(x2,y2,u2),⋯,(xn,yn,un)}{(x1,y1,u1),(x2,y2,u2),⋯,(xn,yn,un)} \{ (x^1, y^1, u^1), (x^2, y^2, u^2), \cdots , (x^n, y^n, u^n) \}
Boosting的方法有很多,我们这里主要讲一下其中比较流行的AdaBoost算法。
假设我们在第一个基模型 f1(x)f1(x) f_1(x) 上训练得到的错误率为(此时所有样本权重均相同)

ϵ1=∑nun1δ(f1(xn)≠yn)Z1ϵ1=∑nu1nδ(f1(xn)≠yn)Z1

\epsilon_1 = \frac{ \sum_n u_1^n \delta (f_1(x^n) \neq y^n) }{ Z_1 }
其中

Z1=∑nun1Z1=∑nu1n

Z_1 = \sum_n u_1^n
我们希望学习器的错误率 ϵ1ϵ1 \epsilon_1 是大于0.5的,否则我们取个反,或者不要这个学习器,换一个。
知道了哪些训练错了,哪些训练对了之后,我们就要进行最重要的重新分配权重了。所谓的重新分配权重就是给正确的权重除以一个 d1d1 d_1 ,错误的权重乘以一个 d1d1d_1, d1>1d1>1 d_1 > 1。
那么这个 d1d1 d_1 怎么来?我们希望再更新权重之后,新的权重满足下式

∑f1(xn)≠ynun2=∑f1(xn)=ynun2∑f1(xn)≠ynu2n=∑f1(xn)=ynu2n

\sum_{f_1(x^n) \neq y^n} u_2^n = \sum_{f_1(x^n) = y^n} u_2^n
也就是说,从权重上来看要错的对的各占一半,即

∑f1(xn)≠ynun1d1=∑f1(xn)=ynun1/d1∑f1(xn)≠ynu1nd1=∑f1(xn)=ynu1n/d1

\sum_{f_1(x^n) \neq y^n} u_1^n d_1 = \sum_{f_1(x^n) = y^n} u_1^n / d_1
其中, Z1ϵ1=∑f1(xn)≠ynun1d1Z1ϵ1=∑f1(xn)≠ynu1nd1 Z_1 \epsilon_1 = \sum_{f_1(x^n) \neq y^n} u_1^n d_1 , Z1(1−ϵ1)=∑f1(xn)=ynun1d1Z1(1−ϵ1)=∑f1(xn)=ynu1nd1 Z_1(1 - \epsilon_1) = \sum_{f_1(x^n) = y^n} u_1^n d_1 ,代入上式可得

d1=(1−ϵ1)/ϵ1−−−−−−−−−√d1=(1−ϵ1)/ϵ1

d_1 = \sqrt{(1 - \epsilon_1 ) / \epsilon_1}
再用此时的权重去训练出第二个模型 f2(xn)f2(xn)f_2(x^n) 。之后,继续如此操作,直到达到弱分类器个数限制。
为了方便表示,我们通常把 dd d 表示成 eαeα e^{\alpha} 的形式,那么,权重的更新可以直接写成

unt+1=unt⋅e−ynft(xn)αt=∏i=1te−ynαifi(xn)ut+1n=utn⋅e−ynft(xn)αt=∏i=1te−ynαifi(xn)

u_{t+1}^n = u_t^n \cdot e^{-y_n f_t(x^n)\alpha_t} = \prod_{i=1}^t e^{-y_n\alpha_i f_i(x^n)}
其中, αt=ln(dt)αt=ln(dt) \alpha_t = ln( d_t ) 。
得到所有的模型之后,我们希望把训练的 TT T 个模型融合起来,这个融合的过程就叫做blending。
一种简单的做法就是直接取结果的平均

H(x)=sign(∑t=1Tft(x))H(x)=sign(∑t=1Tft(x))

H(x) = sign(\sum_{t=1}^T f_t(x))
但这样的做法不够机智。我们每个模型的可信度是不同的,我们需要给每个模型一个权重,得到一个加权平均的结果

H(x)=sign(∑t=1Tαtft(x))H(x)=sign(∑t=1Tαtft(x))

H(x) = sign(\sum_{t=1}^T\alpha_t f_t(x))
这里的 αtαt \alpha_t 就是我们前面的 αt=ln((1−ϵ1)/ϵ1−−−−−−−−−√)αt=ln((1−ϵ1)/ϵ1) \alpha_t = ln( \sqrt{(1 - \epsilon_1 ) / \epsilon_1} ) 。可以证明随着模型数量的增加,模型在训练集上的表现会越来越好,详细证明可参见李宏毅的视频。

4 Gradient Boosting

顾名思义,这是用Gradient的方法来进行boosting。上文中的Adaboost其实就是一种特殊的Gradient Boosting。Gradient Boosting的总体流程为

图2 Gradient Boosting流程图
既然是要做Gradient,当然要有目标函数啊。这里的目标函数就是

L(g)=∑nl(yn,g(xn))L(g)=∑nl(yn,g(xn))

L(g) = \sum_{n}l(y^n, g(x^n))
于是,就有

gt(x)=gt−1−η∂L(g)∂g(x)|g(x)=gt−1(x)gt(x)=gt−1−η∂L(g)∂g(x)|g(x)=gt−1(x)

g_t(x) = g_{t - 1} - \eta \frac{\partial L(g)}{\partial g(x)}|_{g(x) = g_{t-1}(x)}
又由于

gt(x)=gt−1(x)+αtft(x)gt(x)=gt−1(x)+αtft(x)

g_t(x) = g_{t - 1}(x) +\alpha_t f_t(x)
所以我们希望 −η∂L(g)∂g(x)|g(x)=gt−1(x)−η∂L(g)∂g(x)|g(x)=gt−1(x) - \eta \frac{\partial L(g)}{\partial g(x)}|_{g(x) = g_{t-1}(x)} 和 αtft(x)αtft(x) \alpha_t f_t(x) 是方向相同的。即找到一个 ft(x)ft(x)f_t(x) 使得

maxft(x)−ηft(x)∂L(g)∂g(x)|g(x)=gt−1(x)maxft(x)−ηft(x)∂L(g)∂g(x)|g(x)=gt−1(x)

\max_{f_t(x)} - \eta f_t(x)\frac{\partial L(g)}{\partial g(x)}|_{g(x) = g_{t-1}(x)}
然后找一个 αtαt\alpha_t 使得 L(g)L(g) L(g) 最小。
当 L(g)=∑ne−yng(xn)L(g)=∑ne−yng(xn)L(g) = \sum_n e^{-y^ng(x^n)} 的时候,可以推出这就是我们的Adaboosting。
详细推导过程偷下懒,参见李宏毅的视频即可。

机智的ensemble相关推荐

  1. 集成学习(Ensemble Learning)

    在机器学习的有监督学习算法中,我们的目标是学习出一个稳定的且在各个方面表现都较好的模型,但实际情况往往不这么理想,有时我们只能得到多个有偏好的模型(弱监督模型,在某些方面表现的比较好).集成学习就是组 ...

  2. 使用机智云APP控制战舰V3 (转)

    源:使用机智云APP控制战舰V3 转载于:https://www.cnblogs.com/LittleTiger/p/10725586.html

  3. 2018机器阅读理解技术竞赛,奇点机智获第一名

    长期以来,大家一直有这样的疑问:机器到底能不能真正理解人类?机器阅读理解的能力,能否超越人类? 2018年5月15日,由中国中文信息学会(CIPS).中国计算机学会(CCF)和百度联手举办的" ...

  4. 火星无人机「机智号」代码开源,1.2w人参与贡献

    视学算法报道 作者:小舟.陈萍 火星上的一小步,人类的一大步. 当地时间 19 日 NASA 宣布在毅力号的「注视」下,机智号(Ingenuity)无人直升机成功完成了火星上的首次飞行,并完成 3 米 ...

  5. RDKit |基于集成学习(Ensemble learning)预测溶解度

    Ensemble learning 集成学习 集成学习(Ensemble learning)是这样一个过程,按照某种算法生成多个模型,如分类器或者称为专家,再将这些模型按照某种方法组合在一起来解决某个 ...

  6. 集成学习+ensemble learning

    集成学习+ensemble learning Blending is a word introduced by the Netflix winners. It is very close to sta ...

  7. 【多标签文本分类】Ensemble Application of Convolutional and Recurrent Neural Networks for Multi-label Text

    ·阅读摘要:   本文提出基于Seq2Seq模型,提出CNN-RNN模型应用于多标签文本分类.论文表示CNN-RNN模型在大型数据集上表现的效果很好,在小数据集效果不好. ·参考文献:   [1] E ...

  8. CVPR2019--Binary Ensemble Neural Network--二值CNN网络集成

    Binary Ensemble Neural Network: More Bits per Network or More Networks per Bit? CVPR2019 本文最基本的思想: 二 ...

  9. 人脸对齐--One Millisecond Face Alignment with an Ensemble of Regression Trees

    One Millisecond Face Alignment with an Ensemble of Regression Trees CVPR2014 http://www.csc.kth.se/~ ...

最新文章

  1. 网络的塔建+模型训练
  2. springmvc 加载 慢_怎么加载spring框架这么慢是不是配置…-就业班
  3. @query传参_VueRouter之query与params两种传参区别
  4. phpstorm9 增加对.vue的支持
  5. mongodb java spring_[Java教程]Spring 与 mongoDB 整合
  6. Vue(八)发送跨域请求
  7. java lucence_Lucence使用入门
  8. webpack----entry
  9. UVA11554 Hapless Hedonism【数学计算+大数】
  10. Codevs 1200 同余方程 2012年NOIP全国联赛提高组
  11. 一、理解网络编程和套接字
  12. JDY-31蓝牙模块简单通信
  13. 10倍性能提升!英伟达新卡皇降临,图灵架构GTX 20系列发布
  14. 深信服测试开发日常实习岗位一面凉经(来自李某)
  15. vue将图片保存到相册_Vue保存当前页面为图片
  16. 华为q1设置虚拟服务器,华为路由Q1的上网设置教程
  17. Pandas-数字前面补0
  18. 【干货福利】67个拯救web开发者的工具、库和资源!——爱创课堂
  19. OLEDB简介,OLEDB与ODBC的关系
  20. MY-I.MX6-DEMO Android4.4.2环境搭建

热门文章

  1. python标准库os中的方法_python中OS常用方法
  2. python-kafka 常用 api 汇总
  3. 清华大学《操作系统》(八):置换算法
  4. webpack打包测试_webpack入门笔记(一)
  5. vb6在后台将窗体保存到图片_如何将寺库网多个商品图片一键分类保存到一个目录...
  6. java虚拟机参数优化_JAVA虚拟机JVM参数优化(2):垃圾收集算法选择
  7. 如何在VMWare的Ubuntu虚拟机中设置共享文件夹
  8. QT输入输出(四)之 QProcess
  9. 在C++中用虚函数的作用是什么? 为什么要用到虚函数?
  10. 数据结构:神奇的B树实现解析(有图有代码有真相!!!)