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

picture.image

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}')
      

picture.image

采用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)
      

picture.image

使用最佳模型对测试集进行预测,计算评估指标,包括均方误差(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")
      

picture.image

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

shap依赖图


        
            

          shap.dependence\_plot('MedInc', shap\_values, X\_test, interaction\_index='AveOccup')
        
      

picture.image

shap力图


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

picture.image

shap交互作用摘要图


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

picture.image

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)
      

picture.image

部分依赖图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()
      

picture.image

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()
      

picture.image

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()
      

picture.image

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

往期推荐

K-means聚类与t-SNE降维:多维数据的二维可视化

小白轻松上手:一键生成SHAP解释图的GUI应用,支持多种梯度提升模型选择

梯度提升集成:LightGBM与XGBoost组合预测

特征工程进阶:暴力特征字典的构建与应用 实现模型精度质的飞跃

无网络限制!同步官网所有功能!让编程小白也能轻松上手进行代码编写!!!

picture.image

picture.image

picture.image

微信号|deep_ML

欢迎添加作者微信进入Python、ChatGPT群

进群请备注Python或AI进入相关群
无需科学上网、同步官网所有功能、使用无限制

如果你对类似于这样的文章感兴趣。

欢迎关注、点赞、转发~

个人观点,仅供参考

0
0
0
0
评论
未登录
暂无评论