机器学习神经网络——GBDT(Gradient Boosting Decision Tree 梯度提升决策树)算法

news2025/1/13 10:16:00

系列文章目录

机器学习神经网络——Adaboost分离器算法

机器学习之SVM分类器介绍——核函数、SVM分类器的使用

机器学习的一些常见算法介绍【线性回归,岭回归,套索回归,弹性网络】

文章目录

系列文章目录

前言

一、GBDT(Gradient Boosting Decision Tree) 梯度提升决策树简介

1.1、集成学习

1.2、Boosting

1.3、AdaBoost

1.4、Gradient Boosting

1.5、 决策树与CART

二、GBDT算法的案例解读

2.1、使用梯度提升算法和决策树分类器对手写数字数据进行对比分析

2.2、GBDT算法参数的介绍

2.3、GBDT适用范围

总结


前言

本文主要介绍GBDT算法,以及使用梯度提升算法和决策树分类器对手写数字数据进行对比分析的案例介绍

一、GBDT(Gradient Boosting Decision Tree) 梯度提升决策树简介

DT-Decision Tree决策树,GB是Gradient Boosting,是一种学习策略,GBDT的含义就是用Gradient Boosting的策略训练出来的DT模型

在前几年深度学习还没有大行其道之前,GBDT在各种竞赛是大放异彩。一是效果确实挺不错。二是即可以用于分类也可以用于回归。三是可以筛选特征

1.1、集成学习

集成学习就是将多个弱的学习器结合起来组成一个强的学习器。
这就涉及到,先产生一组‘个体学习器’,再用一个策略将它们结合起来。

个体学习器可以选择:决策树,神经网络。

集成时可以所有个体学习器属于同一类算法:全是决策树,或全是神经网络;也可以来自不同的算法。

结合策略:例如分类问题,可以用投票法,少数服从多数。
之所以用这种集成的思想,是因为单独用一个算法时,效果往往不容易达到很好,但如果多个个体算法结合在一起,取长补短,整体效果就会比单独一个要强。

当然集成并不是不管怎么选择学习器,怎么组合都一定会获得更好的效果,最好的情况是,每个学习器都不是特别差,并且要具有一定的多样性,否则可能集成后的会没有效果,或者起负作用。

这就是集成学习的一个核心问题:如何生成准确性又不是很差,并且还能保证多样性的个体学习器呢

目前主要有两种生成方式:

  • Boosting:个体学习器间存在强依赖关系,必须串行生成。
  • Bagging,随机森林:个体之间不存在强依赖关系,可并行生成。

1.2、Boosting

Boosting 的思想,三个臭皮匠顶一个诸葛亮:

给定初始训练数据,由此训练出第一个基学习器;
根据基学习器的表现对样本进行调整,在之前学习器做错的样本上投入更多关注;
用调整后的样本,训练下一个基学习器;
重复上述过程 T 次,将 T 个学习器加权结合。
简单讲,就是每次训练单个弱学习器时,都将上一次分错的数据权重提高一点再进行当前单个弱学习器的学习。这样越往后执行,训练出的单个弱学习器就会越在意那些容易分错(权重高)的点。当执行 M 次后,通过加权求和的方式组合成一个最终的学习器。

Boosting模型可以抽象为一个前向加法模型(additive model):
根据 Boosting 的定义,它有三个基本要素:

  • 基学习器
  • 组合方式
  • 目标函数

1.3、AdaBoost

Boosting 的代表是 Adaboost。

• 第 1 行,初始化样本权重分布,此时每个数据的权重是一样的,所以是 1/m;
以分类问题为例,最初令每个样本的权重都相等,对于第 t 次迭代操作,我们就根据这些权重来选取样本点,进而训练分类器 C_t。
• 第 2 行,进入 for 循环 T 次,即基学习器的个数为 T 个;
• 第 3 行,根据具有当前权重分布 D_t 的数据集,学习出 h_t;
前一个分类器分错的样本会被用来训练下一个分类器。
h_t 是分量分类器 C_t 给出的对任一样本点 xi 的标记(+1或-1),h_t(xi) = yi 时,样本被正确分类。
• 第 4 行,计算当前学习器的误差;
• 第 5 行,如果误差大于 0.5,就停止;
AdaBoost 方法中使用的分类器可能很弱(比如出现很大错误率),但只要它的分类效果比随机好一点(比如两类问题分类错误率略小于0.5),就能够改善最终得到的模型。
• 第 6 行,计算当前学习器的权重 α_t;
权值是关于误差的表达式,当下一次分类器再次错分这些点之后,会提高整体的错误率,这样就导致分类器权值变小,进而导致这个分类器在最终的混合分类器中的权值变小,也就是说,Adaboost算法让正确率高的分类器占整体的权值更高,让正确率低的分类器权值更低,从而提高最终分类器的正确率。
• 第 7 行,得到下一时刻的权重分布 D_t+1.
如果某个样本点已经被准确地分类,那么在构造下一个训练集中,它被选中的概率就被降低;相反,如果某个样本点没有被准确地分类,那么它的权重就得到提高。通过这样的方式,AdaBoost 方法能“聚焦于”那些较难分(更富信息)的样本上。

此算法的案例可以参考本篇博客

机器学习神经网络——Adaboost分离器算法

1.4、Gradient Boosting

AdaBoost每一轮基学习器训练过后都会更新样本权重,再训练下一个学习器,最后将所有的基学习器加权组合。AdaBoost使用的是指数损失,这个损失函数的缺点是对于异常点非常敏感,因而通常在噪音比较多的数据集上表现不佳。Gradient Boosting在这方面进行了改进,使得可以使用任何损失函数 (只要损失函数是连续可导的),这样一些比较robust的损失函数就能得以应用,使模型抗噪音能力更强。
和Adaboost不同,Gradient Boosting 在迭代的时候选择梯度下降的方向来保证最后的结果最好。
算法将负梯度作为残差值来学习基本模型h(x).

1.5、 决策树与CART

1976年-1986年,J.R.Quinlan给出ID3算法原型并进行了总结,确定了决策树学习的理论。这可以看做是决策树算法的起点。1993,Quinlan将ID3算法改进成C4.5算法,称为机器学习的十大算法之一。ID3算法的另一个分支是CART(Classification adn Regression Tree, 分类回归决策树),用于预测。这样,决策树理论完全覆盖了机器学习中的分类和回归两个领域。

 决策树
决策树(decision tree)一般都是自上而下的来生成的。每个决策或事件(即自然状态)都可能引出两个或多个事件,导致不同的结果,把这种决策分支画成图形很像一棵树的枝干,故称决策树。

决策树利用如下图所示的树结构进行决策,每一个非叶子节点是一个判断条件,每一个叶子节点是结论。从跟节点开始,经过多次判断得出结论。

决策树的构建是数据逐步分裂的过程,构建的步骤如下:

  • 步骤1:将所有的数据看成是一个节点,进入步骤2;
  • 步骤2:从所有的数据特征中挑选一个数据特征对节点进行分割,进入步骤3;
  • 步骤3:生成若干孩子节点,对每一个孩子节点进行判断,如果满足停止分裂的条件,进入步骤4;否则,进入步骤2;
  • 步骤4:设置该节点是子节点,其输出的结果为该节点数量占比最大的类别。

从上述步骤可以看出,决策生成过程中有三个重要的问题:

  • (1)数据如何分割
  • (2)如何选择分裂的属性
  • (3)什么时候停止分裂

决策树(decision tree)算法基于特征属性进行分类,其主要的优点:模型具有可读性,计算量小,分类速度快。

二、GBDT算法的案例解读

2.1、使用梯度提升算法和决策树分类器对手写数字数据进行对比分析

#使用梯度提升算法和决策树分类器对手写数字数据进行对比分析
import numpy as np
#导入sklearn内置数据集 
from sklearn.datasets import load_digits
#导入手写数字数据
digits = load_digits()
#以图片形式显示前100号手写数字
import matplotlib.pyplot as plt
plt.figure(1, figsize=(3.5,3.5),facecolor='white') 
for i in range(10): 
    for j in range(10):
        ax= plt.subplot(10,10,10*i+j+1)
        #设置子图的位置
        ax.set_xticks([])
        #隐藏横坐标
        #隐藏纵坐标
        ax.set_yticks([])
        plt.imshow(digits.images[9*i+j],cmap=plt.cm.gray_r,interpolation="nearest")
plt.show()
#导入sklearn中的模型验证类 
from sklearn.model_selection import train_test_split
#使用train test_split函数自动分割训练数据集和测试数据集
x_train,x_test,y_train,y_test = train_test_split(digits.data,digits.target,test_size=0.3)
#导入sklearn模块中的决策树分类器类 
from sklearn.tree import DecisionTreeClassifier
#定义一个决策树分类器对象
dtc = DecisionTreeClassifier()
dtc.fit(x_train,y_train)
#导入sklearn模块中的梯度提升分类器类 
from sklearn.ensemble import GradientBoostingClassifier
#定义一个梯度提升决策树分类器对象
gbc = GradientBoostingClassifier(n_estimators=30,learning_rate=0.1)
gbc.fit(x_train,y_train)
print("单棵决策树在训练集上的性能:%.3f"%dtc.score(x_train,y_train))
print("单棵决策树在测试集上的性能:%.3f"%dtc.score(x_test,y_test))
print("GBDT(T-30)在训练集上的性能:%.3f"%gbc.score(x_train,y_train))
print("GBDT(T-30)在测试集上的性能:%.3f"%gbc.score(x_test,y_test))
#观察弱分类器数量对分类准确度的影响
#弱分类器的最大值
T_max =39
gbc_train_scores=[] 
gbc_test_scores=[] 
for i in range(1,T_max+1):
    gbc = GradientBoostingClassifier(n_estimators=i,learning_rate=0.1)
    gbc.fit(x_train,y_train)
    gbc_train_scores.append(gbc.score(x_train,y_train))
    gbc_test_scores.append(gbc.score(x_test,y_test))
#绘制测试结果
import matplotlib.pyplot as plt
#解决图形中的中文显示乱码
plt.rcParams['font.sans-serif']=['SimHei']
plt.matplotlib.rcParams['axes.unicode_minus']=False 
plt.figure()
#解决图形中的坐标轴负号显示问题
plt.plot(range(1,T_max+1),gbc_train_scores,color='r',label='训练集')
plt.plot(range(1,T_max+1),gbc_test_scores,color='g',label='测试集')
plt.title("基学习器数量对GBDT性能的影响")
plt.xlabel("基分类器数量")
plt.ylabel("准确率")
plt.xlim(1,T_max)
plt.legend()
plt.show()

运行结果:

单棵决策树在训练集上的性能:1.000
单棵决策树在测试集上的性能:0.822
GBDT(T-30)在训练集上的性能:0.999
GBDT(T-30)在测试集上的性能:0.928

案例二

# 导入GBDT分类器模型
from sklearn.ensemble import GradientBoostingClassifier
# 定义一个GBDT分类器模型,设置参数
gbdt = GradientBoostingClassifier(n_estimators=100, learning_rate=0.1, max_depth=3)
# 训练模型
gbdt.fit(X_train, y_train)
# 使用训练好的模型进行预测
y_pred = gbdt.predict(X_test)
# 输出预测结果
print(y_pred)

第一行导入了sklearn库中的GBDT分类器模型。

第二行定义了一个GBDT分类器模型,其中n_estimators表示迭代次数,learning_rate表示学习率,max_depth表示决策树的最大深度。

第三行使用训练数据集进行模型训练。

第四行使用训练好的模型对测试数据集进行预测。

第五行输出预测结果。

案例三

# 导入GBDT分类器模型
from sklearn.ensemble import GradientBoostingClassifier
# 定义一个GBDT分类器模型,设置参数
gbdt = GradientBoostingClassifier(n_estimators=100, learning_rate=0.1, max_depth=3, min_samples_split=2, min_samples_leaf=1, max_features=None)
# 训练模型
gbdt.fit(X_train, y_train)
# 使用训练好的模型进行预测
y_pred = gbdt.predict(X_test)
# 输出预测结果
print(y_pred)

在这个例子中,我们使用了n_estimators=100进行了100次迭代,使用了learning_rate=0.1来调整每个决策树的权重,使用了max_depth=3限制了每个决策树的最大深度,使用了min_samples_split=2和min_samples_leaf=1来限制了节点和叶子节点的最小样本数,使用了max_features=None考虑了所有特征。

2.2、GBDT算法参数的介绍

GBDT类在scikit-learn库中有多个参数,以下是其中一些主要参数的说明:

- n_estimators:指定迭代次数,即决策树的个数。默认为100。

- learning_rate:指定学习率,用于调整每个决策树的权重。学习率越小,模型越稳定,但需要更多的迭代次数才能达到较好的结果。默认为0.1。

- max_depth:指定每个决策树的最大深度。默认为3。

- min_samples_split:指定一个节点在被分割之前所需的最小样本数。默认为2。

- min_samples_leaf:指定一个叶子节点所需的最小样本数。默认为1。

- max_features:指定每个节点在进行分割时所考虑的特征数量。默认为None,表示考虑所有的特征。

2.3、GBDT适用范围

GBDT既可以用于分类模型,也可以用于回归模型。在分类模型中,GBDT通过训练多个决策树来预测样本的类别,每个决策树的输出是概率值或者类别标签。在回归模型中,GBDT通过训练多个决策树来预测目标变量的值,每个决策树的输出是一个实数值。

一个分类模型的例子是通过GBDT算法预测信用卡交易是否为欺诈。一个回归模型的例子是通过GBDT算法预测房价。

总结

以上就是今天的内容~

最后欢迎大家点赞👍,收藏⭐,转发🚀,
如有问题、建议,请您在评论区留言💬哦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/560667.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机网络:物理层

物理层 1. 通信基础1.1 基本概念1.1.1 通信模型1.1.2 通信方式1.1.3 数据传输方式1.1.4 数据同步的传输/通信方式1.1.5 码元1.1.6 速率1.1.7 带宽 1.2 奈氏准则|香农定理1.2.1 奈氏准则1.2.2 香农定理 1.3 编码、调制1.3.1 数字数据编码为数字信号1.3.2 数字数据调制为模拟信号…

Google Colab的使用方法

什么是 Google Colab? Colaboratory是一个 Google 研究项目,旨在帮助传播机器学习培训和研究成果。是一个Jupyter 笔记本环境,不需要进行任何设置就可以使用,并且完全在云端运行。Colaboratory笔记本存储在 Google 云端硬盘中&…

“超级品牌”已成型!解码名创优品的进阶之路

随着经济复苏,消费者心智和市场趋势逐渐发生变化,零售市场竞争步入深水区,为品牌带来了更大考验。但反过来,也令更多潜力股加速崛起。 北京时间5月16日,名创优品集团(NYSE:MNSO;HKEX: 9896)公布…

ResourceManager启动报错:Queue configuration missing child queue names for root【已解决】

Queue configuration missing child queue names for root 现象报错分析ResourceManager输出日志解决 现象 start-all.sh后缺少RM的进程 报错 查看启动日志输出文件 2023-05-23 19:28:19,863 INFO [main] resourcemanager.RMNMInfo (RMNMInfo.java:<init>(63)) - Re…

【Linux】进程控制 — 进程终止 + 进程等待

文章目录 &#x1f4d6; 前言1. 再次理解fork()函数1.1 fork()之后子进程代码和数据问题&#xff1a;1.2 fork()之后操作系统做了什么&#xff1a;1.3 为什么要写时拷贝&#xff1f;&#xff1f; 2. 进程终止2.1 main函数的返回值&#xff1a;2.2 exit() 和 _exit()&#xff1a…

以京东首页为例,设计用例框架。

以下是一个可能的京东首页的用例框架设计&#xff1a; 1. 区域划分&#xff1a; a. 顶部导航栏&#xff1a;包括京东的Logo、搜索框、登录/注册入口、购物车等。 b. 主要内容区域&#xff1a;展示各类商品、促销活动、广告位等。 c. 商品分类导航&#xff1a;提供各类…

复习之Linux下的文件管理

1.文件的建立 #touch westos-------建立空文件/修改文件的建立时间 &#xff08;1&#xff09;建立空文件 &#xff08;2&#xff09;修改文件的建立时间 ----右击点属性显示文件的建立时间 ---- 再次输入touch westos,westos文件的建立时间更新&#xff01; -----westos -t…

使用 Kafka Assistant,为您的开发加速

简要介绍 快速查看所有 Kafka 集群&#xff0c;包括Brokers、Topics和Consumers支持各种认证模式&#xff1a;PLAINTEXT、SASL_PLAINTEXT、SSL、SASL_SSL对Kafka集群进行健康检查查看分区中的消息内容并添加新消息查看消费者订阅了哪些主题&#xff0c;以及分区被分配给了哪些…

金融、医疗、教育等各场景下小程序SDK的应用

近年来&#xff0c;随着数字经济的飞速发展和移动终端的迅速普及&#xff0c;移动互联网全面覆盖&#xff0c;各类应用服务层出不穷&#xff0c;涵盖了方方面面的生活、工作和学习。 而小程序作为一种轻量级的应用形态&#xff0c;越来越受到开发者和用户的欢迎。为了满足不同行…

DataNode启动报错Failed to add storage directory [DISK]file:【已解决】

Failed to add storage directory [DISK]file hadoop启动后缺少DataNode进程报错out文件报错log文件解决 hadoop启动后缺少DataNode进程 jps查看hadoop进程缺少DataNode的进程 报错out文件 查看DataNode的out日志 DataNode启动报错 ulimit -a for user root core file size…

前k个高频单词

&#x1f495;**不要害怕前方的未知和困难&#xff0c;因为它们都是你成长的机会。不要过于在意别人的眼光和评价&#xff0c;因为唯有你的内心才知道自己真正的价值。珍惜当下&#xff0c;享受生活的点滴&#xff0c;让自己变得更加坚强、自信、成熟。**&#x1f495; &#x…

LG Gram 14 (14Z90N) 电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。&#xff08;下载请直接百度黑果魏叔&#xff09; 硬件型号驱动情况 主板LG Gram 14 (14Z90N) 处理器Intel Core i5-1035G4已驱动 内存M471A1G44AB0-CWE * 2已驱动 硬盘MTFDHBA512TDV-1AZ1AABYY已驱动 显卡Intel Iris …

Axel – 用于 Linux 的命令行文件下载加速器

动动发财的小手&#xff0c;点个赞吧&#xff01; 如果您是那种喜欢下载和试用多个 Linux 发行版的人&#xff0c;我们相信您会张开双臂欢迎一个说到做到的下载加速器——一个按照其描述进行操作的下载加速器。 在本指南[1]中&#xff0c;我们将向您介绍 Axel&#xff0c;这是一…

由浅入深Dubbo核心源码剖析高可用集群

目录 1 服务集群的概述1.1 概述1.2 调用过程1.3 组件介绍 2 集群容错机制2.1 内置集群容错策略2.2 集群容错调优2.3 源码分析 3 集群负载均衡策略3.1 负载均衡的主要作用3.2 内置的负载均衡策略3.3 负载均衡总结 4 服务治理4.1 服务治理的概述4.2 执行过程4.3 服务治理功能 1 服…

由浅入深Dubbo核心源码剖析服务暴露与发现

目录 1 概述2 Spring中自定义Schema2.1 案例使用2.2 dubbo中的相关对象 3 服务暴露机制3.1 术语解释3.2 流程机制3.3 源码分析3.4 总结 4 服务发现4.1 服务发现流程4.2 源码分析4.3 总结 1 概述 dubbo是一个简单易用的RPC框架&#xff0c;通过简单的提供者&#xff0c;消费者配…

《深入理解Java虚拟机》Java虚拟机的监控及诊断工具相关命令行

《深入理解Java虚拟机》Java虚拟机的监控及诊断工具相关命令行 1.jps 查看当前系统正在运行的java进程 相关参数 -l 打印模块名以及包名 -v 打印虚拟机相关参数 -m 打印传给主类的参数 -mlv 以上内容都打印 2.jstat 打印目标 Java 进程的性能数据 -gc 打印gc回收相关信息…

基于ResNet-18实现Cifar-10图像分类

目录 1、作者介绍2、数据集介绍2.1Cifar-10数据集介绍&#xff1a; 3、ResNet网络介绍3.1Residual Network残差网络3.2ResNet18网络结构 4、代码复现及实验结果4.1训练代码4.2测试代码4.3实验结果 1、作者介绍 安耀辉&#xff0c;男&#xff0c;西安工程大学电子信息学院&…

144 Tops,特斯拉如何低成本实现了城市NOA?

作者 | 树人 编辑 | 德新 根据特斯拉2022年Q4的财务文件披露&#xff1a;FSD Beta已有将近40万用户。 这是目前全世界部署规模最大的城市NOA系统。 而特斯拉实现这样一套系统&#xff0c;在车端几乎仅用了8个摄像头和144 Tops算力的FSD计算平台。这种性能压榨和成本控制能力让…

2023年内网穿透常用的几个工具

作为一名开发者&#xff0c;先给大家普及一下什么是内网&#xff0c;什么是外网。 所谓内网就是内部建立的局域网络或办公网络。比如一家公司或一个家庭有多台计算机&#xff0c;他们利用不同网络布局将这一台或多台计算机或其它设备连接起来构成一个局部的办公或者资源共享网…

这可能是最全面的Java面试八股文了

Java的特点 Java是一门面向对象的编程语言。面向对象和面向过程的区别参考下一个问题。 Java具有平台独立性和移植性。 Java有一句口号&#xff1a;Write once, run anywhere&#xff0c;一次编写、到处运行。这也是Java的魅力所在。而实现这种特性的正是Java虚拟机JVM。已编…