可以通过哪些网站注册域名,网站建设工期及预算,网站换服务器,江苏建设服务信息网站目录
1 数据处理
1.1 数据集简介
1.2 数据集处理
2 模型训练与预测
2.1 模型训练
2.2 模型滚动预测
2.3 结果可视化 1 数据处理
1.1 数据集简介
实验数据集采用数据集5#xff1a;风电机组运行数据集#xff08;下载链接#xff09;#xff0c;包括风速、风向、温…目录
1 数据处理
1.1 数据集简介
1.2 数据集处理
2 模型训练与预测
2.1 模型训练
2.2 模型滚动预测
2.3 结果可视化 1 数据处理
1.1 数据集简介
实验数据集采用数据集5风电机组运行数据集下载链接包括风速、风向、温度、湿度、气压和真实功率等共30万余条。
WINDSPEED预测风速WINDDIRECTION风向TEMPERATURE温度HUMIDITY湿度PRESSURE气压PREPOWER预测功率ROUND(A.WS,1)实际风速ROUND(A.POWER,0)实际功率YD15已有实际功率预测目标 1.2 数据集处理
首先检查数据的缺失值情况通过统计数据可以看到存在少量缺失值可以通过前后项填充进行缺失值填补。
# 缺失值统计
data.isnull().sum()
缺失值填补
data data.fillna(methodffill)
由于本次实验是单变量滚动预测所以只截取数据集中的功率部分
#读取数据
data data[[ROUND(A.POWER,0)]]
计划预测后两天的数据96*2个将要预测的数据保留也就是未来未知的数据单独提取出前面训练的数据也就是历史数据并对数据集进行滚动划分 # 训练数据也就是历史数据
dataf data.values[0:-96*2]# #构造数据集
def create_dataset(dataset, timesteps36,predict_size6):datax[]#构造xdatay[]#构造yfor each in range(len(dataset)-timesteps - predict_steps):x dataset[each:eachtimesteps,0]y dataset[eachtimesteps:eachtimestepspredict_steps,0]datax.append(x)datay.append(y)return datax, datay#np.array(datax),np.array(datay)
接着对数据进行归一化处理设置预测的时间步、每次预测的步长、最后总的预测步长
#构造train and predict
scaler MinMaxScaler(feature_range(0,1))
dataf scaler.fit_transform(dataf)
train dataf.copy()
timesteps 72#构造x为72个数据,表示每次用前72个数据作为一段
predict_steps 12#构造y为12个数据表示用后12个数据作为一段
length 96*2#预测多步预测288个数据每次预测12个想想要怎么构造预测才能满足288
最后对数据集进行划分并将数据变换为满足模型格式要求的数据
trainx, trainy create_dataset(train, timesteps, predict_steps)
trainx np.array(trainx)
trainy np.array(trainy)
#变换
trainx np.reshape(trainx,(trainx.shape[0],timesteps,1))#变换shape,以满足keras
2 模型训练与预测
2.1 模型训练
首先搭建模型的常规操作然后使用训练数据trainx和trainy进行训练进行50个epochs的训练每个batch包含200个样本。
#lstm training
model Sequential()
model.add(LSTM(128,input_shape(timesteps,1),return_sequences True))
model.add(Dropout(0.5))
model.add(LSTM(128,return_sequencesTrue))
#model.add(Dropout(0.3))
model.add(LSTM(64,return_sequencesFalse))
#model.add(Dropout(0.2))
model.add(Dense(predict_steps))
model.compile(lossmean_squared_error,optimizeradam)
model.fit(trainx,trainy, epochs 50, batch_size200)
2.2 模型滚动预测
下面介绍文章中最重要也是真正没有未来特征的情况下预测未来标签的方法。整体的思路也就是取出预测前72个数据预测未来的12个未来数据然后见12个数据添加进历史数据再预测12个数据滚动预测。因为每次只能预测12个数据但是我要预测96个数据所以采用的就是循环预测的思路。每次预测的12个数据添加到数据集中充当预测x然后在预测新的12个y再添加到预测x列表中如此往复最终预测出96个点。里面的数据可以根据需求进行更改 #predict
#因为每次只能预测12个数据但是我要预测288个数据所以采用的就是循环预测的思路。每次预测的12个数据添加到数据集中充当预测x然后在预测新的12个y再添加到预测x列表中如此往复。最终预测出288个点。
predict_xlist [] #添加预测x列表
predict_y [] #添加预测y列表
predict_xlist.extend(dataf[dataf.shape[0]-timesteps:dataf.shape[0],0].tolist())#已经存在的最后timesteps个数据添加进列表预测新值(比如已经有的数据从1,2,3到288。现在要预测后面的数据所以将216到288的72个数据添加到列表中预测新的值即288以后的数据
while len(predict_y) length:predictx np.array(predict_xlist[-timesteps:])#从最新的predict_xlist取出timesteps个数据预测新的predict_steps个数据因为每次预测的y会添加到predict_xlist列表中为了预测将来的值所以每次构造的x要取这个列表中最后的timesteps个数据词啊性predictx np.reshape(predictx,(1,timesteps,1))#变换格式适应LSTM模型#print(predictx),print(predictx),print(predictx.shape)#预测新值lstm_predict model.predict(predictx)#predict_list.append(train_predict)#新值y添加进列表做x#滚动预测#print(lstm_predict),print(lstm_predict[0])predict_xlist.extend(lstm_predict[0])#将新预测出来的predict_steps个数据加入predict_xlist列表用于下次预测# invertlstm_predict scaler.inverse_transform(lstm_predict)predict_y.extend(lstm_predict[0])#预测的结果y每次预测的12个数据添加进去直到预测288个为止#print(xlist, predict_xlist, len(predict_xlist))#print(lstm_predict, len(lstm_predict))#print(predict_y, len(predict_y))
2.3 结果可视化
计算误差并保存预测结果
#error
y_ture np.array(data.values[-192:])
train_score np.sqrt(mean_squared_error(y_ture,predict_y))
print(train score RMSE: %.2f% train_score)
y_predict pd.DataFrame(predict_y,columns[predict])
y_predict.to_csv(y_predict_LSTM.csv,indexFalse)
最后可视化运行结果发现滚动预测的效果并不好更换为负荷数据集后预测效果有明显的提升滚动预测的方法只适合数据比较规律的数据集对于预测效果不好的数据集可以通过分解时间序列的方法预测。 风电预测结果风电波动过大预测效果较差 负荷预测结果