楼主: candy-jia
141 0

[其他] Python | LGBM+SHAP可解释性分析回归预测及可视化算法 [推广有奖]

  • 0关注
  • 0粉丝

学前班

40%

还不是VIP/贵宾

-

威望
0
论坛币
10 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
20 点
帖子
1
精华
0
在线时间
0 小时
注册时间
2018-11-9
最后登录
2018-11-9

楼主
candy-jia 发表于 2025-11-27 14:59:25 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

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

1 数据与应用领域概述

本教程所使用的数据文件为data.xlsx,包含10个特征变量和1个目标变量,适用于多种行业中的回归预测任务。程序运行后,所有图表及处理后的数据将自动保存至当前目录,训练集与测试集的划分比例设定为80%:20%。

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

  • 时间序列预测:可用于股票价格走势、气象参数变化或传感器采集数据的趋势建模。
  • 多变量因果建模:分析多个输入特征对连续型输出变量的影响机制。
  • 特征重要性解释:结合SHAP、LIME等可解释性工具,揭示各变量在模型决策中的贡献程度。

四、经济与社会科学

  • 经济预测:包括GDP增长率、通货膨胀率、股价波动以及消费指数的建模与推演。
  • 市场分析:用于预测产品销量、客户行为趋势或市场价格变动。
  • 社会行为研究:如人口增长趋势、人口流动性变化及各类社会指标的动态模拟。

三、工程与物理科学

  • 材料科学:预测材料的关键性能指标,例如强度、硬度、导热系数和弹性模量。
  • 土木与结构工程:评估桥梁或建筑结构的应力分布、位移情况及其使用寿命。
  • 控制系统与信号处理:实现对系统状态、控制变量或信号功率的连续预测。

二、生物学与医学

  • 生态学:预测物种的空间分布密度、群落生物量或关键生态环境因子的变化趋势。
  • 公共卫生:基于环境暴露、生活习惯或基因组信息,构建疾病风险或血液生化值的预测模型。
  • 医学影像分析:估算器官体积、病灶范围、组织特性或功能参数。

一、地球科学与环境科学

  • 遥感反演:融合多源遥感数据,反演水体深度、土壤湿度、植被指数(如NDVI)和叶面积指数等。
  • 气象与气候研究:建立气温、降水量、风速与风向等连续气象要素的预测模型。
  • 水文与水资源管理:预测河流流量、地下水位变化及流域径流总量。
  • 环境污染监测:对空气质量指数、PM2.5/PM10浓度及重金属污染水平进行建模预测。
  • 地质与矿业:评估矿区地表沉降速率、地裂缝扩展趋势或矿产资源储量。

2 算法核心原理:LightGBM 的设计优势

四、为何 LightGBM 能高效处理大规模数据?

LightGBM 的底层架构经过多层次优化,显著提升了内存使用效率并降低了计算开销,使其能够在百万级样本和高维特征场景下依然保持高效训练。其并行策略、线程调度机制及数据读取方式均经过系统级设计,能充分调用CPU资源,在中大型项目中表现出更高的稳定性与更快的收敛速度。

三、LightGBM 如何实现“智能化”建树?

该算法具备高度自适应的树构建能力,能够根据模型残差的变化动态选择最优分裂区域,优先提升损失下降最明显的节点。这种机制使得即使在较浅的树深条件下,也能捕捉复杂的非线性关系。同时,它能识别并有效处理稀疏数据结构,兼容缺失值和高维编码特征,因此在文本分析、遥感融合或多源异构数据任务中表现优异。

二、LightGBM 的核心优化目标:更快速、更节省、更大规模

尽管理论框架沿用梯度提升树(GBDT),但 LightGBM 的重点在于工程层面的加速与资源优化。通过聚焦信息增益高的特征位置,避免全量扫描,极大减少了无效计算。此外,其存储结构压缩技术有效降低了内存占用,使模型能在资源受限环境中顺利运行——这也正是“Light”之名的由来。

一、LightGBM 的基本思想

作为梯度提升框架的一员,LightGBM 通过迭代训练一系列决策树,持续拟合前一轮的残差,逐步逼近最优预测结果。每棵树都在修正前序模型的误差,从而不断增强整体表达能力。与传统树模型类似,它通过寻找最佳特征分割点来划分样本空间,并逐层构建提升树,每次分裂都以最小化损失函数为目标,增强模型对当前误差的敏感性。

3 可解释性方法基础:SHAP 原理详解

二、为什么需要 SHAP?传统特征重要性的局限性

虽然 XGBoost 或随机森林提供的“特征重要性”被广泛使用,但存在明显不足:

  • 仅反映重要程度,无法说明影响方向:例如某个变量很重要,但它究竟是推高还是降低预测值?传统方法无法回答。
  • 缺乏样本级别的解释能力:无法针对单个预测实例解释特征的作用路径,难以支持精细化归因分析。

一、什么是 SHAP?一句话定义

SHAP 是一套基于“合作博弈论”的模型解释框架,核心问题是:每一个特征到底为最终预测结果贡献了多少?

如果你关心以下问题:

  • 哪些特征最具影响力?
  • 某个特征是正向推动还是负向抑制预测?
  • 不同样本中特征作用方向是否一致?
  • 模型是如何得出这个具体数值的?

那么 SHAP 提供了目前最为系统且可靠的解答方案。

当模型预测某个点的值为 3.2 m/s 时,我们往往不清楚这个结果是受到 NDVI 的推动,还是被降水量所拉低。这种不确定性使得模型解释变得困难。

此外,传统的解释方法还存在另一个问题:它们通常依赖于特定的模型结构,导致在不同模型之间难以统一评估标准。由于各类模型的输出指标不一致,贡献度难以对齐,限制了其通用性。

而 SHAP 方法恰好解决了上述痛点。

三、SHAP 的核心思想:特征是“协同工作的团队成员”

可以将建模过程类比为一场团队竞赛:

  • 每个队员对应一个输入特征,都可能对最终成绩(即模型输出)产生影响;
  • 但不同的组合方式下,同一特征的实际贡献可能会发生变化。

那么,如何衡量某一位队员的“真实贡献”?

SHAP 的思路是:

让每个特征参与所有可能的特征子集组合,计算其加入前后对模型性能带来的变化,进而求取平均提升效果。

由此得到的数值称为 Shapley 值,它代表了该特征在各种协作情境下的平均边际贡献。这种方法实现了对模型决策过程中各特征作用的“公平归因”。

四、SHAP 的优势体现在哪些方面?

1. 具备理论上的公平性

SHAP 遵循严格的数学公理体系,满足多项公平性原则:

  • 若某一特征在任何情况下均无贡献,则其 Shapley 值为 0;
  • 特征对模型预测能力的独立增益越大,得分越高;
  • 功能完全相同的两个特征将获得相等的贡献值。

这些性质是许多其他解释方法无法同时满足的。

2. 支持直观且高效的可视化表达

本程序集成的 SHAP 可视化工具包含以下图形:

这些图表极大提升了结果的可读性与学术表现力,尤其适用于科研论文撰写。

在撰写 SCI 论文时,审稿人常会提出如下质疑:

  • “模型是否有明确的物理解释?”
  • “为何某个特征显得特别重要?”
  • “你的模型是否只是一个黑箱?”

使用 SHAP 绘制的 beeswarm 图即可系统性地回应这些问题,清晰展示各特征的影响方向与强度。

3. 模型无关性与无偏性

SHAP 不依赖于具体的模型类型,适用于多种机器学习算法,包括但不限于:

  • XGBoost
  • CatBoost
  • LightGBM
  • 随机森林(Random Forest)
  • 梯度提升树(Gradient Boosting)
  • NGBoost
  • 决策树模型

无论使用哪种模型,SHAP 都能提供一致且可靠的解释结果。

五、其他常用图示说明

一、特征相关性热力图

该图通过颜色深浅反映不同特征之间的相关性强弱,区分正相关与负相关关系。有助于快速识别高度相关的冗余变量,发现潜在的多重共线性问题,为后续的特征筛选和模型优化提供依据。

二、散点密度图

相较于传统散点图,散点密度图利用颜色或亮度表示数据点的密集程度,更适合展示大规模样本的分布模式。能够有效突出高密度区域、离群点以及整体趋势,广泛应用于回归任务的结果分析与模型验证中。

以下是训练集与测试集分别生成的效果图:

六、代码实现内容概览

程序运行过程中,会将训练集与测试集的评估指标汇总并保存至名为 metrics.Mat 的矩阵中。该矩阵共两行:

  • 第一行为训练集指标;
  • 第二行为测试集指标。

每行包含 7 个评价指标,依次为:R(相关系数)、R(决定系数)、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()
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:python 回归预测 可视化 解释性 gbm
相关提问:Python可视化
相关内容:Python可视化分析

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-5 17:01