基于滞后数据与外生时间序列的降雨分类预测:方法与模型选型
解决方案:基于历史时序特征的降雨预测
一、数据预处理:构造时序滞后特征
每个区域的降雨是独立时间序列,需按region分组,为每个样本生成历史周的降雨(rain)和云量(clouds)特征,将过去n周的观测值作为当前周降雨预测的输入。
具体代码实现
假设用前1~3周的数据预测当前周降雨,通过shift方法生成滞后特征:
import pandas as pd # 初始化原始数据 df = pd.DataFrame({ 'region': [1,1,1,1,2,2,2,2,3,3,3,3], 'week': [1,2,3,4,1,2,3,4,1,2,3,4], 'rain': [1,1,0,1,1,1,1,1,1,0,0,0], 'clouds': [1,1,0,0,0,0,1,0,1,0,0,0] }) # 按区域分组生成滞后特征 def create_lagged_features(group, lag_steps=[1,2,3]): for lag in lag_steps: group[f'rain_lag_{lag}'] = group['rain'].shift(lag) group[f'clouds_lag_{lag}'] = group['clouds'].shift(lag) return group df_lagged = df.groupby('region').apply(create_lagged_features).reset_index(drop=True) # 移除无足够历史数据的行(前3周) df_lagged = df_lagged.dropna().reset_index(drop=True)
处理后数据集会新增rain_lag_1(前1周降雨)、clouds_lag_1(前1周云量)等特征,目标变量为当前周的rain。
二、划分训练集与测试集
时序数据需保持时间顺序划分,禁止随机打乱:
- 对每个区域,将前k周数据作为训练集,后m周作为测试集(示例中每个区域4周,可将前3周作为训练、第4周作为测试)。
示例代码:
# 按区域和周排序 df_lagged = df_lagged.sort_values(['region', 'week']) # 划分训练/测试集 train = df_lagged[df_lagged['week'] <= 3] test = df_lagged[df_lagged['week'] == 4] # 分离特征与目标变量 X_train = train.drop(['region', 'week', 'rain'], axis=1) y_train = train['rain'] X_test = test.drop(['region', 'week', 'rain'], axis=1) y_test = test['rain']
三、适用的模型
1. 传统统计模型
- 逻辑回归:结构简单、可解释性强,适合特征维度低的场景,能快速得到基准结果。
- ARIMAX/SARIMAX:专为时间序列设计,ARIMA扩展到多变量(加入云量等外部特征),擅长捕捉时序的趋势与周期性。
- Prophet:由Facebook开发,自动处理时序周期性、节假日效应,支持加入自定义外部特征,上手简单。
2. 机器学习模型
- 树模型(随机森林/XGBoost/LightGBM):捕捉特征间非线性关系,对缺失值、异常值鲁棒性强,支持输出特征重要性,便于分析降雨影响因素。
- 支持向量机(SVM):在小样本数据集上表现稳定,适合数据量不大的场景。
3. 深度学习模型
- LSTM/GRU:循环神经网络变体,擅长捕捉长时序依赖,适合利用多周历史数据的场景,自动学习时序复杂模式。
- 时间序列Transformer:基于注意力机制,能更好捕捉长序列中不同时间步的关联,适合更长历史序列输入的场景。
内容的提问来源于stack exchange,提问作者quant
相关产品推荐
相关产品推荐

