当前位置:   article > 正文

简单的基于CNN的时间序列预测(Pytorch)

简单的基于CNN的时间序列预测(Pytorch)
  1. import numpy as np # linear algebra
  2. import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
  3. # Input data files are available in the "../input/" directory.
  4. # For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory
  5. import os
  6. for dirname, _, filenames in os.walk('/kaggle/input'):
  7. for filename in filenames:
  8. print(os.path.join(dirname, filename))
  9. # Any results you write to the current directory are saved as output.
  10. from numpy import array
  11. import torch
  12. import gc
  13. import torch.nn as nn
  14. from tqdm import tqdm_notebook as tqdm
  15. from torch.utils.data import Dataset,DataLoader
  16. /kaggle/input/solarpanelspower/solarpower_cumuldaybyday2.csv
  17. /kaggle/input/solarpanelspower/PV_Elec_Gas2.csv
  18. solar_power = pd.read_csv('/kaggle/input/solarpanelspower/PV_Elec_Gas2.csv').rename(columns={'Unnamed: 0':'timestamp'}).set_index('timestamp')

Train & Valid split(Almost 8.5:1.5)

  1. train_set = solar_power[:'2018-10-31']
  2. valid_set = solar_power['2018-11-01':'2019-11-18']
  3. print('Proportion of train_set : {:.2f}%'.format(len(train_set)/len(solar_power)))
  4. print('Proportion of valid_set : {:.2f}%'.format(len(valid_set)/len(solar_power)))
  5. Proportion of train_set : 0.87%
  6. Proportion of valid_set : 0.13%
  7. def split_sequence(sequence, n_steps):
  8. x, y = list(), list()
  9. for i in range(len(sequence)):
  10. end_ix = i + n_steps
  11. if end_ix > len(sequence)-1:
  12. break
  13. seq_x, seq_y = sequence[i:end_ix], sequence[end_ix]
  14. x.append(seq_x)
  15. y.append(seq_y)
  16. return array(x), array(y)
  17. raw_seq = [10,20,30,40,50,60,70,80,90]
  18. n_steps = 3
  19. train_x,train_y = split_sequence(train_set.Elec_kW.values,n_steps)
  20. valid_x,valid_y = split_sequence(valid_set.Elec_kW.values,n_steps)

Build CNN Forecast Model

  1. class ElecDataset(Dataset):
  2. def __init__(self,feature,target):
  3. self.feature = feature
  4. self.target = target
  5. def __len__(self):
  6. return len(self.feature)
  7. def __getitem__(self,idx):
  8. item = self.feature[idx]
  9. label = self.target[idx]
  10. return item,label
  11. class CNN_ForecastNet(nn.Module):
  12. def __init__(self):
  13. super(CNN_ForecastNet,self).__init__()
  14. self.conv1d = nn.Conv1d(3,64,kernel_size=1)
  15. self.relu = nn.ReLU(inplace=True)
  16. self.fc1 = nn.Linear(64*2,50)
  17. self.fc2 = nn.Linear(50,1)
  18. def forward(self,x):
  19. x = self.conv1d(x)
  20. x = self.relu(x)
  21. x = x.view(-1)
  22. x = self.fc1(x)
  23. x = self.relu(x)
  24. x = self.fc2(x)
  25. return x
  26. device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
  27. model = CNN_ForecastNet().to(device)
  28. optimizer = torch.optim.Adam(model.parameters(), lr=1e-5)
  29. criterion = nn.MSELoss()
  30. train = ElecDataset(train_x.reshape(train_x.shape[0],train_x.shape[1],1),train_y)
  31. valid = ElecDataset(valid_x.reshape(valid_x.shape[0],valid_x.shape[1],1),valid_y)
  32. train_loader = torch.utils.data.DataLoader(train,batch_size=2,shuffle=False)
  33. valid_loader = torch.utils.data.DataLoader(train,batch_size=2,shuffle=False)
  34. train_losses = []
  35. valid_losses = []
  36. def Train():
  37. running_loss = .0
  38. model.train()
  39. for idx, (inputs,labels) in enumerate(train_loader):
  40. inputs = inputs.to(device)
  41. labels = labels.to(device)
  42. optimizer.zero_grad()
  43. preds = model(inputs.float())
  44. loss = criterion(preds,labels)
  45. loss.backward()
  46. optimizer.step()
  47. running_loss += loss
  48. train_loss = running_loss/len(train_loader)
  49. train_losses.append(train_loss.detach().numpy())
  50. print(f'train_loss {train_loss}')
  51. def Valid():
  52. running_loss = .0
  53. model.eval()
  54. with torch.no_grad():
  55. for idx, (inputs, labels) in enumerate(valid_loader):
  56. inputs = inputs.to(device)
  57. labels = labels.to(device)
  58. optimizer.zero_grad()
  59. preds = model(inputs.float())
  60. loss = criterion(preds,labels)
  61. running_loss += loss
  62. valid_loss = running_loss/len(valid_loader)
  63. valid_losses.append(valid_loss.detach().numpy())
  64. print(f'valid_loss {valid_loss}')
  65. epochs = 200
  66. for epoch in range(epochs):
  67. print('epochs {}/{}'.format(epoch+1,epochs))
  68. Train()
  69. Valid()
  70. gc.collect()
  71. import matplotlib.pyplot as plt
  72. plt.plot(train_losses,label='train_loss')
  73. plt.plot(valid_losses,label='valid_loss')
  74. plt.title('MSE Loss')
  75. plt.ylim(0, 100)
  76. plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0.)

  1. target_x , target_y = split_sequence(train_set.Elec_kW.values,n_steps)
  2. inputs = target_x.reshape(target_x.shape[0],target_x.shape[1],1)
  3. model.eval()
  4. prediction = []
  5. batch_size = 2
  6. iterations = int(inputs.shape[0]/2)
  7. for i in range(iterations):
  8. preds = model(torch.tensor(inputs[batch_size*i:batch_size*(i+1)]).float())
  9. prediction.append(preds.detach().numpy())

Prediction Result

  1. fig, ax = plt.subplots(1, 2,figsize=(11,4))
  2. ax[0].set_title('predicted one')
  3. ax[0].plot(prediction)
  4. ax[1].set_title('real one')
  5. ax[1].plot(target_y)
  6. plt.show()

知乎学术咨询:https://www.zhihu.com/consult/people/792359672131756032?isMe=1

担任《Mechanical System and Signal Processing》等审稿专家,擅长领域:现代信号处理,机器学习,深度学习,数字孪生,时间序列分析,设备缺陷检测、设备异常检测、设备智能故障诊断与健康管理PHM等。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/998504
推荐阅读
相关标签
  

闽ICP备14008679号