defforward(self, x): N, T = x.shape[0], x.shape[1] x = x.transpose(1, 2)
x = self.conv1(x) # torch.Size([1, 64, 1]) x=self.lr(x) x = self.maxpool1(x) # torch.Size([1, 64, 32]) x = self.conv2(x) # torch.Size([1, 128, 32]) x=self.lr(x) x = self.maxpool2(x) # torch.Size([1, 128, 32]) # x = self.conv3(x) # torch.Size([32, 300, 298]) # x = self.maxpool3(x) # torch.Size([32, 300, 100]) x = self.flatten(x) # 注意Flatten层后输出为(N×T,C_new),需要转换成(N,T,C_new) _, C_new = x.shape x = x.view(N, T, C_new)
# LSTM部分 x, h = self.lstm1(x) x, h = self.lstm2(x) # 注意这里只使用隐层的输出 x, _ = h x = self.fc(x.reshape(-1,)) x = self.relu(x) x = self.fc1(x) x = self.relu(x) x = self.fc2(x) x = self.relu(x) x = self.fc3(x)
defShow(model,title="CNN+LSTM"): model.eval() model=model.cpu() model.state_dict=torch.load(path) preds=train_norm PreV=[] for i inrange(480): seq=torch.FloatTensor(preds[i:i+window_size]).reshape(1,1,-1) with torch.no_grad(): try: v=model(seq).item() except: break PreV.append(v) # 预测未来36个月 preds=PreV[-window_size:] future=36 for i inrange(future): seq=torch.FloatTensor(preds[i:i+window_size]).reshape(1,1,-1) with torch.no_grad(): preds.append(model(seq).item()) PreV=train_norm[:window_size ].tolist()+PreV+preds[window_size:] true_predictions = scaler.inverse_transform(np.array(PreV).reshape(-1, 1)) print(true_predictions.shape) # 对比真实值和预测值 plt.figure(figsize=(12,4)) plt.grid(True) x1=np.arange('1982-01-01', '2022-01-01', dtype='datetime64[M]').astype('datetime64[D]') plt.plot(x1,data,label='real') x2 = np.arange('1982-01-01', '2025-02-01', dtype='datetime64[M]').astype('datetime64[D]').reshape(-1,1) plt.plot(x2,true_predictions,label="pre") plt.legend() plt.title(title) plt.show()
在软投票方面,我们只需要做以下修改:
1 2 3 4 5 6 7 8 9 10 11 12
preds=train_norm PreV=[] for i inrange(480): seq=torch.FloatTensor(preds[i:i+window_size]).reshape(1,1,-1) with torch.no_grad(): try: v=0 for i,m inenumerate(model_list): v+=m(seq).item()*Model_Loss[i] except: break PreV.append(v)
Model_Loss是三个模型的权重,算法为计算各自占比的逆事件的占比,简单作为权重放上去了。
1 2 3 4 5 6 7 8 9 10 11 12 13
# 预测未来36个月 preds=PreV[-window_size:] future=36 for i inrange(future): seq=torch.FloatTensor(preds[i:i+window_size]).reshape(1,1,-1) with torch.no_grad(): v=0 for i,m inenumerate(model_list): v+=m(seq).item()*Model_Loss[i] preds.append(v) PreV=train_norm[:window_size ].tolist()+PreV+preds[window_size:] true_predictions = scaler.inverse_transform(np.array(PreV).reshape(-1, 1))