【python】Python实现XGBoost算法的详细理论讲解与应用实战

在这里插入图片描述

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,PyQt5和Tkinter桌面开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生K8S,linux,shell脚本等实操经验,网站搭建,数据库等分享。

所属的专栏:python综合应用,基础语法到高阶实战教学
景天的主页:景天科技苑

在这里插入图片描述

文章目录

  • Python实现XGBoost算法
    • 1. XGBoost简介
      • 1.1 XGBoost的基本思想
      • 1.2 XGBoost的优势
    • 2. 环境准备
    • 3. 数据准备
      • 3.1 数据集介绍
      • 3.2 数据加载和预处理
    • 4. 模型训练
      • 4.1 参数设置
      • 4.2 训练模型
    • 5. 模型评估与预测
      • 5.1 模型评估
      • 5.2 预测新数据
    • 6. 特征重要性与模型调优
      • 6.1 特征重要性
      • 6.2 模型调优
    • 7. 总结与进一步学习
      • 7.1 总结
      • 7.2 进一步学习

Python实现XGBoost算法

XGBoost(Extreme Gradient Boosting)是一种高效且广泛使用的集成学习算法,它属于梯度提升树(GBDT)模型的一种改进。XGBoost通过引入多种优化策略,如二阶泰勒展开、正则化项、自动处理缺失值等,显著提高了模型的预测精度和性能。本文将结合实际案例,详细介绍如何在Python中使用XGBoost算法进行模型训练和预测。

1. XGBoost简介

1.1 XGBoost的基本思想

XGBoost是一种基于梯度提升框架的算法,它通过构建多棵决策树来累加预测值,每棵树都试图修正前一棵树的预测误差。XGBoost的核心思想是贪心法,即逐棵树进行学习,每棵树拟合之前模型的偏差。

1.2 XGBoost的优势

  • 二阶泰勒展开:XGBoost在目标函数优化时使用了二阶泰勒展开,相比一阶展开保留了更多信息,有助于提升模型效果。
  • 正则化项:XGBoost加入了L1和L2正则化项,有助于控制模型的复杂度,防止过拟合。
  • 自动处理缺失值:XGBoost能够自动处理数据中的缺失值,无需预处理。
  • 支持并行计算:XGBoost支持特征并行和数据并行,可以显著提升训练速度。

2. 环境准备

在开始之前,请确保你的Python环境中已安装XGBoost库。如果没有安装,可以通过pip安装:

pip install xgboost

此外,我们还将使用到pandas、numpy、sklearn等库来处理数据和评估模型,确保这些库也已安装。

3. 数据准备

3.1 数据集介绍

为了演示,我们将使用经典的鸢尾花(Iris)数据集,该数据集包含150个样本,每个样本有4个特征(花萼长度、花萼宽度、花瓣长度、花瓣宽度),以及对应的3种类别标签(Setosa、Versicolour、Virginica)。虽然鸢尾花数据集是分类问题,但XGBoost同样适用于回归问题。

3.2 数据加载和预处理

import pandas as pd
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score# 加载数据
iris = load_iris()
X = iris.data
y = iris.target# 数据集划分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 转换为DMatrix格式,DMatrix是XGBoost内部的数据结构,对性能有优化
dtrain = xgb.DMatrix(X_train, label=y_train)
dtest = xgb.DMatrix(X_test, label=y_test)

4. 模型训练

4.1 参数设置

在训练模型之前,需要设置一些重要的参数。以下是一些常用参数及其含义:

  • max_depth:树的最大深度,增加此值会使模型变得更复杂,但可能导致过拟合。
  • eta(或learning_rate):学习率,控制每棵树对最终结果的贡献。较小的值需要更多的树来拟合训练数据,但通常能得到更好的泛化能力。
  • objective:目标函数,对于分类问题可以是multi:softmaxmulti:softprob,对于回归问题则是reg:squarederror等。
  • num_class:类别数,仅用于多分类问题。
  • gamma:分裂节点所需的最小损失函数下降值,越大模型越保守。
  • min_child_weight:子节点的最小权重和,较大的值会防止模型学习到噪声数据。
  • subsample:样本采样比例,用于防止过拟合。
  • colsample_bytree:特征采样比例,用于防止过拟合。

4.2 训练模型

import xgboost as xgb# 设置参数
params = {'max_depth': 3,'eta': 0.1,'objective': 'multi:softmax','num_class': 3
}
num_round = 100  # 迭代次数# 训练模型
bst = xgb.train(params, dtrain, num_round)

5. 模型评估与预测

5.1 模型评估

在模型训练完成后,我们需要在测试集上评估模型的性能。对于分类问题,常用的评估指标有准确率(accuracy)、精确率(precision)、召回率(recall)和F1分数(F1-score)等。由于我们的数据集是平衡的,所以这里使用准确率作为评估指标。

# 使用测试集进行预测
preds = bst.predict(dtest)# 预测结果转换为类别标签(因为predict返回的是概率值,我们需要取概率最大的类别作为预测结果)
predicted_classes = [np.argmax(line) for line in preds]# 计算准确率
accuracy = accuracy_score(y_test, predicted_classes)
print(f"Accuracy: {accuracy:.4f}")

注意:由于XGBoost的predict方法在分类任务中默认返回每个类别的概率,因此我们需要通过np.argmax来找到概率最大的类别作为预测结果。

5.2 预测新数据

在实际应用中,我们通常会使用训练好的模型来预测新数据。假设我们有一些新的样本数据X_new,我们可以直接使用训练好的模型进行预测。

# 假设X_new是新的数据集
# X_new = ... # 这里应该是你的新数据# 将新数据转换为DMatrix格式
dnew = xgb.DMatrix(X_new)# 使用模型进行预测
preds_new = bst.predict(dnew)
predicted_classes_new = [np.argmax(line) for line in preds_new]# 输出预测结果
print("Predicted classes for new data:", predicted_classes_new)

6. 特征重要性与模型调优

6.1 特征重要性

XGBoost提供了方便的方法来查看特征的重要性。特征重要性可以帮助我们理解哪些特征对模型的预测结果贡献最大。

# 获取特征重要性
importances = bst.get_fscore()# 打印特征重要性
print("Feature importances:", importances)# 也可以将特征重要性排序后输出
sorted_importances = sorted(importances.items(), key=lambda x: x[1], reverse=True)
for feature, importance in sorted_importances:print(f"{feature}: {importance}")

6.2 模型调优

模型调优是机器学习中的一个重要环节,它涉及到调整模型的参数以改善模型的性能。在XGBoost中,我们通常使用交叉验证(如xgb.cv)来评估不同参数组合下的模型性能,从而找到最优的参数设置。

from sklearn.model_selection import GridSearchCV# 定义参数网格
param_grid = {'max_depth': [3, 4, 5],'eta': [0.01, 0.1, 0.3],'subsample': [0.7, 0.8, 0.9],'colsample_bytree': [0.7, 0.8, 0.9]
}# 注意:XGBoost的GridSearchCV需要使用xgb.XGBClassifier或xgb.XGBRegressor包装器
xgb_clf = xgb.XGBClassifier(objective='multi:softmax', num_class=3)# 使用GridSearchCV进行参数搜索
grid_search = GridSearchCV(estimator=xgb_clf, param_grid=param_grid, cv=5, scoring='accuracy', verbose=1)
grid_search.fit(X_train, y_train)# 输出最优参数和最优模型
print("Best parameters found: ", grid_search.best_params_)
print("Best score found: ", grid_search.best_score_)# 可以使用最优参数重新训练模型
best_bst = grid_search.best_estimator_

注意:上面的代码中使用了xgb.XGBClassifier而不是直接调用xgb.train,这是因为GridSearchCV需要与scikit-learn兼容的API一起工作。然而,对于xgb.train,我们可以使用xgb.cv进行交叉验证,但参数调整需要手动进行。

7. 总结与进一步学习

7.1 总结

在本文中,我们详细探讨了如何在Python中使用XGBoost库来实现一个机器学习模型,从数据准备、模型训练、参数调优到模型评估和预测,整个过程都得到了全面的覆盖。XGBoost作为一种强大的梯度提升框架,凭借其高效的算法设计和灵活的参数设置,成为了处理分类、回归等问题的首选工具之一。

通过实际案例(鸢尾花数据集)的演示,我们不仅学习了如何使用XGBoost进行基本的模型训练和预测,还掌握了如何通过特征重要性和交叉验证来优化模型性能。这些技能对于从事数据分析和机器学习工作的人来说,是极其宝贵的。

7.2 进一步学习

尽管本教程已经涵盖了XGBoost的许多基础用法,但XGBoost的功能远不止于此。以下是一些建议,帮助你进一步深入学习和应用XGBoost:

  1. 深入学习XGBoost的参数

    • XGBoost拥有众多的参数,每个参数都对模型的性能有不同的影响。深入理解这些参数的含义和它们之间的相互作用,将帮助你更好地调整模型,以应对不同的数据集和问题。
  2. 尝试不同的数据集

    • 使用不同类型和规模的数据集来训练XGBoost模型,可以帮助你更全面地了解XGBoost的适用范围和性能表现。例如,可以尝试使用大型数据集、不平衡数据集或高维数据集。
  3. 学习XGBoost的高级特性

    • XGBoost支持多种高级特性,如早停(early stopping)、保存和加载模型、自定义目标函数和评估指标等。掌握这些特性,将使你能够更灵活地应用XGBoost来解决实际问题。
  4. 探索XGBoost在竞赛中的应用

    • XGBoost在各类机器学习竞赛中表现出色,许多获奖者都将其作为主要的模型之一。参与这些竞赛,不仅可以锻炼你的技能,还可以学习到其他优秀选手的建模思路和技巧。
  5. 学习与其他库的结合使用

    • XGBoost通常与scikit-learn、pandas、numpy等库结合使用,以实现数据的预处理、模型的训练和评估等任务。掌握这些库的结合使用,将提高你的数据处理和模型构建效率。
  6. 关注XGBoost的最新发展

    • XGBoost是一个不断发展的项目,其新版本中经常包含性能改进、新特性和错误修复。关注XGBoost的官方文档和社区动态,将使你能够及时了解其最新发展,并应用到你的工作中。
  7. 实践与应用

    • 最重要的是,将所学的知识应用到实际项目中。通过解决实际问题,你将更深入地理解XGBoost的工作原理和优势,并积累宝贵的实践经验。

总之,XGBoost是一种强大而灵活的机器学习算法,掌握其使用方法对于从事数据分析和机器学习工作的人来说至关重要。希望本文能够为你提供一个良好的起点,并激发你对XGBoost深入学习的兴趣和动力。

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

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

相关文章

encoding with ‘idna‘ codec failed (UnicodeError: label empty or too long)

今天在使用Flask连接mysql的时候,遇到了一个报错:encoding with ‘idna’ codec failed (UnicodeError: label empty or too long) 网上查了一下说是字符集的问题,然后尝试修改了一下字符集,结果还是不行。 最后去翻阅SQLAlchemy…

使用docker-compose运行kafka及验证(无需zookpeer)

前言:要求安装docker-compose kafka镜像版本:apache/kafka:3.8.0 可能存在镜像拉不下来的情况: 1、vim /etc/docker/daemon.json {"data-root":"/data/docker","registry-mirrors": ["https://docker.m…

力扣第 411 场周赛题解

3258. 统计满足 K 约束的子字符串数量 I 给你一个 二进制 字符串 s 和一个整数 k。 如果一个 二进制字符串 满足以下任一条件,则认为该字符串满足 k 约束: 字符串中 0 的数量最多为 k。字符串中 1 的数量最多为 k。 返回一个整数,表示 s …

【数据结构-哈希前缀】力扣2845. 统计趣味子数组的数目

给你一个下标从 0 开始的整数数组 nums ,以及整数 modulo 和整数 k 。 请你找出并统计数组中 趣味子数组 的数目。 如果 子数组 nums[l…r] 满足下述条件,则称其为 趣味子数组 : 在范围 [l, r] 内,设 cnt 为满足 nums[i] % mod…

JVM -垃圾回收器

本人在这篇文章中讲解了垃圾回收机制,这为前置知识 美团一面面经:Threadlocal(线程局部变量的原理)->内存泄漏问题->垃圾回收机制_threadlocal回收-CSDN博客 首先对前置知识漏洞做一个补充:ja…

open Euler22.03系统安装宝塔面板

环境:华为云open Euler22.03操作系统 配置:2核4G 1、安装宝塔面板。 登录弹性云服务器。 执行以下命令,下载并安装宝塔面板。 yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh &&…

STM32裸机和RTOS中的线程安全问题及STM32cubeMX中的线程安全策略

STM32线程安全问题 术语“线程” 和“多线程” 适用于裸机和基于RTOS的应用程序,线程安全问题并不只存在于基于RTOS的应用程序中;裸机应用程序中也存在这个问题,在裸机应用程序中,中断服务程序允许调用C库函数。线程安全问题可能…

Python实现水果忍者(开源)

一、整体介绍: 1.1 前言: 游戏代码基于Python制作经典游戏案例-水果忍者做出一些改动,优化并增加了一些功能。作为自己Python阶段学习的结束作品,文章最后有源码链接。 1.2 Python主要知识: (1&#xf…

Python爬虫——爬取某网站的视频

爬取视频 本次爬取,还是运用的是requests方法 首先进入此网站中,选取你想要爬取的视频,进入视频播放页面,按F12,将网络中的名称栏向上拉找到第一个并点击,可以在标头中,找到后续我们想要的一些…

qt-15综合实例(电子时钟)-多态重写鼠标单击和移动事件

综合实例-电子时钟 知识点digiclock.hdigiclock.cppmain.cpp运行图 知识点 setWindowOpacity(0.5);//设置窗体透明度 QTimer* Timer new QTimer(this);//新建一个定时器 connect(Timer,SIGNAL(timeout()),this,SLOT(ShowTime())); Timer->start(1000);//启动定时器 digic…

稚晖君发布5款全能人形机器人,开源创新,全能应用

8月18日,智元机器人举行“智元远征 商用启航” 2024年度新品发布会,智元联合创始人彭志辉主持并发布了“远征”与“灵犀”两大系列共五款商用人形机器人新品——远征A2、远征A2-W、远征A2-Max、灵犀X1及灵犀X1-W,并展示了在机器人动力、感知、…

猫头虎分享:练习提示词Prompt有什么好方法?提高Prompt水平和质量

猫头虎是谁? 大家好,我是 猫头虎,别名猫头虎博主,擅长的技术领域包括云原生、前端、后端、运维和AI。我的博客主要分享技术教程、bug解决思路、开发工具教程、前沿科技资讯、产品评测图文、产品使用体验图文、产品优点推广文稿、…

深扒大模型微调密码 - 从入门到技术小白都能看懂的神操作

朋友们,你们有没有听说过"大模型"和"微调"这两个概念呢?别着急,我们今天就来好好聊一聊! 想象一下,你有一个非常勤奋的小助理,它会尽最大努力帮你完成各种任务。不过有时候,它的知识储备和能力肯定有限,所以你得适时给它一些专门的…

树莓派5 笔记25:第一次启动与配置树莓派5_8G

今日继续学习树莓派5 8G:(Raspberry Pi,简称RPi或RasPi) 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: Opencv 与 python 版本如下: 今日购得了树莓派5_8G版本,性能是同运…

springboot航班进出港管理系统--论文源码调试讲解

第2章 开发环境与技术 本章节对开发航班进出港管理系统管理系统需要搭建的开发环境,还有航班进出港管理系统管理系统开发中使用的编程技术等进行阐述。 2.1 Java语言 Java语言是当今为止依然在编程语言行业具有生命力的常青树之一。Java语言最原始的诞生&#xff…

SQL每日一练-0815

今日SQL题难度:🌟☆☆☆☆☆☆☆☆☆ 1、题目要求 计算每个产品类别在每个月的总销售额和总销量。找出每个月销售额最高的产品类别,显示类别名称、销售月份、总销售额和总销量。 2、表和虚拟数据 现有两个表:Products 和…

牛客网习题——通过C++实现

一、目标 实现下面4道练习题增强C代码能力。 1.求123...n_牛客题霸_牛客网 (nowcoder.com) 2.计算日期到天数转换_牛客题霸_牛客网 (nowcoder.com) 3.日期差值_牛客题霸_牛客网 (nowcoder.com) 4.打印日期_牛客题霸_牛客网 (nowcoder.com) 二、对目标的实现 1.求123...n_…

[机器学习]--KNN算法(K邻近算法)

KNN (K-Nearest Neihbor,KNN)K近邻是机器学习算法中理论最简单,最好理解的算法,是一个 非常适合入门的算法,拥有如下特性: 思想极度简单,应用数学知识少(近乎为零),对于很多不擅长数学的小伙伴十分友好虽然算法简单,但效果也不错 KNN算法原理 上图是每一个点都是一个肿瘤病例…

Sakana.ai 迈向完全自动化的开放式科学发现

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

从零开始搭建k8s集群详细步骤

声明:本文仅作为个人记录学习k8s过程的笔记。 节点规划: 两台节点为阿里云ECS云服务器,操作系统为centos7.9,master为2v4GB,node为2v2GB,硬盘空间均为40GB。(节点基础配置不低于2V2GB) 主机名节点ip角色部…