一般来说,Ensemble模型适合于过拟合的模型,包括bagging和boosting.
3.1 Bagging
其中Bagging是单独训练每个分类器,然后用平均或者投票的方法组合,boosting的方法则是分类器之前存在强依赖,前一个分类器预测的解构会影响后一个分类器。随机森林就是DT的bagging。
在相同的深度下,随机森林并不会比决策树好很多,但会让分类的结果更平滑
3.2 Boosting
boosting的目的是用迭代的方法提高弱分类器的性能(improving weak classifier)
boosting的架构如下:
首先获取到第一个分类器f 1 ( x ) f_1(x) f 1 ( x ) ,然后用第二个分类器f 2 ( x ) f_2(x) f 2 ( x ) 去helpf 1 ( x ) f_1(x) f 1 ( x ) ,如果f 2 ( x ) f_2(x) f 2 ( x ) 与f 1 ( x ) f_1(x) f 1 ( x ) 很像,则可能对帮助的有限,我们更希望f 2 ( x ) f_2(x) f 2 ( x ) 是f 1 ( x ) f_1(x) f 1 ( x ) 的补充。bagging的时候不同分类器用的dataset的原有数据集重采样得到的,而在boosting时,不同dataset用到的数据集则是原数据集然后乘一个weightu ( i ) u^{(i)} u ( i ) ,这样总的损失函数就是
L ( f ) = ∑ i = 1 m u ( i ) l ( f ( x ( i ) ) , y ^ ( i ) ) L(f) = \sum_{i=1}^{m} u^{(i)} l(f(x^{(i)}),\hat{y}^{(i)}) L ( f ) = i = 1 ∑ m u ( i ) l ( f ( x ( i ) ) , y ^ ( i ) )
其中l ( f ( x ( i ) ) , y ^ ( i ) ) l(f(x^{(i)}),\hat{y}^{(i)}) l ( f ( x ( i ) ) , y ^ ( i ) ) 代表任意一种衡量预测值和真实值的损失函数。
adaboost的思路就是,假设有k个弱分类器f 1 , f 2 , . . . , f k f_1,f_2,...,f_k f 1 , f 2 , . . . , f k ,先用一组带权重的数据集{ x ( i ) , y ^ ( i ) , u 1 ( i ) } \{x^{(i)},\hat{y}^{(i)},u^{(i)}_1\} { x ( i ) , y ^ ( i ) , u 1 ( i ) } 训练f 1 f_1 f 1 ,然后更改每组训练数据的权重得到u 2 ( i ) u^{(i)}_2 u 2 ( i ) ,这时新的带权重的数据集{ x ( i ) , y ^ ( i ) , u 2 ( i ) } \{x^{(i)},\hat{y}^{(i)},u^{(i)}_2\} { x ( i ) , y ^ ( i ) , u 2 ( i ) } 在f 1 f_1 f 1 上的performance会变差,这时候训练f 2 f_2 f 2 使得新的数据集在f 2 f_2 f 2 上的performance变好。所谓表现差,就是正确率低,错误率高,用下边的式子来计算错误率 :
ϵ 1 = ∑ i = 1 m u 1 ( i ) δ ( f 1 ( x ( i ) ) ≠ y ^ ( i ) ) Z 1 \epsilon_1 = \frac{ \sum_{i=1}^{m}u^{(i)}_1\delta(f_1(x^{(i)})\not=\hat{y}^{(i)})}{Z_1} ϵ 1 = Z 1 ∑ i = 1 m u 1 ( i ) δ ( f 1 ( x ( i ) ) = y ^ ( i ) )
其中δ ( f 1 ( x ( i ) ) ≠ y ^ ( i ) ) \delta(f_1(x^{(i)})\not=\hat{y}^{(i)}) δ ( f 1 ( x ( i ) ) = y ^ ( i ) ) 为符号函数,即两者不相等时取1,否则取0, Z 1 Z_1 Z 1 则表示归一化权重:Z 1 = ∑ i = 1 m u 1 ( i ) Z_1 = \sum_{i=1}^{m}u^{(i)}_1 Z 1 = i = 1 ∑ m u 1 ( i )
这是因为每次训练的数据集所用的权重加起来并不为1,因此需要归一化。这个式子看起来并不太好理解,为什么能表示错误率呢?我们举个简单的例子,假设权重为1,这时候Z 1 = m Z_1=m Z 1 = m ,也就是m m m 个样本,上式的分母就是m m m ,假设分类器f 1 f_1 f 1 让t t t 个样本分类错误,这时上边ϵ 1 \epsilon_1 ϵ 1 表达式的分子就是t t t ,t m \frac{t}{m} m t 当然就是错误率啦。另一个角度也可以从概率的角度理解,u 1 ( i ) Z 1 \frac{u^{(i)}_1}{Z_1} Z 1 u 1 ( i ) 可以表示对于每个样本预测错误的概率,然后加权平均就是第一个分类器的错误率啦(这种解释有点粗糙,仅帮助理解)。
注意,对于二分类,错误率ϵ 1 < 0.5 \epsilon_1<0.5 ϵ 1 < 0 . 5 ,多分类的话ϵ 1 < 1 / K \epsilon_1<1/K ϵ 1 < 1 / K ,下边的公式也只介绍二类的情况。接下来把数据集从权重从u 1 ( i ) u^{(i)}_1 u 1 ( i ) 变到u 2 ( i ) u^{(i)}_2 u 2 ( i ) ,使得∑ i = 1 m u 2 ( i ) δ ( f 1 ( x ( i ) ) ≠ y ^ ( i ) ) Z 2 = 0.5 \frac{ \sum_{i=1}^{m}u^{(i)}_2\delta(f_1(x^{(i)})\not=\hat{y}^{(i)})}{Z_2}=0.5 Z 2 ∑ i = 1 m u 2 ( i ) δ ( f 1 ( x ( i ) ) = y ^ ( i ) ) = 0 . 5
这是因为,最烂的二分类器,随机猜也有50%的准确率,我们要使f 1 f_1 f 1 的性能变差,就让f 1 f_1 f 1 对u 2 ( i ) u^{(i)}_2 u 2 ( i ) 权重的训练数据{ x ( i ) , y ^ ( i ) , u 2 ( i ) } \{x^{(i)},\hat{y}^{(i)},u^{(i)}_2\} { x ( i ) , y ^ ( i ) , u 2 ( i ) } 的错误率升到0.5即可。
那如何让f 1 f_1 f 1 错误率提升呢,也就是让f 1 f_1 f 1 分类效果变差呢?很简单的方法就是,让分类器f 1 f_1 f 1 对于分类正确的那些数据,我们给它更少的权重,对于分类错误的数据则给更大的权重。一个形象的例子如下:
假设刚开始的权重都是1,其中第1,3,4组训练数据分类正确,那f 1 f_1 f 1 的错误率就是0.25,然后呢,对于分类正确的数据,我们把训练集数据要乘的权重调低到1 / 3 1/\sqrt3 1 / 3 ,把分类错误的第二组数据的权重调高到3 \sqrt3 3 这时候f 1 f_1 f 1 的错误率就升高到0.5了。总结规律就是:
如果f 1 f_1 f 1 能正确分类某个数据,也就是f 1 ( x i ) ≠ y ^ ( i ) f_1(x^{i})\not =\hat{y}^{(i)} f 1 ( x i ) = y ^ ( i ) ,则把新训练数据的权重u 2 ( i ) u^{(i)}_2 u 2 ( i ) 减小为原来的权重除以d 1 d_1 d 1 : u 2 ( i ) = u 1 ( i ) / d 1 u^{(i)}_2=u^{(i)}_1/d_1 u 2 ( i ) = u 1 ( i ) / d 1
如果f 1 f_1 f 1 错误分类某个数据,也就是f 1 ( x i ) = y ^ ( i ) f_1(x^{i})=\hat{y}^{(i)} f 1 ( x i ) = y ^ ( i ) ,则把新训练数据的权重u 2 ( i ) u^{(i)}_2 u 2 ( i ) 增大为原来的权重乘d 1 d_1 d 1 : u 2 ( i ) = u 1 ( i ) d 1 u^{(i)}_2=u^{(i)}_1 d_1 u 2 ( i ) = u 1 ( i ) d 1
那d 1 d_1 d 1 怎么求呢?∑ i = 1 m u 2 ( i ) δ ( f 1 ( x ( i ) ) ≠ y ^ ( i ) ) Z 2 = 0.5 \frac{ \sum_{i=1}^{m}u^{(i)}_2\delta(f_1(x^{(i)})\not=\hat{y}^{(i)})}{Z_2}=0.5 Z 2 ∑ i = 1 m u 2 ( i ) δ ( f 1 ( x ( i ) ) = y ^ ( i ) ) = 0 . 5
其实就是把上式中u 2 ( i ) u^{(i)}_2 u 2 ( i ) 分类错误的展开成u 1 ( i ) d 1 u^{(i)}_1d_1 u 1 ( i ) d 1 ,分类正确的展开乘u 1 ( i ) / d 1 u^{(i)}_1/d_1 u 1 ( i ) / d 1 然后解方程即可,经过一系列化简可以得到:∑ f 1 ( x ( i ) ) = y ^ ( i ) u 1 ( i ) / d 1 = ∑ f 1 ( x ( i ) ) ≠ y ^ ( i ) u 1 ( i ) d 1 \sum_{f_1(x^{(i)})=\hat{y}^{(i)}} u^{(i)}_1/d_1=\sum_{f_1(x^{(i)})\not=\hat{y}^{(i)}} u^{(i)}_1d_1 f 1 ( x ( i ) ) = y ^ ( i ) ∑ u 1 ( i ) / d 1 = f 1 ( x ( i ) ) = y ^ ( i ) ∑ u 1 ( i ) d 1
也就是那些分类错误的数据的权重的和要等于分类正确的数据的权重的和,在经过推导得到d 1 d_1 d 1 为:d 1 = 1 − ϵ 1 ϵ 1 > 1 d_1 = \sqrt{\frac{1-\epsilon_1}{\epsilon_1}}>1 d 1 = ϵ 1 1 − ϵ 1 > 1
从上边可以看出,要更新数据的权重时,对于上一轮迭代分类错误的数据,我们要增加权重也就是乘一个数,对于上一轮迭代分类正确的数据,我们要减小权重也就是除一个数,有没有办法都用乘法表示呢?只需要把权重取对数即可,因为取对数后原来的函数仍然保持之前的单调性,除此之外,取完对数,之前的乘除运算就可以变成加减运算。上述d 1 d_1 d 1 取对数后就变成:a 1 = log d 1 = log ( 1 − ϵ 1 ϵ 1 ) = 1 2 log 1 − ϵ 1 ϵ 1 a_1 = \log d_1 = \log (\sqrt{\frac{1-\epsilon_1}{\epsilon_1}})= \frac{1}{2}\log \frac{1-\epsilon_1}{\epsilon_1} a 1 = log d 1 = log ( ϵ 1 1 − ϵ 1 ) = 2 1 log ϵ 1 1 − ϵ 1
这样更新的权重就都可以用乘法来表示
如果f 1 f_1 f 1 能正确分类某个数据,权重u 2 ( i ) u^{(i)}_2 u 2 ( i ) 减小为u 2 ( i ) = u 1 ( i ) e − a 1 u^{(i)}_2=u^{(i)}_1 e^{-a_1} u 2 ( i ) = u 1 ( i ) e − a 1
如果f 1 f_1 f 1 错误分类某个数据,权重u 2 ( i ) u^{(i)}_2 u 2 ( i ) 增加为u 2 ( i ) = u 1 ( i ) e a 1 u^{(i)}_2=u^{(i)}_1 e^{a_1} u 2 ( i ) = u 1 ( i ) e a 1
用一个式子表示u 2 ( i ) u^{(i)}_2 u 2 ( i ) 的更新就是u 2 ( i ) = u 1 ( i ) × exp ( − y ^ ( i ) f 1 ( x ( i ) ) a 1 ) u^{(i)}_2 = u^{(i)}_1 \times \exp(-\hat{y}^{(i)}f_1(x^{(i)})a_1) u 2 ( i ) = u 1 ( i ) × exp ( − y ^ ( i ) f 1 ( x ( i ) ) a 1 )
当预测值和真实值相同时,− y ^ ( i ) f 1 ( x ( i ) ) = − 1 -\hat{y}^{(i)}f_1(x^{(i)})=-1 − y ^ ( i ) f 1 ( x ( i ) ) = − 1 否则取1
综上,二分类的Adaboost算法就可以概况为:
输入:{ ( x ( 1 ) , y ^ ( 1 ) , u 1 ( 1 ) ) , ( x ( 2 ) , y ^ ( 2 ) , u 1 ( 2 ) ) , . . . , ( x ( m ) , y ^ ( m ) , u 1 ( m ) ) } \{(x^{(1)},\hat{y}^{(1)},u^{(1)}_1),(x^{(2)},\hat{y}^{(2)},u^{(2)}_1),...,(x^{(m)},\hat{y}^{(m)},u^{(m)}_1)\} { ( x ( 1 ) , y ^ ( 1 ) , u 1 ( 1 ) ) , ( x ( 2 ) , y ^ ( 2 ) , u 1 ( 2 ) ) , . . . , ( x ( m ) , y ^ ( m ) , u 1 ( m ) ) }
其中y ( i ) = ± 1 y^{(i)}=\pm 1 y ( i ) = ± 1 , 初始权重为u 1 ( i ) = 1 u^{(i)}_1=1 u 1 ( i ) = 1
对于弱分类器t = 1 , 2 , . . . , T t=1,2,...,T t = 1 , 2 , . . . , T
a. 用带权重{ u 1 ( 1 ) , u 1 ( 2 ) , . . . , u 1 ( m ) } \{u^{(1)}_1,u^{(2)}_1,...,u^{(m)}_1\} { u 1 ( 1 ) , u 1 ( 2 ) , . . . , u 1 ( m ) } 的数据训练弱分类器t
b. 计算第t个弱分类器的分类错误率ϵ t \epsilon_t ϵ t (公式见上)
c. 用分类错误率计算权重要乘的数a t a_t a t
d. 用u 2 ( i ) = u 1 ( i ) × exp ( − y ^ ( i ) f 1 ( x ( i ) ) a 1 ) u^{(i)}_2 = u^{(i)}_1 \times \exp(-\hat{y}^{(i)}f_1(x^{(i)})a_1) u 2 ( i ) = u 1 ( i ) × exp ( − y ^ ( i ) f 1 ( x ( i ) ) a 1 ) 更新数据集的权重
训练得到一系列的弱分类器f 1 , f 2 , . . . , f T f_1,f_2,...,f_T f 1 , f 2 , . . . , f T
最后的强分类器就为:H ( x ) = s i g n ( ∑ t = 1 T a t f t ( x ) ) H(x) = sign(\sum_{t=1}^T a_t f_t(x)) H ( x ) = s i g n ( t = 1 ∑ T a t f t ( x ) )
这里的a t a_t a t 就是前边用错误率计算出的a t a_t a t
组合的策略从直观上解释就是错误率低的分类器权重更高,反之权重更低。
至此adaboost讲完