XGBooost算法原理及Python实现
一、概述
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实现的更多相关文章
- 深入学习主成分分析(PCA)算法原理(Python实现)
一:引入问题 首先看一个表格,下表是某些学生的语文,数学,物理,化学成绩统计: 首先,假设这些科目成绩不相关,也就是说某一科目考多少分与其他科目没有关系,那么如何判断三个学生的优秀程度呢?首先我们一眼 ...
- softmax分类算法原理(用python实现)
逻辑回归神经网络实现手写数字识别 如果更习惯看Jupyter的形式,请戳Gitthub_逻辑回归softmax神经网络实现手写数字识别.ipynb 1 - 导入模块 import numpy as n ...
- KNN算法原理(python代码实现)
kNN(k-nearest neighbor algorithm)算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性 ...
- (数据科学学习手札13)K-medoids聚类算法原理简介&Python与R的实现
前几篇我们较为详细地介绍了K-means聚类法的实现方法和具体实战,这种方法虽然快速高效,是大规模数据聚类分析中首选的方法,但是它也有一些短板,比如在数据集中有脏数据时,由于其对每一个类的准则函数为平 ...
- PageRank算法原理与Python实现
一.什么是pagerank PageRank的Page可是认为是网页,表示网页排名,也可以认为是Larry Page(google 产品经理),因为他是这个算法的发明者之一,还是google CEO( ...
- 【机器学习】:Kmeans均值聚类算法原理(附带Python代码实现)
这个算法中文名为k均值聚类算法,首先我们在二维的特殊条件下讨论其实现的过程,方便大家理解. 第一步.随机生成质心 由于这是一个无监督学习的算法,因此我们首先在一个二维的坐标轴下随机给定一堆点,并随即给 ...
- 【机器学习实战学习笔记(1-1)】k-近邻算法原理及python实现
笔者本人是个初入机器学习的小白,主要是想把学习过程中的大概知识和自己的一些经验写下来跟大家分享,也可以加强自己的记忆,有不足的地方还望小伙伴们批评指正,点赞评论走起来~ 文章目录 1.k-近邻算法概述 ...
- BP算法从原理到python实现
BP算法从原理到实践 反向传播算法Backpropagation的python实现 觉得有用的话,欢迎一起讨论相互学习~Follow Me 博主接触深度学习已经一段时间,近期在与别人进行讨论时,发现自 ...
- 梯度迭代树(GBDT)算法原理及Spark MLlib调用实例(Scala/Java/python)
梯度迭代树(GBDT)算法原理及Spark MLlib调用实例(Scala/Java/python) http://blog.csdn.net/liulingyuan6/article/details ...
- 模拟退火算法SA原理及python、java、php、c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径
模拟退火算法SA原理及python.java.php.c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径 模拟退火算法(Simulated Annealing,SA)最早的思 ...
随机推荐
- Codeforces 11D A Simple Task 题解 [ 蓝 ] [ 状压 dp ]
思路不难想,细节比较多. 思路 观察到 \(n \le 19\) ,首先想到状压 dp . 于是自然地定义 \(dp[j][i]\) 为:抵达点的状态为 \(i\) ,且此时在点 \(j\) 时,简单 ...
- STM32的SYSTICK 定时器(系统滴答定时器)
什么是SysTick? 这是一个24位的系统节拍定时器system tick timer,SysTick,具有自动重载和溢出中断功能,所有基于Cortex_M3处理器的微控制器都可以由这个定时器获得一 ...
- CentOS7安装部署ClickHouse(单机版&&集群部署)
1.1 什么是ClickHouse ClickHouse 是俄罗斯的Yandex于2016年开源的列式存储数据库(DBMS),主要用于在线分析处理查询(OLAP),能够使用SQL查询实时生成分析数据报 ...
- JS经纬度坐标转换
var GPS = { PI : 3.14159265358979324, x_pi : 3.14159265358979324 * 3000.0 / 180.0, delta : function ...
- 洛谷P11250 [GESP202409 八级] 手套配对 题解
题目传送门. 非常简单的组合数学题. 首先从 \(n\) 对手套中恰好选出 \(k\) 对手套的方案数为 \(C_n^k\),然后由于我们要取出 \(m\) 只手套,那么取了 \(k\) 对手套后还要 ...
- NCS开发学习笔记-基础篇-前言
nRF5 SDK 与 nRF Connect SDK 目前Nordic有2套并存的SDK:老的nRF5 SDK和新的nRF Connect SDK(简称NCS),两套SDK相互独立. nRF5 SDK ...
- RVV1.0指令中关于_m系列函数的使用方法,即掩码mask的转换使用
在RVV1.0指令函数的使用中,遇到了mask加载不匹配问题 uint8_t mask_data[] = {15, 0, 0, 0, 0, 0, 0, 0}; vbool8_t mask = vlm_ ...
- 迅速理解 LCS 最长公共子序列问题
在算法与数据结构的经典问题中,最长公共子序列(Longest Common Subsequence,简称 LCS)问题占据着重要的地位.给定两个序列,我们需要找到它们最长的公共子序列,而子序列要求保持 ...
- laradock 安装扩展程序 pcntl
起因 运行workman脚步的时候,PHP 提示缺少 pcntl 扩展 Config git:(master) php start.php -d Please install pcntl extens ...
- 堆排序(topk 问题)(NB)
博客地址:https://www.cnblogs.com/zylyehuo/ # _*_coding:utf-8_*_ # 比较排序 import random def sift(li, low, h ...