当前位置: 首页 > news >正文

搭建PyTorch神经网络进行气温预测

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
features = pd.read_csv('temps.csv')#看看数据长什么样子
features.head()

数据表中

  • year,moth,day,week分别表示的具体的时间
  • temp_2:前天的最高温度值
  • temp_1:昨天的最高温度值
  • average:在历史中,每年这一天的平均最高温度值
  • actual:这就是我们的标签值了,当天的真实最高温度
  • friend:这一列可能是凑热闹的,你的朋友猜测的可能值,咱们不管它就好了
  • # 处理时间数据
    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]
    # 准备画图
    # 指定默认风格
    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)

  • # 独热编码
    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)
    from sklearn import preprocessing
    input_features = preprocessing.StandardScaler().fit_transform(features)

    构建网络模型

  • 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
    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))

    预测训练结果

    x = torch.tensor(input_features, dtype = torch.float)
    predict = my_nn(x).data.numpy()# 转换日期格式
    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');

  • https://gitee.com/code-wenjiahao/neural-network-practical-classification-and-regression-tasks

http://www.lryc.cn/news/156477.html

相关文章:

  • Qt Creato配置PCL库
  • 从阿里到字节跳动,这3年外包做完,我这人生算是彻底废了......
  • 在汽车行业中如何脱颖而出?使用聊天机器人是关键
  • Go语言最全面试题,拿offer全靠它,附带免积分下载pdf
  • 虚拟机Linux20.04磁盘扩展
  • 类欧几里得算法
  • c++读取和存储文件,对文件操作
  • InfluxDB API -- InfluxDB笔记四
  • 数据结构 - 单链表
  • 化繁为简 面板式空调网关亮相上海智能家居展 智哪儿专访青岛中弘赵哲海
  • 4G版本云音响设置教程阿里云平台版本
  • STM32纯中断方式发送接收数据(串行通信;keil arm5;)
  • FPGA时序分析与约束(3)——时钟不确定性
  • 【Java-HDFS】使用Java操作HDFS获取HDFS指定目录下的数据量大小
  • 协议定制 + Json序列化反序列化
  • 系统架构设计师(第二版)学习笔记----系统架构概述
  • FPGA基本算术运算
  • Linux Input子系统
  • commet与websocket
  • python3 简易 http server:实现本地与远程服务器传大文件
  • Microsoft Edge 主页启动diy以及常用的扩展、收藏夹的网站
  • 文末送书!谈谈原型模式在JAVA实战开发中的应用(附源码+面试题)
  • 视频汇聚/视频云存储/视频监控管理平台EasyCVR启动时打印starting server:listen tcp,该如何解决?
  • 【Linux从入门到精通】通信 | 管道通信(匿名管道 命名管道)
  • 实践和项目:解决实际问题时,选择合适的数据结构和算法
  • 上线检查工具(待完善)
  • PE文件格式详解
  • 【Alibaba中间件技术系列】「RocketMQ技术专题」RocketMQ消息发送的全部流程和落盘原理分析
  • 关于vue首屏加载loading问题
  • 数据库性能测试实践:慢查询统计分析