RNN 做回归预测时,滑动窗口预测实例:(预测风电出力)

为什么使用rnn模型时,需要用到滑动窗口预测所有数据:

        由于RNN模型,是之前的输入会对后来的输入样本的预测结果有影响。所以训练模型时候,在网络构建中定义的输入尺寸,在这里定义了输入的样本数是 TIME_STEP 个,所以预测时,也要用相同的尺寸,预测出相应尺寸的结果。

        如果这段话你听的不太明白你需要在深入理解一下RNN循环神经网络的原理。

参考:史上最详细循环神经网络讲解(RNN/LSTM/GRU) - 知乎

        RNN 循环神经网络 回归 - 简书


这里是我构建的rnn网络的结构:

class RNN(nn.Module):
    def __init__(self):
        super(RNN, self).__init__()

        self.rnn = nn.RNN(
            input_size=INPUT_SIZE,
            hidden_size=128,
            num_layers=1,
            batch_first=True,
        )
        self.fc1 = nn.Linear(128, 64)
        self.fc2 = nn.Linear(64, 1)

    # https://zhuanlan.zhihu.com/p/60792047
    def forward(self, x, h_state):
        r_out, h_state = self.rnn(x, h_state)
        # outs = []
        # for time_step in range(r_out.size(1)):
        #     outs.append(self.out(r_out[:, time_step, :]))
        # return torch.stack(outs, dim=1), h_state

        # instead, for simplicity, you can replace above codes by follows
        r_out = r_out.reshape(-1, 128)
        outs = self.fc1(r_out)
        outs = F.relu(outs)
        # outs = outs.reshape(-1, 64)
        outs = self.fc2(outs)

        outs = outs.view(-1, TIME_STEP, 1)
        return outs, h_state

训练模型的过程:

# 训练模型    # 创建rnn网络模型
rnn = RNN()
# 模型加入装置
rnn.to(device)
# 优化器
optimizer = torch.optim.Adam(rnn.parameters(), lr=Lr)
# 损失函数
loss_func = nn.MSELoss()
# 初始化隐藏状态
h_state = None

losses = []
for epoch in range(300):
    batch_loss = []
    batch_count = batch_size*TIME_STEP
    for start in range(0, len(X_data), batch_count):
        if start + batch_count < len(X_data):
            end = start + batch_count
            # print(rf'{start}--->{end}')
            # 提取数据变成张量,提取shape(batch, time_step, input_size/output_size)
            xx = torch.tensor(X_data[start:end], dtype=torch.float, requires_grad=True).view(
                [batch_size, TIME_STEP, INPUT_SIZE])
            yy = torch.tensor(y_data[start:end], dtype=torch.float, requires_grad=True).view(
                [batch_size, TIME_STEP, 1])
            # print(yy.view([10, 10, 22]))  # tensor_01.view([2, 3, -1, 2])
            # print(yy.shape)
            # print(yy)
            prediction, h_state = rnn(xx, h_state)  # rnn output
            # !! next step is important !!
            h_state = h_state.data  # repack the hidden state, break the connection from last iteration

            loss = loss_func(prediction, yy)
            optimizer.zero_grad()
            loss.backward()
            optimizer.step()
            try:
                batch_loss.append(loss.data.numpy())
            except:
                batch_loss.append(loss.data.numpy())

    if epoch % 10 == 0:
        losses.append(np.mean(batch_loss))
        print(epoch, losses[-1])

在测试集,用滑动窗口预测全部数据的操作:

# 转化tensor格式
x = torch.tensor(X_data, dtype=torch.float).to(device)
# 滑动窗口预测(十个结果全取的结果)
# 初始化隐藏状态
h_state = None
prediction_ = torch.FloatTensor()
for start in range(0, len(X_data), TIME_STEP):
    if start + TIME_STEP < len(X_data):
        end = start + TIME_STEP
        x_ = x[start:end].view([1, TIME_STEP, 22])
        prediction, h_state = rnn(x_, h_state)
        h_state = h_state.data  # rnn output
        prediction_ = torch.cat((prediction_, prediction), 0)
# 预测结果tensor拉平
prediction_ = prediction_.view(-1, 1)
# 添加最后没法与预测的边角料,目的使预测结果长度与真实结果长度一致
last_len = len(X_data) % 10
last_ = torch.rand(last_len, 1).to(device)
prediction_ = torch.cat((prediction_, last_), 0)
# 转化为数组形式
predict = prediction_.data.numpy()

结果展示:

        预测了一个风电场7天出力,结果显示还可以,但是比不上xgb,建议在特征量没有很大量的时候,还是慎重使用深度学习去预测。

 

 

  • 2
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
LSTM(Long Short-Term Memory)是一种循环神经网络RNN)的变体,它在处理时间序列数据表现出色。LSTM通过使用门控机制来解决传统RNN中的梯度消失和梯度爆炸问题,能够更好地捕捉长期依赖关系。 时间序列预测是指根据过去的观测值来预测未来的值。滑动窗口是一种常用的时间序列预测方法,它将时间序列数据划分为多个窗口,每个窗口包含一定数量的连续观测值。在LSTM时间序列预测中,滑动窗口被用来构建输入特征和目标值。 具体而言,滑动窗口方法将时间序列数据划分为多个窗口,每个窗口包含t个连续的观测值。然后,可以使用前t-1个观测值作为输入特征,第t个观测值作为目标值。这样就可以训练一个LSTM模型来学习时间序列数据的模式,并用于预测未来的观测值。 在实际应用中,可以根据具体问题设置滑动窗口的大小和步长。窗口大小决定了模型能够看到多少历史观测值,步长决定了窗口之间的间隔。较大的窗口大小可以捕捉更长期的依赖关系,但也增加了模型的复杂度和计算成本。 总结一下,LSTM时间序列预测滑动窗口的步骤如下: 1. 将时间序列数据划分为多个窗口,每个窗口包含一定数量的连续观测值。 2. 使用前t-1个观测值作为输入特征,第t个观测值作为目标值。 3. 构建LSTM模型,并使用滑动窗口数据进行训练。 4. 使用训练好的模型进行未来观测值的预测

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值