分类算法——XGBoost 详解

XGBoost 的底层原理与实现

        XGBoost(eXtreme Gradient Boosting)是一种高效的梯度提升算法(Gradient Boosting),它通过组合多个弱学习器(通常是决策树)来构建强大的模型。XGBoost 在算法层面上优化了传统的梯度提升树(GBT),在速度和准确性上都有显著的提升。

以下是对 XGBoost 的底层原理和实现细节的详细解析:


1. XGBoost 的基本概念

  • 梯度提升:一种通过构建多个弱学习器(如决策树)逐步提升模型性能的算法。每一步的目标是根据前一步的误差来构建新的模型,使模型误差逐渐减少。
  • 弱学习器:通常是决策树,XGBoost 使用 CART(Classification And Regression Tree)作为基本单元,每棵树试图拟合之前模型的误差(残差)。
  • 目标函数:在 XGBoost 中定义为损失函数与正则化项的和,正则化项通过控制树的复杂度来防止过拟合。

2. XGBoost 的目标函数

        XGBoost 的目标函数可以分为两部分:损失函数和正则化项。具体表示为:

  • L\left ( y_{i},\hat{y_{i}} \right )表示损失函数,用于衡量模型预测值 \hat{y_{i}}​ 和真实值 y_{i}​ 的差距。
  • \Omega (f_{k}) 表示正则化项,用于控制每棵树的复杂度。XGBoost 使用 L_{2} 正则化来限制树的叶节点数和节点权重,从而防止过拟合。

        对于第 t 轮迭代,假设我们有 t−1 颗树,第 t 颗树的增量预测值为 f_{t}(x),于是可以写出第 t 轮的预测值:

\hat{y}_{i}^{(t-1)} +f_{t}(xi)

目标函数的二次近似展开

为了便于求解,将目标函数通过泰勒展开式近似为二次形式:

其中:

  • g_{i}=\partial _{\hat{y}_{i}^{(t-1)}}L(y_{i},\hat{y}_{i}^{(t-1)}) 是一阶导数,代表当前预测值的梯度。
  • hi= \partial _{\hat{y}^{(t-1)}}^{2} *L(y_{i},\hat{y}_{i}^{(t-1)}) 是二阶导数,代表当前预测值的曲率(即 Hessian)。

XGBoost 利用一阶和二阶信息来构建树,提高了模型对损失的精确逼近。

3. 树的构建与叶节点分裂

在每轮迭代中,XGBoost 通过最小化目标函数来构建新的树。主要包括以下步骤:

  1. 叶节点的增益计算

    • 在每个分裂点,计算该分裂点的增益。增益表示分裂后误差的减少量。对于一个分裂点,增益可以表示为:

      其中:

      • G_{L}G_{R}​ 为左子节点和右子节点的梯度和,H_{L}H_{R}​​ 为左子节点和右子节点的 Hessian 和。
      • λ 为正则化参数,用于控制叶节点权重的大小。
      • \gamma 为惩罚项,限制树的叶节点数,防止树过于复杂。
  2. 选择最佳分裂点

           计算每个特征的所有可能分裂点的增益,选择增益最大的分裂点作为当前节点的最优分裂。
  3. 叶节点权重的确定

    • 对于每个叶节点,XGBoost 会基于损失函数的二阶信息来优化其权重 wjwj​,权重的最优值可表示为:

      wj∗=−∑i∈Ijgi∑i∈Ijhi+λwj∗​=−∑i∈Ij​​hi​+λ∑i∈Ij​​gi​​

    其中 I_{j} 为叶节点 j 包含的样本集合。

4. XGBoost 的正则化

        正则化项是 XGBoost 的核心改进之一,通过控制树的结构复杂度来减少过拟合。正则化项包括两个部分:

  • 叶节点权重的 L_{2} 正则化:通过对每个叶节点的权重施加 L_{2} 正则化,使得权重不会过大,防止模型对特定样本过度拟合。
  • 叶节点数的惩罚项:通过对树的叶节点数量进行惩罚,防止生成过深的树。

5. XGBoost 的特性优化

  • 列抽样(Column Subsampling):每棵树训练时随机选择部分特征,增加模型的多样性,减少过拟合。
  • 并行化计算:对每个特征的分裂增益进行并行计算,加速树的构建。
  • Shrinkage(缩减):类似于学习率,在每棵树的预测上乘以一个缩减系数,防止步长过大导致的模型震荡。
  • 缺失值处理:XGBoost 能够自动处理缺失值,通过最优分裂自动调整数据分布。

XGBoost 的源代码实现

以下是使用 Python 和 xgboost 库实现 XGBoost 分类算法的源代码示例。

# 导入相关库
import xgboost as xgb
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score# 加载数据
data = load_iris()
X, y = data.data, data.target# 将数据分成训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 创建 DMatrix 数据结构,这是 XGBoost 特有的数据格式,优化存储和计算速度
dtrain = xgb.DMatrix(X_train, label=y_train)
dtest = xgb.DMatrix(X_test, label=y_test)# 设置参数
params = {'objective': 'multi:softmax',  # 多分类问题'num_class': 3,                # 类别数'max_depth': 3,                # 树的深度'eta': 0.1,                    # 学习率'subsample': 0.8,              # 采样率'colsample_bytree': 0.8        # 列采样
}# 训练模型
num_round = 50  # 训练轮数
bst = xgb.train(params, dtrain, num_round)# 预测
y_pred = bst.predict(dtest)
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)

源码解读
  1. DMatrix 数据结构:XGBoost 使用 DMatrix 数据结构来存储数据,这种结构在内存使用和计算速度上进行了优化。通过 xgb.DMatrix() 转换原始数据,可以有效地管理数据和标签。

  2. 模型参数

    • objective: 定义任务类型,multi:softmax 表示多分类任务。
    • max_depth: 树的最大深度,控制模型复杂度。
    • eta(学习率):防止每棵树对目标的影响过大,有助于提高模型的泛化能力。
    • subsample 和 colsample_bytree: 控制每棵树构建过程中所使用的样本比例和特征比例,防止过拟合。
  3. 训练过程:使用 xgb.train() 函数进行模型训练,设置了迭代次数 num_round,表示模型构建的弱学习器数量(即树的数量)。

  4. 预测与评估:调用 bst.predict() 进行预测,并使用准确率指标评估模型效果。

XGBoost 的优缺点

优点
  1. 高性能:XGBoost 在梯度提升树算法的基础上进行了优化,速度更快,适用于大规模数据。
  2. 正则化处理:加入了正则化项,有效防止过拟合。
  3. 灵活性:支持多种目标函数和自定义损失函数,可以处理分类和回归等多种任务。
  4. 自动化处理缺失值:在树构建过程中自动处理缺失值,提高了数据处理的灵活性。
缺点
  1. 参数较多:XGBoost 有许多可调参数,参数调整可能较为复杂。
  2. 高内存消耗:由于需要存储大量的中间计算结果,在处理超大数据集时可能面临内存限制。
  3. 不擅长稀疏数据:尽管 XGBoost 能够处理缺失值,但对于稀疏特征表现不如专门的线性模型。

XGBoost 的应用

XGBoost 因其高效性和良好的泛化性能,广泛应用于各类竞赛和实际应用场景中,例如:

  • 金融风控:在信用评分、违约预测等任务中。
  • 推荐系统:用于用户评分、偏好预测等。
  • 医学诊断:在疾病预测、医学图像分类等任务中。

总结

        XGBoost 是一种高效的梯度提升算法,结合了多种优化策略来提高计算速度和模型性能。在底层实现上,XGBoost 通过二阶近似、正则化、并行化等技术来提升模型效果,同时具有灵活的参数和支持多种任务的能力。

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

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

相关文章

C语言 | Leetcode C语言题解之第523题连续的子数组和

题目&#xff1a; 题解&#xff1a; struct HashTable {int key, val;UT_hash_handle hh; };bool checkSubarraySum(int* nums, int numsSize, int k) {int m numsSize;if (m < 2) {return false;}struct HashTable* hashTable NULL;struct HashTable* tmp malloc(sizeo…

在MacOS玩RPG游戏 - RPGViewerPlus

背景知识 由于我一直使用Mac电脑&#xff0c;所以一直对Mac如何玩RPGMV/RPGMZ游戏的方式有进一步的想法。 网上能给出的方案都是自行启动一个HTTP服务进行&#xff0c;进行服务加载。这个方法有效&#xff0c;但兼容性较差。涉及到自定义功能模块的游戏&#xff0c;都会有报错…

【算法】【优选算法】双指针(上)

目录 一、双指针简介1.1 对撞指针&#xff08;左右指针&#xff09;1.2 快慢指针 二、283.移动零三、1089.复写零3.1 双指针解题3.2 暴力解法 四、202.快乐数4.1 快慢指针4.2 暴力解法 五、11.盛最多⽔的容器5.1 左右指针5.2 暴力解法 一、双指针简介 常⻅的双指针有两种形式&…

集成学习(2)

AdaBoost 基本概念 AdaBoost&#xff08;Adaptive Boosting&#xff0c;自适应增强&#xff09;&#xff0c;其自适应在于&#xff1a;前一个基本分类器分错的样本会得到加强&#xff0c;加权后的全体样本再次被用来训练下一个基本分类器。同时&#xff0c;在每一轮中加入一个…

多线程案例---单例模式

单例模式 什么是设计模式呢&#xff1f; 设计模式就好比棋手中的棋谱。在日常开发中&#xff0c;会会遇到很多常见的“问题场景”&#xff0c;针对这些问题场景&#xff0c;大佬们就设计了一些固定套路&#xff0c;按照这些固定套路来实现代码或应对这些问题场景&#xff0c;也…

第十九章 Vue组件之data函数

目录 一、引言 二、示例代码 2.1. 工程结构图 2.2. main.js 2.3. App.vue 2.4. BaseCount.vue 三、运行效果 一、引言 在Vue CLI脚手架中一个组件的data选项必须是一个函数&#xff0c;以此保证每个组件实例&#xff0c;维护独立的一份数据对象。每次创建新的组件实…

mabtisx突然不起作用:mapper跳转不到xml

解决&#xff1a;进入官方下载&#xff1a;JetBrains Marketplace 选择和你idea对应的版本号 切内网下载

ComfyUI正式版来袭!一键安装无需手动部署!支持所有电脑系统

ComfyUI V1重磅发布&#xff1a;迈向AI图像处理新时代 近日&#xff0c;ComfyUI团队正式推出了备受期待的ComfyUI V1版本&#xff0c;为图像生成和处理的AI用户带来了全新的生态体验。这一版本不仅彻底解决了以往版本中繁琐的安装和兼容问题&#xff0c;还大幅提升了易用性&…

pycharm设定代码模板

1、在文件点击设置 ​​​​​​​ ​​​​​​​ 2、点击编辑器--实时模板--找到需要插入模板的位置如我要插入HTML的模板---选择--点击实时模板 3、如图&#xff1a; 4、添加模板内容&#xff0c;如果模板有变量可以在编辑变量处点击编辑 5、编辑变量 6、点…

蘑菇书(EasyRL)学习笔记(2)

1、序列决策 1.1、智能体和环境 如下图所示&#xff0c;序列决策过程是智能体与环境之间的交互&#xff0c;智能体通过动作影响环境&#xff0c;环境则返回观测和奖励。智能体的目标是从这些反馈中学习出能最大化长期奖励的策略&#xff0c;这一过程通过不断试错和调整实现强化…

SQL进阶技巧:如何利用三次指数平滑模型预测商品零售额?

目录 0 问题背景 1 数据准备 2 问题解决 2.1 模型构建 &#xff08;1&#xff09;符号规定 &#xff08;2&#xff09;基本假设 &#xff08;3&#xff09;模型的分析与建立 2.2 模型求解 3 小结 0 问题背景 1960年—1985年全国社会商品零售额如图1 所示 表1全国社…

Rsync远程同步详细介绍

一、rsync介绍 rsync是一款开源的、快速的、多功能的、可实现全量及增量的本地或远程数据同步备份的优秀工具。并且可以不进行改变原有数据的属性信息&#xff0c;实现数据的备份迁移特性。 rsync软件支持跨平台&#xff0c;适用于unix/ linux/windows等多种操作系统平台。rsyn…

无人机之自动控制原理篇

一、飞控系统 无人机飞控是指无人机的飞行控制系统&#xff0c;是无人机的大脑。飞控系统通过传感器、控制器和执行机构三部分实现对无人机的自动控制。 传感器&#xff1a;传感器负责收集无人机的姿态、速度、高度等信息。常见的传感器包括陀螺仪、加速度计、磁力计、气压计、…

得物App获评新奖项,正品保障夯实供应链创新水平

近日&#xff0c;得物App再度获评新奖项——“2024上海市供应链创新与应用优秀案例”。 本次奖项为上海市供应链领域最高奖项&#xff0c;旨在评选出在供应链创新成效上处于领先地位、拥有成功模式和经验的企业。今年以来&#xff0c;得物App已接连获得“上海市质量金奖”、“科…

STM32F103C8T6学习笔记3--按键控制LED灯

1、实验内容 S4、S5分别接PB12和PB13&#xff0c;实验要求&#xff0c;按下S4&#xff0c;D1亮&#xff0c;D2灭&#xff1b;按下S5&#xff0c;D2亮&#xff0c;D1灭。 由于按键学习的是GPIO口的输入功能&#xff0c;和输出功能的配置略有区别。本次通过按键触发相应功能没有…

10.27复习day —— 药销系统分页前(上)

登陆界面 1.auto 水平方向 —— 占据尽量多的空间 margin:auto —— 水平居中 2.块状&#xff1a;block main、div、p 特点&#xff1a; 独占一行 水平方向占满父元素可用空间&#xff08;所以得设置宽度&#xff09; 垂直方向占据空间由其内容大小决定 行内&#xff1a;inlin…

clickhouse运维篇(三):生产环境一键生成配置并快速部署ck集群

前提条件&#xff1a;先了解集群搭建流程是什么样&#xff0c;需要改哪些配置&#xff0c;有哪些环境&#xff0c;这个文章目的是简化部署。 clickhouse运维篇&#xff08;一&#xff09;&#xff1a;docker-compose 快速部署clickhouse集群 clickhouse运维篇&#xff08;二&am…

快速入门kotlin编程(精简但全面版)

注&#xff1a;本文章为个人学习记录&#xff0c;如有错误&#xff0c;欢迎留言指正。 目录 1. 变量 1.1 变量声明 1.2 数据类型 2. 函数 3. 判断语句 3.1 if 3.2 when语句 4. 循环语句 4.1 while 4.2 for-in 5. 类和对象 5.1 类的创建和对象的初始化 5.2 继承 5…

云原生Istio基础

一&#xff0e;Service Mesh 架构 Service Mesh&#xff08;服务网格&#xff09;是一种用于处理服务到服务通信的专用基础设施层。它的主要目的是将微服务之间复杂的通信和治理逻辑从微服务代码中分离出来&#xff0c;放到一个独立的层中进行管理。传统的微服务架构中&#x…

【网页布局技术】项目五 使用CSS设置导航栏

《CSSDIV网页样式与布局案例教程》 徐琴 目录 任务一 制作简单纵向导航栏支撑知识点1&#xff0e;合理利用display:block属性2&#xff0e;利用margin-bottom设置间隔效果3&#xff0e;利用border设置特殊边框 任务二 制作简单横向导航栏任务三 制作带图片效果的横向导航栏任务…