2026-04-19 03:36:26 +08:00
|
|
|
|
# EMOS 训练报告(2026-04-19)
|
2026-03-20 21:17:37 +08:00
|
|
|
|
|
2026-04-19 03:36:26 +08:00
|
|
|
|
## 1. 当前结论
|
2026-03-20 21:17:37 +08:00
|
|
|
|
|
2026-04-19 03:36:26 +08:00
|
|
|
|
- `EMOS` 已切为默认主概率路径:`emos_primary`。
|
|
|
|
|
|
- 本次切换只影响概率分布校准层,不改变 `DEB`、多模型预报、METAR 结算口径、订阅权限或缓存路由。
|
|
|
|
|
|
- 线上回滚开关保留:`POLYWEATHER_PROBABILITY_ENGINE=emos_shadow` 或 `legacy`。
|
|
|
|
|
|
- `LGBM` 本轮重新训练后仍不建议上线,继续保持 `POLYWEATHER_LGBM_ENABLED=false`。
|
2026-03-20 21:17:37 +08:00
|
|
|
|
|
2026-04-19 03:36:26 +08:00
|
|
|
|
## 2. 本次 EMOS 版本
|
2026-03-20 21:17:37 +08:00
|
|
|
|
|
2026-04-19 03:36:26 +08:00
|
|
|
|
- 校准版本:`emos-20260418192717`
|
|
|
|
|
|
- 训练时间:`2026-04-18T19:27:17Z`
|
|
|
|
|
|
- 样本数:`74`
|
2026-03-20 21:17:37 +08:00
|
|
|
|
- 参数文件:[default.json](/E:/web/PolyWeather/artifacts/probability_calibration/default.json)
|
|
|
|
|
|
- 离线评估报告:[evaluation_report.json](/E:/web/PolyWeather/artifacts/probability_calibration/evaluation_report.json)
|
|
|
|
|
|
|
2026-04-19 03:36:26 +08:00
|
|
|
|
## 3. 离线评估摘要
|
2026-03-20 21:17:37 +08:00
|
|
|
|
|
2026-04-19 03:36:26 +08:00
|
|
|
|
本次评估对比 legacy 概率和强制 EMOS primary 概率:
|
2026-03-20 21:17:37 +08:00
|
|
|
|
|
2026-04-19 03:36:26 +08:00
|
|
|
|
| 指标 | Legacy | EMOS | 变化 |
|
|
|
|
|
|
| :-- | --: | --: | --: |
|
|
|
|
|
|
| CRPS | `3.474108` | `3.331240` | `-0.142868` |
|
|
|
|
|
|
| MAE | `3.679324` | `3.622584` | `-0.056741` |
|
|
|
|
|
|
| Bucket hit rate | `0.500000` | `0.500000` | `0.000000` |
|
2026-03-20 21:17:37 +08:00
|
|
|
|
|
2026-04-19 03:36:26 +08:00
|
|
|
|
解读:
|
2026-03-20 21:17:37 +08:00
|
|
|
|
|
2026-04-19 03:36:26 +08:00
|
|
|
|
- `CRPS` 改善,说明整体概率分布质量更好。
|
|
|
|
|
|
- `MAE` 小幅改善,不再出现上一版“误差持平或略差”的问题。
|
|
|
|
|
|
- `bucket_hit_rate` 持平,没有牺牲结算桶命中率。
|
2026-03-20 21:17:37 +08:00
|
|
|
|
|
2026-04-19 03:36:26 +08:00
|
|
|
|
因此本轮可以先把 EMOS 作为主概率路径上线,但仍需要线上持续观察。
|
2026-03-20 21:17:37 +08:00
|
|
|
|
|
2026-04-19 03:36:26 +08:00
|
|
|
|
## 4. LGBM 本轮结果
|
2026-03-20 21:17:37 +08:00
|
|
|
|
|
2026-04-19 03:36:26 +08:00
|
|
|
|
本轮 LGBM 训练完成,但验证集表现不足:
|
2026-03-20 21:17:37 +08:00
|
|
|
|
|
2026-04-19 03:36:26 +08:00
|
|
|
|
| 指标 | Validation |
|
|
|
|
|
|
| :-- | --: |
|
|
|
|
|
|
| LGBM MAE | `5.867` |
|
|
|
|
|
|
| DEB MAE | `1.825` |
|
|
|
|
|
|
| Best-single MAE | `0.567` |
|
|
|
|
|
|
| Median MAE | `1.700` |
|
2026-03-20 21:17:37 +08:00
|
|
|
|
|
2026-04-19 03:36:26 +08:00
|
|
|
|
结论:
|
2026-03-20 21:17:37 +08:00
|
|
|
|
|
2026-04-19 03:36:26 +08:00
|
|
|
|
- LGBM 当前样本量和泛化质量不足。
|
|
|
|
|
|
- 不能替代“校准模型概率”板块。
|
|
|
|
|
|
- 线上继续关闭:`POLYWEATHER_LGBM_ENABLED=false`。
|
|
|
|
|
|
- 可以保留模型文件用于离线跟踪,不进入前端主路径。
|
2026-03-20 21:17:37 +08:00
|
|
|
|
|
2026-04-19 03:36:26 +08:00
|
|
|
|
## 5. 上线方式
|
2026-03-20 21:17:37 +08:00
|
|
|
|
|
2026-04-19 03:36:26 +08:00
|
|
|
|
默认代码路径已改为:
|
2026-03-20 21:17:37 +08:00
|
|
|
|
|
2026-04-19 03:36:26 +08:00
|
|
|
|
```text
|
|
|
|
|
|
POLYWEATHER_PROBABILITY_ENGINE=emos_primary
|
|
|
|
|
|
```
|
2026-03-20 21:17:37 +08:00
|
|
|
|
|
2026-04-19 03:36:26 +08:00
|
|
|
|
未设置环境变量时,系统默认走 `emos_primary`。
|
2026-03-20 21:17:37 +08:00
|
|
|
|
|
2026-04-19 03:36:26 +08:00
|
|
|
|
显式回滚方式:
|
2026-03-20 21:17:37 +08:00
|
|
|
|
|
2026-04-19 03:36:26 +08:00
|
|
|
|
```text
|
|
|
|
|
|
POLYWEATHER_PROBABILITY_ENGINE=emos_shadow
|
|
|
|
|
|
```
|
2026-03-20 21:17:37 +08:00
|
|
|
|
|
2026-04-19 03:36:26 +08:00
|
|
|
|
或:
|
2026-03-20 21:17:37 +08:00
|
|
|
|
|
2026-04-19 03:36:26 +08:00
|
|
|
|
```text
|
|
|
|
|
|
POLYWEATHER_PROBABILITY_ENGINE=legacy
|
|
|
|
|
|
```
|
2026-03-20 21:17:37 +08:00
|
|
|
|
|
2026-04-19 03:36:26 +08:00
|
|
|
|
`.env.example` 已同步暴露该配置项。
|
2026-03-20 21:17:37 +08:00
|
|
|
|
|
2026-04-19 03:36:26 +08:00
|
|
|
|
## 6. 前端表现
|
2026-03-20 21:17:37 +08:00
|
|
|
|
|
2026-04-19 03:36:26 +08:00
|
|
|
|
今日日内分析中的“校准模型概率”会优先展示 EMOS 校准后的温度桶分布。
|
2026-03-20 21:17:37 +08:00
|
|
|
|
|
2026-04-19 03:36:26 +08:00
|
|
|
|
用户看到的含义应该是:
|
2026-03-20 21:17:37 +08:00
|
|
|
|
|
2026-04-19 03:36:26 +08:00
|
|
|
|
- 这是经过历史误差校准后的概率分布;
|
|
|
|
|
|
- 不是简单模型投票;
|
|
|
|
|
|
- 不直接等于最终结算概率;
|
|
|
|
|
|
- 仍应结合 METAR 实测、峰值窗口、失效条件和模型层分歧。
|
2026-03-20 21:17:37 +08:00
|
|
|
|
|
2026-04-19 03:36:26 +08:00
|
|
|
|
## 7. 监控要求
|
2026-03-20 21:17:37 +08:00
|
|
|
|
|
2026-04-19 03:36:26 +08:00
|
|
|
|
上线后持续关注:
|
2026-03-20 21:17:37 +08:00
|
|
|
|
|
2026-04-19 03:36:26 +08:00
|
|
|
|
- `CRPS`
|
|
|
|
|
|
- `MAE`
|
|
|
|
|
|
- `bucket_hit_rate`
|
|
|
|
|
|
- 城市级样本分布
|
|
|
|
|
|
- 概率是否过度摊平
|
|
|
|
|
|
- 高温/低温尾部桶是否系统性低估
|
2026-03-20 21:17:37 +08:00
|
|
|
|
|
2026-04-19 03:36:26 +08:00
|
|
|
|
如果连续回归显示 EMOS 退化,应先切回 `emos_shadow`,保留 shadow 观测,再决定是否回退到 `legacy`。
|
2026-03-20 21:17:37 +08:00
|
|
|
|
|
2026-04-19 04:08:48 +08:00
|
|
|
|
## 8. 自动重训
|
|
|
|
|
|
|
|
|
|
|
|
已新增自动重训编排脚本:
|
|
|
|
|
|
|
|
|
|
|
|
```text
|
|
|
|
|
|
python scripts\auto_retrain_probability_calibration.py
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
默认行为:
|
|
|
|
|
|
|
|
|
|
|
|
- 生成一个新的 EMOS candidate。
|
|
|
|
|
|
- 对 candidate 跑离线评估。
|
|
|
|
|
|
- 写入候选目录和门禁报告。
|
|
|
|
|
|
- 不覆盖线上 [default.json](/E:/web/PolyWeather/artifacts/probability_calibration/default.json)。
|
|
|
|
|
|
|
|
|
|
|
|
候选产物默认写入:
|
|
|
|
|
|
|
|
|
|
|
|
```text
|
2026-04-19 04:16:12 +08:00
|
|
|
|
/var/lib/polyweather/probability_calibration/candidates/<version>/
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
最新自动训练报告默认写入:
|
|
|
|
|
|
|
|
|
|
|
|
```text
|
|
|
|
|
|
/var/lib/polyweather/probability_calibration/auto_retrain_report.json
|
2026-04-19 04:08:48 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
允许门禁通过后自动发布:
|
|
|
|
|
|
|
|
|
|
|
|
```text
|
|
|
|
|
|
python scripts\auto_retrain_probability_calibration.py --promote-if-passed --run-tests
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
门禁默认阈值:
|
|
|
|
|
|
|
|
|
|
|
|
- `POLYWEATHER_EMOS_AUTO_MIN_SAMPLES=50`
|
|
|
|
|
|
- `POLYWEATHER_EMOS_AUTO_MAX_DELTA_CRPS=0`
|
|
|
|
|
|
- `POLYWEATHER_EMOS_AUTO_MAX_DELTA_MAE=0.05`
|
|
|
|
|
|
- `POLYWEATHER_EMOS_AUTO_MIN_DELTA_BUCKET_HIT_RATE=-0.05`
|
|
|
|
|
|
|
|
|
|
|
|
说明:
|
|
|
|
|
|
|
|
|
|
|
|
- `CRPS` 不允许比 legacy 更差。
|
|
|
|
|
|
- `MAE` 最多允许轻微退化 `0.05`。
|
|
|
|
|
|
- `bucket_hit_rate` 只做软门槛,因为它对结算边界过于敏感。
|
|
|
|
|
|
- 如果发布,会先备份旧版 `default.json`。
|
|
|
|
|
|
|
|
|
|
|
|
Docker 手动触发:
|
|
|
|
|
|
|
|
|
|
|
|
```text
|
2026-04-19 04:25:15 +08:00
|
|
|
|
docker compose exec -T polyweather_web python scripts/auto_retrain_probability_calibration.py --verbose
|
2026-04-19 04:08:48 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-04-19 04:16:12 +08:00
|
|
|
|
查看最新报告:
|
|
|
|
|
|
|
|
|
|
|
|
```text
|
|
|
|
|
|
docker compose exec -T polyweather_web cat /var/lib/polyweather/probability_calibration/auto_retrain_report.json
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-04-19 04:08:48 +08:00
|
|
|
|
Docker 允许门禁发布:
|
|
|
|
|
|
|
|
|
|
|
|
```text
|
2026-04-19 04:25:15 +08:00
|
|
|
|
docker compose exec -T polyweather_web python scripts/auto_retrain_probability_calibration.py --verbose --promote-if-passed --run-tests
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
如果线上 SQLite 的 `probability_training_snapshots_store` 已经很大,可以先限制最近 N 条快照:
|
|
|
|
|
|
|
|
|
|
|
|
```text
|
|
|
|
|
|
docker compose exec -T polyweather_web python scripts/auto_retrain_probability_calibration.py --verbose --snapshot-limit 20000
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
也可以放到 `.env`:
|
|
|
|
|
|
|
|
|
|
|
|
```text
|
|
|
|
|
|
POLYWEATHER_EMOS_TRAINING_SNAPSHOT_LIMIT=20000
|
2026-04-19 04:08:48 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-04-19 04:16:12 +08:00
|
|
|
|
如果希望自动发布不需要重建镜像,需要在 `.env` 中指定可写参数文件:
|
|
|
|
|
|
|
|
|
|
|
|
```text
|
|
|
|
|
|
POLYWEATHER_PROBABILITY_CALIBRATION_FILE=/var/lib/polyweather/probability_calibration/default.json
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
首次启用该路径前,先用当前镜像内置参数初始化一次:
|
|
|
|
|
|
|
|
|
|
|
|
```text
|
|
|
|
|
|
docker compose exec -T polyweather_web mkdir -p /var/lib/polyweather/probability_calibration
|
|
|
|
|
|
docker compose exec -T polyweather_web cp /app/artifacts/probability_calibration/default.json /var/lib/polyweather/probability_calibration/default.json
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-04-19 04:08:48 +08:00
|
|
|
|
建议后续挂到宿主机 `cron` 或 systemd timer:
|
|
|
|
|
|
|
|
|
|
|
|
```text
|
|
|
|
|
|
0 3 * * * cd /root/PolyWeather && docker compose exec -T polyweather_web python scripts/auto_retrain_probability_calibration.py --promote-if-passed --run-tests
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 9. 已验证
|
2026-03-20 21:17:37 +08:00
|
|
|
|
|
2026-04-19 03:36:26 +08:00
|
|
|
|
本次上线前已执行:
|
2026-03-20 21:17:37 +08:00
|
|
|
|
|
2026-04-19 03:36:26 +08:00
|
|
|
|
```text
|
|
|
|
|
|
python scripts\fit_probability_calibration.py
|
|
|
|
|
|
python scripts\evaluate_probability_calibration.py
|
|
|
|
|
|
python scripts\train_lgbm_daily_high.py
|
|
|
|
|
|
python scripts\report_lgbm_daily_high.py
|
|
|
|
|
|
python -m pytest tests\test_probability_calibration.py tests\test_probability_rollout.py tests\test_lgbm_daily_high.py tests\test_lgbm_features.py
|
|
|
|
|
|
```
|
2026-03-20 21:17:37 +08:00
|
|
|
|
|
2026-04-19 03:36:26 +08:00
|
|
|
|
代码切换后补充执行:
|
2026-03-20 21:17:37 +08:00
|
|
|
|
|
2026-04-19 03:36:26 +08:00
|
|
|
|
```text
|
|
|
|
|
|
python -m pytest tests\test_probability_calibration.py tests\test_probability_rollout.py
|
|
|
|
|
|
```
|
2026-03-20 21:17:37 +08:00
|
|
|
|
|
2026-04-19 03:36:26 +08:00
|
|
|
|
结果:通过。
|