以决策树为基函数的提升方法称为提升树。其中,分类问题采用二叉分类树,回归问题采用二叉回归树。sklearn中的提升树采用的是CART树。模型可以表示为决策树的加法模型:
其中,表示决策树,为决策树的参数,为树的个数。
提升树算法采用前向分步算法。首先,初始确定初始提升树为。第步的模型是
其中,为当前模型,通过经验风险极小化确定下一棵决策树的参数
由于树的线性组合能很好地拟合训练数据,即使数据中的输入与输出关系很复杂也是如此,所以提升树是一个高功能的学习算法。
不同提升树算法的区别在于所采用的损失函数不同。例如,分类树采用指数损失函数;回归树采用平方误差损失函数;一般决策树采用一般损失函数。
在之前的文章中已经介绍过二叉回归树,在这里不在进行赘述。对于回归问题,提升树采用平方误差损失函数,即
带入第步得到的提升树模型,得到
其中,为训练数据真实值与当前模型取值的差,即拟合数据的残差。要是上述的损失函数最小,只需训练的模型更好地拟合当前模型的残差即可。
回归问题的提升树算法可描述如下:
输入:训练数据集D
输出:提升树
训练过程:
① 初始化
② 对
(a)计算残差
(b)拟合残差,学习一个二叉回归树,得到
(c)更新
③ 得到回归问题提升树
对于二分类问题,只需要将AdaBoost算法中的基学习器限制为二类分类树(只有一个根结点和两个叶子结点,高度为2的二叉树),基分类器的权重全部置为1即可。训练过程中用指数损失函数来调整样本数据的权重,从而让每个基分类器学习到不同的内容。
首先介绍梯度下降法的整体思想。假设你现在站在某个山峰的顶峰,在天黑前要到达山底,在不考虑安全性的基础上,如何下山最快?
最快的方法是:以当前所在的位置为基准点,按照该点最陡峭的方向向山底前进。走一段距离后,在重新以当前点为基准点,重复上述操作,知道到底山底(最低点)。在这个过程中,需要不停地去重新定位最陡峭的方向,才不会限于局部最优。
在下山过程中会面临两个问题:
当前位置的梯度表示为,取步长,则下一步所在的位置如下:
总结:梯度下降用来求某个函数取最小值时,自变量对应的取值。
在机器学习任务中,梯度下降一般运用在通过损失函数最小化求解模型参数中。使用梯度下降算法求解最优模型参数的过程如下:
(2)用步长乘以损失函数的梯度,得到当前位置下降的距离,即:;
(3)判断梯度下降的距离是否小于阈值,如果小于,则算法终止,当前的即为求得的最优参数;否则进入步骤(4);
从泰勒公式的角度理解梯度下降:
(1)首先,给出迭代公式:
(2)将在处展开:
移项可得:
其中,和均为向量,表示二者点乘,当二者方向相同,即夹角为0时,点乘的值最大。这个点乘代表了从到函数值的上升量。为在处的梯度,这也说明了当与梯度方向相同时,函数值上升最快;反之,如果与负梯度方向相同(与梯度方向相反时),函数梯度下降的最快。所以可以取,此时,与负梯度方向相同,函数值下降最快,这正式所需要的,因为目标是最小化损失函数,损失函数值下降的越快越好。于是,参数的迭代公式如下:
在提升树算法中,对于损失函数采用平方误差或者指数损失时,每一步的优化是比较简单的,但是对于一般损失函数,则很难进行。针对这一问题,Friedman提出了梯度提升树算法,利用最速下降的近似方法,将当前模型的损失函数的负梯度作为提升树算法中残差的近似值,即每一步的基学习器(CART回归树)拟合损失函数的负梯度。
梯度提升算法有梯度下降和Boosting两部分组成。常规的梯度下降是在参数空间进行地,目的是得到最优的模型参数。这里的梯度下降是在函数空间进行,目的是得到最优的模型。
提升树第m步的模型可以表示为:
其中,是已知的,所以求出也就求得。此时,要优化的损失函数如下:
将在处进行一阶泰勒展开:
可以发现公式中的梯度变量变为模型(函数),所以说是在函数空间进行的梯度下降。在常规的梯度下降中,为了使损失函数下降最快,到这一步后是直接取负梯度乘上步长来更新参数;但是在Boosting算法中,我们要更新的是模型,而不是参数,所以只能让模型来拟合负梯度,即在第m步中,的求解公式如下:
求出就可以求出。
处理回归问题时,GBDT一般使用平方误差损失函数,损失函数的负梯度即为残差。平方误差损失函数如下:
对求梯度得
GBDT回归树的训练流程如下:
输入:训练数据集,损失函数(一般是平方误差损失函数),学习率(梯度下降算法中的步长);
输出:回归树。
训练过程:
① 初始化
在损失函数是平方误差损失函数时,取标签的平均值。
② 对
(a)对,计算
当损失函数为平方误差损失函数时,负梯度等于残差。
(b)对拟合一个CART回归树,得到第棵树的叶结点区域。
(c)对,计算
利用线性搜索估计叶结点区域的值,使得损失函数极小化。损失函数为平方误差损失函数时,等于第个叶结点区域的全部样本标签的平均值。
③ 得到回归树
在训练过程中,如果选择了合适的步长,损失函数的梯度是逐渐递减的,当损失函数的梯度为0时,达到极值点,此时,残差也必然接近0,损失函数获得最小值。因此,迭代生成CART树的过程本质是梯度减小的过程,是一个二次函数优化的过程。
对于分类问题,GBDT的基学习器也是CART回归树。与回归问题的区别在于使用的损失函数不同。分类问题通常使用交叉熵作为损失函数,交叉熵损失函数形式如下:
其中,表示样本数量,表示类别数量,表示第个样本属于第个类别,表示将个样本预测为第个类别的概率。
CART回归树的叶子结点值是一个实数,对于回归问题,由损失函数最优化,可得叶子结点的取值为样本标签的均值。由于分类问题,样本标签是离散值,使用交叉熵损失函数,所以需要把预测的实数转换成概率。
(1)二分类问题
在二分类问题中(类别标签取值为0或者1),可以与逻辑回归一样,使用Sigmoid函数即可把实数值转变成概率形式,如下:
其倒数为:。
首先,求各叶结点的取值。
二分类问题中,使用的交叉熵损失函数,可写成如下形式:
假设,在生成CART树的过程中,第m轮的树为,样本被预测为正样本的概率可以用如下形式表示:
损失函数为:
由一阶泰勒展开式
其中,为各叶结点的取得的实数值。上述式子对求导:
由于,导数为0时,可以取得最优值,令上述导数为0,可求得:
以上,即为第生成的叶结点的取值。
下面,来求初始值,损失函数函数:
其中,为常数,对求导,并且令导数为0,此时,损失函数取得最优值,求得:
GBDT二分类树的训练流程如下:
输入:训练数据集,其中,,损失函数(一般是交叉熵损失函数),学习率(梯度下降算法中的步长);
输出:二分类树。
训练过程:
① 初始化
② 对
(a)对,计算
当损失函数时交叉熵时,负梯度等于残差。
(b)对拟合一个CART回归树,得到第棵树的叶结点区域。
(c)对,计算
利用线性搜索估计叶结点区域的值,使得损失函数极小化。损失函数为交叉熵损失函数时,
③ 得到二分类树
分类和回归中所使用的到回归树是一样的,传入属性值作为分裂待选结点,利用残差作为目标值,回归树regression_tree使用平方差函数作为信息增益函数。
(2)多分类问题
二分类可拓展至多分类,采用one vs rest的策略,假设有s个类别,则每轮需要训练s棵树,每一棵树用来判断是否属于其中的一个类别。其中,样本的类型标签,需要进行one-hot处理,生成s为列向量。第m轮,第k棵树(用来识别类别k),CART树为,利用softmax函数可以将转化为概率:
使用交叉熵作为损失函数,得到如下损失函数表达式:
利用softmax函数性质,损失函数对m轮第q棵树求导,可得:
可以看出,GBDT的多分类仍然是残差的形式。
GBDT多分类树的训练流程如下:
输入:训练数据集,其中,,损失函数(一般是交叉熵损失函数),学习率(梯度下降算法中的步长);
输出:s棵二分类树。
训练过程:
① 对样本的类别标签进行one-hot向量化,生成维类别向量,每行数据只含有0或1,即为二分类问题。
② 初始化棵树的初始值
③ 对
(a)对,
(i)对,利用softmax函数,计算出第个样本属于第个类别的概率:
(ii)对,计算负梯度,由上述描述可知,亦为样本的残差
(b)对,拟合一棵CART回归树,得到第轮,第棵树的叶结点区域。
(c)对,计算
利用线性搜索估计叶结点区域的值,使得损失函数极小化。损失函数为交叉熵损失函数时,
(d)更新
③ 得到s棵二分类树
Friedman在GBM的论文中提出的方法: 特征的全局重要性,通过特征在单棵树中的重要度的均值来衡量,即
其中,表示特征在第轮训练的CART回归树中的重要度。
其中,表示第棵树的内部结点,为树的叶结点数(由完全二叉树的性质,树的内部结点数=叶结点数-1),表示,在结点分裂后减小的平方误差损失,表示当前结点分裂时使用的特征。
(1)GBDT算法优点
(2)GBDT算法缺点
1. 机器学习之梯度提升决策树(GBDT)_谓之小一的博客-CSDN博客_梯度提升决策树
2. GBDT的原理、公式推导、Python实现、可视化和应用 - 知乎
3. 《统计学习方法 第二版》.李航
4. GBDT算法——理论与sklearn代码实现 - 知乎
5. Sklearn参数详解—GBDT - 百度文库
6. GBDT算法的特征重要度计算_yangxudong的博客-CSDN博客_gbdt特征重要性
7. 梯度提升决策树-GBDT
8. 通俗易懂讲解梯度下降法 - 知乎
9. 梯度下降(详解)_流年若逝的博客-CSDN博客_梯度下降
10. GBDT原理与实践-多分类篇_kingsam_的博客-CSDN博客_gbdt多分类
11. GBDT算法的优缺点_suv1234的博客-CSDN博客_gbdt优点