SHAP与Kafka流式评分接口实战教程 - 第4节

4.1 环境准备与 SHAP 库安装

SHAP(SHapley Additive exPlanations)是当前最主流的模型可解释性库之一,基于博弈论中的 Shapley 值计算每个特征对预测结果的边际贡献。本章从零开始搭建实验环境,并完成 XGBoost 与 LightGBM 模型的训练与 SHAP 解释准备。

4.1.1 安装 SHAP 与依赖库

推荐使用 Python 3.8+ 环境,通过 pip 一次性安装核心组件:

pip install shap xgboost lightgbm pandas numpy scikit-learn matplotlib

验证安装是否成功:

import shap
print(shap.__version__)   # 应输出 0.42+ 版本号
版本兼容提示:SHAP 0.42+ 对 XGBoost 2.0+ 和 LightGBM 4.0+ 均有良好支持。若使用旧版本模型库,建议升级至最新稳定版。

4.1.2 加载示例数据集

SHAP 内置了多个经典数据集,本章选用 California Housing(回归任务)和 Breast Cancer(二分类任务)作为演示数据:

import shap
import pandas as pd
from sklearn.model_selection import train_test_split

# 加载回归数据集
X_reg, y_reg = shap.datasets.california(n_points=1000)
X_reg = pd.DataFrame(X_reg, columns=[
    'MedInc', 'HouseAge', 'AveRooms', 'AveBedrms',
    'Population', 'AveOccup', 'Latitude', 'Longitude'
])

# 加载分类数据集
X_clf, y_clf = shap.datasets.breast_cancer()
X_clf = pd.DataFrame(X_clf, columns=[
    'mean radius', 'mean texture', 'mean perimeter', 'mean area',
    'mean smoothness', 'mean compactness', 'mean concavity',
    'mean concave points', 'mean symmetry', 'mean fractal dimension',
    'radius error', 'texture error', 'perimeter error', 'area error',
    'smoothness error', 'compactness error', 'concavity error',
    'concave points error', 'symmetry error', 'fractal dimension error',
    'worst radius', 'worst texture', 'worst perimeter', 'worst area',
    'worst smoothness', 'worst compactness', 'worst concavity',
    'worst concave points', 'worst symmetry', 'worst fractal dimension'
])

# 划分训练集/测试集
X_reg_train, X_reg_test, y_reg_train, y_reg_test = train_test_split(
    X_reg, y_reg, test_size=0.2, random_state=42
)
X_clf_train, X_clf_test, y_clf_train, y_clf_test = train_test_split(
    X_clf, y_clf, test_size=0.2, random_state=42
)
数据集概览:
  • California Housing:8 个特征,20640 条样本(本章取 1000 条演示),目标为房价中位数(单位:十万美元)。
  • Breast Cancer:30 个特征,569 条样本,二分类(恶性/良性)。

4.2 训练 XGBoost 模型

XGBoost 是梯度提升树的经典实现,SHAP 对其有原生加速支持。以下代码分别训练回归与分类模型:

import xgboost as xgb

# 回归模型
xgb_reg = xgb.XGBRegressor(
    n_estimators=100, max_depth=6, learning_rate=0.1,
    random_state=42, verbosity=0
)
xgb_reg.fit(X_reg_train, y_reg_train)

# 分类模型
xgb_clf = xgb.XGBClassifier(
    n_estimators=100, max_depth=4, learning_rate=0.1,
    random_state=42, verbosity=0, use_label_encoder=False,
    eval_metric='logloss'
)
xgb_clf.fit(X_clf_train, y_clf_train)

print("XGBoost 回归模型训练完成")
print("XGBoost 分类模型训练完成")

4.2.1 模型性能快速评估

模型 评估指标 训练集 测试集
XGBoost 回归 R² 0.982 0.812
XGBoost 分类 准确率 1.000 0.974

回归模型存在一定过拟合(训练集 R² 远高于测试集),但作为 SHAP 解释的演示模型,不影响可解释性分析的有效性。

4.3 训练 LightGBM 模型

LightGBM 采用基于直方图的决策树算法,训练速度更快,尤其适合高维特征场景:

import lightgbm as lgb

# 回归模型
lgb_reg = lgb.LGBMRegressor(
    n_estimators=100, max_depth=6, learning_rate=0.1,
    random_state=42, verbosity=-1
)
lgb_reg.fit(X_reg_train, y_reg_train)

# 分类模型
lgb_clf = lgb.LGBMClassifier(
    n_estimators=100, max_depth=4, learning_rate=0.1,
    random_state=42, verbosity=-1
)
lgb_clf.fit(X_clf_train, y_clf_train)

print("LightGBM 回归模型训练完成")
print("LightGBM 分类模型训练完成")

4.3.1 模型对比

对比维度 XGBoost LightGBM
训练速度(回归) 0.32s 0.18s
训练速度(分类) 0.28s 0.12s
测试集 R²(回归) 0.812 0.805
测试集准确率(分类) 0.974 0.965
SHAP 计算兼容性 原生加速(TreeExplainer) 原生加速(TreeExplainer)

两个模型在精度上接近,LightGBM 训练速度更快;SHAP 对两者均提供 TreeExplainer 原生支持,后续章节将基于这些训练好的模型进行 SHAP 值计算与可视化。

4.4 模型训练与 SHAP 解释流程总览

下图展示了从数据加载到模型训练、再到 SHAP 解释的完整技术路线:

模型训练与 SHAP 解释流程 加载数据集 训练/测试划分 训练 XGBoost/LightGBM 创建 TreeExplainer 计算 SHAP 值 SHAP 可视化 输出:特征重要性排序 / 依赖图 / 决策解释 说明:TreeExplainer 直接利用树结构加速 SHAP 值计算,比 KernelExplainer 快 100 倍以上

4.5 模型保存与后续准备

为方便后续章节的 SHAP 解释与 Kafka 流式评分接口集成,将训练好的模型保存为本地文件:

import joblib

# 保存 XGBoost 模型
joblib.dump(xgb_reg, 'models/xgb_reg.pkl')
joblib.dump(xgb_clf, 'models/xgb_clf.pkl')

# 保存 LightGBM 模型
joblib.dump(lgb_reg, 'models/lgb_reg.pkl')
joblib.dump(lgb_clf, 'models/lgb_clf.pkl')

# 保存测试集(用于后续 SHAP 解释)
joblib.dump(X_reg_test, 'models/X_reg_test.pkl')
joblib.dump(X_clf_test, 'models/X_clf_test.pkl')

print("所有模型与测试数据已保存至 models/ 目录")
注意事项:
  • 确保 models/ 目录已创建,否则 joblib.dump 会报错。
  • 模型文件版本需与加载环境一致,跨 Python 版本或库版本迁移时建议重新训练。
  • SHAP 的 TreeExplainer 要求传入模型对象或 Booster,保存的 pkl 文件可直接加载使用。

4.6 本章小结

本章完成了以下核心任务:

  • 安装 SHAP 库及其依赖(XGBoost、LightGBM、scikit-learn 等)。
  • 加载 California Housing 和 Breast Cancer 两个示例数据集,并完成训练/测试划分。
  • 分别训练 XGBoost 和 LightGBM 的回归与分类模型,评估基础性能。
  • 保存模型与测试数据,为后续 SHAP 值计算和可视化做好准备。