PyTorch实验—回归任务

news/2024/10/18 10:15:37/

PyTorch回归任务

回归任务概述:通过pytorch搭建神经网络,进行气温的预测
回归任务可以看作 y = kx + b
y为需要进行回归预测的值

下面对实验步骤进行整理

导入相关的库

import numpy as np
import pandas as pd 
import matplotlib.pyplot as plt
import torch
import torch.optim as optim
import warnings
warnings.filterwarnings("ignore")
%matplotlib inline

主要包括了相关的科学计算库,和torch中的优化器

查看并说明数据集

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

在这里插入图片描述

数据表中

  • year,moth,day,week分别表示的具体的时间
  • temp_2:前天的最高温度值
  • temp_1:昨天的最高温度值
  • average:在历史中,每年这一天的平均最高温度值
  • actual:这就是我们的标签值了,当天的真实最高温度
  • friend:这一列可能是凑热闹的,你的朋友猜测的可能值,咱们不管它就好了

查看并输出数据的维度
数据维度: (348, 9)

print('数据维度:', features.shape)

将时间进行格式化并输出格式化的结果

# 处理时间数据
import datetime# 分别得到年,月,日
years = features['year']
months = features['month']
days = features['day']# datetime格式
dates = [str(int(year)) + '-' + str(int(month)) + '-' + str(int(day)) for year, month, day in zip(years, months, days)]
dates = [datetime.datetime.strptime(date, '%Y-%m-%d') for date in dates]
dates[:5]

在这里插入图片描述

绘图将多个数据进行显示便于对比

设置子图布局完成子图的绘制 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(dates, features['actual'])
ax1.set_xlabel(''); ax1.set_ylabel('Temperature'); ax1.set_title('Max Temp')# 昨天
ax2.plot(dates, features['temp_1'])
ax2.set_xlabel(''); ax2.set_ylabel('Temperature'); ax2.set_title('Previous Max Temp')# 前天
ax3.plot(dates, features['temp_2'])
ax3.set_xlabel('Date'); ax3.set_ylabel('Temperature'); ax3.set_title('Two Days Prior Max Temp')# 我的逗逼朋友
ax4.plot(dates, features['friend'])
ax4.set_xlabel('Date'); ax4.set_ylabel('Temperature'); ax4.set_title('Friend Estimate')plt.tight_layout(pad=2)

在这里插入图片描述

使用one-hot编码对星期字符串进行处理

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

在这里插入图片描述

在训练之前对数据特征进行预处理

去除特征中的标签项

# 标签
labels = np.array(features['actual'])# 在特征中去掉标签
features= features.drop('actual', axis = 1)# 名字单独保存一下,以备后患
feature_list = list(features.columns)# 转换成合适的格式
features = np.array(features)

查看新的数据特征的维度

features.shape

在这里插入图片描述

使用sklearn库结合标准正态分布的相关理论对整体的数据进行标准化的处理

from sklearn import preprocessing
input_features = preprocessing.StandardScaler().fit_transform(features)input_features[0]

在这里插入图片描述

构建网络模型

将narrdry格式转化为tensor(张量)进行输入

x = torch.tensor(input_features, dtype = float)y = torch.tensor(labels, dtype = float)

在神经网络的隐层中设置128个神经元,因为每一条数据拥有14个特征,因此设置一个14x128的特征矩阵,这时的b1需要更新的此时为128x1

在进行结果输出是,只需要输出一个结果所以定义一个128*1的特征矩阵,此时的b2只需要更新1次

# 权重参数初始化
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 = []

通过矩阵的乘法计算w1x+b1
计算隐层
hidden = x.mm(weights) + biases

加入激活函数进行非线性处理
加入激活函数
hidden = torch.relu(hidden)

之后通过w2和b2来计算与预测的结果
预测结果
predictions = hidden.mm(weights2) + biases2

通过与真实结果的比较来计算损失函数,结合反向传播的算法更新参数信息,沿着梯度值的方向和学习率进行更新操作

#返向传播计算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)

梯度的反方向进行更新
迭代完成之后进行清0处理

每次迭代都得记得清空
weights.grad.data.zero_()
biases.grad.data.zero_()
weights2.grad.data.zero_()
biases2.grad.data.zero_()

x = torch.tensor(input_features, 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_()

在这里插入图片描述

更简单的构建网络模型

input_size = input_features.shape[1]
hidden_size = 128
output_size = 1
batch_size = 16 #16个批次进行训练
my_nn = torch.nn.Sequential(torch.nn.Linear(input_size, hidden_size),torch.nn.Sigmoid(),torch.nn.Linear(hidden_size, output_size),
)
cost = torch.nn.MSELoss(reduction='mean')
optimizer = torch.optim.Adam(my_nn.parameters(), lr = 0.001)

训练网络得到对应的结果

# 训练网络
losses = []
for i in range(1000):batch_loss = []# MINI-Batch方法来进行训练for start in range(0, len(input_features), batch_size):end = start + batch_size if start + batch_size < len(input_features) else len(input_features)xx = torch.tensor(input_features[start:end], dtype = torch.float, requires_grad = True)yy = torch.tensor(labels[start:end], dtype = torch.float, requires_grad = True)prediction = my_nn(xx)loss = cost(prediction, yy)optimizer.zero_grad()loss.backward(retain_graph=True)optimizer.step()batch_loss.append(loss.data.numpy())# 打印损失if i % 100==0:losses.append(np.mean(batch_loss))print(i, np.mean(batch_loss))

在这里插入图片描述

得到预测结果并绘制图像

其中红色代表的是与预测值

# 转换日期格式
dates = [str(int(year)) + '-' + str(int(month)) + '-' + str(int(day)) for year, month, day in zip(years, months, days)]
dates = [datetime.datetime.strptime(date, '%Y-%m-%d') for date in dates]# 创建一个表格来存日期和其对应的标签数值
true_data = pd.DataFrame(data = {'date': dates, 'actual': labels})# 同理,再创建一个来存日期和其对应的模型预测值
months = features[:, feature_list.index('month')]
days = features[:, feature_list.index('day')]
years = features[:, feature_list.index('year')]test_dates = [str(int(year)) + '-' + str(int(month)) + '-' + str(int(day)) for year, month, day in zip(years, months, days)]test_dates = [datetime.datetime.strptime(date, '%Y-%m-%d') for date in test_dates]predictions_data = pd.DataFrame(data = {'date': test_dates, 'prediction': predict.reshape(-1)}) 
# 真实值
plt.plot(true_data['date'], true_data['actual'], 'b-', label = 'actual')# 预测值
plt.plot(predictions_data['date'], predictions_data['prediction'], 'ro', label = 'prediction')
plt.xticks(rotation = '60'); 
plt.legend()# 图名
plt.xlabel('Date'); plt.ylabel('Maximum Temperature (F)'); plt.title('Actual and Predicted Values');

在这里插入图片描述
此时并没有出现预测值过拟合的问题


http://www.ppmy.cn/news/193209.html

相关文章

计算机硬件有哪几类,计算机硬件主要有哪些?

满意答案 danny1111111 推荐于 2019.08.16 计算机硬件是计算机系统中各种设备的总称。计算机硬件应包括5个基本部分,即运算器、控制器、存储器、输入设备、输出设备,上述各基本部件的功能各异。运算器应能进行加、减、乘、除等基本运算。存储器不仅能存放数据,而且也能存放指…

curl 获取IPV6 各个时间段参数(监控网页的响应时间)

curl https:// [2409:871e:0:1::103] -H host:en.sge.com.cn -w %{http_code}:%{time_total} -o /dev/null -s -m 5 -k --insecurecurl https://en.sge.com.cn -w %{http_code}:%{time_total} -o /dev/null -s -m 5 -k --insecure --ipv6这个指令是使用curl命令来执行一个HTTP请…

FreeRTOS任务切换

PendSV异常 SVC 用于产生系统函数的调用请求。例如&#xff0c;操作系统不让用户程序直接访问硬件&#xff0c;而是通过提供一些系统服务函数&#xff0c;用户程序使用 SVC 发出对系统服务函数的呼叫请求&#xff0c;以这种方法调用它们来间接访问硬件。因此&#xff0c;当用户…

2023顺丰全球高校菁英挑战赛——编程方向个人题解

2023顺丰全球高校菁英挑战赛——编程方向个人题解 A&#xff1a; 遍历所给字符串&#xff0c;按照小写字母、大写字母、数字三种类型分别把字符加到三个字符串上。然后输出。 AC代码 void solve() {string s;cin >> s;string a, b, c;for (auto& i : s){if (i &g…

Ribbon 负载均衡策略 —— 图解、源码级解析

文章目录 负载均衡策略RandomRuleRoundRobinRuleRetryRuleWeightedResponseTimeRuleBestAvailableRuleAvailabilityFilteringRuleZoneAvoidanceRule Ribbon 负载均衡策略源码RandomRule源码RoundRobinRule源码BestAvailableRule源码RetryRule源码 通过本文你可以学习到&#xf…

MyBatis(多表查询,动态SQL的使用)

目录 多表查询 查询文章详情 查询一个用户底下的所有文章 动态SQL的使用 if 标签 trim 标签 where 标签 set 标签 foreach 标签 多表查询 现在有俩张表,一张是文章表,一张是用户表.如下: 查询文章详情 我们现在想查询得到一张表,表里面的内容和文章表大多一致,只是要在…

MMPose关键点检测实战

安装教程 https://github.com/TommyZihao/MMPose_Tutorials/blob/main/2023/0524/%E3%80%90A1%E3%80%91%E5%AE%89%E8%A3%85MMPose.ipynb git clone https://github.com/open-mmlab/mmpose.git -b tutorial2023 -b代表切换到某个分支&#xff0c;保证分支和作者的教程一致 ra…

显卡 1050Ti pytorch 安装

显卡 1050Ti 配置的是cuda 10.1 cuda 安装教程查看 https://blog.csdn.net/weixin_43735353/article/details/107412849 不能安装torch 官网最新 的版本 &#xff0c;需要安装适合 cuda 10的版本 pip install torch1.8.1cu101 torchvision0.9.1cu101 torchaudio0.8.1 -f http…