当前位置:   article > 正文

Pytorch实战——气温预测(基础)附完整代码_pytorch 气温预测案例数据集

pytorch 气温预测案例数据集

一. 数据集

http://链接:https://pan.baidu.com/s/1mVAIWZquUyaCpgj1K51o5A 提取码:abcd

该数据集记录了一年内的气温信息,我们将针对于此进行分析

以上是部分数据情况,请查看 

二.气温预测实战

2.1 读取数据,查看数据

  1. data = pd.read_csv("temps.csv")
  2. print(data.head()) #查看数据是什么样子的

  • year,moth,day,week分别表示的具体的时间
  • temp_2:前天的最高温度值
  • temp_1:昨天的最高温度值
  • average:在历史中,每年这一天的平均最高温度值
  • actual:这就是我们的标签值了,当天的真实最高温度
  • friend:这是朋友的猜测值,不怎么重要,可看可不看

2.2  查看维度

print('查看数据维度:',data.shape)

 说明了一共有348条数据,9个特征

2.3 处理时间数据

  1. import datetime
  2. years = data['year']
  3. months = data['month']
  4. days = data['day']
  5. #转化为datetime格式
  6. date = [str(int(year)) + '-' + str(int(month)) + '-' + str(int(day)) for year,month,day in zip(years,months,days)]
  7. date = [datetime.datetime.strptime(date_1,'%Y-%m-%d') for date_1 in date ]
  8. print(date[:5])

 此时可看到,时间数据都存在于一起

2.4 绘制特征图像

  1. #解下来进行绘图操作
  2. plt.style.use('fivethirtyeight')
  3. fig,((ax1,ax2),(ax3,ax4)) = plt.subplots(nrows=2, ncols=2, figsize= (10,10))
  4. fig.autofmt_xdate(rotation = 45)
  5. ax1.plot(date,data['actual'])
  6. ax1.set_xlabel(' ')
  7. ax1.set_ylabel('Temperature')
  8. ax1.set_title('Max Temp')
  9. ax2.plot(date, data['temp_1'])
  10. ax2.set_xlabel('')
  11. ax2.set_ylabel('Temperature')
  12. ax2.set_title('Previous Max Temp')
  13. ax3.plot(date, data['temp_2'])
  14. ax3.set_xlabel('Date')
  15. ax3.set_ylabel('Temperature')
  16. ax3.set_title('Two Days Prior Max Temp')
  17. ax4.plot(date, data['friend'])
  18. ax4.set_xlabel('Date')
  19. ax4.set_ylabel('Temperature')
  20. ax4.set_title('Friend Estimate')
  21. plt.tight_layout(pad=2)
  22. plt.show()

结果:

       注意: 设置坐标倾斜角度,防止累计在一起,造成重叠。

2.5 对于字符串进行编码

在原数据集当中,因为在week列中存在字符串,并不是整数类型,所以这个时候进行编码处理,这里使用pandas中的get_dummies进行编码

  1. data = pd.get_dummies(data)
  2. print(data.head(5))

 

可见对于字符串进行了编码,对于存在的写为“1”,不存在的写为“0”

 2.6 标签操作

对于标签,在该数据集当中也就是actual,我们先将其存入labels中,后将这一列在数据集当中删除,因为之后训练不会用该列。

  1. labels = np.array(data['actual'])
  2. data = data.drop('actual',axis=1)
  3. data_list = list(data.columns) #保存删除actual列后的名字
  4. #print(data_list)

2.7 归一化处理

在数据集当中,很明显数据集是大大小小的,有一些数值非常大,一些数值非常小,这个时候需要对其进行归一化,将所有数值按照权重、影响占比等缩放在(0,1)的范围当中

  1. from sklearn import preprocessing
  2. input_data = preprocessing.StandardScaler().fit_transform(data)

2.8 转化格式

将上述inpu_data,labels转化为tensor格式,pytorch可以运用这个格式。

  1. #转化为torch中的可用格式tensor
  2. x = torch.tensor(input_data , dtype= float)
  3. y = torch.tensor(labels , dtype=float)

2.8 构建网络模型

  1. #权重参数初始化
  2. weights = torch.randn((14,128),dtype=float,requires_grad=True)
  3. biases = torch.randn(128,dtype=float,requires_grad=True)
  4. weights2 = torch.randn((128,1),dtype=float,requires_grad=True)
  5. biases2 = torch.randn(1,dtype=float,requires_grad=True)
  6. learning_rate = 0.001
  7. losses = []
  8. for i in range(1000):
  9. #计算隐藏层
  10. hidden = x.mm(weights)+biases
  11. #给激活函数
  12. hidden = torch.relu(hidden)
  13. #预测
  14. predictions = hidden.mm(weights2)+biases2
  15. #计算损失
  16. loss = torch.mean((predictions - y) ** 2)
  17. losses.append(loss.data.numpy())
  18. if i % 100 == 0 :
  19. print('loss:',loss)
  20. loss.backward()
  21. #更新参数
  22. weights.data.add_(- learning_rate * weights.grad.data)
  23. biases.data.add_(- learning_rate * biases.grad.data)
  24. weights2.data.add_(- learning_rate * weights2.grad.data)
  25. biases2.data.add_(- learning_rate * biases2.grad.data)
  26. #记得清空权重参数,因为每次迭代会累计
  27. weights.grad.data.zero_()
  28. biases.grad.data.zero_()
  29. weights2.grad.data.zero_()
  30. biases2.grad.data.zero_()

首先要进行权重的初始化,来为后面的学习打下基础,切记需要将每一次迭代后的梯度进行清零,否则将会一直累加,影响结果。

各个参数的设置是根据前面的特征数量来进行确定,我们要进行128个神经元的设计,需要凑一个14*128的矩阵给weights,同理,最后预测结果为一个结果,所以我们要将weights2设置为128*1.

最终预测结果为:

 可见,使用该方法来进行预测时,其结果准确率不怎么高,下次我将更新神经网络,将准确率提高!谢谢观看!

完整代码如下:

  1. import numpy as np
  2. import pandas as pd
  3. import matplotlib
  4. import torch
  5. from matplotlib import pyplot as plt
  6. data = pd.read_csv("temps.csv")
  7. print(data.head()) #查看数据是什么样子的
  8. print('查看数据维度:',data.shape)
  9. # 接下来进行处理时间数据,因为此时数据中的数据不支持计算机进行特征提取
  10. import datetime
  11. years = data['year']
  12. months = data['month']
  13. days = data['day']
  14. #转化为datetime格式
  15. date = [str(int(year)) + '-' + str(int(month)) + '-' + str(int(day)) for year,month,day in zip(years,months,days)]
  16. date = [datetime.datetime.strptime(date_1,'%Y-%m-%d') for date_1 in date ]
  17. print(date[:5])
  18. #解下来进行绘图操作
  19. plt.style.use('fivethirtyeight')
  20. fig,((ax1,ax2),(ax3,ax4)) = plt.subplots(nrows=2, ncols=2, figsize= (10,10))
  21. fig.autofmt_xdate(rotation = 45)
  22. ax1.plot(date,data['actual'])
  23. ax1.set_xlabel(' ')
  24. ax1.set_ylabel('Temperature')
  25. ax1.set_title('Max Temp')
  26. ax2.plot(date, data['temp_1'])
  27. ax2.set_xlabel('')
  28. ax2.set_ylabel('Temperature')
  29. ax2.set_title('Previous Max Temp')
  30. ax3.plot(date, data['temp_2'])
  31. ax3.set_xlabel('Date')
  32. ax3.set_ylabel('Temperature')
  33. ax3.set_title('Two Days Prior Max Temp')
  34. ax4.plot(date, data['friend'])
  35. ax4.set_xlabel('Date')
  36. ax4.set_ylabel('Temperature')
  37. ax4.set_title('Friend Estimate')
  38. plt.tight_layout(pad=2)
  39. plt.show()
  40. #处理字符串数据
  41. data = pd.get_dummies(data)
  42. print(data.head(5))
  43. labels = np.array(data['actual'])
  44. data = data.drop('actual',axis=1)
  45. data_list = list(data.columns) #保存删除actual列后的名字
  46. #print(data_list)
  47. data = np.array(data)
  48. #非常明显,data数据大大小小,现在进行归一化
  49. from sklearn import preprocessing
  50. input_data = preprocessing.StandardScaler().fit_transform(data)
  51. # print(input_data[0]),这里采用sklearn中的归一化函数
  52. print(labels)
  53. #转化为torch中的可用格式tensor
  54. x = torch.tensor(input_data , dtype= float)
  55. y = torch.tensor(labels , dtype=float)
  56. #权重参数初始化
  57. weights = torch.randn((14,128),dtype=float,requires_grad=True)
  58. biases = torch.randn(128,dtype=float,requires_grad=True)
  59. weights2 = torch.randn((128,1),dtype=float,requires_grad=True)
  60. biases2 = torch.randn(1,dtype=float,requires_grad=True)
  61. learning_rate = 0.001
  62. losses = []
  63. for i in range(1000):
  64. #计算隐藏层
  65. hidden = x.mm(weights)+biases
  66. #给激活函数
  67. hidden = torch.relu(hidden)
  68. #预测
  69. predictions = hidden.mm(weights2)+biases2
  70. #计算损失
  71. loss = torch.mean((predictions - y) ** 2)
  72. losses.append(loss.data.numpy())
  73. if i % 100 == 0 :
  74. print('loss:',loss)
  75. loss.backward()
  76. #更新参数
  77. weights.data.add_(- learning_rate * weights.grad.data)
  78. biases.data.add_(- learning_rate * biases.grad.data)
  79. weights2.data.add_(- learning_rate * weights2.grad.data)
  80. biases2.data.add_(- learning_rate * biases2.grad.data)
  81. #记得清空权重参数,因为每次迭代会累计
  82. weights.grad.data.zero_()
  83. biases.grad.data.zero_()
  84. weights2.grad.data.zero_()
  85. biases2.grad.data.zero_()
  86. predicted = predictions.detach().numpy()
  87. print(predicted)
  88. print('*******')
  89. print(predictions)
  90. plt.plot(date, labels, label='Actual')
  91. plt.plot(date, predicted, label='Predicted')
  92. plt.xlabel('Date')
  93. plt.ylabel('Temperature')
  94. plt.title('Actual vs Predicted')
  95. plt.legend()
  96. plt.show()

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

闽ICP备14008679号