python教程分享PyTorch搭建ANN实现时间序列风速预测

数据集

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

数据集为barcelona某段时间内的气象数据,其中包括温度、湿度以及风速等。python教程分享PyTorch搭建ANN实现时间序列风速预测将简单搭建来对风速进行预测。

特征构造

对于风速的预测,除了考虑历史风速数据外,还应该充分考虑其余气象因素的影响。因此,我们根据前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时序风速预测的资料请关注<猴子技术宅>其它相关文章!

需要了解更多python教程分享PyTorch搭建ANN实现时间序列风速预测,都可以关注python教程分享栏目—猴子技术宅(www.ssfiction.com)

本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

如若转载,请注明出处:https://www.ssfiction.com/pythons/1092003.html

(0)
上一篇 3天前
下一篇 3天前

精彩推荐

发表评论

您的电子邮箱地址不会被公开。