diff --git a/thesis/chapters/ch1-intro.tex b/thesis/chapters/ch1-intro.tex index 556dff5..b1c7eb0 100644 --- a/thesis/chapters/ch1-intro.tex +++ b/thesis/chapters/ch1-intro.tex @@ -2,66 +2,106 @@ \section{研究背景} -全球气候变化是21世纪人类面临的最重大公共卫生挑战之一。根据世界气象组织(WMO)2024年发布的报告,2023年全球平均气温较工业化前水平上升约1.45°C,创下有记录以来的最高值。政府间气候变化专门委员会(IPCC)第六次评估报告指出,全球平均气温每升高0.5°C,极端高温事件的频率和强度将呈非线性增长。在此背景下,高温热浪已从偶发性气象事件演变为常态化的公共卫生威胁。 +\subsection{全球气候变化与极端高温} -中国是全球受高温热浪影响最为显著的国家之一。中国气象局《2023年中国气候公报》数据显示,2023年全国平均高温日数(日最高气温≥35°C)为11.3天,较常年偏多4.1天,为1961年以来第二多。河南省作为中原腹地,夏季受副热带高压控制,高温天气持续时间长、强度大。2022年6月河南省出现持续性高温天气,多地最高气温突破40°C,郑州、焦作等城市连续高温日数超过10天。 +全球气候变化是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。 -\section{银发群体的高温脆弱性} +极端高温事件是全球变暖最直接的健康效应传导路径。IPCC AR6以中等信度指出,1950年以来全球大部分陆地区域的暖昼和暖夜频率增加、冷昼和冷夜频率减少,热浪事件的持续时间、强度和频率均呈上升趋势。世界气象组织(WMO)2024年报告确认2023年为有气象记录以来最热年份,全球平均气温较工业化前上升约1.45°C,海洋热含量、海平面上升、冰川消融等多项气候指标均创历史极值。 -老年群体(65岁及以上)是高温热浪健康效应最敏感的亚群。其脆弱性根植于生理、社会和经济三个层面: +中国是全球气候变化的敏感区和影响显著区。《中国气候变化蓝皮书(2024)》显示,1901-2023年中国地表年平均气温呈显著上升趋势,平均每10年升高0.16°C,高于同期全球平均水平。1951-2023年中国平均年降水量也呈增加趋势。2023年全国平均气温为10.71°C,较常年偏高0.82°C,为1961年以来第二高。 -\textbf{生理层面:}老年人皮肤血流量减少、出汗率降低,体温调节功能显著退化;同时心血管疾病、糖尿病、慢性呼吸系统疾病等基础病的患病率随年龄递增,高温应激可诱发或加重这些疾病。研究表明,当体感温度(Heat Index)超过32°C时,65岁以上人群的全因死亡风险开始显著上升;当体感温度超过38°C时,心血管疾病死亡风险增加30\%-50\%。 +\subsection{中国的高温热浪态势} -\textbf{社会层面:}空巢老人比例持续上升,独居状态下高温防护意识和应对能力不足。第七次全国人口普查数据显示,中国65岁及以上人口已达1.91亿(占比13.5\%),其中独居老人超过3,000万。 +中国气象局《2023年中国气候公报》指出,2023年全国平均高温日数(日最高气温≥35°C)为11.3天,较常年(7.2天)偏多4.1天。2022年夏季,中国经历了1961年以来最强的高温热浪事件,中央气象台连续41天发布高温预警,其中高温红色预警连续发布了12天。长江流域多地最高气温突破44°C,约5亿人口受到影响。 -\textbf{经济层面:}老年人收入水平普遍偏低,空调等降温设备的使用率受经济条件制约。农村地区老人面临的降温条件更为有限。 +河南省处于中国南北气候过渡带,夏季同时受副热带高压和大陆暖高压控制,高温天气频发。郑州、焦作等城市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{研究区域选择} 本研究选取焦作市和郑州市作为研究区域,理由如下: -焦作市位于河南省西北部,总面积4,071 km$^2$,常住人口约352万(2023年),65岁及以上人口占比约12.8\%。焦作地处太行山南麓,地形以山地丘陵为主,夏季高温叠加地形效应使得城区热环境较为复杂。 +\textbf{焦作市}位于河南省西北部(35.24°N, 113.22°E),总面积4,071 km$^2$,2023年常住人口约352万,65岁及以上人口占比约12.8\%。焦作北依太行山,地形以山地丘陵为主(约占57\%),城区海拔80-120m,夏季高温叠加山区焚风效应使得城市热环境较为复杂。2021年城镇化率约64.7\%。 -郑州市是河南省省会,总面积7,446 km$^2$,常住人口约1,274万(2023年),65岁及以上人口占比约11.6\%。郑州作为国家中心城市和重要的交通枢纽,城镇化率超过78\%,城市热岛效应显著。两市的城镇化率均超过65\%,城市热岛效应与人口老龄化叠加,使得高温健康防护问题尤为突出。 +\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。 -两市同属暖温带大陆性季风气候,年平均气温14-15°C,7月平均气温27-28°C,极端最高气温超过42°C。两市地理邻近(相距约70 km),气象条件相似但城市规模和人口结构差异明显,形成了有价值的对比研究场景。 +两市地理邻近(直线距离约70 km),同属暖温带大陆性季风气候,年平均气温14-15°C,7月平均气温27-28°C,极端最高气温超过42°C。气象条件相似但城市规模和人口结构差异明显(郑州人口约为焦作的3.6倍,但老龄化率略低),形成了有价值的对比研究场景。 \section{国内外研究现状} \subsection{高温-健康关联的流行病学研究} -温度与死亡率的暴露-反应关系是环境流行病学的经典议题。Gasparrini等(2015)在\textit{The Lancet}发表的多国多城市研究(涵盖13个国家384个城市)是里程碑式成果,发现温度-死亡关联通常呈J型或V型曲线,最适温度(Minimum Mortality Temperature, MMT)因地理位置而异,高温端的相对风险(Relative Risk, RR)显著升高。Chen等(2018)在\textit{The Lancet Planetary Health}发表了中国272个城市的研究,为中国人群提供了本土化的温度-死亡暴露-反应曲线,发现在中国北方城市高温效应更为显著。 +温度-死亡暴露-反应关系的定量研究是环境流行病学的核心议题。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之间。 + +Chen等\cite{chen2018heat}在\textit{The Lancet Planetary Health}发表了迄今为止中国最大规模的温度-死亡多城市研究,覆盖272个城市2013-2015年间的1,800万死亡记录,发现中国人群总死亡风险的最适温度约为22.8°C,极端高温(99百分位 vs MMT)对应的相对风险为1.21(95\% CI: 1.15-1.28),且在中国北方城市高温效应更为显著。心血管死亡的RR为1.35(1.27-1.44),呼吸系统死亡的RR为1.26(1.10-1.44)。 \subsection{高温健康预警系统(HHWS)} -国际上,法国在2003年热浪导致约15,000人超额死亡后建立了国家高温健康预警计划(Plan Canicule),采用三色预警体系。美国NOAA开发了HeatRisk原型系统,综合考虑温度、湿度和人口脆弱性。世界卫生组织(WHO)和世界气象组织(WMO)联合发布了HHWS技术指南。 +高温健康预警系统(Heat Health Warning System, HHWS)起源于对极端高温事件的公共卫生响应。国际上代表性的HHWS包括: -国内方面,中国气象局建立了高温预警信号体系(黄色、橙色、红色三级),基于日最高气温阈值。上海、深圳等城市开展了高温健康预警试点,初步将健康终点数据纳入预警逻辑。但总体而言,国内HHWS仍以气象指标为主,缺乏对脆弱人群的精细化评估和多时间尺度的前瞻性预测能力。 +\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{深度学习在环境健康预测中的应用} +\subsection{机器学习在环境健康预测中的应用} -传统时间序列预测方法(ARIMA、指数平滑、VAR)受限于线性和平稳性假设,难以应对气象-健康关联中的非线性效应。随着深度学习发展,LSTM(Hochreiter \& Schmidhuber, 1997)等循环神经网络在气象时序预测中展现出优势。注意力机制(Vaswani等, 2017)进一步增强了模型对长距离时序依赖的捕捉能力。 +传统时序预测方法(ARIMA、SARIMA、指数平滑、VAR)受限于线性假设和平稳性要求,难以捕捉气象-健康关联中的非线性效应。近年来,深度学习在该领域取得了显著进展: -在环境健康领域,将深度学习应用于高温健康风险预测的研究尚处于起步阶段。现有工作多聚焦于单一时间尺度的预测,且较少针对银发群体进行特定建模。 +\textbf{循环神经网络方面}:LSTM\cite{hochreiter1997lstm}通过门控机制缓解了梯度消失问题,在气象时序预测中广泛使用。BiLSTM通过双向编码增强了上下文感知能力。Stacked LSTM(多层堆叠)进一步提升了特征抽取的层次性。 + +\textbf{注意力机制方面}:Vaswani等\cite{vaswani2017attention}提出的Transformer架构以自注意力替代循环结构,在NLP和CV领域取得了突破性进展。Informer(Zhou等, 2021)通过ProbSparse自注意力和自注意力蒸馏降低了长序列预测的计算复杂度。Autoformer(Wu等, 2021)引入自相关机制替代自注意力,专为季节-趋势分解设计。 + +\textbf{梯度提升方面}:XGBoost\cite{chen2016xgboost}通过二阶泰勒展开、正则化目标和并行计算在表格数据上取得了SOTA性能。LightGBM(Ke等, 2017)引入GOSS和EFB进一步提升了训练效率。CatBoost(Prokhorenkova等, 2018)对类别特征的原生支持降低了预处理成本。 + +\textbf{环境健康应用方面}:将深度学习方法应用于高温健康风险预测的研究仍处于起步阶段。现有工作多聚焦于单一时间尺度的传染病或空气污染预测,将多时间尺度高温预警与人群脆弱性(特别是银发群体)结合的综合性工作仍为空白。本研究正是针对这一空白,探索深度学习模型(LSTM-Attention)和梯度提升模型(XGBoost)在面向银发群体的多时间尺度高温健康风险预警中的适用性。 \section{研究目的与意义} 本研究旨在构建面向银发群体的多时间尺度(短期3天、中期7天、长期30天)高温健康风险预警模型,并通过Web可视化大屏实现预警信息的直观呈现。 -研究意义包括:(1)\textbf{方法创新}——将双向LSTM与多头自注意力机制结合,同时引入Focal Loss解决样本极度不平衡问题,探索深度序列模型在环境健康预测中的适用性与局限性;(2)\textbf{实用价值}——XGBoost模型在三个时间尺度上均取得F1>0.85的优异性能,可直接支撑实际预警决策;(3)\textbf{可视化赋能}——Web大屏将复杂模型输出转化为面向政府管理者、社区工作者和公众的可理解信息,降低预警信息的使用门槛。 +研究的科学意义和实用价值包括: + +\begin{enumerate} + \item \textbf{方法探索}——系统比较深度学习(LSTM-Attention)与梯度提升(XGBoost)在极度类别不平衡条件下的性能差异,为环境健康预测领域的建模选择提供实证参考。 + \item \textbf{多时间尺度覆盖}——区别于已有研究多聚焦单一预测窗口,本研究同时覆盖短期(操作性预警)、中期(资源调配)和长期(季节性规划)三个决策时间尺度。 + \item \textbf{可视化赋能}——将复杂的模型输出转化为面向多层次用户(政府管理者、社区工作者、公众)的可理解信息,降低数据驱动决策的使用门槛。 + \item \textbf{区域针对性}——以中原地区两市为研究靶区,填补该区域面向银发群体的高温健康预警研究空白。 +\end{enumerate} \section{研究内容与技术路线} -本研究的工作流程为:数据获取→预处理与特征工程→模型训练与评估→可视化系统构建。具体内容如下: +本研究的工作流程分为五个阶段: \begin{enumerate} - \item \textbf{多源数据获取}:通过CDS API获取2010-2024年ERA5-Land网格气象数据(2m温度、2m露点温度、地表气压、10m风速U/V分量、总降水量共6变量),结合中国卫生统计年鉴数据构建人口健康基线。 - \item \textbf{数据预处理与特征工程}:6小时间隔数据聚合为日尺度→K至°C单位转换→Magnus公式计算相对湿度→NOAA Rothfusz公式计算体感温度→构建19维衍生特征(滚动均值、滞后特征、热浪检测、季节编码)。 - \item \textbf{多时间尺度预警模型}:设计LSTM-Attention深度学习模型(983,628参数)和XGBoost基线模型,分别预测短期(3天)、中期(7天)和长期(30天)高温健康风险等级(0-低、1-中、2-高、3-严重)。 - \item \textbf{模型评估与对比}:在时间序列分割的测试集(2023-2024年数据,164,365条样本)上系统对比两种模型的性能。 - \item \textbf{可视化大屏开发}:基于Flask后端和ECharts前端,实现六大功能面板的Web可视化大屏。 + \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-Attention(983K参数,Focal Loss)和XGBoost(200棵树)在训练集上训练→验证集调参→测试集评估→混淆矩阵和F1分数对比。 + \item \textbf{可视化系统开发阶段}:Flask后端(4 API)→ECharts前端(6面板)→深色科技蓝大屏→浏览器访问。 \end{enumerate} \section{论文组织结构} -本论文共分七章:第一章阐述研究背景、国内外现状和研究意义;第二章介绍LSTM、注意力机制、XGBoost等核心理论以及高温健康风险相关概念;第三章详述数据来源和预处理管线,包括ERA5数据获取、体感温度计算、特征工程和数据集构建;第四章介绍LSTM-Attention和XGBoost两类预警模型的设计细节;第五章展示Flask+ECharts可视化大屏的架构和实现;第六章进行实验结果分析,包括模型性能对比、混淆矩阵分析和LSTM训练优化记录;第七章总结全文并展望未来工作。 +本论文共分七章:\textbf{第一章}阐述研究背景、国内外研究现状、研究目的和技术路线;\textbf{第二章}详细介绍LSTM、注意力机制、XGBoost和体感温度计算等核心理论,给出完整数学公式;\textbf{第三章}详述ERA5数据获取、预处理管线、特征工程和数据集构建过程;\textbf{第四章}展示LSTM-Attention和XGBoost两类预警模型的设计细节和训练策略;\textbf{第五章}介绍Flask+ECharts可视化大屏的架构和实现;\textbf{第六章}进行实验结果分析,包括模型性能对比、混淆矩阵分析、LSTM训练调优记录和细节性误差分析;\textbf{第七章}总结全文,讨论研究不足并展望未来工作方向。 diff --git a/thesis/chapters/ch2-theory.tex b/thesis/chapters/ch2-theory.tex index bf179c1..d635993 100644 --- a/thesis/chapters/ch2-theory.tex +++ b/thesis/chapters/ch2-theory.tex @@ -1,25 +1,62 @@ \chapter{相关理论与技术基础} -\section{LSTM神经网络} +本章系统阐述研究涉及的核心理论与技术,包括循环神经网络的数学基础、LSTM与BiLSTM的原理、注意力机制的完整推导、XGBoost算法细节、体感温度计算方法以及Focal Loss的理论分析。 -长短期记忆网络(Long Short-Term Memory, LSTM)由Hochreiter和Schmidhuber于1997年提出,是循环神经网络(RNN)的重要变体。传统RNN在处理长序列时因梯度消失/爆炸问题难以学习远距离依赖,LSTM通过引入门控机制有效解决了这一问题。 +\section{循环神经网络与长短期记忆} + +\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)$\mathbf{C}_t$,贯穿整个序列的信息传递通道,由三个门控结构(遗忘门、输入门、输出门)进行调控: +长短期记忆网络(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} @@ -27,11 +64,11 @@ LSTM单元的核心是一个细胞状态(cell state)$\mathbf{C}_t$,贯穿 \mathbf{h}_t = \mathbf{o}_t \odot \tanh(\mathbf{C}_t) \end{equation} -其中,$\sigma$为sigmoid激活函数,$\odot$为逐元素乘积,$\mathbf{f}_t$、$\mathbf{i}_t$、$\mathbf{o}_t$分别为遗忘门、输入门和输出门的激活向量,$\tilde{\mathbf{C}}_t$为候选细胞状态。遗忘门控制前一时刻细胞状态的保留比例,输入门决定新信息的写入量,输出门调节细胞状态对隐藏状态的贡献。 +其中$\sigma(\cdot)$为sigmoid函数,$\odot$为逐元素乘积(Hadamard积)。遗忘门的sigmoid输出范围(0,1)允许网络自适应地决定信息保留程度,这是LSTM缓解梯度消失的关键——当$\mathbf{f}_t \approx 1$时,梯度可通过细胞状态近乎无损地回传。 -\subsection{双向LSTM} +\subsection{双向LSTM(BiLSTM)} -双向LSTM(Bidirectional LSTM, BiLSTM)由前向LSTM和后向LSTM组成,分别从序列的正向和反向读取输入: +双向LSTM由前向LSTM和后向LSTM组成,分别从序列的正向和反向处理输入: \begin{equation} \overrightarrow{\mathbf{h}}_t = \text{LSTM}_{\text{fwd}}(\mathbf{x}_t, \overrightarrow{\mathbf{h}}_{t-1}) @@ -43,141 +80,227 @@ LSTM单元的核心是一个细胞状态(cell state)$\mathbf{C}_t$,贯穿 \mathbf{h}_t^{\text{bi}} = [\overrightarrow{\mathbf{h}}_t; \overleftarrow{\mathbf{h}}_t] \end{equation} -BiLSTM在每个时间步同时利用过去和未来的上下文信息,在气象时序预测中特别有用——某一天的温度既受前期天气积累影响,也与后续天气系统的演变有关。 +在气象时序预测中,BiLSTM的优势在于每个时间步的表示同时融合了前后文信息——某一天的温度既受前期天气累积影响(前向),也与即将到来的天气系统演变有关(后向)。 \section{注意力机制} -注意力机制(Attention Mechanism)由Bahdanau等(2014)首次引入序列到序列学习,其核心思想是动态地为输入序列的不同位置分配不同的重要性权重。Vaswani等(2017)提出的Transformer架构将注意力机制推向了新的高度。 +\subsection{注意力机制的起源} + +注意力机制的核心思想源于人类视觉系统中的选择性注意——在面对大量信息时,大脑会自动筛选出对当前任务最重要的部分进行深度加工。Bahdanau等(2014)首次将注意力机制引入神经机器翻译,允许解码器在每个解码步动态地关注编码器输出的不同位置,解决了固定长度上下文向量的信息瓶颈。 + +Vaswani等(2017)提出的Transformer架构完全基于注意力机制,舍弃了循环和卷积结构,在WMT翻译、BERT预训练和GPT生成等任务上取得了突破性进展。 \subsection{缩放点积注意力} -缩放点积注意力(Scaled Dot-Product Attention)是多头注意力的基础计算单元: +缩放点积注意力(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}$(Query)、$\mathbf{K}$(Key)、$\mathbf{V}$(Value)分别为查询、键和值矩阵,$d_k$为键向量的维度。除以$\sqrt{d_k}$的作用是防止点积值过大导致softmax梯度弥散。 +其中$\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{多头自注意力} -多头自注意力(Multi-Head Self-Attention)将$\mathbf{Q}$、$\mathbf{K}$、$\mathbf{V}$分别通过$h$个不同的线性投影映射到多个子空间,在每个子空间中独立计算注意力: +多头自注意力将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) +\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{Q} = \mathbf{K} = \mathbf{V} = \mathbf{X}$(输入序列)。每个注意力头可以从不同的表示子空间中关注序列的不同方面,例如某些头可能专注于温度的急剧变化,另一些头可能捕捉长期趋势。 +其中$\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算法} -XGBoost(eXtreme Gradient Boosting)由Chen和Guestrin于2016年提出,是梯度提升决策树(GBDT)的高效实现。其核心优势包括: +\subsection{梯度提升框架} -\textbf{正则化目标函数:}XGBoost在目标函数中引入了正则项以控制模型复杂度: +XGBoost(eXtreme Gradient Boosting)由Chen和Guestrin于2016年提出,是梯度提升决策树(GBDT)的高效实现。给定训练集$\{(\mathbf{x}_i, y_i)\}_{i=1}^n$,梯度提升以加法模型方式逐步集成$K$棵决策树: \begin{equation} -\mathcal{L}(\phi) = \sum_i l(\hat{y}_i, y_i) + \sum_k \Omega(f_k) -\end{equation} -\begin{equation} -\Omega(f) = \gamma T + \frac{1}{2}\lambda \|\mathbf{w}\|^2 +\hat{y}_i = \phi(\mathbf{x}_i) = \sum_{k=1}^{K} f_k(\mathbf{x}_i), \quad f_k \in \mathcal{F} \end{equation} -其中$T$为叶节点数量,$\mathbf{w}$为叶节点权重,$\gamma$和$\lambda$为正则化系数。 +其中$\mathcal{F} = \{f(\mathbf{x}) = w_{q(\mathbf{x})}\}$是回归树函数空间($q$将输入映射到叶节点索引,$w$为叶节点权重向量)。 -\textbf{二阶泰勒展开:}使用损失函数的二阶展开近似进行树的分裂增益计算,比传统GBDT的一阶近似更精确: +\subsection{正则化目标函数} + +第$t$轮迭代的目标函数为: \begin{equation} -\text{Gain} = \frac{1}{2}\left[\frac{(\sum_{i\in I_L} g_i)^2}{\sum_{i\in I_L} h_i + \lambda} + \frac{(\sum_{i\in I_R} g_i)^2}{\sum_{i\in I_R} h_i + \lambda} - \frac{(\sum_{i\in I} g_i)^2}{\sum_{i\in I} h_i + \lambda}\right] - \gamma +\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} -其中$g_i$和$h_i$分别为损失函数的一阶和二阶梯度。 +使用二阶泰勒展开近似: -\textbf{并行化与特征采样:}XGBoost支持特征级别的并行计算(按特征值排序)和列采样(类似随机森林),在大规模数据集上具有显著的效率优势。 +\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公式——相对湿度} -\subsection{Magnus公式——相对湿度计算} - -从ERA5-Land获取的2m温度($T$)和2m露点温度($T_d$)出发,使用Magnus公式计算相对湿度: +从ERA5-Land获取的2m温度($T$, °C)和2m露点温度($T_d$, °C)出发,使用Magnus公式计算相对湿度: +饱和水汽压(hPa): \begin{equation} -e_s(T) = \exp\left(\frac{17.27 \cdot T}{237.7 + T}\right) -\end{equation} -\begin{equation} -e_a(T_d) = \exp\left(\frac{17.27 \cdot T_d}{237.7 + T_d}\right) -\end{equation} -\begin{equation} -RH = 100 \times \frac{e_a(T_d)}{e_s(T)} = 100 \times \exp\left(\frac{17.27 \cdot T_d}{237.7 + T_d} - \frac{17.27 \cdot T}{237.7 + T}\right) +e_s(T) = 6.112 \times \exp\left(\frac{17.67 \times T}{T + 243.5}\right) \end{equation} -其中$e_s$为饱和水汽压(hPa),$e_a$为实际水汽压(hPa),$RH$为相对湿度(\%),温度单位为°C。 +实际水汽压(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公式——体感温度} -美国国家海洋和大气管理局(NOAA)提出的Rothfusz回归公式是体感温度(Heat Index, HI)计算的标准方法。以华氏度为计算单位,最终转换回摄氏度: +体感温度(Heat Index, HI)由NOAA的Rothfusz回归公式计算。首先将温度转换为华氏度:$T_F = T_C \times 1.8 + 32$。 +简化公式($T_F \leq 80$°F): \begin{equation} -T_F = T_C \times 1.8 + 32 +HI_F = 0.5 \times \left[T_F + 61.0 + (T_F - 68.0) \times 1.2 + RH \times 0.094\right] \end{equation} -当$T_F < 80$°F(约26.7°C)时,使用简化公式: -\begin{equation} -HI_F = 0.5 \times [T_F + 61.0 + (T_F - 68.0) \times 1.2 + RH \times 0.094] -\end{equation} - -当$T_F \geq 80$°F时,使用完整Rothfusz回归: +完整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 - 6.83783 \times 10^{-3} \times T_F^2 \\ - &- 5.481717 \times 10^{-2} \times RH^2 + 1.22874 \times 10^{-3} \times T_F^2 \times RH \\ - &+ 8.5282 \times 10^{-4} \times T_F \times RH^2 - 1.99 \times 10^{-6} \times T_F^2 \times RH^2 +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°F0$时,对已正确分类的高置信度样本($p_t$接近1)施加更大的衰减,从而将梯度信号集中于难分类的样本。本研究采用$\alpha=0.5, \gamma=2.0$作为默认参数。 +其中$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-Beta(cds-beta.climate.copernicus.eu),数据格式从直接NetCDF变为ZIP封装的NetCDF。本研究通过ZIP解压预处理步骤适配了这一格式变更。 \section{Flask框架与ECharts可视化} -Flask是Python生态中最广泛使用的轻量级Web框架之一,遵循WSGI标准,以路由装饰器和Jinja2模板引擎为核心特性。其\"微框架\"(microframework)设计理念使得开发者可自由组合扩展组件。本研究使用Flask提供4个RESTful API端点(预测、历史、统计、主页),前后端通过JSON格式进行数据交换。 - -ECharts是Apache基金会旗下的开源JavaScript可视化库(原为百度开发),支持折线图、柱状图、饼图、热力图、仪表盘等数十种图表类型。其声明式配置语法和丰富的交互特性(数据缩放、tooltip、图例切换)使其成为数据大屏开发的主流选择。本研究基于ECharts 5.5构建6个可视化面板。 +Flask是Python生态中最广泛使用的轻量级Web框架(WSGI微框架),核心特性包括路由装饰器、Jinja2模板引擎和丰富的扩展生态。ECharts是Apache基金会旗下的声明式JavaScript可视化库,支持37种图表类型和丰富的交互组件。两者通过RESTful JSON API实现前后端解耦,是数据科学Web应用开发的成熟技术栈。 diff --git a/thesis/chapters/ch3-data.tex b/thesis/chapters/ch3-data.tex index f8ea7b8..250c5ce 100644 --- a/thesis/chapters/ch3-data.tex +++ b/thesis/chapters/ch3-data.tex @@ -1,170 +1,215 @@ \chapter{数据获取与预处理} -本章详细描述从原始ERA5-Land再分析数据到机器学习就绪数据集的全流程管线,包括数据获取、质量控制、体感温度计算、特征工程和序列化构建。 +本章详细描述从原始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个月),时间分辨率为6小时(每日00:00、06:00、12:00、18:00 UTC)。 +本研究选取焦作市(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数据集的原始空间分辨率为0.1°×0.1°(约9 km),本研究以城市坐标为中心,截取±0.5°范围的网格区域(约11×11网格点),覆盖城区及近郊范围,兼顾城区热岛效应和郊区对照。 +ERA5-Land数据为NetCDF4格式(HDF5后端),每文件包含一个日历月的全部6小时时次数据(日均约124个时间步),6个气象变量对应5-6个二维(经度×纬度)数据阵列。 -\section{数据来源} +\section{数据获取架构} -\subsection{ERA5-Land气象再分析数据} +\subsection{CDS API下载策略} -ERA5-Land是欧洲中期天气预报中心(ECMWF)生产的全球陆地表面再分析数据集,是ERA5的增强版本,在陆地变量上具有更高的空间分辨率(0.1° vs 0.25°)。数据通过Copernicus Climate Data Store (CDS) API获取,使用cdsapi Python库(v0.7.7)逐月下载。 +通过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)。 -本研究获取以下6个气象变量: +受CDS服务器速率限制(单用户并发请求数限制为1-3个),本研究采用单线程逐月串行下载策略,配合指数退避重试机制(失败后等待$60 \times \text{attempt}$秒,最多5次)。单月数据下载耗时约2-30分钟(取决于CDS队列负载),两城市共360个文件的下载历时约5天。 -\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} +\subsection{数据格式适配} -每城市每月生成1个NetCDF文件,两城市共360个文件,数据总量约76 MB。经ZIP解压后得到标准NetCDF4格式,使用h5netcdf后端通过xarray库进行读取和拼接。每个文件包含约124个时间步(31天×4时次/天),单个城市15年拼接后共21,916个时间步。 +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{人口与健康数据} +\subsection{NetCDF引擎兼容性} -人口数据来源于第七次全国人口普查公报(2020年)以及河南省统计年鉴,包括分年龄段人口结构(0-14岁、15-64岁、65岁及以上)、老龄化率等基础指标。暴露-反应关系参考Chen等(2018)发表的中国多城市温度-死亡关联曲线,构建了13点暴露-反应映射表(温度-相对风险)。 +NetCDF4文件需要HDF5兼容的读取引擎。最初采用的netcdf4-Python库在Windows环境下存在兼容性问题(需要额外安装HDF5 DLL)。研究切换至h5netcdf+h5py方案:h5netcdf提供xarray兼容的NetCDF4读取接口,h5py处理底层HDF5文件操作。多文件拼接采用dask延迟计算框架以支持内存高效的大规模数据操作。 \section{数据预处理管线} -预处理管线包含8个顺序步骤,由Python脚本\texttt{src/data/preprocess.py}实现,自动遍历焦作和郑州两个城市。 +预处理管线由\texttt{src/data/preprocess.py}实现,包含8个顺序步骤,自动遍历两个城市。 \subsection{步骤1:多文件加载与拼接} -使用xarray的\texttt{open\_mfdataset}函数,以\texttt{by\_coords}模式沿valid\_time维度拼接同城市的所有月度NetCDF文件。拼接后按时间排序并去重,确保时间轴的连续性和单调性。 +使用xarray的\texttt{open\_mfdataset}函数,以\texttt{by\_coords}模式沿valid\_time维度拼接同一城市的所有月文件。拼接后通过\texttt{sortby}确保时间维度的单调递增,并对重复时间索引取唯一值。 \subsection{步骤2:日聚合与单位转换} -将6小时间隔数据按valid\_time重采样为日平均值,并执行单位转换: +将6小时间隔数据按天重采样为日平均值: + \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 + \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} -单个城市日聚合后生成约5,479条日记录(15年×365天,扣除闰年差异和非完整日)。 +\subsection{步骤3-4:相对湿度与体感温度} -\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标准湿度修正。 +利用Magnus公式和NOAA Rothfusz公式(详见第2.4节)分别计算日均相对湿度(rh, \%)和体感温度(heat\_index, °C)。这是将"纯气象"数据转化为"健康相关"指标的关键步骤——体感温度融合了气温和湿度的协同效应,更准确地反映了人体感知的热应激水平。 \subsection{步骤5:特征工程} -在6个基础气象变量+相对湿度+体感温度共8个直接变量的基础上,构建以下衍生特征(共19维): +在基础变量之上构建多维衍生特征(共19维),如表\ref{tab:features}所示。 \begin{table}[H] \centering -\caption{特征工程构建的衍生特征(共19维)} -\begin{tabular}{cll} +\caption{特征工程:19维输入特征详表} +\label{tab:features} +\small +\begin{tabular}{clll} \toprule -\textbf{序号} & \textbf{特征名} & \textbf{说明} \\ +\textbf{序号} & \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 & 热浪强度(连续高温天数) \\ +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:风险标签计算} +\subsection{步骤6:风险标签生成} -基于日均体感温度(Heat Index),按照第2.4.3节定义的阈值将每条日记录标注为0-3级风险标签。对于多时间尺度预测任务,标签为未来窗口内的众数风险等级(多数投票法)。 +基于日均体感温度(heat\_index),按照表2.1的四级阈值标注每条日记录的风险等级(0-3)。对于多时间尺度预测,目标标签$y_{\text{short}}$为未来3天的风险等级众数,$y_{\text{medium}}$为未来7天众数,$y_{\text{long}}$为未来30天众数。众数投票(而非均值)保留了风险等级的离散性质。 -\subsection{步骤7:滑动窗口序列构建} +\subsection{步骤7-8:滑动窗口与数据集保存} -采用长度为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格式,同时生成合并数据集: +以14天为窗口长度、1天为步长,从时序特征数据中生成监督学习样本。产出文件如表\ref{tab:outputs}所示。 \begin{table}[H] \centering -\caption{预处理产出文件} +\caption{预处理管线产出文件} +\label{tab:outputs} \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 \\ +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{类别分布与数据不平衡} +\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{训练集风险等级分布(基于y\_short标签)} -\begin{tabular}{lccc} +\caption{焦作与郑州气象特征对比(2010-2024年)} +\begin{tabular}{lcccc} \toprule -\textbf{风险等级} & \textbf{焦作市} & \textbf{郑州市} & \textbf{占比} \\ +\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\% \\ +年均气温(°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} -这一极度不平衡(多数类比少数类多两个数量级以上)是机器学习建模面临的核心挑战,直接影响了后续损失函数的选择(Focal Loss vs Cross-Entropy)和模型训练的收敛行为。 +郑州市在各项高热指标上均略高于焦作市,这与郑州更大的城市规模、更强的热岛效应和略偏南的地理位置一致。郑州年均体感温度>32°C天数比焦作多39\%,>38°C天数多133\%,表明郑州的高温暴露水平显著更高。两市的气候差异为模型提供了有价值的域内泛化测试。 -\section{数据集划分} +\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年12月 + \item \textbf{训练集}:前70\%样本(~767,030条),对应2010年至约2020年中期 + \item \textbf{验证集}:中间15\%样本(~164,363条),约2020-2022年中期 + \item \textbf{测试集}:最后15\%样本(~164,365条),约2022-2024年 \end{itemize} -时间序列划分确保测试集中的数据在时间上完全晚于训练集,避免数据泄露(Data Leakage)。所有标准化参数(均值、标准差)仅基于训练集计算,然后应用于验证集和测试集。 +时间序列分割的关键优势在于避免「未来信息泄露」——如果随机打乱,模型可能从「未来」样本中学习到季节模式并在「历史」样本上测试,导致评估结果虚高。劣势在于训练/验证/测试集的分布可能因长期气候趋势而存在漂移(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顺序读取速度)。 + diff --git a/thesis/chapters/ch4-model.tex b/thesis/chapters/ch4-model.tex index 07c96b4..7341d78 100644 --- a/thesis/chapters/ch4-model.tex +++ b/thesis/chapters/ch4-model.tex @@ -1,180 +1,195 @@ \chapter{多时间尺度预警模型设计} -本章详细阐述LSTM-Attention深度学习模型和XGBoost基线模型的设计细节、训练策略和评估框架。 +本章详细阐述LSTM-Attention深度学习模型和XGBoost基线模型的设计细节、训练策略、超参数配置和评估框架。 -\section{模型总体架构} +\section{模型选型论证} -本研究设计的LSTM-Attention模型采用「编码器-注意力-多任务输出」的架构范式,整体分为四个功能模块: +本研究选择LSTM-Attention和XGBoost作为对比模型组,基于以下考量: + +\begin{itemize} + \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 \textbf{输入投影层}:将19维气象特征向量线性映射至128维隐藏空间 - \item \textbf{双向LSTM编码层}:2层BiLSTM(隐藏维度128),从输入序列中提取时序模式 - \item \textbf{多头自注意力层}:4头自注意力机制,捕捉序列中不同时间步之间的依赖关系 - \item \textbf{多任务输出层}:3个独立的全连接头,分别输出短期、中期和长期风险等级预测 + \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} -模型总参数量为983,628,其中LSTM层约占75\%(740K参数),注意力层约占8\%(79K参数),输出头约占17\%。模型实现基于PyTorch 2.12.0框架,在NVIDIA GeForce RTX 4060 Laptop GPU(8GB VRAM)上进行训练。 +\subsection{参数量计算} -\section{输入投影层} +模型总参数量为983,628,按模块分布如下: -输入投影层将19维原始气象特征通过一个全连接层映射至128维隐藏空间: +\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}} +\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} -其中$\mathbf{X} \in \mathbb{R}^{B \times 14 \times 19}$为输入批次($B$为batch size),$\mathbf{W}_{\text{proj}} \in \mathbb{R}^{19 \times 128}$为投影矩阵。投影层的作用是在LSTM处理之前将特征维度提升至与隐藏状态维度一致,避免LSTM在低维输入上的信息瓶颈。 +投影至128维是性能与效率的折中——更高维度(256/512)会显著增加LSTM的计算量,更低维度(64)可能导致信息瓶颈。 -\section{双向LSTM编码层} +\subsection{BiLSTM编码层} -\subsection{层结构与参数} - -LSTM编码器由2层堆叠的双向LSTM组成: +使用2层堆叠双向LSTM: \begin{itemize} - \item 输入维度:128(经投影层的特征向量) - \item 隐藏维度:128 - \item 层数:2(堆叠式,第一层的输出作为第二层的输入) - \item 方向:双向(bidirectional),每层前向和后向LSTM各128维隐藏状态 - \item Dropout:0.3(层间dropout,防止过拟合) + \item 输入维:128(经投影层) + \item 隐藏维:128(每方向) + \item 双向输出维:256(前向128 + 后向128连接) + \item 层间Dropout:0.3 + \item 激活函数:tanh(LSTM标准) \end{itemize} -由于是双向LSTM,每个时间步的输出维度为$2 \times 128 = 256$(前向+后向拼接)。经过LSTM编码后,输入序列$\mathbf{X}' \in \mathbb{R}^{B \times 14 \times 128}$被转换为时序特征$\mathbf{H} \in \mathbb{R}^{B \times 14 \times 256}$。 +2层堆叠使低层LSTM捕获局部时序模式(如日际温度波动),高层LSTM整合这些模式为更抽象的序列表示。Dropout作用于层间而非时间步内,避免破坏LSTM的时序连续性。 -\subsection{LSTM投影层} +\subsection{多头自注意力层} -在LSTM输出之后、注意力层之前,插入一个线性投影层将256维双向输出映射回128维: - -\begin{equation} -\mathbf{H}' = \mathbf{H}\mathbf{W}_{\text{lstm\_proj}} + \mathbf{b}_{\text{lstm\_proj}} -\end{equation} - -投影至128维是为了匹配后续多头注意力层的输入期望,同时降低计算量。 - -\section{多头自注意力层} - -\subsection{层配置} - -多头自注意力机制在时序维度上操作,允许模型动态地关注14天窗口中的关键时间步: +在LSTM输出的14个时间步上施加4头自注意力: \begin{itemize} - \item 头数($h$):4 - \item 每个头的维度($d_k$):32(总嵌入维度128 / 4个头) - \item 位置编码:无需显式位置编码,LSTM的输出已包含时序位置信息 + \item 头数$h=4$:提供4个不同的「视角」审视序列 + \item 每头维度$d_k=32$:128/4,平衡表达能力与计算量 + \item 无位置编码:LSTM输出已编码时序位置信息 \end{itemize} -\subsection{残差连接与层归一化} +注意力层后接残差连接和层归一化(LayerNorm),前者提供恒等映射路径缓解深层网络的优化难度,后者稳定训练过程中的激活统计特性。 -参照Transformer的后归一化(post-norm)架构,在多注意力子层后加入残差连接和层归一化: +\subsection{多任务输出层} -\begin{equation} -\mathbf{Z} = \text{LayerNorm}(\mathbf{H}' + \text{MultiHead}(\mathbf{H}', \mathbf{H}', \mathbf{H}')) -\end{equation} +三个输出头共享LSTM和注意力层的表示,各自通过2层FC(128$\rightarrow$32$\rightarrow$4)输出对应时间尺度的4类logits。 -残差连接确保梯度可以绕过注意力层直接回传至LSTM,缓解深层网络的梯度消失问题。层归一化稳定了训练过程中的激活分布。 +多任务共享表示的理论依据是:三个时间尺度的风险预测都依赖于同一底层物理机制(温度-湿度-健康的关联),共享特征提取有助于知识复用和正则化,减少各任务的过拟合风险。 -\subsection{全局平均池化} +\section{训练策略与超参数配置} -对注意力输出沿时间维度进行全局平均池化,得到固定长度的序列级特征表示: +\subsection{损失函数:Focal Loss} -\begin{equation} -\mathbf{z} = \frac{1}{14}\sum_{t=1}^{14} \mathbf{Z}_{t,:} -\end{equation} - -池化后的向量$\mathbf{z} \in \mathbb{R}^{128}$作为三个输出头的共享输入。 - -\section{多任务输出层} - -考虑到短期、中期和长期预警任务之间的内在关联(都依赖于相同的底层天气-健康关联机制),采用多任务学习(Multi-Task Learning)架构。三个输出头共享LSTM和注意力层的特征表示,通过参数共享实现知识迁移和正则化。 - -每个输出头由两个全连接层组成: - -\begin{equation} -\mathbf{h}_{\text{head}}^{(k)} = \text{ReLU}(\mathbf{z}\mathbf{W}_1^{(k)} + \mathbf{b}_1^{(k)}), \quad k \in \{\text{short}, \text{medium}, \text{long}\} -\end{equation} -\begin{equation} -\hat{\mathbf{y}}^{(k)} = \mathbf{h}_{\text{head}}^{(k)}\mathbf{W}_2^{(k)} + \mathbf{b}_2^{(k)} -\end{equation} - -其中第一层为128→32维(带ReLU激活),第二层为32→4维(输出4个风险等级的对数几率logits)。三个头的输出经softmax归一化后得到各风险等级的概率分布。 - -\section{损失函数:Focal Loss} - -鉴于训练集中极度不平衡的类别分布(低风险类占94-97\%),传统交叉熵损失会导致模型倾向于始终预测低风险类。本研究采用Focal Loss(详见第2.5节式2.26)作为损失函数,设置$\alpha=0.5, \gamma=2.0$。 - -三个预测头的总损失定义为等权重求和: +采用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} -各头使用Focal Loss独立计算损失,权重相等以平衡三个时间尺度的重要性。 - -\section{优化器与训练策略} - -\subsection{优化器配置} - -使用AdamW优化器(Adam的权重衰减修正版),参数设置如下: -\begin{itemize} - \item 初始学习率(lr):$1 \times 10^{-3}$ - \item 权重衰减(weight\_decay):$1 \times 10^{-4}$ - \item $\beta_1 = 0.9, \beta_2 = 0.999$ -\end{itemize} - -\subsection{学习率调度} - -采用ReduceLROnPlateau策略,当验证损失连续5个epoch未下降时,学习率乘以0.5: - -\begin{equation} -lr_{\text{new}} = lr_{\text{old}} \times 0.5 \quad \text{if} \quad \Delta_{\text{val\_loss}} \leq 0 \text{ for 5 consecutive epochs} -\end{equation} - -\subsection{早停与梯度裁剪} - -\textbf{早停(Early Stopping):}验证损失连续15个epoch未改善时终止训练,防止过拟合并节省计算资源。 - -\textbf{梯度裁剪(Gradient Clipping):}将梯度的全局范数限制在1.0以内,防止梯度爆炸: - -\begin{equation} -\|\mathbf{g}\|_{\text{new}} = \min\left(1.0 / \|\mathbf{g}\|, 1\right) \cdot \mathbf{g} -\end{equation} - -\subsection{训练配置} +\subsection{优化器与调度器} \begin{itemize} - \item Batch size:32 - \item 最大训练轮数:50 epoch - \item 数据加载:随机打乱(shuffle=True),不使用加权采样器 - \item 设备:NVIDIA RTX 4060 Laptop GPU(CUDA 12.6) - \item 每轮训练时间:约2.5分钟(batch\_size=32时约24,000个batch/epoch) + \item 优化器:AdamW(lr=$1\times10^{-3}$, weight\_decay=$1\times10^{-4}$, $\beta_1=0.9$, $\beta_2=0.999$) + \item 学习率调度:ReduceLROnPlateau(mode='min', factor=0.5, patience=5) + \item 梯度裁剪:全局范数上限1.0 + \item 早停:patience=15 epoch(验证损失无改善时触发) + \item 最大训练轮数:50 + \item Batch Size:32 \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基线模型} -为评估深度学习方法的有效性,选择XGBoost作为传统机器学习基线。XGBoost的核心优势在于其基于树的集成结构天然适合表格型数据,且对类别不平衡具有较好的鲁棒性。 - \subsection{模型配置} \begin{itemize} \item 估计器数量(n\_estimators):200 - \item 最大树深度(max\_depth):6 + \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:softmax(4类多分类) + \item 评估指标:mlogloss + merror \item 设备:CUDA(GPU加速) - \item 分类器数量:3个(分别对应短期、中期、长期预测) + \item 分类器数量:3个独立模型(short/medium/long) \end{itemize} -\subsection{输入处理} +\subsection{输入特征处理} -XGBoost不直接处理三维时序数据,将(N, 14, 19)的输入序列展平为(N, 266)的二维特征矩阵(14×19=266维)。这种「时间展平」策略将时序信息转换为空间特征,适合基于树的模型处理。 +XGBoost不原生处理三维时序数据,将(N, 14, 19)的序列展平为(N, 266)的扁平特征矩阵。这种展平策略保留了全部特征信息但丢失了时序的序关系(order relationship)。XGBoost通过树的分裂规则间接捕获特征交互,不依赖时序顺序。 -\section{评估指标} +\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{准确率(Accuracy):}$\text{Acc} = \frac{TP + TN}{TP + TN + FP + FN}$ - \item \textbf{宏平均F1分数(Macro F1-Score):}各类别F1分数的算术平均,给予少数类与多数类同等权重,是评估不平衡分类任务的核心指标 - \item \textbf{混淆矩阵(Confusion Matrix):}$\mathbf{C} \in \mathbb{R}^{4 \times 4}$,$C_{ij}$为真实类别$i$被预测为类别$j$的样本数 + \item \textbf{混淆矩阵}:$\mathbf{C} \in \mathbb{N}^{4\times 4}$,元素$C_{ij}$为真实类$i$被预测为类$j$的样本数。提供模型在各风险等级的详细诊断信息 + \item \textbf{准确率}:作为参考指标报告,但不作为模型选择依据(因其在不平衡数据上的欺骗性) \end{itemize} -宏平均F1是本研究的首要评估指标,因为它不受类别不平衡的干扰,能够真实反映模型在各风险等级、特别是高风险等级上的预测能力。 +\subsection{评估流程} + +\begin{enumerate} + \item 加载训练时的最佳checkpoint(基于验证损失) + \item 在测试集(164,365条样本)上进行推理 + \item 分别计算三个时间尺度的混淆矩阵和指标 + \item 生成LSTM vs XGBoost的对比图表 +\end{enumerate} + +评估代码实现于\texttt{src/models/evaluate.py},使用matplotlib生成300dpi的PNG图表,中文标注通过SimHei字体配置实现。 diff --git a/thesis/chapters/ch5-system.tex b/thesis/chapters/ch5-system.tex index 972b559..92dec66 100644 --- a/thesis/chapters/ch5-system.tex +++ b/thesis/chapters/ch5-system.tex @@ -1,135 +1,178 @@ \chapter{预警可视化大屏系统} -本章介绍基于Flask后端和ECharts前端的Web可视化大屏系统的设计、架构和实现。 +本章介绍基于Flask后端和ECharts前端的Web可视化大屏系统的架构设计、核心API实现和前端面板设计。 \section{系统需求分析} \subsection{功能需求} -高温健康风险预警可视化系统面向政府管理者、社区工作者和公众三类用户,核心功能需求包括: +系统面向三类用户(政府管理者、社区工作人员、公众),核心功能包括: \begin{enumerate} - \item \textbf{实时温度与风险展示}:以图表形式展示当前及未来数日的温度变化趋势和风险等级预测 - \item \textbf{多时间尺度覆盖}:同时呈现短期(3天)、中期(7天)和长期(30天)三个时间尺度的预警信息 - \item \textbf{人口脆弱性概览}:展示老年人口比例和暴露-反应关系,辅助风险评估 - \item \textbf{历史数据回溯}:支持查看过去90天的温度、体感温度和风险等级历史记录 - \item \textbf{年度统计摘要}:提供各年份的高温天数、平均温度等汇总统计 + \item \textbf{实时气象与风险展示}:以折线图展示近期温度变化趋势和未来多时间尺度的风险等级预测 + \item \textbf{多时间尺度覆盖}:同时呈现3天(操作决策)、7天(资源调配)和30天(季节性规划)三级预测 + \item \textbf{人口脆弱性可视化}:饼图展示老年人口比例,暴露-反应曲线展示温度-健康风险定量关系 + \item \textbf{历史数据回溯}:支持查看近90天历史温度和风险等级的时间序列 + \item \textbf{年度统计摘要}:各年份高温天数、平均温度汇总 + \item \textbf{自动刷新}:每30分钟自动更新数据,支持长时间无人值守运行 \end{enumerate} \subsection{非功能需求} \begin{itemize} - \item 深色科技蓝风格,符合数据大屏的视觉规范 - \item 页面首次加载时间不超过3秒 - \item 支持1920×1080及以上分辨率显示 - \item 自动刷新数据(30分钟周期),确保大屏长时间运行时信息不过时 - \item 模型不可用时自动降级为默认预测,保证系统可用性 + \item 深色科技蓝视觉风格,适配LED大屏和普通显示器 + \item 首次加载<3秒(含所有6图表渲染) + \item 支持1920×1080至4K分辨率 + \item 模型不可用时降级运行(fallback模式) + \item 响应式布局,单文件部署(无外部构建工具依赖) \end{itemize} -\section{系统架构设计} +\section{系统架构} -系统采用经典的B/S(Browser/Server)架构,前后端分离: +系统采用经典B/S三层架构: \begin{itemize} - \item \textbf{后端(Python Flask):}负责数据查询、模型推理(LSTM/XGBoost)、JSON响应封装。启动时延迟加载模型文件,减少初始内存占用 - \item \textbf{前端(HTML5 + CSS3 + JavaScript):}单页架构,使用ECharts 5.5进行图表渲染,通过fetch API异步请求后端数据 - \item \textbf{数据流:}前端定时请求 → Flask路由分发 → 模型推理/数据查询 → JSON序列化 → 前端ECharts渲染 + \item \textbf{表示层(Browser)}:单页HTML(index.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} -系统部署于开发服务器(Flask内置Werkzeug),监听所有网络接口(0.0.0.0:5005),支持局域网内多设备访问。 +\subsection{数据流设计} -\section{后端API设计} +前端通过fetch API定时请求后端API → Flask路由匹配URL → 控制器函数加载数据/调用模型推理 → 数据封装为JSON → 返回前端 → ECharts根据option配置渲染图表。数据流完全异步,页面加载不阻塞。 -Flask后端提供4个核心RESTful API端点: +\section{后端API实现} -\subsection{预测接口 GET /api/predict} +Flask应用包含4个端点,代码文件约110行(app.py): -返回三个时间尺度的风险预测结果。响应JSON结构包含: +\subsection{GET /api/predict —— 风险预测} + +核心业务端点,返回格式示例: + +\begin{verbatim} +{ + "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} + +模型加载采用懒加载模式——Flask应用启动时仅初始化框架,首次\texttt{/api/predict}请求时才加载模型文件(耗时<2秒),降低启动延迟和空闲内存占用。 + +\subsection{GET /api/history —— 历史数据} + +返回最近90天的JSON数组,每元素包含: \begin{itemize} - \item \texttt{city}:当前预测城市(焦作/郑州) - \item \texttt{date}:预测基准日期 - \item \texttt{predictions}:包含\texttt{short}、\texttt{medium}、\texttt{long}三个子对象 - \item 每个子对象包含:\texttt{level}(风险等级0-3)、\texttt{label}(中文标签)、\texttt{probabilities}(4维概率向量)、\texttt{confidence}(置信度0-1)、\texttt{suggestions}(防护建议字符串列表)、\texttt{color}(CSS颜色码) - \item \texttt{risk\_population}:估算的风险暴露老年人口数 + \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} -当模型文件不可用时,接口返回基于均匀概率的fallback默认预测。 +\subsection{GET /api/stats —— 统计摘要} -\subsection{历史接口 GET /api/history} +返回年度汇总数据,包括: +\begin{itemize} + \item \texttt{annual}:按年份组织的平均温度、热浪天数、最高温度数组 + \item \texttt{aging\_rate}:两城市固定老龄化率(焦作12.8\%,郑州11.6\%) +\end{itemize} -返回JSON数组,包含最近90天每日的温度、体感温度、风险等级和热浪标识,供前端趋势图表使用。 +\subsection{GET / —— 主页} -\subsection{统计接口 GET /api/stats} - -返回年度汇总JSON,包含各年份平均温度数组、热浪天数数组、最高温度数组,以及焦作(12.8\%)和郑州(11.6\%)的固定老龄化率。 - -\subsection{主页 GET /} - -返回包含完整前端代码的HTML页面(单文件架构)。 +直接返回index.html的完整内容(单文件应用,约24KB),无需额外的静态文件服务或模板引擎。 \section{前端可视化面板} -前端为单HTML文件,使用CSS Grid定义响应式布局,包含六个功能面板: +前端为单个HTML文件,使用CDN加载ECharts 5.5主库,无其他外部依赖。CSS Grid定义6面板响应式布局。 -\subsection{面板1:温度变化趋势} +\subsection{面板1:温度趋势图} -双Y轴折线图,蓝色线表示日均气温(temp\_mean)、橙色线表示体感温度(heat\_index)。背景标注三条水平阈值线:绿色虚线(32°C,中风险阈值)、黄色虚线(35°C,高风险阈值)、红色虚线(38°C,严重风险阈值)。X轴为日期,时间跨度90天,底部支持dataZoom缩放。 +双Y轴折线图——日均气温(蓝色实线)和体感温度(橙色虚线)共左Y轴(°C),右Y轴为风险等级。背景标注三条水平阈值线:绿色虚线(32°C,低→中)、黄色虚线(35°C,中→高)、红色虚线(38°C,高→严重)。X轴跨90天,支持ECharts dataZoom区域缩放。 -\subsection{面板2:多时间尺度风险展示} +\subsection{面板2:风险预警展示} -三个并列卡片,分别展示短期(3天)、中期(7天)和长期(30天)的风险预测结果。每个卡片包含风险等级大字号中文标签(低风险/中风险/高风险/严重风险)、对应颜色圆点、置信度进度条和具体防护建议。 +三列卡片式布局,每卡片对应一个时间尺度。卡片内垂直排列:中文标签(最大字号)、风险颜色圆点(\texttt{border-radius: 50\%})、置信度进度条(CSS动画)、防护建议列表(\texttt{