机器学习 - 提升树(上)- BT、GBDT
在之前对集成学习的两大框架 Bagging 与 Boosting 经过讲解,并对 Bagging 实现的一种算法 —— 随机森林进行了介绍。那么今天就对 Boosting 的实现算法进行介绍。
-
BT(Boosting Tree)
-
介绍
BT(Boosting Tree),提升树,是以决策树作为基分类器的 Boosting 方法,对分类问题决策树是分类二叉树且使用指数损失函数,对回归问题决策树使用回归二叉树,并采用平方差损失函数。提升树被认为是统计学习中性能最好的方法之一。
-
原理
提升树算法的精髓可以用一个词来表达:“残差”。在加法模型与前向分步算法的应用过程中,每一个基分类器学习的目标都是上一个基分类器预测值与真实值之间的误差值,这个误差值被称为 “残差”。
对于二分类问题,提升树只需将 AdaBoost 算法中 的基分类器限制为二分类树即可。下面叙述回归问题的提升树。
对回归问题使用前向分步算法,其中 f m f_m fm 为第 m 次迭代的模型, T m T_m Tm 为第 m 次学得的决策树。:
{ f 0 ( x ) … … f m ( x ) = f m − 1 + T m ( x ) , m = 1 , 2 , . . . , M ⟹ f M ( x ) = ∑ m = 1 M T m ( x ) \begin{cases} f_0(x)\\ …\\ …\\ f_m(x)=f_{m-1}+T_m(x),m=1,2,...,M\\ \end{cases} \Longrightarrow f_M(x)=\sum_{m=1}^{M}T_m(x) ⎩⎪⎪⎪⎨⎪⎪⎪⎧f0(x)……fm(x)=fm−1+Tm(x),m=1,2,...,M⟹fM(x)=∑m=1MTm(x)
采用平方差损失函数 L ( y , f ( x ) ) = [ y − f ( x ) ] 2 L(y,f(x))=[y-f(x)]^2 L(y,f(x))=[y−f(x)]2 时,其损失变为:
L ( y , f m − 1 + T m ( x ) ) = [ y − ( f m − 1 + T m ( x ) ) ] 2 L(y,f_{m-1}+T_m(x))=[y-(f_{m-1}+T_m(x))]^2 L(y,fm−1+Tm(x))=[y−(fm−1+Tm(x))]2
= [ ( y − f m − 1 ) − T m ( x ) ] 2 =[(y-f_{m-1})-T_m(x)]^2 =[(y−fm−1)−Tm(x)]2
= ( r − T m ( x ) ) 2 =(r-T_m(x))^2 =(r−Tm(x))2,其中 r = y − f m − 1 r=y-f_{m-1} r=y−fm−1对于学习第 m 棵树来讲,它所面对的真实标签值为 r r r,而 r r r 又是 m-1 次预测值与真实值之间的差,所以第 m 次学习的目标就是上一轮的残差。
-
算法过程
(1) 初始化: f 0 ( x ) = 0 f_0(x)=0 f0(x)=0
(2) 对 m=1,2,…,M
① 计算残差: r m i = y i − f m − 1 ( x i ) , i = 1 , 2 , . . . , n r_{mi}=y_i-f_{m-1}(x_i),i=1,2,...,n rmi=yi−fm−1(xi),i=1,2,...,n
② 将残差作为训练数据学习一个回归树: T m ( x ) T_m(x) Tm(x)
③ 更新模型: f m ( x ) = f m − 1 + T m ( x ) f_m(x)=f_{m-1}+T_m(x) fm(x)=fm−1+Tm(x)
(3) 得到提升树: f M ( x ) = ∑ m = 1 M T m ( x ) f_M(x)=\sum_{m=1}^{M}T_m(x) fM(x)=∑m=1MTm(x)
-
举例
x i x_i xi 1 2 3 4 5 6 7 8 9 10 y i y_i yi 5.56 5.7 5.91 6.4 6.8 7.05 8.9 8.7 9 9.05 (对于学习回归树的算法过程可参阅 决策树 - CART)
(1) 求出切分点:<0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5>
(2) 以 切分点 s1 = 1.5 为例。s1 将数据划分为 R1={x1},R1={x2,x3,…,x10}
(3) 对 R1,R2 中的 元素值 计算平均值 c1,c2 ,而后计算损失m1,m2. 其中 c1,c2 视作 R1,R2 结点的预测值。
e 1 = ∑ x i ∈ R 1 ( y i − c 1 ) 2 = 0 , e 2 = ∑ x i ∈ R 2 ( y i − c 2 ) 2 = 15.72 e_1=\sum_{x_i∈R_1}(y_i-c_1)^2=0,e_2=\sum_{x_i∈R_2}(y_i-c_2)^2=15.72 e1=∑xi∈R1(yi−c1)2=0,e2=∑xi∈R2(yi−c2)2=15.72
(4) 计算切分点 s1 的整体损失 m1=e1+e2=15.72
(5) 对于每一个切分点 sj,都计算其对应的整体损失 mj,最终取损失最小的切分点为最终划分点。并以最终划分点生成回归树 f 1 ( x ) f_1(x) f1(x).
s j s_j sj 1.5 2.5 3.5 4.5 5.5 6.5 7.5 8.5 9.5 m j m_j mj 15.72 12.07 8.36 5.78 3.91 1.93 8.01 11.73 15.74 根据计算,当 sj = 6.5 时损失值最小,所以我们选取 sj = 6.5 作为最终划分点,
且 R1={1, 2, 3, 4, 5, 6},R2={7, 8, 9, 10},C1=6.24,C2=8.91
所以回归树 T 1 ( x ) = { 6.24 , x < 6.5 8.91 , x ≥ 6.5 , 所 以 f 1 ( x ) = T 1 ( x ) T_1(x)=\begin{cases} 6.24,x<6.5\\ 8.91,x\ge6.5 \end{cases},所以 f_1(x)=T_1(x) T1(x)={6.24,x<6.58.91,x≥6.5,所以f1(x)=T1(x)
(6) 以上一轮学得的回归树 f 1 ( x ) f_1(x) f1(x) 对数据进行预测,并计算预测值与真实值的残差 ri
x i x_i xi 1 2 3 4 5 6 7 8 9 10 r i r_i ri -0.68 -0.54 -0.33 0.16 -2.11 -1.86 -0.01 -0.21 0.09 0.14 计算当前完整模型的损失函数值: L ( y , f 1 ( x ) ) = ∑ i = 1 10 r i 2 = 1.93 L(y,f_1(x))=\sum_{i=1}^{10}r_i^2=1.93 L(y,f1(x))=∑i=110ri2=1.93
看当前损失函数值是否符合我们的要求,如果符合则停止学习,如果不符合则以 (xi,ri) 作为新的训练数据对下一轮的决策树进行训练,重复步骤 (1)~(6)
-
-
GBDT(Gradient Boosting Decision Tree)
-
原理
提升树利用加法模型与前向分步算法实现学习的优化过程,当损失函数是平方损失或指数损失时,每一步优化都是很简单的,但是对于一般损失函数而言往往没有那么容易。所以提出了梯度提升算法。
梯度提升算法与梯度下降算法相似,利用损失函数的负梯度(求偏导)在当前模型的值(相当于泰勒展开式中的一阶近似):
− ∂ L ( y , f ( x i ) ) ∂ f ( x i ) -\frac{\partial L(y_, f(x_i))}{\partial f(x_i)} −∂f(xi)∂L(y,f(xi)) 进行计算,其中 f ( x i ) = f m − 1 ( x ) f(x_i)=f_{m-1}(x) f(xi)=fm−1(x),是上一轮完整模型的预测值。
在 GBDT 中计算残差的表达式为:
r i = − ∂ L ( y , f ( x i ) ) ∂ f ( x i ) r_i=-\frac{\partial L(y_, f(x_i))}{\partial f(x_i)} ri=−∂f(xi)∂L(y,f(xi))
而不再是预测值与真实值计算的差值。不过对于平方损失函数来讲,它就是通常所说的残差,对于一般损失函数来讲,它是残差的近似值。
-
特点
(1) 优点
① 预测阶段速度快
② 在建树时的特征选择过程中可并行化计算
③ 在分布稠密的数据集上,表达能力与泛化能力都很好
④ 使用决策树作为基分类器,模型具有较好的鲁棒性与解释性
(2) 缺点
① 在高维稀疏数据集上的表现不如 SVM 与 神经网络好
② 在处理文本特征分类问题上,相对其他模型的优势不如在处理数值型特征时明显
③ 训练过程依赖上一层的训练结果,需要串行。
-