引言

这是统计学习方法的读书笔记。主要讲了提升方法,这是一种常用的机器学习方法。在分类问题中,它通过改变训练样本的权重,学习多个分类器,并将这些分类器进行线性组合,可以提高分类的性能。

上周看了这一章,再不记录下来自己都要忘记了

首先介绍代表性的提升方法AdaBoost。

AdaBoost方法

提升方法的基本思路

提升方法基于这样一种思想:对于一个复杂任务来说,将多个专家的判断进行适当的综合所得出的判断,要比其中任何一个专家单独的判断好。

在概率近似正确学习的框架中,一个概念(一个类),如果存在一个多项式的学习算法能够学习它,并且正确率很高,那么就称这个概念是强可学习的;如果学习的正确率只比随机猜测略好,那么就称这个概念是弱可学习的。后来证明强可学习与弱可学习是等价的。

这样一来,在机器学习中,如果已经发现了弱可学习算法,那么能否将它提升(boost)为强可学习算法。因为发现弱可学习算法要容易的多。

大多数的提升方法都是改变训练数据的概率分布(训练数据的权值分布),针对不同的训练数据分布调用弱可学习算法学习一系列弱分类器,最终将这些弱分类器组合成一个强分类器。

AdaBoost算法

假设给定一个二分类的训练数据集
T={(x1,y1),(x2,y2),⋯,(xN,yN)}T = \{(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N)\} T={(x1​,y1​),(x2​,y2​),⋯,(xN​,yN​)}

其中,每个样本点由实例与标记组成。实例xi∈X⊆Rnx_i \in X \subseteq R^nxi​∈X⊆Rn,标记yi∈Y={−1,+1}y_i \in Y = \{-1,+1\}yi​∈Y={−1,+1}。

这里要注意的是YYY的取值不是{1,0}\{1,0\}{1,0},而是{−1,+1}\{-1,+1\}{−1,+1}。

AdaBoost

输入:训练数据集TTT;弱可学习算法;
输出:最终分类器G(x)G(x)G(x)

  1. 初始化训练数据的权值分布(初始为同样的均值)
    D1=(w11,⋯,w1i,⋯,w1N),w1i=1N,i=1,2,⋯,ND_1 = (w_{11},\cdots,w_{1i},\cdots,w_{1N}), w_{1i} = \frac{1}{N},i = 1,2,\cdots,N D1​=(w11​,⋯,w1i​,⋯,w1N​),w1i​=N1​,i=1,2,⋯,N

  2. 对于m=1,2,⋯,Mm=1,2,\cdots,Mm=1,2,⋯,M(对应于MMM个模型)
    a. 使用具有权值分布DmD_mDm​的训练数据集学习,得到基本分类器
    Gm(x):X→{−1,+1}G_m(x) : X \rightarrow \{-1,+1\} Gm​(x):X→{−1,+1}
    b.计算Gm(x)G_m(x)Gm​(x) 在训练数据集上的分类误差率
    em=∑i=1NP(Gm(xi)≠yi)=∑i=1NwmiI(Gm(x)≠yi)(8.1)e_m = \sum_{i=1}^N P(G_m(x_i) \neq y_i) = \sum_{i=1}^N w_{mi} I(G_m(x) \neq y_i) \tag{8.1} em​=i=1∑N​P(Gm​(xi​)​=yi​)=i=1∑N​wmi​I(Gm​(x)​=yi​)(8.1)

    这里的III是指示函数,里面的条件成立返回111,否则返回000。

    分类误差率 = 判断结果不等于真实结果的概率,考虑权重的话,也就是计算分类错误的样本权重之和。一般我希望误差率要比随机猜测要好,可以去掉比随机猜测差的模型,或进行一些处理(下面的实例可以看到是如何处理的),以保证em≤0.5e_m \leq 0.5em​≤0.5。
    c. 计算Gm(x)G_m(x)Gm​(x)的系数(该模型的权重)
    αm=12log1−emem(8.2)\alpha_m = \frac{1}{2} log \frac{1 - e_m}{e_m} \tag{8.2} αm​=21​logem​1−em​​(8.2)
    因为我们说em≤0.5e_m \leq 0.5em​≤0.5,所以权重必然是大于等于0的。这一点很重要,我们可以通过它的函数图像来验证

    并且αm\alpha_mαm​随着eme_mem​的减小而增大,所以分类误差率越小的基本分类器在最终分类器中的作用越大。

    d. 更新训练数据的权值分布(增大误分类点的权重)
    Dm+1=(wm+1,1,⋯,wm+1,i,⋯,wm+1,N)(8.3)D_{m+1} = (w_{m+1,1},\cdots,w_{m+1,i},\cdots,w_{m+1,N}) \tag{8.3} Dm+1​=(wm+1,1​,⋯,wm+1,i​,⋯,wm+1,N​)(8.3)
    wm+1,i=wmiZmexp(−αmyiGm(xi)),i=1,2,⋯,N(8.4)w_{m+1,i} = \frac{w_{mi}}{Z_m}exp(-\alpha_m y_iG_m(x_i)), i = 1,2,\cdots,N \tag{8.4} wm+1,i​=Zm​wmi​​exp(−αm​yi​Gm​(xi​)),i=1,2,⋯,N(8.4)
    这里ZmZ_mZm​是规范化因子
    Zm=∑i=1Nwmiexp(−αmyiGm(xi))(8.5)Z_m = \sum_{i=1}^N w_{mi} exp(-\alpha_m y_iG_m(x_i)) \tag{8.5} Zm​=i=1∑N​wmi​exp(−αm​yi​Gm​(xi​))(8.5)
    它使Dm+1D_{m+1}Dm+1​成为一个概率分布。

这段比较长,先看下这个式子yiGm(xi)y_iG_m(x_i)yi​Gm​(xi​),当预测正确的时候,这个式子的结果是+1+1+1,同号相乘得正数;预测错误的时候为−1-1−1。所当预测正确的时候,exp(−αmyiGm(xi))exp(-\alpha_m y_iG_m(x_i))exp(−αm​yi​Gm​(xi​))的结果就是exp(−αm)exp(-\alpha_m)exp(−αm​);当预测错误的时候结果就是exp(αm)exp(\alpha_m)exp(αm​)。

exp(−αmyiGm(xi))={exp(−αm):yi=Gm(xi)exp(αm):yi≠Gm(xi)exp(-\alpha_m y_iG_m(x_i))= \left\{ \begin{array}{lr} exp(-\alpha_m) & : y_i = G_m(x_i)\\ exp(\alpha_m) & : y_i \neq G_m(x_i) \end{array} \right. exp(−αm​yi​Gm​(xi​))={exp(−αm​)exp(αm​)​:yi​=Gm​(xi​):yi​​=Gm​(xi​)​

上面我们说过em≤0.5e_m \leq 0.5em​≤0.5,当然em≥0e_m \geq 0em​≥0的。这里作为一个概率不能为负的。


而exe^xex的图像是这样的:

当分类正确时exp(−αm)<1exp(-\alpha_m) < 1exp(−αm​)<1,根据wm+1,i=wmiZmexp(−αmyiGm(xi))w_{m+1,i} = \frac{w_{mi}}{Z_m}exp(-\alpha_m y_iG_m(x_i))wm+1,i​=Zm​wmi​​exp(−αm​yi​Gm​(xi​)),也就是分类正确的样本权值会比之前的要小,反之,分类错误的样本权值要比之前要大。

那这里除以一个ZmZ_mZm​是干嘛的呢?看这个ZmZ_mZm​的式子,其实就是所有样本权值之和,让wmiexp(−αmyiGm(xi))w_{mi} exp(-\alpha_m y_iG_m(x_i))wmi​exp(−αm​yi​Gm​(xi​))除以ZmZ_mZm​就可以让

∑i=1Nwm+1,i=1\sum_{i=1}^N w_{m+1,i} = 1 i=1∑N​wm+1,i​=1

使得Dm+1D_{m+1}Dm+1​成为一个概率分布。

  1. 在构建好MMM个基本分类器模型后,最终构建基本分类器的线性组合
    f(x)=∑m=1MαmGm(x)(8.6)f(x) = \sum_{m=1}^M \alpha_m G_m(x) \tag{8.6} f(x)=m=1∑M​αm​Gm​(x)(8.6)
    得到最终分类器
    G(x)=sign(f(x))=sign(∑m=1MαmGm(x))(8.7)\begin{aligned} G(x) &= sign(f(x)) \\ & = sign\left(\sum_{m=1}^M \alpha_m G_m(x)\right) \tag{8.7} \end{aligned} G(x)​=sign(f(x))=sign(m=1∑M​αm​Gm​(x))​(8.7)
    其中signsignsign是符号函数。

    每个分类器误差率越小,权重越大。

如果上面的公式没看懂的话没关系,我们来看一个例子。

AdaBoost的例子(代码实现)

给定如表8.1所示训练数据,假设弱分类器由x<vx < vx<v或x>vx > vx>v产生,其阈值vvv使该分类器在训练数据集上分类误差率最低。用AdaBoost算法学习一个强分类器。

这里根据书上的过程自己算一遍也很简单,不过要注意的是,当误差率大于0.50.50.5时,这里直接取反即可。比如在x<vx < vx<v的情况下,就是把x<vx < vx<v 改成 x>vx > vx>v。

这里把整个过程用代码实现了一遍

# -*- coding: utf-8 -*
import numpy as np
import math
import collectionsClassifier = collections.namedtuple('Classifier', ['alpha', 'split', 'sign'])#当前分类器的权重 划分阈值 判断符号 class AdaBoost:def __init__(self, M):self.M = M #迭代的次数,也就是训练基本分类器的个数self.f = [] # 保持最终的分类器# 保持Gm新 sign表示符号 是 x < v 还是 x > 1def Gm(self, split, sign=1):r = self.x.copy()r[r < split] = 1 * signr[r > split] = -1 * signreturn r# 计算alphadef cal_alpha(self, error):return round(1 / 2 * math.log((1 - error) / error, math.e), 4)# 更新权重def update_weight(self, split, alpha, sign=1):g = self.Gm(split, sign)exp_result = np.exp(-1 * alpha * self.y * g)Z = np.sum(self.w * exp_result)return np.round(self.w * exp_result / Z, 5)# 计算错误次数,这里简单的用错误次数来代表错误率def cal_error_count(self):result = np.zeros((self.size,))for alpha, split, sign in self.f:result += alpha * self.Gm(split, sign)return sum(np.sign(result) != self.y)# 选择当前最好的阈值def choose_best_split(self):best_v, min_error, best_sign = -1, 1, 1# 尝试相连两个元素之间的均值作为阈值for i in range(1, self.size):v = (self.x[i - 1] + self.x[i]) / 2sign = 1error = sum(self.w[self.Gm(v) != self.y])# 如果错误率 > 0.5 ,则翻转符号,这样错误率就可以小于0.5if error > 0.5:error = 1 - errorsign = -1if error < min_error:best_v = vmin_error = errorbest_sign = signprint('best v:%s,best error :%s,error elements:%s' % (best_v, min_error, self.x[self.Gm(best_v, best_sign) != self.y]))return best_v, min_error, best_signdef fit(self, x, y):x.sort()self.x = xself.y = yself.size = len(x)self.w = np.ones((self.size,)) / self.size# 最多迭代M次for m in range(self.M):# 找到当前最好的划分split, error, sign = self.choose_best_split() # 计算出alphaalpha = self.cal_alpha(error)# 更新权重self.w = self.update_weight(split, alpha, sign)# 保持得到的基本分类器self.f.append(Classifier(alpha, split, sign))# 计算错误次数error_count = self.cal_error_count()# 如果没有一个样本分类错误,则停止整个过程if error_count == 0:break# 预测def _predict(self, single_x):result = 0for alpha, split, sign in self.f:result += alpha * (sign if single_x < split else -1 * alpha)return np.sign(result)def predict(self, x_test):return np.array([self._predict(r) for r in x_test])def __repr__(self):lc = ''for c in self.f:lc = lc + '%.4fGm(x,%s,%d)' % (c.alpha, c.split, c.sign) + '+'lc = lc[:-1]return 'sign[%s](error count is %d)' % (lc, self.cal_error_count())if __name__ == '__main__':# 进行训练x = np.arange(10)y = np.array([1,1,1,-1,-1,-1,1,1,1,-1])ab = AdaBoost(5)ab.fit(x,y)# 训练结束,打印信息print(ab)# 进行测试print(ab.predict(np.array([3,1,5]))) # [-1.  1. -1.]

这里只学习了3个模型就可以达到准确率为100%了。

best v:2.5,best error :0.30000000000000004,error elements:[6 7 8] #第一个模型阈值为2.5,分类错误的元素是 6 7 8
best v:8.5,best error :0.21428999999999998,error elements:[3 4 5] #第二个模型阈值为8.5,分类错误的元素是 3 4 5
best v:5.5,best error :0.1818399999999999,error elements:[0 1 2 9]

并且输出了最终分类器:

sign[0.4236Gm(x,2.5,1)+0.6496Gm(x,8.5,1)+0.7520Gm(x,5.5,-1)](error count is 0)

可以根据这个代码结合书上的讲解去理解AdaBoost的思想。

AdaBoost算法的训练误差分析

AdaBoost能在学习过程中不断减少训练误差,即在训练数据集上的分类误差率。
这个误差率可以用下面的公式来计算:
1N∑i=1NI(G(xi)≠yi)\frac{1}{N}\sum_{i=1}^N I(G(x_i) \neq y_i) N1​i=1∑N​I(G(xi​)​=yi​)

这里的G(x)G(x)G(x) 为

G(x)=sign(∑m=1MαmGm(x))G(x) = sign\left(\sum_{m=1}^M \alpha_m G_m(x)\right) G(x)=sign(m=1∑M​αm​Gm​(x))

定理8.1 AdaBoost的训练误差界

1N∑i=1NI(G(xi)≠yi)≤1N∑iexp(−yif(xi))=∏mZm(8.9)\frac{1}{N}\sum_{i=1}^N I(G(x_i) \neq y_i) \leq \frac{1}{N}\sum_i exp(-y_if(x_i)) = \prod_m Z_m \tag{8.9} N1​i=1∑N​I(G(xi​)​=yi​)≤N1​i∑​exp(−yi​f(xi​))=m∏​Zm​(8.9)

我们先看1N∑i=1NI(G(xi)≠yi)≤1N∑iexp(−yif(xi))\frac{1}{N}\sum_{i=1}^N I(G(x_i) \neq y_i) \leq \frac{1}{N}\sum_i exp(-y_if(x_i))N1​∑i=1N​I(G(xi​)​=yi​)≤N1​∑i​exp(−yi​f(xi​))

这里的III是指示函数,里面的条件成立返回111,否则返回000。

首先对于正确分类的点来说(指示函数里面的条件不成立),I(G(xi)≠yi)=0≤exp(−yif(xi))=e−1I(G(x_i) \neq y_i) = 0 \leq exp(-y_if(x_i)) = e^{-1}I(G(xi​)​=yi​)=0≤exp(−yi​f(xi​))=e−1
对于错误分类的点来说(指示函数里面的条件成立),I(G(xi)≠yi)1≤exp(−yif(xi))=e1I(G(x_i) \neq y_i) 1 \leq exp(-y_if(x_i)) = e^1I(G(xi​)​=yi​)1≤exp(−yi​f(xi​))=e1

所以式(8.9)(8.9)(8.9)第一个不等号是很好推的,接下来推右边的等式。

ZmZ_mZm​在(8.4)(8.4)(8.4)和(8.5)(8.5)(8.5)中出现。


先对(8.4)(8.4)(8.4)进行一个变形,把分母上的ZmZ_mZm​乘到左边去:

Zm⋅wm+1,i=wmiexp(−αmyiGm(xi))Z_m \cdot w_{m+1,i} = w_{mi} exp(-\alpha_m y_iG_m(x_i)) Zm​⋅wm+1,i​=wmi​exp(−αm​yi​Gm​(xi​))
这里说的是样本下一轮的权重和本轮的权重之间的关系。
因为这里有个wm+1,1w_{m+1,1}wm+1,1​,我们可以想到

Z1⋅w2,i=w1,iexp(−α1yiG1(xi))Z2⋅w3,i=w2,iexp(−α2yiG2(xi))⋮ZM−1⋅wM,i=wM−1,iexp(−αM−1yiGM−1(xi))Z_1\cdot w_{2,i} = w_{1,i} exp(-\alpha_1 y_iG_1(x_i)) \\ Z_2\cdot w_{3,i} = w_{2,i} exp(-\alpha_2 y_iG_2(x_i)) \\ \vdots \\ Z_{M-1}\cdot w_{M,i} = w_{M-1,i} exp(-\alpha_{M-1} y_iG_{M-1}(x_i)) \\ Z1​⋅w2,i​=w1,i​exp(−α1​yi​G1​(xi​))Z2​⋅w3,i​=w2,i​exp(−α2​yi​G2​(xi​))⋮ZM−1​⋅wM,i​=wM−1,i​exp(−αM−1​yi​GM−1​(xi​))

如果把上面这很多个式子中,等式左边相乘,等式右边也相乘的话,可以约掉相同项,得:

Z1⋅w2,i=w1,iexp(−α1yiG1(xi))Z2⋅w3,i=w2,iexp(−α2yiG2(xi))⋮ZM−1⋅wM,i=wM−1,iexp(−αM−1yiGM−1(xi))Z_1\cdot \bcancel{w_{2,i}} = w_{1,i} exp(-\alpha_1 y_iG_1(x_i)) \\ Z_2\cdot \bcancel{w_{3,i}} = \bcancel{w_{2,i}} exp(-\alpha_2 y_iG_2(x_i)) \\ \vdots \\ Z_{M-1}\cdot w_{M,i} = \bcancel{w_{M-1,i}} exp(-\alpha_{M-1} y_iG_{M-1}(x_i)) \\ Z1​⋅w2,i​​=w1,i​exp(−α1​yi​G1​(xi​))Z2​⋅w3,i​​=w2,i​​exp(−α2​yi​G2​(xi​))⋮ZM−1​⋅wM,i​=wM−1,i​​exp(−αM−1​yi​GM−1​(xi​))

整理一下得(右边利用了ea⋅eb=ea+be^a \cdot e^b = e^{a+b}ea⋅eb=ea+b)

∏mM−1Zm⋅WM,i=w1,iexp(−yi∑m=1M−1αmGm(xi))\prod_m^{M-1} Z_m \cdot W_{M,i} = w_{1,i} exp (-y_i \sum_{m=1}^{M-1} \alpha_mG_m(x_i)) m∏M−1​Zm​⋅WM,i​=w1,i​exp(−yi​m=1∑M−1​αm​Gm​(xi​))

观察上式和(8.9)(8.9)(8.9)式的区别可知上式中,左边少了个 ZMZ_MZM​,多了个WM,iW_{M,i}WM,i​;右边指数函数中少加了个αMGM(xi))\alpha_MG_M(x_i))αM​GM​(xi​))


我们让左右两边同时乘以exp(−yiαMGM(xi))exp(-y_i\alpha_MG_M(x_i))exp(−yi​αM​GM​(xi​)),
∏mM−1Zm⋅WM,i⋅exp(−yiαMGM(xi))=1Nexp(−yi∑m=1M−1αmGm(xi))⋅exp(−yiαMGM(xi))\prod_m^{M-1} Z_m \cdot W_{M,i} \cdot exp(-y_i\alpha_MG_M(x_i))= \frac{1}{N}exp (-y_i \sum_{m=1}^{M-1} \alpha_mG_m(x_i)) \cdot exp(-y_i\alpha_MG_M(x_i)) m∏M−1​Zm​⋅WM,i​⋅exp(−yi​αM​GM​(xi​))=N1​exp(−yi​m=1∑M−1​αm​Gm​(xi​))⋅exp(−yi​αM​GM​(xi​))

因为w1,iw_{1,i}w1,i​是首轮的权值,为1N\frac{1}{N}N1​,把上式左边整理一下得:

∏mM−1Zm⋅WM,i⋅exp(−yiαMGM(xi))=1Nexp(−yi∑m=1MαmGm(xi))\prod_m^{M-1} Z_m \cdot W_{M,i} \cdot exp(-y_i\alpha_MG_M(x_i))= \frac{1}{N}exp (-y_i \sum_{m=1}^{M} \alpha_mG_m(x_i)) m∏M−1​Zm​⋅WM,i​⋅exp(−yi​αM​GM​(xi​))=N1​exp(−yi​m=1∑M​αm​Gm​(xi​))

上面得到的式子是针对单个样本点iii的,而(8.9)(8.9)(8.9)是针对所有样本点的,所以两边都对所有样本点求和得:
∏mM−1Zm⋅∑i=1NWM,i⋅exp(−yiαMGM(xi))=1N∑i=1N(exp(−yi∑m=1MαmGm(xi)))\prod_m^{M-1} Z_m \cdot \sum_{i=1}^N W_{M,i} \cdot exp(-y_i\alpha_MG_M(x_i))= \frac{1}{N} \sum_{i=1}^N\left(exp (-y_i \sum_{m=1}^{M} \alpha_mG_m(x_i))\right) m∏M−1​Zm​⋅i=1∑N​WM,i​⋅exp(−yi​αM​GM​(xi​))=N1​i=1∑N​(exp(−yi​m=1∑M​αm​Gm​(xi​)))
根据公式(8.5)(8.5)(8.5)和公式(8.6)(8.6)(8.6),得

∏mMZm=1N∑i=1Nexp(−yif(xi))\prod_m^{M} Z_m = \frac{1}{N} \sum_{i=1}^N exp (-y_i f(x_i)) m∏M​Zm​=N1​i=1∑N​exp(−yi​f(xi​))

证明完毕。

这个定理告诉我们,训练误差可以表示为ZmZ_mZm​的连乘。我们要让训练误差比较小的话,只要最小化每个ZmZ_mZm​就可以了。

Zm=∑i=1Nwmiexp(−αmyiGm(xi))Z_m = \sum_{i=1}^N w_{mi} exp(-\alpha_m y_iG_m(x_i)) Zm​=i=1∑N​wmi​exp(−αm​yi​Gm​(xi​))

再来看下ZmZ_mZm​的式子,我们再每个循环里面,wmiw_{mi}wmi​是上一轮循环里面得到的,GmG_mGm​是本轮训练得到的。未知的是αm\alpha_mαm​,我们就可以通过最小化ZmZ_mZm​来求αm\alpha_mαm​。

令∂Zm∂αm=0\frac{\partial Z_m}{\partial \alpha_m} = 0∂αm​∂Zm​​=0,这样可以求得最小的αm\alpha_mαm​为下式:
αm=12log1−emem\alpha_m = \frac{1}{2} log \frac{1 - e_m}{e_m} αm​=21​logem​1−em​​

这也是书上为我们提供的计算方法。

定义8.2 二分类问题AdaBoost的训练误差界

∏m=1MZm=∏m=1M[2em(1−em)]=∏m=1M1−4γm2≤exp(−2∑m=1Mγm2)(8.10)\begin{aligned} \prod_{m=1}^M Z_m &= \prod_{m=1}^M [2\sqrt{e_m(1-e_m)}]\\ & = \prod_{m=1}^M \sqrt{1 - 4\gamma^2_m} \\ &\leq exp \left(-2 \sum_{m=1}^M \gamma^2_m\right) \tag{8.10} \end{aligned} m=1∏M​Zm​​=m=1∏M​[2em​(1−em​)​]=m=1∏M​1−4γm2​​≤exp(−2m=1∑M​γm2​)​(8.10)

这里γ=12−em\gamma = \frac{1}{2} - e_mγ=21​−em​

证明,由式(8.5)(8.5)(8.5)和(8.8)(8.8)(8.8)得

Zm=∑i=1Nwmiexp(−αmyiGm(xi))=∑yi=Gm(xi)wmie−αm+∑yi≠Gm(xi)wmieαm\begin{aligned} Z_m &= \sum_{i=1}^N w_{mi} exp(-\alpha_m y_i G_m(x_i)) \\ &= \sum_{y_i=G_m(x_i)} w_{mi} e^{-\alpha_m} +\sum_{y_i\neq G_m(x_i)} w_{mi} e^{\alpha_m} \end{aligned} Zm​​=i=1∑N​wmi​exp(−αm​yi​Gm​(xi​))=yi​=Gm​(xi​)∑​wmi​e−αm​+yi​​=Gm​(xi​)∑​wmi​eαm​​
这一步就是根据yiGm(xi)y_i G_m(x_i)yi​Gm​(xi​)在判断正确的情况下为+1+1+1,错误的情况下为−1-1−1得到的。

Zm=∑i=1Nwmiexp(−αmyiGm(xi))=∑yi=Gm(xi)wmie−αm+∑yi≠Gm(xi)wmieαm=(1−em)e−αm+emeαm\begin{aligned} Z_m &= \sum_{i=1}^N w_{mi} exp(-\alpha_m y_i G_m(x_i)) \\ &= \sum_{y_i=G_m(x_i)} w_{mi} e^{-\alpha_m} +\sum_{y_i\neq G_m(x_i)} w_{mi} e^{\alpha_m} \\ &= (1 - e_m) e^{-\alpha_m} + e_m e^{\alpha_m} \end{aligned} Zm​​=i=1∑N​wmi​exp(−αm​yi​Gm​(xi​))=yi​=Gm​(xi​)∑​wmi​e−αm​+yi​​=Gm​(xi​)∑​wmi​eαm​=(1−em​)e−αm​+em​eαm​​
这一步是当yi=Gm(xi)y_i=G_m(x_i)yi​=Gm​(xi​)时,对判断结果求乘以一个−1-1−1。

Zm=∑i=1Nwmiexp(−αmyiGm(xi))=∑yi=Gm(xi)wmie−αm+∑yi≠Gm(xi)wmieαm=(1−em)e−αm+emeαm=2em(1−em)=1−4γm2\begin{aligned} Z_m &= \sum_{i=1}^N w_{mi} exp(-\alpha_m y_i G_m(x_i)) \\ &= \sum_{y_i=G_m(x_i)} w_{mi} e^{-\alpha_m} +\sum_{y_i\neq G_m(x_i)} w_{mi} e^{\alpha_m} \\ &= (1 - e_m) e^{-\alpha_m} + e_m e^{\alpha_m} \\ &= 2\sqrt{e_m(1-e_m)} \\ &= \sqrt{1 - 4\gamma_m^2} \end{aligned} Zm​​=i=1∑N​wmi​exp(−αm​yi​Gm​(xi​))=yi​=Gm​(xi​)∑​wmi​e−αm​+yi​​=Gm​(xi​)∑​wmi​eαm​=(1−em​)e−αm​+em​eαm​=2em​(1−em​)​=1−4γm2​​​

那么不等式
∏m=1M1−4γm2≤exp(−2∑m=1Mγm2)\prod_{m=1}^M \sqrt{1 - 4\gamma_m^2} \leq exp\left(-2\sum_{m=1}^M \gamma_m^2\right) m=1∏M​1−4γm2​​≤exp(−2m=1∑M​γm2​)
是怎么证明的呢,书上给出了提示,用泰勒展开式。

我们先去掉连乘符号。

右边有
exp(−2∑m=1Mγm2)=∏m=1Mexp(−2γm2)exp\left(-2\sum_{m=1}^M \gamma_m^2\right) = \prod_{m=1}^M exp(-2 \gamma_m^2) exp(−2m=1∑M​γm2​)=m=1∏M​exp(−2γm2​)

也就是只要证明1−4γ2≤exp(−2γ2)\sqrt{1 - 4\gamma^2} \leq exp(-2\gamma^2)1−4γ2​≤exp(−2γ2)

关于泰勒公式,可以参阅人工智能数学基础之高等数学

下面用泰勒展开来证明,利用点x=0x=0x=0 的泰勒展开式,
首先看1−4γ2\sqrt{1 - 4\gamma^2}1−4γ2​的泰勒展开,可以令4γ2=x4\gamma^2 =x4γ2=x,也就是f(x)=1−x=(1−x)12f(x) = \sqrt{1 - x} = (1-x)^{\frac{1}{2}}f(x)=1−x​=(1−x)21​。我们要求泰勒展开,就是要求f(x)f(x)f(x)的导数,这里只要求前两阶导数就够了。

f(x)=(1−x)12f′(x)=−12(1−x)−12f′′(x)=−14(1−x)−32f(x) = (1-x)^{\frac{1}{2}} \\ f^\prime(x) = - \frac{1}{2} (1-x) ^{-\frac{1}{2}} \\ f^{\prime\prime}(x) = - \frac{1}{4} (1-x) ^{-\frac{3}{2}} \\ f(x)=(1−x)21​f′(x)=−21​(1−x)−21​f′′(x)=−41​(1−x)−23​

那么

f(x)=f(0)+xf′(0)+12x2f′′(0)+⋯≈1−12x−18x2\begin{aligned} f(x) &= f(0) + xf^\prime(0) + \frac{1}{2}x^2f^{\prime\prime}(0) + \cdots \\ &\approx 1 - \frac{1}{2}x - \frac{1}{8}x^2 \end{aligned} f(x)​=f(0)+xf′(0)+21​x2f′′(0)+⋯≈1−21​x−81​x2​

把4γ24\gamma^24γ2代入上式中xxx得

f(4γ2)≈1−2γ2−2γ4f(4\gamma^2) \approx 1 - 2\gamma^2 - 2\gamma^4f(4γ2)≈1−2γ2−2γ4

接下来来看exp(−2γ2)exp(-2 \gamma^2)exp(−2γ2),令−2γ2=x-2\gamma^2 =x−2γ2=x,得g(x)=exg(x) = e^xg(x)=ex

g(x)=exg′(x)=exg′′(x)=exg(x) = e^x\\ g^\prime(x) = e^x\\ g^{\prime\prime}(x) =e^x\\ g(x)=exg′(x)=exg′′(x)=ex

那么

g(x)=g(0)+xg′(0)+12x2g′′(0)+⋯≈1+12x+12x2\begin{aligned} g(x) &=g(0) + xg^\prime(0) + \frac{1}{2}x^2g^{\prime\prime}(0) + \cdots \\ &\approx 1 + \frac{1}{2}x + \frac{1}{2}x^2 \end{aligned} g(x)​=g(0)+xg′(0)+21​x2g′′(0)+⋯≈1+21​x+21​x2​

g(−2γ2)≈1−2γ2+2γ4g(-2\gamma^2) \approx 1 - 2 \gamma^2 + 2 \gamma^4g(−2γ2)≈1−2γ2+2γ4

这里γ=12−em\gamma = \frac{1}{2} - e_mγ=21​−em​,因此γ\gammaγ的取值范围是[0,12][0,\frac{1}{2}][0,21​],因为em≤12e_m \leq \frac{1}{2}em​≤21​

所以当更高阶出现的时候,后面的高阶项约等于0了。

所以只要判断f(4γ2)≈1−2γ2−2γ4f(4\gamma^2) \approx 1 - 2\gamma^2 - 2\gamma^4f(4γ2)≈1−2γ2−2γ4
和g(−2γ2)≈1−2γ2+2γ4g(-2\gamma^2) \approx 1 - 2 \gamma^2 + 2 \gamma^4g(−2γ2)≈1−2γ2+2γ4的大小即可。

显然1−2γ2−2γ4≤1−2γ2+2γ41 - 2\gamma^2 - 2\gamma^4 \leq 1 - 2 \gamma^2 + 2 \gamma^41−2γ2−2γ4≤1−2γ2+2γ4,当em=12e_m = \frac{1}{2}em​=21​时,γ=0\gamma=0γ=0,不等式两边相等。

证明完毕。

∏m=1MZm≤exp(−2∑m=1Mγm2)\prod_{m=1}^M Z_m \leq exp \left(-2 \sum_{m=1}^M \gamma^2_m\right) m=1∏M​Zm​≤exp(−2m=1∑M​γm2​)

这个式子有什么意义了呢,因为γ\gammaγ的取值范围是[0,12][0,\frac{1}{2}][0,21​],说明训练误差会随着训练论轮数的增加而减少;同时训练误差是以指数速率下降的。

AdaBoost算法的解释

AdabBoost算法还有另一个解释,即可以认为AdaBoost算法是模型为加法模型、损失函数为指数函数、学习算法为前向分布算法时的二分类学习方法。

前向分步算法

考虑加法模型(additive model)
f(x)=∑m=1Mβmb(x;γm)(8.13)f(x) = \sum_{m=1}^M \beta_mb(x;\gamma_m) \tag{8.13} f(x)=m=1∑M​βm​b(x;γm​)(8.13)

其中,b(x;γm)b(x;\gamma_m)b(x;γm​)为基函数,γm\gamma_mγm​为基函数的参数。显然式(8.6)(8.6)(8.6)是一个加法模型。

前向分布算分的步骤如下:

  1. 初始化f0(x)=0f_0(x)=0f0​(x)=0
  2. 对m=1,2,⋯,Mm=1,2,\cdots,Mm=1,2,⋯,M
    1. 极小化损失函数
      (βm,γm)=arg⁡min⁡β,γ∑i=1NL(yi,fm−1(xi)+βb(xi;γ))(8.16)(\beta_m,\gamma_m) = \arg\,\min_{\beta,\gamma}\sum_{i=1}^N L(y_i,f_{m-1}(x_i) + \beta b(x_i;\gamma)) \tag{8.16} (βm​,γm​)=argβ,γmin​i=1∑N​L(yi​,fm−1​(xi​)+βb(xi​;γ))(8.16)
      得到参数βm,γm\beta_m,\gamma_mβm​,γm​
    2. 更新
      fm(x)=fm−1(x)+βmb(x;γm)(8.17)f_m(x) = f_{m-1}(x) + \beta_mb(x;\gamma_m) \tag{8.17} fm​(x)=fm−1​(x)+βm​b(x;γm​)(8.17)
  3. 得到加法模型
    f(x)=fM(x)=∑m−1Mβmb(x;γm)(8.18)f(x) = f_M(x) = \sum_{m-1}^M\beta_mb(x;\gamma_m) \tag{8.18} f(x)=fM​(x)=m−1∑M​βm​b(x;γm​)(8.18)

这样前向分步算分将同时求解从m=1m=1m=1到MMM所有参数βm,γm\beta_m,\gamma_mβm​,γm​的优化问题简化为逐次求解各个βm,γm\beta_m,\gamma_mβm​,γm​的优化问题。

AdaBoost算分是前向分布加法算分的特例,这时,模型是由基本分类器组成的加法模型,损失函数是指数函数。

提升树

提升方法实际采用加法模型(即基函数的线性组合)与前向分步算法。以决策树为基函数的提升方法称为提升树(boosting tree) 。
对分类问题决策树是二叉分类树,对回归问题决策树是二叉回归树。

提升树模型可以表示为决策树的加法模型:
fM(x)=∑m=1MT(x;Θm)f_M(x) = \sum_{m=1}^MT(x;\Theta_m) fM​(x)=m=1∑M​T(x;Θm​)

关于代码示例可见机器学习入门——图解集成学习(附代码)

参考

  1. 统计学习方法

《统计学习方法》——提升算法相关推荐

  1. 重磅开源!所有的李航老师《统计学习方法》算法代码实现!!!

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 超有料的仓库项目资源---<统计学习方法>代码 李航老师的<统计 ...

  2. 统计学习方法--提升方法adaBoost算法(集成学习)

    1.主要内容 介绍集成学习,然后讲述boosting和bagging的区别与联系,同时对adaBoost进行推导然后进行gbdt的推导,最后比较随机森林和gdbt的区别和联系. 2.集成学习 集成学习 ...

  3. 《统计学习方法》算法学习笔记(四)之 决策树(上)

    决策树 总述 决策树是一种基本的分类与回归方法,本节主要讨论用于分类的决策树.决策树呈树状结构,在分类问题中,表示基于特征对实例进行分类的过程.它可以认为是if-then规则的集合,也可以认为是定义在 ...

  4. 李航统计学习方法EM算法三枚硬币例子Q函数推导

    具体推导如下: 上面推导省略了第i次迭代的i的标记 当得到上式以后,可以参考 http://www.cnblogs.com/Determined22/p/5776791.html 来继续一下推导 当然 ...

  5. 08_提升方法Boosting2_统计学习方法

    文章目录 三.GBDT算法 1.提升树算法 (1)算法三要素 (2)GBDT与AdaBoost区别 2.平方损失的提升树 3.梯度提升树(Gradient Boosting Decison Tree, ...

  6. 08_提升方法Boosting1_统计学习方法

    文章目录 一.Boosting和集成学习介绍 二.AdaBoost 1.AdaBoost算法 (1)AdaBoost算法的三要素 (2)AdaBoost模型定义 (3)AdaBoost损失函数定义 ( ...

  7. 统计学习方法(一)——统计学习方法概论

    文章作者:Tyan 博客:noahsnail.com  |  CSDN  |  简书 1. 统计学习方法概论 本文是统计学习方法(李航)第一章的学习总结. 1.1 统计学习 1.统计学习的特点 统计学 ...

  8. 09_期望极大法EM1_统计学习方法

    文章目录 一.EM算法的引入 1.极大似然估计 2.EM入场 二.EM算法推导 1.Jensen不等式 2.EM推导过程 (1)统计学习方法EM推导 (2)Andrew NG关于EM算法的推导 3.统 ...

  9. 统计学习方法第八章作业:分类问题AdaBoost算法、回归问题提升树算法 代码实现

    分类问题AdaBoost算法 import math import numpy as npclass Adaboost_tree:def __init__(self,X,Y,feature_type= ...

  10. 开源!北大研究生把《统计学习方法》书中全部算法都实现了!

    来源:开源最前线(ID:OpenSourceTop) 一个好的开源项目分享给大家. <统计学习方法>可以说是机器学习的入门宝典,许多机器学习培训班.互联网企业的面试.笔试题目,很多都参考这 ...

最新文章

  1. 新书上市|当我们讨论“量子计算”时我们在讨论什么?
  2. Bert 如何解决长文本问题?
  3. 第二十一讲 特征值和特征向量
  4. Python中的and和or
  5. 【机器学习】图解机器学习中的 12 种交叉验证技术
  6. 版本变迁_上新了!隋唐洛阳城应天门3D投影秀更新版本!(附视频)
  7. Spring Singleton,请求,会话Bean和线程安全
  8. NSIS:判断并安装.NET Framework 4 的例子
  9. mysql 键缓冲区_mysql:键缓存
  10. PBOC规范研究之六、变长记录文件(转)
  11. Python中如何获得数组或者列表按大小排序后元素的索引列表
  12. 9 线性表-队列-链式存储
  13. win10电脑桌面html,手把手教你美化win10电脑桌面的小技巧
  14. java 登录md5加密_javaMD5加密及登录验证(备忘)
  15. 关于socket阻塞与非阻塞情况下的recv、seng、read、write返回值问题
  16. 亲手制作:超级DOS工具+Vista+加强版WindowsXP Lite5.8集成
  17. 修复windows系统引导
  18. C++ 数据存储类型
  19. 题解 P4460 【[CQOI2018]解锁屏幕】
  20. SELECT * FROM DUAL中的DUAL是什么?

热门文章

  1. 将Java程序作成exe文件的几种方法
  2. java day55【 Mybatis 连接池与事务深入 、 Mybatis 的动态 SQL 语句、 Mybatis 多表查询之一对多 、 Mybatis 多表查询之多对多】...
  3. 数据库大并发操作要考虑死锁和锁的性能问题
  4. HNOI2017 滚粗记
  5. java之重定向与转发
  6. Android中ListView动态加载数据
  7. DEDE 文章常用标签
  8. (Markdown图片居中)CSDN 验证通过
  9. 使用Nexus3搭建Maven私服+上传第三方jar包到本地maven仓库
  10. 使用Python进行描述性统计