【Python篇】深入机器学习核心:XGBoost 从入门到实战

news2024/11/13 23:38:09

文章目录

  • XGBoost 完整学习指南:从零开始掌握梯度提升
    • 1. 前言
    • 2. 什么是XGBoost?
      • 2.1 梯度提升简介
    • 3. 安装 XGBoost
    • 4. 数据准备
      • 4.1 加载数据
      • 4.2 数据集划分
    • 5. XGBoost 基础操作
      • 5.1 转换为 DMatrix 格式
      • 5.2 设置参数
      • 5.3 模型训练
      • 5.4 预测
    • 6. 模型评估
    • 7. 超参数调优
      • 7.1 常用超参数
      • 7.2 网格搜索
    • 8. XGBoost 特征重要性分析
    • 9. 高级功能扩展
      • 9.1 模型解释与可解释性
      • 9.2 XGBoost 与交叉验证
      • 9.3 处理缺失值
    • 10. XGBoost 在不同任务中的应用
      • 10.1 回归任务
      • 10.2 二分类任务
    • 11. 分布式训练
    • 12. 实战案例:XGBoost 与 Kaggle 竞赛
  • 总结

XGBoost 完整学习指南:从零开始掌握梯度提升

💬 欢迎讨论:如果你在学习过程中有任何问题或想法,欢迎在评论区留言,我们一起交流学习。你的支持是我继续创作的动力!

👍 点赞、收藏与分享:觉得这篇文章对你有帮助吗?别忘了点赞、收藏并分享给更多的小伙伴哦!你们的支持是我不断进步的动力!
🚀分享给更多人:如果你觉得这篇文章对你有帮助,欢迎分享给更多对C++感兴趣的朋友,让我们一起进步!


1. 前言

在机器学习中,XGBoost 是一种基于梯度提升的决策树(GBDT)实现,因其卓越的性能和速度,广泛应用于分类、回归等任务。尤其在Kaggle竞赛中,XGBoost以其强大的表现受到开发者青睐。

本文将带你从安装、基本概念到模型调优,全面掌握 XGBoost 的使用。


2. 什么是XGBoost?

2.1 梯度提升简介

XGBoost是基于梯度提升框架的一个优化版本。梯度提升是一种迭代的集成算法,通过不断构建新的树来补充之前模型的错误。它依赖多个决策树的集成效果,来提高最终模型的预测能力。

  • Boosting:通过组合多个弱分类器来生成强分类器。
  • 梯度提升:使用损失函数的梯度信息来逐步优化模型。

XGBoost 提供了对内存效率、计算速度、并行化的优化,是一个非常适合大数据和高维数据集的工具。


3. 安装 XGBoost

首先,我们需要安装 XGBoost 库。可以通过 pip 安装:

pip install xgboost

如果你使用的是 Jupyter Notebook,可以通过以下命令安装:

!pip install xgboost

安装完成后,使用以下代码验证:

import xgboost as xgb
print(xgb.__version__)  # 显示安装的版本号

如果正确输出版本号,则表示安装成功。


4. 数据准备

在机器学习中,数据预处理至关重要。我们将使用经典的鸢尾花数据集(Iris dataset),这是一个用于分类任务的多类数据集。

4.1 加载数据

通过 Scikit-learn 轻松获取鸢尾花数据:

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

# 加载数据
iris = load_iris()
X, y = iris.data, iris.target

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

4.2 数据集划分

为了评估模型性能,我们将数据集分为训练集和测试集,训练集用于模型训练,测试集用于性能评估。

# 查看训练集和测试集的大小
print(X_train.shape, X_test.shape)

5. XGBoost 基础操作

XGBoost 的核心数据结构是 DMatrix,它是经过优化的内部数据格式,具有更高的内存和计算效率。

5.1 转换为 DMatrix 格式

我们将训练集和测试集转换为 DMatrix 格式:

# 转换为 DMatrix 格式
dtrain = xgb.DMatrix(X_train, label=y_train)
dtest = xgb.DMatrix(X_test)

DMatrix 支持稀疏矩阵,可以显著提升大型数据集的内存效率。

5.2 设置参数

XGBoost 提供了大量的超参数可以调节。我们从一些基本参数开始:

# 设置参数
params = {
    'objective': 'multi:softmax',  # 多分类问题
    'num_class': 3,  # 类别数量
    'max_depth': 4,  # 树的最大深度
    'eta': 0.3,  # 学习率
    'seed': 42
}
  • objective:损失函数,这里我们选择的是多分类的 softmax
  • num_class:类别的数量。
  • max_depth:树的最大深度,越深的树更复杂,但容易过拟合。
  • eta:学习率,用于控制每棵树对最终模型影响的大小。

5.3 模型训练

通过以下代码训练模型:

# 训练模型
num_round = 10  # 迭代次数
bst = xgb.train(params, dtrain, num_boost_round=num_round)

5.4 预测

训练完成后,我们可以使用测试集进行预测:

# 预测
preds = bst.predict(dtest)
print(preds)

此时输出的是模型对每个样本的预测类别。


6. 模型评估

XGBoost 支持多种评估指标。我们可以使用 Scikit-learn 提供的 accuracy_score 来评估模型的准确性。

from sklearn.metrics import accuracy_score

# 计算准确率
accuracy = accuracy_score(y_test, preds)
print(f"模型准确率: {accuracy:.2f}")

假设输出为:

模型准确率: 0.98

98% 的准确率表示模型在鸢尾花数据集上的表现非常好。


7. 超参数调优

XGBoost 提供了丰富的超参数,适当的调优可以显著提升模型性能。我们可以使用 GridSearchCV 进行超参数搜索。

7.1 常用超参数

  • max_depth:树的深度,影响模型复杂度和过拟合风险。
  • learning_rate(或 eta):学习率,控制每次迭代的步长。
  • n_estimators:提升树的数量,即训练的轮数。

7.2 网格搜索

我们使用 GridSearchCV 来对这些超参数进行调优:

from sklearn.model_selection import GridSearchCV
from xgboost import XGBClassifier

# 创建模型
model = XGBClassifier()

# 定义参数网格
param_grid = {
    'max_depth': [3, 4, 5],
    'n_estimators': [50, 100, 200],
    'learning_rate': [0.1, 0.3, 0.5]
}

# 使用网格搜索
grid_search = GridSearchCV(model, param_grid, scoring='accuracy', cv=3)
grid_search.fit(X_train, y_train)

# 输出最佳参数
print("最佳参数组合:", grid_search.best_params_)

网格搜索会自动尝试不同的参数组合,最后返回最优组合。


8. XGBoost 特征重要性分析

XGBoost 提供了内置的方法来分析特征的重要性。这有助于理解哪些特征对模型影响最大。

# 绘制特征重要性
xgb.plot_importance(bst)
plt.show()

特征重要性图将显示每个特征对模型的影响,帮助开发者进一步优化模型。


9. 高级功能扩展

9.1 模型解释与可解释性

对于生产环境中的应用,解释模型预测结果至关重要。你可以使用 SHAP (SHapley Additive exPlanations) 来解释 XGBoost 模型的预测。它帮助我们理解特征对预测结果的影响。

安装并使用 SHAP:

pip install shap
import shap

# 使用 SHAP 解释模型
explainer = shap.TreeExplainer(bst)
shap_values = explainer.shap_values(dtest)

# 可视化 SHAP 值
shap.summary_plot(shap_values, X_test)

这个图表将展示每个特征如何影响预测输出,红色表示正向影响,蓝色表示负向影响。


9.2 XGBoost 与交叉验证

交叉验证(Cross-Validation, CV)是一种常见的评估方法,用来减少过拟合的风险。XGBoost 提供了内置的交叉验证功能:

cv_results = xgb.cv(
    params, dtrain, num_boost_round=50, 
    nfold=5, metrics="mlogloss", as_pandas=True, seed=42
)

# 输出交叉验证结果
print(cv_results)

通过 xgb.cv,我们可以在不同的参数组合下进行多次训练,计算出平均损失值或准确率,从而找到最优的超参数。


9.3 处理缺失值

XGBoost 具有强大的处理缺失值能力,它会在训练过程中自动处理数据中的缺失值,选择最优的分裂方式。这使得它非常适合应用在含有缺失值的真实数据集上。

例如,如果数据中有缺失值,XGBoost 不需要手动填补:

import numpy as np
# 假设数据集中有 NaN 值
X_train[0, 0] = np.nan
dtrain = xgb.DMatrix(X_train, label=y_train)

10. XGBoost 在不同任务中的应用

10.1 回归任务

XGBoost 不仅适用于分类问题,也可以处理回归问题。在回归任务中,目标函数可以设置为 reg:squarederror,这是最常见的回归目标:

params = {
    'objective': 'reg:squarederror',  # 回归任务
    'max_depth': 4,
    'eta': 0.1,
}

# 加载样例数据(例如房价预测)
from sklearn.datasets import load_boston
X, y = load_boston(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

dtrain = xgb.DMatrix(X_train, label=y_train)
dtest = xgb.DMatrix(X_test)

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

# 进行预测
preds = bst.predict(dtest)
print(preds)

10.2 二分类任务

对于二分类问题,我们可以将目标函数设置为 binary:logistic,输出预测值为一个概率。

params = {
    'objective': 'binary:logistic',
    'max_depth': 4,
    'eta': 0.3,
}

# 假设我们有一个二分类数据集
from sklearn.datasets import make_classification
X, y = make_classification(n_samples=1000, n_features=20, n_classes=2)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
dtrain = xgb.DMatrix(X_train, label=y_train)
dtest = xgb.DMatrix(X_test)

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

# 进行预测
preds = bst.predict(dtest)

11. 分布式训练

XGBoost 支持多机多 GPU 的分布式训练,这使得它在大规模数据集上具有很高的可扩展性。要启用分布式训练,首先需要搭建集群,并配置相应的参数。

XGBoost 通过 Rabit 框架进行节点间的通信,支持通过 Spark、Dask 等框架实现分布式训练。你可以在大规模数据集上使用 XGBoost 高效地进行训练。


12. 实战案例:XGBoost 与 Kaggle 竞赛

XGBoost 在许多 Kaggle 竞赛中取得了优异的成绩。以下是一个实际案例:我们将使用泰坦尼克号乘客生存预测数据集,进行完整的模型训练与评估。

import pandas as pd

# 加载泰坦尼克号数据
train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')

# 数据预处理
train['Age'].fillna(train['Age'].mean(), inplace=True)
train['Embarked'].fillna('S', inplace=True)
train['Fare'].fillna(train['Fare'].mean(), inplace=True)

# 特征处理
train['Sex'] = train['Sex'].map({'male': 0, 'female': 1})
train['Embarked'] = train['Embarked'].map({'S': 0, 'C': 1, 'Q': 2})

# 特征和标签
X_train = train[['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked']]
y_train = train['Survived']

dtrain = xgb.DMatrix(X_train, label=y_train)

# 设置参数
params = {
    'objective': 'binary:logistic',
    'max_depth': 3,
    'eta': 0.1,
    'eval_metric': 'logloss'
}

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

# 对测试集进行预测
dtest = xgb.DMatrix(test[['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked']])
preds = bst.predict(dtest)

这是一个简单的例子,展示了如何使用 XGBoost 处理分类任务并进行模型预测。根据任务复杂度,可以通过特征工程和调参来提升模型表现。


总结

在本教程中,我们详细介绍了 XGBoost 的各个方面,从基础到高级应用,包括分类、回归、特征重要性、调参、分布式训练等。XGBoost 作为高效的梯度提升工具,在各种机器学习任务中都表现优异。通过不断的实践和优化,你可以让 XGBoost 在实际项目中发挥更大的作用。


以上就是关于【Python篇】深入机器学习核心:XGBoost 从入门到实战的内容啦,各位大佬有什么问题欢迎在评论区指正,或者私信我也是可以的啦,您的支持是我创作的最大动力!❤️

在这里插入图片描述

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

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

相关文章

重生之我们在ES顶端相遇第14 章 - ES 节点类型

文章目录 前言Coordinating nodeMaster-eligible nodeData nodeCoordinating only nodeRemote-eligible nodeMachine learning node 前言 通过前面的学习,我们已经初步的掌握了 ES 的大部分用法。 后面的篇章会介绍 ES 集群相关的内容。 本文着重介绍 ES 节点类型&…

华为HarmonyOS地图服务 3 - 如何开启和展示“我的位置”?

一. 场景介绍 本章节将向您介绍如何开启和展示“我的位置”功能,“我的位置”指的是进入地图后点击“我的位置”显示当前位置点的功能。效果如下: 二. 接口说明 “我的位置”功能主要由MapComponentController的方法实现,更多接口及使用方法…

软考高级:逻辑地址和物理地址转换 AI解读

一、题目 设某进程的段表如下所示,逻辑地址( )可以转换为对应的物理地址。 A. (0,1597)、(1,30)和(3,1390) B. (0&…

Vue3 中组件传递 + css 变量的组合

文章目录 需求效果如下图所示代码逻辑代码参考 需求 开发一个箭头组件&#xff0c;根据父组件传递的 props 来修改 css 的颜色 效果如下图所示 代码逻辑 代码 父组件&#xff1a; <Arrow color"red" />子组件&#xff1a; <template><div class&…

3DMAX乐高积木插件LegoBlocks使用方法

3DMAX乐高积木插件LegoBlocks&#xff0c;用户可以通过控件调整和自定义每个乐高积木的外观和大小。 【适用版本】 3dMax2009或更高版本&#xff08;不仅限于此范围&#xff09; 【安装方法】 3DMAX乐高积木插件无需安装&#xff0c;使用时直接拖动插件脚本文件到3dMax视口中…

TS 运行环境

1、TS Playground&#xff08;在线&#xff09; TS Playground 是一个在线 TypeScript 编辑器&#xff0c;它允许你编写、共享和学习 TypeScript 代码。 2、Stackblitz&#xff08;在线&#xff09; StackBlitz 是面向web开发人员的基于浏览器的协作IDE。StackBlitz消除了耗时…

握手传输 状态机序列检测(记忆科技笔试题)_2024年9月2日

发送模块循环发送0-7&#xff0c;在每个数据传输完成后&#xff0c;间隔5个clk&#xff0c;发送下一个 插入寄存器打拍处理&#xff0c;可以在不同的时钟周期内对信号进行同步&#xff0c;从而减少亚稳态的风险。 记忆科技笔试题&#xff1a;检测出11011在下一个时钟周期输出…

Python | 读取.dat 文件

写在前面 使用matlab可以输出为 .dat 或者 .mat 形式的文件&#xff0c;之前介绍过读取 .mat 后缀文件&#xff0c;今天正好把 .dat 的读取也记录一下。 读取方法 这里可以使用pandas库将其作为一个dataframe的形式读取进python&#xff0c;数据内容格式如下&#xff0c;根据…

VulnHub-Narak靶机笔记

Narak靶机笔记 概述 Narak是一台Vulnhub的靶机&#xff0c;其中有简单的tftp和webdav的利用&#xff0c;以及motd文件的一些知识 靶机地址&#xff1a; https://pan.baidu.com/s/1PbPrGJQHxsvGYrAN1k1New?pwda7kv 提取码: a7kv 当然你也可以去Vulnhub官网下载 一、nmap扫…

zabbix7.0容器化部署测试--(1)准备容器镜像

本文为zabbix7.0容器化部署测试系统文档之一&#xff0c;准备容器镜像。拟测试数据库后台为PostgreSQL16并启用timescaledb插件。 一、准备数据库容器镜像 因为不确定zabbix7.0对数据库timescaledb插件的版本要求&#xff0c;准备了现个镜像版本 1、准备timescaledb-2.14.2插…

linux 基础(一)mkdir、ls、vi、ifconfig

1、linux简介 linux是一个操作系统&#xff08;os: operating system&#xff09; 中国有没有自己的操作系统&#xff08;华为鸿蒙HarmonyOS&#xff0c;阿里龙蜥(Anolis) OS 8、百度DuerOS都有&#xff09; 计算机组的组成&#xff1a;硬件软件 硬件&#xff1a;运算器&am…

【速成Redis】03 Redis 五大高级数据结构介绍及其常用命令 | 消息队列、地理空间、HyperLogLog、BitMap、BitField

前言&#xff1a; 上篇博客我们讲到redis五大基本数据类型&#xff08;也是就下图的第一列&#xff09;。 【速成Redis】02 Redis 五大基本数据类型常用命令-CSDN博客文章浏览阅读1k次&#xff0c;点赞24次&#xff0c;收藏10次。该篇适用于速成redis。本篇我们将讲解&#…

MySQL | 知识 | NULL值是怎么存储的

NULL值有哪些语法影响 我们使用mysql时&#xff0c;使用 xx !aa 这种条件为什么无法筛选出值为NULL的字段呢。 是的&#xff0c;MySQL 中null 值确实无法通过这种条件筛选出来&#xff0c;因为 null 值的定义就跟普通值不一样。 拿官网的例子来说&#xff1a; mysql> INSE…

在Java中基于GeoTools的Shapefile读取乱码的问题解决办法

目录 前言 1、Shapefile属性字段编码的情况&#xff1a; 一、Shp文件常见的字符集编码 1、System编码 2、ISO-8859-1编码 3、UTF-8编码 二、GeoTools解析实战 1、未进行字符处理 2、乱码问题的解决 3、转码支持 4、属性字段编码结果 三、总结 前言 文件编码&#x…

RabbitMQ:交换机详解(Fanout交换机、Direct交换机、Topic交换机)

♥️作者&#xff1a;小宋1021 &#x1f935;‍♂️个人主页&#xff1a;小宋1021主页 ♥️坚持分析平时学习到的项目以及学习到的软件开发知识&#xff0c;和大家一起努力呀&#xff01;&#xff01;&#xff01; &#x1f388;&#x1f388;加油&#xff01; 加油&#xff01…

【笔记】第二节 轧制、热处理和焊接工艺

2.2 钢轨的轧制工艺 坯料进厂按标准验收, 然后装加热炉加热, 加热好的钢坯经高压水除鳞后进行轧制。轧出的钢轨经锯切、打印到中央冷床冷却, 然后装缓冷坑进行缓冷。缓冷后的钢轨进行矫直、轨端加工和端头淬火。钢轨入库前逐根进行探伤和外观检查。 钢轨的轧制 #mermaid-svg-…

【Delphi】使用 TPrototypeBindSource 和 LiveBindings 设计器示例

本教程展示了如何使用 LiveBindings Designer 和 TPrototypeBindSource 可视化地创建控件之间的 LiveBindings&#xff0c;以便快速开发只需很少或无需源代码的应用程序。 注意&#xff1a; TPrototypeBindSource 可用于为项目中的 LiveBindings 生成样本数据。在应用程序原型化…

公私域互通下的新商机探索:链动2+1模式、AI智能名片与S2B2C商城小程序的融合应用

摘要&#xff1a;在数字化时代&#xff0c;公私域流量的有效融合已成为企业获取持续增长动力的关键。本文旨在探讨如何通过链动21模式、AI智能名片以及S2B2C商城小程序源码的综合运用&#xff0c;实现公私域流量的高效互通&#xff0c;进而为门店创造巨大商机。通过分析这些工具…

前后端跨域问题及其在ThinkPHP中的解决方案

在现代Web开发中&#xff0c;前后端分离的架构越来越普遍&#xff0c;但这也带来了跨域问题。跨域指的是在一个域下的网页试图请求另一个域的资源&#xff0c;浏览器出于安全考虑会限制这种行为。本文将探讨如何在ThinkPHP中解决跨域问题。 #### 1. 什么是跨域&#xff1f; 跨…

C++初阶学习——模版进阶

1. 非类型模板参数 模板参数分类类型形参与非类型形参。 类型形参即&#xff1a;出现在模板参数列表中&#xff0c;跟在class或者typename之类的参数类型名称。 非类型形参&#xff0c;就是用一个常量作为类(函数)模板的一个参数&#xff0c;在类(函数)模板中可将该参数当成…