集成学习简单理解就是指采用多个分类器对数据集进行预测,从而提高整体分类器的泛化能力。
集成学习有两个流派,一个是boosting派系,它的特点是各个弱学习器之间有依赖关系。另一种是bagging流派,它的特点是各个弱学习器之间没有依赖关系,可以并行拟合。
Bagging算法(Bootstrap aggregating,引导聚集算法),又称装袋算法,是机器学习领域的一种集成学习算法。
随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。 Leo Breiman和Adele Cutler发展出推论出随机森林的算法
AdaBoost,是英文”Adaptive Boosting”(自适应增强)的缩写。AdaBoost方法的自适应在于:前一个分类器分错的样本会被用来训练下一个分类器。AdaBoost方法对于噪声数据和异常数据很敏感。但在一些问题中,AdaBoost方法相对于大多数其它学习算法而言,不会很容易出现过拟合现象。AdaBoost方法中使用的分类器可能很弱(比如出现很大错误率),但只要它的分类效果比随机好一点(比如两类问题分类错误率略小于0.5),就能够改善最终得到的模型。而错误率高于随机分类器的弱分类器也是有用的,因为在最终得到的多个分类器的线性组合中,可以给它们赋予负系数,同样也能提升分类效果。
AdaBoost方法是一种迭代算法,在每一轮中加入一个新的弱分类器,直到达到某个预定的足够小的错误率。每一个训练样本都被赋予一个权重,表明它被某个分类器选入训练集的概率。如果某个样本点已经被准确地分类,那么在构造下一个训练集中,它被选中的概率就被降低;相反,如果某个样本点没有被准确地分类,那么它的权重就得到提高。通过这样的方式,AdaBoost方法能“聚焦于”那些较难分(更富信息)的样本上
假设有 n n 个样本, D:{(x1,y1),(x2,y2),...,(xn,yn)} D : { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x n , y n ) } , x x 是特征向量, y∈{−1,1} y ∈ { − 1 , 1 } 是标签
1. 初始化样本 D:{(x1,y1),(x2,y2),...,(xn,yn)} D : { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x n , y n ) } , x x , kmax k m a x (最大循环次数),样本分布 Wk(i)=1/n,i=1,...,n W k ( i ) = 1 / n , i = 1 , . . . , n
2. k=0 k = 0
3. do d o k←k+1 k ← k + 1
4. 训练使用按照 Wk(i) W k ( i ) 采样的 D D 的弱分类器 Ck C k
5. Ek E k ←计算弱分类器 Ck C k 的训练误差, 如果 Ek>0.5 E k > 0.5 , 则continue
6. αk←12ln1−EkEk α k ← 1 2 ln 1 − E k E k , 这里 αk α k 就是该分类器的权重
7. 改变样本的分布,提高错分样本的概率,降低正确分类样本的概率 Wk+1(i)←Wk(i)Zk×{e−αk,eαk,if hk(xi)=yiif hk(xi)≠yi W k + 1 ( i ) ← W k ( i ) Z k × { e − α k , if h k ( x i ) = y i e α k , if h k ( x i ) ≠ y i
8. until u n t i l k=kmax k = k m a x
9. return r e t u r n Ck C k 和 αk α k , k=1,...,kmax k = 1 , . . . , k m a x (带权值分类器的总体)
10. end e n d
首先,提升树模型其实就是决策树的加法模型,表现为
其中, r=y−fm−1(x) r = y − f m − 1 ( x ) , 即残差,可以理解为是当前模型 fm−1(x)和真是样本之间的误差 f m − 1 ( x ) 和 真 是 样 本 之 间 的 误 差
所以,对于回归问题的Boosting Tree来说,每一步只需要拟合当前模型的残差即可。
boosting Tree 提升树利用加法模型实现优化过程时,当损失函数是平方损失函数时,每一步的优化很简单。但对于一般损失函数而言,往往每一步的优化没那么简单,所以引入了梯度提升(Gradient Boosting)算法。
对于普通的机器学习模型而言,其目标函数可以定义为如下:
其中 n n 代表有 n n 个样本。前面一项是loss函数, 后面一项是正则项。
综合上述加法模型的计算过程,在第 t t 步,其目标函数是:
此时,优化该目标函数,就能得到 ft(xi) f t ( x i )
前面第提到Gradient Boosting时,提及Gradient Boosting以负梯度代替残差来求解基函数,实际上,负梯度的理论支撑则是泰勒公式的一阶展开。即
对于在第 t t 步的目标函数,对 l(yi,ŷ t−1i+ft(xi)) l ( y i , y ^ i t − 1 + f t ( x i ) ) 做一阶泰勒展开,其中\hat{y}_i^{t-1}相当于泰勒上述公式的 x x , 而 ft(xi) f t ( x i ) 相当于是 Δx Δ x ,我们展开得到:
其中, gi g i 是 l(yi,ŷ t−1i) l ( y i , y ^ i t − 1 ) 关于 ŷ t−1i y ^ i t − 1 的一阶导数
此时,目标函数(不考虑正则项)变成:
我们肯定希望目标函数每步的loss都减小的,即 Obj(t)<Obj(t−1) O b j ( t ) < O b j ( t − 1 ) ,那么关键就在于 gift(xi) g i f t ( x i ) 这一项了。因为我们不知道到底是正还是负,那么只需让 ft(xi)=−αigi f t ( x i ) = − α i g i ( α α 是我们任取的一个正系数)就能 gift(xi) g i f t ( x i ) 让一直恒为负了。