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

一、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] 为任何一个样本的索引来查看不同样本的交互作用。

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

  • 14
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值