xgboost算法python实现(保姆级)(代码片段)

小皇的奶黄包 小皇的奶黄包     2023-04-11     608

关键词:

摘要

        XGBoost算法(eXtreme Gradient Boosting)在目前的Kaggle、数学建模和大数据应用等竞赛中非常流行。本文将会从XGBOOST算法原理、Python实现、敏感性分析和实际应用进行详细说明。

目录

0 绪论

一、材料准备

二、算法原理

三、算法Python实现

        3.1 数据加载

        3.2 将目标变量的定类数据分类编码

        3.3 将数据分为训练数据和测试数据

        3.4训练XGBOOST模型

        3.5 测试模型

        3.6 输出模型的预测混淆矩阵(结果矩阵)

        3.7 输出模型准确率

        3.8 绘制混淆矩阵图

         3.9 完整实现代码

        3.10 结果输出示例

四、 XGBOOST算法的敏感性分析和实际应用

        4.1 敏感性分析

        4.2 算法应用

五、结论

六、备注

0 绪论

        数据挖掘和数学建模等比赛中,除了算法的实现,还需要对数据进行较为合理的预处理,包括缺失值处理、异常值处理、定类数据特征编码和冗余特征的删除等等,本文默认读者的数据均已完成数据预处理,如有需要,后续会将数据预处理的方法也进行发布。

一、材料准备

        Python编译器:Pycharm社区版或个人版等

        训练数据集:此处使用2022年数维杯国际大学生数学建模竞赛C题的附件数据为例。

        数据处理:经过初步数据清洗和相关性分析等操作得到初步的特征,并利用决策树进行特征重要性分析,完成二次特征降维,得到'CDRSB_bl', 'PIB_bl', 'FBB_bl'三个自变量特征,DX_bl为分类特征。

二、算法原理

     XGBOOST算法基于决策树的集成方法,主要采用了Boosting的思想,是Gradient Boosting算法的扩展,并使用梯度提升技术来提高模型的准确性和泛化能力。

        首先将基分类器层层叠加,然后每一层在训练的时候,对前一层基分类器分错的样本,给予更高的权重,XGBOOST的目标函数为:

    (1)

        其中,为损失函数;为正则项,用于控制树的复杂度;为常数项,为新树的预测值,它是将树的个数的结果进行求和。

三、算法Python实现

3.1 数据加载

        此处导入本文所需数据,DataX为自变量数据,DataY为目标变量数据(DX_bl)。

import pandas as pd
X = pd.DataFrame(pd.read_excel('DataX.xlsx')).values  # 输入特征
y = pd.DataFrame(pd.read_excel('DataY.xlsx')).values  # 目标变量

 3.2 将目标变量的定类数据分类编码

此处仅用0-4来代替五类数据,因为此处仅做预测,并不涉及相关性分析等其他操作,所以普通的分类编码就可以。如果需要用来做相关性分析或其他计算型操作,建议使用独热编码(OneHot- Encoding)。

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
y = le.fit_transform(y)
label_mapping = 0: 'AD', 1: 'CN', 2: 'EMCI', 3: 'LMCI', 4: 'SMC'
#此处为了后续输出混淆矩阵时,用原始数据输出

 3.3 将数据分为训练数据和测试数据

        本文将原始样本数据通过随机洗牌,并将70%的样本数据作为训练数据,30%的样本数据作为测试数据。这是一个较为常见的拆分方法,读者可通过不同的拆分测试最佳准确率和F1-score。

from sklearn.model_selection import train_test_split
# 将数据分为训练数据和测试数据
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, train_size=0.7, random_state=42)

 3.4训练XGBOOST模型

        基于70%的样本数据进行训练建模,python有XGBOOST算法的库,所以很方便就可以调用。

import xgboost as xgb
# 训练XGBoost分类器
model = xgb.XGBClassifier()
model.fit(X_train, y_train)
#xgb.plot_tree(model)

 3.5 测试模型

        利用另外的30%样本数据进行测试模型准确率、精确率、召回率和F1度量值。

# 使用测试数据预测类别
y_pred = model.predict(X_test)

 3.6 输出模型的预测混淆矩阵(结果矩阵)

        此处输出混淆矩阵的方法和之前的随机森林、KNN算法都有点不同,因为随机森拉算法不需要将定类数据进行分类编码就可以直接调用随机森林算法模型。

from sklearn.metrics import confusion_matrix, classification_report, accuracy_score
cm = confusion_matrix(y_test, y_pred)
# 输出混淆矩阵
for i, true_label in enumerate(label_mapping.values()):
    row = ''
    for j, pred_label in enumerate(label_mapping.values()):
        row += f'cm[i, j] (pred_label)\\t'
    print(f'row | true_label')

# 输出混淆矩阵
print(classification_report(y_test, y_pred,target_names=['AD', 'CN', 'EMCI', 'LMCI', 'SMC']))  # 输出混淆矩阵

 3.7 输出模型准确率

#此处的导库在上一个代码段中已引入
print("Accuracy:")
print(accuracy_score(y_test, y_pred))

 3.8 绘制混淆矩阵图

        将混淆矩阵结果图绘制并输出,可以将这一结果图放在论文中,提升论文美感和信服度。

import matplotlib.pyplot as plt
import numpy as np
label_names = ['AD', 'CN', 'EMCI', 'LMCI', 'SMC']
cm = confusion_matrix(y_test, y_pred)

# 绘制混淆矩阵图
fig, ax = plt.subplots()
im = ax.imshow(cm, interpolation='nearest', cmap=plt.cm.Blues)
ax.figure.colorbar(im, ax=ax)
ax.set(xticks=np.arange(cm.shape[1]),
       yticks=np.arange(cm.shape[0]),
       xticklabels=label_names, yticklabels=label_names,
       title='Confusion matrix',
       ylabel='True label',
       xlabel='Predicted label')

# 在矩阵图中显示数字标签
thresh = cm.max() / 2.
for i in range(cm.shape[0]):
    for j in range(cm.shape[1]):
        ax.text(j, i, format(cm[i, j], 'd'),
                ha="center", va="center",
                color="white" if cm[i, j] > thresh else "black")

fig.tight_layout()
#plt.show()
plt.savefig('XGBoost_Conclusion.png', dpi=300)

        上面的代码首先计算混淆矩阵,然后使用 matplotlib 库中的 imshow 函数将混淆矩阵可视化,最后通过 text 函数在混淆矩阵上添加数字,并使用 show/savefig 函数显示图像,结果输出如图3.1所示。

图3.1 混淆矩阵结果图

  3.9 完整实现代码

# 导入需要的库
from sklearn.preprocessing import LabelEncoder
import matplotlib.pyplot as plt
import pandas as pd
import xgboost as xgb
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix, classification_report, accuracy_score
import numpy as np

le = LabelEncoder()
label_mapping = 0: 'AD', 1: 'CN', 2: 'EMCI', 3: 'LMCI', 4: 'SMC'
X = pd.DataFrame(pd.read_excel('DataX.xlsx')).values  # 输入特征
y = pd.DataFrame(pd.read_excel('DataY.xlsx')).values  # 目标变量
y = le.fit_transform(y)
# 将数据分为训练数据和测试数据
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, train_size=0.7, random_state=42)
# 训练XGBoost分类器
model = xgb.XGBClassifier()
model.fit(X_train, y_train)
#xgb.plot_tree(model)
# 使用测试数据预测类别
y_pred = model.predict(X_test)
cm = confusion_matrix(y_test, y_pred)
# 输出混淆矩阵
for i, true_label in enumerate(label_mapping.values()):
    row = ''
    for j, pred_label in enumerate(label_mapping.values()):
        row += f'cm[i, j] (pred_label)\\t'
    print(f'row | true_label')

# 输出混淆矩阵
print(classification_report(y_test, y_pred,target_names=['AD', 'CN', 'EMCI', 'LMCI', 'SMC']))  # 输出混淆矩阵
print("Accuracy:")
print(accuracy_score(y_test, y_pred))


# label_names 是分类变量的取值名称列表
label_names = ['AD', 'CN', 'EMCI', 'LMCI', 'SMC']
cm = confusion_matrix(y_test, y_pred)

# 绘制混淆矩阵图
fig, ax = plt.subplots()
im = ax.imshow(cm, interpolation='nearest', cmap=plt.cm.Blues)
ax.figure.colorbar(im, ax=ax)
ax.set(xticks=np.arange(cm.shape[1]),
       yticks=np.arange(cm.shape[0]),
       xticklabels=label_names, yticklabels=label_names,
       title='Confusion matrix',
       ylabel='True label',
       xlabel='Predicted label')

# 在矩阵图中显示数字标签
thresh = cm.max() / 2.
for i in range(cm.shape[0]):
    for j in range(cm.shape[1]):
        ax.text(j, i, format(cm[i, j], 'd'),
                ha="center", va="center",
                color="white" if cm[i, j] > thresh else "black")

fig.tight_layout()
#plt.show()
plt.savefig('XGBoost_Conclusion.png', dpi=300)
# 上面的代码首先计算混淆矩阵,然后使用 matplotlib 库中的 imshow 函数将混淆矩阵可视化,最后通过 text 函数在混淆矩阵上添加数字,并使用 show/savefig 函数显示图像。

 3.10 结果输出示例

       

 图3.2 结果输出示例

四、 XGBOOST算法的敏感性分析和实际应用

 4.1 敏感性分析

         敏感性分析也叫做稳定性分析,可以基于统计学思想,通过百次测试,记录其准确率、精确率、召回率和F1-Score的数据,统计其中位数、平均值、最大值和最小值等数据,从而进行对应的敏感性分析。结果表明符合原模型成立,则通过了敏感性分析。前面的随机森林算法和KNN算法也是如此。

 4.2 算法应用

         XGBOOST算法可应用于大数据分析、预测等方面,尤其是大数据竞赛(Kaggle、阿里天池等竞赛中)特别常用,也是本人目前认为最好用的一个算法。

五、结论

        本文基于XGBOOST算法,从数据预处理、算法原理、算法实现、敏感性分析和算法应用都做了具体的分析,可适用于大部分机器学习算法初学者。

六、备注

        本文为原创文章,禁止转载,违者必究。如需原始数据,可点赞+收藏,然后私聊作者或在评论区中留下你的邮箱,即可获得训练数据一份。

保姆级教程!开源python项目详细指南(代码片段)

点击机器学习算法与Python学习,选择加星标精彩内容不迷路来源:机器之心作者以SciTime项目(一个对算法训练时间进行估计的包)的发布为例,详细解释了发布的每个步骤。注意:本文假设你在GitHub上已... 查看详情

保姆级教程!开源python项目详细指南(代码片段)

点击机器学习算法与Python学习,选择加星标精彩内容不迷路来源:机器之心作者以SciTime项目(一个对算法训练时间进行估计的包)的发布为例,详细解释了发布的每个步骤。注意:本文假设你在GitHub上已... 查看详情

字符串跳舞,保姆级教程,利用python实现小姐姐跳代码舞(代码片段)

...舞源代码:video_2_code_video.py私信小编01即可获取大量python学习资源,最后,如果你的时间不是很紧张,并且又想快速的提高,最重要的是不怕吃苦,建议你可以联系维:762459510,那个真的很不错࿰... 查看详情

用python写个贪吃蛇,保姆级教程(代码片段)

本文基于Windows环境开发,适合Python新手下面我们就一起用Python实现一个简单有趣的命令行贪吃蛇小游戏,启动命令:.私信小编01即可获取大量Python学习教程git clone https://github.com/AnthonySun256/easy_gamescd easy_gamespython sna... 查看详情

史诗级干货长文集成学习进阶(xgboost&lightgbm)(代码片段)

集成学习进阶1.xgboost算法原理1.1最优模型的构建方法1.2XGBoost的目标函数推导1.2.1目标函数确定1.2.2CART树的介绍1.2.3树的复杂度定义1.2.3.1定义每课树的复杂度1.2.3.2树的复杂度举例1.2.4目标函数推导1.3XGBoost的回归树构建方法1.3.1计算... 查看详情

xgboost怎么实现模型融合

参考技术AXGBoost参数调优完全指南(附Python代码)译注:文内提供的代码和运行结果有一定差异,可以从这里下载完整代码对照参考。另外,我自己跟着教程做的时候,发现我的库无法解析字符串类型的特征,所以只用其中一部... 查看详情

29.❤️保姆级教程带你做一个属于自己的博客网站❤️纯python实现&&附带源码(代码片段)

功能介绍:页面功能主页index.html展示添加博客和博客列表的文字,实现页面跳转添加页add.html输入文章标题及内容,并将内容提交到数据库中列表页list.html将数据库中所有博客展示到前端页面中,点击文章可以查... 查看详情

29.❤️保姆级教程带你做一个属于自己的博客网站❤️纯python实现&&附带源码(代码片段)

功能介绍:页面功能主页index.html展示添加博客和博客列表的文字,实现页面跳转添加页add.html输入文章标题及内容,并将内容提交到数据库中列表页list.html将数据库中所有博客展示到前端页面中,点击文章可以查... 查看详情

保姆级教程带你开发优质的python库之下篇种子项目(代码片段)

正式的Python专栏第11篇,同学站住,别错过这个从0开始的文章!保姆级教程带你开发优质的Python库之上篇保姆级教程带你开发优质的Python库之中篇前面两篇的开发基本把项目准备好了,这篇学委讲讲这个项目开源... 查看详情

保姆级教程带你开发优质的python库之下篇种子项目(代码片段)

正式的Python专栏第11篇,同学站住,别错过这个从0开始的文章!保姆级教程带你开发优质的Python库之上篇保姆级教程带你开发优质的Python库之中篇前面两篇的开发基本把项目准备好了,这篇学委讲讲这个项目开源... 查看详情

保姆级连载学python:第一篇认识python(代码片段)

认识Python人生苦短,我用Python——Lifeisshort,youneedPython[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fwc3dq21-1627286909782)(media/14950329208518/001_%E4%BA%BA%E7%94%9F%E8%8B%A6%E7%9F%AD%E6%88%91%E7%94%A8pyt 查看详情

保姆级连载学python:第二篇python之helloworld(代码片段)

第一个Python程序目标第一个HelloPython程序Python2.x与3​​.x版本简介执行Python程序的三种方式解释器——python/python3交互式——ipython集成开发环境——PyCharm01.第一个HelloPython程序1.1Python源程序的基本概念Python源程序就是一个特殊格... 查看详情

lightgbm算法---介绍说明python代码(代码片段)

...鉴也可能存在错误欢迎指正LightGBM细节技术1.直方图优化XGBoost缺点LightGBM改进2.深度限制的节点展开方法3.直方图做差优化4.支持类别特征5.支持并行学习python实现小结细节技术1.直方图优化XGBoost缺点XGBoost是基于预排序方法的决策... 查看详情

保姆级java入门练习教程,附代码讲解,小白零基础入门必备(建议收藏)(代码片段)

...论和实战的完美结合📚《leetcode300题》——每天一道算法题,进大厂必备📚《从实战学python》——Python的爬虫,自 查看详情

保姆级连载学python:第三篇pycharm的初始设置(代码片段)

...arm的初始设置(知道)课程详情:黑马程序员Python入门教程_适合零基础自学的Python教程目标恢复PyCharm的初始设置第一次启动PyCharm新建一个Python项目设置PyCharm的字体显示PyCharm的升级以及其他PyCharm的官方网站地址是&#x... 查看详情

《汇编语言》实验代码及详解(保姆级)(代码片段)

...编代码的编译器,在VMware的虚拟机linux环境下也可以实现运行,这里不做演示)Tips:此实验是目前为止汇编语言最复杂的实验代码及功能实现,汇编语言作 查看详情

机器学习神器scikit-learn保姆级入门教程(代码片段)

Scikit-learn保姆级入门教程Scikit-learn是一个非常知名的Python机器学习库,它广泛地用于统计分析和机器学习建模等数据科学领域。建模无敌:用户通过scikit-learn能够实现各种监督和非监督学习的模型功能多样:同时使用... 查看详情

软件测试让0基础纯小白也能上手写python,保姆级教程(代码片段)

上一篇文章【软件测试】让0基础纯小白也能上手写Python,保姆级教程(三)分享了Python基础知识本次继续分享其它内容。目录一、列表二、列表元素新增三、列表元素修改四、查询列表元素五、列表的其他操作六、列表排序一... 查看详情