机器学习多输入多输出模型中的SHAP解释应用

机器学习大模型数据库

picture.image

✨ 欢迎关注 ✨

本节介绍:利用SHAP分析机器学习中多输入多输出的模型解释,作者根据个人对机器学习的理解进行代码实现与图表输出,仅供参考。 完整 数据和代码将在稍后上传至交流群,成员可在交流群中获取下载。需要的朋友可关注公众文末提供的获取方式。 获取 前请咨询,避免不必要的问题。文末点赞、推荐参与免费书籍包邮赠送!

✨ 流程信息 ✨

多输入多输出(MIMO)回归模型的SHAP模型解释,目的是揭示模型预测的透明度和特征对每个目标变量的贡献。并通过MultiOutputRegressor将其扩展为能够同时处理多个目标变量的模型。为进一步解释模型的预测结果,使用SHAP方法,通过扰动输入特征并计算其对每个预测输出的影响,进而揭示各个特征对预测结果的贡献。通过计算SHAP值,理解每个输入特征是如何影响每个目标变量的预测值的

✨ 代码实现 ✨

  
import pandas as pd  
import numpy as np  
import matplotlib.pyplot as plt  
plt.rcParams['font.family'] = 'Times New Roman'  
plt.rcParams['axes.unicode_minus'] = False  
import warnings  
# 忽略所有警告  
warnings.filterwarnings("ignore")  
  
path = r"2025-8-6公众号Python机器学习AI.xlsx"  
df = pd.read_excel(path)  
from sklearn.model_selection import train_test_split  
  
# 划分特征和目标变量  
X = df.drop(['infC', 'SR'], axis=1)  # 特征   
y = df[['infC', 'SR']]  # 目标变量  
  
# 划分训练集和测试集,测试集占 20%  
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=42)  
from sklearn.ensemble import RandomForestRegressor  
from sklearn.multioutput import MultiOutputRegressor  
  
# 初始化基础随机森林模型(使用默认参数)  
base_model = RandomForestRegressor(random_state=42)  
  
# 使用多输出回归器包装基础模型  
multi_output_model = MultiOutputRegressor(base_model)  
  
# 在训练集上进行模型训练  
multi_output_model.fit(X_train, y_train)  
# 获取训练后的模型  
model = multi_output_model

使用随机森林回归和多输出回归器对一个包含两个目标变量 (infC 和 SR) 的数据集进行训练,训练过程没有进行超参数调优,直接使用默认的模型参数

  
# 打印每个目标变量的最佳模型参数  
for idx, estimator in enumerate(model.estimators_):  
    print(f"Best parameters for target variable {idx + 1}:")  
    print(estimator.get_params())

打印MultiOutputRegressor模型中每个目标变量(infC 和 SR)对应的回归模型的参数,由于没有进行超参数调优,两个模型的参数是默认相同的,表示每个目标变量实际上使用了独立的回归模型,且每个模型的训练过程互不影响,也就是并没有考虑因变量之间是否存在关系是独立的

  
Best parameters for target variable 1:  
{'bootstrap': True, 'ccp_alpha': 0.0, 'criterion': 'squared_error', 'max_depth': None, 'max_features': 1.0, 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'monotonic_cst': None, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 42, 'verbose': 0, 'warm_start': False}  
Best parameters for target variable 2:  
{'bootstrap': True, 'ccp_alpha': 0.0, 'criterion': 'squared_error', 'max_depth': None, 'max_features': 1.0, 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'monotonic_cst': None, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 42, 'verbose': 0, 'warm_start': False}
  
# 在训练集上进行预测  
y_train_pred = model.predict(X_train)  
  
# 在测试集上进行预测  
y_test_pred = model.predict(X_test)  
y_train_pred

使用训练好的 多输出回归模型 对训练集和测试集进行预测,并将预测结果分别存储在y_train_pred和y_test_pred中

  
array([[ 89.4565    ,  44.5152    ],  
       [ 85.        ,  13.201     ],  
       [ 52.0009    ,  23.9791    ],  
       [ 89.9671    ,  47.111     ],  
       [ 75.1609    ,  14.3481    ],  
       [ 74.2828    ,  75.28868622],  
       [ 77.1785    ,  30.0456    ],

可以看多输出回归模型对训练集或测试集的预测值(一部分),在输出的二维数组中每一行对应一个样本的预测结果,包含两列,分别对应两个目标变量( infCSR )的预测值

  
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score  
  
# 计算 RMSE, MAE, R² 的函数  
def calculate_metrics(y_true, y_pred):  
    rmse = np.sqrt(mean_squared_error(y_true, y_pred))  # RMSE  
    mae = mean_absolute_error(y_true, y_pred)  # MAE  
    r2 = r2_score(y_true, y_pred)  # R²  
    return rmse, mae, r2  
  
# 分别计算每个特征在训练集和测试集上的评价指标  
metrics_train_infP = calculate_metrics(y_train['infC'], y_train_pred[:, 0])  
metrics_train_infC = calculate_metrics(y_train['SR'], y_train_pred[:, 1])  
  
metrics_test_infP = calculate_metrics(y_test['infC'], y_test_pred[:, 0])  
metrics_test_infC = calculate_metrics(y_test['SR'], y_test_pred[:, 1])  
  
# 输出结果  
print(f"Training set metrics for infP: RMSE = {metrics_train_infP[0]}, MAE = {metrics_train_infP[1]}, R² = {metrics_train_infP[2]}")  
print(f"Training set metrics for infC: RMSE = {metrics_train_infC[0]}, MAE = {metrics_train_infC[1]}, R² = {metrics_train_infC[2]}")  
print(f"Testing set metrics for infP: RMSE = {metrics_test_infP[0]}, MAE = {metrics_test_infP[1]}, R² = {metrics_test_infP[2]}")  
print(f"Testing set metrics for infC: RMSE = {metrics_test_infC[0]}, MAE = {metrics_test_infC[1]}, R² = {metrics_test_infC[2]}")

计算多输出回归模型在训练集和测试集上对两个目标变量(infC 和 SR)的RMSE、MAE和R²指标,评估模型的预测性能

  
Training set metrics for infP: RMSE = 0.9751438557874862, MAE = 0.21250052794595278, R² = 0.9921069132090798  
Training set metrics for infC: RMSE = 3.723525157685805, MAE = 2.5140021535563046, R² = 0.9829710562518787  
Testing set metrics for infP: RMSE = 3.700723271870265, MAE = 0.8122886790000095, R² = 0.8419963258068566  
Testing set metrics for infC: RMSE = 9.230161475852592, MAE = 6.625612851387387, R² = 0.8968735895456763

接下来就可以进行SHAP值计算,尽管基础模型是随机森林,但是由于它被集成到MultiOutputRegressor中,所以不是直接使用shap.TreeExplainer来计算SHAP值

  
shap\_values.shape
  
(111, 12, 2)

计算完SHAP值后打印SHAP值矩阵的形状,结果 (111, 12, 2) 表示有111个样本,12个特征,以及2个目标变量(每个目标变量对应一组SHAP值),因此每个目标变量都有一个对应的SHAP值矩阵

  
# 绘制SHAP值总结图(Summary Plot)  
plt.figure(figsize=(10, 5), dpi=120)  
shap.summary_plot(shap_values[:,:,0], X_test, plot_type="bar", show=False)  
plt.title('infC')  
plt.savefig("summary_plot_1.pdf", format='pdf',bbox_inches='tight')  
plt.tight_layout()  
plt.show()  
plt.figure(figsize=(10, 5), dpi=120)  
shap.summary_plot(shap_values[:, :, 0], X_test, show=False)  
plt.title('infC')  
plt.savefig("summary_plot_3.pdf", format='pdf',bbox_inches='tight')  
plt.tight_layout()  
plt.show()

picture.image

绘制infC目标变量的SHAP值总结图,分别以条形图和默认的点图形式展示特征对预测的影响

  
plt.figure(figsize=(10, 5), dpi=120)  
shap.summary_plot(shap_values[:,:,1], X_test, plot_type="bar", show=False)  
plt.title('SR')  
plt.savefig("summary_plot_2.pdf", format='pdf',bbox_inches='tight')  
plt.tight_layout()  
plt.show()  
plt.figure(figsize=(10, 5), dpi=120)  
shap.summary_plot(shap_values[:, :, 1], X_test, show=False)  
plt.title('SR')  
plt.savefig("summary_plot_4.pdf", format='pdf',bbox_inches='tight')  
plt.tight_layout()  
plt.show()

picture.image

绘制SR目标变量的SHAP值总结图,分别以条形图和默认的点图形式展示特征对预测的影响

接下来,可以对模型进行 超参数调优为每个目标变量单独选择不同的超参数进行训练,以提高模型的性能。每个目标变量将使用不同的超参数配置来构建独立的回归模型,从而优化每个目标的预测效果

  
# 打印每个目标变量的最佳模型参数  
for idx, model in enumerate(multi_output_model.models_):  # 使用 multi_output_model.models_ 获取训练后的模型  
    print(f"Best parameters for target variable {idx + 1}:")  
    print(model.get_params())  # 打印每个模型的参数

multi_output_model是 经过超参数调优后的模型其中每个目标变量都有属于本身的最佳模型参数。通过multi_output_model.models_获取训练后的每个独立回归模型,并使用get_params()方法打印每个模型的调优参数。这里的multi_output_model是在调参后得到的模型,每个目标变量(infC 和 SR)都有不同的超参数配置

  
Best parameters for target variable 1:  
{'bootstrap': True, 'ccp_alpha': 0.0, 'criterion': 'squared_error', 'max_depth': 20, 'max_features': 1.0, 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'monotonic_cst': None, 'n_estimators': 50, 'n_jobs': None, 'oob_score': False, 'random_state': 42, 'verbose': 0, 'warm_start': False}  
Best parameters for target variable 2:  
{'bootstrap': True, 'ccp_alpha': 0.0, 'criterion': 'squared_error', 'max_depth': 20, 'max_features': 1.0, 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 2, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'monotonic_cst': None, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 42, 'verbose': 0, 'warm_start': False}

可以看到,每个目标变量的回归模型使用了不同的超参数配置,例如n_estimators和min_samples_leaf不同,对于每个目标变量,模型参数是独立调优的,并且根据每个目标变量的特性选择了最佳的超参数

最后,SHAP模型解释方法与之前相同,值得强调的是,这里采用的多输入多输出方法并不考虑因变量(infC 和 SR)之间的相互关系,每个目标变量的回归模型是独立构建的,只是因为自变量相同,模型被集成在一起,在预测时返回各自的预测结果。相比之下,RegressorChain等方法允许模型之间存在相互依赖,能够捕获目标变量之间的相关性,因此在某些情况下可以更好地建模目标变量间的相互影响

当然,公众号中还有更多机器学习期刊实战技巧,您可以通过历史文章进行检索和阅读,关注公众号,点击“发信息”>“历史文章”即可搜索公众号所有文章信息

picture.image

✨ 该文章案例 ✨

picture.image

在上传至交流群的文件中,像往期文章一样,将对案例进行逐步分析,确保读者能够达到最佳的学习效果。内容都经过详细解读,帮助读者深入理解模型的实现过程和数据分析步骤,从而最大化学习成果。

同时,结合提供的免费AI聚合网站进行学习,能够让读者在理论与实践之间实现融会贯通,更加全面地掌握核心概念。

✨ 介绍 ✨

本节介绍到此结束,有需要学习数据分析和Python机器学习相关的朋友欢迎到淘宝店铺:Python机器学习AI,下方提供淘宝店铺二维码获取作者的公众号合集。截至目前为止,合集已包含近300多篇文章,购买合集的同时,还将提供免费稳定的AI大模型使用。

更新的内容包含数据、代码、注释和参考资料。 作者仅分享案例项目,不提供额外的答疑服务。项目中将提供详细的代码注释和丰富的解读,帮助您理解每个步骤 。 获取 前请咨询,避免不必要的问题。

✨ 群友反馈 ✨

picture.image

✨ 淘宝店铺 ✨

picture.image

请大家打开淘宝扫描上方的二维码,进入店铺,获取更多Python机器学习和AI相关的内容 ,希望能为您的学习之路提供帮助!

✨ 免费赠书 ✨

picture.image

picture.image

支持知识分享,畅享学习乐趣!特别感谢清华大学出版社 对本次赠书活动的鼎力支持!即日起,只需点赞、推荐、转发 此文章,作者将从后台随机抽取一位幸运儿,免费包邮赠送清华出版社提供的《Python数据分析师成长之路》这本精彩书籍📚!

💡 赶快参与,一键三连,说不定你就是那位幸运读者哦!

往期推荐

期刊复现:连续数据与分类数据共存的SHAP可视化散点图与箱形图组合形式

期刊复现:多分类任务如何拆分为二分类任务并进行堆叠预测提高模型预测性能

期刊配图:SHAP模型解释多种特征重要性柱状图可视化解析

期刊配图:SHAP值分析模型可解释性在柱状图与蜂窝图中的进阶组合展示

期刊配图:通过堆叠Mean|SHAP|展示不同区间对模型贡献度的可视化分析

期刊复现:利用UMAP降维算法可视化深度学习随着训练次数的增加模型区分能力的变化

期刊配图:PCA、t-SNE与UMAP三种降维方法简化高维数据的展示应用对比

Science期刊复现:分类、回归与Shap分析多角度揭示同一数据集变量对目标的影响

多模型SHAP+PDP解读Stacking集成模型:从基学习器到元学习器的可解释性与模型调参实现

picture.image

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

欢迎关注、点赞、转发~

个人观点,仅供参考

0
0
0
0
关于作者

文章

0

获赞

0

收藏

0

相关资源
大规模高性能计算集群优化实践
随着机器学习的发展,数据量和训练模型都有越来越大的趋势,这对基础设施有了更高的要求,包括硬件、网络架构等。本次分享主要介绍火山引擎支撑大规模高性能计算集群的架构和优化实践。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论