Compare commits

..

23 Commits

Author SHA1 Message Date
Serendipity 29bd19bae4 docs: 更新 README.md 反映项目现状, 新增项目 CLAUDE.md 2026-05-28 14:19:14 +08:00
Serendipity a352fbfe4c fix: 仓库URL改用\url{}支持自动换行 2026-05-28 14:17:10 +08:00
Serendipity 8657f2a3b5 chore: 清理附录,恢复整洁结构 2026-05-28 14:15:20 +08:00
Serendipity ab58614a15 refactor: 附录/致谢/参考文献拆分为独立 chapter 文件,main.tex 保持清爽 2026-05-28 14:10:00 +08:00
Serendipity 280c05ffaf feat: 添加关键代码讲解附录 — LSTM/MHA/FocalLoss/预处理/Flask 2026-05-28 14:07:12 +08:00
Serendipity aec3e668d8 style: 目录和参考文献字体缩小为五号 2026-05-28 14:03:52 +08:00
Serendipity 871ad57bd6 feat: 论文扩充至52页 — 全部章节深度扩写+20篇参考文献+3附录+致谢 2026-05-28 14:02:14 +08:00
Serendipity cf29da52f7 style: 按河南理工论文规范重排 — 封面/页眉页脚/标题字号/图表标题位置 2026-05-28 13:45:07 +08:00
Serendipity 2bdafc56bb feat: 论文大幅扩写 — 42页,完整数学公式+实际数据+系统描述 2026-05-28 13:09:08 +08:00
Serendipity 4e41de3772 fix: 修复 LaTeX 中文字体 — macOS 字体改为 Windows STSong/Noto Sans SC/FangSong 2026-05-28 13:01:41 +08:00
Serendipity 014d631d68 feat: 论文更新 — 加入LSTM调优实验记录,24页 2026-05-28 12:56:07 +08:00
Serendipity 1a36d146be chore: LSTM 训练调优总结 — 类别加权/采样器/权重多项尝试,XGBoost 仍为最佳 2026-05-28 12:54:40 +08:00
Serendipity 23f3f9e4fb fix: 温和采样器 + 纯 FocalLoss, batch_size 32 2026-05-28 12:23:42 +08:00
Serendipity 13f553da5d fix: 手动温和权重 [1,3,5,8] + gamma 3.0 2026-05-28 12:02:25 +08:00
Serendipity 1a6f5b07aa fix: sqrt 逆频率权重 + 每 epoch 打印 2026-05-28 11:37:43 +08:00
Serendipity 305f70b9de perf: batch_size 64, max_epochs 50 — 加速训练约8x 2026-05-28 11:26:59 +08:00
Serendipity c0e2bdca72 fix: 改用类别加权 FocalLoss 替代 WeightedSampler,更快更稳定 2026-05-28 11:16:18 +08:00
Serendipity 106ce423d3 feat: 添加 WeightedRandomSampler 解决类别不平衡 2026-05-28 10:24:33 +08:00
Serendipity 0d178b0d57 perf: 优化训练配置 — batch_size 16, alpha 0.5, max_epochs 200, 日志文件输出 2026-05-28 09:51:03 +08:00
Serendipity fff2a7cabd feat: LaTeX 论文编译完成 — 23页,含实际实验数据和评估图表 2026-05-28 09:41:09 +08:00
Serendipity 60dfbf2662 feat: 模型评估完成 — XGBoost最佳F1=0.93,LSTM待更多训练 2026-05-28 09:38:30 +08:00
Serendipity 12dbdf789d feat: ERA5 预处理完成 — 修复 NetCDF 引擎 (h5netcdf+dask),统一 NPZ 命名,109.6万序列样本 2026-05-28 08:55:12 +08:00
Serendipity a2c9ba4863 fix: 统一 NPZ 命名格式,添加 NetCDF ZIP 解压工具和 h5netcdf/h5py 依赖 2026-05-28 08:26:18 +08:00
30 changed files with 6846 additions and 389 deletions
+83
View File
@@ -0,0 +1,83 @@
# CLAUDE.md
## 项目概述
本科毕业设计:银发群体高温多时间尺度预警和服务优化可视化研究。为焦作市和郑州市老年群体构建基于 ERA5-Land 气象数据的高温健康风险预警模型(XGBoost + LSTM-Attention),并开发 Flask+ECharts 可视化大屏。
## 技术栈
- **Python 3.13**uv 管理虚拟环境 `.venv`
- **PyTorch 2.12.0+cu126**GPU 训练,RTX 4060 Laptop 8GB
- **XGBoost 2.0+** / **Scikit-learn 1.3+**
- **Flask 3.0+** / **ECharts 5.5**
- **LaTeX**XeLaTeX + ctexbook,中文字体 STSong/Noto Sans SC/FangSong
- **xarray + h5netcdf + h5py**NetCDF4 读取)
## 常用命令
```bash
# 环境
uv sync # 同步依赖(含 CUDA PyTorch
uv run python -c "..." # 运行 Python 代码
# 数据管线
uv run python -m src.data.download_era5 # CDS API 下载 ERA5
uv run python -m src.data.extract_zips # ZIP→NetCDF 解压
uv run python -m src.data.preprocess # 预处理管线
# 模型
uv run python -m src.models.train # 训练 LSTM
uv run python -m src.models.evaluate # 评估 + XGBoost 训练
# Web
uv run python -m src.web.app # 启动 Flask (localhost:5005)
# 论文
cd thesis && xelatex -interaction=nonstopmode main && xelatex -interaction=nonstopmode main
# Git
git push origin main # 推送到 Gitea
```
## 项目结构
```
src/
├── data/
│ ├── download_era5.py # CDS API 逐月下载(360文件)
│ ├── extract_zips.py # ZIP 解压(CDS 新格式适配)
│ ├── preprocess.py # 8步预处理管线(597行)
│ └── collect_mortality.py # 死亡率/人口数据整理
├── models/
│ ├── lstm_attention.py # LSTM-Attention 模型(983K参数)
│ ├── xgboost_baseline.py # XGBoost 三分类器基线
│ ├── train.py # 训练脚本(Focal Loss + 早停)
│ └── evaluate.py # 评估对比 + 图表生成
├── web/
│ ├── app.py # Flask 4端点 (predict/history/stats/index)
│ └── static/index.html # ECharts 6面板大屏(~800行)
└── utils/config.py # 全局配置(城市坐标/超参数/路径)
```
## 关键路径
| 路径 | 说明 |
|------|------|
| `data/raw/era5/{city}/` | 每城 180 个 NetCDF 月文件 |
| `data/processed/` | NPZ 序列 + CSV 特征(gitignored |
| `outputs/models/best_model.pt` | LSTM 最佳 checkpoint12MBgitignored |
| `outputs/figures/` | 评估图表(PNG, 300dpi |
| `outputs/logs/` | 训练日志 |
| `thesis/main.pdf` | 编译后 PDF56页) |
## 运行注意事项
- CDS 下载很慢(约5天),使用单线程 + 5次指数退避重试,中断后可直接重启(已存在文件自动跳过)
- CDS 迁移后返回 ZIP 格式,需要 `extract_zips.py` 解压(文件头魔数检测 PK→ZIP)
- NetCDF 读取用 `h5netcdf` 引擎,不要用 `netcdf4`Windows 需额外 DLL
- 论文编译需 XeLaTeX + STSong/Noto Sans SC/FangSong 字体(Windows 自带或在系统字体目录)
- 类别极度不平衡(低风险 94-96%),LSTM 多次调优未收敛,XGBoost 为主力模型
## 远程仓库
Gitea: `git@lhy-git.liuhangyv.top:Serendipity/elderly-heat-warning.git`
+99 -86
View File
@@ -2,57 +2,56 @@
本科毕业设计 — 河南理工大学计算机科学与技术学院
## 概述
## 项目概述
本项目针对焦作市和郑州市老年群体,构建了基于 LSTM-Attention 的多时间尺度高温健康风险预警模型,并开发了 ECharts 可视化大屏系统。
针对焦作市和郑州市老年群体,利用 ERA5-Land 气象再分析数据(2010-2024年),构建了基于 XGBoost 和 LSTM-Attention 的多时间尺度高温健康风险预警模型,并开发了 ECharts 可视化大屏系统。
### 核心功能
### 核心成果
- **多时间尺度预警**:短期(1-3天)、中期(7天)、长期30天)三级高温健康风险预测
- **深度学习模型**BiLSTM + Multi-Head Attention,三头输出同时预测三个时间尺度
- **基线对比**:XGBoost 三分类器,验证深度学习方法有效性
- **可视化大屏**6 面板深色科技蓝风格 Web 大屏,含温度趋势、风险预警、人口统计等
- **完整论文**LaTeX 学位论文,含 7 个章节 + 参考文献 + 附录
- **数据集**:109.6万条序列样本(14天×19特征),覆盖短期(3d)/中期(7d)/长期(30d)预测
- **XGBoost 模型**:短期 F1=0.933,中期 F1=0.920,长期 F1=0.858(主力模型)
- **LSTM-Attention 模型**983K 参数,BiLSTM+MHAFocal Loss 训练(受限于类别不平衡)
- **可视化大屏**Flask + ECharts 5.5,深色科技蓝风格,6 面板
- **学位论文**LaTeX 编写的 7 章本科毕业论文,56 页,GB/T 7714 参考文献
### 技术栈
| 层 | 技术 |
|----|------|
| 数据处理 | Python, xarray, pandas, numpy |
| 气象数据 | ERA5-Land (CDS API) |
| 深度学习 | PyTorch 2.12, CUDA 12.6 |
| 传统模型 | XGBoost, scikit-learn |
| Web 后端 | Flask |
| 可视化 | ECharts 5.5 |
| 数据获取 | ERA5-Land (CDS API), cdsapi 0.7.7 |
| 数据处理 | Python 3.13, xarray, h5netcdf, h5py, pandas, numpy |
| 深度学习 | PyTorch 2.12.0+cu126 (CUDA 12.6) |
| 传统模型 | XGBoost 2.0+, scikit-learn 1.3+ |
| Web 后端 | Flask 3.0+ |
| 前端 | ECharts 5.5, CSS Grid, Glassmorphism |
| 包管理 | uv |
| 论文 | LaTeX (XeLaTeX + ctexbook) |
| 论文 | LaTeX (XeLaTeX + ctexbook), GB/T 7714 |
## 环境配置
### 系统要求
- Python 3.13
- NVIDIA GPU (推荐RTX 4060 或以上)
- NVIDIA GPU推荐 RTX 4060+8GB VRAM;CPU 也可运行但训练较慢)
- Windows 11 / Linux
### 安装
```bash
# 创建虚拟环境
uv venv --python "D:\settings\Language\Python\Python 3.13.13\python.exe"
# 安装依赖
uv pip install -e .
uv venv
# 安装依赖(含 CUDA PyTorch
uv sync
```
### CDS API 配置(数据下载必需)
### ERA5 数据下载配置
1. 注册 Copernicus CDS 账号:https://cds.climate.copernicus.eu/
2. 获取 API Key
2. 接受 ERA5-Land 数据许可协议
3. 创建 `~/.cdsapirc`
```
url: https://cds.climate.copernicus.eu/api
key: <UID>:<API_KEY>
key: <your-api-key>
```
## 运行指南
@@ -60,115 +59,129 @@ key: <UID>:<API_KEY>
### 1. 数据获取与预处理
```bash
# 下载 ERA5 气象数据(需要 CDS API 配置
# 下载 ERA5 数据(焦作+郑州,各180个月,预计耗时约5天
python -m src.data.download_era5
# 收集死亡率与人口数据
python -m src.data.collect_mortality
# 解压 ZIP 格式 NetCDF 文件(CDS 新格式)
python -m src.data.extract_zips
# 运行预处理管
# 运行预处理管线(耗时约27分钟)
python -m src.data.preprocess
```
### 2. 探索性数据分析
```bash
jupyter notebook notebooks/eda.ipynb
```
### 3. 模型训练
### 2. 模型训练与评估
```bash
# 训练 LSTM-Attention 模型
python -m src.models.train
# 模型评估与对比
# 模型评估(含 XGBoost 训练 + 对比图表生成)
python -m src.models.evaluate
```
### 4. 启动可视化大屏
### 3. 启动可视化大屏
```bash
python -m src.web.app
# 浏览器打开 http://localhost:5005
# 浏览器访问 http://localhost:5005
```
### 5. 论文编译
### 4. 编译论文
```bash
cd thesis
make
# 或手动: xelatex main && biber main && xelatex main && xelatex main
xelatex -interaction=nonstopmode main
xelatex -interaction=nonstopmode main
# 或使用 Makefile: make
```
## 项目结构
```
project/
├── data/
│ ├── raw/era5/ # ERA5 原始 NetCDF 文件
│ ├── processed/ # 预处理后 CSV 和 NPZ 序列
│ └── external/ # 死亡率/人口/暴露反应数据
│ ├── raw/era5/ # ERA5 NetCDF 文件(焦作180+郑州180
│ ├── processed/ # 预处理后 NPZ 序列和 CSV 特征
│ └── external/ # 死亡率/人口/暴露反应数据
├── src/
│ ├── data/ # 数据获取与预处理
│ │ ├── download_era5.py
│ │ ├── collect_mortality.py
│ │ ── preprocess.py
├── models/ # 模型定义与训练
│ ├── lstm_attention.py
│ │ ├── xgboost_baseline.py
│ │ ├── train.py
│ │ ── evaluate.py
├── web/ # Web 可视化
│ ├── app.py
│ │ ── static/index.html
│ ├── data/
│ │ ├── download_era5.py # CDS API 下载
│ │ ├── extract_zips.py # ZIP→NetCDF 解压
│ │ ── preprocess.py # 预处理管线(597行, 8步)
│ └── collect_mortality.py # 死亡率数据整理
│ ├── models/
│ │ ├── lstm_attention.py # LSTM-Attention 模型定义
│ │ ├── xgboost_baseline.py # XGBoost 基线
│ │ ── train.py # 训练脚本(365行)
│ └── evaluate.py # 评估脚本(295行)
│ ├── web/
│ │ ── app.py # Flask 后端(4 API
│ │ └── static/index.html # ECharts 大屏(6面板)
│ └── utils/
│ └── config.py # 全局配置
│ └── config.py # 全局配置常量
├── notebooks/
│ └── eda.ipynb # 探索性数据分析
│ └── eda.ipynb # 探索性数据分析
├── outputs/
│ ├── models/ # 训练好的模型权重
│ ├── figures/ # 论文和评估图表
│ └── logs/ # 训练日志
── thesis/ # LaTeX 学位论文
├── main.tex
├── chapters/ # 各章节 tex 文件
│ ├── refs.bib # 参考文献
── Makefile
└── docs/superpowers/ # 设计文档和计划
│ ├── models/ # best_model.pt (12MB)
│ ├── figures/ # 混淆矩阵/模型对比图
│ └── logs/ # 训练日志
── thesis/ # LaTeX 学位论文56页)
├── main.tex # 主文件(~130行结构)
├── chapters/ # 12个章/附录 tex 文件
│ ├── abstract.tex
── ch1-intro.tex ~ ch7-conclusion.tex
│ ├── references.tex
│ ├── acknowledgments.tex
│ └── appendix-*.tex # 附录A~C
└── refs.bib
```
## 模型架构
```
输入 (14天气象序列)
→ Linear 嵌入 (16 → 128)
→ 2层 BiLSTM (128, dropout=0.3)
→ Multi-Head Attention (4 heads)
→ Linear 投影 (256 → 128)
→ 三头输出
├── 短期头 (128→64→4)
├── 中期头 (128→64→4)
└── 长期头 (128→64→4)
输入 (14天 × 19特征)
→ Linear 投影 (19 → 128)
→ 2层 BiLSTM (128, dropout=0.3)
→ Multi-Head Self-Attention (4 heads, d_k=32)
→ LSTM 投影 (256 → 128)
→ 三头输出
├── 短期头 (128→64→4)
├── 中期头 (128→64→4)
└── 长期头 (128→64→4)
```
总参数量:983,628
总参数量:~983K
## 实验结果
| 时间尺度 | 指标 | XGBoost | LSTM-Attention |
|---------|------|---------|----------------|
| 短期(3d) | Accuracy | **0.9908** | 0.9263 |
| 短期(3d) | F1-Macro | **0.9325** | 0.2404 |
| 中期(7d) | Accuracy | **0.9886** | 0.9259 |
| 中期(7d) | F1-Macro | **0.9195** | 0.2404 |
| 长期(30d)| Accuracy | **0.9782** | 0.9260 |
| 长期(30d)| F1-Macro | **0.8576** | 0.2404 |
XGBoost 在三个时间尺度上均大幅领先。LSTM 受限于极度类别不平衡(低风险类占94-96%),经6轮调优未收敛。
## 风险等级定义
| 等级 | 条件 | 颜色 |
|------|------|------|
| 低风险 | 体感温度 < 32°C | 绿 |
| 中风险 | 体感温度 32-35°C | 黄 |
| 高风险 | 体感温度 35-38°C 或连续 3 天 >35°C | 橙 |
| 严重风险 | 体感温度 >= 38°C 且连续 3 天 >35°C | 红 |
| 等级 | 体感温度 | 颜色 |
|------|---------|------|
| 0级 低风险 | HI < 32°C | 绿 |
| 1级 中风险 | 32 ≤ HI < 35°C | 黄 |
| 2级 高风险 | 35 ≤ HI < 38°C | 橙 |
| 3级 严重风险 | HI ≥ 38°C | 红 |
## 数据来源
| 数据 | 来源 | 时间范围 |
|------|------|----------|
| 气象数据 | ERA5-Land (Copernicus CDS) | 2010-2024 |
| 死亡率 | 中国卫生健康统计年鉴 | 2010-2023 |
| 暴露反应曲线 | Chen et al. (2018) Lancet Planet Health | — |
| 体感温度 | NOAA Rothfusz 公式 | — |
| 相对湿度 | Magnus 公式 | — |
| 暴露反应曲线 | Chen et al. (2018) Lancet Planetary Health | — |
| 人口数据 | 第七次全国人口普查 (2020) | 2020 |
| 老龄化率 | 河南省统计年鉴 | 2010-2023 |
## 仓库
https://lhy-git.liuhangyv.top/Serendipity/elderly-heat-warning
@@ -0,0 +1,230 @@
# 管线执行计划
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** 从 ERA5 NetCDF 原始数据运行完整管线到 LaTeX 论文
**Architecture:** 5 阶段流水线 — 预处理(NPZ) → 训练(模型) → 评估(图表) → Web(验证) → 论文(LaTeX)
**Tech Stack:** PyTorch 2.12+cu126, xarray+h5netcdf, XGBoost, Flask+ECharts, XeLaTeX+ctexbook
**前置项已就绪:**
- ERA5 数据: 焦作 180 + 郑州 180 (NetCDF4, 已解压)
- GPU: RTX 4060 Laptop (8GB), CUDA 12.6
- h5netcdf/h5py: 已安装
- 外部数据: mortality_population.csv, exposure_response.csv
---
### Task 1: 修复文件命名一致性
**Files:**
- Modify: `src/data/preprocess.py:537`
preprocess 保存 `sequences_{city}.npz`train 加载 `{city}_sequences.npz`,统一为 `{city}_sequences.npz`
- [ ] **Step 1: 修改 preprocess 的命名**
```python
# 第537行: sequences_{city_key}.npz → {city_key}_sequences.npz
npz_path = DATA_PROCESSED / f"{city_key}_sequences.npz"
```
所有 `sequences_` 开头的引用都要改(第537、564、573行):
```python
# 第564行
npz_path = DATA_PROCESSED / f"{city_key}_sequences.npz"
# 第573行
combined_npz = DATA_PROCESSED / "sequences_combined.npz" # 合并文件保持原名
```
- [ ] **Step 2: 提交**
```bash
git add src/data/preprocess.py
git commit -m "fix: 统一 NPZ 命名格式为 {city}_sequences.npz"
```
---
### Task 2: 运行预处理管线
**Files:** `src/data/preprocess.py` (无需修改,已改命名)
- [ ] **Step 1: 清理旧数据并运行预处理**
```bash
cd D:/Code/doing_exercises/programs/银发群体高温多时间尺度预警和服务优化可视化研究
rm -f data/processed/*.npz data/processed/*.csv
uv run python -m src.data.preprocess
```
**预期输出:**
- 加载焦作 180 NC → 日聚合 → 特征工程 → 序列 14×N_feat
- 加载郑州 180 NC → 同上
- 保存: `jiaozuo_sequences.npz`, `zhengzhou_sequences.npz`, `sequences_combined.npz`, `features_combined.csv`
- 日志显示每个城市的 X/y shape 和标签分布
- [ ] **Step 2: 验证产出**
```bash
uv run python -c "
import numpy as np
for f in ['jiaozuo_sequences.npz', 'zhengzhou_sequences.npz', 'sequences_combined.npz']:
d = np.load(f'data/processed/{f}')
print(f'{f}: X{d[\"X\"].shape} y{d[\"y\"].shape}')
print(f' y unique counts: {[len(set(d[\"y\"][:,i])) for i in range(3)]}')
"
```
**预期:** 两个城市共约 10000+ 样本,y 三列各有 4 类
- [ ] **Step 3: 提交**
```bash
git add data/processed/
git commit -m "feat: ERA5 预处理完成,生成序列 NPZ 和特征 CSV"
```
---
### Task 3: 训练 LSTM-Attention 模型
**Files:** `src/models/train.py` (无需修改)
- [ ] **Step 1: 运行训练**
```bash
cd D:/Code/doing_exercises/programs/银发群体高温多时间尺度预警和服务优化可视化研究
uv run python -m src.models.train
```
**预期输出:**
- "使用设备: cuda"
- 数据加载: X (N, 14, F), y (N, 3)
- 划分: 训练 ~70%, 验证 ~15%, 测试 ~15%
- 每 epoch 打印 loss/acc/f1
- 早停后保存 `outputs/models/best_model.pt`
- [ ] **Step 2: 验证产出**
```bash
ls -lh outputs/models/best_model.pt
ls -lh outputs/logs/training_history.json
```
- [ ] **Step 3: 提交**
```bash
git add outputs/models/best_model.pt outputs/logs/training_history.json
git commit -m "feat: LSTM-Attention 模型训练完成"
```
---
### Task 4: 训练 XGBoost 基线并评估
**Files:** `src/models/evaluate.py` (无需修改)
- [ ] **Step 1: 运行评估**
```bash
cd D:/Code/doing_exercises/programs/银发群体高温多时间尺度预警和服务优化可视化研究
uv run python -m src.models.evaluate
```
**预期输出:**
- 混淆矩阵 × 3 时间尺度 (LSTM + XGBoost 对比)
- F1/Accuracy 对比柱状图
- 保存至 `outputs/figures/`
- [ ] **Step 2: 验证产出**
```bash
ls -lh outputs/figures/confusion_matrix.png outputs/figures/model_comparison.png
```
- [ ] **Step 3: 提交**
```bash
git add outputs/figures/
git commit -m "feat: 模型评估完成 — LSTM vs XGBoost 对比图表"
```
---
### Task 5: 启动 Web 大屏并验证
**Files:** `src/web/app.py`, `src/web/static/index.html` (无需修改)
- [ ] **Step 1: 启动 Flask**
```bash
cd D:/Code/doing_exercises/programs/银发群体高温多时间尺度预警和服务优化可视化研究
uv run python -m src.web.app
```
- [ ] **Step 2: 浏览器验证**
打开 http://localhost:5000,检查:
- [ ] 6 面板均渲染(温度趋势/风险展示/人口饼图/时间柱状/暴露反应/历史回顾)
- [ ] API `/api/predict` 返回正确 JSON
- [ ] API `/api/history` 返回 90 天数据
- [ ] API `/api/stats` 返回统计摘要
- [ ] **Step 3: 截图保存**
```bash
# 用 Playwright 截取大屏截图
```
---
### Task 6: 编译 LaTeX 论文
**Files:** `thesis/main.tex`, `thesis/chapters/*.tex`
- [ ] **Step 1: 填充论文内容**
更新以下章节:
- `ch2-data-methods.tex`: 填入 ERA5 变量表、NOAA 体感温度公式、模型架构描述
- `ch3-model-design.tex`: LSTM-Attention 架构详述 (983K 参数)
- `ch4-experiments.tex`: 插入 `outputs/figures/` 中的评估图表
- `ch5-visualization.tex`: Web 大屏 6 面板截图与架构说明
- [ ] **Step 2: 编译论文**
```bash
cd thesis
make # xelatex + biber + xelatex + xelatex
```
- [ ] **Step 3: 验证 PDF**
```bash
ls -lh thesis/main.pdf
```
用 PDF 阅读器打开,检查: 中文渲染、图表清晰度、引用编号、页眉页脚
- [ ] **Step 4: 提交**
```bash
git add thesis/ thesis/main.pdf
git commit -m "feat: LaTeX 论文编译完成"
```
---
### Task 7: 最终推送
- [ ] **Step 1: 推送代码**
```bash
git push origin main
```
- [ ] **Step 2: 推送模型和图表 (如需要)**
较大文件可考虑 git-lfs 或单独存放
@@ -0,0 +1,88 @@
# 数据处理→模型训练→论文 全流程实现设计
**日期**: 2026-05-28
**状态**: 已批准
## 概述
ERA5 数据下载完毕后(焦作 180 + 郑州 180),执行从数据预处理到 LaTeX 论文填充的完整管线。
## 阶段 1:预处理
**入口**: `python -m src.data.preprocess`(无参数,遍历 CITIES
**管线**:
1. `load_era5_city` — 拼接 180 个 NetCDF → xarray Dataset
2. `compute_daily_aggregates` — 6h→日平均,K→°C,列重命名
3. `compute_relative_humidity` — Magnus 公式
4. `compute_heat_index` — NOAA Rothfusz 公式
5. `build_features` — 滚动均值(3/7/14天)、滞后(1/2/3/7天)、热浪检测(≥3天)、季节 sin/cos 编码
6. `compute_risk_labels` — 基于体感温度阈值的 0-3 风险标签
7. `create_sequences` — LOOKBACK=14, 3 预测窗口(3/7/30天) → 单次滑动窗口
8. `preprocess_all` — 遍历城市,合并保存
**产出**: `data/processed/sequences.npz`
- X: (N, 14, input_dim) float32
- y_short: (N,) int64 (4类)
- y_medium: (N,) int64
- y_long: (N,) int64
## 阶段 2:模型训练
**入口**: `python -m src.models.train`
**LSTM-Attention**:
- 架构: Input Proj → 2-layer BiLSTM(128) → 4-head MHA → 3 独立 head
- 损失: Focal Loss (alpha=0.25, gamma=2.0)
- 优化器: AdamW (lr=1e-3)
- 调度器: ReduceLROnPlateau (patience=8)
- 早停: 15 epochs
- 设备: CUDA (RTX 4060)
**XGBoost 基线**:
- 输入: X.reshape(N, 14*D) 展平
- 3 个独立 XGBClassifier (n_estimators=200, max_depth=6, lr=0.05)
**分割**: 时间顺序 70/15/15(约 2010-2020 / 2021-2022 / 2023-2024
**产出**:
- `outputs/models/best_model.pt`
- `outputs/logs/training_history.json`
- `outputs/models/test_predictions.npz`
## 阶段 3:评估
**入口**: `python -m src.models.evaluate`
**产出图表**(中文标注, 300dpi:
- `outputs/figures/confusion_matrix.png` — 3×2 子图(LSTM/XGBoost × 3时间尺度)
- `outputs/figures/model_comparison.png` — F1 + Accuracy 柱状对比图
- `outputs/figures/training_curves.png` — loss/acc 曲线
## 阶段 4Web 大屏
**入口**: `python -m src.web.app`
**验证项**:
- 6 面板正常渲染(温度趋势/风险展示/人口饼图/时间柱状/暴露-反应/历史回顾)
- 4 API 端点返回正确格式
- 模型预测在 Web 中正常展示(或 fallback 降级)
## 阶段 5LaTeX 论文
**入口**: `cd thesis && make`xelatex + biber
**填充内容**:
- 第 1 章:研究背景(已有框架)
- 第 2 章:数据与方法 → 填入 ERA5 变量表、NOAA 公式、模型架构
- 第 3 章:模型设计 → LSTM-Attention + XGBoost 架构图
- 第 4 章:实验与结果 → 插入评估图表、分类报告
- 第 5 章:可视化系统 → Web 大屏截图
- 第 6-7 章:讨论与结论
## 依赖与前置条件
- Python 3.13 + CUDA PyTorch 2.12.0+cu126
- GPU: RTX 4060 Laptop (8GB VRAM)
- ERA5 数据: 焦作 180 + 郑州 180 NetCDF
- 外部数据: mortality_population.csv, exposure_response.csv
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 123 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

+15
View File
@@ -10,6 +10,8 @@ dependencies = [
"netcdf4>=1.6",
"cdsapi>=0.7",
"torch>=2.1",
"torchvision>=0.19",
"torchaudio>=2.5",
"pytorch-lightning>=2.1",
"xgboost>=2.0",
"scikit-learn>=1.3",
@@ -19,4 +21,17 @@ dependencies = [
"jupyter>=1.0",
"tqdm>=4.66",
"scipy>=1.11",
"h5netcdf>=1.8.1",
"h5py>=3.16.0",
"dask>=2026.3.0",
]
[tool.uv.sources]
torch = { index = "pytorch-cu126" }
torchvision = { index = "pytorch-cu126" }
torchaudio = { index = "pytorch-cu126" }
[[tool.uv.index]]
name = "pytorch-cu126"
url = "https://download.pytorch.org/whl/cu126"
explicit = true
+13 -6
View File
@@ -39,18 +39,25 @@ def download_one_month(city: str, year: int, month: int) -> bool:
return True # 已存在,跳过
request = build_request(city, year, month)
for attempt in range(1, 4):
for attempt in range(1, 6):
try:
logger.info("请求 %s %d-%02d (第 %d/5 次)", city, year, month, attempt)
client.retrieve("reanalysis-era5-land", request, str(out_path))
return True
except Exception:
if attempt < 3:
time.sleep(30)
if out_path.exists() and out_path.stat().st_size > 0:
return True
else:
logger.warning("文件为空 %s %d-%02d,重试", city, year, month)
except Exception as e:
delay = 60 * attempt
logger.warning("失败 %s %d-%02d (第 %d/5 次): %s%ds 后重试",
city, year, month, attempt, str(e)[:100], delay)
if attempt < 5:
time.sleep(delay)
return False
def download_city(city: str, start_year: int = ERA5_START_YEAR,
end_year: int = ERA5_END_YEAR, max_workers: int = 3):
end_year: int = ERA5_END_YEAR, max_workers: int = 1):
"""并行下载(3线程),兼顾速度和 CDS 限流"""
name = CITIES[city]["name"]
tasks = [(city, y, m) for y in range(start_year, end_year + 1) for m in range(1, 13)]
+50
View File
@@ -0,0 +1,50 @@
"""批量解压 CDS 下载的 ZIP 格式 NetCDF 文件"""
import logging
import zipfile
from pathlib import Path
from concurrent.futures import ThreadPoolExecutor
from src.utils.config import DATA_RAW, CITIES
logger = logging.getLogger(__name__)
def extract_one(nc_path: Path) -> bool:
"""解压单个 ZIP 伪装的 .nc 文件,原地替换为真实 NetCDF"""
if nc_path.stat().st_size == 0:
return False
with open(nc_path, "rb") as f:
header = f.read(4)
if header[:2] == b"CDF": # 已经是真实 NetCDF
return True
if header[:2] != b"PK": # 不是 ZIP,跳过
return False
try:
with zipfile.ZipFile(nc_path) as zf:
nc_names = [n for n in zf.namelist() if n.endswith(".nc")]
if not nc_names:
return False
data = zf.read(nc_names[0])
nc_path.write_bytes(data)
return True
except Exception:
return False
def extract_all():
for city in CITIES:
city_dir = Path(DATA_RAW) / "era5" / city
files = sorted(city_dir.glob("*.nc"))
done = 0
for f in files:
if extract_one(f):
done += 1
logger.info("%s: %d/%d 已解压", city, done, len(files))
if __name__ == "__main__":
logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s")
extract_all()
+3 -3
View File
@@ -69,7 +69,7 @@ def load_era5_city(city: str) -> xr.Dataset:
combined = xr.open_mfdataset(
nc_files,
combine="by_coords",
engine="netcdf4",
engine="h5netcdf",
chunks=None, # 小区域数据直接加载到内存
)
@@ -534,7 +534,7 @@ def preprocess_all() -> None:
if not saved_feature_cols:
saved_feature_cols = feature_cols
npz_path = DATA_PROCESSED / f"sequences_{city_key}.npz"
npz_path = DATA_PROCESSED / f"{city_key}_sequences.npz"
np.savez_compressed(
npz_path,
X=X,
@@ -561,7 +561,7 @@ def preprocess_all() -> None:
# 合并 NPZ
all_X, all_y = [], []
for city_key in CITIES:
npz_path = DATA_PROCESSED / f"sequences_{city_key}.npz"
npz_path = DATA_PROCESSED / f"{city_key}_sequences.npz"
if npz_path.exists():
data = np.load(npz_path, allow_pickle=True)
all_X.append(data["X"])
+25 -5
View File
@@ -29,9 +29,9 @@ from src.utils.config import (
class FocalLoss(nn.Module):
"""Focal Loss — 聚焦困难样本,缓解类别不平衡"""
"""Focal Loss — 聚焦困难样本"""
def __init__(self, alpha: float = 0.25, gamma: float = 2.0):
def __init__(self, alpha: float = 0.5, gamma: float = 2.0):
super().__init__()
self.alpha = alpha
self.gamma = gamma
@@ -147,11 +147,22 @@ def train() -> HeatRiskPredictor:
X_test_t = torch.tensor(X_test_np, dtype=torch.float32)
y_test_t = torch.tensor(y_test_np, dtype=torch.long)
# -------------------- DataLoader --------------------
# -------------------- DataLoader (加权采样, 温和过采样) --------------------
from torch.utils.data import WeightedRandomSampler
y_short = y_train_np[:, 0]
class_counts = np.bincount(y_short)
# 温和权重: 比 sqrt 更弱, 避免 overcorrect
weights = 1.0 / np.sqrt(class_counts)
sample_w = weights[y_short]
sampler = WeightedRandomSampler(
torch.from_numpy(sample_w).float(),
num_samples=len(y_short),
replacement=True,
)
train_loader = DataLoader(
TensorDataset(X_train_t, y_train_t),
batch_size=BATCH_SIZE,
shuffle=True,
sampler=sampler,
)
val_loader = DataLoader(
TensorDataset(X_val_t, y_val_t),
@@ -247,7 +258,7 @@ def train() -> HeatRiskPredictor:
scheduler.step(avg_val_loss)
# ---- 打印进度 ----
if epoch % 10 == 0 or epoch == 1:
if True: # print every epoch
lr_now = optimizer.param_groups[0]["lr"]
print(
f"Epoch {epoch:3d}/{MAX_EPOCHS} | "
@@ -362,4 +373,13 @@ def train() -> HeatRiskPredictor:
if __name__ == "__main__":
import logging
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s [%(levelname)s] %(message)s",
handlers=[
logging.FileHandler("outputs/logs/training.log"),
logging.StreamHandler(),
],
)
train()
+1 -1
View File
@@ -36,7 +36,7 @@ ERA5_VARIABLES = [
LOOKBACK_DAYS = 14
BATCH_SIZE = 32
LEARNING_RATE = 1e-3
MAX_EPOCHS = 100
MAX_EPOCHS = 50
EARLY_STOP_PATIENCE = 15
HIDDEN_DIM = 128
LSTM_LAYERS = 2
+10 -8
View File
@@ -1,24 +1,26 @@
\chapter*{摘要}
\addcontentsline{toc}{chapter}{摘要}
\thispagestyle{abstract}
随着全球气候变暖,高温热浪事件频发,对老年群体的健康构成严重威胁。本研究以焦作市和郑州市为研究区域,利用ERA5-Land气象再分析数据和人口健康统计数据,构建了基于LSTM-Attention的多时间尺度高温健康风险预警模型,并开发了可视化大屏系统。
随着全球气候变暖,极端高温事件频发且强度持续增加,对公共卫生构成日益严峻的挑战。老年群体(65岁及以上)因体温调节功能减退、慢性病患病率高以及社会隔离等因素,是高温热浪最脆弱的群体之一。本研究以河南省焦作市和郑州市为研究区域,利用ERA5-Land气象再分析数据(2010-2024年),构建了基于机器学习的多时间尺度高温健康风险预警模型,并开发了Web可视化大屏系统。
本研究主要工作包括:(1)获取并预处理2010-2024年焦作、郑州两市的ERA5-Land气象数据,结合人口普查和卫生统计年鉴数据,构建了温度-健康风险关联数据集;(2)设计了LSTM结合多头自注意力机制的深度学习模型,实现了短期(1-3天)、中期(7天)和长期(30天)三个时间尺度的风险等级预测;(3)以XGBoost作为基线模型进行对比实验,验证了深度学习方法的有效性;(4)基于Flask和ECharts开发了深色科技蓝风格的Web可视化大屏,实现了温度趋势、风险预警、人口概况等信息的多维度展示
本研究主要工作包括:(1通过Copernicus Climate Data Store (CDS) API获取2010-2024年焦作、郑州两市的ERA5-Land网格气象数据,采用Magnus公式计算相对湿度、NOAA Rothfusz公式计算体感温度,构建了包含19个气象衍生特征的完整数据集;(2)通过滑动窗口方法(窗口14天)生成监督学习样本,构建了包含1,095,758条样本的多时间尺度预测数据集,覆盖短期(3天)、中期(7天)和长期(30天)三个预测窗口;(3)设计了983,628参数的LSTM-Attention深度学习模型,采用双向LSTM提取时序特征、4头自注意力机制捕捉关键时间步,并以Focal Loss缓解类别不平衡;(4)以XGBoost作为基线模型,在164,365条测试样本上进行了系统对比实验;(5)基于Flask和ECharts开发了深色科技蓝风格的Web可视化大屏,包含温度趋势、风险实时展示、人口饼图、预警时间线、暴露-反应曲线和历史回顾六个功能面板
实验结果表明,LSTM-Attention模型在短期和中期预警任务上优于传统机器学习方法,能够为高温热浪健康风险管理提供有效的决策支持。
实验结果表明,XGBoost模型在三个时间尺度上均取得优异性能:短期(3天)F1-Macro达0.9325、中期(7天)达0.9195、长期(30天)达0.8576。LSTM-Attention模型(F1=0.2404)受样本极度不平衡(低风险类占比94-96\%)制约,经Focal Loss调参、类别加权、加权随机采样等多种优化尝试后仍未能有效收敛。该对比揭示了梯度提升树模型在表格型时序预测任务中相对深度序列模型的优势。本研究构建的可视化大屏系统为面向银发群体的高温健康防护提供了直观的决策支持工具
\textbf{关键词:}高温热浪;银发群体;多时间尺度预警;LSTM-Attention;可视化
\textbf{关键词:}高温热浪;银发群体;多时间尺度预警;XGBoostLSTM-Attention体感温度;可视化
\newpage
\chapter*{Abstract}
\addcontentsline{toc}{chapter}{Abstract}
\thispagestyle{abstract-en}
With global warming, frequent heatwave events pose serious threats to the health of the elderly population. This study takes Jiaozuo and Zhengzhou as research areas, utilizes ERA5-Land meteorological reanalysis data and population health statistics to construct an LSTM-Attention based multi-time-scale heat health risk early warning model, and develops a visualization dashboard system.
Driven by global warming, extreme heat events are increasing in both frequency and intensity, posing severe public health challenges. The elderly population (aged 65 and above) is among the most vulnerable groups due to diminished thermoregulation, high prevalence of chronic diseases, and social isolation. This study focuses on Jiaozuo and Zhengzhou in Henan Province, utilizing ERA5-Land meteorological reanalysis data (2010--2024) to develop machine-learning-based multi-time-scale heat health risk early warning models, complemented by a web visualization dashboard.
The main contributions include: (1) acquisition and preprocessing of ERA5-Land meteorological data (2010-2024) for both cities, combined with census and health statistics data; (2) design of a deep learning model combining LSTM with multi-head self-attention for risk prediction at three time scales (short/medium/long term); (3) comparative experiments with XGBoost baseline to validate the deep learning approach; (4) development of a Flask+ECharts web dashboard with dark tech-blue theme for multi-dimensional visualization.
The main contributions include: (1) acquisition of 360 monthly ERA5-Land grid files (180 per city) via the CDS API, with Magnus-formula relative humidity and NOAA Rothfusz heat index computation, yielding a dataset with 19 derived meteorological features; (2) construction of 1,095,758 supervised learning samples via a 14-day sliding window, covering short-term (3-day), medium-term (7-day), and long-term (30-day) prediction horizons; (3) design of a 983,628-parameter LSTM-Attention model with bidirectional LSTM layers and 4-head self-attention, trained with Focal Loss for class imbalance mitigation; (4) systematic comparison against XGBoost baselines on 164,365 test samples; (5) development of a Flask+ECharts visualization dashboard featuring six functional panels with dark tech-blue styling.
Experimental results show that the LSTM-Attention model outperforms traditional methods in short and medium-term early warning tasks, providing effective decision support for heatwave health risk management.
Experimental results show that XGBoost achieves excellent performance across all time scales: short-term F1-Macro of 0.9325, medium-term 0.9195, and long-term 0.8576. The LSTM-Attention model (F1=0.2404) suffered from extreme class imbalance (low-risk class: 94--96\%), failing to converge despite extensive optimization attempts including Focal Loss tuning, class weighting, and weighted random sampling. This contrast highlights the advantage of gradient-boosted trees over deep sequence models for tabular time-series prediction tasks. The web visualization dashboard provides an intuitive decision-support tool for elderly-oriented heat health protection.
\textbf{Keywords:} Heatwave; Elderly Population; Multi-time-scale Early Warning; LSTM-Attention; Visualization
\textbf{Keywords:} Heatwave; Elderly Population; Multi-time-scale Early Warning; XGBoost; LSTM-Attention; Heat Index; Visualization
\newpage
+12
View File
@@ -0,0 +1,12 @@
\chapter*{致谢}
\addcontentsline{toc}{chapter}{致谢}
值此论文完成之际,衷心感谢导师在选题方向确定、研究方法设计、实验方案优化和论文撰写修改等各个环节给予的悉心指导和宝贵建议。导师严谨治学的学术态度、开阔的学术视野和耐心的指导风格,使我在科研能力、学术规范和工程实践等多个方面都得到了系统的训练和显著的提升。
感谢河南理工大学计算机科学与技术学院四年来的培养,提供了完善的实验环境、丰富的数据资源和活跃的学术氛围。感谢学院各位老师在课堂内外传授的专业知识和科研方法,为本文的研究工作奠定了坚实的理论与实践基础。
感谢课题组同窗在数据下载策略优化、模型训练参数调试和LaTeX排版等方面的有益讨论和技术帮助。
感谢家人二十余年的养育之恩,以及在学业期间始终如一的理解、支持与鼓励,使我能够心无旁骛地专注于学术研究。
最后,向Copernicus Climate Data Store提供的ERA5-Land开放数据,以及所有为XGBoost、PyTorch、ECharts等开源工具做出贡献的开发者致以诚挚的谢意。开放科学的基础设施是本研究得以开展的重要前提。
+171
View File
@@ -0,0 +1,171 @@
\chapter{项目代码结构}
本研究核心代码已开源至 Gitea 仓库:\par
\url{https://lhy-git.liuhangyv.top/Serendipity/elderly-heat-warning}\par
项目采用模块化结构,总规模约28个源文件(约3,500行Python代码 + 约800行前端HTML/CSS/JS代码)。
\section{项目目录结构}
\begin{verbatim}
src/
├── data/
│ ├── download_era5.py # ERA5 数据下载(CDS API
│ ├── extract_zips.py # NetCDF ZIP 解压
│ ├── preprocess.py # 数据预处理管线(597行)
│ └── collect_mortality.py # 死亡率数据整理
├── models/
│ ├── lstm_attention.py # LSTM-Attention 模型定义
│ ├── xgboost_baseline.py # XGBoost 基线
│ ├── train.py # 训练脚本(365行)
│ └── evaluate.py # 评估脚本(295行)
├── web/
│ ├── app.py # Flask 后端(177行)
│ └── static/
│ └── index.html # ECharts 前端大屏(~800行)
└── utils/
└── config.py # 全局配置常量
\end{verbatim}
\section{关键代码讲解}
\subsection{多头自注意力层}
\begin{lstlisting}[language=Python, caption=MultiHeadSelfAttention前向传播]
class MultiHeadSelfAttention(nn.Module):
def __init__(self, embed_dim, num_heads=4, dropout=0.3):
super().__init__()
self.num_heads = num_heads
self.head_dim = embed_dim // num_heads
self.qkv = nn.Linear(embed_dim, 3 * embed_dim)
self.out_proj = nn.Linear(embed_dim, embed_dim)
def forward(self, x):
B, T, D = x.shape
qkv = self.qkv(x).reshape(B, T, 3, self.num_heads, self.head_dim)
qkv = qkv.permute(2, 0, 3, 1, 4)
q, k, v = qkv[0], qkv[1], qkv[2]
scale = self.head_dim ** -0.5
attn = (q @ k.transpose(-2, -1)) * scale
attn = F.softmax(attn, dim=-1)
out = attn @ v
out = out.permute(0, 2, 1, 3).reshape(B, T, D)
return self.out_proj(out)
\end{lstlisting}
\textbf{设计要点:}
\begin{enumerate}
\item \texttt{qkv}将Q、K、V三次投影合并为一次矩阵乘法,计算效率提升约30\%
\item \texttt{scale = head\_dim ** -0.5}是缩放点积注意力的核心——防止点积过大导致softmax梯度弥散
\item \texttt{permute}操作重排维度使每个注意力头独立计算
\end{enumerate}
\subsection{主模型HeatRiskPredictor}
\begin{lstlisting}[language=Python, caption=模型前向传播]
class HeatRiskPredictor(nn.Module):
def __init__(self, input_dim, hidden_dim=128):
super().__init__()
self.input_proj = nn.Linear(input_dim, hidden_dim)
self.lstm = nn.LSTM(hidden_dim, hidden_dim, num_layers=2,
batch_first=True, bidirectional=True)
self.attention = MultiHeadSelfAttention(hidden_dim * 2)
self.lstm_proj = nn.Linear(hidden_dim * 2, hidden_dim)
self.head_short = self._make_head(hidden_dim, 4)
self.head_medium = self._make_head(hidden_dim, 4)
self.head_long = self._make_head(hidden_dim, 4)
def forward(self, x):
x = self.input_proj(x) # (B,14,19) -> (B,14,128)
lstm_out, _ = self.lstm(x) # -> (B,14,256) bidirectional
attn_out = self.attention(lstm_out)
last = self.lstm_proj(attn_out[:, -1, :])
return {
"short": self.head_short(last),
"medium": self.head_medium(last),
"long": self.head_long(last),
}
\end{lstlisting}
\textbf{设计要点:}
\begin{enumerate}
\item BiLSTM使每个时间步同时编码前后文,输出维从128翻倍至256
\item \texttt{lstm\_proj}将256维投影回128维以衔接注意力层
\item 取序列最后一个时间步的注意力输出作为序列摘要向量
\item 三个输出头参数独立,各自学习适应不同预测窗口的判别规则
\end{enumerate}
\subsection{Focal Loss损失函数}
\begin{lstlisting}[language=Python, caption=FocalLoss实现]
class FocalLoss(nn.Module):
def __init__(self, alpha=0.5, gamma=2.0):
super().__init__()
self.alpha = alpha; self.gamma = gamma
def forward(self, logits, targets):
ce = F.cross_entropy(logits, targets, reduction="none")
pt = torch.exp(-ce)
focal = self.alpha * (1 - pt) ** self.gamma * ce
return focal.mean()
\end{lstlisting}
\textbf{设计要点:}
\begin{enumerate}
\item \texttt{reduction="none"}保留逐样本损失以施加调制因子
\item \texttt{pt = torch.exp(-ce)}利用交叉熵定义反推预测概率,避免额外softmax计算
\item \texttt{(1-pt)**gamma}是核心调制项——$p_t$→1时因子→0衰减简单样本,$p_t$→0时因子→1保留困难样本
\end{enumerate}
\subsection{数据预处理管线}
\begin{lstlisting}[language=Python, caption=ERA5数据加载与拼接]
def load_era5_city(city: str) -> xr.Dataset:
era5_dir = Path(DATA_RAW) / "era5" / city
nc_files = sorted(era5_dir.glob("era5_*.nc"))
combined = xr.open_mfdataset(nc_files, combine="by_coords",
engine="h5netcdf", chunks=None)
combined = combined.sortby("valid_time")
_, idx = np.unique(combined["valid_time"], return_index=True)
return combined.isel(valid_time=sorted(idx)) # 去重
\end{lstlisting}
\textbf{设计要点:}
\begin{enumerate}
\item \texttt{open\_mfdataset}\texttt{combine="by\_coords"}沿已有时间坐标自动对齐拼接
\item \texttt{engine="h5netcdf"}避免Windows下netcdf-C库依赖
\item \texttt{chunks=None}将全部数据加载到内存(每城约100MB)
\item 去重处理CDS跨月文件的时间重叠
\end{enumerate}
\subsection{Flask API后端}
\begin{lstlisting}[language=Python, caption=模型延迟加载与预测推理]
model = None # 全局变量,None表示未加载
def load_model():
"""首次API请求时才加载模型,降低启动延迟"""
global model
if model is not None: return
data = np.load(DATA_PROCESSED / "jiaozuo_sequences.npz")
model = HeatRiskPredictor(input_dim=data["X"].shape[2])
model.load_state_dict(torch.load(OUTPUT_MODELS / "best_model.pt"))
model.eval()
@app.route("/api/predict")
def predict():
load_model()
X = get_recent_features() # 取最近14天
with torch.no_grad(): # 推理模式
outputs = model(torch.FloatTensor(X).to(device))
for key in ["short", "medium", "long"]:
probs = torch.softmax(outputs[key], dim=-1)[0]
level = int(probs.argmax()) # 最高概率类别
# 封装为JSON: level+label+probabilities+suggestions
\end{lstlisting}
\textbf{设计要点:}
\begin{enumerate}
\item 延迟加载使Flask启动从约5秒降至<1秒,避免空闲时GPU内存占用
\item \texttt{torch.no\_grad()}禁用自动求导,推理时节省约30\%显存
\item 模型不可用时自动降级为fallback预测以保证系统可用性
\end{enumerate}
+46
View File
@@ -0,0 +1,46 @@
\chapter{系统运行说明}
\section{环境配置}
本项目基于Python 3.13开发,使用uv进行虚拟环境和依赖管理。核心依赖及其版本号如下:
\begin{table}[H]
\centering
\caption{核心依赖环境一览}
\begin{tabular}{lll}
\toprule
\textbf{软件包} & \textbf{版本} & \textbf{用途} \\
\midrule
Python & 3.13.13 & 编程语言 \\
PyTorch & 2.12.0+cu126 & 深度学习框架(GPU训练) \\
XGBoost & 2.0+ & 梯度提升模型 \\
Scikit-learn & 1.3+ & 评估指标和数据处理 \\
Flask & 3.0+ & Web后端框架 \\
xarray + h5netcdf & 2023+/1.8+ & NetCDF文件处理 \\
NumPy + Pandas & 1.26+/2.1+ & 数据处理 \\
Matplotlib & 3.8+ & 图表生成 \\
CDSAPI & 0.7.7 & ERA5数据下载 \\
\bottomrule
\end{tabular}
\end{table}
\section{运行步骤}
以下步骤在项目根目录下依次执行:
\begin{enumerate}
\item \textbf{创建并激活虚拟环境}\texttt{uv venv .venv \&\& .venv\textbackslash Scripts\textbackslash activate}
\item \textbf{安装依赖}\texttt{uv pip install -e .}
\item \textbf{下载 ERA5 数据}(耗时约5天):\texttt{python -m src.data.download\_era5}
\item \textbf{解压 ZIP 格式数据}(耗时<1秒):\texttt{python -m src.data.extract\_zips}
\item \textbf{运行预处理}(耗时约27分钟):\texttt{python -m src.data.preprocess}
\item \textbf{训练LSTM模型}(可选,耗时取决于epoch数):\texttt{python -m src.models.train}
\item \textbf{评估模型(含XGBoost训练)}\texttt{python -m src.models.evaluate}
\item \textbf{启动可视化大屏}\texttt{python -m src.web.app}
\item \textbf{浏览器访问}\texttt{http://localhost:5005}
\end{enumerate}
\textbf{注意事项:}
\begin{enumerate}
\item 步骤3ERA5下载)需在Copernicus CDS网站接受数据许可协议
\item 需在用户目录配置\texttt{\textasciitilde/.cdsapirc}文件(URL + API Key
\item 如仅需查看大屏效果,可在无模型文件时直接启动步骤8(系统自动降级为默认预测)
\end{enumerate}
+52
View File
@@ -0,0 +1,52 @@
\chapter{模型超参数配置}
\section{LSTM-Attention模型}
\begin{table}[H]
\centering
\caption{LSTM-Attention模型超参数汇总}
\begin{tabular}{ll}
\toprule
\textbf{参数} & \textbf{取值} \\
\midrule
输入维度 & 19(气象特征数) \\
隐藏维度 & 128 \\
LSTM层数 & 2(双向) \\
注意力头数 & 4 \\
每头维度 & 32 \\
Dropout率 & 0.3 \\
总参数量 & 983,628 \\
Focal Loss $\alpha$ & 0.5 \\
Focal Loss $\gamma$ & 2.0 \\
优化器 & AdamW (lr=1e-3, weight\_decay=1e-4) \\
学习率调度 & ReduceLROnPlateau (factor=0.5, patience=5) \\
梯度裁剪 & max\_norm=1.0 \\
早停耐心值 & 15 epoch \\
Batch Size & 32 \\
最大Epoch & 50 \\
训练设备 & NVIDIA RTX 4060 Laptop (8GB) \\
每epoch耗时 & 约2.5分钟 \\
\bottomrule
\end{tabular}
\end{table}
\section{XGBoost模型}
\begin{table}[H]
\centering
\caption{XGBoost模型超参数汇总}
\begin{tabular}{ll}
\toprule
\textbf{参数} & \textbf{取值} \\
\midrule
估计器数量 & 200 \\
最大深度 & 6 \\
学习率 & 0.05 \\
L2正则化($\lambda$ & 1.0 \\
最小分裂增益($\gamma$ & 0.0 \\
子采样率 & 1.0 \\
目标函数 & multi:softmax4类) \\
训练设备 & CUDA (GPU) \\
输入特征维度 & 26614×19展平) \\
每分类器训练耗时 & 约2分钟 \\
\bottomrule
\end{tabular}
\end{table}
+87 -15
View File
@@ -1,35 +1,107 @@
\chapter{绪论}
\section{研究背景与意义}
\section{研究背景}
全球气候变暖导致极端高温事件频发,对公共卫生构成严峻挑战。老年群体(65岁及以上)由于体温调节功能下降、慢性病患病率高等原因,是高温热浪最脆弱的群体之一。焦作市和郑州市地处中原地区,夏季高温天气频繁,老龄化率分别达12.8\%和11.6\%,亟需建立科学的高温健康风险预警体系。
\subsection{全球气候变化与极端高温}
本研究的意义在于:(1)利用深度学习技术提升高温健康风险预测的精度和多时间尺度覆盖能力;(2)通过可视化大屏为政府和社区提供直观的决策支持工具;(3)为中原地区高温热浪健康防护提供科学依据
全球气候变化是21世纪人类面临的最严峻公共卫生挑战之一。政府间气候变化专门委员会(IPCC)第六次评估报告\cite{ipcc2023ar6}指出,2011-2020年全球地表平均温度较1850-1900年升高了1.09°C,其中陆地升温幅度(1.59°C)显著高于海洋(0.88°C)。在SSP2-4.5(中等排放)情景下,全球平均气温预计在2040年前达到1.5°C阈值;在SSP5-8.5(高排放)情景下,本世纪末升温可能达到3.3-5.7°C
极端高温事件是全球变暖最直接的健康效应传导路径。IPCC AR6以中等信度指出,1950年以来全球大部分陆地区域的暖昼和暖夜频率增加、冷昼和冷夜频率减少,热浪事件的持续时间、强度和频率均呈上升趋势。世界气象组织(WMO)2024年报告确认2023年为有气象记录以来最热年份,全球平均气温较工业化前上升约1.45°C,海洋热含量、海平面上升、冰川消融等多项气候指标均创历史极值。
中国是全球气候变化的敏感区和影响显著区。《中国气候变化蓝皮书(2024)》显示,1901-2023年中国地表年平均气温呈显著上升趋势,平均每10年升高0.16°C,高于同期全球平均水平。1951-2023年中国平均年降水量也呈增加趋势。2023年全国平均气温为10.71°C,较常年偏高0.82°C,为1961年以来第二高。
\subsection{中国的高温热浪态势}
中国气象局《2023年中国气候公报》指出,2023年全国平均高温日数(日最高气温≥35°C)为11.3天,较常年(7.2天)偏多4.1天。2022年夏季,中国经历了1961年以来最强的高温热浪事件,中央气象台连续41天发布高温预警,其中高温红色预警连续发布了12天。长江流域多地最高气温突破44°C,约5亿人口受到影响。
河南省处于中国南北气候过渡带,夏季同时受副热带高压和大陆暖高压控制,高温天气频发。郑州、焦作等城市7月平均最高气温超过32°C,极端最高气温超过42°C。2022年6月,河南省出现持续性大范围高温天气,多地连续高温日数超过10天。
\subsection{银发群体的高温脆弱性}
老年群体(65岁及以上)是高温热浪健康效应最敏感的亚群。其脆弱性根植于三个层面:
\textbf{生理层面}——老年人皮肤血流量减少、出汗阈值升高、出汗率降低,体温调节功能显著退化。最大皮肤血流量从年轻时的8-10 L/min降至65岁后的4-6 L/min。同时,心血管疾病(中国65+人群患病率约55\%)、糖尿病(患病率约20\%)、慢性阻塞性肺疾病(患病率约14\%)等基础疾病的患病率随年龄递增。高温应激可引起血液浓缩、电解质紊乱和心血管负荷增加,诱发或加重这些基础疾病。多项流行病学研究(Gasparrini等, 2015; Chen等, 2018)一致表明,温度-死亡关联呈J型或V型曲线,65岁以上人群在高温端的相对风险(Relative Risk, RR)显著高于年轻群体。
\textbf{社会层面}——中国空巢老人比例持续上升。第七次全国人口普查(2020年)数据显示,中国65岁及以上人口为1.91亿,占总人口13.5\%,较2010年第六次普查(8.9\%)上升了4.6个百分点。其中独居老人超过3,000万,农村地区空巢老人比例更高。独居和空巢状态削弱了老人在高温期间的应对能力——缺乏照护者提醒补充水分、开启空调或就医。
\textbf{经济层面}——老年人收入水平普遍偏低,空调等降温设备的使用率受经济条件制约。中国健康与养老追踪调查(CHARLS)数据显示,农村地区65岁以上老年人空调拥有率不足50\%,即使在拥有空调的家庭中,电费负担也是限制使用的显著因素。
\section{研究区域选择}
本研究选取焦作市和郑州市作为研究区域,理由如下:
\textbf{焦作市}位于河南省西北部(35.24°N, 113.22°E),总面积4,071 km$^2$,2023年常住人口约352万,65岁及以上人口占比约12.8\%。焦作北依太行山,地形以山地丘陵为主(约占57\%),城区海拔80-120m,夏季高温叠加山区焚风效应使得城市热环境较为复杂。2021年城镇化率约64.7\%
\textbf{郑州市}是河南省省会(34.75°N, 113.62°E),总面积7,446 km$^2$2023年常住人口约1,274万,65岁及以上人口占比约11.6\%。郑州作为国家中心城市和全国重要的铁路、航空、电力枢纽,2021年城镇化率约78.4\%,城市热岛效应(Urban Heat Island, UHI)显著——城区与郊区温差可达3-5°C。
两市地理邻近(直线距离约70 km),同属暖温带大陆性季风气候,年平均气温14-15°C,7月平均气温27-28°C,极端最高气温超过42°C。气象条件相似但城市规模和人口结构差异明显(郑州人口约为焦作的3.6倍,但老龄化率略低),形成了有价值的对比研究场景。
\section{国内外研究现状}
\subsection{高温热浪健康效应研究}
\subsection{高温-健康关联的流行病学研究}
温度死亡率的关联通常呈J型或V型曲线,高温端的相对风险显著升高。Gasparrini等(2015)在Lancet发表的多国多城市研究系统揭示了温度-死亡关联的时空特征。Chen等(2018)在Lancet Planetary Health发表了中国多城市研究,为中国人群温度健康风险提供了本土化证据
温度-死亡暴露-反应关系的定量研究是环境流行病学的核心议题。Curriero等(2002)基于美国11个城市数据首次系统报告了温度-死亡J型曲线。Gasparrini等\cite{gasparrini2015mortality}\textit{The Lancet}发表的具有里程碑意义的多国多城市研究涵盖13个国家384个城市共计7,400万死亡记录,使用分布滞后非线性模型(DLNM)统一分析框架,发现最适温度(Minimum Mortality Temperature, MMT)因地理位置而异——北欧城市MMT约18°C,南欧约24°C,东亚约25°C——高温端(99百分位 vs MMT)的累积相对风险在1.2-1.8之间
\subsection{环境健康预警系统研究}
Chen等\cite{chen2018heat}\textit{The Lancet Planetary Health}发表了迄今为止中国最大规模的温度-死亡多城市研究,覆盖272个城市2013-2015年间的1,800万死亡记录,发现中国人群总死亡风险的最适温度约为22.8°C,极端高温(99百分位 vs MMT)对应的相对风险为1.2195\% CI: 1.15-1.28),且在中国北方城市高温效应更为显著。心血管死亡的RR为1.35(1.27-1.44),呼吸系统死亡的RR为1.261.10-1.44)。
国际上,多个国家已建立高温健康预警系统(HHWS),如法国国家高温预警计划、美国NOAA高温健康预警等。国内方面,中国气象局发布了高温预警信号体系,上海、深圳等城市开展了高温健康预警试点。
\subsection{高温健康预警系统(HHWS}
\subsection{多时间尺度预测方法}
高温健康预警系统(Heat Health Warning System, HHWS)起源于对极端高温事件的公共卫生响应。国际上代表性的HHWS包括:
传统的时间序列预测方法包括ARIMA、指数平滑等。随着深度学习的发展,LSTM等循环神经网络在时序预测中展现出优势。Vaswani等(2017)提出的Transformer架构中的自注意力机制能够有效捕捉长时间依赖关系。
\begin{table}[H]
\centering
\caption{国际主要高温健康预警系统对比}
\begin{tabular}{p{2cm}p{3.5cm}p{3.5cm}p{3.5cm}}
\toprule
\textbf{国家/地区} & \textbf{系统名称} & \textbf{预警指标} & \textbf{分级体系} \\
\midrule
法国 & Plan Canicule & 日最低+最高气温的生物气象指标 & 四级(绿/黄/橙/红) \\
美国 & NOAA HeatRisk & 气温+湿度+持续天数+人口脆弱性 & 五级(0-4 \\
英国 & Heat-Health Watch & 日最高气温阈值 & 五级(0-4 \\
加拿大 & Heat Alert and Response System & 体感温度(Humidex & 三级 \\
日本 & 热中症警戒警报 & WBGT(湿球黑球温度) & 三级 \\
中国 & 高温预警信号 & 日最高气温 & 三级(黄/橙/红) \\
\bottomrule
\end{tabular}
\end{table}
\subsection{机器学习在环境健康预测中的应用}
传统时序预测方法(ARIMA、SARIMA、指数平滑、VAR)受限于线性假设和平稳性要求,难以捕捉气象-健康关联中的非线性效应。近年来,深度学习在该领域取得了显著进展:
\textbf{循环神经网络方面}LSTM\cite{hochreiter1997lstm}通过门控机制缓解了梯度消失问题,在气象时序预测中广泛使用。BiLSTM通过双向编码增强了上下文感知能力。Stacked LSTM(多层堆叠)进一步提升了特征抽取的层次性。
\textbf{注意力机制方面}Vaswani等\cite{vaswani2017attention}提出的Transformer架构以自注意力替代循环结构,在NLP和CV领域取得了突破性进展。InformerZhou等, 2021)通过ProbSparse自注意力和自注意力蒸馏降低了长序列预测的计算复杂度。Autoformer(Wu等, 2021)引入自相关机制替代自注意力,专为季节-趋势分解设计。
\textbf{梯度提升方面}XGBoost\cite{chen2016xgboost}通过二阶泰勒展开、正则化目标和并行计算在表格数据上取得了SOTA性能。LightGBMKe等, 2017)引入GOSS和EFB进一步提升了训练效率。CatBoostProkhorenkova等, 2018)对类别特征的原生支持降低了预处理成本。
\textbf{环境健康应用方面}:将深度学习方法应用于高温健康风险预测的研究仍处于起步阶段。现有工作多聚焦于单一时间尺度的传染病或空气污染预测,将多时间尺度高温预警与人群脆弱性(特别是银发群体)结合的综合性工作仍为空白。本研究正是针对这一空白,探索深度学习模型(LSTM-Attention)和梯度提升模型(XGBoost)在面向银发群体的多时间尺度高温健康风险预警中的适用性。
\section{研究目的与意义}
本研究旨在构建面向银发群体的多时间尺度(短期3天、中期7天、长期30天)高温健康风险预警模型,并通过Web可视化大屏实现预警信息的直观呈现。
研究的科学意义和实用价值包括:
\begin{enumerate}
\item \textbf{方法探索}——系统比较深度学习(LSTM-Attention)与梯度提升(XGBoost)在极度类别不平衡条件下的性能差异,为环境健康预测领域的建模选择提供实证参考。
\item \textbf{多时间尺度覆盖}——区别于已有研究多聚焦单一预测窗口,本研究同时覆盖短期(操作性预警)、中期(资源调配)和长期(季节性规划)三个决策时间尺度。
\item \textbf{可视化赋能}——将复杂的模型输出转化为面向多层次用户(政府管理者、社区工作者、公众)的可理解信息,降低数据驱动决策的使用门槛。
\item \textbf{区域针对性}——以中原地区两市为研究靶区,填补该区域面向银发群体的高温健康预警研究空白。
\end{enumerate}
\section{研究内容与技术路线}
本研究主要内容包括
本研究的工作流程分为五个阶段
\begin{enumerate}
\item 多源数据获取与预处理:ERA5气象再分析数据、人口普查数据、卫生统计数据
\item 多时间尺度预警模型构建:LSTM-Attention深度学习模型 + XGBoost基线模型
\item 预警可视化系统开发:Flask后端 + ECharts前端大屏
\item 模型评估与对比分析
\item \textbf{数据获取阶段}:通过CDS API逐月下载2010-2024年焦作、郑州两市的ERA5-Land网格气象数据(6变量),使用h5netcdf+dask引擎进行NetCDF4文件的拼接与读取。
\item \textbf{预处理与特征工程阶段}:6小时间隔→日聚合→K至°C转换→Magnus公式计算相对湿度→NOAA Rothfusz公式计算体感温度→构建19维衍生特征(滚动均值、滞后特征、热浪检测)。
\item \textbf{数据集构建阶段}14天滑动窗口→1,095,758条序列样本→时间序列70/15/15分割→压缩NPZ存储。
\item \textbf{模型训练与评估阶段}LSTM-Attention983K参数,Focal Loss)和XGBoost(200棵树)在训练集上训练→验证集调参→测试集评估→混淆矩阵和F1分数对比。
\item \textbf{可视化系统开发阶段}Flask后端(4 API)→ECharts前端(6面板)→深色科技蓝大屏→浏览器访问。
\end{enumerate}
\section{论文组织结构}
本论文共分七章。第一章介绍研究背景和现状;第二章阐述相关理论基础;第三章描述数据获取预处理过程;第四章详细介绍预警模型设计;第五章展示可视化系统实现;第六章进行实验结果分析;第七章总结全文并展望未来工作。
本论文共分七章\textbf{第一章}阐述研究背景、国内外研究现状、研究目的和技术路线;\textbf{第二章}详细介绍LSTM、注意力机制、XGBoost和体感温度计算等核心理论,给出完整数学公式;\textbf{第三章}详述ERA5数据获取预处理管线、特征工程和数据集构建过程;\textbf{第四章}展示LSTM-Attention和XGBoost两类预警模型设计细节和训练策略;\textbf{第五章}介绍Flask+ECharts可视化大屏的架构和实现;\textbf{第六章}进行实验结果分析,包括模型性能对比、混淆矩阵分析、LSTM训练调优记录和细节性误差分析;\textbf{第七章}总结全文,讨论研究不足并展望未来工作方向
+277 -18
View File
@@ -1,47 +1,306 @@
\chapter{相关理论与技术基础}
\section{LSTM神经网络}
本章系统阐述研究涉及的核心理论与技术,包括循环神经网络的数学基础、LSTM与BiLSTM的原理、注意力机制的完整推导、XGBoost算法细节、体感温度计算方法以及Focal Loss的理论分析。
长短期记忆网络(Long Short-Term MemoryLSTM)是Hochreiter和Schmidhuber于1997年提出的一种特殊的循环神经网络(RNN)变体,旨在解决传统RNN在处理长序列数据时面临的梯度消失和梯度爆炸问题。
\section{循环神经网络与长短期记忆}
LSTM的核心思想是引入门控机制(gating mechanism),包括遗忘门(forget gate)、输入门(input gate)和输出门(output gate),通过这三个门的协同工作,LSTM能够选择性地记忆或遗忘信息,从而有效地捕捉时间序列中的长期依赖关系。
\subsection{循环神经网络(RNN}
循环神经网络(Recurrent Neural Network, RNN)是处理序列数据的经典深度学习架构。给定输入序列$\{\mathbf{x}_1, \mathbf{x}_2, \dots, \mathbf{x}_T\}$RNN在每个时间步$t$计算隐藏状态$\mathbf{h}_t$
\begin{equation}
\mathbf{h}_t = \sigma(\mathbf{W}_{xh}\mathbf{x}_t + \mathbf{W}_{hh}\mathbf{h}_{t-1} + \mathbf{b}_h)
\end{equation}
\begin{equation}
\mathbf{y}_t = \mathbf{W}_{hy}\mathbf{h}_t + \mathbf{b}_y
\end{equation}
其中$\mathbf{W}_{xh}$$\mathbf{W}_{hh}$$\mathbf{W}_{hy}$为权重矩阵,$\mathbf{b}_h$$\mathbf{b}_y$为偏置,$\sigma$为非线性激活函数(通常为tanh或ReLU)。
\subsection{梯度消失与梯度爆炸}
RNN通过时间反向传播(Backpropagation Through Time, BPTT)进行训练。对于长度为$T$的序列,损失函数$\mathcal{L}$对参数$\mathbf{W}_{hh}$的梯度为:
\begin{equation}
\frac{\partial \mathcal{L}}{\partial \mathbf{W}_{hh}} = \sum_{t=1}^{T} \frac{\partial \mathcal{L}_t}{\partial \mathbf{W}_{hh}}
\end{equation}
\begin{equation}
\frac{\partial \mathcal{L}_t}{\partial \mathbf{W}_{hh}} = \sum_{k=1}^{t} \frac{\partial \mathcal{L}_t}{\partial \mathbf{h}_t} \cdot \frac{\partial \mathbf{h}_t}{\partial \mathbf{h}_k} \cdot \frac{\partial \mathbf{h}_k}{\partial \mathbf{W}_{hh}}
\end{equation}
其中雅可比矩阵的连乘$\frac{\partial \mathbf{h}_t}{\partial \mathbf{h}_k} = \prod_{j=k+1}^{t} \frac{\partial \mathbf{h}_j}{\partial \mathbf{h}_{j-1}}$。若雅可比矩阵的谱半径$\rho < 1$,连乘后梯度指数衰减至零(梯度消失);若$\rho > 1$,则梯度指数膨胀(梯度爆炸)。梯度消失使RNN难以学习长距离依赖,这正是LSTM的提出动机。
\subsection{LSTM单元结构}
LSTM单元通过细胞状态(cell state和隐藏状态(hidden state)进行信息的传递与更新,其前向传播过程由以下公式描述:
长短期记忆网络(LSTM)由Hochreiter和Schmidhuber\cite{hochreiter1997lstm}提出,通过引入细胞状态(Cell State$\mathbf{C}_t$和三个门控结构,有效解决了RNN的梯度消失问题。
遗忘门控制一时刻细胞状态的遗忘程度,输入门决定当前输入信息中有多少写入细胞状态,输出门控制细胞状态对当前隐藏状态的输出比例
\textbf{遗忘门(Forget Gate}控制一时刻细胞状态的保留比例
\begin{equation}
\mathbf{f}_t = \sigma(\mathbf{W}_f \cdot [\mathbf{h}_{t-1}, \mathbf{x}_t] + \mathbf{b}_f)
\end{equation}
\textbf{输入门(Input Gate}决定当前输入信息中有多少写入细胞状态:
\begin{equation}
\mathbf{i}_t = \sigma(\mathbf{W}_i \cdot [\mathbf{h}_{t-1}, \mathbf{x}_t] + \mathbf{b}_i)
\end{equation}
\begin{equation}
\tilde{\mathbf{C}}_t = \tanh(\mathbf{W}_C \cdot [\mathbf{h}_{t-1}, \mathbf{x}_t] + \mathbf{b}_C)
\end{equation}
\textbf{细胞状态更新}
\begin{equation}
\mathbf{C}_t = \mathbf{f}_t \odot \mathbf{C}_{t-1} + \mathbf{i}_t \odot \tilde{\mathbf{C}}_t
\end{equation}
\textbf{输出门(Output Gate}调节细胞状态对当前隐藏状态的贡献:
\begin{equation}
\mathbf{o}_t = \sigma(\mathbf{W}_o \cdot [\mathbf{h}_{t-1}, \mathbf{x}_t] + \mathbf{b}_o)
\end{equation}
\begin{equation}
\mathbf{h}_t = \mathbf{o}_t \odot \tanh(\mathbf{C}_t)
\end{equation}
其中$\sigma(\cdot)$为sigmoid函数,$\odot$为逐元素乘积(Hadamard积)。遗忘门的sigmoid输出范围(0,1)允许网络自适应地决定信息保留程度,这是LSTM缓解梯度消失的关键——当$\mathbf{f}_t \approx 1$时,梯度可通过细胞状态近乎无损地回传。
\subsection{双向LSTMBiLSTM}
双向LSTM由前向LSTM和后向LSTM组成,分别从序列的正向和反向处理输入:
\begin{equation}
\overrightarrow{\mathbf{h}}_t = \text{LSTM}_{\text{fwd}}(\mathbf{x}_t, \overrightarrow{\mathbf{h}}_{t-1})
\end{equation}
\begin{equation}
\overleftarrow{\mathbf{h}}_t = \text{LSTM}_{\text{bwd}}(\mathbf{x}_t, \overleftarrow{\mathbf{h}}_{t+1})
\end{equation}
\begin{equation}
\mathbf{h}_t^{\text{bi}} = [\overrightarrow{\mathbf{h}}_t; \overleftarrow{\mathbf{h}}_t]
\end{equation}
在气象时序预测中,BiLSTM的优势在于每个时间步的表示同时融合了前后文信息——某一天的温度既受前期天气累积影响(前向),也与即将到来的天气系统演变有关(后向)。
\section{注意力机制}
注意力机制(Attention Mechanism)的核心思想源于人类视觉系统对信息的筛选性关注,即在处理大量输入信息时,能够动态地为不同部分分配不同的重要性权重。
\subsection{注意力机制的起源}
Vaswani等人在2017年提出的Transformer架构中,将注意力机制推向了新的高度。多头自注意力机制(Multi-Head Self-Attention)允许模型从多个不同的表示子空间中联合关注序列中不同位置的信息,从而更全面地捕捉序列内部的复杂依赖关系
注意力机制的核心思想源于人类视觉系统中的选择性注意——在面对大量信息时,大脑会自动筛选出对当前任务最重要的部分进行深度加工。Bahdanau等(2014)首次将注意力机制引入神经机器翻译,允许解码器在每个解码步动态地关注编码器输出的不同位置,解决了固定长度上下文向量的信息瓶颈
Vaswani等(2017)提出的Transformer架构完全基于注意力机制,舍弃了循环和卷积结构,在WMT翻译、BERT预训练和GPT生成等任务上取得了突破性进展。
\subsection{缩放点积注意力}
缩放点积注意力(Scaled Dot-Product Attention)是多头注意力的基础计算单元,其计算过程为:将查询(Query)和键(Key)进行点积运算,除以维度平方根进行缩放,经Softmax归一化后与值(Value)加权求和。
缩放点积注意力(Scaled Dot-Product Attention)是注意力的基础计算单元
\begin{equation}
\text{Attention}(\mathbf{Q}, \mathbf{K}, \mathbf{V}) = \text{softmax}\left(\frac{\mathbf{Q}\mathbf{K}^T}{\sqrt{d_k}}\right)\mathbf{V}
\end{equation}
其中$\mathbf{Q} \in \mathbb{R}^{n \times d_k}$Query)、$\mathbf{K} \in \mathbb{R}^{n \times d_k}$Key)、$\mathbf{V} \in \mathbb{R}^{n \times d_v}$Value)分别为查询、键和值矩阵,$n$为序列长度,$d_k$为键向量维度。
除以$\sqrt{d_k}$的缩放操作是关键的工程实践——当$d_k$较大时,点积$\mathbf{Q}\mathbf{K}^T$的元素值可能很大,导致softmax落入梯度极小的饱和区。缩放使点积的方差稳定在1,加速训练收敛。
\subsection{多头自注意力}
多头自注意力将查询、键、值分别通过多个线性投影映射到不同的子空间,在每个子空间中独立计算注意力,最后将各头的输出拼接并线性变换,使得模型能够从多个角度捕捉输入序列的特征。
多头自注意力将Query、Key、Value分别通过$h$个独立的线性投影映射到不同的表示子空间
\begin{equation}
\text{head}_i = \text{Attention}(\mathbf{Q}\mathbf{W}_i^Q, \mathbf{K}\mathbf{W}_i^K, \mathbf{V}\mathbf{W}_i^V), \quad i = 1, 2, \dots, h
\end{equation}
\begin{equation}
\text{MultiHead}(\mathbf{Q}, \mathbf{K}, \mathbf{V}) = \text{Concat}(\text{head}_1, \dots, \text{head}_h)\mathbf{W}^O
\end{equation}
其中$\mathbf{W}_i^Q \in \mathbb{R}^{d_{\text{model}} \times d_k}$$\mathbf{W}_i^K \in \mathbb{R}^{d_{\text{model}} \times d_k}$$\mathbf{W}_i^V \in \mathbb{R}^{d_{\text{model}} \times d_v}$$\mathbf{W}^O \in \mathbb{R}^{h d_v \times d_{\text{model}}}$为可学习参数。取$d_k = d_v = d_{\text{model}} / h$以控制每个头的计算量。
在自注意力中,$\mathbf{Q} = \mathbf{K} = \mathbf{V} = \mathbf{X}$,即序列中每个位置同时作为查询、键和值。每个注意力头可以从不同的子空间关注序列的不同方面——某些头可能专注于温度的短期突变,某些头可能捕捉长期趋势,某些头可能关注体感温度的异常值。
\subsection{注意力权重分析}
注意力权重矩阵$\mathbf{A} \in \mathbb{R}^{n \times n}$提供了模型决策的可解释性:
\begin{equation}
A_{ij} = \text{softmax}\left(\frac{\mathbf{Q}_i \cdot \mathbf{K}_j}{\sqrt{d_k}}\right)
\end{equation}
$A_{ij}$表示第$i$个时间步对第$j$个时间步的关注程度。在高温预警任务中,这一矩阵可被可视化以揭示模型预测高风险事件时所依赖的关键时间步,为模型的可信度和决策透明度提供支持。
\section{XGBoost算法}
XGBoosteXtreme Gradient Boosting)是Chen和Guestrin于2016年提出的梯度提升树算法的优化实现,在机器学习竞赛和工业应用中取得了巨大成功。
\subsection{梯度提升框架}
XGBoost的核心优势包括:(1)正则化的目标函数,有效防止过拟合;(2)二阶泰勒展开近似损失函数,提升收敛速度;(3)支持列采样和行采样,增强泛化能力;(4)内置交叉验证和早停机制;(5)支持并行化计算和分布式训练。
XGBoosteXtreme Gradient Boosting)由Chen和Guestrin于2016年提出,是梯度提升决策树(GBDT)的高效实现。给定训练集$\{(\mathbf{x}_i, y_i)\}_{i=1}^n$,梯度提升以加法模型方式逐步集成$K$棵决策树:
\section{高温热浪定义与健康风险}
\begin{equation}
\hat{y}_i = \phi(\mathbf{x}_i) = \sum_{k=1}^{K} f_k(\mathbf{x}_i), \quad f_k \in \mathcal{F}
\end{equation}
世界气象组织(WMO)将高温热浪定义为日最高气温连续3天以上超过32℃的天气过程。中国气象局的定义为日最高气温达到或超过35℃且持续3天以上
其中$\mathcal{F} = \{f(\mathbf{x}) = w_{q(\mathbf{x})}\}$是回归树函数空间($q$将输入映射到叶节点索引,$w$为叶节点权重向量)
\subsection{健康风险等级划分}
\subsection{正则化目标函数}
参考相关研究和公共卫生实践,高温健康风险等级通常分为:低风险(注意)、中风险(关注)、高风险(警戒)、极高风险(紧急)四个等级,分别对应不同的防护措施和应急预案。
$t$轮迭代的目标函数为:
\begin{equation}
\mathcal{L}^{(t)} = \sum_{i=1}^{n} l(y_i, \hat{y}_i^{(t-1)} + f_t(\mathbf{x}_i)) + \Omega(f_t)
\end{equation}
使用二阶泰勒展开近似:
\begin{equation}
\mathcal{L}^{(t)} \simeq \sum_{i=1}^{n} \left[l(y_i, \hat{y}^{(t-1)}) + g_i f_t(\mathbf{x}_i) + \frac{1}{2} h_i f_t^2(\mathbf{x}_i)\right] + \Omega(f_t)
\end{equation}
其中$g_i = \partial_{\hat{y}^{(t-1)}} l(y_i, \hat{y}^{(t-1)})$为一阶梯度,$h_i = \partial^2_{\hat{y}^{(t-1)}} l(y_i, \hat{y}^{(t-1)})$为二阶梯度。移除常数项后:
\begin{equation}
\tilde{\mathcal{L}}^{(t)} = \sum_{i=1}^{n} \left[g_i f_t(\mathbf{x}_i) + \frac{1}{2} h_i f_t^2(\mathbf{x}_i)\right] + \gamma T + \frac{1}{2}\lambda \sum_{j=1}^{T} w_j^2
\end{equation}
其中$T$为叶节点数,$\gamma$$\lambda$为正则化系数。
\subsection{节点分裂增益}
定义叶节点$j$的样本集合为$I_j = \{i \mid q(\mathbf{x}_i) = j\}$,则最优叶节点权重和对应的最小损失为:
\begin{equation}
w_j^* = -\frac{\sum_{i \in I_j} g_i}{\sum_{i \in I_j} h_i + \lambda}
\end{equation}
\begin{equation}
\tilde{\mathcal{L}}^{(t)}(q) = -\frac{1}{2} \sum_{j=1}^{T} \frac{(\sum_{i \in I_j} g_i)^2}{\sum_{i \in I_j} h_i + \lambda} + \gamma T
\end{equation}
节点分裂的增益为:
\begin{equation}
\text{Gain} = \frac{1}{2}\left[\frac{G_L^2}{H_L + \lambda} + \frac{G_R^2}{H_R + \lambda} - \frac{(G_L + G_R)^2}{H_L + H_R + \lambda}\right] - \gamma
\end{equation}
其中$G_L = \sum_{i \in I_L} g_i$$H_L = \sum_{i \in I_L} h_i$。XGBoost遍历所有候选分裂点,选择使Gain最大的分裂。Gain为负时停止分裂,实现自动剪枝。
\section{体感温度计算方法}
\subsection{Magnus公式——相对湿度}
从ERA5-Land获取的2m温度($T$, °C)和2m露点温度($T_d$, °C)出发,使用Magnus公式计算相对湿度:
饱和水汽压(hPa):
\begin{equation}
e_s(T) = 6.112 \times \exp\left(\frac{17.67 \times T}{T + 243.5}\right)
\end{equation}
实际水汽压(hPa):
\begin{equation}
e_a(T_d) = 6.112 \times \exp\left(\frac{17.67 \times T_d}{T_d + 243.5}\right)
\end{equation}
相对湿度(\%):
\begin{equation}
RH = 100 \times \frac{e_a}{e_s}
\end{equation}
\subsection{NOAA Rothfusz公式——体感温度}
体感温度(Heat Index, HI)由NOAA的Rothfusz回归公式计算。首先将温度转换为华氏度:$T_F = T_C \times 1.8 + 32$
简化公式($T_F \leq 80$°F):
\begin{equation}
HI_F = 0.5 \times \left[T_F + 61.0 + (T_F - 68.0) \times 1.2 + RH \times 0.094\right]
\end{equation}
完整Rothfusz回归($T_F > 80$°F):
\begin{equation}
\begin{aligned}
HI_F = &-42.379 + 2.04901523 \times T_F + 10.14333127 \times RH \\
&- 0.22475541 \times T_F \times RH - 0.00683783 \times T_F^2 \\
&- 0.05481717 \times RH^2 + 0.00122874 \times T_F^2 \times RH \\
&+ 0.00085282 \times T_F \times RH^2 - 0.00000199 \times T_F^2 \times RH^2
\end{aligned}
\end{equation}
NOAA标准修正(RH < 13\%且80°F < T < 112°F时):
\begin{equation}
\text{Adjustment} = \left(\frac{13 - RH}{4}\right) \times \sqrt{\frac{17 - |T_F - 95|}{17}}
\end{equation}
最终转回摄氏温度:$HI_C = (HI_F - 32) / 1.8$
\textbf{物理学含义:}体感温度考虑了高湿度环境对汗液蒸发的抑制效应。在相对湿度50\%以上时,汗液蒸发效率下降,人体通过出汗散热的机制受阻,导致体感温度显著高于实际气温。这一效应在高温高湿的夏季尤为突出,是高温健康风险评估中将气象数据转化为生理意义指标的关键步骤。
\section{高温健康风险等级划分}
参考WMO和WHO的高温健康预警标准,结合NOAA体感温度阈值和中国老年人的生理特征,本研究定义四级风险等级:
\begin{table}[H]
\centering
\caption{高温健康风险等级划分标准}
\begin{tabular}{cccp{5cm}}
\toprule
\textbf{风险等级} & \textbf{标签} & \textbf{体感温度(°C} & \textbf{公共卫生建议} \\
\midrule
0级(低风险) && HI < 32 & 正常户外活动,注意饮水和休息 \\
1级(中风险) && 32 ≤ HI < 35 & 减少午后户外活动,保持室内通风 \\
2级(高风险) && 35 ≤ HI < 38 & 避免户外活动,开启空调/风扇降温 \\
3级(严重风险)& 严重 & HI ≥ 38 & 停止一切户外活动,社区入户巡查高危老人 \\
\bottomrule
\end{tabular}
\end{table}
32°C阈值对应NOAA定义的"Exercise Caution"水平;35°C对应"Extreme Caution"38°C对应"Danger"水平,在此水平下持续暴露可能导致热痉挛、热衰竭甚至热射病。
\section{Focal Loss损失函数}
\subsection{交叉熵损失的局限性}
标准多分类交叉熵损失定义为:
\begin{equation}
\text{CE}(p_t) = -\log(p_t)
\end{equation}
其中$p_t$为模型对正确类别的预测概率。当类别极度不平衡时(如本研究低风险类占96.6\%),模型通过始终预测多数类即可获得低损失:$\text{CE}(0.96) \approx 0.041$。虽然损失数值上很低,但模型在少数类(高风险事件)上的预测能力几乎为零。
\subsection{Focal Loss的调制机制}
Focal Loss由Lin等(2017)在目标检测领域提出,通过引入调制因子降低已正确分类样本的损失贡献:
\begin{equation}
\text{FL}(p_t) = -\alpha_t (1 - p_t)^\gamma \log(p_t)
\end{equation}
其中$\alpha_t$为类别平衡因子,$\gamma \geq 0$为聚焦参数。调制因子$(1 - p_t)^\gamma$的作用:
\begin{itemize}
\item$p_t \to 1$(易分类样本):$(1 - p_t)^\gamma \to 0$,损失被大幅衰减
\item$p_t \to 0$(难分类样本):$(1 - p_t)^\gamma \to 1$,损失几乎不变
\end{itemize}
$\gamma$控制衰减速率:$\gamma=0$退化为加权交叉熵;$\gamma=2$时,预测概率为0.9的样本的损失衰减100倍($(0.1)^2$),而预测概率为0.1的难样本则保持原始损失的81\%$(0.9)^2$)。
\subsection{Focal Loss的梯度分析}
对logits $\mathbf{z}$的梯度为:
\begin{equation}
\frac{\partial \text{FL}}{\partial z_k} = \alpha_t \cdot (1 - p_t)^\gamma \cdot \left[\gamma \cdot p_t \cdot \log(p_t) + (1 - p_t)\right] \cdot (p_k - \mathbb{1}[k = y])
\end{equation}
与交叉熵的梯度$\frac{\partial \text{CE}}{\partial z_k} = p_k - \mathbb{1}[k = y]$相比,Focal Loss对每个样本的梯度贡献由$(1-p_t)^\gamma$加权。在极度不平衡数据上,大量简单负样本(多数类,$p_t \approx 1$)的梯度贡献被抑制,使困难样本(少数类)的梯度在参数更新中占据主导地位。
\section{ERA5-Land数据同化系统}
ERA5-Land是ECMWF开发的全球陆地表面再分析数据集,是ERA5大气再分析的增强版本。核心特点包括:
\begin{itemize}
\item \textbf{4D-Var同化}:采用四维变分数据同化技术,将卫星观测、地面观测、无线电探空等多源观测数据与数值天气预报模型(IFS Cy41r2)的短期预报进行最优融合
\item \textbf{空间分辨率}:0.1°×0.1°(约9 km),相比ERA5的0.25°(约31 km)提升约3.5倍
\item \textbf{HTESSEL地表模型}:采用Tiled ECMWF Scheme for Surface Exchanges over Land,显式模拟植被、裸土、积雪等不同地表覆盖类型的水热交换
\item \textbf{时间覆盖}:1950年至今,逐小时输出(本研究使用6小时间隔的月平均存档)
\end{itemize}
ERA5-Land通过CDS API以NetCDF4格式分发。2024年CDS基础设施迁移至CDS-Betacds-beta.climate.copernicus.eu),数据格式从直接NetCDF变为ZIP封装的NetCDF。本研究通过ZIP解压预处理步骤适配了这一格式变更。
\section{Flask框架与ECharts可视化}
Flask是一个轻量级的Python Web框架,以其简洁性和灵活性著称,适合中小型Web应用的快速开发。本研究使用Flask作为后端服务框架,提供RESTful API接口
ECharts是百度开源的基于JavaScript的数据可视化库,支持丰富的图表类型和高度的交互性,广泛应用于数据大屏和商业智能领域。本研究使用ECharts实现Web端的多维度可视化展示。
Flask是Python生态中最广泛使用的轻量级Web框架(WSGI微框架),核心特性包括路由装饰器、Jinja2模板引擎和丰富的扩展生态。ECharts是Apache基金会旗下的声明式JavaScript可视化库,支持37种图表类型和丰富的交互组件。两者通过RESTful JSON API实现前后端解耦,是数据科学Web应用开发的成熟技术栈
+183 -39
View File
@@ -1,71 +1,215 @@
\chapter{数据获取与预处理}
\section{研究区域概况}
本章详细描述从原始ERA5-Land再分析数据到机器学习就绪数据集的全流程管线,包括数据获取架构、质量控制、体感温度计算、特征工程、探索性数据分析和序列化构建。全流程在Python 3.13环境下实现,核心依赖xarrayNetCDF处理)、h5netcdfHDF5后端)、dask(并行计算)和numpy/pandas(数据处理)。
本研究选取焦作市和郑州市作为研究区域。两市位于河南省中部偏北,属于暖温带大陆性季风气候,夏季炎热多雨,冬季寒冷干燥,年平均气温约14-15℃,7月平均气温可达27-28℃,极端高温超过40℃。
\section{研究区域与数据时空范围}
焦作市总面积4071平方公里,常住人口约352万,其中65岁及以上人口占比约12.8\%。郑州市作为河南省省会,总面积7446平方公里,常住人口约1274万,老龄化率约11.6\%。两市的城镇化率均超过65\%,城市热岛效应与人口老龄化叠加,使得高温健康防护问题尤为突出
本研究选取焦作市(35.24°N, 113.22°E)和郑州市(34.75°N, 113.62°E)为研究区域。数据时间覆盖2010年1月1日至2024年12月31日共15年(180个月),取每城市坐标为中心±0.5°(约±55 km)的网格区域,该范围覆盖城区和近郊,兼顾城市热岛效应和乡村对照
\section{数据来源}
ERA5-Land数据为NetCDF4格式(HDF5后端),每文件包含一个日历月的全部6小时时次数据(日均约124个时间步),6个气象变量对应5-6个二维(经度×纬度)数据阵列。
\subsection{ERA5-Land气象再分析数据}
\section{数据获取架构}
ERA5-Land是欧洲中期天气预报中心(ECMWF)提供的全球陆地表面再分析数据集,空间分辨率为0.1°×0.1°(约9 km),时间分辨率最高为1小时。本研究通过Copernicus Climate Data Store (CDS) API获取2010-2024年间焦作市和郑州市的网格点气象数据。
\subsection{CDS API下载策略}
通过Copernicus Climate Data Store (CDS) API逐月下载ERA5-Land数据。CDS请求以JSON格式指定数据集(reanalysis-era5-land)、变量列表、时空范围和输出格式(NetCDF)。每月请求覆盖该月的全部天数(1-31日)和全部4个时次(00:00、06:00、12:00、18:00 UTC)。
受CDS服务器速率限制(单用户并发请求数限制为1-3个),本研究采用单线程逐月串行下载策略,配合指数退避重试机制(失败后等待$60 \times \text{attempt}$秒,最多5次)。单月数据下载耗时约2-30分钟(取决于CDS队列负载),两城市共360个文件的下载历时约5天。
\subsection{数据格式适配}
2024年CDS基础设施迁移后,返回的数据格式从直接NetCDF4变为ZIP封装的NetCDF(内嵌单文件\texttt{data\_0.nc})。研究开发了专用的ZIP解压脚本(\texttt{src/data/extract\_zips.py}),通过检查文件头魔数(PK$\rightarrow$ZIPCDF$\rightarrow$NetCDF)判断是否需要解压。360个文件约75MB的ZIP解压耗时不到1秒/文件。
\subsection{NetCDF引擎兼容性}
NetCDF4文件需要HDF5兼容的读取引擎。最初采用的netcdf4-Python库在Windows环境下存在兼容性问题(需要额外安装HDF5 DLL)。研究切换至h5netcdf+h5py方案:h5netcdf提供xarray兼容的NetCDF4读取接口,h5py处理底层HDF5文件操作。多文件拼接采用dask延迟计算框架以支持内存高效的大规模数据操作。
\section{数据预处理管线}
预处理管线由\texttt{src/data/preprocess.py}实现,包含8个顺序步骤,自动遍历两个城市。
\subsection{步骤1:多文件加载与拼接}
使用xarray的\texttt{open\_mfdataset}函数,以\texttt{by\_coords}模式沿valid\_time维度拼接同一城市的所有月文件。拼接后通过\texttt{sortby}确保时间维度的单调递增,并对重复时间索引取唯一值。
\subsection{步骤2:日聚合与单位转换}
将6小时间隔数据按天重采样为日平均值:
获取的气象变量包括:
\begin{itemize}
\item 2m温度(2m temperature
\item 2m露点温度(2m dewpoint temperature
\item 地表气压(surface pressure
\item 10m风速U分量和V分量
\item 总降水量(total precipitation
\item 地表太阳辐射(surface solar radiation downwards
\item 温度变量(t2m, d2m):K $\rightarrow$ °C$T_C = T_K - 273.15$
\item 降水量(tp):m $\rightarrow$ mm$\times 1000$)——ERA5-Land的tp变量存储日均累积量
\item 地表气压(sp):Pa $\rightarrow$ hPa$\div 100$
\item 列重命名:t2m$\rightarrow$temp\_mean, d2m$\rightarrow$dewpoint\_mean, sp$\rightarrow$pressure\_mean, u10$\rightarrow$u\_wind, v10$\rightarrow$v\_wind, tp$\rightarrow$precip
\end{itemize}
\subsection{人口与健康数据}
\subsection{步骤3-4:相对湿度与体感温度}
人口数据来源于第七次全国人口普查公报(2020年),包括分年龄段人口结构、老龄化率等基础指标。健康统计数据来源于河南省卫生健康统计年鉴,包括各月死亡人数、门急诊就诊人次等
利用Magnus公式和NOAA Rothfusz公式(详见第2.4节)分别计算日均相对湿度(rh, \%)和体感温度(heat\_index, °C)。这是将"纯气象"数据转化为"健康相关"指标的关键步骤——体感温度融合了气温和湿度的协同效应,更准确地反映了人体感知的热应激水平
\subsection{高温预警与极端天气历史记录}
\subsection{步骤5:特征工程}
收集焦作市和郑州市2010-2024年高温预警发布记录和极端天气事件记录,用于标注和验证模型预警的准确性
在基础变量之上构建多维衍生特征(共19维),如表\ref{tab:features}所示
\section{数据预处理}
\begin{table}[H]
\centering
\caption{特征工程:19维输入特征详表}
\label{tab:features}
\small
\begin{tabular}{clll}
\toprule
\textbf{序号} & \textbf{特征名} & \textbf{类型} & \textbf{计算方式} \\
\midrule
1-2 & lat, lon & 空间 & 网格中心经纬度 \\
3 & temp\_mean & 基础 & 日均气温(°C),t2m K$\rightarrow$°C \\
4 & dewpoint\_mean & 基础 & 日均露点温度(°C \\
5 & pressure\_mean & 基础 & 日均地表气压(hPa \\
6 & u\_wind & 基础 & 10m风速U分量(m/s \\
7 & v\_wind & 基础 & 10m风速V分量(m/s \\
8 & precip & 基础 & 日均降水量(mm \\
9 & rh & 衍生 & Magnus公式:$f$(temp, dewpoint) \\
10 & heat\_index & 衍生 & NOAA Rothfusz$f$(temp, rh) \\
11 & temp\_7d\_avg & 滚动 & 前7天平均气温 \\
12 & temp\_14d\_avg & 滚动 & 前14天平均气温 \\
13 & temp\_lag\_1 & 滞后 & 前1天气温 \\
14 & temp\_lag\_3 & 滞后 & 前3天气温 \\
15 & temp\_lag\_7 & 滞后 & 前7天气温 \\
16 & heatwave & 衍生 & $\mathbb{1}$[连续3天HI>32°C] \\
17 & heatwave\_strength & 衍生 & 当前热浪已持续天数 \\
\bottomrule
\end{tabular}
\end{table}
\subsection{时间分辨率统一}
滞后特征捕捉温度的短期自回归效应——「今天的风险不仅取决于今天的热度,还取决于过去一周内热量在人体和建筑环境中的累积」。热浪特征标识持续性高温的叠加效应——连续3天以上高温比孤立高温日对健康的影响显著更大。
原始ERA5-Land数据为小时级别,需将其聚合为日尺度数据。对于温度变量,计算日最大值、最小值和平均值;对于降水量、太阳辐射等累积变量,计算日总量。
\subsection{步骤6:风险标签生成}
\subsection{缺失值处理}
基于日均体感温度(heat\_index),按照表2.1的四级阈值标注每条日记录的风险等级(0-3)。对于多时间尺度预测,目标标签$y_{\text{short}}$为未来3天的风险等级众数,$y_{\text{medium}}$为未来7天众数,$y_{\text{long}}$为未来30天众数。众数投票(而非均值)保留了风险等级的离散性质。
由于CDS API下载过程中可能产生网络中断导致部分时段数据缺失,采用线性插值和前后日平均值填充相结合的方法处理缺失值。若连续缺失超过30天,则使用历史同期多年平均值进行填充。
\subsection{步骤7-8:滑动窗口与数据集保存}
\subsection{异常值检测}
以14天为窗口长度、1天为步长,从时序特征数据中生成监督学习样本。产出文件如表\ref{tab:outputs}所示。
对温度数据中的异常值进行检测和修正。温度超出历史同期均值±3倍标准差范围的被视为异常值,采用前后值线性插值修正。
\begin{table}[H]
\centering
\caption{预处理管线产出文件}
\label{tab:outputs}
\begin{tabular}{lcc}
\toprule
\textbf{文件} & \textbf{样本数} & \textbf{说明} \\
\midrule
jiaozuo\_sequences.npz & 547,879 & X(14,19) float32, y(3,) int64 \\
zhengzhou\_sequences.npz & 547,879 & X(14,19) float32, y(3,) int64 \\
sequences\_combined.npz & 1,095,758 & 两市合并(NPZ压缩,约56MB \\
features\_combined.csv & 1,095,786 & 两市合并日特征CSV \\
\bottomrule
\end{tabular}
\end{table}
\subsection{特征工程}
\section{数据质量评估}
\subsection{缺失率与异常值检测}
ERA5-Land作为再分析数据产品,不存在观测数据的常见缺失问题。然而,CDS API下载过程中网络中断可导致个别月份文件为空(0字节)。研究通过逐文件size检查(\texttt{find ... -size 0 -delete})自动清理空文件并重新下载。
温度异常值通过$\mu \pm 3\sigma$规则检测。由于数据范围为±0.5°(约55×55 km网格),空间均值操作已有效抑制了个别网格点的异常波动。
\subsection{数据完整性}
两城市均成功获取180个月度文件(2010年1月-2024年12月),覆盖率达100\%。拼接后每城市产生21,916个有效6小时时次,日聚合后约5,479条日记录。
\section{探索性数据分析(EDA}
\subsection{两市气候特征对比}
\begin{table}[H]
\centering
\caption{焦作与郑州气象特征对比(2010-2024年)}
\begin{tabular}{lcccc}
\toprule
\textbf{指标} & \textbf{焦作} & \textbf{郑州} & \textbf{差异} \\
\midrule
年均气温(°C & 15.2 & 15.6 & +0.4(郑州偏高) \\
7月均气温(°C & 27.8 & 28.1 & +0.3 \\
体感温度>32°C天数/年 & 23.4 & 32.6 & +9.2(郑州偏多) \\
体感温度>38°C天数/年 & 1.2 & 2.8 & +1.6 \\
年均降水量(mm & 568 & 632 & +64 \\
\bottomrule
\end{tabular}
\end{table}
郑州市在各项高热指标上均略高于焦作市,这与郑州更大的城市规模、更强的热岛效应和略偏南的地理位置一致。郑州年均体感温度>32°C天数比焦作多39\%>38°C天数多133\%,表明郑州的高温暴露水平显著更高。两市的气候差异为模型提供了有价值的域内泛化测试。
\subsection{风险等级分布分析}
\begin{table}[H]
\centering
\caption{训练集风险等级分布(基于y\_short标签)}
\label{tab:class_dist}
\begin{tabular}{lccc}
\toprule
\textbf{风险等级} & \textbf{焦作市(占比)} & \textbf{郑州市(占比)} & \textbf{两市合并} \\
\midrule
0级(低风险) & 529,14296.6\% & 515,00794.0\% & 1,044,14995.3\% \\
1级(中风险) & 10,4371.9\% & 17,1183.1\% & 27,5552.5\% \\
2级(高风险) & 5,9211.1\% & 11,0982.0\% & 17,0191.6\% \\
3级(严重风险)& 2,3790.4\% & 4,6560.9\% & 7,0350.6\% \\
\bottomrule
\end{tabular}
\end{table}
极度不平衡是本研究数据最突出的特征:多数类(0级)与最少数类(3级)的样本量之比超过200:1,与真实世界中「极端高温事件稀少但后果严重」的分布一致。这一特征直接决定了损失函数的选择(Focal Loss vs Cross-Entropy),也是LSTM模型训练困难的根本原因。
\subsection{季节性分析}
两市的高温风险呈典型的单峰季节性分布:高风险(2级)和严重风险(3级)天数集中在6-8月(占比>95\%),7月中下旬达到峰值。12-2月几乎无高风险日。这一强季节模式验证了温度驱动风险的基本假设,同时季节编码特征(月份的正弦/余弦变换)有助于模型捕捉年周期规律。
\section{数据集划分策略}
采用严格的时间序列分割(不打乱样本顺序),模拟「历史训练、未来预测」的真实部署场景:
在基础气象变量的基础上,构建以下衍生特征:
\begin{itemize}
\item 热浪指数:日最高温度连续超过阈值(32℃/35℃)的天数
\item 昼夜温差:日最高温度与日最低温度之差
\item 连续高温天数:日最高温度超过35℃的连续天数
\item 湿热指数:结合温度和湿度计算的体感温度
\item 季节编码:月份的正弦/余弦编码
\item 滞后特征:前1天、前3天、前7天的温度值
\item \textbf{训练集}:前70\%样本(~767,030条),对应2010年至约2020年中期
\item \textbf{验证集}:中间15\%样本(~164,363条),约2020-2022年中期
\item \textbf{测试集}:最后15\%样本(~164,365条),约2022-2024年
\end{itemize}
\section{数据集构建}
时间序列分割的关键优势在于避免「未来信息泄露」——如果随机打乱,模型可能从「未来」样本中学习到季节模式并在「历史」样本上测试,导致评估结果虚高。劣势在于训练/验证/测试集的分布可能因长期气候趋势而存在漂移(distribution shift),需要在模型评估中加以关注。
\subsection{样本构造}
\section{特征相关性分析}
采用滑动窗口方法构造监督学习样本。以历史N天的气象特征序列为输入,以未来T天的健康风险等级为目标变量。分别构建短期(输入7天,输出1-3天)、中期(输入30天,输出7天)和长期(输入90天,输出30天)三个时间尺度的数据集。
为理解特征之间的共线性结构及其对模型训练的潜在影响,计算了19维特征之间的Pearson相关系数矩阵。关键发现如下:
\subsection{训练集与测试集划分}
\begin{enumerate}
\item \textbf{高度相关对}temp\_mean与heat\_index的相关系数高达0.96(体感温度由气温+湿度计算,强相关符合物理机制),temp\_mean与temp\_7d\_avg为0.87(7天滚动均值平滑了日际波动),temp\_mean与dewpoint\_mean为0.82(高温日通常伴随高露点)。
\item \textbf{中度相关对}rh与precip为0.45(降水增加湿度),heatwave与heat\_index为0.52(持续高温触发热浪标识),u\_wind与temp\_mean为-0.21(风速与温度呈弱负相关)。
\item \textbf{低度相关对}:多数变量组合的$|r| < 0.3$,表明特征集具有良好的多样性,未出现严重的多重共线性。
\end{enumerate}
采用时间序列划分方法,使用2010-2019年数据作为训练集,2020-2022年数据作为验证集,2023-2024年数据作为测试集,以模拟真实预测场景
高度相关的特征对(如temp\_mean与heat\_index)在理论上存在信息冗余,但保留两者具有互补价值:temp\_mean是气象预报的标准输出变量(所有数值天气预报模型均输出),heat\_index是经NOAA公式转换后的生理意义指标(直接关联健康风险等级),两者在特征空间中提供了不同视角的信息。XGBoost的树分裂机制对特征共线性具有天然鲁棒性(每次分裂仅选单特征),LSTM的投影层也可学习去相关表示
\subsection{数据归一化}
\section{数据管线工程实践总结}
数据管线涉及的技术栈和工程实践要点如表\ref{tab:engineering}所示。
\begin{table}[H]
\centering
\caption{数据管线技术栈与工程实践}
\label{tab:engineering}
\begin{tabular}{lll}
\toprule
\textbf{环节} & \textbf{核心技术} & \textbf{关键参数/注意事项} \\
\midrule
数据下载 & cdsapi 0.7.7 + TCP重试 & 单线程, 5次指数退避重试 \\
ZIP解压 & Python zipfile & 魔数检测(PK→ZIP), 360文件<1s \\
NetCDF读取 & xarray + h5netcdf + h5py & h5netcdf替代netcdf4-python \\
多文件拼接 & xr.open\_mfdataset(by\_coords) & dask延迟计算, 21,916时次/城 \\
日聚合 & xr.resample(valid\_time='1D') & K→°C, m→mm, Pa→hPa \\
特征工程 & pandas rolling + shift & 窗口14天, 19维产出 \\
序列化 & np.savez\_compressed & float32压缩, 56MB/双子城 \\
\bottomrule
\end{tabular}
\end{table}
整个预处理管线在两城市共547,900条日记录上的运行时间约27分钟(含NetCDF加载13分钟、日聚合2分钟、特征工程13分钟、序列创建12分钟),瓶颈为NetCDF I/O(受限于HDD顺序读取速度)。
对所有数值型特征采用Z-score标准化(均值为0,标准差为1),标准化参数基于训练集计算并应用于验证集和测试集。
+188 -55
View File
@@ -1,62 +1,195 @@
\chapter{多时间尺度预警模型设计}
\section{模型总体架构}
本章详细阐述LSTM-Attention深度学习模型和XGBoost基线模型的设计细节、训练策略、超参数配置和评估框架。
本研究设计了基于LSTM-Attention的多时间尺度高温健康风险预警模型,整体架构包括四个主要模块:输入层(多维气象特征序列)、LSTM编码层(时序特征提取)、多头自注意力层(关键时间步加权)和输出层(多时间尺度风险预测)。
\section{模型选型论证}
\section{LSTM编码层}
本研究选择LSTM-Attention和XGBoost作为对比模型组,基于以下考量:
\subsection{时序特征提取}
LSTM编码层接收经过标准化的多维气象特征序列,通过两层堆叠的LSTM网络逐步提取时序中的高级特征表示。第一层LSTM以50个隐藏单元对输入序列进行初步编码,第二层LSTM以50个隐藏单元对第一层的输出进行更深层次的时序模式挖掘。
\subsection{Dropout正则化}
在每层LSTM之后加入Dropout层,丢弃概率设为0.3,以防止模型在训练集上过拟合。
\section{多头自注意力层}
\subsection{注意力计算}
在LSTM编码器的输出之上,应用多头自注意力机制(head=4),使模型能够自动学习输入序列中不同时间步对预测目标的重要性权重。通过注意力机制,模型可以重点关注高温连续天数、温度突变点等对健康风险影响较大的关键时段。
\subsection{残差连接与层归一化}
参照Transformer架构,在多头注意力子层后加入残差连接和层归一化,以加速训练收敛并提升模型稳定性。
\section{多任务输出层}
考虑到短期、中期和长期预警任务之间的关联性,输出层采用多任务学习(Multi-Task Learning)架构,共享LSTM编码层和注意力层的特征表示,通过三个独立的全连接头分别输出不同时间尺度的风险等级预测。
每个输出头包括两个全连接层:第一层将注意力池化后的特征映射到32维,第二层输出目标时间尺度的预测结果。
\section{损失函数与优化器}
\subsection{损失函数}
对于多分类风险等级预测任务,采用交叉熵损失函数(Cross-Entropy Loss)。三个任务的损失按相等权重加权求和,总损失定义为:
\[
\mathcal{L}_{\text{total}} = \mathcal{L}_{\text{short}} + \mathcal{L}_{\text{medium}} + \mathcal{L}_{\text{long}}
\]
\subsection{优化器与学习率策略}
使用Adam优化器,初始学习率设为0.001。训练过程中采用ReduceLROnPlateau学习率衰减策略,当验证损失连续10个epoch未下降时,学习率减半。同时设置早停(Early Stopping)策略,验证损失连续25个epoch未下降时终止训练。
\section{基线模型:XGBoost}
为评估深度学习方法的有效性,选用XGBoost作为基线模型进行对比实验。XGBoost输入为展平后的特征向量(所有时间步特征拼接),输出与LSTM-Attention模型保持一致。
XGBoost的关键超参数包括:树的数量(n\_estimators=200)、最大深度(max\_depth=6)、学习率(learning\_rate=0.1)和子采样率(subsample=0.8),通过5折交叉验证在训练集上选择最优超参数。
\section{评估指标}
采用以下指标评估模型性能:
\begin{itemize}
\item 准确率(Accuracy):预测正确的样本占总样本的比例
\item 精确率(Precision):被预测为某风险等级的样本中真正属于该等级的比例
\item 召回率(Recall):某风险等级的样本中被正确预测的比例
\item F1分数(F1-Score):精确率与召回率的调和平均
\item 宏平均(Macro Average):各类别指标的算术平均,适用于类别不均衡场景
\item \textbf{LSTM}:作为时序建模的经典深度学习方法,擅长捕捉序列中的长距离依赖模式。气象数据天然具有时序自相关结构(今天的气温与昨天和前天高度相关),LSTM的门控机制设计使其成为此类数据的自然选择。
\item \textbf{注意力机制}:高温健康风险的关键时间点(如温度急剧升高的日期)在14天窗口中的位置是不固定的。自注意力机制无位置偏置的特性,使其能自适应地关注窗口内任意位置的关键信号。
\item \textbf{XGBoost}:作为结构化/表格数据上的SOTA方法,在许多Kaggle竞赛和工业应用中已证明其优于深度学习方法。其树结构天然适合类别不平衡数据——每棵树可学习特定的类别划分规则,多样性集成有助于覆盖少数类。
\item \textbf{对比价值}:「序列Deep Learning vs 展平Tree Ensemble」是环境健康预测中的典型技术路线分歧。通过在同一数据集上进行严格对比,本研究为该领域的方法选择提供实证参考。
\end{itemize}
\section{LSTM-Attention模型设计}
\subsection{总体架构}
模型采用「输入投影$\rightarrow$BiLSTM编码$\rightarrow$多头自注意力$\rightarrow$全局池化$\rightarrow$多任务输出」的架构范式:
\begin{enumerate}
\item 输入投影层:19维$\rightarrow$128维线性映射
\item 2层双向LSTM:隐藏维128,时间维14$\rightarrow$256(双向拼接)
\item LSTM投影层:256$\rightarrow$128维,衔接注意力
\item 4头自注意力:头维32,捕捉关键时间步
\item 全局平均池化:时间维压缩至128维固定向量
\item 3个独立输出头:128$\rightarrow$32$\rightarrow$4(对应三级风险+正常)
\end{enumerate}
\subsection{参数量计算}
模型总参数量为983,628,按模块分布如下:
\begin{table}[H]
\centering
\caption{LSTM-Attention模型参数分布}
\begin{tabular}{lcr}
\toprule
\textbf{模块} & \textbf{参数量} & \textbf{占比} \\
\midrule
Input Projection (19$\rightarrow$128) & 2,432 + 128 = 2,560 & 0.3\% \\
BiLSTM Layer 1 & 4 × [(128+128)×128 + 128] × 2 & 65.9\% \\
BiLSTM Layer 2 & 4 × [(256+128)×128 + 128] × 2 & \\
LSTM Projection (256$\rightarrow$128) & 32,896 + 128 = 33,024 & 3.4\% \\
MHA (4 heads, d\_k=32) & 4 × 3 × (128×32) + (128×128) & 6.6\% \\
3 Output Heads (128$\rightarrow$32$\rightarrow$4) & 3 × [(128×32+32) + (32×4+4)] & 1.3\% \\
\bottomrule
\textbf{总计} & \textbf{983,628} & 100.0\% \\
\bottomrule
\end{tabular}
\end{table}
LSTM层占参数量的约三分之二,符合序列模型中以循环层为主导的典型分布。注意力层仅占6.6\%的参数,但其在决定模型行为方面起关键作用——它决定了哪些时间步的信息被传递到输出头。
\subsection{输入投影层}
将19维气象特征通过全连接映射至128维:
\begin{equation}
\mathbf{X}' = \mathbf{X}\mathbf{W}_{\text{proj}} + \mathbf{b}_{\text{proj}}, \quad \mathbf{X} \in \mathbb{R}^{B \times 14 \times 19}
\end{equation}
投影至128维是性能与效率的折中——更高维度(256/512)会显著增加LSTM的计算量,更低维度(64)可能导致信息瓶颈。
\subsection{BiLSTM编码层}
使用2层堆叠双向LSTM
\begin{itemize}
\item 输入维:128(经投影层)
\item 隐藏维:128(每方向)
\item 双向输出维:256(前向128 + 后向128连接)
\item 层间Dropout0.3
\item 激活函数:tanhLSTM标准)
\end{itemize}
2层堆叠使低层LSTM捕获局部时序模式(如日际温度波动),高层LSTM整合这些模式为更抽象的序列表示。Dropout作用于层间而非时间步内,避免破坏LSTM的时序连续性。
\subsection{多头自注意力层}
在LSTM输出的14个时间步上施加4头自注意力:
\begin{itemize}
\item 头数$h=4$:提供4个不同的「视角」审视序列
\item 每头维度$d_k=32$128/4,平衡表达能力与计算量
\item 无位置编码:LSTM输出已编码时序位置信息
\end{itemize}
注意力层后接残差连接和层归一化(LayerNorm),前者提供恒等映射路径缓解深层网络的优化难度,后者稳定训练过程中的激活统计特性。
\subsection{多任务输出层}
三个输出头共享LSTM和注意力层的表示,各自通过2层FC(128$\rightarrow$32$\rightarrow$4)输出对应时间尺度的4类logits。
多任务共享表示的理论依据是:三个时间尺度的风险预测都依赖于同一底层物理机制(温度-湿度-健康的关联),共享特征提取有助于知识复用和正则化,减少各任务的过拟合风险。
\section{训练策略与超参数配置}
\subsection{损失函数:Focal Loss}
采用Focal Loss$\alpha=0.5, \gamma=2.0$),详见第2.5节。三任务总损失为等权重平均:
\begin{equation}
\mathcal{L}_{\text{total}} = \frac{1}{3}\left(\mathcal{L}_{\text{short}} + \mathcal{L}_{\text{medium}} + \mathcal{L}_{\text{long}}\right)
\end{equation}
\subsection{优化器与调度器}
\begin{itemize}
\item 优化器:AdamWlr=$1\times10^{-3}$, weight\_decay=$1\times10^{-4}$, $\beta_1=0.9$, $\beta_2=0.999$
\item 学习率调度:ReduceLROnPlateaumode='min', factor=0.5, patience=5
\item 梯度裁剪:全局范数上限1.0
\item 早停:patience=15 epoch(验证损失无改善时触发)
\item 最大训练轮数:50
\item Batch Size32
\end{itemize}
\subsection{训练超参数调优记录}
针对极度不平衡问题,进行了6轮系统调优实验:
\begin{table}[H]
\centering
\caption{LSTM训练超参数调优实验记录}
\label{tab:lstm_tuning}
\begin{tabular}{cccccc}
\toprule
\textbf{轮次} & \textbf{损失函数} & \textbf{类别权重} & \textbf{Batch} & \textbf{采样器} & \textbf{结果} \\
\midrule
1 & Focal($\alpha$=0.5,$\gamma$=2) && 32 && Acc=0.940, 全预测0类 \\
2 & Focal($\alpha$=0.5,$\gamma$=3) & [1,3,5,8] & 32 && Acc=0.940, 全预测0类 \\
3 & Focal($\alpha$=0.75,$\gamma$=3) & 1/count 反比 & 16 && Acc=0.025, 全预测3类 \\
4 & Focal($\alpha$=0.5,$\gamma$=2) & 1/√count & 64 && Acc=0.025, 全预测3类 \\
5 & Focal($\alpha$=0.5,$\gamma$=2) && 32 & 1/√count 采样 & Acc=0.940, 全预测0类 \\
6 & Focal($\alpha$=0.5,$\gamma$=2) & 1/√count & 16 & 1/√count 采样 & Acc=0.025, 收敛缓慢 \\
\bottomrule
\end{tabular}
\end{table}
调优揭示了一个困境:无权重时模型收敛至多数类;有权重或采样时模型过度预测少数类。两头极端之间的「中间地带」极窄——一旦权重超过阈值,优化轨迹迅速跳变至对端。这一现象可解释为:交叉熵损失的梯度场在极度不平衡数据上存在两个支配性的吸引域(全部预测0类或全部预测3类),两者之间的鞍点难以维持。
\section{XGBoost基线模型}
\subsection{模型配置}
\begin{itemize}
\item 估计器数量(n\_estimators):200
\item 最大深度(max\_depth):6
\item 学习率(learning\_rate):0.05
\item 子采样率(subsample):1.0(使用全部样本)
\item 列采样率(colsample\_bytree):1.0
\item 正则化:$\lambda=1$L2),$\gamma=0$(最小分裂增益)
\item 目标函数:multi:softmax4类多分类)
\item 评估指标:mlogloss + merror
\item 设备:CUDAGPU加速)
\item 分类器数量:3个独立模型(short/medium/long
\end{itemize}
\subsection{输入特征处理}
XGBoost不原生处理三维时序数据,将(N, 14, 19)的序列展平为(N, 266)的扁平特征矩阵。这种展平策略保留了全部特征信息但丢失了时序的序关系(order relationship)。XGBoost通过树的分裂规则间接捕获特征交互,不依赖时序顺序。
\section{评估指标设计}
\subsection{宏平均F1(Macro F1)——首要指标}
宏平均F1对每个类别独立计算F1后取算术平均,给予所有类别同等权重:
\begin{equation}
\text{F1}_c = \frac{2 \times \text{Precision}_c \times \text{Recall}_c}{\text{Precision}_c + \text{Recall}_c}, \quad c \in \{0, 1, 2, 3\}
\end{equation}
\begin{equation}
\text{Macro F1} = \frac{1}{4}\sum_{c=0}^{3} \text{F1}_c
\end{equation}
选择Macro F1而非准确率的原因:在95\%-5\%的类别分布下,准确率高度偏向多数类(全预测0类可获95\%准确率但F1≈0.25)。Macro F1通过等权平均消除了这一偏差。
\subsection{辅助指标}
\begin{itemize}
\item \textbf{混淆矩阵}$\mathbf{C} \in \mathbb{N}^{4\times 4}$,元素$C_{ij}$为真实类$i$被预测为类$j$的样本数。提供模型在各风险等级的详细诊断信息
\item \textbf{准确率}:作为参考指标报告,但不作为模型选择依据(因其在不平衡数据上的欺骗性)
\end{itemize}
\subsection{评估流程}
\begin{enumerate}
\item 加载训练时的最佳checkpoint(基于验证损失)
\item 在测试集(164,365条样本)上进行推理
\item 分别计算三个时间尺度的混淆矩阵和指标
\item 生成LSTM vs XGBoost的对比图表
\end{enumerate}
评估代码实现于\texttt{src/models/evaluate.py},使用matplotlib生成300dpi的PNG图表,中文标注通过SimHei字体配置实现。
+148 -45
View File
@@ -1,75 +1,178 @@
\chapter{预警可视化系统设计与实现}
\chapter{预警可视化大屏系统}
本章介绍基于Flask后端和ECharts前端的Web可视化大屏系统的架构设计、核心API实现和前端面板设计。
\section{系统需求分析}
\subsection{功能需求}
高温健康风险预警可视化系统的主要功能需求包括:实时气象数据展示、温度变化趋势分析、多时间尺度风险预警展示、人口与健康数据概览、历史数据查询和预警发布管理。
系统面向三类用户(政府管理者、社区工作人员、公众),核心功能包括:
\begin{enumerate}
\item \textbf{实时气象与风险展示}:以折线图展示近期温度变化趋势和未来多时间尺度的风险等级预测
\item \textbf{多时间尺度覆盖}:同时呈现3天(操作决策)、7天(资源调配)和30天(季节性规划)三级预测
\item \textbf{人口脆弱性可视化}:饼图展示老年人口比例,暴露-反应曲线展示温度-健康风险定量关系
\item \textbf{历史数据回溯}:支持查看近90天历史温度和风险等级的时间序列
\item \textbf{年度统计摘要}:各年份高温天数、平均温度汇总
\item \textbf{自动刷新}:每30分钟自动更新数据,支持长时间无人值守运行
\end{enumerate}
\subsection{非功能需求}
系统应具备以下非功能特性:(1)响应式布局,适配不同尺寸的显示设备;(2)数据更新延迟不超过5分钟;(3)可视化渲染流畅,页面加载时间不超过3秒;(4)界面采用深色科技蓝风格,符合数据大屏的视觉规范。
\section{系统架构设计}
系统采用B/SBrowser/Server)架构,分为三层:
\begin{itemize}
\item \textbf{数据层}:负责气象数据、人口数据和模型预测结果的存储与管理
\item \textbf{服务层}:基于Flask框架的Web后端,提供RESTful API,包括数据查询、模型推理和预警推送
\item \textbf{展示层}:基于HTML+CSS+JavaScript的Web前端,使用ECharts进行数据可视化
\item 深色科技蓝视觉风格,适配LED大屏和普通显示器
\item 首次加载<3秒(含所有6图表渲染)
\item 支持1920×1080至4K分辨率
\item 模型不可用时降级运行(fallback模式)
\item 响应式布局,单文件部署(无外部构建工具依赖)
\end{itemize}
\section{后端实现}
\section{系统架构}
\subsection{Flask应用结构}
系统采用经典B/S三层架构:
Flask应用采用蓝图(Blueprint)模块化组织,主要模块包括:
\begin{itemize}
\item \texttt{api/data}:气象和人口数据接口
\item \texttt{api/predict}:模型预测与预警接口
\item \texttt{api/history}:历史数据查询接口
\item \textbf{表示层(Browser}:单页HTMLindex.html),使用CSS Grid布局,ECharts 5.5进行图表渲染,fetch API异步通信
\item \textbf{业务逻辑层(Flask Server}Python Flask框架,4个RESTful API端点,延迟模型加载(lazy loading),JSON序列化
\item \textbf{数据层(File System}:NPZ格式序列数据、PT格式模型checkpoint文件、CSV特征文件,基于文件系统的轻量级数据访问
\end{itemize}
\subsection{数据接口设计}
\subsection{数据设计}
前端通过fetch API定时请求后端API → Flask路由匹配URL → 控制器函数加载数据/调用模型推理 → 数据封装为JSON → 返回前端 → ECharts根据option配置渲染图表。数据流完全异步,页面加载不阻塞。
\section{后端API实现}
Flask应用包含4个端点,代码文件约110行(app.py):
\subsection{GET /api/predict —— 风险预测}
核心业务端点,返回格式示例:
API采用JSON格式进行数据交互,统一响应格式为:
\begin{verbatim}
{
"code": 200,
"message": "success",
"data": { ... }
"city": "焦作",
"date": "2026-05-28",
"predictions": {
"short": {
"level": 1, "label": "中风险", "color": "#ffeb3b",
"confidence": 0.50,
"probabilities": [0.1, 0.5, 0.3, 0.1],
"suggestions": [
"注意防暑降温",
"保持室内通风",
"老年人减少午后外出"
]
}, ...
},
"risk_population": 454000
}
\end{verbatim}
主要API端点包括:获取当前温度数据、获取温度历史趋势、获取风险预警等级、获取人口统计数据、获取高温天数统计等
模型加载采用懒加载模式——Flask应用启动时仅初始化框架,首次\texttt{/api/predict}请求时才加载模型文件(耗时<2秒),降低启动延迟和空闲内存占用
\subsection{模型部署与推理}
\subsection{GET /api/history —— 历史数据}
训练完成的PyTorch模型导出为TorchScript格式,在Flask应用启动时加载。推理请求到达时,将输入数据预处理后传入模型,获取预测结果并返回前端。
\section{前端实现}
\subsection{页面布局}
可视化大屏采用典型的4+1布局方案:上方为标题栏,中部左侧为温度变化趋势图,中部右侧为风险预警面板,下部左侧为人口数据概览,下部右侧为高温天数统计,中央区域展示关键预警信息。
\subsection{图表设计}
使用ECharts实现以下主要图表:
返回最近90天的JSON数组,每元素包含:
\begin{itemize}
\item 温度变化折线图:展示日最高/最低/平均温度的时序变化
\item 风险等级仪表盘:以仪表盘形式展示当前风险等级
\item 预警时间轴:以时间轴形式展示未来预警信息
\item 人口结构饼图:展示老龄化人口分布
\item 高温天数柱状图:展示每月高温天数统计
\item 热力图:展示温度与健康风险的关联模式
\item \texttt{dates}:日期字符串,格式YYYY-MM-DD
\item \texttt{temp\_mean}:日均气温(°C
\item \texttt{heat\_index}:体感温度(°C
\item \texttt{risk\_label}:风险等级(0-3
\item \texttt{heatwave}:热浪标识(0/1
\end{itemize}
\subsection{深色科技蓝风格实现}
\subsection{GET /api/stats —— 统计摘要}
配色方案以深蓝色(\#0a1628)为背景主色调,辅以青蓝色(\#00d4ff)、亮蓝色(\#1e90ff)和渐变色作为数据可视化配色。图表采用半透明深色容器、发光边框和毛玻璃效果,营造科技感和专业感。
返回年度汇总数据,包括:
\begin{itemize}
\item \texttt{annual}:按年份组织的平均温度、热浪天数、最高温度数组
\item \texttt{aging\_rate}:两城市固定老龄化率(焦作12.8\%,郑州11.6\%
\end{itemize}
\section{系统部署}
\subsection{GET / —— 主页}
系统通过Gunicorn作为WSGI服务器进行生产环境部署,绑定端口为5005。前端静态文件由Flask直接托管,无需额外配置Nginx。系统启动后可通过浏览器直接访问\url{http://localhost:5005}
直接返回index.html的完整内容(单文件应用,约24KB),无需额外的静态文件服务或模板引擎
\section{前端可视化面板}
前端为单个HTML文件,使用CDN加载ECharts 5.5主库,无其他外部依赖。CSS Grid定义6面板响应式布局。
\subsection{面板1:温度趋势图}
双Y轴折线图——日均气温(蓝色实线)和体感温度(橙色虚线)共左Y轴(°C),右Y轴为风险等级。背景标注三条水平阈值线:绿色虚线(32°C,低→中)、黄色虚线(35°C,中→高)、红色虚线(38°C,高→严重)。X轴跨90天,支持ECharts dataZoom区域缩放。
\subsection{面板2:风险预警展示}
三列卡片式布局,每卡片对应一个时间尺度。卡片内垂直排列:中文标签(最大字号)、风险颜色圆点(\texttt{border-radius: 50\%})、置信度进度条(CSS动画)、防护建议列表(\texttt{<ul>}形式)。三个卡片共用响应式flex布局。
\subsection{面板3:老年人口饼图}
饼图展示焦作和郑州各占一半的「65岁以上 vs 65岁以下」人口比例。中心使用ECharts graphic配置显示大字号老龄化率文本。颜色使用对比度高的蓝-橙配色以增强可读性。
\subsection{面板4:预警时间线柱状图}
12个月×4风险等级的堆叠柱状图。X轴为1-12月,柱高为该月的风险天数总数,颜色堆叠显示各等级分布。直观呈现6-8月高风险天数爆发的「夏季脉冲」模式。支持联动图例切换(点击图例可显示/隐藏某风险等级)。
\subsection{面板5:暴露-反应曲线}
基于Chen等(2018)中国多城市数据的13点离散暴露-反应映射表绘制。X轴为日平均温度(°C),Y轴为相对风险(RR)。标注RR=1.0基线(零风险)和最适温度参考线。使用ECharts的smooth折线渲染。
\subsection{面板6:历史数据表格}
最近7天×5列(日期/平均温度/体感温度/风险等级/热浪标识)的明细表格,行背景色根据风险等级动态着色(绿→黄→橙→红)。实现为HTML\texttt{<table>}而非ECharts,保持简单。
\section{视觉设计}
\subsection{配色方案(深色科技蓝)}
\begin{table}[H]
\centering
\caption{大屏视觉配色方案}
\begin{tabular}{lll}
\toprule
\textbf{用途} & \textbf{色值} & \textbf{语义} \\
\midrule
页面背景 & \#0a1632 & 深蓝黑底色 \\
面板背景 & rgba(255,255,255,0.05) & 半透明白色毛玻璃 \\
边框发光 & rgba(0,212,255,0.15) & 青色微光 \\
图表强调色 & \#00d4ff / \#1e90ff / \#ffd700 & 青/蓝/金色 \\
低风险(0级)& \#4caf50 & 绿色(安全) \\
中风险(1级)& \#ffeb3b & 黄色(关注) \\
高风险(2级)& \#ff9800 & 橙色(警戒) \\
严重风险(3级)& \#f44336 & 红色(危险) \\
\bottomrule
\end{tabular}
\end{table}
\subsection{CSS毛玻璃效果}
面板通过以下CSS属性实现毛玻璃(Glassmorphism)效果:
\begin{verbatim}
background: rgba(255, 255, 255, 0.05);
backdrop-filter: blur(10px);
border: 1px solid rgba(0, 212, 255, 0.15);
border-radius: 8px;
\end{verbatim}
\subsection{响应式布局策略}
使用CSS Grid的\texttt{grid-template-columns}定义3列等宽布局(每列约33\%),\texttt{grid-template-rows}定义2行自适应高度。面板高度使用\texttt{auto}\texttt{min-height}约束,确保在不同分辨率下填充合理。
\section{错误处理与降级策略}
系统设计了两级降级策略确保可用性:
\begin{enumerate}
\item \textbf{模型降级}:当best\_model.pt不存在或加载失败时,/api/predict返回基于均匀概率的默认预测(各风险等级25\%概率),并标记confidence=0.25
\item \textbf{数据降级}:当NPZ/CSV数据文件缺失时,/api/history和/api/stats返回空数组,前端各面板显示「暂无数据」占位文本
\end{enumerate}
\section{系统运行}
启动命令(开发模式):
\begin{verbatim}
python -m src.web.app
\end{verbatim}
启动后通过浏览器访问\texttt{http://localhost:5005}。默认监听0.0.0.0(所有网络接口),支持局域网内其他设备访问。开发模式(debug=True)启用自动重载和详细错误页面。生产部署建议使用Waitress或Gunicorn WSGI容器。
+146 -25
View File
@@ -2,58 +2,179 @@
\section{实验环境}
本研究实验环境配置如下:
本研究实验环境配置如下:
\begin{itemize}
\item 操作系统:Windows 11
\item 操作系统:Windows 11 Home China
\item 编程语言:Python 3.13
\item 深度学习框架:PyTorch
\item CPUIntel Core i7
\item 内存:32 GB
\item 训练设备:CPU(适用于中等规模时序数据)
\item 深度学习框架:PyTorch 2.12.0 (CUDA 12.6)
\item GPUNVIDIA GeForce RTX 4060 Laptop GPU (8 GB VRAM)
\item 机器学习框架:XGBoost 2.0+Scikit-learn 1.3+
\item 内存:16 GB DDR4
\item 环境管理:uv(虚拟环境 .venv)
\end{itemize}
\section{模型训练过程}
\subsection{训练曲线分析}
\subsection{数据集规模与划分}
LSTM-Attention模型在训练集和验证集上的损失曲线显示,模型在训练初期(前20个epoch)损失快速下降,之后逐步收敛。验证集损失在约60个epoch后趋于稳定,未出现明显的过拟合现象,证明Dropout和早停策略有效
经数据预处理管线处理后,共生成1,095,758条有效样本(焦作547,879 + 郑州547,879)。时间顺序分割:训练集767,030条(70\%),对应2010至约2020年中期;验证集164,363条(15\%),约2020-2022年中期;测试集164,365条(15\%),约2022-2024年
每条样本包含14天×19个气象特征的输入序列(X),以及短(3天)、中(7天)、长(30天)三类预测目标(y)。输入特征涵盖基础气象变量(6个)、衍生气象变量(2个:RH和HI)、滚动统计特征(2个:7d/14d均值)、滞后特征(3个:1/3/7天滞后)和热浪特征(2个)。
\subsection{LSTM-Attention训练}
LSTM-Attention模型包含983,628个可训练参数,采用Focal Loss($\alpha=0.5, \gamma=2.0$)作为损失函数。训练配置:AdamW优化器(lr=1e-3, weight\_decay=1e-4),ReduceLROnPlateau学习率调度(patience=5, factor=0.5),梯度裁剪(max\_norm=1.0),早停patience=15,最大50 epoch。在RTX 4060 GPU上每epoch约2.5分钟(batch\_size=32,约24,000步/epoch)。
\subsection{XGBoost训练}
XGBoost基线模型通过5折交叉验证选择最优超参数组合,训练耗时远少于LSTM-Attention模型,但模型容量和时序建模能力相对有限
三个独立XGBoost分类器(n\_estimators=200, max\_depth=6, learning\_rate=0.05)在GPU上训练。输入为展平的266维特征(14×19),训练时间约2分钟/分类器。XGBoost无需特征标准化(树模型对单调变换不变),且原生支持缺失值处理
\section{模型性能对比}
\subsection{短期预警性能(1-3天)}
\subsection{整体对比}
在短期预警任务上,LSTM-Attention模型的准确率、精确率、召回率和F1分数均优于XGBoost基线模型,证明了深度学习在捕获短期时序模式方面的优势
模型在测试集(164,365条样本)上的整体性能如表\ref{tab:model_comparison}所示
\subsection{中期预警性能(7天)}
\begin{table}[H]
\centering
\caption{LSTM-Attention vs XGBoost整体性能对比}
\label{tab:model_comparison}
\begin{tabular}{lcccc}
\toprule
\textbf{时间尺度} & \multicolumn{2}{c}{\textbf{LSTM-Attention}} & \multicolumn{2}{c}{\textbf{XGBoost}} \\
& Accuracy & F1-Macro & Accuracy & F1-Macro \\
\midrule
短期(3天) & 0.9263 & 0.2404 & \textbf{0.9908} & \textbf{0.9325} \\
中期(7天) & 0.9259 & 0.2404 & \textbf{0.9886} & \textbf{0.9195} \\
长期(30天) & 0.9260 & 0.2404 & \textbf{0.9782} & \textbf{0.8576} \\
\bottomrule
\end{tabular}
\end{table}
中期预警任务对模型的长期依赖建模能力要求更高。LSTM-Attention模型通过注意力机制有效地捕捉了气象要素变化的关键时间节点,在各项指标上持续领先XGBoost。
\subsection{混淆矩阵分析}
\subsection{长期预警性能(30天)}
\begin{figure}[H]
\centering
\includegraphics[width=\textwidth]{../outputs/figures/model_comparison.png}
\caption{模型性能对比柱状图}
\label{fig:model_comparison}
\end{figure}
长期预警任务是所有时间尺度中最具挑战性的。由于30天的时间跨度较大,气象要素的预测不确定性显著增加。在此任务上,LSTM-Attention与XGBoost的性能差距有所缩小,但前者仍保持一定的优势。
\begin{figure}[H]
\centering
\includegraphics[width=\textwidth]{../outputs/figures/confusion_matrix_comparison.png}
\caption{混淆矩阵对比(左侧3列:XGBoost,右侧3列:LSTM-Attention;行:short/medium/long时间尺度)}
\label{fig:confusion_matrix}
\end{figure}
\section{注意力可视化分析}
XGBoost的混淆矩阵(图\ref{fig:confusion_matrix}左侧)显示:
\begin{itemize}
\item \textbf{0级(低风险)}:几乎完美分类(>99\%),符合预期——低风险天气条件下气象特征高度一致
\item \textbf{1级(中风险)}:部分与0级和2级混淆。中风险天气(32-35°C)覆盖了从正常夏日到高温预警边界的过渡带,特征模糊性较大
\item \textbf{2级(高风险)}\textbf{3级(严重风险)}:召回率较高(>80\%),误报主要流向邻近类别(如3级误报为2级),而非跳跃至0级。这表示模型对「风险大小」的相对排序是正确的
\end{itemize}
通过对LSTM-Attention模型的注意力权重进行可视化,可以观察到模型在预测高风险等级时,注意力权重主要集中在温度快速升高和持续高温的时间段,验证了注意力机制的有效性和可解释性。
\subsection{XGBoost逐类性能分析}
\section{消融实验}
\begin{table}[H]
\centering
\caption{XGBoost短期预测逐类性能(测试集)}
\begin{tabular}{lcccc}
\toprule
\textbf{风险等级} & \textbf{Precision} & \textbf{Recall} & \textbf{F1-Score} & \textbf{样本数} \\
\midrule
0级(低风险) & 0.9977 & 0.9932 & 0.9954 & 156,803 \\
1级(中风险) & 0.8283 & 0.9056 & 0.8630 & 4,528 \\
2级(高风险) & 0.8638 & 0.6881 & 0.7660 & 2,096 \\
3级(严重风险)& 0.7656 & 0.9073 & 0.8304 & 938 \\
\bottomrule
\end{tabular}
\end{table}
\subsection{注意力机制的影响}
XGBoost在少数类上的precision和recall均达到可接受水平(>0.76),证明了梯度提升方法在类别不平衡条件下的鲁棒性。严重风险(3级)的recall达0.9073——模型能够捕获90\%以上的极端高温事件,漏报率<10\%
移除多头自注意力层后,模型在中期和长期任务上的性能下降明显,证明注意力机制对长距离时序依赖的捕捉能力是不可或缺的。
\subsection{时间尺度效应分析}
\subsection{多任务学习的影响}
短期(3天)F1最高(0.9325),长期(30天)F1最低(0.8576),符合直觉预期——预测窗口越长,气象要素的预测不确定性越大,风险等级的可预判性越低。然长期F1仍维持在0.85+,表明XGBoost即使对30天远期预测仍保持相当的辨识能力,这得益于14天输入窗口捕捉的前期天气模式和季节趋势特征。
将多任务学习架构改为三个独立模型分别训练后,各时间尺度的性能均有不同程度的下降,验证了多任务学习中共享特征表示有利于提升各子任务的泛化能力。
\section{城市分层分析}
\section{与已有研究对比}
\begin{table}[H]
\centering
\caption{XGBoost短期预测城市分层性能}
\begin{tabular}{lccc}
\toprule
\textbf{城市} & \textbf{Accuracy} & \textbf{F1-Macro} & \textbf{样本数} \\
\midrule
焦作 & 0.9915 & 0.9466 & 82,183 \\
郑州 & 0.9901 & 0.9189 & 82,182 \\
\bottomrule
\end{tabular}
\end{table}
将本研究的结果与已有文献中报告的性能进行对比分析。由于研究区域、数据来源和任务定义的差异,直接的数值对比意义有限,但在方法和预警理念上,本研究具有一定的创新性和应用价值
焦作市的F1略高于郑州(0.947 vs 0.919),可能原因:郑州高风险天数更多、风险分布更分散,增加了分类难度。两市性能差异不大(<3\%),表明模型具有较好的域内泛化能力,可适用于邻近城市而无需重新训练
\section{XGBoost特征重要性分析}
XGBoost内置的特征重要性(由信息增益累积计算)揭示了哪些特征对风险等级预测贡献最大。排名前10的特征为:
\begin{enumerate}
\item heat\_index(体感温度):核心驱动变量,直接定义风险等级
\item temp\_mean(日均气温):基础气象指标
\item rh(相对湿度):高湿度放大高温健康效应
\item temp\_lag\_1(前1天气温):短期自回归,反映热量累积
\item temp\_7d\_avg7天滚动均温):中长期趋势
\item temp\_14d\_avg14天滚动均温):基线气候态
\item temp\_lag\_3(前3天气温):中期滞后
\item heatwave\_strength(热浪强度):持续性高温
\item dewpoint\_mean(露点温度):湿度替代指标
\item pressure\_mean(地表气压):大尺度天气系统
\end{enumerate}
体感温度(HI)作为温度和湿度的综合指标在各时间尺度上始终排名第一,验证了采用NOAA Rothfusz公式计算体感温度而非直接使用气温作为风险判定基础的合理性。滞后和滚动特征的高排名表明热量累积效应在风险预测中不可忽略。
\section{典型案例分析:2022年6月河南高温事件}
2022年6月15-25日,河南省出现大范围持续性高温天气,郑州连续11天日最高气温超过37°C,6月25日最高气温达42.3°C(逼近历史极值)。焦作同期连续10天超过37°C。
以2022年6月15日为基准日,模型预测:
\begin{table}[H]
\centering
\caption{2022年6月15日模型预测结果}
\begin{tabular}{lccc}
\toprule
\textbf{预测窗口} & \textbf{预测等级} & \textbf{实际等级} & \textbf{是否正确} \\
\midrule
短期(3d, 6/16-18 & 3级(严重) & 3级 &\\
中期(7d, 6/16-22 & 3级(严重) & 3级 &\\
长期(30d, 6/16-7/15& 1级(中风险)& 2级(高风险)& ✗(低判1级) \\
\bottomrule
\end{tabular}
\end{table}
短期和中期预测正确识别了严重风险,长期预测将风险低估了1级(预测中风险,实际高风险)。低估的可能原因:长期窗口中后段(7月上中旬)温度回落,拉低了30天众数风险等级,而实际7月仍出现了若干高风险日。这表明基于众数聚合的长期标签对窗口内温度波动敏感,未来可考虑采用分位数标签或风险值累计替代众数。
\section{LSTM训练优化实验记录}
为改善LSTM模型性能,进行了6轮系统调优实验(详见表\ref{tab:lstm_tuning},第4.3.3节)。LSTM模型在所有轮次中均未能实现有效收敛:无权重/采样时收敛至全预测0类(Acc=0.940, F1=0.240);有权重/采样时过度预测3类(Acc=0.025)。两类极端之间的中间状态在优化过程中无法稳定维持。
这一现象揭示了深度序列模型在极端类别不平衡条件下的根本性训练困难:交叉熵损失的梯度场存在两个支配性的吸引域,其间的鞍点宽度不足以在有限训练步内使模型稳定于平衡的预测分布。可能的解决方向包括:(1)合成少数类过采样技术(SMOTE)在特征空间中生成合成少数类样本;(2)基于元学习的初始化和优化策略;(3)两阶段训练(先用平衡batch预训练少数类特征抽取器,再在全数据集上微调)。
\section{讨论}
\subsection{XGBoost优势分析}
XGBoost在各项指标上大幅领先LSTM,优势根源于:(1)树模型对特征尺度和分布的鲁棒性——无需标准化的特征工程;(2)Boosting框架天然的难例聚焦能力——每轮迭代重点关注上一轮的残差;(3)集成多样性——200棵不同结构的树从不同角度拟合数据,综合决策对少数类有更好的覆盖。
\subsection{LSTM局限分析}
LSTM的局限并非源于模型架构(BiLSTM+MHA的组合在理论上具有强大的时序建模能力),而是源于训练数据分布与优化目标之间的失配。Focal Loss虽然在理论上专为解决不平衡问题设计,但在94-97\%的极端不平衡下,其调制效应不足以引导优化轨迹逃离「全预测0类」的局部极小。
\subsection{实践启示}
对于面向表格型时序特征的环境健康预测任务,XGBoost(以及可能的LightGBM、CatBoost等同类梯度提升方法)是实用性和性能均出色的首选方案。深度学习序列模型在此类场景中的应用需要更充分的工程准备——包括但不限于数据层面(合成采样、数据增强)、优化层面(预训练、课程学习)和架构层面(专用不平衡损失、对抗训练)。
\section{系统可视化效果}
可视化大屏系统运行效果良好,各图表渲染流畅,数据更新及时,界面美观大方。深色科技蓝风格的配色方案和毛玻璃效果得到了测试用户的认可
基于Flask+ECharts构建的可视化大屏系统(详见第5章),共6个功能面板,运行于端口5005。系统支持每30分钟自动刷新数据,模型降级机制确保极端情况下系统仍可提供基础信息展示。深色科技蓝配色方案和毛玻璃面板设计在1920×1080分辨率下呈现良好的视觉效果。
+49 -22
View File
@@ -2,44 +2,71 @@
\section{工作总结}
本研究以焦作市和郑州市为研究区域,针对银发群体高温健康风险预警问题,开展了多时间尺度预警模型构建和可视化系统开发工作,取得了以下主要成果
本研究以河南省焦作市和郑州市为研究区域,面向银发群体高温健康风险预警需求,系统开展了从数据获取、特征工程到模型构建、评估对比和可视化系统开发的全流程工作。主要成果总结如下
\begin{enumerate}
\item \textbf{构建了多源数据集}:获取并预处理了2010-2024年焦作、郑州两市的ERA5-Land气象再分析数据,结合人口普查和卫生统计数据,构建了温度-健康风险关联数据集,为后续模型训练提供了数据基础。
\subsection{数据成果}
\item \textbf{设计了LSTM-Attention预警模型}:结合LSTM的时序特征提取能力和多头自注意力机制的关键时间步加权能力,构建了多时间尺度(短期/中期/长期)健康风险预警模型。实验结果表明,该模型在短期和中期预警任务上优于XGBoost等传统机器学习方法
构建了覆盖2010-2024年、包含1,095,758条高质量序列样本的多时间尺度高温健康风险预测数据集。数据融合ERA5-Land再分析气象变量(6个基础变量)、NOAA体感温度(Heat Index)和Magnus相对湿度等衍生指标,以及滚动均值、滞后特征、热浪检测等19维工程特征。数据集经严格时间序列分割(70/15/15),已保存为标准化NPZ格式,可供后续研究直接使用
\item \textbf{实现了可视化大屏系统}:基于Flask和ECharts开发了深色科技蓝风格的Web可视化大屏,实现了温度趋势、风险等级、人口数据和高温统计等多维度的直观展示,为决策者提供了便捷的信息获取渠道。
\subsection{模型成果}
\item \textbf{验证了注意力机制的有效性}:通过注意力权重可视化和消融实验,证明了注意力机制在提升模型性能和可解释性方面的积极作用
\end{enumerate}
构建了两类对比预警模型:(1)LSTM-Attention深度学习模型(983,628参数,2层BiLSTM+4头MHA+3多任务输出头);(2)XGBoost梯度提升基线模型(200棵树×3分类器)。在164,365条测试样本上的系统对比表明,XGBoost在三个时间尺度上均表现优异——短期(3天)F1-Macro 0.9325、中期(7天)0.9195、长期(30天)0.8576,严重风险事件的召回率达90.7\%
\subsection{方法论贡献}
进行了6轮LSTM训练优化实验(Focal Loss调参、类别加权、加权采样、批量大小优化),系统记录了每一轮的配置和结果。实验揭示了深度序列模型在极端类别不平衡(低风险类占94-96\%)条件下的根本性训练困难——交叉熵损失梯度场的双吸引域结构使模型无法收敛至平衡的预测分布。这一负面结果为环境健康预测领域的方法选择提供了有价值的实证参考——并非所有场景下深度学习的理论优势都能转化为实际性能提升。
\subsection{工程成果}
开发了基于Flask+ECharts的Web可视化大屏原型系统(6面板、4 API端点、深色科技蓝风格),实现了多时间尺度预警信息的直观呈现。系统支持模型不可用时的自动降级运行,具备良好的鲁棒性和可维护性。
\subsection{与已有研究的比较}
与已有高温健康预警研究相比,本研究的特色在于:(1)同时覆盖三个时间尺度(3d/7d/30d),区别于已有研究多聚焦单一窗口;(2)以银发群体为特定目标人群,在数据驱动的预警框架中融入老龄化率和暴露-反应曲线等脆弱性指标;(3)对深度学习和梯度提升方法进行了系统的同数据集对比;(4)所有核心代码和数据管线已开源,保证了研究结果的可复现性。
\section{研究不足}
本研究存在以下不足和局限
本研究存在以下局限:
\begin{enumerate}
\item \textbf{数据粒度限制}:ERA5-Land数据的空间分辨率为0.1°(约9 km),无法捕捉城市内部的微气候差异,对精细化的社区级预警支持有限
\item \textbf{健康终点数据的间接性}:受限于个体级健康数据的可获取性,本研究的风险等级划分基于体感温度阈值和文献暴露-反应曲线,而非本地的个体级健康结局数据(如逐日死亡记录、急诊就诊数据)。温度-健康关联存在显著的人群异质性、地域适应性和社会经济效应修饰,直接使用文献中的暴露-反应曲线可能引入一定偏差
\item \textbf{健康数据的间接性}:受限于数据可获取性,本研究的健康风险数据主要来源于宏观统计年鉴,缺乏个体级别的健康记录数据,风险标注的精细度有待提升
\item \textbf{数据空间分辨率的限制}ERA5-Land的0.1°(约9 km)空间分辨率无法捕捉城市内部的微气候异质性(不同城区的热岛强度差可达3-5°C),对社区级别的精细化预警支持有限
\item \textbf{模型局限性}LSTM-Attention模型在长期(30天)预测任务上的性能仍有较大提升空间,长期气象预测本质上具有较强的混沌性和不确定性
\item \textbf{气象变量的有限性}:仅使用了ERA5-Land的6个基础气象变量,未纳入向下太阳辐射通量(ssrd)、边界层高度(blh)、土壤湿度(swvl1)等可能与高温健康效应机制相关的变量
\item \textbf{系统功能待完善}:当前可视化系统主要侧重于数据展示和预警呈现,尚未集成预警自动推送、多级联动响应等高级功能
\item \textbf{深度学习训练不充分}LSTM-Attention模型因类别不平衡未能有效收敛,本研究虽进行了6轮调优但未穷尽所有可能策略(如SMOTE过采样、两阶段训练、知识蒸馏)
\item \textbf{系统功能的原型性}:当前可视化系统为原型版本,未集成实时气象数据流、多城市切换面板、预警自动推送和用户认证等功能。
\item \textbf{缺乏外部验证}:模型仅在焦作和郑州两市数据上进行测试,未在河南省其他城市或邻近省份城市上进行外部验证,泛化性能有待进一步检验。
\end{enumerate}
\section{未来展望}
基于本研究的成果和不足,未来可从以下方向继续深入:
基于本研究的成果和局限,未来可从以下方向深入:
\subsection{数据层面}
\begin{enumerate}
\item \textbf{引入更高分辨率数据}结合地面气象观测数据和卫星遥感数据,提升数据空间分辨率,支持更精细的城市内部风险评估。
\item \textbf{融合更多模态数据}:引入社交媒体数据、120急救呼叫数据、医院急诊就诊数据等多源信息,构建更全面的健康风险评估体系。
\item \textbf{探索更先进的模型架构}:尝试引入Transformer、Informer、Autoformer等更先进的时序预测模型,进一步提升长期预警精度。
\item \textbf{完善系统功能}:在可视化系统的基础上,开发预警自动推送、多级联动响应、应急预案管理等高级功能,提升系统的实用性和智能化水平。
\item \textbf{扩展研究区域}:将研究方法和系统推广至河南省其他城市乃至全国范围,为更广泛的老年群体提供高温健康防护服务
\item \textbf{融合多源数据}引入地面气象站逐小时观测数据(提高时间精度)、卫星遥感地表温度(LST,捕捉城市热岛空间细节)、手机信令人口密度数据(动态评估暴露人口)以及可穿戴设备生理指标数据(皮肤温度、心率变异性),构建多模态风险评估体系
\item \textbf{获取健康结局数据}:与地方疾控中心(CDC)和卫生健康部门合作,获取分年龄组(特别是65+)的逐日死亡登记、120急救呼叫和医院急诊就诊数据,建立本地的温度-健康暴露-反应函数,替代文献曲线。
\end{enumerate}
\subsection{模型层面}
\begin{enumerate}
\item \textbf{合成少数类过采样}:将SMOTE、ADASYN和Borderline-SMOTE等算法引入14天×19维的序列特征空间,生成合成少数类样本以平衡类别分布。需注意序列数据的时序一致性——直接对展平特征应用SMOTE可能破坏时序结构。
\item \textbf{两阶段训练(预训练+微调)}:第一阶段在平衡后的数据子集上预训练LSTM特征编码器,第二阶段在全数据集上冻结编码器、仅微调输出头。该策略已在计算机视觉的不平衡学习中取得显著成功
\item \textbf{知识蒸馏}:以训练好的XGBoost作为教师模型,将其预测概率作为软标签(soft label)指导LSTM学生模型的训练。软标签比硬标签(0/1)携带更丰富的类别间相似性信息,有助于学生在极度不平衡数据上学习。
\item \textbf{概率预测与不确定性量化}:采用DeepAR、概率Transformer或贝叶斯神经网络实现预测分布(而不仅是点估计)输出,为预警决策提供可信度区间。
\item \textbf{更先进的时序架构}:尝试InformerProbSparse自注意力)、Autoformer(自相关分解)、PatchTST(分块时序嵌入)等Transformer变体,以及图神经网络(GNN)用于多城市联合建模。
\end{enumerate}
\subsection{系统与应用层面}
\begin{enumerate}
\item \textbf{预警推送与闭环响应}:集成短信/微信小程序推送通道,建立「预测→推送→确认→响应→反馈」的预警闭环,参考法国Plan Canicule的分级响应流程。
\item \textbf{多城市推广}:将完备的管线(下载→预处理→训练→评估→部署)推广至河南省18个地级市及中原城市群,构建区域性高温健康风险监测网络。
\item \textbf{季节性预发布}:基于长期预测(30天)能力,在每年5月(高温季前)发布夏季高温健康风险预估报告,辅助政府进行资源预置(如社区降温站布点、应急物资储备)。
\end{enumerate}
+42
View File
@@ -0,0 +1,42 @@
\begin{thebibliography}{99}
\zihao{5}
\bibitem{gasparrini2015mortality} Gasparrini A, Guo Y, Hashizume M, et al. Mortality risk attributable to high and low ambient temperature[J]. The Lancet, 2015, 386: 369-375.
\bibitem{chen2018heat} Chen R, Yin P, Wang L, et al. Association between ambient temperature and mortality risk and burden in China[J]. The Lancet Planetary Health, 2018, 2(8): e344-e352.
\bibitem{hochreiter1997lstm} Hochreiter S, Schmidhuber J. Long Short-Term Memory[J]. Neural Computation, 1997, 9(8): 1735-1780.
\bibitem{vaswani2017attention} Vaswani A, Shazeer N, Parmar N, et al. Attention Is All You Need[C]. Advances in Neural Information Processing Systems, 2017, 30.
\bibitem{chen2016xgboost} Chen T, Guestrin C. XGBoost: A Scalable Tree Boosting System[C]. Proceedings of the 22nd ACM SIGKDD, 2016: 785-794.
\bibitem{ipcc2023ar6} IPCC. Climate Change 2023: Synthesis Report. Contribution of Working Groups I, II and III to the Sixth Assessment Report[R]. Geneva: IPCC, 2023.
\bibitem{lin2017focal} Lin T Y, Goyal P, Girshick R, et al. Focal Loss for Dense Object Detection[J]. IEEE Transactions on Pattern Analysis and Machine Intelligence, 2020, 42(2): 318-327.
\bibitem{bahdanau2014attention} Bahdanau D, Cho K, Bengio Y. Neural Machine Translation by Jointly Learning to Align and Translate[J]. arXiv preprint arXiv:1409.0473, 2014.
\bibitem{curriero2002temperature} Curriero F C, Heiner K S, Samet J M, et al. Temperature and Mortality in 11 Cities of the Eastern United States[J]. American Journal of Epidemiology, 2002, 155(1): 80-87.
\bibitem{rothfusz1990heat} Rothfusz L P. The Heat Index Equation (or, More Than You Ever Wanted to Know About Heat Index)[R]. NWS Southern Region Technical Attachment, 1990, SR 90-23.
\bibitem{era5land} Copernicus Climate Change Service. ERA5-Land hourly data from 1950 to present[EB/OL]. https://cds.climate.copernicus.eu/, 2024.
\bibitem{china_census2020} 国家统计局. 第七次全国人口普查公报[EB/OL]. https://www.stats.gov.cn/, 2021.
\bibitem{ma2015heat} Ma W, Chen R, Kan H. Temperature-related mortality in 17 large Chinese cities[J]. Environmental Health Perspectives, 2015, 123(10): 989-994.
\bibitem{anderson2013heat} Anderson G B, Bell M L. Heat Waves in the United States: Mortality Risk during Heat Waves and Effect Modification by Heat Wave Characteristics[J]. Environmental Health Perspectives, 2011, 119(2): 210-218.
\bibitem{guo2017heat} Guo Y, Gasparrini A, Armstrong B G, et al. Heat Wave and Mortality: A Multicountry, Multicommunity Study[J]. Environmental Health Perspectives, 2017, 125(8): 087006.
\bibitem{wmo2024state} WMO. State of the Global Climate 2023[R]. Geneva: World Meteorological Organization, 2024.
\bibitem{china_climate_bluebook2024} 中国气象局. 中国气候变化蓝皮书(2024)[R]. 北京: 中国气象局气候变化中心, 2024.
\bibitem{zhou2021informer} Zhou H, Zhang S, Peng J, et al. Informer: Beyond Efficient Transformer for Long Sequence Time-Series Forecasting[C]. Proceedings of the AAAI Conference on Artificial Intelligence, 2021, 35(12): 11106-11115.
\bibitem{wu2021autoformer} Wu H, Xu J, Wang J, et al. Autoformer: Decomposition Transformers with Auto-Correlation for Long-Term Series Forecasting[C]. Advances in Neural Information Processing Systems, 2021, 34.
\bibitem{ke2017lightgbm} Ke G, Meng Q, Finley T, et al. LightGBM: A Highly Efficient Gradient Boosting Decision Tree[C]. Advances in Neural Information Processing Systems, 2017, 30.
\end{thebibliography}
BIN
View File
Binary file not shown.
+100 -61
View File
@@ -1,34 +1,61 @@
%!TEX program = xelatex
\documentclass[12pt,a4paper,openany]{ctexbook}
% --- 页面设置 ---
% ==================== 页面设置 ====================
\usepackage[top=2.5cm,bottom=2.5cm,left=3cm,right=2.5cm]{geometry}
\usepackage{setspace}
\onehalfspacing
% --- 字体 ---
\setCJKmainfont{Songti SC}[AutoFakeBold=2]
\setCJKsansfont{Heiti SC}
\setCJKmonofont{STFangsong}
% ==================== 字体(河南理工规范) ====================
\setCJKmainfont{STSong}[AutoFakeBold=2]
\setCJKsansfont{Noto Sans SC}
\setCJKmonofont{FangSong}
\setmainfont{Times New Roman}
% --- 图表 ---
% ==================== 页眉页脚 ====================
\usepackage{fancyhdr}
\pagestyle{fancy}
\fancyhf{}
\fancyhead[CO]{\zihao{-5}\songti 银发群体高温多时间尺度预警和服务优化可视化研究}
\fancyhead[CE]{\zihao{-5}\songti 河南理工大学本科毕业设计(论文)}
\fancyfoot[C]{\zihao{-5}\thepage}
\renewcommand{\headrulewidth}{0.4pt}
\fancypagestyle{plain}{
\fancyhf{}
\fancyfoot[C]{\zihao{-5}\thepage}
\renewcommand{\headrulewidth}{0pt}
}
\fancypagestyle{abstract}{
\fancyhf{}
\fancyhead[C]{\zihao{-5}\songti 摘要}
\fancyfoot[C]{\zihao{-5}\thepage}
\renewcommand{\headrulewidth}{0.4pt}
}
\fancypagestyle{abstract-en}{
\fancyhf{}
\fancyhead[C]{\zihao{-5}\songti ABSTRACT}
\fancyfoot[C]{\zihao{-5}\thepage}
\renewcommand{\headrulewidth}{0.4pt}
}
% ==================== 图表 ====================
\usepackage{graphicx}
\usepackage{float}
\usepackage{subcaption}
\usepackage{booktabs}
\usepackage{longtable}
\usepackage{caption}
\captionsetup[table]{font={bf,small}, labelsep=quad, position=above, skip=2pt}
\captionsetup[figure]{font=small, labelsep=quad, position=below, skip=2pt}
% --- 参考文献 (GB/T 7714) ---
\usepackage[backend=biber,style=gb7714-2015]{biblatex}
\addbibresource{refs.bib}
% --- 超链接 ---
% ==================== 超链接 ====================
\usepackage[hidelinks]{hyperref}
% --- 数学 ---
% ==================== 数学 ====================
\usepackage{amsmath,amssymb}
\numberwithin{equation}{chapter}
% --- 代码 ---
% ==================== 代码 ====================
\usepackage{listings}
\lstset{
basicstyle=\small\ttfamily,
@@ -38,10 +65,29 @@
numberstyle=\tiny,
}
% --- 其他 ---
% ==================== 其他 ====================
\usepackage{tikz}
\usepackage{caption}
\captionsetup{font=small,labelfont=bf}
% ==================== 标题格式 ====================
\ctexset{
chapter={
format={\centering\zihao{-2}\heiti\bfseries},
name={第,章}, number=\arabic{chapter},
beforeskip=20pt, afterskip=20pt,
},
section={
format={\zihao{4}\heiti\bfseries},
beforeskip=12pt, afterskip=6pt,
},
subsection={
format={\zihao{-4}\heiti\bfseries},
beforeskip=8pt, afterskip=4pt,
},
subsubsection={
format={\zihao{-4}\heiti},
beforeskip=6pt, afterskip=4pt,
},
}
\title{银发群体高温多时间尺度预警和服务优化可视化研究}
\author{刘航宇}
@@ -49,29 +95,36 @@
\begin{document}
% --- 封面 ---
\begin{center}
\vspace*{3cm}
{\large\bfseries 本科毕业论文}\\[1cm]
{\LARGE\bfseries 银发群体高温多时间尺度预警\\[0.3cm]和服务优化可视化研究}\\[2cm]
{\large\hspace{2em}院:计算机科学与技术学院}\\[0.5cm]
{\large\hspace{2em}业:计算机科学与技术}\\[0.5cm]
{\large\hspace{2em}名:刘航宇}\\[0.5cm]
{\large\hspace{2em}号:}\\[0.5cm]
{\large 指导教师:}\\[2cm]
{\large \today}
\end{center}
% ==================== 封面 ====================
\begin{titlepage}
\thispagestyle{empty}
\newpage
\begin{center}
\vspace*{2cm}
{\zihao{1}\heiti\bfseries 本科毕业设计(论文)}\\[1.5cm]
{\zihao{2}\heiti\bfseries 银发群体高温多时间尺度预警\\[0.2cm]和服务优化可视化研究}\\[3cm]
{\zihao{4}\fangsong
\begin{tabular}{rl}
\textbf{\hspace{2em}院:} & 计算机科学与技术学院 \\[0.3cm]
\textbf{\hspace{2em}业:} & 计算机科学与技术 \\[0.3cm]
\textbf{\hspace{2em}名:} & 刘航宇 \\[0.3cm]
\textbf{\hspace{2em}号:} & 312409090120\\[0.3cm]
\textbf{指导教师:} & 郑艳梅\\[1.5cm]
\end{tabular}
}
\vfill
{\zihao{4}\fangsong \today}
\end{center}
\end{titlepage}
% --- 摘要 ---
% ==================== 摘要 ====================
\input{chapters/abstract}
% --- 目录 ---
\tableofcontents
% ==================== 目录 ====================
\pagestyle{fancy}
{\zihao{5}\tableofcontents}
\newpage
% --- 正文 ---
% ==================== 正文 ====================
\input{chapters/ch1-intro}
\input{chapters/ch2-theory}
\input{chapters/ch3-data}
@@ -80,36 +133,22 @@
\input{chapters/ch6-results}
\input{chapters/ch7-conclusion}
% --- 参考文献 ---
\printbibliography[title=参考文献]
% ==================== 参考文献 ====================
\input{chapters/references}
% --- 致谢 ---
\chapter*{致谢}
\addcontentsline{toc}{chapter}{致谢}
% ==================== 致谢 ====================
\input{chapters/acknowledgments}
衷心感谢导师在选题、研究方法、论文撰写等方面给予的悉心指导和宝贵建议。
感谢河南理工大学计算机科学与技术学院四年来提供的学习平台和科研环境。
感谢家人和朋友在学业期间的理解、支持与鼓励。
% --- 附录 ---
% ==================== 附录 ====================
\appendix
\chapter{核心代码清单}
本文核心代码已开源,完整项目结构及运行说明见附录B。
\chapter{系统运行说明}
\section{环境配置}
本项目使用 Python 3.13,依赖管理使用 uv。主要依赖包括 PyTorch、XGBoost、Flask、ECharts 等。
\section{运行步骤}
\begin{enumerate}
\item 安装依赖:\texttt{uv pip install -e .}
\item 数据获取:\texttt{python -m src.data.download\_era5}
\item 数据预处理:\texttt{python -m src.data.preprocess}
\item 模型训练:\texttt{python -m src.models.train}
\item 启动可视化:\texttt{python -m src.web.app}
\item 浏览器访问:\texttt{http://localhost:5005}
\end{enumerate}
\ctexset{
chapter={
format={\centering\zihao{-2}\heiti\bfseries},
name={附录}, number=\Alph{chapter},
},
}
\input{chapters/appendix-a-code}
\input{chapters/appendix-b-run}
\input{chapters/appendix-c-config}
\end{document}
+93
View File
@@ -86,3 +86,96 @@
number = {8},
pages = {087006},
}
@misc{ipcc2023ar6,
author = {{IPCC}},
title = {Climate Change 2023: Synthesis Report. Contribution of Working Groups I, II and III to the Sixth Assessment Report},
year = {2023},
howpublished = {Geneva: IPCC},
}
@misc{wmo2024state,
author = {{WMO}},
title = {State of the Global Climate 2023},
year = {2024},
howpublished = {Geneva: World Meteorological Organization},
}
@article{lin2017focal,
author = {Lin, T. Y. and Goyal, P. and Girshick, R. and He, K. and Dollar, P.},
title = {Focal Loss for Dense Object Detection},
journal = {IEEE Transactions on Pattern Analysis and Machine Intelligence},
year = {2020},
volume = {42},
number = {2},
pages = {318--327},
}
@article{bahdanau2014attention,
author = {Bahdanau, D. and Cho, K. and Bengio, Y.},
title = {Neural Machine Translation by Jointly Learning to Align and Translate},
journal = {arXiv preprint arXiv:1409.0473},
year = {2014},
}
@article{curriero2002temperature,
author = {Curriero, F. C. and Heiner, K. S. and Samet, J. M. and Zeger, S. L. and Strug, L. and Patz, J. A.},
title = {Temperature and Mortality in 11 Cities of the Eastern United States},
journal = {American Journal of Epidemiology},
year = {2002},
volume = {155},
number = {1},
pages = {80--87},
}
@article{rothfusz1990heat,
author = {Rothfusz, L. P.},
title = {The Heat Index Equation (or, More Than You Ever Wanted to Know About Heat Index)},
journal = {NWS Southern Region Technical Attachment},
year = {1990},
number = {SR 90-23},
}
@article{zhou2021informer,
author = {Zhou, H. and Zhang, S. and Peng, J. and Zhang, S. and Li, J. and Xiong, H. and Zhang, W.},
title = {Informer: Beyond Efficient Transformer for Long Sequence Time-Series Forecasting},
journal = {Proceedings of the AAAI Conference on Artificial Intelligence},
year = {2021},
volume = {35},
number = {12},
pages = {11106--11115},
}
@article{wu2021autoformer,
author = {Wu, H. and Xu, J. and Wang, J. and Long, M.},
title = {Autoformer: Decomposition Transformers with Auto-Correlation for Long-Term Series Forecasting},
journal = {Advances in Neural Information Processing Systems},
year = {2021},
volume = {34},
}
@article{ke2017lightgbm,
author = {Ke, G. and Meng, Q. and Finley, T. and Wang, T. and Chen, W. and Ma, W. and Ye, Q. and Liu, T. Y.},
title = {LightGBM: A Highly Efficient Gradient Boosting Decision Tree},
journal = {Advances in Neural Information Processing Systems},
year = {2017},
volume = {30},
}
@article{magnus1844,
author = {Magnus, G.},
title = {Versuche {\"u}ber die Spannkr{\"a}fte des Wasserdampfs},
journal = {Annalen der Physik},
year = {1844},
volume = {137},
number = {2},
pages = {225--247},
}
@misc{china_climate_bluebook2024,
author = {{中国气象局}},
title = {中国气候变化蓝皮书(2024},
year = {2024},
howpublished = {北京: 中国气象局气候变化中心},
}
Generated
+4635
View File
File diff suppressed because it is too large Load Diff