博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【李宏毅2020 ML/DL】补充:Ensemble: Bagging, Boosting, Adaboost, Gradient Boosting, Stacking
阅读量:2019 次
发布时间:2019-04-28

本文共 3040 字,大约阅读时间需要 10 分钟。

我已经有两年 ML 经历,这系列课主要用来查缺补漏,会记录一些细节的、自己不知道的东西。

本次笔记补充视频 的缺失部分。在另一个UP主上传的2017课程中可找到。本节内容 100 分钟左右。

本节内容综述

  1. 今天介绍 Ensemble ,意思就是“团队合作”。
  2. 首先,来讲 Bagging ,提及了随机森林中 out-of-bag 的测试方法。
  3. 接下来,是用于 Improving Weak Classifiers 的 Boosting 。主要讲了 Adaboost ,包含很多数学上的证明。接下来是 Gradient Boosting 。
  4. 最后几分钟,老师介绍了下 Stacking 。

文章目录

小细节

Bagging

创造出不同的 data set ,训练不同的模型。

如上,分成 4 份数据(有放回地采样),训练 4 个模型。
如上,对 testing data 做平均。

This approach would be helpful when your model is complex, easy to overfit. e.g. decision tree.

e.g. decision tree

简单的 decision tree 如上图。但是对于决策树,有许多要进行考虑的事。
比如,树的深度,只要够深,就可以拟合任意图形。

Random Forest

使用 Out-of-bag 的方法,或许可以弥补决策树“过拟合”的问题。

Boosting

Boosting 可以把正确率略高于 50% 的模型,集成起来,达到正确率 100 % 。

如上,我们是有顺序地依次训练 f ( x ) f(x) f(x) ,这与 Bagging 不同。

How to obtain different classifiers?

刚才讲过,可以用不同的训练数据,训练不同的模型。

我们可以用“重采样”的方法,也可以如上,改变训练数据的权重。优化目标中,多了权重 u n u^n un

Adaboost

Idea

如上,我们要找一组新的训练数据(改变数据权重),其在 f 1 ( x ) f_1(x) f1(x) 上的表现很差,用这个训练 f 2 ( x ) f_2(x) f2(x)

如何找呢?如上,本来,我们的错误率是低于 0.5 的(如果高于 0.5 ,则将 output 反转就可以)。接着,我们调整权重 u u u ,让错误率等于 0.5 。用这个权重训练 f 2 ( x ) f_2(x) f2(x)

直观的举例如上。

Re-weighting Training Data

如上,只需对正确的数据与错误的数据分别进行运算即可。

这个 d 1 d_1 d1 如何设置呢?推导如下。

如上,推导可能比较繁琐,但是道理很简单。由最下方的式子求解 d 1 d_1 d1 即可。
这里有些技巧,把下面的式子倒过来,分母移到右边去,进行整理代换,最后得到 d 1 = ( 1 − ϵ 1 ) / ϵ 1 d_1 = \sqrt{(1-\epsilon_1)/\epsilon_1} d1=(1ϵ1)/ϵ1

Algorithm

其演算法如上。我们将权重更新式整理成 u t + 1 n ← u t n × e x p ( − y ^ n f t ( x n ) α t ) u^{n}_{t+1}\leftarrow u^n_t \times exp(-\hat{y}^n f_t (x^n)\alpha_t) ut+1nutn×exp(y^nft(xn)αt)
如上,如何把 f ( x ) f(x) f(x) 集合在一起呢?可以:

  • Uniform weight
  • Non-uniform weight (用 α t \alpha_t αt 作为权重)

注意,计算 ϵ \epsilon ϵ 时,带上权重。

Math

H ( x ) = s i g n ( ∑ t = 1 T α t f t ( x ) ) H(x)=sign(\sum^T_{t=1}\alpha_t f_t(x)) H(x)=sign(t=1Tαtft(x))

α t = l n ( 1 − ϵ t ) / ϵ t \alpha_t = ln\sqrt{(1-\epsilon_t)/\epsilon_t} αt=ln(1ϵt)/ϵt

我们将证明,当 T T T 增加时, H ( x ) H(x) H(x) 将越来越准(在训练集上)。

Error Rate of Final Classifier

如上,把 ∑ t = 1 T α t f t ( x ) \sum^T_{t=1}\alpha_t f_t(x) t=1Tαtft(x) 记为 g ( x ) g(x) g(x) ,而如果 y ^ n g ( x n ) < 0 \hat{y}^n g(x^n)<0 y^ng(xn)<0 ,说明是错误的预测,因为二者异号。绿色的线代表误差函数。可以得到误差函数上界 e x p exp exp
如上,使用一些归纳的思想,得到 u T + 1 n u_{T+1}^n uT+1n ,进而得到 Z T + 1 Z_{T+1} ZT+1 。进而推出,我们之前讨论的上界就是与 Z T + 1 Z_{T+1} ZT+1 直接相关的。
接下来我们进一步讨论 Z t Z_t Zt 。如上,最终 Z t Z_t Zt 的递推式。因此,最后得出 Z T + 1 = N ∏ t = 1 T 2 ϵ ( 1 − ϵ t ) Z_{T+1}=N\prod_{t=1}^T 2\sqrt{\epsilon(1-\epsilon_t)} ZT+1=Nt=1T2ϵ(1ϵt)

这是小于 1 的,并且随着 T T T 变大,越来越小。

testing error still decrease?

如上,在 training data 上似乎已经没有可以学的东西,而在测试集上,error 还可以再下降。

这是为什么呢?如上,被融合的模型越多,方法越鲁棒。

如上,在模型多了(T 增大时),让 Adaboost 这个上界在减小。
如上,就算深度是 5 的决策树,这 10 棵树互补,都可以有很好的形状。

Gradient Boosting

Gradient Boosting 是一个更加 general 的版本。

如上,我们时刻在更新我们的 g ( x ) g(x) g(x) ,让其变得更好。
如上,问题来了,如何把 ∂ L ( g ) \partial L(g) L(g) 作为一个偏微分呢(把函数作为变量)?这在数学上其实是可行的。
如上,我们希望目标 f t f_t ft ∑ e x p ( . . . ) \sum exp(...) exp(...) 的方向越一致越好。即可转换成一个以最小化问题。

我们发现,我们找的 f f f 就是 Adaboost 中的 f f f 。而 α t \alpha_t αt 怎么找呢?

如上,我们找出的 α \alpha α 正好也是 Adaboost 的 α \alpha α

此外,使用 Gradient Boost 还可以自己做些变形。

Stacking

如上,模型融合。涉及到权重的问题。可以考虑学一个 Classifier ,来调整权重。

转载地址:http://jtlxf.baihongyu.com/

你可能感兴趣的文章
Leetcode 删除排序链表中的重复元素
查看>>
服务器修改端口
查看>>
微信学习资料
查看>>
JS(1) JavaScript 用法
查看>>
(六) JavaScript 对象
查看>>
开源项目(3-1)行为提取和动作识别
查看>>
[hbase] hbase 基础使用
查看>>
Android入门笔记10: AutoCompleteTextView 自动补全文本
查看>>
Android入门笔记16: EditText 和 返回键
查看>>
909422229_Jeesite多表联合列表分页实现
查看>>
909422229_阻塞与非阻塞的区别
查看>>
Node.js学习 - GET/POST
查看>>
CentOS7安装Nginx并部署
查看>>
Zookeeper安装使用及JavaAPI使用
查看>>
SQL Server中的数据类型
查看>>
SpringMVC学习系列(4) 之 数据绑定-1
查看>>
秒杀的基本知识点,了解一下
查看>>
Linux如何在系统启动时自动加载模块
查看>>
链路层到网络层的数据传递
查看>>
vxworks
查看>>