pytorch p9-气温预测

本节课跟着老师做demo

导包

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

读取数据

# 可视化图形
print(features.head(5))

说明:前面是时间

  • temp_2:前天的最高气温
  • temp_1:昨天的最高气温
  • average: 每年这一天的平均最高温度值
  • actual : 实际的值,y值,要预测的值
  • friend : 一个不准确的数据,朋友猜的今天的气温(误差大)
print("数据维度:", features.shape)
print("数据类型:", type(features))

数据维度: (348, 9)    //348天 ,每天9个特征 
数据类型: <class 'pandas.core.frame.DataFrame'>

接下来,为了 后面  的时间展示更加方便,对时间数据 进行预处理,转换为datetime 。

# 处理时间数据
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('昨天 Max Temp',fontproperties = 'Heiti TC')

# 前天
ax3.plot(dates,features['temp_2'])
ax3.set_xlabel('');ax3.set_ylabel('Temperature');ax3.set_title('前天 Max Temp')

# 朋友
ax4.plot(dates,features['friend'])
ax4.set_xlabel('');ax4.set_ylabel('Temperature');ax4.set_title('Friend Estimate')

plt.tight_layout(pad=2)
plt.xlabel('中文',fontproperties = 'Heiti TC',fontsize = 20)
plt.show()

     matplotlib.pyplot库的中文显示为框框,网上有些设置办法,需要自己动手验证下,因为windows跟mac 还不太一样。上面的demo里面 ,我特意对比了下。title,label  都可以正确 的显示中文。这里我为了简单只要一行代码。

    

#  编码转换,把星期做 转换
features = pd.get_dummies(features)
print(features.head())

 这里对非数字的特征星期week 做转换。也是独热编码

 

# 标签
labels = np.array(features['actual'])

# 去掉标签后的数据
features = features.drop('actual',axis=1)

features_list = list(features.columns)

# 将train转成合适的格式
features = np.array(features)

温度的真实值作为标签( 就是Y)。去掉标签的做输入 特征 (就是X)。

数据预处理

观察前面的数据,需要 标准化。

# 对特征进行标准化操作
from sklearn import preprocessing

input_feature = preprocessing.StandardScaler().fit_transform(features)

 构建网络模型

 对特征和标签进行torch.tensor处理,转换为tensor格式,初始化weight和biases,构建一个空列表存储损失Loss.使用batch_size进行迭代优化,利用weight.grad 和 biases.grad进行学习率的梯度优化

    每次迭代中进行前向传播和反向传播两个过程:

前向传播就是每一层之间是如何传递的,输入层->隐层->激活函数->计算损失

反向传播:从backward()开始反向传播计算->更新参数->每次迭代后清空参数的梯度

我有个体会 ,作为小白对于深度学习的的 这些理论还是云里雾里 

x = torch.tensor(input_feature,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):
    # 就是隐层 mm是矩阵乘法
    hidden = x.mm(weights) + biases
    # 加入激活函数
    hidden = torch.relu(hidden)
    # 预测结果
    predict = hidden.mm(weights2) + biases2
    # 计算损失
    loss = torch.mean((predict - y) ** 2)
    losses.append(loss.data.numpy())  # 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_()

输出 结果:随着迭代进行,损失降低了。

将x重新输入到网络中,计算获得最终的prediction,进行最终的作图

hidden = x.mm(weights) + biases
# 加入激活函数
hidden = torch.sigmoid(hidden)
# 预测结果
prediction = hidden.mm(weights2) + biases2

prediction = prediction.detach().numpy()
plt.plot(dates, y, 'b-', label='actual')
plt.plot(dates, prediction, 'ro', label='predit')
plt.xticks(rotation=60)
plt.title("Temperature Predict")
plt.xlabel("Date")
plt.ylabel("Temperature")
plt.show()

 

 这一节老师是带你快速熟悉深度学习 的模型搭建过程,如果熟悉的可以跳过,如果不太明白,还是去B站看下视频,我没能跟视频整理 的那么细致。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值