基于python语言的CNN—GRU—Attention模型实现时间序列预测。
可实现多变量预测单变量,也可以实现单变量预测单变量。
多步预测单步预测随意切换
替换数据即可运行模型,参数修改方便,
fromkeras.layers
activation='relu')(inputs)
cnn
activation='relu')(cnn)
GRU处理时序依赖
activation='tanh')(gru_out)
attention
Activation('softmax')(attention)
context
activation='relu')(context)
output
outputs=output)
注意看这个Attention层的骚操作——先用全连接层生成注意力权重,softmax归一化后和GRU输出做乘法。
相当于让模型自己决定哪些时间节点的特征更重要,这个设计在处理长时间序列时贼好用。
数据预处理部分建议搞个万能模板:
fromimport
range(len(scaled_data)-look_back-predict_step):
X.append(scaled_data[i:i+look_back])
y.append(scaled_data[i+look_back:i+look_back+predict_step,
0])
scaler
这个函数设计得很灵活,改个predictstep参数就能切换单步/多步预测。
比如设predictstep=3就是预测未来3个时间点,注意y的切片维度变化就行。
/>
训练环节有个坑得提醒:时间序列数据最好别用随机shuffle。
建议用自定义的TrainingSplitter,保持时间连续性。
不过非要shuffle的话,可以在数据切分前整体打乱:
fromkeras.callbacks
model.compile(loss='mse',
early_stop
EarlyStopping(monitor='val_loss',
patience=5)
shuffle=False)
预测阶段有个实用技巧——滚动预测。
当需要多步预测时,可以迭代更新输入序列:
definitial_data,
model.predict(current_input[np.newaxis,
...])[0]
predictions
这个实现里用到了numpy的roll函数,每次预测后把新结果拼到序列末尾,适合需要连续预测的场景。
不过要注意误差累积问题,预测步数太多准确率会下降。
基于python语言的CNN—GRU—Attention模型实现时间序列预测。
可实现多变量预测单变量,也可以实现单变量预测单变量。
多步预测单步预测随意切换
替换数据即可运行模型,参数修改方便,
/>
模型参数建议集中管理,比如搞个配置字典:
config=
}
改配置比改代码安全多了,特别是需要做参数调优的时候。
比如想试下三天预测,直接把output_steps改成72(假设每小时一个数据点),模型结构会自动适配。
最后说下数据适配技巧。
当原始数据存在缺失值时,可以穿插个插值处理:
fromsklearn.impute
SimpleImputer(strategy='linear')
filled_data
imputer.fit_transform(raw_data)
比直接删数据更合理,特别是高频采集的数据。
不过遇到连续大段缺失的情况还是得结合业务逻辑处理。
/>
这套模型在实际项目中跑过电力负荷预测,单变量情况下24小时预测的MAE能压到2.3%左右。
多变量模式加上温度、湿度等特征后,还能再降0.5个百分点。
关键是要根据数据特性调整CNN的卷积核大小和GRU的单元数,别无脑堆层数。


