做气候变化影响评估的人,十有八九都被同一个问题卡住过:手里需要的是流域尺度甚至站点尺度的未来气候数据,可全球气候模式(GCM)的输出分辨率动辄一两百公里起步,一个格点可能覆盖大半个省份。理想很丰满,现实很骨感——你没法直接把这么粗的画面喂给水文模型、作物模型或者城市规划评估。于是,"基于统计方法与机器学习的气候降尺度"就成了绕不开的功课。
这篇文章不打算写成教科书,我想以这几年实际跑降尺度项目的视角,聊清楚几件事:统计降尺度的经典思路是什么,机器学习能帮上什么忙,以及真正落地时最容易在哪些环节翻车。无论你是刚入门的气候专业学生,还是做影响评估的工程师,又或是想把方法论迁移到其他领域的算法同学,读完之后应该能对"把全球模式细化到局地"这件事建立一张完整的技术地图。
1. 全球模式的分辨率之痛:为什么必须降尺度
1.1 一个上百公里的格点装不下一个流域
先举个例子。CMIP6里的典型全球模式,大气网格大约是100到250公里。中国东南沿海一个格点,在模式里可能同时包含了海洋、平原、丘陵,实际地形高度也被抹平到一两千米的平均值。这种分辨率下的气温、降水,本质上是一个区域大尺度的"平均气候",而不是任何具体地点的气候。
但实际决策需要的是点上的信息。水库调度要知道某个流域的降水,农业评估要知道某个县的高温天数,城市规划要知道城市热岛尺度上的夜间温度。把全球模式的分辨率从百公里量级提升到公里甚至站点量级,这个过程就是降尺度(downscaling)。
这里要强调一点:降尺度不是"把格点变细"的插值。插值只是把粗格点的值摊到细网格上,无法产生任何新的信息;降尺度要做的是建立在"大尺度环流如何影响局地气候"的物理认识之上,建立一种映射关系,再从大尺度信息中推导出有额外价值的小尺度细节。换句话说,降尺度输出的不仅是一张更高分辨率的图,而是一套带有局地物理过程烙印的气候数据。
1.2 动力降尺度与统计降尺度:两条路线怎么选
降尺度有两条主流路线。
动力降尺度,本质是把全球模式的结果作为边界条件,驱动一个高分辨率的区域气候模式(比如WRF)再跑一遍。优点是物理过程完整,理论上可以刻画山谷风、局地对流、海陆风这些小尺度过程;缺点是计算开销非常大,跑一个区域情景可能要消耗几万核时,而且区域模式本身也有偏差,并不是换了细网格就一定准。做一次动力降尺度实验,光数据准备和调参就能耗掉一个团队几个月的时间。
统计降尺度则完全不同。它是在历史观测中寻找"大尺度大气状态"与"局地观测要素"之间的经验统计关系,然后把这种关系应用到全球模式的输出上。计算量极小,一台普通工作站就能跑完几十个GCM模式的集合;实现也快,一个合理的回归或机器学习模型,几天内就能产出结果。因此在实际影响评估项目中,统计和机器学习降尺度是更普遍的选择。
动力降尺度和统计降尺度不是非此即彼。很多项目会先用区域模式做相对较粗(比如12km)的动力降尺度,再用统计/机器学习方法进一步细化到公里级,这种混合策略在复杂地形区域很常见。但是,对于大多数只有资源限制的团队,从统计/机器学习路线切入是性价比最高的起点。
1.3 降尺度赖以成立的核心假设
统计降尺度做的一切,都押在一个核心假设上:大尺度环流与局地气候之间的关系,在历史时期和未来情景下是稳定成立的。
这套逻辑本身说得通。局地气候由大气环流、地形和陆面过程共同决定,其中地形和陆面在几十到上百年尺度内基本不变;局地天气很大程度是被大尺度天气系统"强制"出来的。无论是台风外围的水汽输送、冷空气南下引起的降温,还是夏季风带来的降水,局地的响应都嵌在一个更大的环流背景里。统计降尺度要做的,就是把这个"强制-响应"的关系从历史数据里学出来。
但要注意,这个假设在"用过去预测未来"时存在天然的悖论。气候变暖背景下,热力条件、水循环强度都在发生根本性变化,历史统计关系未必能完全外推到未来。这不是方法本身的瑕疵,而是所有经验外推方法的共同边界。我在后面会专门讲"平稳性失效"问题——统计降尺度能给出看似漂亮的结果,但真实可靠性最终取决于对这种假设边界的清醒认识。
2. 经典统计降尺度方法:从Delta到分位数映射
2.1 Delta法:所有降尺度项目的第一道基线
如果新接触降尺度,我建议先跑通Delta法,它是最简单也最容易被低估的基线。
Delta法的原理一句话就能说清:假设全球模式对气候变化的响应信号比它的绝对状态更可信,用"模式未来时刻的气候态减去模式历史时刻的气候态"作为变化量,再把这变化量叠加到局地观测的多年平均态上。
举个例子。某站点的观测历史平均气温是15摄氏度;模式历史时段模拟的平均气温是14.5度,未来情景下模拟为17.5度,那模式自身显示升温3度。Delta法给出的未来站点气温就是观测平均值15度加3度,等于18度。对降水,一般用比率而不是差值,即乘上降水变化的倍率,避免出现负降水。
这个方法的优势是没有假设任何统计模型,需要的计算量几乎为零,做什么项目都可以先拿它当对照。它的短板也很明显:只改变了气候平均态,几乎没有改变变率和极端值的分布,连模式自身对各年波动的信息都没有用到,本质上就是一个"气候平均偏移"。
Delta法虽然简陋,但它提供的"变化信号"至今仍被很多复杂方法作为后处理的组成部分。我建议所有项目都保留这个基线结果,后面无论用多先进的模型,都要能解释清楚为什么你的结果优于Delta法。如果连简单基线都打不赢,复杂模型的价值就要打问号。
2.2 回归与典型相关分析:把大尺度环流翻译成局地气候
统计降尺度最经典的骨架是回归类方法。先找一组"预测因子",通常是能代表大尺度大气状态的变量:500hPa位势高度、海平面气压、850hPa温度、比湿等;再找一个"预测量",通常就是局地站点或网格的月均气温或降水总量。然后在历史期建立两者的回归关系,最后把未来GCM输出的预测因子代进去,得到局地的未来值。
线性回归的假设是大尺度变量与局地要素之间是线性可加的,这在温度上表现尚可,因为气温受环流和海拔控制相对稳定;降水就麻烦,降水过程本身高度非线性而且有大量零值,线性回归会被"要不要下雨"和"下多少雨"两种机制同时困扰,结果往往平庸。
为处理多变量之间的相关结构,统计降尺度历史上还常用典型相关分析(CCA)。CCA的思想是从预测因子组和预测量组中各自提取少数几个典型变量,让两组典型变量之间的相关性最大化,从而把多维问题压缩成少数相关通道来处理。这个方法在月尺度温度和环流型预报中运作了多年,也是很多业务化统计降尺度工具(如SDSM)的底层思路之一。
这类方法虽然不新,但它们为后来的机器学习方法提供了一个重要基准:线性映射的上限在哪里?非线性能不能超越它?如果你在数据上发现机器学习和线性回归结果几乎一样,那大概率是这个问题本身接近线性,而不是模型不够高级。
2.3 分位数映射:纠偏差神器,也要小心"矫正过枉"
分位数映射(Quantile Mapping,QM)一开始更多被归为"偏差校正"而不是"降尺度",但现在几乎每个降尺度项目都会在最后一步用到它。道理很简单:模式模拟的某变量分布与观测有系统性偏差,QM用观测分布去替换模式分布的分位数。
对某个值x,假设它在模式分布F_model中的累计概率是p,那么校正后的值就是观测分布在概率p处的分位数,写成公式就是x_corrected = F_obs^{-1}(F_model(x))。
这样不仅校正了平均态,还校正了方差和分布形态,对降水的湿日频率、极端分位数都有明显的改进效果,而且QM在理论上保证了校正后的分布和观测分布一致。这也是它在降水降尺度后处理里几乎是标配的原因。
不过QM有一个真问题:未来校正是否仍然有效。当未来气候整体变暖、或者降水分布明显位移时,直接套用历史期拟合的转换函数,会把未来分布强行拉回观测的形状,导致极端温度偏保守或高估。实用解法是使用带趋势的QM(比如分位数增量映射),或者对模式未来分布和转换函数分开拟合,再叠加变化量。这里面的精细处理,往往是项目成败的关键之一,却被很多教程一笔带过。
2.4 为什么这些"老方法"没被淘汰
现在机器学习这么热,还有人用Delta和线性回归吗?仔细想想,这些经典方法在业务化项目中反而更常见,原因无非三点。
可解释性——每步变换的物理含义清楚,写成报告经得起审问。比如你说"用500hPa高度场的异常解释局地温度变化",这个因果链条天然好懂。可解释性:在气候影响的决策场景里太重要了,很多用户不需要黑箱,需要的是"为什么给出这个数字"。
计算成本——跑上百个GCM模式成员和多情景,机器学习模型的训练开销积累起来相当可观。经典方法基本都是线性代数级别的计算,可以瞬间跑完整个集合。
稳定性——不需要调参,不会有模型崩溃,在数据匮乏或者变量复杂时至少有一个"不丢人"的结果。
还有一个现实因素:很多领域的决策流程里,结果的可追溯性比精度重要得多。经典统计方法就像工具箱里的扳手,不一定最时髦,但你要拧螺丝的时候它肯定可靠。所以,千万不要因为"老"就轻视它们,它们既是基线,也是做机器学习时最好的对照物。
3. 机器学习进场:非线性映射带来的改变与边界
3.1 传统方法的"天花板"在哪里
经典统计方法的本质大多可以归结为线性或低阶多项式映射。比如你用线性回归拟合降水,模型天然无法表达"500hPa高度异常超过某个阈值时降水激增"这类非线性突变。即便CCA可以考虑线性相关结构,它也无法自动构造新的非线性组合特征。
气候系统最突出的特征恰恰是非线性。降水对环流的响应、山谷风对背景风向的依赖、极端温度对土壤湿度的反馈,都带有明显的阈值效应。机器学习的核心优势是用通用函数逼近器替代人工设计的线性映射,让数据自己告诉算法"这个关系应该长什么样"。
于是从2010年代中期开始,随机森林、梯度提升树、支持向量机、神经网络陆续进入降尺度领域,这几年CNN和U-Net做空间降尺度也成了热点。机器学习并不是要取代统计降尺度,而是把其中"建模关系"这一环变得更灵活、表达能力更强。
3.2 常用机器学习模型的选型比较:谁更适合降尺度
不是所有场景都适合堆深度学习。我基于自己做过的实验和文献里的广泛结论,把常见模型做一个横向比较。
| 模型 | 核心优势 | 主要局限 | 适合场景 |
|---|---|---|---|
| 随机森林 / GBDT | 非线性强、对特征交互友好、自带特征重要性 | 外推能力弱、对极值倾向保守 | 站点/格点的中期预测、特征探索 |
| SVM | 小样本下稳健、核函数能捕捉非线性 | 超参数敏感、大数据训练慢 | 样本量几千级的中小数据集 |
| ANN(全连接) | 拟合灵活、可扩展为分布模型 | 容易过拟合、调参成本高 | 大量站点联合建模 |
| CNN / U-Net | 天然处理空间结构、能学习邻域影响 | 需要大量高品质训练数据、可解释性差 | 空间连续场的公里尺度降尺度 |
随机森林和梯度提升树至今仍是降水降尺度项目的实用首选,重要原因是它们不容易在训练误差降到零之后全面崩塌,也方便用袋外误差和特征重要性做诊断。但我提醒一句:树模型的外推能力非常弱。如果未来GCM预测因子的取值范围超出了历史训练范围,树模型预测会倾向停在叶子节点的边界值上,输出的局地变化量容易被低估。这个问题在温度变量上尤其常见,值得警惕。
3.3 深度学习做空间降尺度:从超分辨率重建借来的思路
图像超分辨率领域有个常识:一张低分辨率图可以通过卷积神经网络重建出细节丰富的高分辨率图。气候领域的空间降尺度几乎就是同一个问题——把低分辨率的全球模式场"超分"成高分辨率局地场,因此很自然地引入了CNN和U-Net。
典型做法是把某个区域的大尺度气象场(比如500hPa高度、海表温度、低层风场)作为输入,以高分辨率观测再分析场的降尺度产物作为目标,训练一个深度卷积模型。训练好之后,把GCM的未来场灌进去,就得到公里级的空间降尺度结果。这种思路的优势是同时学到了空间邻域信息与多变量协同关系,不再像传统逐点回归那样每个格点孤立建模。
代价也明显:这类框架普遍需要大量的输入-目标样本对,而再分析资料时间跨度有限(比如ERA5只有最近几十年),GCM历史期样本也不多,深度学习在大样本需求上天然吃亏。另外,深度学习对输入的域漂移很敏感,训练时用再分析资料学到的大尺度-局地关系,迁移到GCM输出时不一定完全成立。所以用深度学习做空间降尺度,我建议至少再加一道分位数映射后处理,控制最终分布偏差,否则结果可能"看起来纹理清晰、实际上数值分布跑偏"。
3.4 特征工程:降尺度项目里"隐藏的胜负手"
很多人在机器学习降尺度项目里只关注模型选型,却忽视了特征工程才是决定结果上限的那一半功夫。气候降尺度的预测因子不是越多越好。
合理的预测因子至少要满足三个条件:一是与局地预测量有物理机制联系,而不是纯统计相关;二是能被GCM可靠模拟——很多局地过程在GCM里根本没被表达,拿它当特征等于引入噪声;三是未来情景下的变化范围不能离谱超出训练域。
我常用的特征组合是:500hPa位势高度及梯度(反映环流型)、850hPa气温和露点(反映热力和水汽条件)、海平面气压(反映天气系统位置)、相对湿度或比湿(反映水分供给),对降水再额外加一个可降水量或水汽通量散度。温度降尺度的预测因子比降水简单不少,核心是环流型+气团温度;降水则对水汽项非常敏感,少了水汽特征,任何模型都难有好的表现。
4. 跑通一个降尺度项目:数据、特征、训练与验证的完整链路
4.1 数据准备和时空匹配:项目里最容易被低估的工作量
几乎所有降尺度项目,真正耗时最多的不是建模,而是数据准备和时空对齐。我见过不少同学在这上面栽跟头,所以这里多说几句。
数据源上,GCM输出一般从CMIP6数据门户下载,注意区分历史情景和自然历史情景,以及不同SSP情景(SSP126、SSP245、SSP370、SSP585);观测目标可以用站点资料(气象站逐日观测)或者高分辨率网格资料(比如国内的CN05.1、全球的CRU、再分析的ERA5-Land);预测因子的高分辨率历史"真相",则常常用再分析资料(如ERA5)来构建。
时空匹配至少要处理三件事:统一坐标系和网格、统一时间频率、统一变量单位。GCM网格通常是曲线网格,需要先插值到规则的经纬网格,最好和你的观测目标网格一致。
这里有个容易被忽视的细节:降水这类变量做空间插值时,面积平均比点插值稳健。直接用双线性插值逐点取GCM格点值,容易平滑掉局地信号,还会把网格的锯齿状信息保留下来;更稳妥的做法是先在GCM原始网格上做面积加权平均,再重采样到目标网格。时间上,GCM输出一般是日或月,观测站点可能是日值,逐日匹配时要先检查日历体系——有的模式用360天日历或365天日历,不去日历对齐,后面所有匹配都会错乱。
4.2 预测因子的选择与处理方式
特征的处理会影响整个降尺度质量。我建议先做相关性普查:把每个候选预测因子和局地目标变量做相关系数、互信息的初步检查,圈定物理上说得通、相关性稳定的特征进入正式模型。相关性不是因果关系,但至少相关性太低的特征大概率是噪声,留着只会增加过拟合风险。
对于站点或网格逐点模型,常见的做法是把GCM预测因子插值到该站点或格点后的值,加上该点的高程、坡度、离海岸距离等静态地理特征。静态特征本质是让模型有机会学习"同一种大尺度天气在不同地形下的反应",在很多山区项目里,加上这些静态特征能让距离较远的站点共享更多地形信息,这也是一个不太被新手注意的加分项。
标准化处理方面,我特意再提醒一次数据泄漏问题:必须在每一折交叉验证内部,单独对训练集拟合标准化参数,再去变换验证集和测试集,否则验证分数会虚高。气候序列有强时间自相关,相邻年份的天气状态高度相似,随机划分训练集和验证集往往会因"背答案"而高估模型能力,更稳妥的是按年份分组做交叉验证。
4.3 模型训练与验证:以随机森林为例的完整流程
我不打算贴很长的代码,给你一个可以快速复现的核心流程。
import numpy as np from sklearn.ensemble import RandomForestRegressor from sklearn.preprocessing import StandardScaler from sklearn.model_selection import GroupKFold from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score # X: 已处理好的预测因子矩阵,形状 (n_samples, n_features) # y: 目标变量(站点或格点的气温/降水) # group: 年份标签,用于按年分组交叉验证 scaler = StandardScaler() gkf = GroupKFold(n_splits=5) rmse_list, mae_list, r2_list = [], [], [] for train_idx, valid_idx in gkf.split(X, y, groups=group): X_tr, X_va = X[train_idx], X[valid_idx] y_tr, y_va = y[train_idx], y[valid_idx] X_tr_scaled = scaler.fit_transform(X_tr) X_va_scaled = scaler.transform(X_va) model = RandomForestRegressor( n_estimators=300, max_depth=12, min_samples_leaf=3, n_jobs=-1, random_state=42 ) model.fit(X_tr_scaled, y_tr) pred = model.predict(X_va_scaled) rmse_list.append(np.sqrt(mean_squared_error(y_va, pred))) mae_list.append(mean_absolute_error(y_va, pred)) r2_list.append(r2_score(y_va, pred)) print("CV RMSE:", np.mean(rmse_list)) print("CV MAE:", np.mean(mae_list)) print("CV R2:", np.mean(r2_list))这段代码有三个关键点。
一是必须用GroupKFold按年份分组。气候序列有很强的逐年自相关,相邻年份的天气状态高度相似,如果随机抽样,模型很可能靠着"背下邻近年份的信息"拿到虚高的验证成绩,放到未来情景就完蛋。按年份分组是对这个问题的简单补救。
二是随机森林对输入特征的尺度几乎不敏感,但标准化仍建议做。一是为了将来对比神经网络或SVM时的公平性,二是在做特征重要性解释时更容易对齐。
三是对于降水这类半连续且含零的变量,直接回归的效果通常一般。更讲究一点的做法是用两阶段建模:先分类(这天下不下雨),再回归(下的话下多少)。这也是降水降尺度中很常见且被验证能显著改善结果的方案。我在实际项目中几乎都采用分类加回归的两阶段结构,日降水降尺度尤其应该这么干。
4.4 从历史验证到未来情景生成:结果的完整交付形式
模型在历史期验证完,最后一步是把未来GCM预测因子输入训练好的模型,生成未来局地气候情景。这个环节有几个细节需要注意。
第一,要区分"直接输出"和"偏差校正输出"。机器学习模型的直接输出通常分布已经比较接近观测(因为训练目标就是观测),但仍有残余偏差,建议再做一次分位数映射,确保最终产品的统计分布与观测相符。这一步对降水尤其重要,它决定你输出的是不是一套"统计形态合理"的气候数据。
第二,要尽量输出多模式、多情景的集合结果,而不是只用单个GCM模式。气候预测本身有巨大的模式间差异,降尺度并没有减少物理上的不确定性,但至少要如实传达不同模式给出的变化区间。很多只跑一个模式就下结论的项目,后面被质疑时很难自圆其说。
第三,指标上不能只看均方根误差。对气候应用而言,分布形状、趋势、极端分位数都比平均误差重要。我通常会同时报告RMSE、MAE、相关系数,外加95%分位数误差和连续排位概率评分(CRPS),并用泰勒图把不同模型的表现放在一张图里对比。单个数字不能说明模型好坏,分布能力才是降尺度真正的战场。
5. 排雷指南:数据泄漏、平稳性失效与极值丢失
5.1 数据泄漏:标准化里藏着的坑与空间交叉验证
数据泄漏是机器学习降尺度里最容易被忽视的隐患。典型场景:从全部历史数据计算均值和标准差,然后做标准化;接着按年份划分训练集和验证集。训练集标准化后的值实际上已经"知道"了验证集的统计量,验证集被间接放进了训练过程,结果当然虚高。
正确的做法是像前面代码里写的那样,在每一折内部先拟合scaler,再变换训练集和测试集。涉及特征选择时也一样:在交叉验证中使用全量特征重要性筛选,也属于泄漏,应该把特征选择包进每一折里做,或者至少用嵌套交叉验证检验误差。
空间维度上的泄漏更隐蔽。由于相邻格点的气候高度相关,随机划分训练集去训练一个格点模型,隔壁格点的信息很可能已经进了训练集。当最终要预测的目标格点与训练格点在空间上相邻时,模型分数会过度乐观。应对办法是使用空间分块交叉验证,把相邻格点分到同一折,按空间块切分。这个问题在格点化数据建模中非常常见,但很多公开教程代码里都直接用了随机split,这里我特意多写一句。
5.2 平稳性假设的悖论:过去关系能不能推未来
降尺度模型的训练数据几乎都来自历史观测,但应用对象是未来几十年的气候情景,中间横着一条变迁的河。气候在变,大尺度环流与局地气候的关系真的不变吗?未必。
比如在高纬地区,海冰退缩之后,局地气温对同一套环流型的响应明显改变;在季风区,全球变暖让强降水事件的水汽供给显著增加,历史期拟合的"环流强度-降水量"曲线很可能低估未来的强降水增幅。
对这种悖论,没有完美解法,只能从三方面对冲:一是尽量选择物理基础扎实的预测因子,让模型学习的是机制性关系,而不是纯粹的历史巧合;二是检查未来期间预测因子是否显著超出训练范围,超出部分的结果要有降级期望;三是在报告里如实说明平稳性假设的风险,甚至用Delta法这种直接变化量方法做交叉对照。统计降尺度不是水晶球,它是在一个物理假设下做合理推断,承认这个边界,结果才可靠。
5.3 极值被"平均化":为什么降尺度后极端降水变温和
几乎所有基于最小化均方误差的回归模型,都会出现预测向均值收缩的现象。因为均方误差最小化的最优解是条件均值,而条件均值天然会把极端样本拉向中心。反映到降尺度结果上,就是极端高温被偏低估计、强降水被明显摊平。这可能是机器学习降尺度常被气候学家质疑的一个核心技术理由。
应对思路有几条。一是换目标函数,用分位数回归或分位数回归森林(QRF),直接预测分位数而不是均值,从而保留极端事件的量级;二是两阶段分类加回归方法,至少先把湿日频率校正准确;三是把模型输出再做分位数映射,用观测极端分位数去拉伸模型的分布。
即使这样,对极端降水的降尺度结果也应该保持保守态度。降水极值的时间变化具有强随机性,没有任何统计方法能精确预测某次大暴雨的量级。降尺度能提供的是变化方向和量级的合理估计,而不是确定性数值预报。
5.4 降尺度结果该怎么用:合理的期望与科学的交付
最后聊一点方法论之外的东西。降尺度产物在应用侧经常被误用。常见误解是把降尺度的未来气温当作"精准预报"——其实它提供的是未来气候情景,是某个温室气体排放路径下的合理可能,而不是确定性预报。水文模型需要的正是这种包含不确定性的情景输入,而不是一个看似"准确"的未来值。
所以交付结果时,我习惯附带三样东西:一是多模式多情景的区间(至少要给出25到75百分位的范围);二是与观测对比的验证指标和泰勒图;三是方法局限性说明,包括平稳性假设、极值低估风险。这样既对用户负责,也保护自己不被事后质疑。做降尺度这种交叉学科活儿,方法学上多走一步,应用侧就能少踩一个坑。
这些年做降尺度项目最大的体会,可能不是模型多厉害,而是"清楚自己不知道什么"这件事比什么都重要。统计方法和机器学习给了我们一套把全球模式细化到局地的工具,但这套工具的有效性始终受制于数据质量、平稳性假设和物理过程的表达能力。如果你也想在这个方向深入,我的建议是从Delta法和一个站点的小数据集开始,先把全流程跑通,再逐步加入机器学习模型,对比每一层带来的真实增益——这个过程中你会对方法的边界有一种远超论文里的认识。先别急着上深度学习,先把基线走扎实。