Python | Stacking回归和SHAP可解释性分析回归预测及可视化算法

简介: 本教程基于Python实现Stacking回归与SHAP可解释性分析,涵盖地球科学、医学、工程等多领域回归预测应用。结合CatBoost、LightGBM、XGBoost等模型,采用贝叶斯、随机与网格搜索优化参数,并通过SHAP值可视化特征贡献,提升模型性能与可解释性,适用于科研与实际项目。

立个flag,这是未来一段时间打算做的Python教程,敬请关注。

1 数据及应用领域

我的程序中给出数据data.xlsx(代码及数据见文末),10 列特征值,1 个目标值,适用于各行各业回归预测算法的需求,其中出图及数据自动保存在当前目录,设置的训练集与预测集的比例为 80%:20%。

一、地球科学与环境科学

  • 遥感反演:利用多源遥感数据预测水体深度、土壤湿度、植被指数、叶面积指数等。
  • 气象与气候研究:预测降水量、气温、风速、风向等连续气象变量。
  • 水文与水资源管理:河流流量、地下水位、径流量预测。
  • 环境污染监测:空气质量指数、PM2.5/PM10浓度、重金属污染水平预测。
  • 地质与矿业:预测矿区地表沉降、地裂缝发展趋势,或矿产储量评估。

二、生物学与医学

  • 生态学:预测物种分布密度、群落生物量或生态环境因子变化。
  • 公共卫生:基于环境、生活方式或基因组数据预测疾病风险或血液生化指标。
  • 医学影像分析:预测器官或病灶体积、组织属性、功能指标。

三、工程与物理科学

  • 材料科学:预测材料性能,如强度、硬度、导热性、弹性模量
  • 土木与结构工程:预测建筑物或桥梁的应力、位移、寿命周期。
  • 控制系统与信号处理:连续控制变量预测、信号功率或系统状态预测。

四、经济与社会科学

  • 经济预测:股价、GDP、通货膨胀率、消费指数预测。
  • 市场分析:销售额、客户需求、产品价格预测。
  • 社会行为:人口增长、流动性、社会指标预测。

五、数据科学与机器学习方向

  • 时间序列预测:股票价格、气象指标、传感器数据。
  • 多变量因果建模:分析各特征对连续目标变量的影响。
  • 特征重要性解释:结合SHAP、LIME等方法揭示变量贡献。

2 算法理论基础

在复杂的机器学习任务中,没有任何单一模型能够在所有场景下表现完美。树模型擅长处理非线性,线性模型解释性强,神经网络能捕捉复杂结构——但它们都有长处与短板。

Stacking 回归(Stacking Regressor)提供了一种更聪明的组合方式:

让多个不同模型分工合作,再由一个“元学习器”整合它们的结果,构建更强大的最终模型。

它是一种比简单加权或平均更灵活、更智能的集成方法。

🌟 一、Stacking 回归是什么?

Stacking(堆叠集成)是一种通过“多模型组合 + 元学习器”构建更强预测模型的方式。

结构上分两层:

  • 第一层:多个基学习器(Base Models)
    它们各自学习数据的不同部分或结构,例如树模型、线性模型、神经网络等。
  • 第二层:元学习器(Meta Model)
    它通过学习基学习器的输出,决定如何最优地组合这些结果。

这是一种“模型再学习模型”的思想。

🌟 二、Stacking 的核心逻辑:组合胜于单一模型

Stacking 的优势来源于一个重要理念:

不同模型在不同方面各有所长,把它们组合起来能互补缺点、提升整体性能。

例如:

  • CatBoost 适合处理类别特征与复杂结构
  • LightGBM 训练速度快、泛化性强
  • XGBoost 精准稳健、分裂策略细致

让它们共同作为第一层模型,能从多个角度“看”数据。

🌟 三、第二层的元学习器如何工作?

元学习器的任务是:

  • 根据各基模型的预测,学习最佳组合方式
  • 判断哪些模型在某类样本上更可靠
  • 在不同情况下自动调整权重
  • 输出性能更优的最终预测值

它相当于一个“模型指挥官”,负责整合所有基模型的智慧。

在你的示例代码中,元学习器使用的是 XGBRegressor,非常适合捕捉基学习器之间的非线性组合关系。

🌟 四、Stacking 的优势:灵活、稳健、性能高

Stacking 之所以受欢迎,是因为它具备:

  • 强大的集成学习能力
    可以显著提升模型性能
  • 结构灵活
    可自由组合不同算法
  • 表现稳健
    不依赖某一个模型的单点表现
  • 泛化能力强
    在复杂数据集上往往优于单模型
  • 适用于回归与分类任务

它是 Kaggle 比赛选手和工程项目常用的高性能组合策略之一。

🌟 五、适用场景

Stacking 回归常用在:

  • 单模型效果不够、需要提升性能
  • 想结合不同模型的优势
  • 非线性关系强、结构复杂的数据集
  • 中大型数据建模任务
  • 作为最终模型的高性能选择

无论应用在哪类任务中,Stacking 都是一种兼具灵活性和表现力的集成方式。

3 SHAP理论基础

🌟 一、SHAP 是什么?一句话概括

SHAP 是一套用“合作博弈论”思维解释模型的方法,用来回答:每个特征到底对预测结果贡献了多少?

如果你想知道:

  • 哪些特征最重要?
  • 每个特征是“推高”还是“压低”预测?
  • 不同样本吸收特征影响的方向是否一致?
  • 模型是怎么得出这个数的?

那 SHAP 就是最好的答案。

🧠 二、为什么要 SHAP?传统特征重要性有什么问题?

很多人都用过 XGBoost、Random Forest 的 “特征重要性”,但这些方法有明显缺陷:

❌ 1. 只能告诉你“重要”,不能告诉你“怎么重要”

例如: 某参数重要,但它是推高风速,还是降低风速?不知道。

❌ 2. 不能解释“单一样本”

模型给某一个点预测为 3.2 m/s,到底是由 NDVI 推上去的?还是由降水拉下来的?也不知道。

❌ 3. 依赖模型结构,不通用

不同模型指标不同,难对齐。

SHAP 完美解决了这些痛点。

🎲 三、SHAP 的核心思想:特征是“一起干活的队友”

想象一个团队比赛:

  • 每个队员(特征)都可能对团队成绩有贡献
  • 但是不同的队伍组合,贡献可能不一样
  • 那一个队员的“真实贡献”该怎么算?

SHAP 的思想就是:

让特征像“队员”一样参加所有组合队伍,再统计每个特征平均能让模型表现提高多少。

这就得到每个特征的贡献值(Shapley value)。它是一个“公平分配功劳”的方案。

🧩 四、SHAP 优秀的地方在哪里?

✔ 1. 公平性强

SHAP 的分配方式满足一系列“公平原则”:

  • 谁都没贡献 → 得分为 0
  • 特征越能独立提升模型效果 → 得分越大
  • 同样作用的特征贡献相同

这是其他方法做不到的。

✔ 2. 能画非常直观的可视化

本程序SHAP带的图包括:

这些图都是发论文神器。

论文价值:可解释性直接提升一档

SCI 论文里 reviewer 最爱问:

  • “模型的物理解释是什么?”
  • “为什么这个特征如此重要?”
  • “模型是不是只是黑盒?”

你用 SHAP,一张 beeswarm plot 就能回答所有问题。

✔ 3. 模型无关、模型无偏见

无论你是:

  • XGBoost
  • CatBoost
  • LightGBM
  • Random Forest
  • Gradient Boosting
  • NGBoost
  • 决策树

SHAP 都能解释。

4 其他图示

🎲 一、特征值相关性热图

特征值相关性热图用于展示各特征之间的相关强弱,通过颜色深浅体现正负相关关系,帮助快速识别冗余特征、强相关特征及可能影响模型稳定性的变量,为后续特征选择和建模提供参考。

🎲 二、散点密度图

散点密度图通过颜色或亮度反映点的聚集程度,用于展示大量样本的分布特征。相比普通散点图,它能更直观地呈现高密度区域、异常点及整体趋势,常用于回归分析与模型评估。以下为训练集和测试集出图效果。

🎲 三、贝叶斯搜索参数优化算法及示意图

🌟 1. 先构建一个“参数-效果”的概率模型

贝叶斯优化会根据每一次调参的表现,持续更新一份“这个参数组合大概率能获得更好效果”的认知。

这份认知由一个代理模型承担,通常是高斯过程或树结构模型。它不像网格搜索那样盲目,而是先学、再试

🌟 2. 通过“探索”与“利用”平衡选点

贝叶斯优化每次选新的参数时都会权衡:

  • 探索:去试试没探索过的区域,可能藏着宝贝
  • 利用:去当前最可能效果最好的区域,稳扎稳打 这种带策略的试验方式,让调参过程既高效又不容易错过最优解。

🌟 3. 不断用真实结果修正判断

每试一个参数组合,代理模型就会重新更新“信念”,并重新预测哪些区域值得继续尝试。

调参越往后,模型越“聪明”,搜索路径越精确。这就像一个不断学习经验的调参工程师,越调越准。

🌟 4. 收敛快,适用于高成本模型

因为每一次试验都很有价值,贝叶斯优化通常只需几十次实验就能找到非常优秀的超参数组合。

这对训练成本高的模型(XGBoost、LightGBM、CatBoost、深度学习)尤其友好。

🌟 5. 程序能画非常直观的可视化

这幅图展示了超参数之间的相互作用及其对模型性能的影响,包括单参数敏感性曲线与双参数组合的响应面,可用于分析最优参数区域与模型对不同超参数的敏感程度。

该图展示贝叶斯优化过程中各超参数的重要性,对模型误差影响最大的为 n_estimators 和 learning_rate,其次为 max_depth,而 subsample 与 reg_lambda 贡献较小,用于判断调参优先级。

🎲 四、随机搜索参数优化算法及示意图

🌟 1、随机搜索是什么?

一句话概括:

随机搜索就是在超参数空间里不断“抽样试验”,从而找到表现最好的参数组合。

不同于按顺序走格子的调参方式,随机搜索会在整个参数空间中“自由跳跃”,每次从可能区域里随机挑选出一个参数组合,用最直接的方式评估模型的表现。

🌟 2、它的核心思路其实很聪明

虽然名字叫“随机”,但它背后的逻辑却非常高效。

✔ 1. 更广的覆盖范围

每次抽取的点都可能落在搜索空间的不同区域,让模型在有限的预算里探索更多潜在好参数。

✔ 2. 支持多种采样策略

你可以让 learning_rate 以对数分布抽取、让 n_estimators 偏向更大值,这让随机搜索能更贴近真实优化需求。

✔ 3. 每一次试验都独立有效

不依赖复杂的历史记录,适用于快速尝试、快速验证的场景。

换句话说:  它简单,但“简单得很有效”。

🌟 3、为什么它在实际调参中被广泛使用?

在许多模型中,超参数空间往往非常大,比如:

  • XGBoost 的树深、学习率、子采样比例
  • 神经网络的学习率、层数、节点数
  • CatBoost、LightGBM 的几十种可调参数

随机搜索能在这些复杂空间里迅速落点——  不需要把所有组合都跑一遍,也不需要构建额外的代理模型,只需要不断抽样并测试结果。尤其在遥感反演、深度学习任务中,这种轻量但高覆盖的方式,往往能快速找到一个令人满意的初步最优解。

🌟 4、它适合什么场景?

简单总结几个典型应用:

  • 模型初调:快速找到可行参数范围
  • 大搜索空间:超参数众多、组合巨大时
  • 训练成本高:希望用少量试验找到较好解
  • 模型表现敏感:需要探索更大范围避免局部最优

这也是为什么随机搜索常被当作调参的起步策略,先探索,再进一步细化。

🌟 5. 程序能画非常直观的可视化

该图为超参数的成对散点矩阵图,展示不同超参数之间的分布特征与潜在关系,对角线上为各参数的概率密度分布,可用于分析参数空间结构与抽样多样性。

该图展示超参数与模型误差的相关性重要性排名,不同柱状高度反映各参数对 RMSE 的影响强弱,其中 reg_alpha、max_depth 和 learning_rate 贡献最高,有助于确定调参重点方向。

🎲 五、网格搜索参数优化算法及示意图

🌟 1、网格搜索是什么?

一句话概括:

网格搜索就是把所有设定好的超参数组合排成一个“网格”,逐个尝试,通过评估结果找到表现最佳的那一组参数。

就像在一个二维或多维坐标空间里,把所有候选参数都排列出来,然后把每个点都跑一遍,最终选出模型表现最优的位置。

🌟 2、它的核心原则:全面、稳定、逐点验证

网格搜索的理念非常直观:

  • 先定义每个参数可能的取值范围
  • 再把这些取值组合成一个完整网格
  • 然后对每个组合进行模型训练与验证
  • 最后选择最优结果对应的参数

这是一种系统化、无遗漏的搜索方式。它不会遗漏,也不会偏向,它用最直接的方式告诉你:  哪个参数组合最适合你的模型。

🌟 3、为什么网格搜索常被用作调参基础流程?

网格搜索的价值主要体现在几个方面:

✔ 1. 结构清晰、可控性强

你可以完全决定参数候选集,调参过程完全透明。

✔ 2. 适用于小范围、精细化的参数探索

特别适合探索学习率、树深、正则项等关键参数的小步长变化。

✔ 3. 方便结合交叉验证

与 Cross-Validation 结合后,能够获得稳定、可靠的参数评估结果。

✔ 4. 结果可复现、可追踪

每个组合都被尝试过,调参过程完整记录,适合科研工作。

🌟 4、典型应用场景

网格搜索广泛应用于:

  • XGBoost / LightGBM / CatBoost 的关键参数精调
  • SVM、随机森林、岭回归等模型的标准调参
  • 小规模搜索空间的系统验证
  • 科研论文中要求严谨、可复现的实验设计

在你的任务里,网格搜索非常适合用于关键参数的局部精调,确保模型在最佳点附近充分探索。

🌟 5. 程序能画非常直观的可视化

该图展示 GridSearchCV 调参过程中各超参数与 RMSE 的相关性重要性,其中 learning_rate、reg_alpha 和 n_estimators 影响最明显,可用于识别关键参数并指导后续调参方向。

5 代码包含具体内容一览

并将训练集和测试集的精度评估指标保存到 metrics. Mat 矩阵中。共两行,第一行代表训练集的,第二行代表测试集的;共 7 个精度评估指标,分别代表 R, R2, ME, MAE, MAPE, RMSE 以及样本数量。

保存的regression_result.mat数据中分别保存了名字为Y_train、y_pred_train、y_test、y_pred_test的矩阵向量。

同样的针对大家各自的数据训练出的模型结构也保存在model.json中,方便再一次调用。

调用的程序我在程序中注释了,如下

# 加载模型
# model.load_model("model.json")

主程序如下,其中从1-10,每一步都有详细的注释,要获取完整程序,请转下文代码获取


# =========================================================
# 主程序
# =========================================================
def main():
   print("=== 1. 读取数据 ===")
   data = pd.read_excel("data.xlsx")
   X = data.iloc[:, :10].values
   y = data.iloc[:, 10].values
   feature_names = list(data.columns[:10])

   print("=== 2. 划分训练与测试 ===")
   X_train, X_test, y_train, y_test = train_test_split(
       X, y, test_size=0.2, random_state=42
   )

   print("=== 3. 归一化 ===")
   scaler_X = MinMaxScaler()
   scaler_y = MinMaxScaler()

   X_train_norm = scaler_X.fit_transform(X_train)
   X_test_norm = scaler_X.transform(X_test)
   y_train_norm = scaler_y.fit_transform(y_train.reshape(-1, 1)).ravel()

   print("=== 4. 模型训练 ===")
   model = train_model(X_train_norm, y_train_norm)

   print("=== 5. 预测(反归一化到原始尺度) ===")
   y_pred_train_norm = model.predict(X_train_norm)
   y_pred_test_norm = model.predict(X_test_norm)

   y_pred_train = scaler_y.inverse_transform(
       y_pred_train_norm.reshape(-1, 1)
   ).ravel()
   y_pred_test = scaler_y.inverse_transform(
       y_pred_test_norm.reshape(-1, 1)
   ).ravel()

   print("=== 6. 模型评估 ===")
   metrics_train = evaluate_model(y_train, y_pred_train)
   metrics_test = evaluate_model(y_test, y_pred_test)

   print("\n训练集评估指标:")
   for k, v in metrics_train.items():
       print(f"  {k}: {v:.4f}" if isinstance(v, float) else f"  {k}: {v}")

   print("\n测试集评估指标:")
   for k, v in metrics_test.items():
       print(f"  {k}: {v:.4f}" if isinstance(v, float) else f"  {k}: {v}")

   print("=== 7. 保存结果到 MAT 文件 ===")
   result_dict = {
       "y_train": y_train.astype(float),
       "y_pred_train": y_pred_train.astype(float),
       "y_test": y_test.astype(float),
       "y_pred_test": y_pred_test.astype(float),
   }
   savemat("regression_result.mat", result_dict)
   print("已保存 regression_result.mat")

   # 按指标顺序排列
   metrics_matrix = np.array([
       [metrics_train['R'],     metrics_test['R']],
       [metrics_train['R2'],    metrics_test['R2']],
       [metrics_train['ME'],    metrics_test['ME']],
       [metrics_train['MAE'],   metrics_test['MAE']],
       [metrics_train['MAPE'],  metrics_test['MAPE']],
       [metrics_train['RMSE'],  metrics_test['RMSE']],
       [metrics_train['样本数'], metrics_test['样本数']]
   ], dtype=float)
   savemat("metrics.mat", {"metrics": metrics_matrix})
   print("已保存 metrics.mat(矩阵大小 7×2)")

   print("=== 8. SHAP 分析 ===")
   X_combined = np.vstack([X_train_norm, X_test_norm])
   X_df = pd.DataFrame(X_combined, columns=feature_names)
   # shap_results = shap_analysis(model, X_combined, feature_names)
   plot_shap_dependence(model, X_combined, feature_names, X_df)

   print("=== 9. 密度散点图 ===")
   plot_density_scatter(
       y_test, y_pred_test, save_path="scatter_density_test.png"
   )
   plot_density_scatter(
       y_train, y_pred_train, save_path="scatter_density_train.png"
   )

   print("=== 10. 相关性热图 ===")
   correlation_heatmap(data, feature_names)

   print("=== 完成!===")

if __name__ == "__main__":
   main()

6 代码获取

Python | Stacking回归和SHAP可解释性分析回归预测及可视化算法

https://mbd.pub/o/bread/YZWalJlpaQ==

Python | 贝叶斯搜索参数优化Stacking回归和SHAP可解释性分析回归预测及可视化算法

https://mbd.pub/o/bread/YZWalJlpaw==

Python | 随机搜索参数优化Stacking回归和SHAP可解释性分析回归预测及可视化算法

https://mbd.pub/o/bread/YZWalJlpbA==

Python | 网格搜索参数优化Stacking回归和SHAP可解释性分析回归预测及可视化算法

https://mbd.pub/o/bread/YZWalJlpbQ==

新手小白/python 初学者请先根据如下链接教程配置环境,只需要根据我的教程即可,不需要安装 Python 及 pycharm 等软件。如有其他问题可加微信沟通。

Anaconda 安装教程(保姆级超详解)【附安装包+环境玩转指南】

https://mp.weixin.qq.com/s/uRI31yf-NjZTPY5rTXz4eA

目录
相关文章
|
3月前
|
机器学习/深度学习 数据可视化 算法
Python | 网格搜索参数优化的XGBoost+SHAP可解释性分析回归预测及可视化算法
本教程将推出Python实现的XGBoost回归预测,结合网格搜索调参与SHAP可解释性分析,涵盖数据处理、模型训练、可视化及结果保存,助力科研论文提升模型可解释性,附完整代码与保姆级环境配置指南。
464 1
|
27天前
|
存储 缓存 调度
阿里云Tair KVCache仿真分析:高精度的计算和缓存模拟设计与实现
在大模型推理迈向“智能体时代”的今天,KVCache 已从性能优化手段升级为系统级基础设施,“显存内缓存”模式在长上下文、多轮交互等场景下难以为继,而“以存代算”的多级 KVCache 架构虽突破了容量瓶颈,却引入了一个由模型结构、硬件平台、推理引擎与缓存策略等因素交织而成的高维配置空间。如何在满足 SLO(如延迟、吞吐等服务等级目标)的前提下,找到“时延–吞吐–成本”的最优平衡点,成为规模化部署的核心挑战。
449 38
阿里云Tair KVCache仿真分析:高精度的计算和缓存模拟设计与实现
|
27天前
|
存储 编解码 安全
阿里云服务器8核16G、8核32G、8核64G最新实例收费标准与活动价格参考
阿里云服务器8核16G、8核32G、8核64G属于较高的配置,是中大型企业用户在选择配置时选择较多的,在阿里云目前的活动中,第9代云服务器有这几个配置可选,其中计算型c9i实例8核16G配置5958.52元1年起,通用型g9i实例8核32G配置7551.94元1年起,内存型r9i实例8核64G配置9937.12元1年起领取阿里云优惠券之后可获满减优惠。本文将详细介绍阿里云这几款配置不同实例规格的收费标准与当下的活动价格,以供参考选择。
218 17
|
18天前
|
人工智能 缓存 物联网
从0到1:大模型算力配置不需要人,保姆级选卡与显存计算手册
本文深入解析大模型算力三阶段:训练、微调与推理,类比为“教育成长”过程,详解各阶段技术原理与GPU选型策略,涵盖显存计算、主流加速技术(如LoRA/QLoRA)、性能评估方法及未来趋势,助力开发者高效构建AI模型。
229 2
|
21天前
|
SQL 人工智能 自然语言处理
企业落地 AI 数据分析,如何做好敏感数据安全防护?
在 AI 问数时代,数据安全与使用效率并非零和博弈。
|
22天前
|
存储 数据采集 弹性计算
面向多租户云的 IO 智能诊断:从异常发现到分钟级定位
当 iowait 暴涨、IO 延迟飙升时,你是否还在手忙脚乱翻日志?阿里云 IO 一键诊断基于动态阈值模型与智能采集机制,实现异常秒级感知、现场自动抓取、根因结构化输出,让每一次 IO 波动都有据可查,真正实现从“被动响应”到“主动洞察”的跃迁。
246 56
|
10天前
|
人工智能 自然语言处理 物联网
Qwen-Image 从推理到 LoRA 训练实战教程(AMD GPU × DiffSynth-Studio)
本课程由魔搭社区出品,详解如何在AMD GPU上基于DiffSynth-Studio框架高效部署、微调与训练Qwen-Image系列大模型(860亿参数)。涵盖文生图推理、LoRA画质增强、多语言提示理解、高一致性人像外延及多图融合编辑,并支持从零训练专属LoRA(如定制狗狗生成)。
328 27
|
20天前
|
数据采集 人工智能 自然语言处理
寻找 AI 全能王——阿里云 Data+AI 工程师全球大奖赛正式开启
在AI迈向专业决策的关键节点,阿里云联合NVIDIA发起“寻找AI全能王”全球大奖赛,聚焦高质量数据构建与智能体开发两大挑战。赛事设高校与企业双赛道,覆盖万亿语料去重与DeepSearch智能体构建,提供工业级实战平台、专家指导与丰厚奖励,推动Data+AI融合创新,助力开发者实现“所想即所得”的技术突破。
|
10天前
|
算法 搜索推荐 Serverless
为什么 ES 的搜索结果只到 10,000?强制“数清楚”的代价有多大
Elasticsearch 7.x后默认返回10,000总数,实为Block-Max WAND算法的性能优化——跳过低分文档块以提升查询速度。强行开启`track_total_hits:true`将禁用该优化,导致CPU飙升、延迟激增。本文深入Lucene底层,解析其原理、陷阱与治理方案。
233 1