时间及特征融合进行风功率预测

处理数据集

本文使用的是某风场采集的风电功率,其他同学可以参考类似的时间序列数据集。本文假设读者已会载入数据并进行数据预处理,例如归一化等操作。

def creat_data(data,lookback,step):
    timeX,featureX1,featureX2,featureX3,dataY = [],[],[],[],[]
    for i in range(len(data) - lookback-step ):
        timeX.append(data[i:(i + lookback),[0]])
        featureX1.append(data[i:(i + lookback), [1]])
        featureX2.append(data[i:(i + lookback), [2]])
        featureX3.append(data[i:(i + lookback), [3]])
        dataY.append(data[i + lookback+step-1,[0]])
    return np.array(timeX),np.array(featureX1),np.array(featureX2),np.array(featureX3), np.array(dataY)
X_train_time,X_train_feature1,X_train_feature2,X_train_feature3,Y_train=creat_data(dataset[:5730],120,1)
X_test_time,X_test_feature1,X_test_feature2,X_test_feature3,Y_test=creat_data(dataset[5730:7000],120,1)

上述为构建的数据集的函数,其中X_train_time为时间序列的训练集,X_train_feature1,X_train_feature2,X_train_feature3为涉及到的三个特征(同样具有时间性),分别为叶轮转速、环境风速、风向(也可以添加更多特征),Y_train为需要预测的那个值,这里指功率。

搭建时间序列网络

这里使用最常用的LSTM网络,将各个特征及时间序列特征融合输入到网络中。其中的LSTM层可以自行调节参数,也可自行增减层数。

from keras.models import Sequential,Model
from keras.layers import Dense
from keras.layers.recurrent import LSTM
from keras import Input,layers
model = Sequential()
# 调整输入的维度,LSTM的输入维度应为3维,即(样本个数,步长,几类特征)
input_time=Input(shape=(None,X_train_time.shape[-1]))
input_time=layers.LSTM(12,return_sequences=True,activation='relu')(input_time)
input_feature1=Input(shape=(None,X_train_feature1.shape[-1]))
input_feature2=Input(shape=(None,X_train_feature2.shape[-1]))
input_feature3=Input(shape=(None,X_train_feature3.shape[-1]))
x_feature1=layers.LSTM(12,return_sequences=True,activation='relu')(input_feature1)
x_feature2=layers.LSTM(12,return_sequences=True,activation='relu')(input_feature2)
x_feature3=layers.LSTM(12,return_sequences=True,activation='relu')(input_feature3)
output1=layers.LSTM(4)([X_train_time,x_feature1,x_feature2,x_feature3])
output=layers.Dense(1)(output1)

model=Model([X_train_time,x_feature1,x_feature2,x_feature3],output)
model.compile(loss='mae', optimizer='adam')
history =model.fit([X_train_time,X_train_feature1,X_train_feature2,X_train_feature3],Y_train,steps_per_epoch=300,epochs=10,validation_data=([X_test_time,X_test_feature1,X_test_feature2,X_test_feature3],Y_test),validation_steps=(3100-2880-120))

通过迭代图像判断是否存在过拟合或者欠拟合,以便进行调整。

loss = history.history['loss']
val_loss = history.history['val_loss']
plt.plot(loss, label='Train Loss')
plt.plot(val_loss, label='Validation Loss')
plt.legend(loc='upper right')
plt.title('Train and Val Loss')
plt.show()

计算误差

计算预测值与真实值之间的误差,此处采用MAE及RMSE。

trainPredict = model.predict([X_train_time,x_feature1,x_feature2,x_feature3])
testPredict=model.predict([X_test_time,X_test_feature1,X_test_feature2,X_test_feature3])
from math import sqrt
from sklearn.metrics import mean_squared_error,mean_absolute_error
err1 = mean_absolute_error(testPredict,Y_test)
err2 = sqrt(mean_squared_error(testPredict,Y_test))
print('mae', err1)
print('rmse',err2)
  • 1
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值