《统计学习方法》——提升算法
引言
这是统计学习方法的读书笔记。主要讲了提升方法,这是一种常用的机器学习方法。在分类问题中,它通过改变训练样本的权重,学习多个分类器,并将这些分类器进行线性组合,可以提高分类的性能。
上周看了这一章,再不记录下来自己都要忘记了
首先介绍代表性的提升方法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)
初始化训练数据的权值分布(初始为同样的均值)
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对于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∑NP(Gm(xi)=yi)=i=1∑NwmiI(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=21logem1−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=Zmwmiexp(−αmyiGm(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∑Nwmiexp(−αmyiGm(xi))(8.5)
它使Dm+1D_{m+1}Dm+1成为一个概率分布。
这段比较长,先看下这个式子yiGm(xi)y_iG_m(x_i)yiGm(xi),当预测正确的时候,这个式子的结果是+1+1+1,同号相乘得正数;预测错误的时候为−1-1−1。所当预测正确的时候,exp(−αmyiGm(xi))exp(-\alpha_m y_iG_m(x_i))exp(−αmyiGm(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(−αmyiGm(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=Zmwmiexp(−αmyiGm(xi)),也就是分类正确的样本权值会比之前的要小,反之,分类错误的样本权值要比之前要大。
那这里除以一个ZmZ_mZm是干嘛的呢?看这个ZmZ_mZm的式子,其实就是所有样本权值之和,让wmiexp(−αmyiGm(xi))w_{mi} exp(-\alpha_m y_iG_m(x_i))wmiexp(−αmyiGm(xi))除以ZmZ_mZm就可以让
∑i=1Nwm+1,i=1\sum_{i=1}^N w_{m+1,i} = 1 i=1∑Nwm+1,i=1
使得Dm+1D_{m+1}Dm+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αmGm(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αmGm(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) N1i=1∑NI(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αmGm(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} N1i=1∑NI(G(xi)=yi)≤N1i∑exp(−yif(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=1NI(G(xi)=yi)≤N1∑iexp(−yif(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(−yif(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(−yif(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=wmiexp(−αmyiGm(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,iexp(−α1yiG1(xi))Z2⋅w3,i=w2,iexp(−α2yiG2(xi))⋮ZM−1⋅wM,i=wM−1,iexp(−αM−1yiGM−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,iexp(−α1yiG1(xi))Z2⋅w3,i=w2,iexp(−α2yiG2(xi))⋮ZM−1⋅wM,i=wM−1,iexp(−αM−1yiGM−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−1Zm⋅WM,i=w1,iexp(−yim=1∑M−1αmGm(xi))
观察上式和(8.9)(8.9)(8.9)式的区别可知上式中,左边少了个 ZMZ_MZM,多了个WM,iW_{M,i}WM,i;右边指数函数中少加了个αMGM(xi))\alpha_MG_M(x_i))αMGM(xi))
我们让左右两边同时乘以exp(−yiαMGM(xi))exp(-y_i\alpha_MG_M(x_i))exp(−yiαMGM(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−1Zm⋅WM,i⋅exp(−yiαMGM(xi))=N1exp(−yim=1∑M−1αmGm(xi))⋅exp(−yiαMGM(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−1Zm⋅WM,i⋅exp(−yiαMGM(xi))=N1exp(−yim=1∑MαmGm(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−1Zm⋅i=1∑NWM,i⋅exp(−yiαMGM(xi))=N1i=1∑N(exp(−yim=1∑MαmGm(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∏MZm=N1i=1∑Nexp(−yif(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∑Nwmiexp(−αmyiGm(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=21logem1−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∏MZm=m=1∏M[2em(1−em)]=m=1∏M1−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∑Nwmiexp(−αmyiGm(xi))=yi=Gm(xi)∑wmie−αm+yi=Gm(xi)∑wmieαm
这一步就是根据yiGm(xi)y_i G_m(x_i)yiGm(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∑Nwmiexp(−αmyiGm(xi))=yi=Gm(xi)∑wmie−αm+yi=Gm(xi)∑wmieαm=(1−em)e−αm+emeα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∑Nwmiexp(−αmyiGm(xi))=yi=Gm(xi)∑wmie−αm+yi=Gm(xi)∑wmieαm=(1−em)e−αm+emeα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∏M1−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∏Mexp(−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)21f′(x)=−21(1−x)−21f′′(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)+21x2f′′(0)+⋯≈1−21x−81x2
把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)+21x2g′′(0)+⋯≈1+21x+21x2
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∏MZm≤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βmb(x;γm)(8.13)
其中,b(x;γm)b(x;\gamma_m)b(x;γm)为基函数,γm\gamma_mγm为基函数的参数。显然式(8.6)(8.6)(8.6)是一个加法模型。
前向分布算分的步骤如下:
- 初始化f0(x)=0f_0(x)=0f0(x)=0
- 对m=1,2,⋯,Mm=1,2,\cdots,Mm=1,2,⋯,M
- 极小化损失函数
(βm,γm)=argminβ,γ∑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β,γmini=1∑NL(yi,fm−1(xi)+βb(xi;γ))(8.16)
得到参数βm,γm\beta_m,\gamma_mβm,γm - 更新
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)+βmb(x;γm)(8.17)
- 极小化损失函数
- 得到加法模型
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βmb(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∑MT(x;Θm)
关于代码示例可见机器学习入门——图解集成学习(附代码)
参考
- 统计学习方法
《统计学习方法》——提升算法相关推荐
- 重磅开源!所有的李航老师《统计学习方法》算法代码实现!!!
关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 超有料的仓库项目资源---<统计学习方法>代码 李航老师的<统计 ...
- 统计学习方法--提升方法adaBoost算法(集成学习)
1.主要内容 介绍集成学习,然后讲述boosting和bagging的区别与联系,同时对adaBoost进行推导然后进行gbdt的推导,最后比较随机森林和gdbt的区别和联系. 2.集成学习 集成学习 ...
- 《统计学习方法》算法学习笔记(四)之 决策树(上)
决策树 总述 决策树是一种基本的分类与回归方法,本节主要讨论用于分类的决策树.决策树呈树状结构,在分类问题中,表示基于特征对实例进行分类的过程.它可以认为是if-then规则的集合,也可以认为是定义在 ...
- 李航统计学习方法EM算法三枚硬币例子Q函数推导
具体推导如下: 上面推导省略了第i次迭代的i的标记 当得到上式以后,可以参考 http://www.cnblogs.com/Determined22/p/5776791.html 来继续一下推导 当然 ...
- 08_提升方法Boosting2_统计学习方法
文章目录 三.GBDT算法 1.提升树算法 (1)算法三要素 (2)GBDT与AdaBoost区别 2.平方损失的提升树 3.梯度提升树(Gradient Boosting Decison Tree, ...
- 08_提升方法Boosting1_统计学习方法
文章目录 一.Boosting和集成学习介绍 二.AdaBoost 1.AdaBoost算法 (1)AdaBoost算法的三要素 (2)AdaBoost模型定义 (3)AdaBoost损失函数定义 ( ...
- 统计学习方法(一)——统计学习方法概论
文章作者:Tyan 博客:noahsnail.com | CSDN | 简书 1. 统计学习方法概论 本文是统计学习方法(李航)第一章的学习总结. 1.1 统计学习 1.统计学习的特点 统计学 ...
- 09_期望极大法EM1_统计学习方法
文章目录 一.EM算法的引入 1.极大似然估计 2.EM入场 二.EM算法推导 1.Jensen不等式 2.EM推导过程 (1)统计学习方法EM推导 (2)Andrew NG关于EM算法的推导 3.统 ...
- 统计学习方法第八章作业:分类问题AdaBoost算法、回归问题提升树算法 代码实现
分类问题AdaBoost算法 import math import numpy as npclass Adaboost_tree:def __init__(self,X,Y,feature_type= ...
- 开源!北大研究生把《统计学习方法》书中全部算法都实现了!
来源:开源最前线(ID:OpenSourceTop) 一个好的开源项目分享给大家. <统计学习方法>可以说是机器学习的入门宝典,许多机器学习培训班.互联网企业的面试.笔试题目,很多都参考这 ...
最新文章
- 新书上市|当我们讨论“量子计算”时我们在讨论什么?
- Bert 如何解决长文本问题?
- 第二十一讲 特征值和特征向量
- Python中的and和or
- 【机器学习】图解机器学习中的 12 种交叉验证技术
- 版本变迁_上新了!隋唐洛阳城应天门3D投影秀更新版本!(附视频)
- Spring Singleton,请求,会话Bean和线程安全
- NSIS:判断并安装.NET Framework 4 的例子
- mysql 键缓冲区_mysql:键缓存
- PBOC规范研究之六、变长记录文件(转)
- Python中如何获得数组或者列表按大小排序后元素的索引列表
- 9 线性表-队列-链式存储
- win10电脑桌面html,手把手教你美化win10电脑桌面的小技巧
- java 登录md5加密_javaMD5加密及登录验证(备忘)
- 关于socket阻塞与非阻塞情况下的recv、seng、read、write返回值问题
- 亲手制作:超级DOS工具+Vista+加强版WindowsXP Lite5.8集成
- 修复windows系统引导
- C++ 数据存储类型
- 题解 P4460 【[CQOI2018]解锁屏幕】
- SELECT * FROM DUAL中的DUAL是什么?