集成学习是一种由多种弱学习器组合成强学习器的策略,主要分为3类:Boosting方法、Bagging方法、Stacking方法。
Boosting方法基于串行策略,新的学习器由旧的学习器生成。
代表算法有:
Boosting算法要解决两个问题:
对于Boosting对应的两个问题,AdaBoost的策略为:
注:用到两种权值,一个是对样本的,一个是对分类器的。对样本的权值分类错的更大,对弱分类器的权值分类越好(错误率越小)的权值越大。
数据有N个,基学习器有M个,如第m个基学习器为 B m ( x ) B_m(x) Bm(x),最终输出为由基学习器组合而成的最终学习器B(x)。
1.初始化权重分布
D m = ( w m , 1 , w m , 2 , ⋯   , w m , N ) , w m , i = 1 N D_m=(w_{m,1},w_{m,2},\cdots ,w_{m,N}),w_{m,i}=\frac {1}{N} Dm=(wm,1,wm,2,⋯,wm,N),wm,i=N1
其中权值是分给每个样本的, D m D_m Dm表示第m个基学习器的样本权值分配。
2.每个基学习器的学习过程
2.1 使用权值分布为 D m D_m Dm的数据集,得到基学习器 B m ( x ) B_m(x) Bm(x)的分类结果
B m ( x ) = χ → { − 1 , + 1 } B_m(x)=\chi \rightarrow \{-1,+1\} Bm(x)=χ→{−1,+1}
即将样本映射到区间[-1,+1]上。
2.2 弱分类器 B m ( x ) B_m(x) Bm(x)的误差
e m = P ( B m ≠ y i ) = ∑ i = 1 N w m , i I ( B m ≠ y i ) e_m=P(B_m\neq y_i) =\sum _{i=1}^{N}w_{m,i}I(B_m\neq y_i) em=P(Bm̸=yi)=∑i=1Nwm,iI(Bm̸=yi)
2.3 计算 B m ( x ) B_m(x) Bm(x)系数
α m = 1 2 l n 1 − e m e m \alpha _m= \frac {1}{2} ln \frac {1-e_m}{e_m} αm=21lnem1−em
由上述公式可以看出某个弱分类器的权值分配的基本原则为:分类的越准,权值越大。
2.4 更新训练集权值分布
D m + 1 = ( w m + 1 , 1 , w m + 1 , 2 , ⋯   , w m + 1 , N ) D_{m+1} =(w_{m+1,1},w_{m+1,2},\cdots ,w_{m+1,N}) Dm+1=(wm+1,1,wm+1,2,⋯,wm+1,N)
其中
w m + 1 , i = w m , i ⋅ e x p ( − α m ⋅ y i B m ( x i ) ) Z m w_{m+1,i}=\frac {w_{m,i}\cdot exp(-\alpha_m \cdot y_i B_m(x_i))}{Z_m} wm+1,i=Zmwm,i⋅exp(−αm⋅yiBm(xi))
Z m = ∑ i = 1 N w m , i ⋅ e x p ( − α m y i B m ( x i ) ) Z_m=\sum_{i=1}^{N}w_{m,i}\cdot exp(-\alpha _m y_i B_m(x_i)) Zm=∑i=1Nwm,i⋅exp(−αmyiBm(xi))
其实我们可以发现$ y_i B_m(x_i)$要么为+1(分类正确),要么为-1(分类错误)。具体转化公式形式如下:
w m + 1 , i = { w m , i ⋅ e − α m Z m y i = B m ( x i ) w m , i ⋅ e α m Z m y i ≠ B m ( x i ) w_{m+1,i}=\left\{\begin{matrix} \frac {w_{m,i}\cdot e^{-\alpha _m}}{Z_m} &y_i=B_m(x_i) \\ \frac {w_{m,i}\cdot e^{\alpha _m}}{Z_m} &y_i\neq B_m(x_i) \end{matrix}\right. wm+1,i={Zmwm,i⋅e−αmZmwm,i⋅eαmyi=Bm(xi)yi̸=Bm(xi)
其中 α m \alpha _m αm为(0,1)之间的数,可以看出分类错误的样本会获得更大的权重。
3. 基学习器的组合
B ( x ) = s i g n ( ∑ m = 1 M α m B m ( x ) ) B(x)=sign(\sum _{m=1}^{M}\alpha _m B_m(x)) B(x)=sign(∑m=1MαmBm(x))
AdaBoost算法是前向分布算法的一种特例,前向分布算法使求解加法模型的一种算法。
加法模型可以表示为:
f ( x ) = ∑ m = 1 M α m b ( x ; γ m ) f(x)=\sum _{m=1}^{M} \alpha_m b(x;\gamma_m) f(x)=∑m=1Mαmb(x;γm)
其中$ \alpha_m 为 基 学 习 器 系 数 , 为基学习器系数, 为基学习器系数, b(x;\gamma_m) 为 基 函 数 , 为基函数, 为基函数,\gamma_m$为基函数参数,学习加法模型可以可以转化为损失函数最小化问题:
m i n α m γ m ∑ i = 1 M L ( y i , ∑ i = 1 M α m b ( x ; γ m ) ) min_{\alpha_m \gamma_m}\sum_{i=1}^M L(y_i,\sum_{i=1}^M\alpha_m b(x;\gamma_m)) minαmγm∑i=1ML(yi,∑i=1Mαmb(x;γm))
使用前向分布算法求解上述损失函数过程:
基本思想为从前往后,每次只学习一个基函数和它的系数,逐步优化目标函数。
GBDT(梯度提升树)是以决策树(CART)为基学习器的Boosting类型的集成学习方法,与提升树在残差计算方面有所不同,提升树使用真正的残差,梯度提升树使用模型的负梯度拟合残差。
CART分类树采用Gini指数选取最优特征,根据的是信息的纯度,适用于离散的情况。但CART回归树需要拟合梯度值,需要使用连续值,所以使用平方误差来拟合误差。
训练数据有N个,基础决策树有m个,根据决策树深度可以划分为J个叶子节点,c表示初始决策树预测值,$\Upsilon $表示决策树叶子节点参数值。
2.第m个决策树的生成
(1)计算第m个决策树中每个样本残差
r i , m = − ∂ L ( y i , f m − 1 ( x i ) ) ∂ f m − 1 ( x i ) r_{i,m}=-\frac{\partial L(y_i,f_{m-1}(x_i))}{\partial f_{m-1}(x_i)} ri,m=−∂fm−1(xi)∂L(yi,fm−1(xi))
(2)得到叶子节点的划分区域 R j m , j = 1 , 2 , ⋯   , J R_{jm},j=1,2,\cdots,J Rjm,j=1,2,⋯,J。J的大小由决策树深度决定。
(3)对叶子区域计算最佳拟合值
Υ j m = a r g m i n Υ ∑ x i ∈ R j m L ( y i , f m − 1 ( x i ) + Υ ) \Upsilon_{jm} =argmin_\Upsilon \sum_{x_i \in R_{jm} }L(y_i,f_{m-1}(x_i)+\Upsilon) Υjm=argminΥ∑xi∈RjmL(yi,fm−1(xi)+Υ)
(4)更新第m个决策树
f m ( x ) = f m − 1 ( x ) + ∑ j = 1 J Υ j m I ( x ∈ R j m ) f_m(x)=f_{m-1}(x)+\sum_{j=1}^{J}\Upsilon _{jm}I(x\in R_{jm}) fm(x)=fm−1(x)+∑j=1JΥjmI(x∈Rjm)
数据如下,两个特征:年龄和体重;一个标签:身高,即根据年龄和体重预测身高。
编号 | 年龄(岁) | 体重(kg) | 身高(m)(标签) |
---|---|---|---|
0 | 5 | 20 | 1.1 |
1 | 7 | 30 | 1.3 |
2 | 21 | 70 | 1.7 |
3 | 30 | 60 | 1.8 |
4(需预测) | 25 | 65 | ? |
训练阶段
编号 | 年龄 | 体重 | 新标签值 |
---|---|---|---|
0 | 5 | 20 | -0.375 |
1 | 7 | 30 | -0.175 |
2 | 21 | 70 | 0.225 |
3 | 30 | 60 | 0.325 |
接着遍历每个特征的每个取值找到合适的划分点是的总的误差最小,即在叶子节点中 分类错误的最小。例如使用年龄=5的条件划分,接着使用年龄=7划分·····,接着继续在 叶子节点划分,直到达到树的最大深度,最终生成一个决策树。
在此次划分中选择的属性为年龄=21,按照是否小于21岁划分为两个叶子节点
接着需要对每个叶子节点分配参数:
$\Upsilon_{j1} =argmin_\Upsilon \sum_{x_i \in R_{j1} }L(y_i,f_{0}(x_i)+\Upsilon) $
损失函数为平方损失,利用求导并令导数为0可以求解出来参数。结果为:
x 0 , x 1 ∈ R 11 , Υ 11 = − 0.275 x_0,x_1\in R_{11},\Upsilon_{11}=-0.275 x0,x1∈R11,Υ11=−0.275
x 2 , x 3 ∈ R 21 , Υ 21 = 0.275 x_2,x_3\in R_{21},\Upsilon_{21}=0.275 x2,x3∈R21,Υ21=0.275
此时就构成了迭代一次后的决策树:
f 1 ( x ) = f 0 ( x ) + ∑ j = 1 2 Υ j 1 I ( x ∈ R j 1 ) f_1(x)=f_{0}(x)+\sum_{j=1}^{2}\Upsilon _{j1}I(x\in R_{j1}) f1(x)=f0(x)+∑j=12Υj1I(x∈Rj1)
测试结果
结果为 f ( x ) = 1.475 + ( 0.275 ) = 1.75 f(x)=1.475+(0.275)=1.75 f(x)=1.475+(0.275)=1.75
参考文献:
CSDN:https://blog.csdn.net/blank_tj/article/details/82262431
Github:https://github.com/Freemanzxp/GBDT_Simple_Tutorial
XGBoost是改进的梯度提升(GB)算法,Xgboost是GB算法的高效实现,xgboost中的基学习器除了可以是CART(gbtree)也可以是线性分类器(gblinear)。