首页 > 编程语言 >XGBoost模型构建+SHAP解析-Python代码——用XGBoost模型实现机器学习并进行黑箱过程解析

XGBoost模型构建+SHAP解析-Python代码——用XGBoost模型实现机器学习并进行黑箱过程解析

时间:2024-07-18 20:30:08浏览次数:15  
标签:plt pred 模型 XGBoost score test import 解析

一、XGBoost模型简介

1.1适用范围

XGBoost(Extreme Gradient Boosting)是一个基于梯度提升(Gradient Boosting)框架的增强算法,广泛应用于分类、回归、排序等任务。常见的应用包括:

  • 信用风险评估
  • 销售预测
  • 病毒检测
  • 图像识别

1.2原理

XGBoost是梯度提升树(Gradient Boosted Decision Trees, GBDT)的改进版本。GBDT通过构建多个弱学习器(通常是决策树),每个新的树都在前一个树的基础上进行改进,从而形成一个强大的预测模型。XGBoost进一步在GBDT的基础上进行了优化,包括加速训练、支持正则化、自动处理缺失值等。

其基本步骤为:

  1. 初始化模型,通常是通过预测所有样本的平均值。
  2. 计算当前模型的残差,即真实值与预测值之间的差异。
  3. 基于残差训练一个新的弱学习器,并将其加入到模型中。
  4. 重复步骤2和3,直到达到预定的树数量或误差下降到一定程度。

1.3优点

  1. 高效性:XGBoost采用了多种优化技术,使得训练速度快,计算资源利用高效。
  2. 准确性:通过加权投票和正则化技术,显著提高了模型的预测准确性和泛化能力。
  3. 灵活性:支持多种目标函数和评估指标,适用于分类、回归等任务。
  4. 自动处理缺失值:在训练过程中自动处理缺失值,无需额外处理。
  5. 特征重要性分析:提供了特征重要性分析的功能,帮助理解模型的决策过程。

1.4缺点

  1. 参数调优复杂:XGBoost有较多的超参数,调参过程可能比较复杂,需要较多经验。
  2. 容易过拟合:在小数据集上容易过拟合,需要适当的正则化。
  3. 计算资源需求高:对计算资源的需求较高,训练大规模数据时可能需要分布式计算。

二、XGBoost模型的Python实现

以下是一个完整的XGBoost模型的Python代码示例,包含数据加载、预处理、模型训练和评估的详细注释。

2.1安装XGBoost

首先,需要安装XGBoost库:

pip install xgboost

2.2代码示例

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix, roc_auc_score, roc_curve
import xgboost as xgb
import matplotlib.pyplot as plt
import seaborn as sns

# 生成示例数据
from sklearn.datasets import make_classification

# 生成二分类数据集
X, y = make_classification(n_samples=1000, n_features=20, n_classes=2, random_state=42)

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

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

# 设置XGBoost参数
params = {
    'objective': 'binary:logistic',
    'max_depth': 5,
    'eta': 0.1,
    'subsample': 0.8,
    'colsample_bytree': 0.8,
    'eval_metric': 'logloss'
}

# 训练XGBoost模型
num_rounds = 10
bst = xgb.train(params, dtrain, num_rounds)

# 进行预测
y_pred_proba = bst.predict(dtest)
y_pred = (y_pred_proba > 0.5).astype(int)

# 评估模型
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)
roc_auc = roc_auc_score(y_test, y_pred_proba)
conf_matrix = confusion_matrix(y_test, y_pred)

print(f"Accuracy: {accuracy}")
print(f"Precision: {precision}")
print(f"Recall: {recall}")
print(f"F1 Score: {f1}")
print(f"ROC AUC Score: {roc_auc}")
print("Confusion Matrix:")
print(conf_matrix)

# 绘制混淆矩阵图
plt.figure(figsize=(8, 6))
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues', xticklabels=['Predicted 0', 'Predicted 1'], yticklabels=['Actual 0', 'Actual 1'])
plt.title('Confusion Matrix')
plt.xlabel('Predicted')
plt.ylabel('Actual')
plt.show()

# 绘制ROC曲线
fpr, tpr, _ = roc_curve(y_test, y_pred_proba)
plt.figure(figsize=(8, 6))
plt.plot(fpr, tpr, color='darkorange', lw=2, label='ROC curve (area = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic')
plt.legend(loc="lower right")
plt.show()

# 特征重要性
xgb.plot_importance(bst)
plt.title('Feature Importance')
plt.show()

2.3代码说明

  1. 数据生成和分割

    • 使用 make_classification 生成一个二分类数据集,包含1000个样本和20个特征。
    • 使用 train_test_split 将数据集划分为训练集和测试集,测试集比例为30%。
  2. 转换数据格式

    • 将训练集和测试集转换为XGBoost的DMatrix格式。
  3. 设置参数

    • 设置XGBoost模型的参数,包括目标函数、树的最大深度、学习率、子样本比例、特征采样比例和评估指标。
  4. 训练模型

    • 使用 xgb.train 训练XGBoost模型,指定训练集、参数和轮数。
  5. 预测和评估

    • 对测试集进行预测,计算预测概率和预测结果。
    • 评估模型的准确率、精确率、召回率、F1得分和ROC AUC得分,输出混淆矩阵。
    • 绘制混淆矩阵图和ROC曲线图。
  6. 特征重要性

    • 使用 xgb.plot_importance 绘制特征重要性图,帮助理解哪些特征对模型的预测结果影响最大。

三、用XGBoost模型实现机器学习案例

下面是一个完整的可运行XGBoost案例,包括数据生成、模型训练、预测及评估的过程。我们将使用scikit-learn的模拟数据,并展示运行结果。

3.1案例主要代码

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix, roc_auc_score, roc_curve
import xgboost as xgb
import matplotlib.pyplot as plt
import seaborn as sns

# 生成示例数据
from sklearn.datasets import make_classification

# 生成二分类数据集
X, y = make_classification(n_samples=1000, n_features=20, n_classes=2, random_state=42)

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

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

# 设置XGBoost参数
params = {
    'objective': 'binary:logistic',
    'max_depth': 5,
    'eta': 0.1,
    'subsample': 0.8,
    'colsample_bytree': 0.8,
    'eval_metric': 'logloss'
}

# 训练XGBoost模型,迭代次数减少到10次
num_rounds = 10
bst = xgb.train(params, dtrain, num_rounds)

# 进行预测
y_pred_proba = bst.predict(dtest)
y_pred = (y_pred_proba > 0.5).astype(int)

# 评估模型
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)
roc_auc = roc_auc_score(y_test, y_pred_proba)
conf_matrix = confusion_matrix(y_test, y_pred)

# 打印评估结果
evaluation_results = {
    "Accuracy": accuracy,
    "Precision": precision,
    "Recall": recall,
    "F1 Score": f1,
    "ROC AUC Score": roc_auc,
    "Confusion Matrix": conf_matrix
}

# 绘制混淆矩阵图
plt.figure(figsize=(8, 6))
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues', xticklabels=['Predicted 0', 'Predicted 1'], yticklabels=['Actual 0', 'Actual 1'])
plt.title('Confusion Matrix')
plt.xlabel('Predicted')
plt.ylabel('Actual')
plt.show()

# 绘制ROC曲线
fpr, tpr, _ = roc_curve(y_test, y_pred_proba)
plt.figure(figsize=(8, 6))
plt.plot(fpr, tpr, color='darkorange', lw=2, label='ROC curve (area = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic')
plt.legend(loc="lower right")
plt.show()

# 特征重要性
xgb.plot_importance(bst)
plt.title('Feature Importance')
plt.show()

evaluation_results

3.2模型评价 

1.模型准确性评价

Result
{'Accuracy': 0.8666666666666667,
 'Precision': 0.896551724137931,
 'Recall': 0.8387096774193549,
 'F1 Score': 0.8666666666666666,
 'ROC AUC Score': 0.9342602892102336,
 'Confusion Matrix': array([[130,  15],
        [ 25, 130]])}

以下是XGBoost模型的评估结果:

  • Accuracy(准确率): 0.867
  • Precision(精确率): 0.897
  • Recall(召回率): 0.839
  • F1 Score: 0.867
  • ROC AUC Score: 0.934
  • Confusion Matrix(混淆矩阵):
[[130  15]
 [ 25 130]]

2.混淆矩阵图绘制详细代码

# 绘制混淆矩阵图
plt.figure(figsize=(8, 6))
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues', xticklabels=['Predicted 0', 'Predicted 1'], yticklabels=['Actual 0', 'Actual 1'])
plt.title('Confusion Matrix')
plt.xlabel('Predicted')
plt.ylabel('Actual')
plt.show()

3.ROC曲线图详细代码

# 绘制ROC曲线
fpr, tpr, _ = roc_curve(y_test, y_pred_proba)
plt.figure(figsize=(8, 6))
plt.plot(fpr, tpr, color='darkorange', lw=2, label='ROC curve (area = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic')
plt.legend(loc="lower right")
plt.show()

4.特征重要性详细代码

# 特征重要性
xgb.plot_importance(bst)
plt.title('Feature Importance')
plt.show()

四、使用SHAP进行变量间关系解析

为了进行SHAP解析,首先需要安装SHAP库,然后可以对训练好的XGBoost模型进行解释。以下是详细的步骤和代码:

4.1安装SHAP

如果尚未安装SHAP库,可以使用以下命令进行安装:

pip install shap

4.2使用SHAP进行解析

以下是详细的Python代码示例,展示如何使用SHAP对XGBoost模型进行解析:

4.2.1导入必要的库
import shap
import xgboost as xgb
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.datasets import make_classification
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix, roc_auc_score, roc_curve
import matplotlib.pyplot as plt
import seaborn as sns
4.2.2生成示例数据
# 生成示例数据
X, y = make_classification(n_samples=1000, n_features=20, n_classes=2, random_state=42)
4.2.3进行数据预处理
# 将数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 转换为XGBoost的DMatrix格式
dtrain = xgb.DMatrix(X_train, label=y_train)
dtest = xgb.DMatrix(X_test, label=y_test)
4.2.4构建XGBoost模型
# 设置XGBoost参数
params = {
    'objective': 'binary:logistic',
    'max_depth': 5,
    'eta': 0.1,
    'subsample': 0.8,
    'colsample_bytree': 0.8,
    'eval_metric': 'logloss'
}

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

# 进行预测
y_pred_proba = bst.predict(dtest)
y_pred = (y_pred_proba > 0.5).astype(int)

# 评估模型
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)
roc_auc = roc_auc_score(y_test, y_pred_proba)
conf_matrix = confusion_matrix(y_test, y_pred)

# 打印评估结果
evaluation_results = {
    "Accuracy": accuracy,
    "Precision": precision,
    "Recall": recall,
    "F1 Score": f1,
    "ROC AUC Score": roc_auc,
    "Confusion Matrix": conf_matrix
}
4.2.5绘制混淆矩阵、ROC曲线、特征重要性图
# 绘制混淆矩阵图
plt.figure(figsize=(8, 6))
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues', xticklabels=['Predicted 0', 'Predicted 1'], yticklabels=['Actual 0', 'Actual 1'])
plt.title('Confusion Matrix')
plt.xlabel('Predicted')
plt.ylabel('Actual')
plt.show()
# 绘制ROC曲线
fpr, tpr, _ = roc_curve(y_test, y_pred_proba)
plt.figure(figsize=(8, 6))
plt.plot(fpr, tpr, color='darkorange', lw=2, label='ROC curve (area = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic')
plt.legend(loc="lower right")
plt.show()
# 特征重要性
xgb.plot_importance(bst)
plt.title('Feature Importance')
plt.show()
4.2.6 SHAP解析
# SHAP解析
explainer = shap.TreeExplainer(bst)
shap_values = explainer.shap_values(X_test)
(1) 绘制SHAP值摘要图
# 绘制SHAP值摘要图
shap.summary_plot(shap_values, X_test)

SHAP值摘要图输出结果如下:

(2)绘制SHAP值力图
# 绘制SHAP值力图(以第一个样本为例)
shap.initjs()
shap.force_plot(explainer.expected_value, shap_values[0,:], X_test[0,:])

SHAP值力图输出结果如下:

(3)进行双因素交互分析——绘制特征交互作用图
# 计算交互值
shap_interaction_values = explainer.shap_interaction_values(X_test)
# 绘制特征交互作用图(以第一个特征和第二个特征为例)
shap.dependence_plot((0, 1), shap_interaction_values, X_test)

特征交互作用图输出结果如下:

# 绘制特征交互作用力图(以第一个样本为例)
shap.force_plot(explainer.expected_value, shap_interaction_values[0], X_test[0])

特征交互作用力图(以第一个样本为例)输出结果如下:

4.2.7SHAP解析代码说明
  1. 计算交互值

    • 使用 explainer.shap_interaction_values 计算交互值。
  2. 绘制特征交互作用图

    • 使用 shap.dependence_plot 绘制两个特征之间的交互作用图。你可以替换 (0, 1) 为任何两个特征的索引来查看不同特征之间的交互作用。
  3. 绘制交互作用力图

    • 使用 shap.force_plot 绘制单个样本的交互作用力图。你可以替换 [0] 为任何一个样本的索引来查看不同样本的交互作用。

通过这些图表,可以更直观地理解两个特征之间的相互作用对模型预测的影响。

标签:plt,pred,模型,XGBoost,score,test,import,解析
From: https://blog.csdn.net/qq_41698317/article/details/140460642

相关文章

  • 决策树模型构建+调参Python代码——用决策树模型实现机器学习
    一、决策树模型简介1.1适用范围决策树模型(DecisionTree)可以用于分类和回归任务,广泛应用于以下领域:客户细分信用风险评估医疗诊断营销策略优化1.2原理决策树是一种树形结构的预测模型,通过一系列的特征测试(即节点的分裂)将数据集逐步划分,从而形成一个树状的决策路径。每个节......
  • GESP编程能力等级认证C++编程真题解析 | 2024年3月五级
    学习C++从娃娃抓起!记录下CCF-GESP备考学习过程中的题目,记录每一个瞬间。附上汇总贴:GESP编程能力等级认证C++编程真题解析|汇总单选题第1题唯一分解定理描述的内容是()?A.任意整数都可以分解为素数的乘积B.每个合数都可以唯一分解为一系列素数的乘积C.两个不同的......
  • 深入探索Java:揭秘流式解析JSON的神秘面纱
    哈喽,大家好,我是木头左!前言在当今数据驱动的时代,处理JSON数据已成为日常开发中不可或缺的一部分。对于Java开发者来说,能够高效、灵活地解析JSON数据是至关重要的技能。本篇文章将带你深入了解如何使用Java进行JSON解析,特别是通过JsonReader进行流式解析,以及如何优雅地处理嵌套......
  • 大型语言模型的 MOE 和 MOA
    AI生成   欢迎来到雲闪世界。大型语言模型(LLM)无疑席卷了科技行业。它们的迅速崛起得益于来自维基百科、网页、书籍、大量研究论文以及我们喜爱的社交媒体平台的用户内容的大量数据。数据和计算密集型模型一直在狂热地整合来自音频和视频......
  • Datawhale AI 夏令营——CPU部署大模型(LLM天池挑战赛)——Task2与3学习笔记
        Task2的任务是组队+寻找灵感,这里不作阐述;Task3的任务是实现RAG应用,阅读文档并观看卢哥的直播后,结合个人经验做个分享。    运行大语言模型,对LLM使用的加深,我们发现,在使用过程中,大模型会有很多幻觉出现。为了解决幻觉,科研人员提出了各种各样的方案......
  • 【大模型私有化部署:手把手教你部署并使用清华智谱GLM大模型】
    部署一个自己的大模型,没事的时候玩两下,这可能是很多技术同学想做但又迟迟没下手的事情,没下手的原因很可能是成本太高,近万元的RTX3090显卡,想想都肉疼,又或者官方的部署说明过于简单,安装的时候总是遇到各种奇奇怪怪的问题,难以解决。本文就来分享下我的安装部署经验,包括本地和租......
  • 【6!使用本地大模型调用代码,根本就是一场骗局!】
    通过大模型调用其他工具到底可不可行?ChatGPT或许能轻松搞定一切,但同样的需求落在本地大模型上,恐怕就要打个问号了。法国开发工程师EmilienLancelot尝试了多款号称具备工具调用功能的agent框架,来看看本地大模型到底能不能完成任务,但结果就像他总结的“一无所获”。是......
  • 模型训练中出现loss为NaN怎么办?
    文章目录一、模型训练中出现loss为NaN原因1.学习率过高2.梯度消失或爆炸3.数据不平衡或异常4.模型不稳定5.过拟合二、针对梯度消失或爆炸的解决方案1.使用`torch.autograd.detect_anomaly()`2.使用torchviz可视化计算图3.检查梯度的数值范围4.调整梯度剪裁......
  • AI Earth——基于决策树模型淮河流域冬小麦提取应用app
    应用介绍:本应用依据利用Landsat-8数据,基于潘力、夏浩铭、王瑞萌等研究论文(基于GoogleEarthEngine的淮河流域越冬作物种植面积制图)中提出的利用作物在不同物候期内卫星影像的光谱存在差异的特征,通过计算作物时间序列的皈依化植被指数(NDVI),选取越冬作物生长旺盛期NDVI最大......
  • LLM大模型新手训练指南
    基础用于语言建模的最常见架构是Transformer架构,由Vaswani等人在著名论文《AttentionIsAllYouNeed》中提出。我们不会在这里讨论该架构的具体细节,因为我们必须讨论导致并促成其创建的所有旧技术。Transformer使我们能够训练具有惊人推理能力的大型语言模型(LLM......