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.png和fig_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. 运行流程概要
- 设置路径参数(
path、outputpath、区域名称area_name) - 读取输入特征和标签数据,划分训练/测试集,标准化特征
- 对LightGBM进行网格搜索(基于第一层温度)获取最佳超参数
- 循环57层:
- 训练该层的温度模型和盐度模型
- 预测训练集和测试集
- 计算RMSE、相关系数
- 保存特征重要性、SHAP图、散点图、模型文件
- 保存所有层的预测结果及性能指标
- 绘制整体性能图和论文风格双联散点图
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划分,存在不一致风险(应直接使用trainYT和testYT,而非二次划分)。建议用户根据实际数据调整。
9. 可扩展性
- 若需对比其他模型(如SVR、XGBoost),可在
models_to_compare字典中添加条目,并适当修改网格搜索参数。 - 分层训练可替换为多输出回归(MultiOutputRegressor)以提升效率,但本代码保持了逐层独立训练的灵活性。