Bagging与Boosting大法好

1.Bias v.s. Variance

  • 复杂model:large Variance,small Bias
  • 简单model:large Bias,small Variance

因为考虑做10次实验,sample不同的data来训练模型。简单的模型受data的影响较小,Variance较小;而复杂模型受data影响大,10次实验的结果分散较开,Variance大。

所以我们可以考虑把复杂模型的10次output取平均,这样可以减少方差:Var(1mT(x))=1mVar(T(x))
该公式成立的条件是各个model相互独立,而使得各model独立的一个方法,就是让它们在不同的训练集上训练,这就是Bagging的思想。

2. Bagging

Bagging的思想是每次从N笔的training example中sample出N’笔example data set,注意是有放回的(Boostrap)。

每一笔data set都去train出一个model,这样model之间就是不相关的,各自的error都是random的,而一堆random的error的均值是0。因此最后把testing data丢到不同的model里面,把结果做average/voting,最终得到的误差理论上为0,方差也可以降为 1/N

Bagging适用于复杂的model,即bias小、Variance大、容易过拟合的model——比如决策树。

决策树只要深度够深,一定可以达到0%的Error,因此非常容易overfitting。

防止决策树overfitting的方法就是Random Forest—对决策树做Bagging。

Out-of-Bag error:

假设现在只有 x1 ~ x4 笔data,每次只选其中一部分来train(圆圈表示选中),在做validation的时候,用没有选中的data来test Function。

3. Boosting

可以把准确率在50%以上一点点的弱分类器组合得到0%error的强分类器。

训练步骤:

Bagging与Boosting大法好

注意:Bagging中不同的分类器的训练是独立的,而boost是sequential的。

Q1:如何找到和 f1(x) 互补的 f2(x)(different classifier)?

A:在不同的数据集上训练。

Q2:如何得到不同的训练集?

  1. Re-sampling your training data to a new dataset

    • 但是sample只能取整数的次数,不可能sample 0.5次
  2. Re-weighting your training data to a new dataset

    • 给training data不同的weight

    • 相当于修改了objective Function:L(f)=n(l(f(xn),y^n))L(f)=n(unl(f(xn),y^n))

      un 代表的是第 n 笔data的weight,它乘上loss表示这笔data在training data里出现了 un 次(这样可以使得sample的次数包含小数)。

4. AdaBoost

Bagging与Boosting大法好

假设已经得到一个分类器 f1,现在要训练另一个分类器 f2,它和 f1互补,即要让 f2 接受 f1 没有看过的training set,f1 在这个set上表现很差,这样 f2f1 就可以实现互补。

Q1:怎么找到这个training set?

A1:调整这个training set的weight。

4.1 定义error rate

定义 f1 的error rate:ε1

  • 首先计算分母 Z1Z1 是所有training example的weight总和。

  • 分子是,看所有的training example里面哪些example的答案是错的,即 f1 的output和它的target的值不一样。把这些错误的example乘上它们对应的weight,再把它们加起来。

    ε1 是一定的,因为一个分类器如果error rate大于0.5,只需要把类别调换即可。

接下来我们希望把这些example的weight u1n 进行更新得到 u2n,使得 f1 在新的weight u2n 上的error rate等于0.5(最低),之后再把 f2 用这组新的weight进行训练。这样得到的 f2 就和 f1 是互补的。

4.2 如何更新weight

weight更新的方法:

  • f1 分类对的data,就把这些样本弱化,乘上 1d1

  • f1 分类错的data,就把它们的weight放大 d1 倍,d1=1ε1ε1>1

    这样就可以故意让f1不及格(error rate=0.5),嘻嘻

Bagging与Boosting大法好

d1 怎么定义?

Bagging与Boosting大法好

Bagging与Boosting大法好

4.3 AdaBoost算法框架

Bagging与Boosting大法好

这里 αt 取对数主要是为了简化红框中的式子为exp(…)

y^nft(xn):如果分类正确,等于-1;分类错误,等于1

  1. 要做binary classification,y=±1,假设最开始都有一个weight,u1n=1
  2. for t=1...T(我们要找T个分类器,再把这T个分类器combine起来):
    • 在第 t 次iteration的时候,用来train第 t 个分类器 ft(x) 的weight写作 ut1,,utN
    • 计算第 t 个分类器的error rate
    • 接下来要train第 t+1 个分类器 ft+1(x) 时,改变 ut 的weight为 ut+1n,让它削弱第 t 个分类器
      Bagging与Boosting大法好
  3. 得到这些分类器之后,要把它们combine起来:
    • 需要给这些分类器乘上一个weight αt,加起来,再最后取它们的正负号,来决定分类。
    • εt 越小,αt 越大,即某分类器的error越小,最后voting的时候它占的权值应该越大,反之亦然。

5. Gradient Boosting

5.1 Boosting的一般框架

Bagging与Boosting大法好

  • 一开始有一个initial的Function g0(x),无论Input什么东西,output都是0.
  • T次迭代中:
    • 每次都找到一个weak的classifier ft(x) ,它有一个weight叫 αt,这个 ft(x)αt,会impove gt1(x)
    • gt1(x) 是前面 t1 个classifier的加权和
    • 然后更新 gt(x)
  • 最后把 T 个classifier加权得到Strong的classifier

5.2 如何找到 ft(x) 和对应的 αt

因为要找到一个object function g(x),所以定义一个 g 的cost function L(g),这个cost function可以自己随便定,现在我们设定为 nexp(y^ng(xn)),如果 yg 同号,这个值很小;如果 yg 异号,则这个值很大,刚好符合我们cost function的要求。

所以我们的目标就是要minimize这个cost function。

接下来用gradient boosting训练。

5.3 Gradient Boosting

Bagging与Boosting大法好

如果我们已经有一个Function gt1(x),我们应该怎么样update这个 gt1(x),让它加上什么东西,才能让cost function变得更小呢?

  • 一种方法就是Gradient Descent,如上图所示,把 gt1(x) 沿梯度下降的方向更新,从而使得 L(g) 变小。
  • 而按照Boosting的思路,我们是要往 gt1(x) 里面加上一个 αtft(x)

所以,在Boosting的思想中加上一个新的分类器这件事就等同于是梯度下降法中的把分类函数 g 往梯度下降的方向更新。所以上图中两个红色方框中的式子应该是同向的(梯度下降的方向),scale可以不一样(因为乘上了learning rate ηαt)。

而:

L(g)g(x)=nexp(y^ngt1(xn))(y^n)=nexp(y^ngt1(xn))y^n

因为 ηα 都是只起scale的作用,所以可以只考虑 ft(x)nexp(y^ngt1(xn))y^n。又因为同向的向量内积最大,所以要让这两个向量同向等价于maximizing这两个vector(每个输入 x 都有一个对应的输出,把这些输入排在一起就形成了一个vector)的inner product:nexp(y^ngt1(xn))y^nft(xn)

  • y^nft(xn) 同前面一样,当分类正确是为1,分类错误为-1。我们要maximize这个inner product的式子,就希望分类正确的情况越多越好(+1);
  • exp(y^ngt1(xn)) 表示 xn这个样本的weight utn,所以希望weight比较大的样本它们的分类尽量是正确的,这样inner product才会越大。

Bagging与Boosting大法好

上图最后推导出AdaBoost里面采用的更新权重的公式,可见Adaboost其实就是在minimize exp() loss function。

αt 也刚好是AdaBoost里面找出来的 αt

Bagging与Boosting大法好