利用LSTM时序神经网络对主蒸汽流量的预测

利用LSTM时序神经网络对主蒸汽流量的预测

1.数据集介绍

训练数据是一个9列(含有9个特征量),包括炉膛温度,炉膛压力等数据,label数据是主蒸汽流量,其中9个特征量进行了归一化处理,使用的是sklearn里的 StandardScaler。导入的库和包,如下所示:

import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
import numpy as np
import torch
from torch import nn
import pandas as pd
from tqdm import tqdm
from tqdm.std import trange
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import QuantileTransformer
import seaborn as sns
from sklearn.metrics import r2_score
 
DAYS_FOR_TRAIN = 5
EPOCHS = 200
#调参日记
#(1200 trainloss=0.054  
#(2400 不加学习率降低 效果可以   R20.76
#(3400不加学习率降低多加入线性层 R20.66 #加激活函数
#(4400 不加学习率降低多加入线性层  不加激活函数 层数 64  R2-800?
#(5400 加入学习率降低  加入多层学习率下降效果不好
#(6400 加入梯级学习率 R2 0.7656 
#(7100 加入梯级学习率 0.78 将hidden_size = 10变为
#(8300  用Quantile归一化 0.84  400 0.79 300步效果好
#(9100  LR=0.05  Quantile  MinMaxscaler  0.86
#(10)测试8502s模型

2.数据训练

class LSTM_Regression(nn.Module):
    def __init__(self, input_size, hidden_size, output_size=1, num_layers=2):
        super().__init__()
        self.lstm = nn.LSTM(input_size, hidden_size, num_layers)       
        self.fc = nn.Linear(hidden_size, output_size)
    def forward(self, _x, h_state,c_state):
        x, (h_state,c_state) = self.lstm(_x , (h_state,c_state))  # _x is input, size (seq_len, batch, input_size)
        s, b, h = x.shape  # x is output, size (seq_len, batch, hidden_size)
        x = x.view(s * b, h)
        x = self.fc(x)
        x = x.view(s, b, -1)  # 把形状改回来
        return x,h_state
    def InitHidden(self):
        h_state=torch.zeros(2, 1, 10)
        c_state=torch.zeros(2, 1, 10)# hidden_size =16
#       h_state = torch.randn(2, 2, 8)#初始化 hidden_size=8
        return h_state,c_state
def create_dataset(dataX,dataY, days_for_train=5) -> (np.array, np.array):
    dataset_x, dataset_y = [], []
    for i in range(len(dataX) - days_for_train):
        _x = dataX[i:(i + days_for_train)]
        dataset_x.append(_x)
        dataset_y.append(dataY[i + days_for_train])
    return (np.array(dataset_x), np.array(dataset_y))

随后开始训练:

if __name__ == '__main__':
    train = pd.read_csv('./loader_data2.csv')
    train_data = np.array(train.loc[:, 'sep_rst':'sep_sobelsum'], dtype=np.float32) # 转化为numpy数据
    label_train_data = np.array(train.sep_sobelart, dtype=np.float32)
    scaler = QuantileTransformer() #新的归一化方法
    #scaler = StandardScaler()   #Standardscaler的归一化方法
    train_data = scaler.fit_transform(train_data)
#   label_train_data = scaler.fit_transform(label_train_data)
    scaler_label = StandardScaler()  #Standardscaler的归一化方法
#   scaler_label = MinMaxScaler(feature_range=(0, 1))  # minmax归一化
    label_train_data = scaler_label.fit_transform(label_train_data.reshape(-1,1))
    #train_data = scaler.fit_transform(train_data)
    # 数据集序列化,进行标签分离
    dataset_x, dataset_y = create_dataset(train_data,label_train_data,DAYS_FOR_TRAIN)
    # 划分训练集和测试集,80%作为训练集,20%作为测试集
    train_size = int(len(dataset_x) * 0.8)
    train_x = dataset_x[:train_size]
    train_y = dataset_y[:train_size]
    test_x = dataset_x[train_size:]
    test_y = dataset_y[train_size:]
    # 改变数据集形状,RNN 读入的数据维度是 (seq_size, batch_size, feature_size)
    train_x = train_x.reshape(-1, 1, train_x.shape[2]*train_x.shape[1])
    train_y = train_y.reshape(-1, 1, 1)
    # 数据集转为pytorch的tensor对象
    train_x = torch.from_numpy(train_x)
    train_y = torch.from_numpy(train_y)
    # train model
    netdim = train_x.shape[2]*train_x.shape[1]
    model = LSTM_Regression(netdim,hidden_size=10,output_size=1, num_layers=2)  # 网络初始化
    h_state,c_state = model.InitHidden()
    loss_function = nn.MSELoss()  # 损失函数
    optimizer = torch.optim.Adam(model.parameters(), lr=0.01)  # 优化器 Adam 0.05加学习率降低
    #scheduler = torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.9)  #log学习率下降
    #scheduler= torch.optim.lr_scheduler.StepLR(optimizer, step_size=200, gamma=0.3) #有序学习率下降
    #scheduler = torch.optim.lr_scheduler.MultiStepLR(optimizer,milestones=[200,250], gamma=0.1)  #多步学习率下降
    for step in trange(EPOCHS):
        out,h_state = model(train_x,h_state,c_state)
        loss = loss_function(out, train_y)
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        h_state = h_state.detach()
        #scheduler.step()
        if step % 10 == 0:
            print('Epoch: {}, Loss:{:.5f}'.format(step, loss.item()))
    #torch.save(model.state_dict(), 'model_twosecond_test.pkl')  # 用以保存2s的模型
    # predict
    model = model.eval()  # 转换成测试模式
    # model.load_state_dict(torch.load('model_params.pkl'))  # 读取参数
    # 使用全部数据集dataset_x,模型的输出长度会比dataset_x少 DAYS_FOR_TRAIN
    dataset_x = dataset_x.reshape(-1, 1, train_x.shape[2]*train_x.shape[1])  # (seq_size, batch_size, feature_size)
    dataset_x = torch.from_numpy(dataset_x)  # 转为pytorch的tensor对象
    pred_y,_ = model(dataset_x,h_state,c_state)  # 全量数据集的模型输出 (seq_size, batch_size, output_size)
    pred_y = pred_y.view(-1).data.numpy()

3.模型预测

 # 对标准化数据进行还原
actual_pred_y = scaler_label.inverse_transform(pred_y.reshape(-1,1))
actual_pred_y = actual_pred_y.reshape(-1, 1).flatten()
test_y = scaler_label.inverse_transform(test_y.reshape(-1, 1))
test_y = test_y.reshape(-1, 1).flatten()
actual_pred_y = actual_pred_y[-len(test_y):]
test_y = test_y.reshape(-1, 1)
assert len(actual_pred_y) == len(test_y)
#(1)学习率 0.01可以预测趋势  0.9/0.1 测试集分割
#(2)学习率
import matplotlib.pyplot as plt
# 初始结果 - 预测结果
plt.plot(test_y, 'b', label='real')
plt.plot(actual_pred_y, 'r', label='prediction')
plt.legend(loc='best')
plt.savefig('result.png', format='png', dpi=200)
plt.show()

训练效果还不错,如下图所示!
在这里插入图片描述
评估指标1——散点图:

import seaborn as sns
sns.scatterplot(df["jy"], df["jy_"])
#plt.plot(x,df["jy_"])
#plt.plot(x,df["jy"])
sns.lineplot(np.linspace(50,80, 100),np.linspace(50,80, 100))

评估指标2:——R2决定系数:

from sklearn.metrics import r2_score
loss_sss=r2_score(test_y,actual_pred_y)
print(loss_sss)        #R2决定系数
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
【资源说明】 基于LSTM的SDN流量预测与负载均衡python源码+数据+详细注释.zip 基于LSTM的SDN流量预测与负载均衡python源码+数据+详细注释.zip基于LSTM的SDN流量预测与负载均衡python源码+数据+详细注释.zip基于LSTM的SDN流量预测与负载均衡python源码+数据+详细注释.zip基于LSTM的SDN流量预测与负载均衡python源码+数据+详细注释.zip基于LSTM的SDN流量预测与负载均衡python源码+数据+详细注释.zip基于LSTM的SDN流量预测与负载均衡python源码+数据+详细注释.zip基于LSTM的SDN流量预测与负载均衡python源码+数据+详细注释.zip基于LSTM的SDN流量预测与负载均衡python源码+数据+详细注释.zip基于LSTM的SDN流量预测与负载均衡python源码+数据+详细注释.zip基于LSTM的SDN流量预测与负载均衡python源码+数据+详细注释.zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
您好!对于时序预测问题,LSTM (Long Short-Term Memory) 是一种常用的循环神经网络模型,它在处理时序数据时具有较好的效果。LSTM 可以捕捉到时间序列数据中的长期依赖关系,并且能够对未来的数据进行预测。 在使用 LSTM 进行时序预测时,您可以按照以下步骤进行: 1. 数据准备:将时序数据转化为适合 LSTM 模型的输入和输出格式。常见的方式是将历史时刻的观测值作为输入特征,下一个时刻的观测值作为输出标签。 2. 构建 LSTM 模型:使用 Keras、PyTorch 或 TensorFlow 等深度学习框架构建 LSTM 模型。LSTM 模型通常包括一个或多个 LSTM 层,以及一些其他的层,如全连接层或卷积层。 3. 模型训练:使用训练数据对 LSTM 模型进行训练。通常使用梯度下降算法及其变种来最小化模型的损失函数,并更新模型的参数。 4. 模型验证和调优:使用验证数据对训练好的模型进行验证,并根据验证结果调优模型的超参数或网络结构。 5. 预测未来值:使用训练好的 LSTM 模型对未来的时序数据进行预测。可以通过将模型的输出作为下一个时刻的输入,连续预测多个时刻的数据。 需要注意的是,对于时序预测问题,数据的特征工程和模型的调参都是非常重要的环节,可以根据具体问题的特点进行相应的处理和优化。 希望这些信息能对您有所帮助!如有任何进一步的问题,请随时提问。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值