一、概述

  XGBoost 是一种基于梯度提升框架的机器学习算法,它通过迭代地训练一系列决策树来构建模型。核心思想是通过不断地在已有模型的基础上,拟合负梯度方向的残差(真实值与预测值的差)来构建新的弱学习器,达到逐步优化模型的目的。

  XGBoost 在构建决策树时,利用了二阶导数信息。在损失函数的优化过程中,不仅考虑了一阶导数(梯度),还引入了二阶导数(海森矩阵),这使得算法能够更精确地找到损失函数的最优解,加速模型的收敛速度,同时提高模型的泛化能力。此外,XGBoost 还加入了正则化项,包括 L1 和 L2 正则化,用于控制模型的复杂度,防止过拟合。

二、算法原理

1.算法过程

  在 XGBoost 中,弱学习器通常是 CART(分类与回归树)决策树。每一棵决策树的构建都是基于前一轮模型的预测结果与真实值之间的残差。具体过程为:

(1) 初始化模型

  首先,初始化一个简单的模型,通常是一个常数模型,记为\(f_0(X)\) ,其预测值为所有样本真实值的均值(回归任务)或多数类(分类任务),记为\(\hat y_0\)。此时,模型的预测结果与真实值之间存在误差。

(2) 计算残差或负梯度

  在回归任务中,计算每个样本的残差,即真实值\(y_i\)与当前模型预测值\(\hat y_{i,t-1}\)的差值\(r_{i,t}=y_i-\hat y_{i,t-1}\),其中表示迭代的轮数。在分类任务中,计算损失函数关于当前模型预测值的负梯度$$g_{i,t}=-\frac{\vartheta L(y_i,\hat y_{i,t-1})}{\vartheta \hat y_{i,t-1}}$$

(3) 拟合决策树

  使用计算得到的残差(回归任务)或负梯度(分类任务)作为新的目标值,训练一棵新的决策树\(f_t(X)\)。这棵树旨在拟合当前模型的误差,从而弥补当前模型的不足。

(4) 更新模型

  根据新训练的决策树,更新当前模型。更新公式为\(\hat y_{i,t}=\hat y_{i,t-1}+\alpha f_t(x_i)\),其中是学习率(也称为步长),用于控制每棵树对模型更新的贡献程度。学习率较小可以使模型训练更加稳定,但需要更多的迭代次数;学习率较大则可能导致模型收敛过快,甚至无法收敛。

(5) 重复迭代

  重复步骤 (2)–(4)步,不断训练新的决策树并更新模型,直到达到预设的迭代次数、损失函数收敛到一定程度或满足其他停止条件为止。最终,XGBoost由多棵决策树组成,其预测结果是所有决策树预测结果的累加。

算法过程图示

2.目标函数优化

  XGBoost 通过定义一个目标函数来衡量模型的优劣,并在每次迭代中优化这个目标函数。目标函数包括损失函数和正则化项两部分:

  损失函数:用于衡量模型预测值与真实值之间的差异,常见的损失函数有均方误差(MSE,用于回归问题)、交叉熵损失(用于分类问题)等。损失函数反映了模型对训练数据的拟合程度。

  正则化项:为了防止模型过拟合,XGBoost 在目标函数中加入了正则化项。正则化项通常基于决策树的复杂度,例如树的叶子节点数量、叶子节点权重的 L1 或 L2 范数等。正则化项对模型的复杂度进行惩罚,使得模型在拟合数据的同时保持简单,从而提高模型的泛化能力。

  在每次迭代中,XGBoost 通过贪心算法寻找最优的分裂点,使得目标函数在该次迭代中下降最多。具体来说,它会遍历所有可能的特征和分裂点,计算每个分裂点对目标函数的影响,选择使目标函数下降最大的分裂点作为当前节点的分裂点。

三、与GBDT的区别

算法原理

GDBT:是基于决策树的集成学习算法,通过不断生成新的决策树来拟合之前模型的残差,从而逐步提升模型的准确性。

XGBoost:在 GDBT 的基础上进行了优化和扩展,不仅可以拟合残差,还引入了二阶导数信息来更准确地逼近目标函数,从而提高模型的精度。

目标函数

GDBT:通常使用经验风险最小化作为目标,例如均方误差(MSE)、对数损失等,通过迭代优化目标函数来构建模型。

XGBoost:目标函数在经验风险的基础上,增加了正则化项,用于控制模型的复杂度,防止过拟合,使得模型具有更好的泛化能力。

决策树生成

GDBT:决策树的生成过程是基于贪心算法,在每个节点上选择能够最大程度降低损失函数的特征和分裂点。

XGBoost:在决策树生成时,除了考虑特征和分裂点对损失函数的影响外,还考虑了数据的稀疏性、特征的重要性等因素,采用了更复杂的分裂策略,能够更高效地处理大规模数据和高维数据。

并行计算

GDBT:一般情况下,GDBT 算法是顺序生成决策树的,难以进行并行计算,训练速度相对较慢。

XGBoost:支持分布式和并行计算,可以利用多线程、多节点来加速模型的训练过程,大大提高了训练效率,尤其适用于大规模数据集。

对缺失值的处理

GDBT:通常需要对缺失值进行填充或者单独处理,否则在计算分裂点时可能会出现问题。

XGBoost:能够自动学习缺失值的处理方式,在决策树分裂时,会同时考虑将缺失值划分到左子树和右子树的情况,选择最优的划分方式,对缺失值的鲁棒性更强。

四、Python实现

(环境: Python 3.11,scikit-learn 1.6.1)

(1) 分类情形

from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
import xgboost as xgb
from sklearn import metrics # 生成数据集
X, y = make_classification(n_samples = 1000, n_features = 6, random_state = 42)
# 将数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 42) # 创建XGBoost分类模型
clf = xgb.XGBClassifier()
# 训练模型
rclf = clf.fit(X_train, y_train) # 预测
y_pre = rclf.predict(X_test)
# 性能评价
accuracy = metrics.accuracy_score(y_test,y_pre) print('预测结果为:',y_pre)
print('准确率为:',accuracy)

(2)回归情形

from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
import xgboost as xgb
from sklearn.metrics import mean_squared_error # 生成回归数据集
X, y = make_regression(n_samples = 1000, n_features = 6, random_state = 42)
# 将数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 42) # 创建XGBoost回归模型
model = xgb.XGBRegressor(n_estimators = 100, learning_rate = 0.1, max_depth = 3)
# 训练模型
model.fit(X_train, y_train) # 进行预测
y_pred = model.predict(X_test) # 计算均方误差评估模型性能
mse = mean_squared_error(y_test, y_pred) print(f"均方误差: {mse}")

End.

下载

XGBooost算法原理及Python实现的更多相关文章

  1. 深入学习主成分分析(PCA)算法原理(Python实现)

    一:引入问题 首先看一个表格,下表是某些学生的语文,数学,物理,化学成绩统计: 首先,假设这些科目成绩不相关,也就是说某一科目考多少分与其他科目没有关系,那么如何判断三个学生的优秀程度呢?首先我们一眼 ...

  2. softmax分类算法原理(用python实现)

    逻辑回归神经网络实现手写数字识别 如果更习惯看Jupyter的形式,请戳Gitthub_逻辑回归softmax神经网络实现手写数字识别.ipynb 1 - 导入模块 import numpy as n ...

  3. KNN算法原理(python代码实现)

    kNN(k-nearest neighbor algorithm)算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性 ...

  4. (数据科学学习手札13)K-medoids聚类算法原理简介&Python与R的实现

    前几篇我们较为详细地介绍了K-means聚类法的实现方法和具体实战,这种方法虽然快速高效,是大规模数据聚类分析中首选的方法,但是它也有一些短板,比如在数据集中有脏数据时,由于其对每一个类的准则函数为平 ...

  5. PageRank算法原理与Python实现

    一.什么是pagerank PageRank的Page可是认为是网页,表示网页排名,也可以认为是Larry Page(google 产品经理),因为他是这个算法的发明者之一,还是google CEO( ...

  6. 【机器学习】:Kmeans均值聚类算法原理(附带Python代码实现)

    这个算法中文名为k均值聚类算法,首先我们在二维的特殊条件下讨论其实现的过程,方便大家理解. 第一步.随机生成质心 由于这是一个无监督学习的算法,因此我们首先在一个二维的坐标轴下随机给定一堆点,并随即给 ...

  7. 【机器学习实战学习笔记(1-1)】k-近邻算法原理及python实现

    笔者本人是个初入机器学习的小白,主要是想把学习过程中的大概知识和自己的一些经验写下来跟大家分享,也可以加强自己的记忆,有不足的地方还望小伙伴们批评指正,点赞评论走起来~ 文章目录 1.k-近邻算法概述 ...

  8. BP算法从原理到python实现

    BP算法从原理到实践 反向传播算法Backpropagation的python实现 觉得有用的话,欢迎一起讨论相互学习~Follow Me 博主接触深度学习已经一段时间,近期在与别人进行讨论时,发现自 ...

  9. 梯度迭代树(GBDT)算法原理及Spark MLlib调用实例(Scala/Java/python)

    梯度迭代树(GBDT)算法原理及Spark MLlib调用实例(Scala/Java/python) http://blog.csdn.net/liulingyuan6/article/details ...

  10. 模拟退火算法SA原理及python、java、php、c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径

    模拟退火算法SA原理及python.java.php.c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径 模拟退火算法(Simulated Annealing,SA)最早的思 ...

随机推荐

  1. 在IDEA如何使用JProfiler性能分析

    一.下载地址 https://www.ej-technologies.com/download/jprofiler/files 版本:11 激活码:L-J11-Everyone#speedzodiac ...

  2. 大人,时代变了! 赶快把自有业务的本地AI“模型”训练起来!

    1 大人,时代变了! 赶快把自有业务的本地AI"模型"训练起来! 1.1 背景   目前AI已经大行其道,chatGPT.DeepSeek等如雨后春笋般涌现出来,笔者做为一个守旧派 ...

  3. 永久解决VSCode终端中文乱码问题

    方法如下: 在VSCode中通过打开"文件"--"首选项"--"设置", 然后在"setting.json"中 添加以下 ...

  4. 「四」vim执行外部命令、文件另存为、文件提取合并、打开类命令、光标后插入内容、替換、复制粘贴、查找设置

    vim执行外部命令 查看当前目录文件::! command 另存为 完整内容: :w filename 选择性内容: v:选择内容. :w filename 文件提取合并 向当前文件插入文件内容: : ...

  5. Ubuntu下如何管理多个ssh密钥

    Ubuntu下如何管理多个ssh密钥 前言 ‍ 我一直在逃避这个问题,误以为我能够单纯地用一个 ssh 走天下. 好吧,现实是我不得不管理多个 ssh 做,那就写个博客总结一下吧. 查阅后发现前人已经 ...

  6. Django实战项目-学习任务系统-任务管理

    接着上期代码框架,开发第3个功能,任务管理,再增加一个学习任务表,用来记录发布的学习任务的标题和内容,预计完成天数,奖励积分和任务状态等信息. 第一步:编写第三个功能-任务管理 1,编辑模型文件: . ...

  7. PVE下安装Centos8.5.2111系统

    1.从阿里云镜像下载下载地址:https://mirrors.aliyun.com/centos/8/isos/x86_64/CentOS-8.5.2111-x86_64-boot.iso2.上传镜像 ...

  8. 可视化|数据可视化文档之 echarts 项目初始化

    数据可视化文档之 echarts 项目初始化 环境搭建 # node 环境 nvm install v11.15.0 # or nvm use 11.15.0 # 查看 node 版本 node -V ...

  9. Delphi 动态生成进度条窗体

    在implementation加入下面 uses Gauges; var Gauge1: TGauge; 加入Timer1控件,设为false procedure TForm1.Button1Clic ...

  10. delphi获取DOS命令行输出函数 运行CMD命令并获取结果

    procedure TForm1.Button4Click(Sender: TObject); var hReadPipe,hWritePipe:THandle; si:STARTUPINFO; ls ...