脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|shell|

服务器之家 - 脚本之家 - Python - PyTorch搭建ANN实现时间序列风速预测

PyTorch搭建ANN实现时间序列风速预测

2022-12-29 11:08Cyril_KI Python

这篇文章主要为大家介绍了PyTorch搭建ANN实现时间序列风速预测,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

数据集

PyTorch搭建ANN实现时间序列风速预测

数据集为Barcelona某段时间内的气象数据,其中包括温度、湿度以及风速等。本文将简单搭建来对风速进行预测。

 

特征构造

对于风速的预测,除了考虑历史风速数据外,还应该充分考虑其余气象因素的影响。因此,我们根据前24个时刻的风速+下一时刻的其余气象数据来预测下一时刻的风速。

 

数据处理

1.数据预处理

数据预处理阶段,主要将某些列上的文本数据转为数值型数据,同时对原始数据进行归一化处理。文本数据如下所示:

PyTorch搭建ANN实现时间序列风速预测

经过转换后,上述各个类别分别被赋予不同的数值,比如"sky is clear"为0,"few clouds"为1。

def load_data():
  global Max, Min
  df = pd.read_csv('Barcelona/Barcelona.csv')
  df.drop_duplicates(subset=[df.columns[0]], inplace=True)
  # weather_main
  listType = df['weather_main'].unique()
  df.fillna(method='ffill', inplace=True)
  dic = dict.fromkeys(listType)
  for i in range(len(listType)):
      dic[listType[i]] = i
  df['weather_main'] = df['weather_main'].map(dic)
  # weather_description
  listType = df['weather_description'].unique()
  dic = dict.fromkeys(listType)
  for i in range(len(listType)):
      dic[listType[i]] = i
  df['weather_description'] = df['weather_description'].map(dic)
  # weather_icon
  listType = df['weather_icon'].unique()
  dic = dict.fromkeys(listType)
  for i in range(len(listType)):
      dic[listType[i]] = i
  df['weather_icon'] = df['weather_icon'].map(dic)
  # print(df)
  columns = df.columns
  Max = np.max(df['wind_speed'])  # 归一化
  Min = np.min(df['wind_speed'])
  for i in range(2, 17):
      column = columns[i]
      if column == 'wind_speed':
          continue
      df[column] = df[column].astype('float64')
      if len(df[df[column] == 0]) == len(df):  # 全0
          continue
      mx = np.max(df[column])
      mn = np.min(df[column])
      df[column] = (df[column] - mn) / (mx - mn)
  # print(df.isna().sum())
  return df

2.数据集构造

利用当前时刻的气象数据和前24个小时的风速数据来预测当前时刻的风速:

def nn_seq():
  """
  :param flag:
  :param data: 待处理的数据
  :return: X和Y两个数据集,X=[当前时刻的year,month, hour, day, lowtemp, hightemp, 前一天当前时刻的负荷以及前23小时负荷]
                            Y=[当前时刻负荷]
  """
  print('处理数据:')
  data = load_data()
  speed = data['wind_speed']
  speed = speed.tolist()
  speed = torch.FloatTensor(speed).view(-1)
  data = data.values.tolist()
  seq = []
  for i in range(len(data) - 30):
      train_seq = []
      train_label = []
      for j in range(i, i + 24):
          train_seq.append(speed[j])
      # 添加温度、湿度、气压等信息
      for c in range(2, 7):
          train_seq.append(data[i + 24][c])
      for c in range(8, 17):
          train_seq.append(data[i + 24][c])
      train_label.append(speed[i + 24])
      train_seq = torch.FloatTensor(train_seq).view(-1)
      train_label = torch.FloatTensor(train_label).view(-1)
      seq.append((train_seq, train_label))
  # print(seq[:5])
  Dtr = seq[0:int(len(seq) * 0.5)]
  Den = seq[int(len(seq) * 0.50):int(len(seq) * 0.75)]
  Dte = seq[int(len(seq) * 0.75):len(seq)]
  return Dtr, Den, Dte

任意输出其中一条数据:

(tensor([1.0000e+00, 1.0000e+00, 2.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00,
      1.0000e+00, 1.0000e+00, 0.0000e+00, 1.0000e+00, 5.0000e+00, 0.0000e+00,
      2.0000e+00, 0.0000e+00, 0.0000e+00, 5.0000e+00, 0.0000e+00, 2.0000e+00,
      2.0000e+00, 5.0000e+00, 6.0000e+00, 5.0000e+00, 5.0000e+00, 5.0000e+00,
      5.3102e-01, 5.5466e-01, 4.6885e-01, 1.0066e-03, 5.8000e-01, 6.6667e-01,
      0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 9.9338e-01, 0.0000e+00,
      0.0000e+00, 0.0000e+00]), tensor([5.]))

数据被划分为三部分:Dtr、Den以及Dte,Dtr用作训练集,Dte用作测试集。

 

ANN模型

1.模型训练

ANN模型搭建如下:

def ANN():
  Dtr, Den, Dte = nn_seq()
  my_nn = torch.nn.Sequential(
      torch.nn.Linear(38, 64),
      torch.nn.ReLU(),
      torch.nn.Linear(64, 128),
      torch.nn.ReLU(),
      torch.nn.Linear(128, 1),
  )
  model = my_nn.to(device)
  loss_function = nn.MSELoss().to(device)
  optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
  train_inout_seq = Dtr
  # 训练
  epochs = 50
  for i in range(epochs):
      print('当前', i)
      for seq, labels in train_inout_seq:
          seq = seq.to(device)
          labels = labels.to(device)
          y_pred = model(seq)
          single_loss = loss_function(y_pred, labels)
          optimizer.zero_grad()
          single_loss.backward()
          optimizer.step()
      # if i % 2 == 1:
      print(f'epoch: {i:3} loss: {single_loss.item():10.8f}')
  print(f'epoch: {i:3} loss: {single_loss.item():10.10f}')
  state = {'model': model.state_dict(), 'optimizer': optimizer.state_dict(), 'epoch': epochs}
  torch.save(state, 'Barcelona' + ANN_PATH)

可以看到,模型定义的代码段为:

my_nn = torch.nn.Sequential(
  torch.nn.Linear(38, 64),
  torch.nn.ReLU(),
  torch.nn.Linear(64, 128),
  torch.nn.ReLU(),
  torch.nn.Linear(128, 1),
)

第一层全连接层输入维度为38(前24小时风速+14种气象数据),输出维度为64;第二层输入为64,输出128;第三层输入为128,输出为1。

2.模型预测及表现

def ANN_predict(ann, test_seq):
  pred = []
  for seq, labels in test_seq:
      seq = seq.to(device)
      with torch.no_grad():
          pred.append(ann(seq).item())
  pred = np.array([pred])
  return pred

测试:

def test():
  Dtr, Den, Dte = nn_seq()
  ann = torch.nn.Sequential(
      torch.nn.Linear(38, 64),
      torch.nn.ReLU(),
      torch.nn.Linear(64, 128),
      torch.nn.ReLU(),
      torch.nn.Linear(128, 1),
  )
  ann = ann.to(device)
  ann.load_state_dict(torch.load('Barcelona' + ANN_PATH)['model'])
  ann.eval()
  pred = ANN_predict(ann, Dte)
  print(mean_absolute_error(te_y, pred2.T), np.sqrt(mean_squared_error(te_y, pred2.T)))

ANN在Dte上的表现如下表所示:

MAE RMSE
1.04 1.46

PyTorch搭建ANN实现时间序列风速预测

以上就是PyTorch搭建ANN实现时间序列风速预测的详细内容,更多关于ANN时序风速预测的资料请关注服务器之家其它相关文章!

原文链接:https://blog.csdn.net/Cyril_KI/article/details/122280549

延伸 · 阅读

精彩推荐
  • Python使用Keras画神经网络准确性图教程

    使用Keras画神经网络准确性图教程

    这篇文章主要介绍了使用Keras画神经网络准确性图教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 ...

    ZJE_ANDY6492020-06-16
  • PythonPython常用数据分析模块原理解析

    Python常用数据分析模块原理解析

    这篇文章主要介绍了Python常用数据分析模块原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以...

    吃着东西不想停4532020-07-21
  • PythonPython基础详解之描述符

    Python基础详解之描述符

    这篇文章主要介绍了Python基础详解之描述符,文中有非常详细的代码示例,对正在学习python基础的小伙伴们有非常好的帮助,需要的朋友可以参考下...

    思想流浪者8662021-10-22
  • PythonPython周期任务神器之Schedule模块使用详解

    Python周期任务神器之Schedule模块使用详解

    这篇文章主要为大家详细介绍了Python中的周期任务神器—Schedule模块的安装和初级、进阶使用方法,文中的示例代码讲解详细,需要的可以参考一下...

    Python学习与数据挖掘5262022-12-02
  • Python在Python中增加和插入元素的示例

    在Python中增加和插入元素的示例

    今天小编就为大家分享一篇在Python中增加和插入元素的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    清新阳光5216892021-04-15
  • Pythonpython使用tkinter实现透明窗体

    python使用tkinter实现透明窗体

    一直在思索实现一个透明的窗体,然后可以基于这个窗体可以开发出各种好玩的应用(如桌面运动的小人、运动的小球、截图、录制GIF等等),今天无意间...

    dhjabc_110082021-11-03
  • Pythonopencv-python基本图像处理详解

    opencv-python基本图像处理详解

    这篇文章主要介绍了Python Opencv图像处理基本操作代码详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友...

    小负不负4762021-12-27
  • Python深入解析python返回函数和匿名函数

    深入解析python返回函数和匿名函数

    这篇文章主要介绍了python返回函数和匿名函数的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的...

    礁之4692022-12-12