PyTorch基于LightGBM的海洋温盐异常垂直剖面预测

1. 总体目标

本代码利用LightGBM (LGBMRegressor)构建机器学习模型,对西北太平洋(NWP)区域海洋的温度异常(TSA)和盐度异常(SSSA)进行垂直剖面(57层) 预测。输入为14个海洋与涡旋特征变量,输出为每一层的温度与盐度异常值。

2. 数据准备

2.1 输入特征文件
  • 文件point_variables_14_Cyclonic.mat
  • 变量数量 :14个(特征名见feature_names列表)
    • 海洋变量:sla(海面高度异常)、sst(海表温度)、sss(海表盐度)、ssta(海表温度异常)、sssa(海表盐度异常)
    • 时空变量:day1、day2(时间相关)、lon、lat(经度、纬度)
    • 涡旋参数:Eddy_R(涡旋半径)、Eddy_A(涡旋振幅)、Eddy_SLA(涡旋SLA)、dlon、dlat(相对距离)
  • 样本数:200566
2.2 标签文件
  • 文件TS_anomaly_WOA23_Cyclonic.mat
  • 内容:温度异常与盐度异常垂直剖面,共114列(前57列为温度,后57列为盐度)
2.3 数据划分
  • 训练集:前62073个样本(按时间顺序)
  • 测试集:剩余样本
  • 预处理
    • 使用SimpleImputer(strategy='mean')填充缺失值
    • 对输入特征进行标准化(StandardScaler),并保存标准化器供后续使用

3. 模型结构

3.1 模型选择

仅使用LightGBM (可扩展支持其他模型,代码中预留了models_to_compare字典)。

超参数通过网格搜索(GridSearchCV)对第一层(表层)温度进行优化,得到最佳参数后用于所有层。

3.2 分层训练策略

由于输出为57个垂直层,模型对每一层独立训练一个温度模型和一个盐度模型,共114个LightGBM回归器。

  • 输入:14个标准化特征
  • 输出:该层的温度异常或盐度异常
3.3 训练细节
  • 对每一层调用.fit()训练
  • 训练完成后保存模型(joblib.dump),命名格式:{model_name}_tem_{area}_{layer}layers_best.model

4. 评估与可视化

4.1 评估指标
  • RMSE:均方根误差
  • 相关系数(Corr):预测值与真实值的Pearson相关系数
4.2 输出结果
  • 预测结果 :保存为.mat文件,包含真实值(T, S)与预测值(Tp, Sp),以及每层的RMSE和Corr
  • 特征重要性 :对支持feature_importances_的模型(LightGBM),保存每层特征重要性CSV
  • SHAP分析(尝试执行,可能因数据量或依赖问题跳过):生成SHAP摘要图
  • 相关性散点图:每5层绘制一次真实值 vs 预测值散点图,并标注相关系数与RMSE
4.3 性能汇总图
  • 绘制四个子图:温度RMSE、盐度RMSE、温度相关系数、盐度相关系数(随层数变化)
  • 保存为lgb_performance_{area}.png
  • 汇总指标(平均RMSE、最佳相关系数等)保存为CSV
4.4 论文风格双联散点图

函数plot_two_split_panels绘制训练集与测试集的散点对比图:

  • 统一坐标轴范围,强制1:1比例
  • 半透明散点 + 颜色映射误差绝对值
  • 添加R²和RMSE文本标注
  • 输出fig_lgb_temperature_train_val_test.pngfig_lgb_salinity_train_val_test.png

5. 辅助类与函数

5.1 Model

设计用于批量训练(batch_size)和增量学习(warm_start),但本代码中未使用 该类,而是直接循环调用.fit()

5.2 plot_correlation_scatter

绘制单层散点图,带对角线参考线,并返回相关系数与RMSE。

5.3 _paper_style

设置Seaborn主题、字体、DPI等,统一论文出图风格。

6. 运行流程概要

  1. 设置路径参数(pathoutputpath、区域名称area_name
  2. 读取输入特征和标签数据,划分训练/测试集,标准化特征
  3. 对LightGBM进行网格搜索(基于第一层温度)获取最佳超参数
  4. 循环57层:
    • 训练该层的温度模型和盐度模型
    • 预测训练集和测试集
    • 计算RMSE、相关系数
    • 保存特征重要性、SHAP图、散点图、模型文件
  5. 保存所有层的预测结果及性能指标
  6. 绘制整体性能图和论文风格双联散点图

7. 输出文件结构

复制代码
outputpath/
└── LGB/
    ├── standard_scaler.pkl                 # 标准化器
    ├── LGB_tem_NWP_*layers_best.model      # 各层温度模型
    ├── LGB_sal_NWP_*layers_best.model      # 各层盐度模型
    ├── LGB_NWP_val_result_01.mat           # 完整预测结果
    ├── feature_importance_layer_*_T.csv    # 各层特征重要性(温度)
    ├── feature_importance_layer_*_S.csv    # 各层特征重要性(盐度)
    ├── SHAP_LGB_temp_layer_*.png           # SHAP图(若成功)
    ├── SHAP_LGB_sal_layer_*.png
    ├── LGB_Temperature_layer_*_correlation.png  # 单层散点图
    ├── LGB_Salinity_layer_*_correlation.png
    ├── paper_style_figures/
    │   ├── fig_lgb_temperature_train_val_test.png
    │   └── fig_lgb_salinity_train_val_test.png
    └── LGB_Performance/
        ├── lgb_performance_NWP.png
        └── lgb_performance_summary_NWP_01.csv

8. 注意事项

  • 代码中训练集划分索引index_split = 62073为硬编码,应与数据实际时间顺序对应。
  • 输入文件路径使用了绝对路径D:\\2026-任务\\...,使用时需根据实际环境修改。
  • SHAP分析部分可能因计算资源或版本问题失败,代码已做异常捕获,不影响主流程。
  • 特征重要性保存了每一层的两份CSV(温度、盐度),但后续未进行综合平均或排名分析。
  • 函数plot_two_split_panels在最后调用时,第一个参数使用了trainYT[:n_train_main, :].ravel()等,其中n_train_main定义为int(n_train_total * 0.8),但实际训练集已经按前62073划分,存在不一致风险(应直接使用trainYTtestYT,而非二次划分)。建议用户根据实际数据调整。

9. 可扩展性

  • 若需对比其他模型(如SVR、XGBoost),可在models_to_compare字典中添加条目,并适当修改网格搜索参数。
  • 分层训练可替换为多输出回归(MultiOutputRegressor)以提升效率,但本代码保持了逐层独立训练的灵活性。
相关推荐
程序大视界1 小时前
AI发展趋势:从大模型到AGI的崎岖征途
人工智能·agi
jkyy20141 小时前
Health Agent开放平台:企业级健康医疗AI Agent基础设施
人工智能·健康医疗
xieyan08112 小时前
软件操作自动生成 Skill:最近很火的开源项目 CLI-Anything
人工智能
我科绝伦(Huanhuan Zhou)2 小时前
分享一个自己写的智能巡检系统
运维·人工智能·自动化
iiiiii112 小时前
【理论推导】指数族分布的核心性质:对数配分函数的梯度为什么是充分统计量的期望?
人工智能·笔记·深度学习·数学·机器学习·概率论·指数族分布
狒狒热知识2 小时前
全媒体资源整合时代:软文营销推广迈入精准高效新征程构建传播新生态
人工智能·百度·营销
Thomas.Sir2 小时前
第十一章:RAG知识库开发之【RAG 的缺陷分析与优化:从入门到实践的完全指南】
python·ai·rag·缺陷分析·效果评估
波动几何2 小时前
System-Controller完整能力手册
人工智能
chushiyunen2 小时前
python web框架streamlit
开发语言·前端·python