前言
根据Adaboost算法更新权重的原理我们知道想要在下一轮训练中使误分类的样本的权重增加,每一轮训练的错误率都必须小于0.5,包括初始化分类器时也是如此。初始化一般都是随机初始化,对于二分类任务,每个样本都有0.5的概率被预测正确,要达到0.5以上的正确率还是比较容易的,但是对于多分类问题就不一样了,在多分类问题中如果有 K K K个不同的类别,那么随机猜测只有 1 / K 1/K 1/K 的概率预测正确,因此若直接将Adaboost算法应用于多类分类问题往往不能得到令人满意的结果。针对这个问题,Zhu Ji等人在2009年提出了SAMME及SAMME.R算法,这也是sklearn中用Adaboost做多类分类问题时采用的算法。
算法原理
首先我们约定以下符号用法:
- x , y x, y x,y 表示一个标量
- x , y \bf{x}, \bf{y} x,y 表示一个矢量
- N N N 表示样本数量
- K K K 表示不同的类别的数量
SAMME算法
1. 标签和输出的向量化
在传统的 Adaboost 算法中样本的标签是数值,表示它所属的类别,模型的输出同样也是数值;而在这个算法中两者都被推广为 1 × K 1\times K 1×K 维的向量,即任意一个样本可表示为 ( x i , y i ) (\textbf{x}_i, \textbf{y}_i) (xi,yi),其中 x i \textbf{x}_i xi 是样本的特征向量, y i \textbf{y}_i yi 是样本的标签向量, y i = ( y i 1 , y i 2 , . . . , y i K ) \textbf{y}_i = (y_{i1}, y_{i2}, ..., y_{iK}) yi=(yi1,yi2,...,yiK),其分量定义如下:
y i k = { 1 , 如 果 x i 属 于 第 k 类 − 1 K − 1 , 如 果 x i 不 属 于 第 k 类 y_{ik} = \begin{cases}1, & 如果x_{i} 属于第 k 类\\ -\frac{1}{K-1}, & 如果x_{i} 不属于第 k 类\end{cases} yik={ 1,−K−11,如果xi属于第k类如果xi不属于第k类
例如,假设训练集第一个样本 ( x 1 , y 1 ) (\textbf{x}_1, \textbf{y}_1) (x1,y1) 属于第一类,那么 y 1 = ( 1 , − 1 K − 1 , − 1 K − 1 , . . . , − 1 K − 1 ) \textbf{y}_1=(1, -\frac{1}{K-1}, -\frac{1}{K-1}, ..., -\frac{1}{K-1}) y1=(1,−K−11,−K−11,...,−K−11)
在这个算法中分类器依然采用加法模型,我们将训练好的分类器记为 f m ( x ) \textbf{f}_m(\textbf{x}) fm(x),那么它可以写成如下形式:
f m ( x ) = ∑ i m β i g i ( x ) \textbf{f}_m(\textbf{x})=\sum_i^m\beta_i\textbf{g}_i(\textbf{x}) fm(x)=i∑mβigi(x)
其中 g i ( x ) \textbf{g}_i(\textbf{x}) gi(x) 是基分类器(弱分类器);它的输出也是向量:
f m ( x ) = ( f m 1 ( x ) , f m 2 ( x ) , . . . , f m K ( x ) ) \textbf{f}_m(\textbf{x})=(f_{m1}(\textbf{x}), f_{m2}(\textbf{x}), ..., f_{mK}(\textbf{x})) fm(x)=(fm1(x),fm2(x),...,fmK(x))
为了保证求解得到的 f m ( x ) \textbf{f}_m(\textbf{x}) fm(x) 唯一,作者给它加上了一个对称约束条件:
f m 1 ( x ) + f m 2 ( x ) + . . . + f m K ( x ) = 0 f_{m1}(\textbf{x}) + f_{m2}(\textbf{x}) + ... + f_{mK}(\textbf{x}) = 0 fm1(x)+fm2(x)+...+fmK(x)=0
即限制 f m ( x ) \textbf{f}_m(\textbf{x}) fm(x) 各分量之和为0;这里的思想和电磁学中为了使给定边界条件下求得的电磁场唯一而引入规范的概念是一样的。由于 f m ( x ) \textbf{f}_m(\textbf{x}) fm(x) 可表示为 m m m 个基分类器之和, 而 f m ( x ) \textbf{f}_m(\textbf{x}) fm(x) 的输出是向量,那么 g ( x ) \textbf{g}(\textbf{x}) g(x) 的输出也应该是向量:
g ( x ) = ( g 1 ( x ) , g 2 ( x ) , . . . , g K ( x ) ) \textbf{g}(\textbf{x})=(g_{1}(\textbf{x}), g_{2}(\textbf{x}), ..., g_{K}(\textbf{x})) g(x)=(g1(x),g2(x),...,gK(x))
并且我们可以强制 g ( x ) \textbf{g}(\textbf{x}) g(x) 也满足对称约束条件,此时我们注意到如果 g ( x ) \textbf{g}(\textbf{x}) g(x) 满足对称约束条件,那么由加法模型 f m ( x ) \textbf{f}_m(\textbf{x}) fm(x) 自然也满足对称约束条件,于是对 f m ( x ) \textbf{f}_m(\textbf{x}) fm(x) 的约束可以转为对 g ( x ) \textbf{g}(\textbf{x}) g(x) 的约束。进一步我们注意到 g ( x ) \textbf{g}(\textbf{x}) g(x) 作为一个分类器,可以看成一个函数,该函数的定义域为样本的特征空间,值域为标签构成的集合,即:
g ( x ) : R ∣ f e a t u r e ∣ → Y \textbf{g}(\textbf{x}): R^{|feature|}\rightarrow Y g(x):R∣feature∣→Y
Y = { ( 1 , − 1 K − 1 , − 1 K − 1 , . . . , − 1 K − 1 ) , ( − 1 K − 1 , 1 , − 1 K − 1 , . . . , − 1 K − 1 ) , . . . , ( − 1 K − 1 , − 1 K − 1 , − 1 K − 1 , . . . , 1 ) } Y=\{(1, -\frac{1}{K-1}, -\frac{1}{K-1}, ..., -\frac{1}{K-1}), (-\frac{1}{K-1}, 1, -\frac{1}{K-1}, ..., -\frac{1}{K-1}), ..., (-\frac{1}{K-1}, -\frac{1}{K-1}, -\frac{1}{K-1}, ..., 1)\} Y={ (1,−K−11,−K−11,...,−K−11),(−K−11,1,−K−11,...,−K−11),...,(−K−11,−K−11,−K−11,...,1)}
其中 ∣ f e a t u r e ∣ |feature| ∣feature∣ 表示特征数量, ( 1 , − 1 K − 1 , − 1 K − 1 , . . . , − 1 K − 1 ) (1, -\frac{1}{K-1}, -\frac{1}{K-1}, ..., -\frac{1}{K-1}) (1,−K−11,−K−11,...,−K−11) 为第一类的类标签, ( − 1 K − 1 , 1 , − 1 K − 1 , . . . , − 1 K − 1 ) (-\frac{1}{K-1}, 1, -\frac{1}{K-1}, ..., -\frac{1}{K-1}) (−K−11,1,−K−11,...,−K−11) 为第二类的标签,……, ( − 1 K − 1 , − 1 K − 1 , − 1 K − 1 , . . . , 1 ) (-\frac{1}{K-1}, -\frac{1}{K-1}, -\frac{1}{K-1}, ..., 1) (−K−11,−K−11,−K−11,...,1) 为第 K K K 类的标签;考虑到这一点后,根据一开始对标签向量的定义,我们发现它刚好是满足对称约束条件的,即各分量相加为0,因此在这个定义下对称约束自动被满足了
2. 求解模型
该算法的损失函数依然沿用了传统 Adaboost 的指数损失函数,只要我们把标量换成向量就行了:
L ( y , f ( x ) ) = ∑ i e x p ( − 1 K y i ⋅ f m ( x i ) ) L(\textbf{y}, \textbf{f}(\textbf{x}))=\sum_iexp(-\frac{1}{K}\textbf{y}_i \cdot\textbf{f}_m(\textbf{x}_i)) L(y,f(x))=i∑exp(−K1yi⋅fm(xi))
其中为了后面计算方便,作者引入了一个常数 1 K \frac{1}{K} K1 。和 Adaboost 算法的推导一样,我们只关注当前轮的训练,因此将 f m ( x ) \textbf{f}_m(\textbf{x}) fm(x) 拆成 f m − 1 ( x ) + β m g m ( x ) \textbf{f}_{m-1}(\textbf{x})+\beta_m\textbf{g}_m(\textbf{x}) fm−1(x)+βmgm(x) ,并将上一轮训练结果 f m − 1 ( x ) \textbf{f}_{m-1}(\textbf{x}) fm−1(x) 吸收进样本权重项 ω \omega ω :
L ( y , f ( x ) ) = ∑ i e x p ( − 1 K y i ⋅ f m ( x i ) ) = ∑ i e x p ( − 1 K y i ⋅ ( f m − 1 ( x i ) + β m g m ( x i ) ) ) = ∑ i ω i e x p ( − β m K y i ⋅ g m ( x i ) ) \begin{aligned}L(\textbf{y}, \textbf{f}(\textbf{x}))&=\sum_iexp(-\frac{1}{K}\textbf{y}_i \cdot\textbf{f}_m(\textbf{x}_i))\\ &=\sum_iexp(-\frac{1}{K}\textbf{y}_i \cdot(\textbf{f}_{m-1}(\textbf{x}_i)+\beta_m\textbf{g}_m(\textbf{x}_i)))\\ &=\sum_i\omega_i exp(-\frac{\beta_m}{K}\textbf{y}_i \cdot\textbf{g}_m(\textbf{x}_i))\end{aligned} L(y,f(x))=i∑exp(−K1yi⋅fm(xi))=i∑exp(−K1yi⋅(fm−1(xi)+βmgm(xi)))=i∑ωiexp(−Kβmyi⋅gm(xi))
下面我们单独考察一下 y i ⋅ g m ( x i ) \textbf{y}_i \cdot\textbf{g}_m(\textbf{x}_i) yi⋅gm(xi) 的结果;如前所述, y i \textbf{y}_i yi 和 g m ( x i ) \textbf{g}_m(\textbf{x}_i) gm(xi) 都是 1 × K 1\times K 1×K 维的向量,当它表示第 j j j 类时则第 j j j 个分量为1 ,其余分量为 − 1 K − 1 -\frac{1}{K-1} −K−11 ,因此当分类器预测正确时, g m ( x i ) = y i \textbf{g}_m(\textbf{x}_i)=\textbf{y}_i gm(xi)=yi , y i ⋅ g m ( x i ) \textbf{y}_i \cdot\textbf{g}_m(\textbf{x}_i) yi⋅gm(xi) 的结果就是 y i \textbf{y}_i yi 的模的平方;如果分类器预测错误,可以预见 y i \textbf{y}_i yi 和 g m ( x i ) \textbf{g}_m(\textbf{x}_i) gm(xi) 的1不在同一个分量,而其他分量还是相等的,都是 − 1 K − 1 -\frac{1}{K-1} −K−11 ;经过简单的计算可得两种情况下的内积结果:
预 测 正 确 时 : y i ⋅ g m ( x i ) = 1 + ( − 1 K − 1 ) 2 ( K − 1 ) = K K − 1 预测正确时:\textbf{y}_i \cdot\textbf{g}_m(\textbf{x}_i)=1+(-\frac{1}{K-1})^2(K-1)=\frac{K}{K-1} 预测正确时:yi⋅gm(xi)