所有文章 > AI驱动 > 基于CatBoost回归预测模型的多种可解释性图表绘制

基于CatBoost回归预测模型的多种可解释性图表绘制

CatBoost是基于决策树的梯度提升算法,它通过组合多个弱学习器(通常是决策树)来提升模型的预测能力,并具有处理分类特征和减少过拟合的优势,在分类和回归任务中提供高效且易于解释的模型,接下来通过利用CatBoost回归模型,结合先进的解释性分析工具,如SHAP和部分依赖图(PDP),对数据集进行预测和分析,通过对模型的训练和解释,期望能够揭示影响因变量的主要因素,并提供可解释的预测结果,帮助读者理解如何解释机器学习

代码实现

数据加载与分割

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
df = pd.read_excel('california.xlsx')

from sklearn.model_selection import train_test_split, KFold

X = df.drop(['price'],axis=1)
y = df['price']

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

使用pandas读取Excel文件,加载数据集,将数据集中的特征和目标变量分开,特征为X,目标为y,使用train_test_split将数据集分为训练集和测试集,比例为80%训练集和20%测试集

模型训练与交叉验证

from sklearn.metrics import root_mean_squared_error
from catboost import CatBoostRegressor

# CatBoost模型参数
params_cat = {
'learning_rate': 0.02, # 学习率,控制每一步的步长,用于防止过拟合。典型值范围:0.01 - 0.1
'iterations': 1000, # 弱学习器(决策树)的数量
'depth': 6, # 决策树的深度,控制模型复杂度
'eval_metric': 'RMSE', # 评估指标,这里使用均方根误差(Root Mean Squared Error,简称RMSE)
'random_seed': 42, # 随机种子,用于重现模型的结果
'verbose': 500 # 控制CatBoost输出信息的详细程度,每100次迭代输出一次
}

# 准备k折交叉验证
kf = KFold(n_splits=5, shuffle=True, random_state=42)
scores = []
best_score = np.inf
best_model = None

# 交叉验证
for fold, (train_index, val_index) in enumerate(kf.split(X_train, y_train)):
X_train_fold, X_val_fold = X_train.iloc[train_index], X_train.iloc[val_index]
y_train_fold, y_val_fold = y_train.iloc[train_index], y_train.iloc[val_index]

model = CatBoostRegressor(**params_cat)
model.fit(X_train_fold, y_train_fold, eval_set=(X_val_fold, y_val_fold), early_stopping_rounds=100)

# 预测并计算得分
y_val_pred = model.predict(X_val_fold)
score = root_mean_squared_error(y_val_fold, y_val_pred) # RMSE

scores.append(score)
print(f'第 {fold + 1} 折 RMSE: {score}')

# 保存得分最好的模型
if score < best_score:
best_score = score
best_model = model

print(f'最佳 RMSE: {best_score}')

采用KFold进行5折交叉验证,确保模型的稳定性和泛化能力,使用CatBoost回归模型训练数据。CatBoost是一种基于决策树的梯度提升算法,适用于处理分类和回归任务,设置了一些模型参数,如学习率、迭代次数、决策树深度等,通过交叉验证,计算每一折的均方根误差(RMSE),选取表现最好的模型作为最终模型

模型评估

from sklearn import metrics
# 预测
y_pred_four = best_model.predict(X_test)

y_pred_list = y_pred_four.tolist()
mse = metrics.mean_squared_error(y_test, y_pred_list)
rmse = np.sqrt(mse)
mae = metrics.mean_absolute_error(y_test, y_pred_list)
r2 = metrics.r2_score(y_test, y_pred_list)

print("均方误差 (MSE):", mse)
print("均方根误差 (RMSE):", rmse)
print("平均绝对误差 (MAE):", mae)
print("拟合优度 (R-squared):", r2)

使用最佳模型对测试集进行预测,计算评估指标,包括均方误差(MSE)、均方根误差(RMSE)、平均绝对误差(MAE)和拟合优度(R-squared)

模型解释

shap解释摘要图

import shap
# 构建 shap解释器
explainer = shap.TreeExplainer(best_model)
# 计算测试集的shap值
shap_values = explainer.shap_values(X_test)
# 特征标签
labels = X_test.columns
plt.rcParams['font.family'] = 'serif'
plt.rcParams['font.serif'] = 'Times new Roman'
plt.rcParams['font.size'] = 13
plt.figure()
shap.summary_plot(shap_values, X_test, feature_names=labels, plot_type="dot")

shap部分如何解释参考往期文章SHAP全解析:机器学习、深度学习模型解释保姆级教程

shap依赖图

shap.dependence_plot('MedInc', shap_values, X_test, interaction_index='AveOccup')

shap力图

# 绘制单个样本的SHAP解释(Force Plot)
sample_index = 7 # 选择一个样本索引进行解释
shap.force_plot(explainer.expected_value, shap_values[sample_index], X_test.iloc[sample_index], matplotlib=True)

shap交互作用摘要图

shap_interaction_values = explainer.shap_interaction_values(X_test)
shap.summary_plot(shap_interaction_values, X_test)

shap热图

# 创建 shap.Explanation 对象
shap_explanation = shap.Explanation(values=shap_values[0:500,:],
base_values=explainer.expected_value,
data=X_test.iloc[0:500,:], feature_names=X_test.columns)
# 绘制热图
shap.plots.heatmap(shap_explanation)

部分依赖图PDP

from sklearn.inspection import PartialDependenceDisplay
features = ['MedInc'] # 替换为你要绘制的特征
# best_model,为训练模型 X_test为测试集 kind为average代表绘制PDP
PartialDependenceDisplay.from_estimator(best_model, X_test, features, kind='average')
plt.grid(True, linestyle='--', alpha=0.7)
plt.title('average')
plt.show()

PDP(部分依赖图)、ICE(个体条件期望)如何解释参考往期文章PDP(部分依赖图)、ICE(个体条件期望)解释机器学习模型保姆级教程

个体条件期望ICE

features = ['MedInc'] 
PartialDependenceDisplay.from_estimator(best_model, X_test, features, kind='individual')
plt.grid(True, linestyle='--', alpha=0.7)
plt.title('individual')
plt.show()

2D PDP

# 选择两个特征绘制2D PDP
features = ['MedInc', 'AveOccup']

# 使用 contour_kw 参数绘制2D PDP
fig, ax = plt.subplots(figsize=(10, 6))
PartialDependenceDisplay.from_estimator(
best_model,
X_test,
features=[features],
kind='average',
grid_resolution=50,
contour_kw={'cmap': 'viridis', 'alpha': 0.8},
ax=ax
)
plt.suptitle('2D Partial Dependence Plot for MedInc and AveOccup')
plt.show()

这里的所有模型解释可视化都是针对测试集进行的或者测试集上的某个特征、某个样本,通过这些步骤来帮助训练和评估模型的性能,为模型提供可解释性,使得能够理解模型如何利用输入特征来进行预测,从而提高模型的透明度和信任度

本文章转载微信公众号@Python机器学习AI