Files
elderly-heat-warning/thesis/chapters/ch3-data.tex
T

216 lines
13 KiB
TeX
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
\chapter{数据获取与预处理}
本章详细描述从原始ERA5-Land再分析数据到机器学习就绪数据集的全流程管线,包括数据获取架构、质量控制、体感温度计算、特征工程、探索性数据分析和序列化构建。全流程在Python 3.13环境下实现,核心依赖xarrayNetCDF处理)、h5netcdfHDF5后端)、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$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 温度变量(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,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 \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顺序读取速度)。