Python28-8 GBM梯度提升算法

news2024/9/23 21:31:50

梯度提升算法(Gradient Boosting Machine,GBM)是一种集成学习方法,通过逐步构建一系列简单模型(通常是决策树),并结合这些模型来提高整体预测性能。GBM广泛用于回归和分类任务,因为它具有较高的准确性和灵活性。

GBM的基本原理

GBM的思想源于提升方法(Boosting)。提升方法是一种将多个弱学习器(性能稍好于随机猜测的模型)组合成一个强学习器的技术。GBM通过以下步骤实现这一过程:

  1. 初始化模型:选择一个初始模型  ,通常是目标值的均值:

    其中,是损失函数,是真实值。

  2. 迭代更新模型:对于每一轮 ,执行以下步骤:

    • 计算残差:计算当前模型的预测误差(残差),即:

      这里,残差表示真实值和当前模型预测值之间的差异。

    • 拟合弱学习器:训练一个新的弱学习器 来拟合这些残差:

    • 更新模型:更新模型的预测值,将新弱学习器加入现有模型中,并乘以一个学习率 来控制每个弱学习器的贡献:

      其中,是学习率,通常介于 0 到 1 之间。

  3. 重复迭代:继续迭代步骤2,直到达到预定的迭代次数 或其他停止条件。

损失函数和梯度

GBM的核心在于利用损失函数的梯度来引导模型更新。不同的损失函数适用于不同的任务:

  • 对于回归问题,常用的损失函数是均方误差(MSE):

  • 对于分类问题,常用的损失函数是对数损失(Log Loss):

在每次迭代中,计算损失函数的负梯度作为残差,用于拟合新的弱学习器。

Python实例

以下是一个更详细的Python实例,展示如何使用GBM进行回归任务,并包含更多的解释和参数设置:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.metrics import mean_squared_error

# 生成示例数据
np.random.seed(42)  # 设置随机种子以保证结果可重复
X = np.random.rand(1000, 10)  # 生成1000个样本,每个样本有10个特征的随机数据
y = X @ np.random.rand(10) + np.random.rand(1000) * 0.1  # 生成目标值y,是特征的线性组合加上噪声

# 将数据分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)  # 80%数据用于训练,20%数据用于测试

# 创建梯度提升回归器
gbm = GradientBoostingRegressor(n_estimators=200, learning_rate=0.1, max_depth=3, random_state=42)  # 创建GBM回归器,设置树的数量、学习率和最大深度

# 训练模型
gbm.fit(X_train, y_train)  # 在训练集上训练GBM模型

# 初始化列表存储训练误差和测试误差
train_errors = []
test_errors = []

# 使用staged_predict获取每个阶段的预测误差
for y_train_pred in gbm.staged_predict(X_train):
    train_errors.append(mean_squared_error(y_train, y_train_pred))  # 记录训练误差

for y_test_pred in gbm.staged_predict(X_test):
    test_errors.append(mean_squared_error(y_test, y_test_pred))  # 记录测试误差

# 绘制训练过程中树的数量与均方误差的关系
plt.figure(figsize=(12, 6))  # 设置图形大小
plt.plot(range(1, gbm.n_estimators + 1), train_errors, label='Train')  # 绘制训练误差曲线
plt.plot(range(1, gbm.n_estimators + 1), test_errors, label='Test')  # 绘制测试误差曲线
plt.xlabel('Number of Trees')  # 设置x轴标签
plt.ylabel('Mean Squared Error')  # 设置y轴标签
plt.title('Number of Trees vs. Mean Squared Error')  # 设置图形标题
plt.legend()  # 显示图例
plt.show()  # 显示图形

# 显示特征重要性
feature_importance = pd.Series(gbm.feature_importances_, index=[f'Feature {i}' for i in range(X.shape[1])])  # 获取特征重要性
feature_importance.sort_values(ascending=False).plot(kind='bar', title='Feature Importance')  # 绘制特征重要性条形图
plt.xlabel('Features')  # 设置x轴标签
plt.ylabel('Importance')  # 设置y轴标签
plt.show()  # 显示图形

图片

上图展示了模型在训练和测试集上的均方误差(MSE)随决策树数量增加的变化情况。可以看出随着决策树数量的增加,模型在训练集和测试集上的均方误差逐渐降低,逐渐趋近于0,表示模型的性能越来越好。

图片

这张图展示了每个特征对模型的重要性排序,我们可以直观地看出特征5、8、9是重要性较高的前几个特征。

关键参数解释
  • n_estimators: 弱学习器的个数(即迭代次数)。更多的树可能会提升模型的准确性,但也会增加训练时间和可能的过拟合。

  • learning_rate: 学习率,用于缩小每个弱学习器的贡献。较小的学习率通常需要更多的树来达到同样的训练效果。

  • max_depth: 决策树的最大深度,控制每个弱学习器的复杂度。较浅的树可以防止过拟合。

优缺点

优点

  • 能够处理各种类型的数据,包括连续和离散数据。

  • 具有较高的预测准确性,尤其在处理复杂数据集时表现优异。

  • 具有特征选择的功能,可以输出特征的重要性。

缺点

  • 训练时间较长,尤其在数据集较大或参数设置较高时。

  • 对于超参数(如树的数量、深度、学习率等)的选择较为敏感,需要进行调参以获得最佳性能。

梯度提升算法通过逐步构建和组合多个弱学习器,逐渐提升模型性能,是一种强大的机器学习方法。其灵活性和高准确性使其在许多实际应用中得到广泛使用。

以上内容总结自网络,如有帮助欢迎转发,我们下次再见!

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

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

相关文章

端到端自动驾驶新突破:Nvidia提出全并行PARA-Drive,斩获CVPR挑战赛冠军

论文标题: PARA-Drive: Parallelized Architecture for Real-time Autonomous Driving 论文作者: Xinshuo Weng, Boris Ivanovic, Yan Wang, Yue Wang, Marco Pavone 导读: 本文系统分析了自动驾驶高级架构的设计空间,提出了关…

单片机软件架构连载(3)-typedef

今天给大家讲typedef,这个关键字在实际产品开发中,也是海量应用。 技术涉及知识点比较多,有些并不常用,我们以贴近实际为原则,让大家把学习时间都花在重点上。 1.typedef的概念 typedef 是 C 语言中的一个关键字&…

artts升级版本后常见的编译错误(定期更新......)

1、设置泛型将参数配置为 null 时抛出了如下异常: Type null is not assignable to type T. T could be instantiated with an arbitrary type which could be unrelated to null. <ArkTSCheck> 解决办法 在 null 后面添加 ! 即可,以表示该值不会为 null data: T null!…

【可能是全网最丝滑的LangChain教程】十七、LangChain进阶之Retrievers

人生不能像做菜&#xff0c;把所有的料都准备好了才下锅。 01 Retrievers介绍 检索器&#xff08;Retrievers&#xff09; 是一种接口&#xff0c;用于根据非结构化查询返回文档&#xff0c;它比向量存储更为通用&#xff0c;既可以使用向量存储作为底层&#xff0c;也可以是其…

C++11右值引用及移动构造

区分左值和右值 在学习c11的右值引用前&#xff0c;大家肯定会有点陌生什么是右值&#xff1f;什么是左值&#xff1f;现在我先来带大家熟悉一下概念。 左值 可以被取地址&#xff0c;也可被修改&#xff08;const修饰的除外&#xff09; 可以出现在等号左边&#xff0c;也可…

华为HCIP Datacom H12-821 卷29

1.多选题 下面关于LSA age字段&#xff0c;描述正确的是∶ A、LSA age的单位为秒&#xff0c;在LSDB中的LSA的LS age随时间增长而增长 B、LSA age的单位为秒&#xff0c;在LSDB中的LSA的LS age随时间增长而减少 C、如果一条LSA的LS age达到了LS RefreshTime&#xff08…

【C++】AVL树(旋转、平衡因子)

&#x1f308;个人主页&#xff1a;秦jh_-CSDN博客&#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/qinjh_/category_12575764.html?spm1001.2014.3001.5482 ​ 目录 前言 AVL树的概念 节点 插入 AVL树的旋转 新节点插入较高左子树的左侧---左左&#xff1a;…

Spring的AOP基础以及AOP的核心概念

2. AOP基础 学习完spring的事务管理之后&#xff0c;接下来我们进入到AOP的学习。 AOP也是spring框架的第二大核心&#xff0c;我们先来学习AOP的基础。 在AOP基础这个阶段&#xff0c;我们首先介绍一下什么是AOP&#xff0c;再通过一个快速入门程序&#xff0c;让大家快速体…

高级RAG检索中的五种查询重写策略_用于检索增强的大型语言模型的查询重写

一、前言 检索增强生成 (RAG) 作为人工智能 (AI) 领域的一项重要技术&#xff0c;近年来得到了飞速发展。它将基于检索模型和基于生成的模型相结合&#xff0c;利用海量外部数据&#xff0c;生成更具信息量、更准确、更具语境相关性的回复。检索策略是 RAG 系统的关键组成部分…

2024年最适合高级网工的11款Linux

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 你们好&#xff0c;我的网工朋友。 Linux作为一个免费且开源的操作系统&#xff0c;随着时间的推移催生了多个发行版&#xff0c;并且得到了庞大…

golang验证Etherscan上的智能合约

文章目录 golang验证Etherscan上的智能合约为什么要验证智能合约如何使用golang去验证合约获取EtherscanAPI密钥Verify Source Code接口Check Source Code Verification Status接口演示示例及注意事项网络问题无法调用Etherscan接口&#xff08;最重要的步骤&#xff09; golan…

应用层协议原理——因特网提供的运输服务

我们已经考虑了计算机网络能够一般性地提供的运输服务。现在我们要更为具体地考察由因特网提供的运输服务类型。因特网(更一般的是TCP/IP网络)为应用程序提供两个运输层协议&#xff0c;即UDP和TCP。当软件开发者为因特网创建一个新的应用时&#xff0c;首先要做出的决定是&…

js逆向案例 | 加速乐反爬逆向

前言 加速乐作为一种常见的反爬虫技术&#xff0c;在网络上已有大量详尽深入的教程可供参考。然而&#xff0c;对于那些初次接触的人来说&#xff0c;直接面对它可能仍会感到困惑。 声明 本文仅用于学习交流&#xff0c;学习探讨逆向知识&#xff0c;欢迎私信共享学习心得。如…

收银系统源码-商品报损管理

千呼新零售2.0系统是零售行业连锁店一体化收银系统&#xff0c;包括线下收银线上商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体&#xff0c;线上线下数据全部打通。 适用于商超、便利店、水果、生鲜、母婴、服装、零食、百货、宠物等连锁店使用。 详细介绍请…

ESXi6.7 update 3主机实现新硬件运行老环境

server 2003 SQL server 2000 SQL SP4 vmware tools 一、适用场景 1、运行多年的老企业&#xff0c;积累的数据量庞大&#xff0c;其中的数据库并不一定都是现在开发的平台或系统&#xff0c;而是已经正在运行&#xff0c;不能停业务的状态。 2、老系统老应用平台&#xf…

day01:项目概述,环境搭建

文章目录 软件开发整体介绍软件开发流程角色分工软件环境 外卖平台项目介绍项目介绍定位功能架构 产品原型技术选型 开发环境搭建整体结构&#xff1a;前后端分离开发前后端混合开发缺点前后端分离开发 前端环境搭建Nginx 后端环境搭建熟悉项目结构使用Git进行版本控制数据库环…

Day06-01-lvs

Day06-01-lvs 0. 核心内容1.负载均衡项目 选择故障: 2.lvs 预备姿势-arp3.lvs 概述4. lvs工作模式4.1 预备姿势4.2 lvs-dr模式4.3 lvs-nat模式4.4 小结 5. lvs-dr模式5.1 环境准备5.2 lvs-dr模式配置流程1) lvs服务端配置2) web服务器 RS服务端配置3) 小结4) 调试 5.3 抓包查看…

电脑清理软件用哪个好?这款工具有些饱受争议

电脑清理软件用哪个好?电脑作为我们工作和娱乐的重要工具&#xff0c;其运行速度和安全性直接影响着我们的生活质量。然而&#xff0c;随着时间的推移&#xff0c;电脑系统会积累大量垃圾文件、注册表错误、恶意软件等&#xff0c;导致电脑运行缓慢甚至崩溃。 这时&#xff0c…

el-tree 获取当前勾选节点的选中状态以及选中值对象 触发check-change多次事件问题原因

1.需求 现在需要一个树状结构的资产树 但是现在需求是 获取当前选中的值的状态是选中还是取消选中 然后再用当前选中 or 取消选中的值 进行 选中 or 取消选中的操作 一开始使用的是 check-change 方法 接收参数如图 但是我勾选父节点 或者 子节点后 他会打印一堆数据 是因…

基于Java+SpringMvc+Vue技术的智慧校园系统设计与实现

博主介绍&#xff1a;硕士研究生&#xff0c;专注于信息化技术领域开发与管理&#xff0c;会使用java、标准c/c等开发语言&#xff0c;以及毕业项目实战✌ 从事基于java BS架构、CS架构、c/c 编程工作近16年&#xff0c;拥有近12年的管理工作经验&#xff0c;拥有较丰富的技术架…