Pytorch实战——气温预测(基础)附完整代码

一. 数据集

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

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

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

二.气温预测实战

2.1 读取数据,查看数据

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

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

2.2  查看维度

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

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

2.3 处理时间数据

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

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

2.4 绘制特征图像


#解下来进行绘图操作
plt.style.use('fivethirtyeight')
fig,((ax1,ax2),(ax3,ax4)) = plt.subplots(nrows=2, ncols=2, figsize= (10,10))
fig.autofmt_xdate(rotation = 45)

ax1.plot(date,data['actual'])
ax1.set_xlabel(' ')
ax1.set_ylabel('Temperature')
ax1.set_title('Max Temp')

ax2.plot(date, data['temp_1'])
ax2.set_xlabel('')
ax2.set_ylabel('Temperature')
ax2.set_title('Previous Max Temp')

ax3.plot(date, data['temp_2'])
ax3.set_xlabel('Date')
ax3.set_ylabel('Temperature')
ax3.set_title('Two Days Prior Max Temp')

ax4.plot(date, data['friend'])
ax4.set_xlabel('Date')
ax4.set_ylabel('Temperature')
ax4.set_title('Friend Estimate')

plt.tight_layout(pad=2)
plt.show()

结果:

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

2.5 对于字符串进行编码

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

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

 

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

 2.6 标签操作

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

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

2.7 归一化处理

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

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

2.8 转化格式

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

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

2.8 构建网络模型


#权重参数初始化
weights = torch.randn((14,128),dtype=float,requires_grad=True)
biases = torch.randn(128,dtype=float,requires_grad=True)
weights2 = torch.randn((128,1),dtype=float,requires_grad=True)
biases2 = torch.randn(1,dtype=float,requires_grad=True)

learning_rate = 0.001
losses = []

for i in range(1000):
    #计算隐藏层
    hidden = x.mm(weights)+biases
    #给激活函数
    hidden = torch.relu(hidden)
    #预测
    predictions = hidden.mm(weights2)+biases2
    #计算损失
    loss = torch.mean((predictions - y) ** 2)
    losses.append(loss.data.numpy())

    if i % 100 == 0 :
        print('loss:',loss)
    loss.backward()

    #更新参数
    weights.data.add_(- learning_rate * weights.grad.data)
    biases.data.add_(- learning_rate * biases.grad.data)
    weights2.data.add_(- learning_rate * weights2.grad.data)
    biases2.data.add_(- learning_rate * biases2.grad.data)
    #记得清空权重参数,因为每次迭代会累计
    weights.grad.data.zero_()
    biases.grad.data.zero_()
    weights2.grad.data.zero_()
    biases2.grad.data.zero_()

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

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

最终预测结果为:

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

完整代码如下:

import numpy as np
import pandas as pd
import matplotlib
import torch
from matplotlib import pyplot as plt

data = pd.read_csv("temps.csv")
print(data.head()) #查看数据是什么样子的
print('查看数据维度:',data.shape)
# 接下来进行处理时间数据,因为此时数据中的数据不支持计算机进行特征提取
import datetime
years = data['year']
months = data['month']
days = data['day']
#转化为datetime格式
date = [str(int(year)) + '-' + str(int(month)) + '-' + str(int(day)) for year,month,day in zip(years,months,days)]
date = [datetime.datetime.strptime(date_1,'%Y-%m-%d') for date_1 in date ]
print(date[:5])

#解下来进行绘图操作
plt.style.use('fivethirtyeight')
fig,((ax1,ax2),(ax3,ax4)) = plt.subplots(nrows=2, ncols=2, figsize= (10,10))
fig.autofmt_xdate(rotation = 45)

ax1.plot(date,data['actual'])
ax1.set_xlabel(' ')
ax1.set_ylabel('Temperature')
ax1.set_title('Max Temp')

ax2.plot(date, data['temp_1'])
ax2.set_xlabel('')
ax2.set_ylabel('Temperature')
ax2.set_title('Previous Max Temp')

ax3.plot(date, data['temp_2'])
ax3.set_xlabel('Date')
ax3.set_ylabel('Temperature')
ax3.set_title('Two Days Prior Max Temp')

ax4.plot(date, data['friend'])
ax4.set_xlabel('Date')
ax4.set_ylabel('Temperature')
ax4.set_title('Friend Estimate')

plt.tight_layout(pad=2)
plt.show()

#处理字符串数据
data = pd.get_dummies(data)
print(data.head(5))

labels = np.array(data['actual'])
data = data.drop('actual',axis=1)
data_list = list(data.columns) #保存删除actual列后的名字
#print(data_list)
data = np.array(data)
#非常明显,data数据大大小小,现在进行归一化
from sklearn import preprocessing
input_data = preprocessing.StandardScaler().fit_transform(data)
# print(input_data[0]),这里采用sklearn中的归一化函数
print(labels)
#转化为torch中的可用格式tensor
x = torch.tensor(input_data , dtype= float)
y = torch.tensor(labels , dtype=float)

#权重参数初始化
weights = torch.randn((14,128),dtype=float,requires_grad=True)
biases = torch.randn(128,dtype=float,requires_grad=True)
weights2 = torch.randn((128,1),dtype=float,requires_grad=True)
biases2 = torch.randn(1,dtype=float,requires_grad=True)

learning_rate = 0.001
losses = []

for i in range(1000):
    #计算隐藏层
    hidden = x.mm(weights)+biases
    #给激活函数
    hidden = torch.relu(hidden)
    #预测
    predictions = hidden.mm(weights2)+biases2
    #计算损失
    loss = torch.mean((predictions - y) ** 2)
    losses.append(loss.data.numpy())

    if i % 100 == 0 :
        print('loss:',loss)
    loss.backward()

    #更新参数
    weights.data.add_(- learning_rate * weights.grad.data)
    biases.data.add_(- learning_rate * biases.grad.data)
    weights2.data.add_(- learning_rate * weights2.grad.data)
    biases2.data.add_(- learning_rate * biases2.grad.data)
    #记得清空权重参数,因为每次迭代会累计
    weights.grad.data.zero_()
    biases.grad.data.zero_()
    weights2.grad.data.zero_()
    biases2.grad.data.zero_()

predicted = predictions.detach().numpy()
print(predicted)
print('*******')
print(predictions)
plt.plot(date, labels, label='Actual')
plt.plot(date, predicted, label='Predicted')
plt.xlabel('Date')
plt.ylabel('Temperature')
plt.title('Actual vs Predicted')
plt.legend()
plt.show()

  • 24
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
PyTorch中进行气温预测的分类任务可以按照以下步骤进行: 1. 导入所需的库和模块,包括torch和torchvision。确保你已经安装了正确的版本。\[1\] 2. 准备数据集,包括气温数据和对应的标签。可以使用torchvision中的数据集,或者自己准备数据集。 3. 定义模型结构,可以使用PyTorch提供的各种预训练模型,或者自己设计模型。 4. 定义损失函数,根据任务选择适当的损失函数,比如交叉熵损失函数。 5. 定义优化器,选择适当的优化算法,比如随机梯度下降(SGD)或Adam。 6. 进行模型训练,使用训练数据集进行模型的训练,通过反向传播算法更新模型参数。 7. 进行模型评估,使用测试数据集评估模型的性能,可以计算准确率、精确率、召回率等指标。 8. 可选地,保存模型,使用torch.save()函数保存训练好的模型参数,以便后续使用。\[2\] 总结起来,使用PyTorch进行气温预测的分类任务,需要导入库和模块、准备数据集、定义模型结构、定义损失函数和优化器、进行模型训练和评估,最后可选地保存模型。\[1\]\[2\] #### 引用[.reference_title] - *1* *2* *3* [【PyTorch框架】——框架安装&使用流程&搭建PyTorch神经网络气温预测](https://blog.csdn.net/weixin_51658186/article/details/130455894)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

睡不醒的恒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值