温度预测问题

今天我们将使用一个天气时间序列数据集,它由德国耶拿的马克思 • 普朗克生物地球化学研究所的气象站记录。
目的是给定一些数据,预测24小时之后的气温。

首先,先在https://s3.amazonaws.com/kerasdatasets/jena_climate_2009_2016.csv.zip 下载数据集。

  • 查看数据
import osdata_dir = 'C:\\Users\\Administrator\\Desktop\\Keras_learn\\jena_climate'
fname = os.path.join(data_dir,'jena_climate_2009_2016.csv')f = open(fname,encoding='utf-8')
data = f.read()
f.close()lines = data.split('\n')
header = lines[0].split(',') #csv文件
lines = lines[1:]print(header)
print(len(lines))


在这个数据集中,每 10 分钟记录 14 个不同的量(比如气温、气压、湿度、风向等),其中包含多年的记录。

  • 解析数据
import numpy as npfloat_data = np.zeros((len(lines),len(header)-1))
#第一个元素是记录的时间,不是学习的内容
for i,line in enumerate(lines):values = [float(x) for x in line.split(',')[1:]]float_data[i,:] = valuesimport matplotlib.pyplot as plttemp = float_data[:,1] #第二个元素为temperature,即原数据的第三个元素
plt.plot(range(len(temp)),temp)


这是2009-2016年的数据。可以看到,这些天气数据很有周期性。

在同一时间内,温、气压、湿度、风向等的单位都不一样,例如:温度通道位于 -20 到 +30之间,但气压大约在 1000 毫巴上下,这造成数据大小不一:

为了让机器更高效地学习,这里需要对它们正则化处理

mean = float_data[:200000].mean(axis=0)
float_data -= mean
std = float_data[:200000].std(axis=0)
float_data /= std

现在这一步,也是最难地一步,提取样本集:

  • lookback表示时间跨度
  • delay我们设置为lookback地后delay的时间(预测24小时之后的气温,则delay=24*60/10=144)
  • [min_index,max_index]表示取值的区间
  • shuffle表示时候需要打乱循序
  • step表示每多少10分钟提取一次数据
#生成时间序列样本及其目标的 生成器
#lookback为时间跨度def generator(data, lookback, delay, min_index, max_index,shuffle=False, batch_size=128, step=6):if max_index is None:max_index = len(data) - delay - 1#目的是要让24小时后取到值i = min_index + lookback #可取的跨度终点的起始点while 1:if shuffle:rows = np.random.randint(min_index + lookback, max_index, size=batch_size)else:if i + batch_size >= max_index:i = min_index + lookback #回到起点rows = np.arange(i, min(i + batch_size, max_index))i += len(rows)samples = np.zeros((len(rows),lookback // step,#每一个小时取一个值data.shape[-1]))targets = np.zeros((len(rows),))#24小时后的值,即为标签值for j, row in enumerate(rows):indices = range(rows[j] - lookback, rows[j], step)samples[j] = data[indices]targets[j] = data[rows[j] + delay][1]#目标选取隔一天的温度(温度是第二列的数据)yield samples, targets#sample为学习数据,targets充当监督学习标签
  • 定义数据集
lookback = 1440 #10天
step = 6
delay = 144 #1天
batch_size = 128train_gen = generator(float_data,lookback=lookback,delay=delay,min_index=0,max_index=200000,shuffle=True,step=step,batch_size=batch_size)val_gen = generator(float_data,lookback=lookback,delay=delay,min_index=200001,max_index=300000,step=step,batch_size=batch_size)test_gen = generator(float_data,lookback=lookback,delay=delay,min_index=300001,max_index=None,step=step,batch_size=batch_size)val_steps = (300000 - 200001 - lookback) // batch_size test_steps = (len(float_data) - 300001 - lookback) // batch_size
  • 用简单的密集层构建,训练模型
from keras.models import Sequential
from keras import layers
from keras.optimizers import RMSpropmodel = Sequential()
model.add(layers.Flatten(input_shape=(lookback//step,float_data.shape[-1],)))
model.add(layers.Dense(32,activation='relu'))
model.add(layers.Dense(1))model.compile(optimizer=RMSprop(),loss='mae',)train_steps = (200000 - lookback) // batch_sizehistory = model.fit_generator(train_gen,steps_per_epoch=train_steps,  epochs=20,validation_data=val_gen,validation_steps=val_steps)


差值换算公式:
tmp = loss * std[1]
0.35 x std[1] = 3.098
故,预测值与24小时后的温度相差3.1°C左右。

我们可以知道,天气温度的预测问题是严格按照时间序列的。这让我们想到,可以要循环RNN层来训练模型来提高精度。

  • 重新构建模型
    这里我们将使用GRU循环层,可以简单理解GRU是LSTM的简化版,这可以缩短运算时间,同时为了抑制过拟合,我们加上循环层特有的外部Dropout和内部循环Dropout,循环的Dropout比较特殊,这里不详细介绍,需要深入了解的可以自行搜索。这里就简要提下:每个循环层都有两个与 dropout 相关的参数,对每个时间步使用相同的 dropout 掩码,而不是让 dropout 掩码随着时间步的增加而随机变化。同时,特别注意,因为使用 dropout正则化的网络总是需要更长的时间才能完全收敛,所以网络训练轮次增加为原来的 2 倍。
from keras.models import Sequential
from keras import layers
from keras.optimizers import RMSpropmodel = Sequential()
model.add(layers.GRU(32,dropout=0.2,#指定该层输入单元的 dropout 比率recurrent_dropout=0.2,#指定循环单元的 dropout 比率input_shape=(lookback//step,float_data.shape[-1])))
model.add(layers.Dense(1))model.compile(optimizer=RMSprop(),loss='mae')history = model.fit_generator(train_gen,steps_per_epoch=500,epochs=40,validation_data=val_gen,validation_steps=val_steps)model.save("GRU_With_Dropout.h5")


可以看到loss减小到了0.27,即2.4°C左右。
在真实预测时,2.4度的误差仍然很大,要提高精度,可以尝试循环层堆叠。在GRU层上再添加一层GRU循环层。注意,先循环的层需要设置return_sequences=True(之前讲过)。
这里代码运行相当耗时,故省略了,感兴趣的小伙伴一定要试一试。这里特别提醒,循环层堆叠会提前过拟合,适当提高Dropout值来抑制。

提高精度的方法还有一个,就是使用双向 RNN。这将在下一节讲到。

Python 深度学习--学习笔记(十五)相关推荐

  1. python复制指定字符串_python3.4学习笔记(十五) 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)...

    python3.4学习笔记(十五) 字符串操作(string替换.删除.截取.复制.连接.比较.查找.包含.大小写转换.分割等) python print 不换行(在后面加上,end=''),prin ...

  2. Polyworks脚本开发学习笔记(十五)-用Python连接Polyworks的COM组件

    Polyworks脚本开发学习笔记(十五)-用Python连接Polyworks的COM组件 用Polyworks脚本开发,没有高级语言的支持,功能难免单一,一些比较复杂的交互实现不了,界面和报告也很 ...

  3. 深度学习入门笔记(五):神经网络的编程基础

    欢迎关注WX公众号:[程序员管小亮] 专栏--深度学习入门笔记 声明 1)该文章整理自网上的大牛和机器学习专家无私奉献的资料,具体引用的资料请看参考文献. 2)本文仅供学术交流,非商用.所以每一部分具 ...

  4. 深度学习入门笔记(五):神经网络的学习

    专栏--深度学习入门笔记 推荐文章 深度学习入门笔记(一):机器学习基础 深度学习入门笔记(二):神经网络基础 深度学习入门笔记(三):感知机 深度学习入门笔记(四):神经网络 深度学习入门笔记(五) ...

  5. windows内核开发学习笔记十五:IRP结构

    windows内核开发学习笔记十五:IRP结构   IRP(I/O Request Package)在windows内核中,有一种系统组件--IRP,即输入输出请求包.当上层应用程序需要访问底层输入输 ...

  6. python学习的第二十五天:对PDF文件的读写操作

    文章目录 python学习的第二十五天:对PDF文件的读写操作 对Excel操作的补充 python的实用方法 获取指定文件下的所有内容 shutil模块(封装了高级的文件操作函数) PDF的相关操作 ...

  7. 在应用程序中使用虚拟内存——Windows核心编程学习手札之十五

    在应用程序中使用虚拟内存 --Windows核心编程学习手札之十五 Windows提供了3种进行内存管理的方法: 1)  虚拟内存,最适合用来管理大量对象或结构数组: 2)  内存映射文件,最适合用来 ...

  8. JavaScript学习(八十五)—数据类型的转换

    JavaScript学习(八十五)-数据类型的转换 一.什么是数据类型的转换? 简单来说,就是把一种数据类型的变量转化为另外一种数据类型 二.转化为字符串类型 //把数字转化为字符串 变量.toStr ...

  9. JavaScript学习(七十五)—图解浅拷贝和深拷贝

    JavaScript学习(七十五)-图解浅拷贝和深拷贝 浅拷贝 浅拷贝只是拷贝一层,更深层次对象级别的只拷贝引用 Object.assign(target, ...sources);ES6新增方法可以 ...

  10. JavaScript学习(六十五)—数组知识点总结

    JavaScript学习(六十五)-数组 学习内容 一.什么是数组 二.数组的分类 三.数组的创建方式 四.数组元素 五.数组的操作 六.数组元素遍历的四种方法 七.随机数为数组赋值 八.数组的比较 ...

最新文章

  1. 三星C8手机如何关闭语言自动报号,三星手机解锁
  2. go语言笔记——数组长度不可变,但是元素值是可变的!!!
  3. java安装 环境配置
  4. python 一行太长_10条很棒的Python一行代码
  5. OpenCV学习笔记三-Mat数据结构
  6. python性能分析工具_Python Profilers 分析器
  7. 优化委托的 DynamicInvoke
  8. zeppelin连接数据源_使用开放源代码合同(open-zeppelin)创建以太坊令牌
  9. oracle DataGuard停机和启动顺序
  10. 使用TASM时报错extra characters on line的解决办法
  11. 《大道至简》的幕后故事(2):“愚公移山记”人物篇
  12. linux卸载keystone服务,OpenStack —— 认证服务Keystone(二)
  13. decodeURI decodeURIComponent
  14. 认识接口(Interface)设计
  15. Python教学视频(九)math模块的使用
  16. 「面试必背」多线程面试题(快收藏)
  17. opnet之变量类型
  18. 天猫服饰新推“良品臻选”,请了一群挑剔的女人给服装“挑刺”
  19. MySQL - 大量 sending data 状态进程,让数据库性能急剧下降。
  20. 阿尔泰数据采集卡模拟量采集演示

热门文章

  1. Android MediaPlayer各种状态切换
  2. html绘制动态小人,使用canvas实现行走的小人动画
  3. Android WiFi 权限、广播、连接、踩坑相关记录
  4. 相似度计算——余弦相似度
  5. rman备份脚本 发送邮件通知
  6. Android 7.1.1 通话记录数据库详解
  7. Java阿里巴巴开发手册与JDK1.8API中文版下载
  8. 挑战GPT-3以色列推出参数多30亿、词条多5倍的新语言模型
  9. centos安装Trojan安全上网
  10. 设置MySQL为外部可连接