6.8 KiB
6.8 KiB
LightGBM 日最高温模型(中文)
1. 目标
这套 LightGBM 模型是给 PolyWeather 增加一个轻量级的统计学习预测源。
它的定位不是替代:
DEBEMOSECMWF / GFS / GEM / JMA / ICON / Open-Meteo / MGM / NWS
而是作为一个新的点预测源:
现有模型 + 观测特征 -> LGBM -> 并入 current_forecasts -> DEB -> EMOS
第一版只做:
D0当日最高温预测
不做:
D1-D3- 小时级曲线
- 概率分布
- 独立结算源
2. 适用场景
这条链路是为低资源 VPS 准备的。
当前项目线上环境只有 2GB RAM 时,不适合引入 TimesFM 这类大模型,但适合用 LightGBM 做轻量推理。
当前方案是:
- 训练离线完成
- 训练产物直接提交到仓库
- VPS 线上只加载模型文件并推理
- VPS 不训练,不起额外服务
3. 文件结构
核心文件如下:
- 运行时推理:
- 特征构建:
- 训练脚本:
- 训练报告脚本:
- 模型文件:
- 模型 schema / 指标:
接入链路位置:
- Web API 聚合:
- 共享趋势引擎:
4. 特征说明
第一版特征固定为以下几组。
4.1 历史日高温特征
actual_high_lag_1actual_high_lag_2actual_high_lag_3actual_high_lag_7actual_high_mean_7actual_high_mean_14actual_high_trend_3
4.2 当天模型特征
Open-MeteoECMWFGFSGEMJMAICONMGMNWSdeb_predictionmodel_medianmodel_spread
4.3 当前观测特征
current_tempmax_so_farhumiditywind_speed_ktvisibility_mi
4.4 时间与状态特征
local_hourmonthweekdaypeak_status_code
其中:
before = 0in_window = 1past = 2
5. 训练数据来源
训练数据主要来自两份运行时历史文件:
作用分工:
-
daily_records.json- 提供
actual_high - 提供当天各模型 forecast
- 提供历史
deb_prediction
- 提供
-
probability_training_snapshots.jsonl- 提供
max_so_far - 提供
peak_status - 提供观测特征快照
- 提供
为后续重训,概率快照归档现在还会额外写入:
current_temphumiditywind_speed_ktvisibility_milocal_hour
对应代码:
6. 训练流程
训练脚本:
./venv/Scripts/python.exe scripts/train_lgbm_daily_high.py
训练流程如下:
- 从历史文件构造监督样本
- 目标值固定为
actual_high - 按日期做简单的时间顺序切分
- 最后约 20% 做验证集
- 先训练并评估验证集
- 再用全量样本训练最终模型
- 输出模型文件和 schema 文件
输出产物:
7. 如何看训练结果
查看训练报告:
./venv/Scripts/python.exe scripts/report_lgbm_daily_high.py
这个脚本会读取 schema,并打印:
Sample CountTrain CountValid CountLGBM MAEDEB MAEBest Single MAEMedian MAEWinner
当前这版训练结果是:
sample_count = 29validation_count = 12validation.lgbm_mae = 2.975validation.deb_mae = 2.267validation.best_single_mae = 1.167
这说明:
- 当前
LGBM链路已经可用 - 但现阶段验证集表现还没有超过
DEB - 所以默认配置仍建议保持关闭
8. 线上运行逻辑
运行时推理逻辑不是“直接替代 DEB”,而是:
- 先收集现有模型 forecast
- 先算一版基线
DEB - 把这版
DEB当作LGBM的一个输入特征 - 输出
LGBM点预测 - 把
LGBM注入current_forecasts - 重新计算最终
DEB
这样做的原因是:
LGBM需要吃到deb_prediction特征- 但最终
DEB又要把LGBM当成一个新的输入模型
9. 环境变量
示例配置见:
相关变量:
POLYWEATHER_LGBM_ENABLED=false
POLYWEATHER_LGBM_MODEL_PATH=/app/artifacts/models/lgbm_daily_high.txt
POLYWEATHER_LGBM_SCHEMA_PATH=/app/artifacts/models/lgbm_daily_high_schema.json
POLYWEATHER_LGBM_MIN_HISTORY_POINTS=3
说明:
POLYWEATHER_LGBM_ENABLED- 是否启用运行时推理
POLYWEATHER_LGBM_MODEL_PATH- 模型文件路径
POLYWEATHER_LGBM_SCHEMA_PATH- schema 文件路径
POLYWEATHER_LGBM_MIN_HISTORY_POINTS- 某城市最低历史样本门槛
默认是 3,原因不是最理想,而是当前整体样本仍然偏少。
如果门槛设太高,很多城市现在根本不会触发 LGBM。
10. VPS 部署建议
如果你的 VPS 只有 2GB RAM:
- 可以跑这套
LightGBM - 不要在 VPS 上训练
- 不要起额外模型服务
推荐方式:
- 在本地或开发环境训练
- 提交模型产物
- VPS 拉代码
- 开启
POLYWEATHER_LGBM_ENABLED=true - 重启主服务
不推荐:
- 在 VPS 上跑训练脚本
- 把
LightGBM当成长任务服务单独部署 - 同时引入大模型推理
11. 当前结论
这条链路已经完成了:
- 离线训练
- 模型产物固化
- 运行时懒加载
- Web / 共享分析链路注入
- 前端模型类型兼容
但当前样本量仍偏少,所以建议运营策略是:
- 先继续积累历史
actual_high - 继续积累概率快照观测字段
- 定期重训
- 只有当验证集
MAE持续接近或优于DEB时,再考虑默认线上开启
12. 常用命令
训练
./venv/Scripts/python.exe scripts/train_lgbm_daily_high.py
查看训练报告
./venv/Scripts/python.exe scripts/report_lgbm_daily_high.py
本地测试
./venv/Scripts/python.exe -m pytest tests/test_lgbm_features.py tests/test_lgbm_daily_high.py
编译检查
./venv/Scripts/python.exe -m compileall src web scripts tests