图解机器学习 | GBDT模型详解

本文涉及的产品
模型训练 PAI-DLC,5000CU*H 3个月
交互式建模 PAI-DSW,5000CU*H 3个月
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
简介: GBDT是一种迭代的决策树算法,将决策树与集成思想进行了有效的结合。本文讲解GBDT算法的Boosting核心思想、训练过程、优缺点、与随机森林的对比、以及Python代码实现。

ShowMeAI研究中心

作者:韩信子@ShowMeAI
教程地址http://www.showmeai.tech/tutorials/34
本文地址http://www.showmeai.tech/article-detail/193
声明:版权所有,转载请联系平台与作者并注明出处


1.GBDT算法

GBDT(Gradient Boosting Decision Tree),全名叫梯度提升决策树,是一种迭代的决策树算法,又叫 MART(Multiple Additive Regression Tree),它通过构造一组弱的学习器(树),并把多颗决策树的结果累加起来作为最终的预测输出。该算法将决策树与集成思想进行了有效的结合。

(本篇GBDT集成模型部分内容涉及到机器学习基础知识、决策树、回归树算法,没有先序知识储备的宝宝可以查看ShowMeAI的文章 图解机器学习 | 机器学习基础知识决策树模型详解回归树模型详解)。

1)Boosting核心思想

Boosting方法训练基分类器时采用串行的方式,各个基分类器之间有依赖。它的基本思路是将基分类器层层叠加,每一层在训练的时候,对前一层基分类器分错的样本,给予更高的权重。测试时,根据各层分类器的结果的加权得到最终结果。

Bagging与Boosting的串行训练方式不同,Bagging方法在训练过程中,各基分类器之间无强依赖,可以进行并行训练。

2)GBDT详解

GBDT的原理很简单

  • 所有弱分类器的结果相加等于预测值。
  • 每次都以当前预测为基准,下一个弱分类器去拟合误差函数对预测值的残差(预测值与真实值之间的误差)。
  • GBDT的弱分类器使用的是树模型。

如图是一个非常简单的帮助理解的示例,我们用GBDT去预测年龄:

  • 第一个弱分类器(第一棵树)预测一个年龄(如20岁),计算发现误差有10岁;
  • 第二棵树预测拟合残差,预测值6,计算发现差距还有4岁;
  • 第三棵树继续预测拟合残差,预测值3,发现差距只有1岁了;
  • 第四课树用1岁拟合剩下的残差,完成。

最终,四棵树的结论加起来,得到30岁这个标注答案(实际工程实现里,GBDT是计算负梯度,用负梯度近似残差)。

(1)GBDT与负梯度近似残差

回归任务下,GBDT在每一轮的迭代时对每个样本都会有一个预测值,此时的损失函数为均方差损失函数:

$$ l(y_{i}, \hat{y_{i}})=\frac{1}{2}(y_{i}-\hat{y_{i}})^{2} $$

损失函数的负梯度计算如下:

$$ -[\frac{\partial l(y_{i}, \hat{y_{i}})}{\partial \hat{y_{i}}}]=(y_{i}-\hat{y_{i}}) $$

可以看出,当损失函数选用「均方误差损失」时,每一次拟合的值就是(真实值-预测值),即残差。

(2)GBDT训练过程

我们来借助1个简单的例子理解一下GBDT的训练过程。假定训练集只有4个人 (A,B,C,D),他们的年龄分别是 (14,16,24,26)。其中,A、B分别是高一和高三学生;C、D分别是应届毕业生和工作两年的员工。

我们先看看用回归树来训练,得到的结果如下图所示:

接下来改用GBDT来训练。由于样本数据少,我们限定叶子节点最多为2(即每棵树都只有一个分枝),并且限定树的棵树为2。最终训练得到的结果如下图所示:

上图中的树很好理解:A、B年龄较为相近,C、D年龄较为相近,被分为左右两支,每支用平均年龄作为预测值。

  • 我们计算残差(即「实际值」-「预测值」),所以A的残差14-15=-1。
  • 这里A的「预测值」是指前面所有树预测结果累加的和,在当前情形下前序只有一棵树,所以直接是15,其他多树的复杂场景下需要累加计算作为A的预测值。

上图中的树就是残差学习的过程了:

  • 把A、B、C、D的值换作残差-1、1、-1、1,再构建一棵树学习,这棵树只有两个值1和-1,直接分成两个节点:A、C在左边,B、D在右边。
  • 这棵树学习残差,在我们当前这个简单的场景下,已经能保证预测值和实际值(上一轮残差)相等了。
  • 我们把这棵树的预测值累加到第一棵树上的预测结果上,就能得到真实年龄,这个简单例子中每个人都完美匹配,得到了真实的预测值。

最终的预测过程是这样的:

  • A:高一学生,购物较少,经常问学长问题,真实年龄14岁,预测年龄A = 15 – 1 = 14
  • B:高三学生,购物较少,经常被学弟提问,真实年龄16岁,预测年龄B = 15 + 1 = 16
  • C:应届毕业生,购物较多,经常问学长问题,真实年龄24岁,预测年龄C = 25 – 1 = 24
  • D:工作两年员工,购物较多,经常被学弟提问,真实年龄26岁,预测年龄D = 25 + 1 = 26

综上,GBDT需要将多棵树的得分累加得到最终的预测得分,且每轮迭代,都是在现有树的基础上,增加一棵新的树去拟合前面树的预测值与真实值之间的残差。

2.梯度提升 vs 梯度下降

下面我们来对比一下「梯度提升」与「梯度下降」。这两种迭代优化算法,都是在每1轮迭代中,利用损失函数负梯度方向的信息,更新当前模型,只不过:

  • 梯度下降中,模型是以参数化形式表示,从而模型的更新等价于参数的更新。
  • 梯度提升中,模型并不需要进行参数化表示,而是直接定义在函数空间中,从而大大扩展了可以使用的模型种类。

$$ F=F_{t-1}-\left.\rho_{t} \nabla_{F} L\right|_{F=F_{t-1}} $$

$$ L=\sum_{i} l\left(y_{i}, F\left(x_{i}\right)\right) $$

$$ w_{t}=w_{t-1}-\left.\rho_{t} \nabla_{w} L\right|_{w=w_{t-1}} $$

$$ L=\sum_{i} l\left(y_{i}, f_{w}\left(w_{i}\right)\right) $$

3.GBDT优缺点

下面我们来总结一下GBDT模型的优缺点:

1)优点

  • 预测阶段,因为每棵树的结构都已确定,可并行化计算,计算速度快。
  • 适用稠密数据,泛化能力和表达能力都不错,数据科学竞赛榜首常见模型。
  • 可解释性不错,鲁棒性亦可,能够自动发现特征间的高阶关系。

2)缺点

  • GBDT在高维稀疏的数据集上,效率较差,且效果表现不如SVM或神经网络。
  • 适合数值型特征,在NLP或文本特征上表现弱。
  • 训练过程无法并行,工程加速只能体现在单颗树构建过程中。

4.随机森林 vs GBDT

对比ShowMeAI前面讲解的另外一个集成树模型算法随机森林,我们来看看GBDT和它的异同点。

1)相同点

  • 都是集成模型,由多棵树组构成,最终的结果都是由多棵树一起决定。
  • RF和GBDT在使用CART树时,可以是分类树或者回归树。

2)不同点

  • 训练过程中,随机森林的树可以并行生成,而GBDT只能串行生成。
  • 随机森林的结果是多数表决表决的,而GBDT则是多棵树累加之。
  • 随机森林对异常值不敏感,而GBDT对异常值比较敏感。
  • 随机森林降低模型的方差,而GBDT是降低模型的偏差。

5.Python代码应用与模型可视化

下面是我们直接使用python机器学习工具库sklearn来对数据拟合和可视化的代码:

# 使用Sklearn调用GBDT模型拟合数据并可视化


import numpy as np
import pydotplus
from sklearn.ensemble import GradientBoostingRegressor

X = np.arange(1, 11).reshape(-1, 1)
y = np.array([5.16, 4.73, 5.95, 6.42, 6.88, 7.15, 8.95, 8.71, 9.50, 9.15])

gbdt = GradientBoostingRegressor(max_depth=4, criterion ='squared_error').fit(X, y)

from IPython.display import Image  
from pydotplus import graph_from_dot_data
from sklearn.tree import export_graphviz

# 拟合训练5棵树
sub_tree = gbdt.estimators_[4, 0]
dot_data = export_graphviz(sub_tree, out_file=None, filled=True, rounded=True, special_characters=True, precision=2)
graph = pydotplus.graph_from_dot_data(dot_data)  
Image(graph.create_png())



![](http://image.showmeai.tech/machine_learning_algorithms/176.png)

ShowMeAI相关文章推荐

ShowMeAI系列教程推荐

showmeai

相关实践学习
使用PAI-EAS一键部署ChatGLM及LangChain应用
本场景中主要介绍如何使用模型在线服务(PAI-EAS)部署ChatGLM的AI-Web应用以及启动WebUI进行模型推理,并通过LangChain集成自己的业务数据。
机器学习概览及常见算法
机器学习(Machine Learning, ML)是人工智能的核心,专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能,它是使计算机具有智能的根本途径,其应用遍及人工智能的各个领域。 本课程将带你入门机器学习,掌握机器学习的概念和常用的算法。
目录
相关文章
|
1天前
|
机器学习/深度学习 Python
验证集的划分方法:确保机器学习模型泛化能力的关键
本文详细介绍了机器学习中验证集的作用及其划分方法。验证集主要用于评估模型性能和调整超参数,不同于仅用于最终评估的测试集。文中描述了几种常见的划分方法,包括简单划分、交叉验证、时间序列数据划分及分层抽样划分,并提供了Python示例代码。此外,还强调了在划分数据集时应注意随机性、数据分布和多次实验的重要性。合理划分验证集有助于更准确地评估模型性能并进行有效调优。
|
2天前
|
机器学习/深度学习 人工智能 自然语言处理
机器学习模型之深度神经网络的特点
深度神经网络(Deep Neural Networks, DNNs)是一类机器学习模型,通过多个层级(层)的神经元来模拟人脑的工作方式,从而实现复杂的数据处理和模式识别任务。
8 1
|
10天前
|
机器学习/深度学习 算法 前端开发
R语言基础机器学习模型:深入探索决策树与随机森林
【9月更文挑战第2天】决策树和随机森林作为R语言中基础且强大的机器学习模型,各有其独特的优势和适用范围。了解并熟练掌握这两种模型,对于数据科学家和机器学习爱好者来说,无疑是一个重要的里程碑。希望本文能够帮助您更好地理解这两种模型,并在实际项目中灵活应用。
|
9天前
|
机器学习/深度学习 数据采集 存储
一文读懂蒙特卡洛算法:从概率模拟到机器学习模型优化的全方位解析
蒙特卡洛方法起源于1945年科学家斯坦尼斯劳·乌拉姆对纸牌游戏中概率问题的思考,与约翰·冯·诺依曼共同奠定了该方法的理论基础。该方法通过模拟大量随机场景来近似复杂问题的解,因命名灵感源自蒙特卡洛赌场。如今,蒙特卡洛方法广泛应用于机器学习领域,尤其在超参数调优、贝叶斯滤波等方面表现出色。通过随机采样超参数空间,蒙特卡洛方法能够高效地找到优质组合,适用于处理高维度、非线性问题。本文通过实例展示了蒙特卡洛方法在估算圆周率π和优化机器学习模型中的应用,并对比了其与网格搜索方法的性能。
81 1
|
11天前
|
机器学习/深度学习 存储 前端开发
实战揭秘:如何借助TensorFlow.js的强大力量,轻松将高效能的机器学习模型无缝集成到Web浏览器中,从而打造智能化的前端应用并优化用户体验
【8月更文挑战第31天】将机器学习模型集成到Web应用中,可让用户在浏览器内体验智能化功能。TensorFlow.js作为在客户端浏览器中运行的库,提供了强大支持。本文通过问答形式详细介绍如何使用TensorFlow.js将机器学习模型带入Web浏览器,并通过具体示例代码展示最佳实践。首先,需在HTML文件中引入TensorFlow.js库;接着,可通过加载预训练模型如MobileNet实现图像分类;然后,编写代码处理图像识别并显示结果;此外,还介绍了如何训练自定义模型及优化模型性能的方法,包括模型量化、剪枝和压缩等。
22 1
|
11天前
|
API UED 开发者
如何在Uno Platform中轻松实现流畅动画效果——从基础到优化,全方位打造用户友好的动态交互体验!
【8月更文挑战第31天】在开发跨平台应用时,确保用户界面流畅且具吸引力至关重要。Uno Platform 作为多端统一的开发框架,不仅支持跨系统应用开发,还能通过优化实现流畅动画,增强用户体验。本文探讨了Uno Platform中实现流畅动画的多个方面,包括动画基础、性能优化、实践技巧及问题排查,帮助开发者掌握具体优化策略,提升应用质量与用户满意度。通过合理利用故事板、减少布局复杂性、使用硬件加速等技术,结合异步方法与预设缓存技巧,开发者能够创建美观且流畅的动画效果。
34 0
|
11天前
|
开发者 算法 虚拟化
惊爆!Uno Platform 调试与性能分析终极攻略,从工具运用到代码优化,带你攻克开发难题成就完美应用
【8月更文挑战第31天】在 Uno Platform 中,调试可通过 Visual Studio 设置断点和逐步执行代码实现,同时浏览器开发者工具有助于 Web 版本调试。性能分析则利用 Visual Studio 的性能分析器检查 CPU 和内存使用情况,还可通过记录时间戳进行简单分析。优化性能涉及代码逻辑优化、资源管理和用户界面简化,综合利用平台提供的工具和技术,确保应用高效稳定运行。
25 0
|
11天前
|
前端开发 开发者 设计模式
揭秘Uno Platform状态管理之道:INotifyPropertyChanged、依赖注入、MVVM大对决,帮你找到最佳策略!
【8月更文挑战第31天】本文对比分析了 Uno Platform 中的关键状态管理策略,包括内置的 INotifyPropertyChanged、依赖注入及 MVVM 框架。INotifyPropertyChanged 方案简单易用,适合小型项目;依赖注入则更灵活,支持状态共享与持久化,适用于复杂场景;MVVM 框架通过分离视图、视图模型和模型,使状态管理更清晰,适合大型项目。开发者可根据项目需求和技术栈选择合适的状态管理方案,以实现高效管理。
23 0
|
11天前
|
机器学习/深度学习 人工智能 自动驾驶
探索AI的魔法:用Python构建你的第一个机器学习模型
【8月更文挑战第31天】在这个数字时代,人工智能(AI)已经渗透到我们生活的方方面面。从智能助手到自动驾驶汽车,AI正在改变世界。本文将带你走进AI的世界,通过Python编程语言,一步步教你如何构建第一个机器学习模型。无论你是编程新手还是有经验的开发者,这篇文章都将为你打开新世界的大门,让你体验到创造智能程序的乐趣和成就感。所以,让我们一起开始这段激动人心的旅程吧!
|
11天前
|
机器学习/深度学习 TensorFlow 算法框架/工具
TensorFlow Serving 部署指南超赞!让机器学习模型上线不再困难,轻松开启高效服务之旅!
【8月更文挑战第31天】TensorFlow Serving是一款高性能开源服务系统,专为部署机器学习模型设计。本文通过代码示例详细介绍其部署流程:从安装TensorFlow Serving、训练模型到配置模型服务器与使用gRPC客户端调用模型,展示了一站式模型上线解决方案,使过程变得简单高效。借助该工具,你可以轻松实现模型的实际应用。
18 0