接上文,水文时间序列数据数和量级勉强够用,本文演示用最朴素的水文要素构建简单的水文预报模型。把流量过程看作回归问题处理,模型采用滑动窗口和未来降雨作为输入,瞬时流量(和时段流量增量)为输出。要素只选择雨量(P)、流量(Q)。底层模型选择CatBoost,结构上采用多要素多目标方式。这是一个产汇流模型,偏产流,汇流过程叠加起涨流量。
流域特性见下图,蓄满产流,天然坡道河流演进汇流。
火星夏普山地表水水文控制站雨量流量时序脱敏演示数据集:15年2小时演示数据( 链接: https://pan.baidu.com/s/1nISlRw-HRAeupyv73vNQow 提取码: eehd )。
数据说明:
更丰富的地表水水文控制站雨量流量时序数据集(气象数据集),请联系作者。
演示数据集只有十几年的序列,选择CatBoost为底层模型,包装为时序多目标多要素结构。同时,也尝试过TCN、TFT等深度学习模型,效果不理想。Python代码,采用32位精度,支持CPU和GPU运算。纯CPU平台也可以运行,慢慢腾腾。
如图所示,演示数据集有以下特点:
2.2 演示数据集模型选择
结合前文描述,模型选择的条件:
综上所述,演示模型选择开源的CatBoost作为底层模型。
CatBoost特点(摘录如下:)
CatBoost算法是gradient boosting算法中的一种,是继LightGBM之后基于GBDT改进的算法,由俄罗斯Yandex公司在2018年开源。相较于LightGBM算法,CatBoost算法有很多特点,但最引人注目的是对分类型特征的处理。这使得我们在训练模型之前可以考虑不用再通过特征工程去处理分类型特征预测偏移处理。这可以减少模型的过拟合,提升模型预测效果。本文算法只接受数值型数据输入。
实践表明,LightGBM波动更大,视野偏眼前,收敛慢,都容易过拟合。CatBoost视野更宽,对异常值容忍度更好,GPU加速效果更好,更容易收敛,缺点是偏时段量(雨量站特征比重大),对上下游相关和连续强降雨过程,偏降雨产流影响,汇流部分倚重不足,需要后期在汇流时加起涨流量(Q0)校正。模型偏产流轻汇流,严格来说是个产流模型。数据流程图见下图,时序模型输入输出,滑动窗口结构。
2.3 演示数据集特征工程
2.3.1 峰现时长确定
模型输入为滑动窗口宽度内特征值,实例仅为雨量和流量,没错,含已经发生的流量过程。参考前文假设:早期过程已经体现流域下垫面状况,实际情况也是这样发生的,产流汇流是个统一的过程。
按照教科书定义,确定2个峰现时长(L2和L1),一个是主降雨结束至洪峰之间时长,一个是主降雨时段中值与洪峰之间时长。实践表明,简单算法也是有效的,pearson相关系数靠谱。不同场次洪水因流速变化而导致峰现时差,由模型来拟合。本文直接采用pandas.corr相关函数,参数默认'pearson',LCSS扫描,取最大值。不同分辨率下峰现时长基本一致。伪代码如下:
L2 = [int(np.argmax([(df[p].corr(df['Q'].shift(-hm))) for hm in range(72)])) + 1 for p in p_n_col]2.3.2 数据增强、数据集拆分和交叉验证
数据增强。本文时序频率为3小时,与提供的演示集是同一数据集,不同的统计口径。滑动采样,实现数据量翻倍。其中雨量为时段累积值,流量为瞬时流量(流量过程线波形外沿)。 模型并行处理这些数据,不是分段串行训练。
实践表明,演示数据集1小时、2小时分辨率对精度没有明显改善。故采用低耗能的3小时分辨率。
时序集的数据集拆分和交叉验证与普通数据集不同,不能跨界引入变量。演示数据集前n年为训练集,后两年为验证集。实际应用中,预报模型以2000年分界线,以前为训练集,以后为验证集。
关于交叉验证。由于数据集太短,只有区区几十场洪水,不使用切片后退式交叉验证。
2.3.3 数据归一化
采用sklearn工具包。这个过程不是必须的,已经习惯了,就做了。实践中除对方差特征一致性检查有用外,对模型精度没有明显影响。
from sklearn.preprocessing import MinMaxScaler , MaxAbsScaler2.4 模型定义
CatBoost时序版模型有现成的轮子,拿来主义,忽略分位数概率预测,采用确定性模式。参数如下:
kwargs = {'task_type': 'GPU' if device.type == 'cuda' else "CPU"}2.5 模型训练
模型支持测试集与训练集一并参与训练(数据量太少)。其中s 为目标变量Q,p为过去已经发生的变量P、Q,f为未来变量Q。
for t_s in [pd.Timestamp('200501010800')]: # 交叉验证列表2.6 可解释性和超参数调优
可解释性和特征重要性。不解释还好,越解释越糊涂,好酒不怕多喝,重要的特征必须反复强调。
explainer = Explainer(my_model, ...)超参数调优采用optuna算法。调优指标,选择smape。根据《水文情报预报规范》相关章节定义(参考2.8精度评定图),结合实际调参过程考证,QR,DC(CD)指标与smape指标趋势一致,故简化选择smape代表。实际预报方案采用多种指标评价体系,如:DC、 QR、ope、r2_score、 mse、 rmse、 smape、 nse、kge等。
def objective(trial: Trial) -> float:2.7 预测(或称预报、推理)
推理采用逐点推理法,即每个节点预见期最低L2时长。为提高推理时效,仅摘录洪峰流量大于阀值的洪水过程作预报。预报过程线采用1个滤波器平滑,再接一个宽度为L2的时序压缩算法减小波动。
2.8 精度评定
上图为《水文情报预报规范》精度评定简化表。峰值精度评定采用DTW窗口(L2-L1)滑动对齐原始流量过程和预报流量过程,侧重洪峰流量比对,更贴近API模型和传统预报方式。采用上述特征值的模型预测结果不理想。
CatBoost_3_24_12_Q_2:
ope >0.2,ope_90, CD,QR ,ope, ,QR2000, QR3000,r2_score, mse, rmse, smape, nse,kge, kgeprime
0.38432 0.3 0.66588 0.5 0.438 0.6 0.035029 0.88892 433.331162 20.816608 0.082415 0.71884 [0.82916 0.85049 0.91732 1.0005 ] [0.82893 0.85049 0.91686 1.0005 ]
究其原因,除数据偏少,代表性差外,没有构建水文特色的特征工程也是重要原因,后文将详细描述水文特色特征工程原理、算法和泛化能力。下列数据为实际应用模型精度指数情况,勉强为甲等方案。(CatBoost_3_36_12_Q_2)
ope>0.2,DC,QR ,ope, QR2000, QR3000,r2_score, mse, rmse, smape, nse,kge, kgeprime, kgenp
0.31373 0.86527 0.893 0.8 -1 0.05535 0.93571 100.3839 10.01917 0.128372 0.8747 [0.9265 0.9357 0.96439 0.99946] [0.92675 0.9357 0.96491 0.99946] [0.98908 0.98912 0.99922 0.99946]
2022-12-03
春种秋收,未完待续
上一篇:心云浅谈互联网思维
下一篇:阿里云产品物联网平台