前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >超完整总结,XGBoost算法!!

超完整总结,XGBoost算法!!

作者头像
Python编程爱好者
发布2024-05-22 14:51:57
6740
发布2024-05-22 14:51:57
举报

Hi,我是Johngo~

这段时间很多人在聊一些基础类的算法模型。

今天咱们来分享一个比较热门的算法,XGBoost!!

今天的内容非常详细!如需要获取本文PDF的同学,记得文末去取~

XGBoost,全称为 eXtreme Gradient Boosting,是一种优化的分布式梯度提升库,设计用于高效、灵活和可移植的机器学习模型。

XGBoost的核心思想是基于梯度提升决策树(GBDT)的提升算法,通过逐步构建一系列弱学习器(通常是决策树),并将其组合成一个强学习器,从而提高预测性能。

历史背景

2014年,陈天奇(Tianqi Chen)提出并开发。

主要目的是解决当时机器学习中存在的效率和性能问题。

XGBoost通过多种技术改进,实现了在速度和性能上的显著提升,包括:

  1. 正则化:通过对模型复杂度进行正则化处理,防止过拟合。
  2. 并行处理:通过在分布式环境中并行计算,提高了模型训练速度。
  3. 树的剪枝算法:使用贪心算法进行剪枝,保证生成的树是最优的。
  4. 缓存感知的块结构:通过优化数据存储和访问方式,提高内存使用效率。

论文出处

XGBoost的详细介绍和技术实现最早发表在2016年的一篇题为“XGBoost: A Scalable Tree Boosting System”的论文中。论文作者包括陈天奇(Tianqi Chen)和卡洛斯·格斯特林(Carlos Guestrin)。

论文引用

该论文发表在KDD 2016(Knowledge Discovery and Data Mining)的会议上,是机器学习和数据挖掘领域非常重要的一次会议。

论文的完整引用:

Chen, T., & Guestrin, C. (2016). XGBoost: A Scalable Tree Boosting System. Proceedings of the 22nd ACM SIGKDD International Conference on Knowledge Discovery and Data Mining (KDD '16), 785–794. DOI: https://dl.acm.org/doi/10.1145/2939672.2939785

这篇论文详细描述了XGBoost的算法设计、技术实现以及在多种实际数据集上的应用效果。

理论基础

XGBoost 数学原理

XGBoost 通过集成多个弱学习器(通常是决策树)来构建一个强大的预测模型。

梯度提升基本思想

梯度提升是一种集成学习方法,通过迭代地训练多个弱学习器,并将它们的预测结果进行加权求和来构建一个强学习器。每一轮的训练目的是减小前一轮预测的残差。

假设我们有一个训练数据集

{(x_i, y_i)}_{i=1}^n

,其中

x_i

是输入特征,

y_i

是目标值。我们的目标是学习一个模型

F(x)

,使得预测值

\hat{y}_i = F(x_i)

尽可能接近真实值

y_i

在梯度提升框架下,第

t

轮的模型

F_t(x)

是在前

t-1

轮模型的基础上加上一个新的弱学习器

h_t(x)

F_t(x) = F_{t-1}(x) + h_t(x)

为了优化模型,我们最小化损失函数

L(y, \hat{y})

,例如平方误差:

L(y, \hat{y}) = \frac{1}{2} (y - \hat{y})^2

XGBoost 目标函数

XGBoost扩展了基本的梯度提升算法,其优化目标由以下两部分组成:

  1. 损失函数
L
  1. 正则化项
\Omega

,用于控制模型的复杂度

目标函数形式如下:

\mathcal{L} = \sum_{i=1}^n L(y_i, \hat{y}_i) + \sum_{k=1}^T \Omega(h_k)

其中,正则化项

\Omega

通常定义为:

\Omega(h) = \gamma T + \frac{1}{2} \lambda \sum_{j=1}^T w_j^2

这里,

T

是树的叶子节点数,

w_j

是叶子节点的权重,

\gamma

\lambda

是正则化参数。

二阶泰勒展开

为了有效地优化目标函数,XGBoost使用二阶泰勒展开近似损失函数。假设在第 轮中,我们的预测值为 \hat{y}i^{(t)} = F{t-1}(x_i) + h_t(x_i) 。目标函数可以写成:

\mathcal{L}^{(t)} = \sum_{i=1}^n L(y_i, \hat{y}_i^{(t)}) + \Omega(h_t)

使用泰勒展开,可以将损失函数展开为:

\mathcal{L}^{(t)} \approx \sum_{i=1}^n \left[ L(y_i, \hat{y}_i^{(t-1)}) + g_i h_t(x_i) + \frac{1}{2} h_t(x_i)^2 h_i \right] + \Omega(h_t)

其中:

g_i = \frac{\partial L(y_i, \hat{y}_i^{(t-1)})}{\partial \hat{y}_i^{(t-1)}} \\ h_i = \frac{\partial^2 L(y_i, \hat{y}_i^{(t-1)})}{\partial (\hat{y}_i^{(t-1)})^2}

目标函数变为:

\mathcal{L}^{(t)} = \sum_{i=1}^n \left[ g_i h_t(x_i) + \frac{1}{2} h_i h_t(x_i)^2 \right] + \Omega(h_t)

对于每一棵树,叶子节点的预测值为常数

w_j

,树的结构为

q(x)

,表示样本

x

所属的叶子节点。

因此,模型可以表示为:

h_t(x) = w_{q(x)}

将其代入目标函数,并对每个叶子节点求和:

\mathcal{L}^{(t)} = \sum_{j=1}^T \left[ \left( \sum_{i \in I_j} g_i \right) w_j + \frac{1}{2} \left( \sum_{i \in I_j} h_i + \lambda \right) w_j^2 \right] + \gamma T

通过求导,可以得到每个叶子节点的最佳权重:

w_j^* = -\frac{\sum_{i \in I_j} g_i}{\sum_{i \in I_j} h_i + \lambda}

将最佳权重代入目标函数,得到优化后的目标函数:

\mathcal{L}^{(t)} = -\frac{1}{2} \sum_{j=1}^T \frac{(\sum_{i \in I_j} g_i)^2}{\sum_{i \in I_j} h_i + \lambda} + \gamma T

树的构建

  1. 分裂候选点:计算所有特征的所有可能分裂点的增益,选择增益最大的分裂点。
  2. 贪心算法:采用贪心算法进行树的构建,选择分裂增益最大的特征和分裂点。
  3. 剪枝:通过最小化目标函数来决定是否保留当前分裂。

XGBoost 算法流程

  1. 初始化模型
    • 将初始预测值设为常数,通常是目标值的均值。
  2. 迭代训练
    • 计算每个候选分裂点的增益。
    • 贪心选择最优分裂点,直到达到最大深度或其他停止条件。
    • 将新树的叶子节点权重
    w_j^*

    加入模型。

    • 对于每一轮
    t

    1. 计算当前模型的预测值
    \hat{y}_i^{(t-1)}

    1. 计算一阶和二阶导数
    g_i

    h_i

    1. 构建一棵新树,最小化目标函数:
    2. 更新模型:
  3. 模型输出
    • 最终模型由所有轮次的树组成,预测时将所有树的预测值加权求和。

整体可以看到,XGBoost通过一系列技术改进,如正则化项、二阶导数的使用、并行计算等,实现了在计算效率和预测性能上的显著提升。这些特点使得XGBoost在许多机器学习竞赛和实际应用中表现出色。

应用场景

XGBoost 适用问题

XGBoost适用于许多类型的机器学习问题,尤其在分类和回归任务中表现优异。

  1. 结构化数据:XGBoost在处理结构化数据(例如表格数据)时表现良好,可以处理大量特征和样本。
  2. 高维数据:XGBoost能够有效地处理高维数据,不需要过多的特征工程。
  3. 大规模数据:XGBoost具有并行处理和优化内存使用的特点,适用于处理大规模数据集。
  4. 准确性要求高:XGBoost在准确性方面表现优秀,通常能够获得较高的预测性能。

XGBoost 优缺点

优点

  1. 高准确性:XGBoost在许多数据集上都能够获得很高的预测准确性。
  2. 可扩展性:XGBoost具有并行处理能力,可以有效地处理大规模数据。
  3. 灵活性:XGBoost支持多种损失函数和正则化方法,可根据具体问题进行调整。
  4. 特征重要性:XGBoost可以自动计算特征的重要性,帮助理解数据。

缺点

  1. 参数调优:XGBoost有许多参数需要调优,不合适的参数设置可能导致过拟合或欠拟合。
  2. 计算资源需求:XGBoost在训练和预测时需要较多的计算资源。
  3. 不擅长处理文本数据:相对于其他算法(如深度学习模型),XGBoost不太擅长处理文本数据。

Python案例

下面,咱们使用加利福尼亚房价数据集(California Housing Dataset)来演示XGBoost进行回归分析的完整流程。

整个流程,包括数据加载、预处理、模型训练、预测、可视化和算法优化~

安装必要的库

代码语言:javascript
复制
pip install xgboost scikit-learn matplotlib seaborn pandas

导入后面需要库

代码语言:javascript
复制
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.metrics import mean_squared_error, r2_score
import xgboost as xgb

加载和准备数据

代码语言:javascript
复制
# 加载加利福尼亚房价数据集
california = fetch_california_housing()
X = pd.DataFrame(california.data, columns=california.feature_names)
y = pd.Series(california.target, name='MedHouseVal')

# 分割数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

print(X_train.shape, X_test.shape)

模型训练

代码语言:javascript
复制
# 创建 DMatrix 数据结构
dtrain = xgb.DMatrix(X_train, label=y_train)
dtest = xgb.DMatrix(X_test, label=y_test)

# 设置参数
params = {
    'objective': 'reg:squarederror',
    'max_depth': 4,
    'eta': 0.1,
    'subsample': 0.8,
    'colsample_bytree': 0.8,
    'seed': 42
}

# 训练模型
model = xgb.train(params, dtrain, num_boost_round=100)

# 预测
y_pred = model.predict(dtest)

性能评估

代码语言:javascript
复制
# 评估模型性能
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

print(f'Mean Squared Error: {mse}')
print(f'R^2 Score: {r2}')

可视化展现

代码语言:javascript
复制
# 可视化真实值和预测值
plt.figure(figsize=(10, 6))
plt.scatter(y_test, y_pred, alpha=0.7)
plt.plot([min(y_test), max(y_test)], [min(y_test), max(y_test)], color='red', linestyle='--')
plt.xlabel('Actual MedHouseVal')
plt.ylabel('Predicted MedHouseVal')
plt.title('Actual vs Predicted MedHouseVal')
plt.show()
代码语言:javascript
复制
# 特征重要性
xgb.plot_importance(model)
plt.title('Feature Importance')
plt.show()

模型优化

代码语言:javascript
复制
# 使用 GridSearchCV 进行参数调优
param_grid = {
    'max_depth': [3, 4, 5],
    'eta': [0.01, 0.1, 0.2],
    'subsample': [0.6, 0.8, 1.0],
    'colsample_bytree': [0.6, 0.8, 1.0]
}

grid_search = GridSearchCV(estimator=xgb.XGBRegressor(objective='reg:squarederror', seed=42), 
                           param_grid=param_grid, 
                           scoring='neg_mean_squared_error', 
                           cv=3, 
                           verbose=1)

grid_search.fit(X_train, y_train)

print(f'Best parameters found: {grid_search.best_params_}')

# 使用最佳参数训练模型
best_params = grid_search.best_params_
model_optimized = xgb.train(best_params, dtrain, num_boost_round=100)

# 预测
y_pred_optimized = model_optimized.predict(dtest)

# 评估优化后的模型性能
mse_optimized = mean_squared_error(y_test, y_pred_optimized)
r2_optimized = r2_score(y_test, y_pred_optimized)

print(f'Optimized Mean Squared Error: {mse_optimized}')
print(f'Optimized R^2 Score: {r2_optimized}')

整个的代码展示了一个使用加利福尼亚房价数据集进行XGBoost回归分析的完整流程。

通过GridSearchCV进行超参数调优,可以进一步提升模型的性能。可视化部分包括实际值和预测值的散点图,以及特征重要性图,可以帮助大家更好地理解模型的表现和特征的重要性。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-05-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Johngo学长 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 历史背景
  • 论文出处
  • 理论基础
  • XGBoost 算法流程
  • 应用场景
  • Python案例
相关产品与服务
GPU 云服务器
GPU 云服务器(Cloud GPU Service,GPU)是提供 GPU 算力的弹性计算服务,具有超强的并行计算能力,作为 IaaS 层的尖兵利器,服务于生成式AI,自动驾驶,深度学习训练、科学计算、图形图像处理、视频编解码等场景。腾讯云随时提供触手可得的算力,有效缓解您的计算压力,提升业务效率与竞争力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档