当前位置:   article > 正文

Pytorch实战——气温预测(进阶)附完整代码_超市 温度 预测

超市 温度 预测

一. 数据集

数据集在上一个博客中,若有需要自己取一下,若是过期可私信博主。

二. 优化学习过程

        在上一个博客当中,我们对于预测温度采用了最基础的方法,从而导致预测结果的不准确性,那这种方法预测出来的结果都是不准确的吗?这个答案是不一定的,预测的结果准确性在于数据集的选取,各种超参数的设置等,并不是我们可以片面决定的。在学习了Pytorchnn模块之后,我将整体代码进行修改,最终的损失可以稳定在35左右,这对于温度这一不确定因素来说是较为准确的。

三.具体更改

  1. input_size = input_data.shape[1]
  2. hidden_size = 128
  3. output_size = 1
  4. batch_size = 16
  5. my_nn = torch.nn.Sequential(
  6. torch.nn.Linear(input_size,hidden_size),
  7. torch.nn.Sigmoid(),
  8. torch.nn.Linear(hidden_size,output_size),
  9. )
  10. cost = torch.nn.MSELoss(reduction='mean')
  11. optimizer = torch.optim.Adam(my_nn.parameters(),lr = 0.001) #优化器

1. ‘input_size = input_data.shape[1]’: 这里获取了‘input_data’数组的列数,也就是输入数据的特征数量。‘input_size’变量将被用于定义输入层的大小。

2. ’hidden_size = 128‘: 这里设置了隐藏层的大小(神经元数量)。隐藏层是位于输入层和输出层之间的一层神经元,用于提取输入数据的特征。

3. ’output_size = 1‘: 这里设置了输出层的大小。对于回归任务,输出层通常只有一个神经元,用于预测数值。

4. ‘batch_size = 16’: 这里定义了每个批次(batch)中的样本数量。批量训练可以提高训练效率,并且有助于更好地泛化。

5. ‘my_nn = torch.nn.Sequential(...)’: 这里构建了一个Sequential模型,它是一个容器,可以按照顺序添加各种层。这里Sequential模型包含三层:

   - 第一层是‘torch.nn.Linear(input_size, hidden_size)’,它是一个线性层(全连接层),将输入数据映射到隐藏层,并且使用Sigmoid激活函数。
   - 第二层是‘torch.nn.Sigmoid()’,它是一个激活函数层,用于引入非线性性。
   - 第三层是‘torch.nn.Linear(hidden_size, output_size)’,也是一个线性层,将隐藏层的输出映射到输出层。

6. ‘cost = torch.nn.MSELoss(reduction='mean')’: 这里定义了损失函数。MSELoss代表均方误差损失(Mean Squared Error Loss),在回归任务中用于衡量预测值与实际值之间的差异。

7. ‘optimizer = torch.optim.Adam(my_nn.parameters(), lr=0.001)’: 这里创建了优化器对象。Adam是一种随机梯度下降优化算法,在训练过程中用于更新神经网络的参数,以最小化损失函数。

这里所设置的各种超参数、优化器、损失函数都进行了解释,请大家仔细阅读

  1. #开始训练
  2. losses = [] #给损失值创建一个数组,方便储存,后续可用根据其进行绘图
  3. for i in range(1000):
  4. batch_loss = []
  5. for start in range(0,len(input_data),batch_size):
  6. end = start + batch_size if start +batch_size < len(input_data) else len(input_data)
  7. xx = torch.tensor(input_data[start:end], dtype=torch.float,requires_grad=True)
  8. yy = torch.tensor(labels[start:end], dtype=torch.float, requires_grad=True)
  9. prediction = my_nn(xx)
  10. loss = cost(prediction,yy)
  11. optimizer.zero_grad()
  12. loss.backward(retain_graph = True)
  13. optimizer.step()
  14. batch_loss.append(loss.data.numpy())
  15. #打印损失
  16. if i % 100 == 0:
  17. losses.append(np.mean(batch_loss))
  18. print(i,np.mean(batch_loss))

接下来就是训练过程,值得注意的是:我们需要将数据转换成Pytorch所用的tensor张量格式

 可以看到这时损失达到35左右,可以证明该网络结构较上一节的网络结构得到了很大程度的优化

四. 绘图

  1. x = torch.tensor(input_data,dtype= torch.float)
  2. predict = my_nn(x).data.numpy()
  3. # 转换日期格式
  4. dates = [str(int(year)) + '-' + str(int(month)) + '-' + str(int(day)) for year,month,day in zip(years,months,days)]
  5. dates = [datetime.datetime.strptime(date,'%Y-%m-%d') for date in dates ]
  6. true_data = pd.DataFrame(data = {'date':dates , 'actual':labels})
  7. months = data[:, data_list.index('month')]
  8. days = data[:, data_list.index('day')]
  9. years = data[:, data_list.index('year')]
  10. test_dates = [str(int(year)) + '-' + str(int(month)) + '-' + str(int(day)) for year, month, day in zip(years, months, days)]
  11. test_dates = [datetime.datetime.strptime(date, '%Y-%m-%d') for date in test_dates]
  12. predictions_data = pd.DataFrame(data = {'date': test_dates, 'prediction': predict.reshape(-1)})
  13. plt.rcParams["font.sans-serif"]=["SimHei"] #设置字体
  14. plt.rcParams["axes.unicode_minus"]=False #该语句解决图像中的“-”负号的乱码问题
  15. #真实值
  16. plt.plot(true_data['date'],true_data['actual'],'b-',label = 'actual')
  17. #预测值
  18. plt.plot(predictions_data['date'],predictions_data['prediction'],'ro',label= 'prediction')
  19. plt.xticks(rotation ="60");
  20. plt.legend()
  21. #图名
  22. plt.xlabel('Date');
  23. plt.ylabel('Maximum Temperature(华氏度)');
  24. plt.title('真实值与预测值')
  25. plt.show()

绘图操作是基本的matplotlib语法,这里不做过多解释,值得注意的是:需要将数据集当中的日期格式进行转化,这里可以参考上述代码,只有这样才可以使得机器认识并且进行学习。

结果如上,可以看到,该预测结果基本可以正确描述出温度的变化曲线,也就证明了此时的预测模型较为可靠!

谢谢观看~~ 

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

闽ICP备14008679号