\chapter{数据获取与预处理} 本章详细描述从原始ERA5-Land再分析数据到机器学习就绪数据集的全流程管线,包括数据获取、质量控制、体感温度计算、特征工程和序列化构建。 \section{研究区域与数据时空范围} 本研究选取焦作市(35.24°N, 113.22°E)和郑州市(34.75°N, 113.62°E)为研究区域,两市同属暖温带大陆性季风气候,夏季炎热特征显著。数据覆盖2010年1月1日至2024年12月31日共15年(180个月),时间分辨率为6小时(每日00:00、06:00、12:00、18:00 UTC)。 ERA5-Land数据集的原始空间分辨率为0.1°×0.1°(约9 km),本研究以城市坐标为中心,截取±0.5°范围的网格区域(约11×11网格点),覆盖城区及近郊范围,兼顾城区热岛效应和郊区对照。 \section{数据来源} \subsection{ERA5-Land气象再分析数据} ERA5-Land是欧洲中期天气预报中心(ECMWF)生产的全球陆地表面再分析数据集,是ERA5的增强版本,在陆地变量上具有更高的空间分辨率(0.1° vs 0.25°)。数据通过Copernicus Climate Data Store (CDS) API获取,使用cdsapi Python库(v0.7.7)逐月下载。 本研究获取以下6个气象变量: \begin{table}[H] \centering \caption{ERA5-Land获取变量一览} \begin{tabular}{cccc} \toprule \textbf{NetCDF变量名} & \textbf{中文名称} & \textbf{单位} & \textbf{原始时间分辨率} \\ \midrule t2m & 2m气温 & K & 6小时 \\ d2m & 2m露点温度 & K & 6小时 \\ sp & 地表气压 & Pa & 6小时 \\ u10 & 10m风速U分量 & m/s & 6小时 \\ v10 & 10m风速V分量 & m/s & 6小时 \\ tp & 总降水量 & m & 6小时(累积) \\ \bottomrule \end{tabular} \end{table} 每城市每月生成1个NetCDF文件,两城市共360个文件,数据总量约76 MB。经ZIP解压后得到标准NetCDF4格式,使用h5netcdf后端通过xarray库进行读取和拼接。每个文件包含约124个时间步(31天×4时次/天),单个城市15年拼接后共21,916个时间步。 \subsection{人口与健康数据} 人口数据来源于第七次全国人口普查公报(2020年)以及河南省统计年鉴,包括分年龄段人口结构(0-14岁、15-64岁、65岁及以上)、老龄化率等基础指标。暴露-反应关系参考Chen等(2018)发表的中国多城市温度-死亡关联曲线,构建了13点暴露-反应映射表(温度-相对风险)。 \section{数据预处理管线} 预处理管线包含8个顺序步骤,由Python脚本\texttt{src/data/preprocess.py}实现,自动遍历焦作和郑州两个城市。 \subsection{步骤1:多文件加载与拼接} 使用xarray的\texttt{open\_mfdataset}函数,以\texttt{by\_coords}模式沿valid\_time维度拼接同城市的所有月度NetCDF文件。拼接后按时间排序并去重,确保时间轴的连续性和单调性。 \subsection{步骤2:日聚合与单位转换} 将6小时间隔数据按valid\_time重采样为日平均值,并执行单位转换: \begin{itemize} \item 温度变量:K $\rightarrow$ °C($T_C = T_K - 273.15$) \item 降水量:m $\rightarrow$ mm($\times 1000$),ERA5降水变量存储的是日均累积值 \item 列重命名:t2m→temp\_mean, d2m→dewpoint\_mean, sp→pressure\_mean, u10→u\_wind, v10→v\_wind, tp→precip \end{itemize} 单个城市日聚合后生成约5,479条日记录(15年×365天,扣除闰年差异和非完整日)。 \subsection{步骤3:相对湿度计算} 利用Magnus公式从气温和露点温度计算相对湿度(详见第2.4.1节式2.17-2.19)。湿度值是体感温度计算的关键输入,也是独立的气候特征。 \subsection{步骤4:体感温度计算} 利用NOAA Rothfusz公式计算每日体感温度(Heat Index,详见第2.4.2节式2.20-2.24)。体感温度融合了气温和湿度的联合效应,是高温健康风险评估的核心指标。当气温低于26.7°C时使用简化线性公式,高于此阈值时使用完整Rothfusz回归,并进行NOAA标准湿度修正。 \subsection{步骤5:特征工程} 在6个基础气象变量+相对湿度+体感温度共8个直接变量的基础上,构建以下衍生特征(共19维): \begin{table}[H] \centering \caption{特征工程构建的衍生特征(共19维)} \begin{tabular}{cll} \toprule \textbf{序号} & \textbf{特征名} & \textbf{说明} \\ \midrule 1-2 & latitude, longitude & 网格中心经纬度 \\ 3 & temp\_mean & 日均气温(°C) \\ 4 & dewpoint\_mean & 日均露点温度(°C) \\ 5 & pressure\_mean & 日均地表气压(hPa) \\ 6 & u\_wind & 10m风速U分量 \\ 7 & v\_wind & 10m风速V分量 \\ 8 & precip & 日均降水量(mm) \\ 9 & rh & 日均相对湿度(\%),Magnus公式 \\ 10 & heat\_index & 体感温度(°C),NOAA公式 \\ 11 & temp\_7d\_avg & 7天滚动平均气温 \\ 12 & temp\_14d\_avg & 14天滚动平均气温 \\ 13 & temp\_lag\_0 & 当前温度(同temp\_mean) \\ 14 & temp\_lag\_1 & 前1天温度滞后 \\ 15 & temp\_lag\_3 & 前3天温度滞后 \\ 16 & temp\_lag\_7 & 前7天温度滞后 \\ 17 & heatwave & 热浪标识(≥3天HI>32°C) \\ 18 & heatwave\_strength & 热浪强度(连续高温天数) \\ \bottomrule \end{tabular} \end{table} 滞后特征用于捕捉温度的短期自回归效应——今天的风险不仅取决于今天的温度,还受前期热量累积的影响。热浪标识和强度特征则捕捉持续性高温事件的叠加效应。 \subsection{步骤6:风险标签计算} 基于日均体感温度(Heat Index),按照第2.4.3节定义的阈值将每条日记录标注为0-3级风险标签。对于多时间尺度预测任务,标签为未来窗口内的众数风险等级(多数投票法)。 \subsection{步骤7:滑动窗口序列构建} 采用长度为14天的滑动窗口,从日特征数据中生成监督学习样本: \begin{itemize} \item \textbf{输入X}:连续14天×19特征的矩阵,形状为(14, 19) \item \textbf{输出y}:三元组(短期标签, 中期标签, 长期标签),分别对应未来3天、7天和30天的众数风险等级 \end{itemize} 滑动窗口从第14天开始滑动至倒数第30天(为长期预测保留足够的未来标签),单个城市约生成547,879条样本。 \subsection{步骤8:数据集保存与合并} 将每个城市的序列数据保存为压缩NPZ格式,同时生成合并数据集: \begin{table}[H] \centering \caption{预处理产出文件} \begin{tabular}{lcc} \toprule \textbf{文件} & \textbf{样本数} & \textbf{说明} \\ \midrule jiaozuo\_sequences.npz & 547,879 & 焦作市序列数据,X(14,19), y(3,) \\ zhengzhou\_sequences.npz & 547,879 & 郑州市序列数据,X(14,19), y(3,) \\ sequences\_combined.npz & 1,095,758 & 两市合并序列数据 \\ features\_jiaozuo.csv & 547,893 & 焦作日特征CSV \\ features\_zhengzhou.csv & 547,893 & 郑州日特征CSV \\ features\_combined.csv & 1,095,786 & 两市合并日特征CSV \\ \bottomrule \end{tabular} \end{table} \section{类别分布与数据不平衡} 预处理后的风险标签分布呈现极度的类别不平衡: \begin{table}[H] \centering \caption{训练集风险等级分布(基于y\_short标签)} \begin{tabular}{lccc} \toprule \textbf{风险等级} & \textbf{焦作市} & \textbf{郑州市} & \textbf{占比} \\ \midrule 0级(低风险) & 529,142 (96.6\%) & 515,007 (94.0\%) & 约94-97\% \\ 1级(中风险) & 10,437 (1.9\%) & 17,118 (3.1\%) & 约2-3\% \\ 2级(高风险) & 5,921 (1.1\%) & 11,098 (2.0\%) & 约1-2\% \\ 3级(严重风险)& 2,379 (0.4\%) & 4,656 (0.9\%) & <1\% \\ \bottomrule \end{tabular} \end{table} 这一极度不平衡(多数类比少数类多两个数量级以上)是机器学习建模面临的核心挑战,直接影响了后续损失函数的选择(Focal Loss vs Cross-Entropy)和模型训练的收敛行为。 \section{数据集划分} 采用严格的时间序列划分(不打乱样本),以模拟真实预测场景「用历史数据训练、预测未来」: \begin{itemize} \item \textbf{训练集:}70\%(约767,030条),对应2010年至约2020年中期 \item \textbf{验证集:}15\%(约164,363条),对应约2020年中期至2022年中期 \item \textbf{测试集:}15\%(约164,365条),对应约2022年中期至2024年12月 \end{itemize} 时间序列划分确保测试集中的数据在时间上完全晚于训练集,避免数据泄露(Data Leakage)。所有标准化参数(均值、标准差)仅基于训练集计算,然后应用于验证集和测试集。