学习建网站,youshe wordpress主题,wordpress get term,天河网站建设服务基于时间序列预测的组合模型#xff0c;CNN-LSTM-Attention、CNN-GRU-Attention的深度学习神经网络的多特征用电负荷预测。 关于模型算法预测值和真实值对比效果如下图所示#xff0c;同时利用R2、MAPE、RMSE等评价指标进行模型性能评价。 关于数据#xff1a;利用的是30分钟…基于时间序列预测的组合模型CNN-LSTM-Attention、CNN-GRU-Attention的深度学习神经网络的多特征用电负荷预测。 关于模型算法预测值和真实值对比效果如下图所示同时利用R2、MAPE、RMSE等评价指标进行模型性能评价。 关于数据利用的是30分钟一采样的电力负荷单特征数据其中还包含对应的其他影响特征如温度、湿度、电价、等影响影响因素具体如图详情图中所示。 个人编码习惯很好基本做到逐行逐句进行注释项目的文件截图具体如图详情所示。最近在折腾一个多特征用电负荷预测的项目手头有30分钟粒度的电力数据除了负荷值还带着温度、湿度、电价这些变量。咱们这次要试试两个混合模型CNN-LSTM-Attention和CNN-GRU-Attention看看它们能不能把用电负荷的波动给拿捏住。先看数据长啥样。原始数据csv里每行记录长这样timestamp,load,temp,humidity,price 2023-07-01 00:00:00, 235.6, 28.3, 65%, 0.43 2023-07-01 00:30:00, 228.4, 27.9, 67%, 0.41 ...处理时序数据最烦人的就是时间窗设置。这里用滑动窗口把连续时间步打包成样本比如用过去6小时12个时间点预测未来1小时2个时间点def create_dataset(data, look_back12, pred_step2): X, y [], [] for i in range(len(data)-look_back-pred_step): X.append(data[i:(ilook_back)]) y.append(data[ilook_back:ilook_backpred_step, 0]) # 只取负荷值作为标签 return np.array(X), np.array(y)注意这里y只取负荷值其他特征只在输入时使用。归一化用的是MinMaxScaler但不同列要分开处理毕竟温度和电价单位差太多。模型结构是重头戏。以CNN-GRU-Attention为例Keras里这么搭def build_model(input_shape): inputs Input(shapeinput_shape) # 先用CNN抓局部特征 conv Conv1D(64, 3, activationrelu, paddingsame)(inputs) conv Dropout(0.2)(conv) # GRU处理时序依赖 gru GRU(128, return_sequencesTrue)(conv) gru GRU(64, return_sequencesFalse)(gru) # 注意力给关键时间点加权重 attention Dense(64, activationtanh)(gru) attention Attention()([attention, attention]) outputs Dense(2)(attention) # 预测未来两个时间点 model Model(inputsinputs, outputsoutputs) model.compile(optimizeradam, lossmse) return model这里有个细节Conv1D的padding设成same是为了保持时间步长度不然经过卷积后时间维度会缩减。Attention层这里用了自定义实现主要计算各时间步的注意力分数class Attention(Layer): def __init__(self, **kwargs): super(Attention, self).__init__(**kwargs) def build(self, input_shape): self.W self.add_weight(nameattention_weight, shape(input_shape[-1], 1), initializerrandom_normal) super(Attention, self).build(input_shape) def call(self, x): # 计算注意力得分 e K.tanh(K.dot(x, self.W)) a K.softmax(e, axis1) output x * a return K.sum(output, axis1)训练时发现个坑——直接拿全部特征训练容易过拟合。后来改成在CNN之后加了特征dropout让模型别太依赖某个特定特征MAPE从8.7%降到了6.3%。评估指标这块除了常见的RMSE还用了MAPE看百分比误差。R²指标用sklearn的r2_score计算时要注意多步预测需要把输出展开y_pred model.predict(X_test) # 把预测的2步和真实的2步展开计算 r2 r2_score(y_test.reshape(-1), y_pred.reshape(-1))最终两个模型的效果对比CNN-LSTM-AttentionRMSE 23.4MAPE 5.8%CNN-GRU-AttentionRMSE 21.7MAPE 5.2%GRU版本稍好可能因为数据量不算特别大GRU参数少反而更容易收敛。不过实际部署时发现在电价波动剧烈的时段LSTM版本更稳定可能需要融合两个模型的结果。