机器学习算法实战案例:LSTM实现单变量滚动风电预测

文章目录

      • 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:已有实际功率预测目标

机器学习算法实战案例:LSTM实现单变量滚动风电预测_第1张图片

1.2 数据集处理

首先检查数据的缺失值情况,通过统计数据可以看到,存在少量缺失值,可以通过前后项填充进行缺失值填补。

data = data.fillna(method='ffill')

由于本次实验是单变量滚动预测,所以只截取数据集中的功率部分

data = data[['ROUND(A.POWER,0)']]

计划预测后两天的数据96*2个,将要预测的数据保留(也就是未来未知的数据),单独提取出前面训练的数据(也就是历史数据),并对数据集进行滚动划分

机器学习算法实战案例:LSTM实现单变量滚动风电预测_第2张图片

dataf = data.values[0:-96*2]

def create_dataset(dataset, timesteps=36,predict_size=6):

    for each in range(len(dataset)-timesteps - predict_steps):

        x = dataset[each:each+timesteps,0]

        y = dataset[each+timesteps:each+timesteps+predict_steps,0]

    return datax, datay#np.array(datax),np.array(datay)

接着对数据进行归一化处理,设置预测的时间步、每次预测的步长、最后总的预测步长

scaler = MinMaxScaler(feature_range=(0,1))

dataf = scaler.fit_transform(dataf)

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个样本。

model.add(LSTM(128,input_shape=(timesteps,1),return_sequences= True))

model.add(LSTM(128,return_sequences=True))

model.add(LSTM(64,return_sequences=False))

model.compile(loss="mean_squared_error",optimizer="adam")

model.fit(trainx,trainy, epochs= 50, batch_size=200)
2.2 模型滚动预测

下面介绍文章中最重要,也是真正没有未来特征的情况下预测未来标签的方法。整体的思路也就是取出预测前72个数据预测未来的12个未来数据,然后见12个数据添加进历史数据,再预测12个数据,滚动预测。因为每次只能预测12个数据,但是我要预测96个数据,所以采用的就是循环预测的思路。每次预测的12个数据,添加到数据集中充当预测x,然后在预测新的12个y,再添加到预测x列表中,如此往复,最终预测出96个点。(里面的数据可以根据需求进行更改)

机器学习算法实战案例:LSTM实现单变量滚动风电预测_第3张图片

#因为每次只能预测12个数据,但是我要预测288个数据,所以采用的就是循环预测的思路。每次预测的12个数据,添加到数据集中充当预测x,然后在预测新的12个y,再添加到预测x列表中,如此往复。最终预测出288个点。

predict_xlist = [] #添加预测x列表

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列表,用于下次预测

    lstm_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 结果可视化

计算误差,并保存预测结果

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",index=False)

最后可视化运行结果,发现滚动预测的效果并不好,更换为负荷数据集后预测效果有明显的提升,滚动预测的方法只适合数据比较规律的数据集,对于预测效果不好的数据集,可以通过分解时间序列的方法预测。

机器学习算法实战案例:LSTM实现单变量滚动风电预测_第4张图片

风电预测结果(风电波动过大,预测效果较差)

机器学习算法实战案例:LSTM实现单变量滚动风电预测_第5张图片

负荷预测结果

答疑&技术交流

技术要学会分享、交流,不建议闭门造车。一个人可以走的很快、一堆人可以走的更远。

本文完整代码、相关资料、技术交流&答疑,均可加我们的交流群获取,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友。

​方式①、微信搜索公众号:Python学习与数据挖掘,后台回复:加群
方式②、添加微信号:dkl88194,备注:来自CSDN + 技术交流

机器学习算法实战案例系列

  • 机器学习算法实战案例:确实可以封神了,时间序列预测算法最全总结!

  • 机器学习算法实战案例:时间序列数据最全的预处理方法总结

  • 机器学习算法实战案例:GRU 实现多变量多步光伏预测

你可能感兴趣的:(机器学习算法实战,机器学习,算法,lstm,人工智能,python)