一 数据集的划分
test_data_size = 12 test_data = all_data[-test_data_size:] train_data = all_data[:-test_data_size]
# 数据标准化 scaler = MinMaxScaler(feature_range=(-1, 1)) train_data_normalized = scaler.fit_transform(train_data.reshape(-1, 1)) train_data_normalized = torch.FloatTensor(train_data_normalized).view(-1)
test_inputs = train_data_normalized[-train_window:].tolist() 问 :这里为什么要用训练集的最后train——window(个)数据作为测试模型的输入?
答: 因为是一整个序列数据,说白了,只是一条依赖于时间变化的数据,所以我们需要将训练集的最后train_window个数据拿出来,输入给测试模型 ,否则测试模型哪里来的输入?
fut_pred = 12 for i in range(fut_pred): seq = torch.FloatTensor(test_inputs[-train_window:]) print("这是送入测试模型的数据,用这些数据来预测测试集,这是数据:{0}".format(seq)) with torch.no_grad(): model.eval() # 将模型设置为评估模式 seq = seq.unsqueeze(0).unsqueeze(2) prediction = model(seq) # 使用模型进行预测 test_inputs.append(prediction.item()) # 将预测结果添加到列表中
问:为什么不能把fut_pred 直接用 test_data_size 代替?
答:不可以:fut_pred 只是一个标签,当用train_window 个数据去连续预测 fut_pred 个数据时,此时是不改变训练集的大小的。如果用data_size代替,就会改变测试集和训练集的大小。如果将test_data_size当做fut_pred去调解时,可能在训练模型时,会污染数据集。
当在使用模型的时候,即既不是测试也不是在训练的时候,需要从行设置预测的长度 即是fut_pred,所以在测试的时候可以用 tset_data_size代替fut_pred,在使用的时候不行。
问:(test_inputs[-train_window:]) 为什么要在输入序里面去最后train_window个数据,作为模型的输入?
答:
第一,将一个序列输入给训练好的模型时,模型只会输出一个数。而我们如果想让模型输出多个数,就需要多几次循环使用模型。
第二,在每次循环使用模型时,需要传入不同的序列,否则输出的就是同一个值。我们需要将上一次模型的输入添加到输入列表中。用上一次模型输出的预测值,组成新的列表。再从新的列表里面取出倒数train_window个数 做为一次模型的输入。