基于熵权法与TOPSIS融合的回归模型:SHAP权重赋能下的子模型与融合模型解释

机器学习大数据算法

picture.image

✨ 欢迎关注 ✨

本节介绍: 基于熵权法与TOPSIS融合的回归模型SHAP权重赋能下的子模型与融合模型解释 ,作者根据个人对机器学习的理解进行代码实现与图表输出,仅供参考。 完整 数据和代码将在稍后上传至交流群,成员可在交流群中获取下载。需要的朋友可关注公众文末提供的获取方式。 获取 前请咨询,避免不必要的问题

✨ 信息 ✨

前一章已完成模型构建且模型训练就绪——回归模型:基于熵权法与TOPSIS的多子模型DT、RF、XGB、LGBM、SVM等训练与权重赋值优化融合,本章不再涉及模型训练环节,将进行模型解释,这里假设无法对融合模型直接做SHAP值计算(其实是可以的参考文章——整体SHAP解释:TOPSIS优化与多模型融合的扩展),于是可以先对各子模型算其SHAP值,再结合模型权重对这些SHAP值加权融合,得到融合模型的SHAP值,接下来在代码实现上进行讲解,判断进行 加权融合的SHAP值,与各个子模型的SHAP值是否存在较大差异

✨ 基础代码 ✨

  
import pandas as pd  
import numpy as np  
import matplotlib.pyplot as plt   
import warnings  
warnings.filterwarnings("ignore")  
  
plt.rcParams['font.family'] = 'Times New Roman'  
plt.rcParams['axes.unicode_minus'] = False  
df = pd.read_excel('2025-8-15公众号Python机器学习AI.xlsx')  
from sklearn.model_selection import train_test_split  
  
# 划分特征和目标变量  
X = df.drop(['Y'], axis=1)    
y = df['Y']  # 目标变量  
  
# 划分训练集和测试集,测试集占 20%  
X_temp, X_test, y_temp, y_test = train_test_split(X, y, test_size=0.2, random_state=42)  
  
# 然后将训练集进一步划分为训练集和验证集  
X_train, X_val, y_train, y_val = train_test_split(X_temp, y_temp, test_size=0.125, random_state=42)    
from sklearn.preprocessing import StandardScaler  
  
# 初始化标准化器  
scaler = StandardScaler()  
  
# 在训练集上拟合,并转换训练集  
X_train_scaled = scaler.fit_transform(X_train)  
  
# 用训练集拟合得到的scaler来转换验证集和测试集  
X_val_scaled = scaler.transform(X_val)  
X_test_scaled = scaler.transform(X_test)

读取数据、划分训练集、验证集和测试集(比例为 7:1:2)并对特征进行标准化处理,其中通过设置相同的random_state=42保证数据集划分的随机性可控且与前文模型训练时的划分结果一致,确保各部分数据集保持不变

  
import joblib  
  
# 加载模型  
best_dt_model = joblib.load('DecisionTree.pkl')  
best_rf_model = joblib.load('RandomForest.pkl')  
best_xgb_model = joblib.load('XGBoost.pkl')  
best_lgbm_model = joblib.load('LightGBM.pkl')  
best_svm_model = joblib.load('SVM.pkl')  
best_model_ann = joblib.load('ANN.pkl')  
best_gbdt_reg = joblib.load('GradientBoosting.pkl')  
  
# 读取保存的集成模型  
ensemble_model = joblib.load('ensemble_model.pkl')

通过joblib.load () 函数读取之前训练并保存好的决策树、随机森林、XGBoost 等多个子模型,以及集成模型,为后续的模型解释做准备

  
# 打印模型的权重信息  
print("模型权重:", ensemble_model.get_model_weights())

返回集成模型中各子模型的权重信息

  
模型权重: {'DT': 0.01224706792563413, 'RF': 0.1810891218908141, 'XGB': 0.2345968061001126, 'LGBM': 0.256657723491482, 'SVM': 0.04272858790149892, 'GBDT': 0.21594994456118274, 'ANN': 0.05673074812927554}

结果显示了决策树 (DT)、随机森林 (RF) 等 7 个子模型在集成模型中的权重占比,其中 LightGBM (LGBM) 权重最高 (约 25.67%),决策树 (DT) 权重最低 (约 1.22%),这些权重反映了各子模型在集成预测中的贡献程度,作为后面SHAP加权融合的模型权重

  
import shap  
# 对每个树模型应用 SHAP 的 TreeExplainer,并使用标准化后的数据  
explainer_dt = shap.TreeExplainer(best_dt_model)  
shap_values_dt = explainer_dt.shap_values(X_test_scaled)  
explainer_rf = shap.TreeExplainer(best_rf_model)  
shap_values_rf = explainer_rf.shap_values(X_test_scaled)  
explainer_xgb = shap.TreeExplainer(best_xgb_model)  
shap_values_xgb = explainer_xgb.shap_values(X_test_scaled)  
explainer_lgbm = shap.TreeExplainer(best_lgbm_model)  
shap_values_lgbm = explainer_lgbm.shap_values(X_test_scaled)  
explainer_gbdt = shap.TreeExplainer(best_gbdt_reg)  
shap_values_gbdt = explainer_gbdt.shap_values(X_test_scaled)  
# 对 非树模型使用 KernelExplainer,使用标准化后的数据  
explainer_svm = shap.KernelExplainer(best_svm_model.predict, X_test_scaled)  
shap_values_svm = explainer_svm.shap_values(X_test_scaled)  
explainer_ann = shap.KernelExplainer(best_model_ann.predict, X_test_scaled)  
shap_values_ann = explainer_ann.shap_values(X_test_scaled)

为各个子模型计算SHAP值以解释模型预测,其中树模型(DT、RF等)使用TreeExplainer,非树模型(SVM、ANN)使用KernelExplainer;两者差异在于TreeExplainer专为树结构模型设计,计算高效,而KernelExplainer适用于各类模型但计算速度较慢,一些加快运用技巧可以参考往期文章——利用K-medoids算法为SHAP解释器提供数据背景加快SHAP计算速度

  
# 打印 SHAP 值的维度  
print("SHAP values for Decision Tree:", shap_values_dt.shape)  
print("SHAP values for Random Forest:", shap_values_rf.shape)  
print("SHAP values for XGBoost:", shap_values_xgb.shape)  
print("SHAP values for LightGBM:", shap_values_lgbm.shape)  
print("SHAP values for Gradient Boosting:", shap_values_gbdt.shape)  
print("SHAP values for SVM:", shap_values_svm.shape)  
print("SHAP values for ANN:", shap_values_ann.shape)

返回各模型SHAP值的维度,结果显示所有模型的SHAP值均为 (400,8),对于回归模型,各模型SHAP值维度一致(400 个样本、8 个特征),因为直接针对预测值,并不涉及概率这些问题,可直接按集成模型权重加权融合;而二分类模型因不同模型SHAP值涉及不同类别维度,融合会更复杂

  
SHAP values for Decision Tree: (400, 8)  
SHAP values for Random Forest: (400, 8)  
SHAP values for XGBoost: (400, 8)  
SHAP values for LightGBM: (400, 8)  
SHAP values for Gradient Boosting: (400, 8)  
SHAP values for SVM: (400, 8)  
SHAP values for ANN: (400, 8)
  
# 权重字典  
weights = {  
    'DT': 0.01224706792563413,  
    'RF': 0.1810891218908141,  
    'XGB': 0.2345968061001126,  
    'LGBM': 0.256657723491482,  
    'SVM': 0.04272858790149892,  
    'GBDT': 0.21594994456118274,  
    'ANN': 0.05673074812927554  
}  
# 将各个模型的 SHAP 值存入一个字典  
shap_values_dict = {  
    'DT': shap_values_dt,  # 这里要替换为实际的 SHAP 值  
    'RF': shap_values_rf,  
    'XGB': shap_values_xgb,  
    'LGBM': shap_values_lgbm,  
    'SVM': shap_values_svm,  
    'GBDT': shap_values_gbdt,  
    'ANN': shap_values_ann  
}  
# 计算加权后的 SHAP 值  
weighted_shap_values = np.zeros_like(shap_values_dt)  # 初始化加权后的 SHAP 值,假设 DT 模型的 SHAP 值为基础  
# 对每个模型的 SHAP 值进行加权  
for model_name, shap_values in shap_values_dict.items():  
    weight = weights[model_name]  
    weighted_shap_values += shap_values * weight

根据各模型在集成模型中的权重,将不同模型的SHAP值进行加权求和,得到加权后的综合SHAP值,实现对集成模型预测结果的特征重要性解释,当然由于本身并不是直接对融合模型进行SHAP值计算,而是根据模型权重融合,所以接下来看看各个子模型的SHAP贡献度和融合模型的加权SHAP差异如何

picture.image

这里可视化不同模型特征重要性,从图中看,融合模型(Weighted)和子模型SHAP有一定差异,部分特征在融合模型中的平均绝对SHAP值排序、数值与子模型不同,体现融合后综合各子模型权重,特征重要性计算方式改变,不过也有共性(如 X_1 普遍重要),差异程度因特征和子模型组合而异,反映融合模型对特征重要性的重新整合,但是整体而言与子模型的排名差异并不大,很值得参考,这种如果不能直接获取融合模型的SHAP值,而是通过加权融合子模型SHAP值的方法

  
plt.figure()  
shap.summary_plot(weighted_shap_values, X_test, feature_names=X_test.columns, plot_type="dot", show=False)  
plt.savefig("summary_plot——B.pdf", format='pdf',bbox_inches='tight', dpi=1200)  
plt.show()

picture.image

用shap.summary_plot基于加权融合模型的SHAP值(weighted_shap_values)和测试集特征数据(X_test),绘制点图类型的特征影响summary可视化,用于直观呈现各特征对模型预测结果的影响规律

picture.image

最后为每个特征绘制原始值与对应SHAP值的散点图(含 y=0 参考线),也就是常见的SHAP依赖图,展示特征值变化时对模型输出影响的分布情况(如X_1原始值在区间-2到0其SHAP值为负表示会降低预测值,降低程度和SHAP绝对值有关,绝对值越大降低程度越大,当X_1原始值为0时,SHAP值为0表示不影响预测值为阈值,从X_1原始值0到6开始提高预测值,这个区间以内原始值越大提高程度也越大 ),辅助理解特征与模型预测的关联

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

picture.image

✨ 该文章案例 ✨

picture.image

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

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

✨ 介绍 ✨

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

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

✨ 群友反馈 ✨

picture.image

✨ 淘宝店铺 ✨

picture.image

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

往期推荐

整体SHAP解释:TOPSIS优化与多模型融合的扩展

顶刊复现:通过TOPSIS赋权优化多模型融合的SHAP解释提升模型透明性

顶刊复现:基于TOPSIS赋权的多模型融合方法及其优化应用提升模型预测性能

digital medicine复现:缺失值过滤、方差过滤、缺失值插补、相关系数与逐步特征选择

期刊复现:XGBoost模型采用Early Stopping策略提高模型的泛化能力减少过拟合

期刊复现:基于Pearson相关分析与SHAP评估特征重要性优化特征减少冗余

期刊复现:基于贝叶斯优化的XGBoost模型与SHAP解释特征阈值的非线性分析

期刊复现:使用SHAP解释深度学习卷积神经网络(CNN)在多分类任务中的决策过程

一区IF6.2期刊复现①:LightGBM特征重要性及部分依赖分析进行模型解读

一区IF6.2期刊复现②:最优模型LightGBM组图SHAP揭示关键特征影响力机制

一区IF6.2期刊复现③:最优模型LightGBM基于网络的糖尿病风险预测计算器Web部署

picture.image

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

欢迎关注、点赞、转发~

个人观点,仅供参考

0
0
0
0
关于作者

文章

0

获赞

0

收藏

0

相关资源
火山引擎大规模机器学习平台架构设计与应用实践
围绕数据加速、模型分布式训练框架建设、大规模异构集群调度、模型开发过程标准化等AI工程化实践,全面分享如何以开发者的极致体验为核心,进行机器学习平台的设计与实现。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论