前向分步算法
加法模型
上述公式其实就是基函数的一种线性组合,其中:
- $b(x;\gamma_m)$ 为基函数
- $\gamma_m$ 为基函数的参数
- $\beta_m$ 为基函数的系数
不同问题的提升树学习算法,其主要区别在于损失函数不同。平方损失函数常用于回归问题,用指数损失函数用于分类问题,以及绝对损失函数用于决策问题。
在给定训练数据以及损失函数 $L(y,f(x))$ 的条件下,上述模型学习问题转化为求损失函数极小值得优化问题:
若直接求解上述问题是非常困难的,因为需要同时求解 $m=1,\dots,M$ 个参数。
前向分步算法的求解思路:因为学习的是加法模型,如果能够从前向后,每一步只学习一个基函数及其系数,逐步逼近优化目标函数式,所以,前向分布算法每一步的优化目标为:
每次仅仅只学习一个基函数及其系数。
前向分步算法
输入:
- 训练数据集:$D=((x_1,y_1),(x_2,y_2),\dots,(x_N,y_N))$
- 损失函数:$L(y,f(x))$
- 基函数集:$b(x;\gamma)$
输出:
- 加法模型:$f(x)$
具体流程如下:
- 初始化 $f_o(x) = 0$
- 对 $m=1,2,\dots,M$
极小化损失函数:
得到参数 $\beta_m,\gamma_m$。
更新:
- 得到加法模型:
这样,前向分步算法将同时求解从 $m=1$ 到 $m=M$ 所有参数 $\beta_m,\gamma_m$ 的优化问题简化为逐次求解 $\beta_m,\gamma_m$ 的优化问题。
负梯度拟合
提升树算法
提升方法实际采用加法模型与前向分步算法,以决策树作为基函数的提升方法称为提升树。注意,这里的决策树为CART回归树,不是分类树。当问题是分类问题时,采用的决策树模型为分类回归树。
提升树模型可表示为:
其中,
- $T(x,\theta_m)$ 表示决策树
- $\theta_m$ 为决策树参数
- $M$ 为树的个数
不同的问题下,提升树算法的具体形式也不尽相同,主要区别在于损失函数不同。损失函数决定了决策树要拟合的值。一般情况,对于回归问题的提升树算法来说,损失函数为平方损失函数。
下面以平方损失函数为例,阐述算法流程:
输入:
- 训练数据集 $T=\{ (x_1,y_1),(x_2,y_2),…,(x_N,y_N) \}$
- $x_i\in \chi \subseteq\mathcal{R}^n,y_i\in\gamma\subseteq\mathcal{R}$
输出:
- 提升树 $f_M(x)$
具体流程如下:
- 初始化 $f_o(x) = 0$
- 对 $m=1,2,\dots,M$
- 计算残差
- 拟合残差 $r_{mi}$,学习一个回归树 $T(x;\theta_m)$
- 更新 $ f_m(x) = f_{m-1}(x) + T(x;\theta_m)$
- 得到回归问题提升树
梯度提升
提升树用加法模型与前向分布算法实现学习的优化过程,当损失函数为平方损失函数和指数损失函数时,优化问题较简单。而对于一般的损失函数并不容易,这时候一般利用梯度下降来进行优化,一般用负梯度拟合:
回归
梯度提升算法在回归问题上的流程:
输入:
- 训练数据集:$D=((x_1,y_1),(x_2,y_2),\dots,(x_N,y_N))$
- $x_i\in \chi \subseteq\mathcal{R}^n,y_i\in\gamma\subseteq\mathcal{R}$
- 损失函数:$L(y,f(x))$
输出:
- 回归树:$\widetilde{f}(x)$
具体流程如下:
- 初始化 $f_o=argmin_c\sum_{i=1}^NL(y_i,c)$
- 对 $i=1,2,\dots,N$ 计算
- 对 $r_{mi}$ 拟合一个回归树,得到第m颗树的叶结点区域 $R_{mj},j=1,2,\dots,J$
- 对于 $j=1,2,\dots,J$ 计算:
- 更新
- 得到回归树
分类
GBDT的分类算法从思想上和GBDT的回归算法没有本质区别,但是由于样本输出不是连续的值,而是离散的类别,导致我们无法直接从输出类别去拟合类别输出的误差。
为了解决这个问题,主要有两个方法,一个是用指数损失函数,此时GBDT退化为AdaBoost算法。另一种方法是用类似于逻辑回归的对数似然损失函数的方法。也就是说,我们用的是类别的预测概率值和真实概率值的差来拟合损失。
二分类
对于二分类GBDT,如果用类似逻辑回归的对数似然损失函数,则损失函数为:
此时的负梯度误差为:
多分类
多分类GBDT比二分类GBDT复杂些,对应的是多元逻辑回归和二元逻辑回归的复杂度差别。假设类别数为 $K$,则此时我们的对数似然损失函数为:
若输出类别为 $k$,则 $y_k=1,第 $k$ 类的概率 $P_k(x)$ 的表达式为:
集合上两式,我们可以计算出第t轮的第i个样本对应类别l的负梯度误差为:
常用损失函数
分类算法
其损失函数一般有对数损失函数和指数损失函数两种:
- 如果是指数损失函数,则损失函数表达式为其负梯度计算和叶子节点的最佳负梯度拟合和AdaBoost原理相同。
- 如果是对数损失函数,分为二元分类和多元分类两种,见上文。
回归算法
常用损失函数有如下4种:
均方差损失函数
绝对损失函数
对应负梯度误差为:
Huber损失函数
均方差和绝对损失的折衷产物,对于远离中心的异常点,采用绝对损失,而中心附近的点采用均方差。这个界限一般用分位数点度量。损失函数如下:
对应的负梯度误差为:
分位数损失函数
其中θ为分位数,需要在回归前指定。对应的负梯度误差为:
对于Huber损失和分位数损失,主要用于健壮回归,也就是减少异常点对损失函数的影响。
正则化
三种方法:
第一种是和AdaBoost类似的正则化项,即步长(learning rate)。
定义为 $\eta$,对于前面的弱学习器的迭代:$f_k(x)=f_{k-1}(x)+h_k(x)$。如果我们加上正则化项,则有 $f_k(x)=f_{k-1}(x)+\eta h_k(x)$,$\eta$ 的取值范围为 $0<\eta\le1$。对于同样的训练集学习效果,较小的 $\eta$ 意味着我们需要更多的弱学习器的迭代次数。通常我们用步长和迭代最大次数一起来决定算法的拟合效果。
第二种正则化的方式是通过子采样比例(subsample)。取值为 $(0,1]$。注意这里的子采样和随机森林不一样,随机森林使用的是放回抽样,而这里是不放回抽样。如果取值为1,则全部样本都使用,等于没有使用子采样。如果取值小于1,则只有一部分样本会去做GBDT的决策树拟合。选择小于1的比例可以减少方差,即防止过拟合,但是会增加样本拟合的偏差,因此取值不能太低。推荐在 $[0.5, 0.8]$ 之间。
第三种是对于弱学习器即CART回归树进行正则化剪枝。
优缺点
优点:
- 可以处理连续值和离散值
- 较小调参的情况下效果也比较好
- 对异常值有较好的鲁棒性
缺点:
- 弱学习器之间有较强依耐性,难以并行训练。
sklearn参数
1 | sklearn.ensemble.GradientBoostingRegressor(loss=’ls’, learning_rate=0.1, n_estimators=100, subsample=1.0, criterion=’friedman_mse’, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_depth=3, min_impurity_decrease=0.0, min_impurity_split=None, init=None, random_state=None, max_features=None, alpha=0.9, verbose=0, max_leaf_nodes=None, warm_start=False, presort=’auto’, validation_fraction=0.1, n_iter_no_change=None, tol=0.0001)[source] |
参数说明:
- n_estimators:弱学习器的最大迭代次数,也就是最大弱学习器的个数。
- learning_rate:步长,即每个学习器的权重缩减系数a,属于GBDT正则化方化手段之一。
- subsample:子采样,取值(0,1]。决定是否对原始数据集进行采样以及采样的比例,也是GBDT正则化手段之一。
- init:我们初始化的时候的弱学习器。若不设置,则使用默认的。
- loss:损失函数,可选{‘ls’-平方损失函数,‘lad’绝对损失函数-,‘huber’-huber损失函数,‘quantile’-分位数损失函数},默认’ls’。
- alpha:当我们在使用Huber损失”Huber”和分位数损失”quantile”时,需要指定相应的值。默认是0.9,若噪声点比较多,可适当降低这个分位数值。
- criterion:决策树节搜索最优分割点的准则,默认是”friedman_mse”,可选”mse”-均方误差与’mae”-绝对误差。
- max_features:划分时考虑的最大特征数,就是特征抽样的意思,默认考虑全部特征。
- max_depth:树的最大深度。
- min_samples_split:内部节点再划分所需最小样本数。
- min_samples_leaf:叶子节点最少样本数。
- max_leaf_nodes:最大叶子节点数。
- min_impurity_split:节点划分最小不纯度。
- presort:是否预先对数据进行排序以加快最优分割点搜索的速度。默认是预先排序,若是稀疏数据,则不会预先排序,另外,稀疏数据不能设置为True。
- validationfraction:为提前停止而预留的验证数据比例。当n_iter_no_change设置时才能用。
- n_iter_no_change:当验证分数没有提高时,用于决定是否使用早期停止来终止训练。
应用场景
可用于所有回归问题(线性/非线性),相对LR仅能用于线性回归,GBDT的适用面非常广。亦可用于二分类问题(设定阈值,大于阈值为正例,反之为负例)。