\chapter{数据获取与预处理} 本章详细描述从原始ERA5-Land再分析数据到机器学习就绪数据集的全流程管线,包括数据获取架构、质量控制、体感温度计算、特征工程、探索性数据分析和序列化构建。全流程在Python 3.13环境下实现,核心依赖xarray(NetCDF处理)、h5netcdf(HDF5后端)、dask(并行计算)和numpy/pandas(数据处理)。 \section{研究区域与数据时空范围} 本研究选取焦作市(35.24°N, 113.22°E)和郑州市(34.75°N, 113.62°E)为研究区域。数据时间覆盖2010年1月1日至2024年12月31日共15年(180个月),取每城市坐标为中心±0.5°(约±55 km)的网格区域,该范围覆盖城区和近郊,兼顾城市热岛效应和乡村对照。 ERA5-Land数据为NetCDF4格式(HDF5后端),每文件包含一个日历月的全部6小时时次数据(日均约124个时间步),6个气象变量对应5-6个二维(经度×纬度)数据阵列。 \section{数据获取架构} \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$ZIP,CDF$\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 温度变量(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{步骤3-4:相对湿度与体感温度} 利用Magnus公式和NOAA Rothfusz公式(详见第2.4节)分别计算日均相对湿度(rh, \%)和体感温度(heat\_index, °C)。这是将"纯气象"数据转化为"健康相关"指标的关键步骤——体感温度融合了气温和湿度的协同效应,更准确地反映了人体感知的热应激水平。 \subsection{步骤5:特征工程} 在基础变量之上构建多维衍生特征(共19维),如表\ref{tab:features}所示。 \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} 滞后特征捕捉温度的短期自回归效应——「今天的风险不仅取决于今天的热度,还取决于过去一周内热量在人体和建筑环境中的累积」。热浪特征标识持续性高温的叠加效应——连续3天以上高温比孤立高温日对健康的影响显著更大。 \subsection{步骤6:风险标签生成} 基于日均体感温度(heat\_index),按照表2.1的四级阈值标注每条日记录的风险等级(0-3)。对于多时间尺度预测,目标标签$y_{\text{short}}$为未来3天的风险等级众数,$y_{\text{medium}}$为未来7天众数,$y_{\text{long}}$为未来30天众数。众数投票(而非均值)保留了风险等级的离散性质。 \subsection{步骤7-8:滑动窗口与数据集保存} 以14天为窗口长度、1天为步长,从时序特征数据中生成监督学习样本。产出文件如表\ref{tab:outputs}所示。 \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} \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,142(96.6\%) & 515,007(94.0\%) & 1,044,149(95.3\%) \\ 1级(中风险) & 10,437(1.9\%) & 17,118(3.1\%) & 27,555(2.5\%) \\ 2级(高风险) & 5,921(1.1\%) & 11,098(2.0\%) & 17,019(1.6\%) \\ 3级(严重风险)& 2,379(0.4\%) & 4,656(0.9\%) & 7,035(0.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 \textbf{训练集}:前70\%样本(~767,030条),对应2010年至约2020年中期 \item \textbf{验证集}:中间15\%样本(~164,363条),约2020-2022年中期 \item \textbf{测试集}:最后15\%样本(~164,365条),约2022-2024年 \end{itemize} 时间序列分割的关键优势在于避免「未来信息泄露」——如果随机打乱,模型可能从「未来」样本中学习到季节模式并在「历史」样本上测试,导致评估结果虚高。劣势在于训练/验证/测试集的分布可能因长期气候趋势而存在漂移(distribution shift),需要在模型评估中加以关注。 \section{特征相关性分析} 为理解特征之间的共线性结构及其对模型训练的潜在影响,计算了19维特征之间的Pearson相关系数矩阵。关键发现如下: \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} 高度相关的特征对(如temp\_mean与heat\_index)在理论上存在信息冗余,但保留两者具有互补价值:temp\_mean是气象预报的标准输出变量(所有数值天气预报模型均输出),heat\_index是经NOAA公式转换后的生理意义指标(直接关联健康风险等级),两者在特征空间中提供了不同视角的信息。XGBoost的树分裂机制对特征共线性具有天然鲁棒性(每次分裂仅选单特征),LSTM的投影层也可学习去相关表示。 \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顺序读取速度)。