ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

GBDT的原理和应用

2021-06-22 09:04:55  阅读:147  来源: 互联网

标签:特征 模型 样本 叶子 GBDT 应用 原理 节点


概述
DT-Decision Tree决策树,GB是Gradient Boosting,是一种学习策略,GBDT的含义就是用Gradient Boosting的策略训练出来的DT模型。模型的结果是一组回归分类树组合(CART Tree Ensemble)T1…Tk。其中Tj学习的是之前j-1棵树预测结果的残差,这种思想就像准备考试前的复习,先做一遍习题册,然后把做错的题目挑出来,在做一次,然后把做错的题目挑出来在做一次,经过反复多轮训练,取得最好的成绩。而模型最后的输出,是一个样本在各个树中输出的结果的和:
在这里插入图片描述

假设我们要预测一个人是否会喜欢电脑游戏,特征包括年龄,性别是否为男,是否每天使用电脑。标记(label)为是否喜欢电脑游戏,假设训练出如下模型

在这里插入图片描述

该模型又两棵树组成,T1使用 age < 15 和 is male 作为内节点,叶子节点是输出的分数。T2使用是否每日使用电脑作为根节点。假设测试样本如下:
在这里插入图片描述

样本在两棵树中所在的叶节点如下:
在这里插入图片描述

最后对某样本累加它所在的叶子节点的输出值,例如:
在这里插入图片描述
GBDT + LR
单独的使用GBDT模型,容易出现过拟合,在实际应用中往往使用 GBDT+LR的方式做模型训练,首先根据样本训练出GBDT树,对于每个叶子节点,回溯到根节点都可以得到一组组合特征,所以用叶子节点的标号可以代表一个新的组合特征。结合上面的图,用一个样本为例,直观的表达如下:
在这里插入图片描述

其中 0号 组合特征的含义是:ageLessThan15AndIsMale,该样本取值 0
其中 1号 组合特征的含义是:ageLessThan15AndIsNotMale,该样本取值 1
其中 2号 组合特征的含义是:ageLargerOrEqualThan15,该样本取值 0
其中 3号 组合特征的含义是:useComputerDaily,该样本取值 0
其中 4号 组合特征的含义是:notUseComputerDaily,该样本取值 1
这部分特征是GBDT生成的组合特征,再结合LR固有的稀疏特征,就组成了 GBDT + LR 模型。生成样本向量阶段,样本首先过GBDT模型,生成组合特征部分的输入向量,再结合固有的稀疏特征向量,组成新的特征向量,示例如下:
在这里插入图片描述

在该例子中,第一行绿颜色是通过 GBDT 模型生成的特征向量,每个值都代表一个叶子节点的输出(样本在某棵树只在一个叶子节点有输出),第二行表示 LR 模型的稀疏特征向量,第三行表示把两部分特征向量拼接在一起,组成一个最终的特征向量,并使用该向量训练LR模型。
实践
XGBoost是GBDT最广为人知的一个实现。通过使用一定程度的近似,使得求解变得更高效。同时支持分布式和 GPU 优化,有着广泛的使用。在实践中,算法工程师使用 Spark 或者Python 的 XGBoost 库训练模型,并保存成文件,线上根据不同的语言采用相应的依赖包,将模型导入,执行决策。Java 中使用。
XGBoost算法原理
还记得前文提到的 GBDT 可以用如下公式表示:
在这里插入图片描述

优化目标如下:
在这里插入图片描述

年样本数量,yi表示样本真实 Label,y是模型输出,所以前半部分代表模型的损失函数。K表示树的个数,fk表示第K棵树. 那么如何找到一组树,使得 obj最小呢。
核心的思想是,已经训练好的树T1 - Tt-1不再调整。根据目标函数最小原则,新增树他Tt去拟合。
假设此时对第t棵树训练,则目标函数表示为:
在这里插入图片描述

回顾高等数学中的泰勒展开,它使用一个函数的高阶导数,用多项式的形式逼近原始函数。当展开到二阶导数的时候公式如下:
在这里插入图片描述

对obj二阶泰勒公式展开:
在这里插入图片描述

忽略常量得到:
在这里插入图片描述

如前述示T节点个数,w叶子节点的输出。
我们可以把这个视角换一下。既然每个样本都会落到一个叶子节点,最外层的累加维度可以为叶节点。定义在这里插入图片描述
,含义是被映射到第j叶子节点的样本,该叶子节点的输出为 在这里插入图片描述
,那么

在这里插入图片描述

可以推导出:
在这里插入图片描述

看做一个二项式,可以得到:
在这里插入图片描述

所以根对于待训练的新树而言, 可以根据训练好的树预先计算好,枚举所有可能的新树的结构,选择目标函数最小的那棵树,同时使用 在这里插入图片描述
求得该树每个叶子节点的输出值,不断求解下去,就可以训练出一组最优树。
贪心法求解树
在XGBoost使用贪心法求解树结构,算法描述如下:
初始化树深度 0(即只有一个叶子节点,所有样本都落在该节点)
对于每个叶子节点,尝试分裂该节点,在分裂后得到的增益定义如下:
在这里插入图片描述

该公式定义了,分裂后左右子树的新增得分减去不分裂时候节点得分,再减去因为新增一个节点,增加的复杂度。
对于每个叶子节点,枚举所有的特征
对每个特征,把映射到该叶节点的样本按照该特征值排序
使用线性扫描来决定最佳分裂点
在所有枚举的特征中,选择最优的分裂
总结
从XGBoost原理部分可以看出,XGBoost的实现中,采用了二阶泰勒展开公式展开来近似损失函数,同时在求解树的过程中,使用了贪心算法,并使用枚举特征,样本按照特征排序后,采用线性扫描找到最优分裂点。这种实现方法,是对GDBT思想的逼近,但是在工程上确非常有效

标签:特征,模型,样本,叶子,GBDT,应用,原理,节点
来源: https://blog.csdn.net/iOceanMind/article/details/118091354

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有