216 lines
13 KiB
TeX
216 lines
13 KiB
TeX
\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顺序读取速度)。
|
||
|