机器学习 【 GBDT算法】
知识准备:
arg 是变元(即自变量argument)的英文缩写。
arg min 就是使后面这个式子达到最小值时的变量的取值
arg max 就是使后面这个式子达到最大值时的变量的取值
例如 函数F(x,y):
arg min F(x,y)就是指当F(x,y)取得最小值时,变量x,y的取值
arg max F(x,y)就是指当F(x,y)取得最大值时,变量x,y的取值
GBDT(Gradient Boosting Decision Tree) 又叫 MART (Multiple Additive Regression Tree),是一种迭代的决策树算法。由多棵决策树组成,最后把所有树的结论累加起来做决策。它是一个泛化能力较强的算法。GBDT里有三个概念:分别是Regression Decistion Tree、Gradient Boosting、Shrinkage。
用三颗决策树预测一个人身高时,决策棵1预测为是1.7米,决策树2预测是1.75米,决策树3预测是1.8米。然后1.7 + 1.75 + 1.8 求均值,这样是不对的。因为只要训练集不变,独立训练三次的三棵树必定完全相同,这样做完全没有意义的。
我们在用GBDT做预测的时候,每棵树的数值不是身高的实际数值,而是一个残差值,将残差值累加才是真实身高=。每一棵树学的是之前所有树的残差,这个残差累加后能得到真实值。
例如一个人的身高是1.8米,决策树1预测为1.1米,1.8 - 1.1 = 0.7,那么残差为0.7米。然后决策树2将0.7米拿去训练学习,如果决策树2能把年龄分到0.7米的叶子节点,那累加两棵树的结果:1.1 + 0.7 = 1.8米就是实际身高;如果决策树2的结果是0.5米,那么决策树2将0.5米拿去训练学习,0.7 - 0.5 = 0.2,则还存在0.2米的残差,决策树3继续学。这就是Gradient Boosting的核心思想。
我们都知道,决策树可以用于回归和分类。回归树用于预测实数值,用户的身高,体重,年龄,爱好,所在地的天气,湿度,温度,是否有风。分类树用于分类标签值,如气温高,低,适中、用户性别,学历,工作类型。数值相加减是有意义的,1米 + 1.5米 + 1.7米 = 3.2米,标签值相加减是无意义的,如男+男+女=到底是男是女? GBDT的核心在于累加所有树的结果作为最终结果。虽然调整后也可用于分类,但不代表GBDT的树是分类树。
Shrinkage的思想强调的是循序渐进,就好比不能一口吃出一个胖子。每次迭代只走一小步逐渐逼近结果的效果,要比每次迈一大步很快逼近结果的方式更容易避免过拟合。即它不完全信任每一个棵残差树,它认为每棵树只学到了真理的一小部分,累加的时候只累加一小部分,通过多学几棵树弥补不足。
提升方法实际采用加法模型(即基函数的线性组合)与前向分布算法。以决策树为基函数的提升方法称为提升树(boosting tree)。提升树模型可以表示为决策树的加法模型:
其中,表示决策树;
为决策树的参数;M为树的个数
回归问题提升树使用以下前向分布算法:
在前向分布算法的第m步,给定当前模型,需求解
得到,即第m棵树的参数
当采用平方误差损失函数,
其损失变为:
其中,是当前模型拟合数据的残差(residual)。对于平方损失函数,拟合的就是残差;对于一般损失函数(梯度下降),拟合的就是残差的近似值
输入:训练数据集
输出:提升树
算法流程:
(1)初始化
(2)对m = 1,2,…,M
1.计算残差
2.拟合残差学习一个回归树,得到
3.更新
4.得到回归问题提升树
如下表所示:一组数据,特征为年龄、体重,身高为标签值。共有5条数据,前四条为训练样本,最后一条为要预测的样本。
所以初始化时,r取值为所有训练样本标签值的均值。r=(1.1+1.3+1.7+1.8)/4=1.475,此时得到初始学习器
此时将残差作为样本的真实值训练f1(x),即下表数据
接着,寻找回归树的最佳划分节点,遍历每个特征的每个可能取值。从年龄特征的5开始,到体重特征的70结束,分别计算方差,找到使方差最小的那个划分节点即为最佳划分节点。
以上划分点是的总方差最小为0.0125有两个划分点:年龄21和体重60,所以随机选一个作为划分点,这里我们选年龄21。
此时还需要做一件事情,给这两个叶子节点分别赋一个参数,来拟合残差。
这里其实和上面初始化学习器是一个道理,平方损失,求导,令导数等于零,化简之后得到每个叶子节点的参数r,其实就是标签值的均值。
根据上述划分节点:
样本1,2为左叶子节点,(x1,x2∈R11),所以r11=(−0.375−0.175)/2=−0.275
样本3,4为右叶子节点,(x3,x4∈R21),所以r21=(0.225+0.325)/2=0.275
此时可更新强学习器 :
当年龄 < 21岁时,f1 = 1.475 + (-0.275) = 1.2
当年龄 > 21岁时,f1 = 1.475 + 0.275 = 1.75
循环迭代M次,M是人为控制的参数,迭代结束生成M棵树
为了方别展示和理解,我们假设M=1,根据上述结果得到强学习器:
如图所示得到只迭代一次,只有一颗树的GBDT:
此时可更新强学习器:
f1 = 1.475 + (-0.275) = 1.2
f1 = 1.475 + 0.275 = 1.75
样本在根节点中(即初始学习器)被预测为1.475,样本的年龄为25,大于划分节点21岁,所以被分到了右边的叶子节点,同时被预测为0.275。此时便得到样本的最总预测值为1.75。
其中,X(i)为n维向量,表示的是第i个样本的特征,y(i)为样本的标签,在回归问题中,标签y(i)为一系列连续的值。此时,利用训练样本训练一棵CART回归树:
开始时,CART树中只包含了根结点,所有样本都被划分在根结点上:
此时,计算该节点上的样本的方差(此处要乘以m),方差表示的是数据的波动程度。那么,根节点的方差的m倍为:
那么,什么样本的划分才是当前的最好划分呢?此时计算左右子树的方差之和:
通过以上的过程,我们发现,划分前,记录节点的值为:
当划分后,两个节点的值的和为:
欢迎大家交流学习,任何问题都可以留言
参考资料:
https://blog.csdn.net/molu_chase/article/details/78111148
https://blog.csdn.net/google19890102/article/details/51746402
https://blog.csdn.net/a819825294/article/details/51188740
http://blog.csdn.net/zpalyq110/article/details/79527653