基于pytorch 构建神经网络进行气温预测

2023-10-27

import numpy as np
import pandas as pd 
import matplotlib.pyplot as plt
import torch
import warnings
warnings.filterwarnings('ignore')
%matplotlib inline
path = 'E:/nlp课件/test_data/temps.csv'
features = pd.read_csv(path)
features.head()
year month day week temp_2 temp_1 average actual friend
0 2016 1 1 Fri 45 45 45.6 45 29
1 2016 1 2 Sat 44 45 45.7 44 61
2 2016 1 3 Sun 45 44 45.8 41 56
3 2016 1 4 Mon 44 41 45.9 40 53
4 2016 1 5 Tues 41 40 46.0 44 41
数据表中
  • year,moth,day,week分别表示的具体的时间
  • temp_2:前天的最高温度值
  • temp_1:昨天的最高温度值
  • average:在历史中,每年这一天的平均最高温度值
  • actual:标签值,当天的真实最高温度
print('数据维度:', features.shape)
数据维度: (348, 9)
# 处理时间
years = features['year']
month = features['month']
day = features['day']
dates = [str(int(years)) + '-' + str(int(month)) + '-' + str(int(day)) for years, month, day in zip(years, month, day)]
from datetime import datetime
dates = [datetime.strptime(date, '%Y-%m-%d') for date in dates]
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)]
# 生成图像
# 默认风格
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[:5]
year month day temp_2 temp_1 average actual friend week_Fri week_Mon week_Sat week_Sun week_Thurs week_Tues week_Wed
0 2016 1 1 45 45 45.6 45 29 1 0 0 0 0 0 0
1 2016 1 2 44 45 45.7 44 61 0 0 1 0 0 0 0
2 2016 1 3 45 44 45.8 41 56 0 0 0 1 0 0 0
3 2016 1 4 44 41 45.9 40 53 0 1 0 0 0 0 0
4 2016 1 5 41 40 46.0 44 41 0 0 0 0 0 1 0
# 目标值 
labels = np.array(features['actual'])

# 在特征之中去掉标签
features = features.drop('actual', axis = 1)

# 保存列名
features_list = list(features.columns)

# 转换格式
features = np.array(features)
features.shape
(348, 14)
from sklearn.preprocessing import StandardScaler
input_features = StandardScaler().fit_transform(features)
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])

构建网络模型

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

# 权重参数初始化   [348,14] * [14, 128] * [128] * [128, 1] * [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 = []
for i in range(1000):
    # 计算隐层
    hidden = x.mm(weights) + biases
    # 激活函数
    hidden = torch.relu(hidden)
    # 预测结果
    predictions = hidden.mm(weights2) + biases2
    # 计算损失 - MSE
    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)
    biases2.data.add_(- learning_rate * biases2)
    
    # 更新后梯度置0,否则会累加
    weights.grad.data.zero_()
    biases.grad.data.zero_()
    weights2.grad.data.zero_()
    biases2.grad.data.zero_()
    
loss: tensor(4769.2916, dtype=torch.float64, grad_fn=<MeanBackward0>)
loss: tensor(168.6445, dtype=torch.float64, grad_fn=<MeanBackward0>)
loss: tensor(152.0681, dtype=torch.float64, grad_fn=<MeanBackward0>)
loss: tensor(147.8071, dtype=torch.float64, grad_fn=<MeanBackward0>)
loss: tensor(146.4026, dtype=torch.float64, grad_fn=<MeanBackward0>)
loss: tensor(146.3492, dtype=torch.float64, grad_fn=<MeanBackward0>)
loss: tensor(147.1898, dtype=torch.float64, grad_fn=<MeanBackward0>)
loss: tensor(148.8380, dtype=torch.float64, grad_fn=<MeanBackward0>)
loss: tensor(151.3747, dtype=torch.float64, grad_fn=<MeanBackward0>)
loss: tensor(154.9829, dtype=torch.float64, grad_fn=<MeanBackward0>)

序列化容器构建网络模型

import torch.nn as nn
from torch.optim import Adam
input_size = input_features.shape[1]
hidden_size = 128
output_size = 1
batch_size = 16
my_nn = nn.Sequential(
    nn.Linear(input_size, hidden_size),
    nn.Sigmoid(),
    nn.Linear(hidden_size, output_size)
)
cost = nn.MSELoss(reduction= 'mean')
optimizer = Adam(my_nn.parameters(), lr = learning_rate)
# 训练网络
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 batch_size + start < 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)
        # 前向传播
        predictions = my_nn(xx)
        # 计算损失
        loss = cost(predictions, yy)
        # 梯度置0
        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))
0 3980.642
100 37.847748
200 35.684933
300 35.318283
400 35.14371
500 35.006382
600 34.884396
700 34.761875
800 34.633102
900 34.49755

预测训练结果

x = torch.tensor(input_features, dtype = torch.float)
predict = my_nn(x).data.numpy()
# 转换日期格式
dates = [str(int(years)) + '-' + str(int(month)) + '-' + str(int(day)) for years, month, day in zip(years, month, day)]
dates = [datetime.strptime(date, '%Y-%m-%d') for date in dates]

# 创建一个表格来存日期和其对应的标签数值
true_data = pd.DataFrame(data = {'date': dates, 'actual': labels})

# 同理,再创建一个来存日期和其对应的模型预测值
months = features[:, features_list.index('month')]
days = features[:, features_list.index('day')]
years = features[:, features_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.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');

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于pytorch 构建神经网络进行气温预测 的相关文章

随机推荐

  • (C语言)矩阵转置 (10分)

    将一个3 3矩阵转置 即行和列互换 输入格式 在一行中输入9个小于100的整数 其间各以一个空格间隔 输出格式 输出3行3列的二维数组 每个数据输出占4列 输入样例 1 2 3 4 5 6 7 8 9 输出样例 1 4 7 2 5 8 3
  • 自己造一个简易的IOC轮子

    简易的IOC流程编写笔记 首先先对这个小demo做一个说明 首先这个demo是很简易的 里面有一些可以优化的复杂点我设置了TODO 如果你有兴趣的话 可以自己去完善一下 写这个demo就是为了让自己对IOC的一个流程更加熟悉 对于刚开始学习
  • 【ROS工具】ROS基础学习

    ROS基础学习 1 基本介绍 2 实际操作 1 基本介绍 ROS Robot Operating System 是一个机器人操作系统 开始于2007 三个中长期支持版本 对应着Ubuntu的三个LTS版本如下 ROS术语 主节点 ros m
  • 1139 First Contact(unique函数,string.substr()函数)

    PTA 程序设计类实验辅助教学平台 用map套个set来实现邻接表 排序都免了 include
  • Android开发之Retrofit/OkHttp使用

    OkHttp 简介 OkHttp是时下最火的Http请求框架 其官网及源码地址如下 OkHttp官网地址 http square github io okhttp OkHttp源码地址 https github com square okh
  • .Net下正则匹配规则

    Net中常用的正则表达式选项 1 IgnoreCase 忽略大小写 匹配时不区分大小写 2 Multiline 多行模式 更改 和 的含义 使它们分别在任意一行的行首和行尾匹配 而不仅仅在整个字符串的开头和结尾匹配 在此模式下 的精确含意是
  • 寻找小数

    题目描述 有一个分数a b 你需要找到数字c在这个数的小数点后第一次出现的位置 输入格式 输入一行 包含三个整数a b c 输出格式 输出一个整数 如果不存在c 输出 1 样例输入 1 2 0 样例输出 2 约定 1 lt a
  • TCP并发服务器的编程实现

    TCP并发服务器的编程实现 1 基于TCP的服务器编程模型 创建通信端点 套接字 返回该端点的文件描述符 sfd socket 2 2 将sfd和本地的ip地址和端口号绑定 bind 2 3 将sfd设置为被动连接状态 监听客户端的到来 如
  • linux中docker报错:ERROR: Got permission denied while trying to connect to the Docker daemon socket。

    文章目录 一 问题描述 二 问题分析 三 解决方法 1 切换成root用户操作 这是最直接的方法 切换命令 2 添加docker的用户组 把当前用户加入组中 四 gpasswd命令用法 一 问题描述 在运行docker命令 如docker
  • Redis集群教程(Redis cluster tutorial)

    本博文翻译自Redis官网 http redis io topics cluster tutorial 本文档以温和的方式介绍Redis集群 不使用复杂的方式来理解分布式系统的概念 它介绍了如何建立 测试和使用一个集群 没有详细的覆盖Red
  • C语言——猜数字游戏

    游戏规则 输入1则开始游戏 输入0则结束游戏 输入其他数字则会提醒选择错误 输入1 游戏开始 系统会随机生成一个数字 游戏这需要不断根据提醒调整输入的数字 直到输入正确 系统会输出 恭喜你 猜对了 include
  • 每日一题 蛇形矩阵

    蛇形矩阵 输入两个整数n和m 输出一个n行m列的矩阵 将数字 1 到 n m 按照回字蛇形填充至矩阵中 具体矩阵形式可参考样例 输入格式 输入共一行 包含两个整数n和m 输出格式 输出满足要求的矩阵 矩阵占n行 每行包含m个空格隔开的整数
  • Spring——IoC和DI

    目录 一 初识Spring 为什么要使用Spring 什么是Spring Spring框架的核心 由哪些模块组成 二 Core Container 核心容器 IoC 控制反转 什么是 IoC IoC 的作用 IoC 的优点 IoC 的缺点
  • SpringBoot-Web开发

    Spring Boot非常适合web应用程序开发 您可以使用嵌入式Tomcat Jetty Undertow或Netty来创建一个自包含的HTTP服务器 大多数web应用程序使用spring boot starter web模块来快速启动和
  • 基于深度置信网络(DBN)的语音分类识别(Matlab实现)

    基于深度置信网络 DBN 的语音分类识别 Matlab实现 引言 语音分类识别是指根据输入的语音信号 将其划分到预先定义的不同类别中 这一领域广泛应用于语音识别 语音合成 语音转换等众多应用场景中 本文将介绍一种基于深度置信网络 Deep
  • Java web 项目Tamcat在IDEA控制台输出乱码

    遇到乱码问题怎么解决呢 出现乱码其实就是编码格式有问题 设置一下呗 我们先查看一下编码格式 在改一下 1 查看编码格式 首选进入Tamcat安装的根目录 进入conf目录 找到logging prooperties文件并打开 查看编码格式
  • 机箱嗡嗡一直响

    新买的电脑 用了一段时间后 机箱嗡嗡蜂鸣响 特别吵耳朵 一直找不到原因 后来发现原因是硬盘螺丝没有拧紧 把螺丝拧紧了 嗡嗡声没有了 过了一段时间 又发现嗡嗡声 网上一查是说机箱与硬盘产生共振了 第一次发现物理原来在生活中这么普遍 我把机箱侧
  • python第三方库安装成功,但是在pycharm中不能用

    在电脑终端使用pip安装好第三方模块但是在pycham中却显示无法找到此第三方模块 无法导入此模块该如何解决呢 方案一 在Pycharm中 依次打开File gt Settings 弹窗如下图 点击右侧 号 输入自己需要导入包的名称 在下面
  • Advanced Level 1036 Boys vs Girls (25 point(s))

    题目 This time you are asked to tell the difference between the lowest grade of all the male students and the highest grad
  • 基于pytorch 构建神经网络进行气温预测

    import numpy as np import pandas as pd import matplotlib pyplot as plt import torch import warnings warnings filterwarni