Table of Contents
1 GBDT概述
GBDT(Gradient Boosting Decision Tree )又叫 MART(Multiple Additive Regression Tree),是一种迭代的决策树算法。其中GB :Gradient Boosting,DT:(Regression) Decision Tree,GBDT的DT是回归树,不是分类树。但是它既可以用于回归也可以用于分类。
Boosting基于这样一种思想:对于一个复杂任务来说,将多个专家的判断进行适当(按照一定权重)的综合(例如线性组合加法模型)所得出的判断,要比其中任何一个专家单独的判断好。
GBDT是Boosting的一族的成员,也会进行迭代,使用前向分布算法。它是通过累加所有树的结论得出最终结果,GBDT的核心就在于,每一棵树学的是之前所有树结论和的残差,这个残差就是一个加预测值后能得真实值的累加量。下面举一个例子。
有4个人,年龄分别是10,12,16,18
2 前向分布算法
2.1 加法模型
加法模型(Aditive Model)是一种线性模型
fx= mMβmbx;γm
其中,b(x;γm)为基函数,γm为基函数的参数,βm为基函数的系数(权重)。
在给定训练数据及损失函数 Ly,fx 的条件下,学习加法模型 fx 成为经验风险极小化(即损失函数极小化)问题:
minβm,γmi=1NL(yi,mMβmbxi;γm)
即同时考虑N个样本在整个线性模型组中的损失函数的极小值,通常这是一个十分复杂的优化问题(求极值问题),想要一步到位求出最优解特别困难。
2.2 前向分布算法
2.2.1 思想
可以利用前向分步算法(Forward Stagewise Algorithm)求解这一优化问题,其思想是:因为学习的是加法模型(线性模型),如果能够从前向后,每一步只学习一个基函数 bx;γm 及其系数 βm ,逐步逼近优化目标函数式
minβm,γmi=1NL(yi,mMβmbxi;γm),
那么就可以极大简化优化的复杂度。
具体地,每步只需要优化如下损失函数:
minβ,γi=1NLyi,βbxi;γ ,
即一次只要考虑一个基函数及其系数即可.
2.2.2 策略
经验风险最小化。如果在模型中加入了penalty惩罚项,则可以演进为结构风险最小化。
2.2.3 加法模型求解
输入:训练数据集T={x1,y1,x2,y2,……,(xN,yN)};损失函数Ly,fx ; 基函数集{ bx;γ};
输出:加法模型fx
- 初始化f0x=0
- 对m=1,2,……,M
- 极小化损失函数
βm,γm=argminβ,γi=1NL(yi,fm-1xi+βb(xi;γ))
得到参数βm,γm
-
- 更新
fmx=fm-1x+βmb(x;γm)
- 得到加法模型
fx=fMx=m=1Mβmb(x;γm)
这样,前向分布算法将同时求解从m=1到M所有参数的βm,γm优化问题简化为逐步求解各个βm,γm的优化问题。
3 损失函数
因为GBDT既可以用于分类也可以用于回归,针对这两种不同的使用,损失函数各有不同。下面列举常用的几个常用的损失函数。
对于分类
- 指数损失函数
- 对数损失函数
对于回归
- 绝对损失
- 均方差
- Huber损失
- 分位数损失
4 负梯度拟合
参考网址:https://www.cnblogs.com/pinard/p/6140514.html
如何拟合损失函数?Leo Breiman 提出了用损失函数的负梯度来拟合本次迭代损失的近似值,进而拟合一棵CART回归树。
rti=-[∂L(yi,f(xi)))∂fxi]fxi=ft-1(x)
利用(xi,rti)(i=1,2,..m),我们可以拟合一颗CART回归树,得到了第 t 颗回归树,其对应的叶节点区域Rtj,j=1,2,...,J。其中J为叶子节点的个数。
针对每一个叶子节点里的样本,我们求出使损失函数最小,也就是拟合叶子节点最好的的输出值ctj如下:
ctj=argmincxi∈RtjL(yi,ft-1xi+c)
这样我们就得到了本轮的决策树拟合函数如下:
htx=j=1JctjI(x∈Rtj)
从而本轮最终得到的强学习器的表达式如下:
ftx=ft-1x+j=1JctjI(x∈Rtj)
通过损失函数的负梯度来拟合,我们找到了一种通用的拟合损失误差的办法,这样无轮是分类问题还是回归问题,我们通过其损失函数的负梯度的拟合,就可以用GBDT来解决我们的分类回归问题。区别仅仅在于损失函数不同导致的负梯度不同而已。
5 回归
输入:训练数据集T={x1,y1,x2,y2,……,(xm,ym)};损失函数Ly,fx ; 最大迭代次数T;
输出:强学习器fx
- 初始化
f0x=argminci=1NL(yi,c)
- 对迭代次数t=1,2,……,T 有:
- 对样本i=1,2,……,m ,计算负梯度
rtj=-[∂L(yi,f(xi)))∂fxi]fxi=ft-1(x)
-
- 利用(xi,rti)(i=1,2,..m),我们可以拟合一颗CART回归树,得到了第 t 颗回归树,其对应的叶节点区域Rtj,j=1,2,...,J。其中J为叶子节点的个数。
- 对叶子区域j =1,2,..J,计算最佳拟合值
ctj=argmincxi∈RtjL(yi,ft-1xi+c)
-
- 更新学习器
ftx=ft-1x+j=1JctjI(x∈Rtj)
- 更新学习器
- 得到强学习器f(x)的表达式
fx=fTx=f0(x)+t=1Tj=1JctjI(x∈Rtj)
6 GBDT分类
因为分类输出的结果是不连续的值,无法拟合数据结果的误差。可以使用两种方法解决这个问题,一是用指数函数,二是用类似于逻辑回归的对数似然函数的方法。
6.1 二分类
损失函数
L(y,f(x))=log(1+exp(-yf(x)))
其中y∈{-1,+1},则对叶子区域j =1,2,..J,计算最佳拟合值为
ctj=argmincxi∈Rtjlog(1+exp-yift-1xi+c))
由于上式较难优化,可以使用近似值代替
ctj=xi∈Rtjrtj/(xi∈Rtj|rtj|(1-|rtj|))
6.2 多分类
损失函数L(y,f(x))=-k=1Kyklogpk(x)
推导过程如上,可用近似值代替
ctj=K-1Kxi∈Rtjrtjxi∈Rtj|rtj|(1-|rtj|)
7 正则化
8 优缺点
优点
- 可以灵活处理各种类型的数据,包括连续值和离散值。
- 在相对少的调参时间情况下,预测的准确率也可以比较高。这个是相对SVM来说的。
- 使用一些健壮的损失函数,对异常值的鲁棒性非常强。比如 Huber损失函数和Quantile损失函数
缺点
- 由于弱学习器之间存在依赖关系,难以并行训练数据。不过可以通过自采样的SGBT来达到部分并行
9 sklearn参数
官方文档https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.GradientBoostingClassifier.html
经常会通过以下几个参数进行调优
- n_estimators: 也就是弱学习器的最大迭代次数
- learning_rate: 即每个弱学习器的权重缩减系数ν,也称作步长
- loss: 即我们GBDT算法中的损失函数
10 应用场景
主要应用于回归和分类。
回归:信用评分等。
分类:职位分类,预测疾病的风险等。