#时间序列预测分析是利用一个事件时间在过去一段时间内的特征来预测该事件在未来一段时间内的特征。这是一个相对复杂的预测建模问题。与回归分析模型的预测不同,时间序列模型依赖于事件的发生顺序LSTM值预测,输入模型改变相同大小的值顺序后的结果是不同的。
时间序列模型最常用和最强大的工具是循环神经网络(RNN)。与普通神经网络计算结果的独立特性相比,RNN每个隐藏层的计算结果都与当前输入和之前的隐藏层结果相关。通过这种方法,RNN的计算结果具有记忆先前结果的特点。
#LSTM (Long Short-Term Memory) 模型是 RNN 的一种变体,可以处理 rnn 模型的局限性
#这里实现pytorch的LSTM来预测未来的风速模型
#指南包(全部可用)
进口火炬
从 torch.autograd 导入变量
将 torch.nn 导入为 nn
将熊猫导入为 pd
从熊猫导入数据框
将 matplotlib.pyplot 导入为 plt
将 numpy 导入为 np
#原始数据
#时间序列问题,时间列没有代替训练或测试,所以可以删除时间列。它使用前面的行来预测下一行。通俗点[1,2,3,4,5,6,7]可以预测4,通过1,2,3。然后2,3,4预测5。训练的时候没关系
df1 = pd.read_excel(r'D:\Personal\Desktop\cs3h.xlsx')
df1
#1。数据准备
数据 = df1.values
#归一化处理LSTM值预测,这一步必不可少,否则训练数据误差会很大,模型就不行了
max_value = np.max(数据)
min_value = np.min(数据)
标量 = 最大值 - 最小值
datas = list(map(lambda x: x / scalar, datas))
#Dataset与目标值赋值,dataset为数据,look_back为以多行数据为特征的维数
def creat_dataset(数据集,look_back):
数据_x = []
数据_y = []
对于我在范围内(len(数据集)-look_back):
data_x.append(数据集[i:i+look_back])
data_y.append(数据集[i+look_back])
return np.asarray(data_x), np.asarray(data_y) #转换为ndarray数据
# 以2为特征维度得到数据集
dataX, dataY = creat_dataset(datas,2)
train_size = int(len(dataX)*0.7)
x_train = dataX[:train_size] #训练数据
y_train = dataY[:train_size] #训练数据目标值
x_train = x_train.reshape(-1, 1, 2) #将训练数据调整为pytorch中lstm算法的输入维度
y_train = y_train.reshape(-1, 1, 1) #将目标值调整为pytorch中lstm算法的输出维度
#将ndarray数据转换为张量,因为pytorch使用的数据类型是张量
x_train = torch.from_numpy(x_train)
y_train = torch.from_numpy(y_train)
2. 创建 LSTM 模型
RNN 类(nn.Module):
def __init__(self):
super(RNN, self).__init__() #面向对象的继承
self.lstm = nn.LSTM(2,6,2) #输入数据有2个特征维度,6个隐藏层维度,串联2个LSTM,第二个LSTM接收第一个计算结果
self.out = nn.Linear(6,1) #线性拟合,接收数据维度为6,输出数据维度为1
def 前进(自我,x):
x1,_ = self.lstm(x)
a,b,c = x1.shape
out = self.out(x1.view(-1,c)) #因为线性层的输入是二维数据,所以这里lstm输出的三维数据x1要调整为二维数据,和最终特征尺寸无法更改。
out1 = out.view(a,b,-1) #因为是循环神经网络,最后二维out要调整为3维数据,下个循环使用
返回1
rnn = RNN()
#参数优化,计算损失函数
优化器 = torch.optim.Adam(rnn.parameters(), lr = 0.02)
loss_func = nn.MSELoss()
#3。训练模型
对于我在范围内(1000):
var_x = 变量(x_train).type(torch.FloatTensor)
var_y = 变量(y_train).type(torch.FloatTensor)
out = rnn(var_x)
损失 = loss_func(out,var_y)
优化器.zero_grad()
loss.backward()
优化器.step()
如果 (i+1)0==0:
print('Epoch:{}, Loss:{:.5f}'.format(i+1, loss.item()))
# 损失值
#4。模型测试
# 准备测试数据
dataX1 = dataX.reshape(-1,1,2)
dataX2 = torch.from_numpy(dataX1)
var_dataX = 变量(dataX2).type(torch.FloatTensor)
pred = rnn(var_dataX)
pred_test = pred.view(-1).data.numpy() #转换为一维ndarray数据,即预测值
dataY 是实际值
#5。图纸检验
plt.plot(pred.view(-1).data.numpy(), 'r', label='prediction')
plt.plot(dataY, 'b', label='real')
plt.legend(loc='best')
百分之七十是训练数据的目标值和真实目标值,其余的是预测目标值和真实目标值的关系
转载于: