从头到尾理解树模型(二):GBDT

从头到尾理解树模型(二):GBDT_第1张图片

看上图,首先对集成学习有一个宏观的认识。
三种基本的集成方法:Bagging、Boosting和Stacking。分别产生了Random Forest(随机森林),AdaBoost和GBDT。

1. 集成学习(Ensemble Learning)

集成学习是指将多个基学习器(弱学习器)结合来完成学习任务。通过模型集成,一般会获得比单个基学习器更好的效果。集成学习的原则是 “好而不同”。根据个体学习器的生成方式,可以分为两类。

  1. 个体学习器间存在强依赖关系,串行生成的序列化方法,Boosting
  2. 个体学习器间不存在强依赖关系,并行生成的方式,Bagging

1.1 Boosting

工作机制:

  1. 数据集D,首先训练一个弱分类器(学习算法),然后对着同一个数据集进行迭代;
  2. 队训练样本进行调整,第一次预测错误的样本,我们增加它的权重,然后降低预测正确样本的权重;
  3. 对这个调整过后的数据集,重新训练分类器;
  4. 将每个基学习器加权求和

Boosting算法是一种加法模型。

AdaBoost

AdaBoost是Adaptive Boosting的缩写,针对同一个训练集训练不同的学习模型,然后将不同的这n个模型,带权相加。AdaBoost是Boosting的经典算法, 主要给出了每一个权重更新的迭代公示。

AdaBoost Vs GBDT:

相同: 都是Boosting算法,均是迭代求解,都是前向分步算法;
不同: GBDT限定CART树,AdaBoost可使用决策树,NN等基分类器,迭代思路不同

  • GBDT:已知前一轮的弱学习器 f t − 1 ( x ) f_{t-1}(x) ft1(x),损失函数 L ( y , f ( x ) ) L(y, f(x)) L(y,f(x))。找到一个弱学习器 h t ( x ) h_t(x) ht(x)使得损失函数最小。 L ( y , f t ( x ) ) = L ( y , f t − 1 ( x ) + h t ( X ) L(y, f_t(x)) = L(y, f_{t-1}(x) + h_t(X) L(y,ft(x))=L(y,ft1(x)+ht(X)
  • AdaBoost:训练前一轮的学习器后,根据错误率,修改数据分布权值,扩大分错数据的权重,重新训练学习器。

1.2 Bagging

Bagging与Boosting有着明显的不同,主要体现在样本的选取,和基学习器的训练与相加上。

考虑数据集 D D D D D D具有 m m m个样本,我们对数据进行有放回的随机采样(自助采样法),得到具有m个样本的数据集,重复同样的工作T次,便可以得到T个m样本数的数据集。然后对每个训练样本集训练,得到不同的基学习器,对基学习器平均,即得到总的模型。

算法流程图如下:

Bootsing VS Bagging:

算法 Boosting Bagging
采样方法 对同一个数据集迭代,不断增加训练错误样本的权重 m次有放回采样得到具有m个样本采样集
代表算法 AdaBoost、GBDT Random Forest
样本权重 不同 相同
基学习器权重 不同 相同
作用 降低偏差 降低方差
并行 不支持 支持

2. GBDT(Gradient Boosting Decision Tree)

这里介绍的GBDT特指,“Greedy Function Approximation:A Gradient Boosting Machine”中提出的算法,使用了一阶展开,也就是梯度下降进行优化。通产情况下,GBDT(Gradient Boosting Decision Tree)泛指所有的梯度提升树算法,也就包括XGBoost和LightGBM。

2.1 提升树(Boosting Tree)

讲解GBDT之前首先明白什么是提升树。
什么是提升树:
提升树是一个以决策树为基模型的Boosting方法,是一个加法模型。

加法模型:
f M ( x ) = ∑ m = 1 M T ( x , θ m ) f_M(x) = \sum_{m=1}^MT(x, \theta_m) fM(x)=m=1MT(x,θm)
T ( x , θ m ) : T(x, \theta_m): T(x,θm):第m颗决策树; θ m : \theta_m: θm:决策树参数; M : M: M:树的个数。

回归问题的提升树算法:

输入:训练集, T = ( x 1 , y 1 ) , ( x 2 , y 2 ) . . . ( x n , y n ) T={(x_1, y_1), (x_2, y_2)...(x_n, y_n)} T=(x1,y1),(x2,y2)...(xn,yn)
输出:提升树, f M ( x ) f_M(x) fM(x)

  1. 初始化 f 0 ( x ) = 0 f_0(x) = 0 f0(x)=0;
  2. m = 1 , 2 , 3... M m = 1,2,3...M m=1,2,3...M
    (1) 计算残差: r m i = y i − f m − 1 ( x i ) r_{mi} = y_i -f_{m-1}(x_i) rmi=yifm1(xi);
    (2) 拟合残差 r m i r_{mi} rmi学习一个回归树,得到 T ( x ; θ m ) T(x; \theta_m) T(x;θm);
    (3) 更新 f m ( x ) = f m − 1 ( x ) + T ( x ; θ m ) f_m(x) = f_{m-1}(x) + T(x; \theta_m) fm(x)=fm1(x)+T(x;θm)
  3. 回归问题提升树: f M ( x ) = ∑ m = 1 M T ( x , θ m ) f_M(x) = \sum_{m=1}^MT(x, \theta_m) fM(x)=m=1MT(x,θm)

为什么要拟合残差:
首先提升树是一个加法模型, f m ( x ) = f m − 1 ( x ) + T ( x ; θ m ) f_m(x) = f_{m-1}(x) + T(x; \theta_m) fm(x)=fm1(x)+T(x;θm)
前向分步算法中第m步,给定 f m − 1 ( x ) f_{m-1}(x) fm1(x),求解参数即求Loss最小化:
θ = a r g m i n ( ∑ L ( y i , f m ( x ) ) ) = a r g m i n ( ∑ L ( y i , f m − 1 ( x ) + T ( x ; θ m ) ) ) \theta = argmin(\sum L(y_i, f_m(x))) = argmin(\sum L(y_i, f_{m-1}(x) + T(x; \theta_m))) θ=argmin(L(yi,fm(x)))=argmin(L(yi,fm1(x)+T(x;θm)))

平方误差损失函数: L ( y , f ( x ) ) = ( y − f ( x ) ) 2 L(y, f(x)) = (y-f(x))^2 L(y,f(x))=(yf(x))2
代入上式: L ( y i , f m − 1 ( x ) + T ( x ; θ m ) ) = ( y − f m − 1 ( x ) − T ( x ; θ m ) ) 2 L(y_i, f_{m-1}(x) + T(x; \theta_m)) = (y - f_{m-1}(x) - T(x;\theta_m))^2 L(yi,fm1(x)+T(x;θm))=(yfm1(x)T(x;θm))2
r m i = y i − f m − 1 ( x i ) r_{mi} = y_i -f_{m-1}(x_i) rmi=yifm1(xi)即为我们要拟合的。

回归问题下,损失函数是MSE,优化简单,但是对于复杂的损失函数,优化并不是那么容易。因此Freidman提出梯度提升的算法,使用负梯度来作为残差的近似值,拟合回归树,进而引出我们的GBDT。

2.GBDT算法原理:

2.1 GBDT回归算法:

输入:训练集样本 T = ( x 1 , y 1 ) , ( x 2 , y 2 ) . . . ( x n , y n ) T={(x_1, y_1), (x_2, y_2)...(x_n, y_n)} T=(x1,y1),(x2,y2)...(xn,yn),最大迭代次数T, 损失函数L
输出:提升树, f M ( x ) f_M(x) fM(x)

  1. 初始化: f 0 ( x ) = a r g m i n ( ∑ L ( y i , c ) ) f_0(x) = argmin(\sum L(y_i, c)) f0(x)=argmin(L(yi,c))
  2. t = 1 , 2 , 3... m t = 1,2,3...m t=1,2,3...m
    (1) 计算负梯度:
    r t i = − [ ∂ L ( y i , f ( x i ) ) ∂ f ( x i ) ] f ( x ) = f m − 1 ( x ) r_{ti} = -[\frac{\partial L(y_i, f(x_i))}{\partial f(x_i)}]_{f(x)=f_{m-1}(x)} rti=[f(xi)L(yi,f(xi))]f(x)=fm1(x)
    (2) 利用 ( x i , r t i ) , ( t = 1 , 2 , 3.. m ) (x_i, r_{ti}), (t=1,2,3..m) (xi,rti),(t=1,2,3..m) , 拟合一颗CART回归树,得到第t颗回归树,其对应的叶子节点区域为 R t j , j = 1 , 2... J R_{tj}, j=1,2...J Rtj,j=1,2...J。其中J为回归树t的叶子节点的个数
    (3) 对每一个叶子区域计算最佳拟合值: c t j = arg ⁡ min ⁡ ⎵ c ∑ x i ∈ R t j L ( y i , f t − 1 ( x i ) + c ) c_{t j}=\underbrace{\arg \min }_{c} \sum_{x_{i} \in R_{t j}} L\left(y_{i}, f_{t-1}\left(x_{i}\right)+c\right) ctj=c argminxiRtjL(yi,ft1(xi)+c)
    (4) 更新强学习器: f t ( x ) = f t − 1 ( x ) + ∑ j = 1 J c t j I ( x ∈ R t j ) f_{t}(x)=f_{t-1}(x)+\sum_{j=1}^{J} c_{t j} I\left(x \in R_{t j}\right) ft(x)=ft1(x)+j=1JctjI(xRtj)
  3. 得到强学习器 f ( x ) : f(x): f(x):
    f ( x ) = f T ( x ) = f 0 ( x ) + ∑ t = 1 T ∑ j = 1 J c t j I ( x ∈ R t j ) f(x)=f_{T}(x)=f_{0}(x)+\sum_{t=1}^{T} \sum_{j=1}^{J} c_{t j} I\left(x \in R_{t j}\right) f(x)=fT(x)=f0(x)+t=1Tj=1JctjI(xRtj)

2.2 GBDT二分类问题:

二分类问题和回归问题大部分是相同的,只是损失函数不同。使用Logloss作为损失函数:
损失函数:
L ( y i , F m ( x i ) ) = − y i l o g p i + ( 1 − y i ) l o g ( 1 − p i ) L(y_i,F_m(x_i))=−{y_ilogp_i+(1−y_i)log(1−p_i)} L(yi,Fm(xi))=yilogpi+(1yi)log(1pi)
概率:
p i = 1 1 + e ( − F m ( x i ) ) p_i=\frac{1}{1+e(−F_m(x_i))} pi=1+e(Fm(xi))1
代入化简:
L ( y i , F m ( x i ) ) = − y i l o g p i + ( 1 − y i ) l o g ( 1 − p i ) = − y i F m ( x i ) − l o g ( 1 + e F m ( x i ) ) L(y_i,F_m(x_i))=−{y_ilogp_i+(1−y_i)log(1−p_i)}=−{y_iF_m(x_i)−log(1+e^{F_m(x_i)})} L(yi,Fm(xi))=yilogpi+(1yi)log(1pi)=yiFm(xi)log(1+eFm(xi))

参考资料:

[1] GBDT算法原理以及实例理解
[2] GBDT(MART) 迭代决策树入门教程 | 简介
[3] Boosting Decision Tree入门教程
[4] 决策树系列(五)——CART
[5] 梯度提升树GBDT原理
[6] 数据挖掘十大算法之CART详解
[7] 梯度提升树(GBDT)原理小结
[8] 集成学习之Adaboost算法原理小结
[9] GBDT原理与Sklearn源码分析-分类篇
[10] GBDT原理与Sklearn源码分析-回归篇
[11] GBDT原理与实践-多分类篇

你可能感兴趣的:(人工智能,python,机器学习)