tnblog
首页
视频
资源
登录

Pytorch 气温预测

2111人阅读 2023/12/21 11:34 总访问:3475665 评论:0 收藏:0 手机
分类: pytorch

Pytorch 气温预测

准备数据集


下载temps.csv数据集。

  1. # 下载包
  2. !wget https://raw.githubusercontent.com/AiDaShi/learningpytorch/main/010_015%EF%BC%9A%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C%E5%AE%9E%E6%88%98%E5%88%86%E7%B1%BB%E4%B8%8E%E5%9B%9E%E5%BD%92%E4%BB%BB%E5%8A%A1/%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C%E5%AE%9E%E6%88%98%E5%88%86%E7%B1%BB%E4%B8%8E%E5%9B%9E%E5%BD%92%E4%BB%BB%E5%8A%A1/temps.csv -O temps.csv


接下来我们要完成以下步骤:

开始编码

读取数据


导入相关依赖包。

  1. import numpy as np
  2. import pandas as pd
  3. import matplotlib.pyplot as plt
  4. import torch
  5. import torch.optim as optim
  6. import warnings
  7. warnings.filterwarnings("ignore")
  8. %matplotlib inline


读取的csv数据。

  1. features = pd.read_csv('temps.csv')
  2. # 看数据长什么样子
  3. features.head()

列名 描述
year,moth,day,week 分别表示的具体的时间
temp_2 前天的最高温度值
temp_1 昨天的最高温度值
average 在历史中,每年这一天的平均最高温度值
actual 这就是我们的标签值了,当天的真实最高温度
friend 这一列可能是凑热闹的,你的朋友猜测的可能值,咱们不管它就好了
  1. # 查看数据维度
  2. print('数据维度',features.shape)

数据维度 (348, 9)


我们一共有348条,有九条数据列。
接着我们来处理一下时间格式。

处理时间格式

  1. # 处理时间数据
  2. import datetime
  3. # 分别得到年月日
  4. years = features["year"]
  5. months = features["month"]
  6. days = features["day"]
  7. # datetime拼装与格式化
  8. dates = [str(int(year)) + '-' + str(int(month))+'-'+str(int(day)) for year,month,day in zip(years,months,days)]
  9. dates = [datetime.datetime.strptime(date, '%Y-%m-%d') for date in dates]
  10. # 查看前5条数据
  11. dates[:5]

[datetime.datetime(2016, 1, 1, 0, 0),
datetime.datetime(2016, 1, 2, 0, 0),
datetime.datetime(2016, 1, 3, 0, 0),
datetime.datetime(2016, 1, 4, 0, 0),
datetime.datetime(2016, 1, 5, 0, 0)]

  1. # 准备画风
  2. # 指定默认风格
  3. # plt.style.use('ggplot')
  4. plt.style.use('fivethirtyeight')
  5. # 设置布局
  6. fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2, ncols=2, figsize=(10, 10))
  7. fig.autofmt_xdate(rotation=45)
  8. # 标签值 第一个参数是x,第二个参数是y
  9. ax1.plot(dates, features["actual"], c="blue")
  10. ax1.set_title("Max Temp");ax1.set_ylabel("Temperature");ax1.set_xlabel("")
  11. # 昨天
  12. ax2.plot(dates, features["temp_1"], c="red")
  13. ax2.set_title("Previous Max Temp");ax2.set_ylabel("Temperature");ax2.set_xlabel("")
  14. # 今天
  15. ax3.plot(dates, features["temp_2"], c="green")
  16. ax3.set_title("Two Days Prior Max Temp");ax3.set_ylabel("Temperature");ax3.set_xlabel("Date")
  17. # 朋友
  18. ax4.plot(dates, features["friend"], c="pink")
  19. ax4.set_title("Friend Estimate");ax3.set_ylabel("Temperature");ax3.set_xlabel("Date")
  20. # 子图边缘与图表边缘之间的填充量为2
  21. plt.tight_layout(pad=2)


由于week列它是字符串,我们可以通过独热编码将它进行转换成我们想要的数值形式。
对我们需要字符的列进行额外的编码。

文本热编码处理


pd.get_dummies方法它可以把包含有限几种类别的列(例如文本或分类数据)转换为数值形式。

  1. # 独热编码
  2. features = pd.get_dummies(features)
  3. features.head(5)


接下来我们先把正确的标签列提出来,然后在特征中去掉标签,方便以后训练使用。

  1. # 标签
  2. labels = np.array(features["actual"])
  3. # 在特征中去掉标签
  4. features = features.drop("actual", axis=1)
  5. # 名字单独保存一下,以备后患
  6. feature_list = list(features.columns)
  7. # 转换成合适的格式
  8. features = np.array(features)
  1. # 查看维度
  2. features.shape

(348, 14)

正态分布

  1. from sklearn import preprocessing
  2. input_features = preprocessing.StandardScaler().fit_transform(features)
相关代码 描述
scikit-learn 库进行特征标准化的操作
StandardScaler 是用于标准化特征的工具,它通过移除均值并缩放到单位方差来标准化特征。
.fit_transform(features) 方法首先计算了features的均值和标准差,然后使用这些参数将数据转换成标准化的形式


最后的结果按照标准正态分布(均值为0,标准差为1)转换后的版本

  1. # 查看其中一条数据
  2. input_features[0]

array([ 0. , -1.5678393 , -1.65682171, -1.48452388, -1.49443549,
-1.3470703 , -1.98891668, 2.44131112, -0.40482045, -0.40961596,
-0.40482045, -0.40482045, -0.41913682, -0.40482045])

使用正态分布的好处在于收敛的速度快一些,收敛的误差更小一点

设置层级

  1. # 转换torch支持的格式
  2. x = torch.tensor(input_features, dtype=float)
  3. y = torch.tensor(labels, dtype=float)
  4. # 权重参数初始化
  5. # 这里把14个特征转换成128个隐藏特征(输入层有14个节点,而隐藏层有128个节点。)
  6. weights = torch.randn((14,128), dtype=float, requires_grad=True)
  7. # 创建了一个长度为128的一维张量,代表第一个隐藏层的偏置。
  8. biases = torch.randn(128,dtype = float, requires_grad=True)
  9. # 表示从第一个隐藏层到输出层的权重。这里假设输出层只有一个节点(常见于二分类或单值回归问题)
  10. weights2 = torch.randn((128,1), dtype=float, requires_grad=True)
  11. # 创建了一个单元素张量,代表输出层的偏置。
  12. biases2 = torch.randn(1,dtype = float, requires_grad=True)
  13. # 学习率
  14. learning_rate = 0.001
  15. # 损失
  16. losses = []

训练模型


训练模型的步骤如下图所示:

  1. for i in range(1000):
  2. # 前向传播(计算隐藏层)
  3. hidden = x.mm(weights) + biases
  4. # 加入激活函数
  5. hidden = torch.relu(hidden)
  6. # 预测结果
  7. output = hidden.mm(weights2) + biases2
  8. # 通计算损失
  9. loss = torch.mean((output - y)**2)
  10. losses.append(loss.data.numpy())
  11. # 打印损失值
  12. if i % 100 == 0:
  13. print('loss:',loss)
  14. # 反向传播
  15. loss.backward()
  16. # 更新参数
  17. weights.data.add_(-learning_rate * weights.grad.data)
  18. biases.data.add_(-learning_rate * biases.grad.data)
  19. weights2.data.add_(-learning_rate * weights2.grad.data)
  20. biases2.data.add_(-learning_rate * biases2.grad.data)
  21. # 更新参数
  22. weights.grad.data.zero_()
  23. biases.grad.data.zero_()
  24. weights2.grad.data.zero_()
  25. biases2.grad.data.zero_()

loss: tensor(5887.5310, dtype=torch.float64, grad_fn=)
loss: tensor(152.7882, dtype=torch.float64, grad_fn=)
loss: tensor(147.1391, dtype=torch.float64, grad_fn=)
loss: tensor(144.9651, dtype=torch.float64, grad_fn=)
loss: tensor(143.6304, dtype=torch.float64, grad_fn=)
loss: tensor(142.7190, dtype=torch.float64, grad_fn=)
loss: tensor(142.0560, dtype=torch.float64, grad_fn=)
loss: tensor(141.5524, dtype=torch.float64, grad_fn=)
loss: tensor(141.1599, dtype=torch.float64, grad_fn=)
loss: tensor(140.8559, dtype=torch.float64, grad_fn=)


我们可以看到误差在慢慢变小。

更简单的构建网络模型


这里使用了 Sigmoid 函数的特点是它能够将任何实数值映射到 (0, 1) 区间内,这使得它非常适合用于将任意值转换为概率。

方法 描述
torch.nn.Linear 是一个模块,用于创建一个线性变换。
torch.nn.MSELoss 是一个损失函数,用于计算均方误差(Mean Squared Error, MSE)。它主要用于回归任务。
torch.optim.SGD 是随机梯度下降(Stochastic Gradient Descent, SGD)优化器的实现。
  1. # 输入层数量
  2. input_size = input_features.shape[1] # 确定输入特征的数量
  3. # 输出层数量
  4. output_size = 1
  5. # 隐藏层数量
  6. hidden_size = 128
  7. # 批量处理大小,指定了每次训练过程中同时处理的数据样本数量
  8. batch_size = 16
  9. # 构建神经网络模型
  10. my_nn = torch.nn.Sequential(
  11. torch.nn.Linear(input_size, hidden_size), # 添加输入层到隐藏层
  12. torch.nn.Sigmoid(),# 在隐藏层后添加Sigmoid激活函数
  13. torch.nn.Linear(hidden_size, output_size) # 添加隐藏层到输出层
  14. )
  15. cost = torch.nn.MSELoss(reduction='mean') # 使用均方误差损失函数,用于回归问题
  16. optimizer = torch.optim.SGD(my_nn.parameters(), lr=0.001) # 使用随机梯度下降优化器,学习率设为0.001
  1. # 损失集合
  2. losses = []
  3. for i in range(1000): # 迭代1000次
  4. batch_loss = [] # 用于存储每个批次的损失
  5. # MINI-Batch 方法来进行训练
  6. for start in range(0, len(input_features), batch_size):
  7. # 计算批次的结束索引
  8. end = start + batch_size if start + batch_size < len(input_features) else len(input_features)
  9. # 从输入特征和标签中获取当前批次的数据
  10. xx = torch.tensor(input_features[start:end], dtype=torch.float,requires_grad=True)
  11. yy = torch.tensor(labels[start:end], dtype=torch.float,requires_grad=True)
  12. # 通过网络进行前向传播得到预测结果
  13. prediction = my_nn(xx)
  14. # 计算损失
  15. loss = cost(prediction, yy)
  16. # 清除之前的梯度
  17. optimizer.zero_grad()
  18. # 反向传播,计算梯度
  19. loss.backward(retain_graph=True)
  20. # 更新权重
  21. optimizer.step()
  22. # 记录批次损失
  23. batch_loss.append(loss.data.numpy())
  24. # 打印损失
  25. if i % 100 == 0:
  26. losses.append(np.mean(batch_loss))
  27. print(i, np.mean(batch_loss))

0 1322.4116
100 37.27904
200 36.839382
300 36.445923
400 36.126297
500 35.88112
600 35.694214
700 35.547215
800 35.425312
900 35.318115


预测训练结果

  1. x = torch.tensor(input_features, dtype=torch.float)
  2. prediction = my_nn(x).data.numpy()
  1. # 转换日期格式
  2. datas = [str(int(year)) + '-' + str(int(month)) + '-' + str(int(day)) for year, month, day in zip(years,months,days)]
  3. datas = [datetime.datetime.strptime(data, '%Y-%m-%d') for data in datas]
  4. # 创建一个表格来存日期和其对应的标签数值
  5. true_data = pd.DataFrame(data={'date':datas, 'actual':labels})
  6. # 同理,再创建一个来存日期和其对应的模型预测值
  7. months = features[:, feature_list.index('month')]
  8. days = features[:, feature_list.index('day')]
  9. years = features[:, feature_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(data, '%Y-%m-%d') for data in test_dates]
  12. prediction_data = pd.DataFrame(data={'date':test_dates, 'prediction':prediction.reshape(-1)})
  1. # 真实值
  2. plt.plot(true_data['date'], true_data['actual'], 'b-', label = 'actual')
  3. # 预测值
  4. plt.plot(prediction_data['date'], prediction_data['prediction'], 'ro', label = 'prediction')
  5. plt.xticks(rotation = 60);
  6. plt.legend()
  7. # 图名
  8. plt.xlabel('Date'); plt.ylabel('Maximum Temperature (F)'); plt.title('Actual and Predicted Values');


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

Pytorch 初探

Pytorch 初探[TOC] Pytorch简介PyTorch由 Facebook 的 AI 研究团队开发的一个开源的机器学习库,它提供了张量(tensor)计...

Pytorch 自动求导与简单的线性回归

Pytorch 自动求导与简单的线性回归[TOC] 环境安装安装pytorch%pip install torch torchvision torchaudio 自动计算反向...

Pytorch Tensor 常见的形式

Pytorch Tensor 常见的形式[TOC] 值 描述 scalar 0维张量 vector 1维张量 matrix 2维张量 ...

Pytorch Mnist分类任务

Pytorch Mnist分类任务[TOC] Mnist分类任务了解目标——网络基本构建与训练方法,常用函数解析——torch.nn.functional...

Pytorch 卷积神经网络效果

Pytorch 卷积神经网络效果[TOC] 数据与在线实践数据链接: https://pan.baidu.com/s/1VkrHDZGukkF900zLncMn5g 密码: 3lom...

Pytorch 基于经典网络架构训练图像分类模型

Pytorch 基于经典网络架构训练图像分类模型[TOC] 数据预处理部分:数据增强:torchvision中transforms模块自带功能,比较...

Pytorch 卷积神经网络效果

Pytorch 卷积神经网络效果[TOC] 数据集Dataloader制作如何自定义数据集:1.数据和标签的目录结构先搞定(得知道到哪读数据)...

Pytorch 新闻分类任务(学习笔记)

Pytorch 新闻分类任务(学习笔记)[TOC] 目录结构 models文件夹该文件夹显示搭建的网络结构。里面有TextCNN.py和TextRNN....

Pytorch Flask服务部署图片识别(学习笔记)

Pytorch Flask服务部署图片识别(学习笔记)[TOC] Flask 简介Flask是一个用Python编写的轻量级Web应用框架。它简单易用,...

Pytorch 预测产量(易化学习笔记一)

Pytorch 预测产量(易化学习笔记一)[TOC] 实验目的(二维)通过温度进行产量预测。 实验代码导入数据集import torch im...

Pytorch 曲线拟合(易化学习笔记二)

Pytorch 曲线拟合(易化学习笔记二)[TOC] 感染与天数预测import matplotlib.pyplot as plt import torch import torch....

Pytorch 识别手写数字(易化学习笔记三)

Pytorch 识别手写数字(易化学习笔记三)[TOC] 识别手写数字LeNet-5手写数字识别的非常高效的卷积神经网络。高效原因:1....

Pytorch cifar10识别普适物体(易化学习笔记四)

Pytorch cifar10识别普适物体(易化学习笔记四)[TOC] CIFAR-10简介CIFAR-10(Canadian Institute For Advanced Research...

Pytorch loguru日志收集(易化学习笔记五)

Pytorch loguru日志收集(易化学习笔记五)[TOC] loguru日志简介Loguru 是一个 Python 日志库,旨在简化日志记录的设置和...

Pytorch TensorBoard运用(易化学习笔记六)

Pytorch TensorBoard运用(易化学习笔记六)[TOC] TensorBoard简介TensorBoard是TensorFlow的可视化工具包,旨在帮助研究...
这一世以无限游戏为使命!
排名
2
文章
636
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术