使用Keras中的LSTM完成温度预测问题,并对模型提出不同的改进方法,如:逆向、双向、丢包等

2023-10-26

前言:本例使用的是一个天气时间序列数据集,由德国耶拿的马克思普朗克生物地球化学研究所的气象站记录,这个例子作为初学者必看的例子之一,在这个数据集中,每十分钟记录14个不同的量(比如风向、湿度等),其中包含多年的记录。最原始的数据可以追溯到2003年,我们利用此数据构建模型,输入最近的一些数据,比如几天的,可以预测出24h之后的气温。

数据集的样子如下:

话不多说,直接上代码

 一、代码

import os
data_dir='jena_climate_2009_2016'
fname=os.path.join('jena_climate_2009_2016.csv')
f=open(fname)
data=f.read()
f.close()

lines=data.split('\n')#按照指定的分割符进行分割

header=lines[0].split(',')

lines=lines[1:]
print(len(header)) #15
print(len(lines))  #420451

可以先进行一个简单的解析过程:

import numpy as np
float_data=np.zeros((len(lines),len(header)-1))
#print(float_data.shape) #(420451,14)

for i ,line in enumerate(lines):
    values=[float(x) for x in line.split(',')[1:]]
    float_data[i,:]=values
#print(float_data.shape) #(420451,14)

from matplotlib import pyplot as plt
temp=float_data[:,1]#温度,单位摄氏度
plt.plot(range(1440),temp[:1440])
plt.show()

可以得到前十天温度的数据图像,因为每十分钟记录一个数据,所以每天都有144个数据点。接着可以绘制前十天的温度时间序列:

plt.plot(range(1440),temp[:1440])
plt.show

 这张图可以告诉我们一个信息,就是每天的周期性变化,尤其是最后四天特别明显,另外这十天一定是来自冬季。

接下来准备数据,一个时间步是十分钟,每steps个时间步采样一次数据,给定过去lookback个时间步之内的数据,能否预测delay个时间步之后的温度?将数据预处理为可以处理的格式,对每个时间序列分别做标准化。之后编写一个Python生成器,以当前的浮点数数组作为输入,并从最近的数据中生成数据批量,同时生成未来的目标温度。

lookback=720#输入数据应该包括过去多少个时间步
steps=6#数据采样的周期
dealy=144#目标应该在未来多少个时间步之后

#数据标准化
mean=float_data[:200000].mean(axis=0)
float_data-=mean
std=float_data[:200000].std(axis=0)
float_data/=std

#生成时间序列样本及其目标的生成器
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#如果没有指定最大索引,则将其设置为数据长度减去延迟1天
    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),))
        for j,row in enumerate(rows):
            indices=range(row[j]-lookback,rows[j],step)
            samples[j]=data[indices]
            targets[j]=data[row[j]+delay][1]
        yield samples,targets #无限生成样本和目标数据

准备训练生成器、验证生成器和测试生成器:

#准备训练生成器、验证生成器、测试生成器
lookback=1440#输入数据应该包括过去多少个时间步
step=6#数据采样的周期
delay=144#目标应该在未来多少个时间步之后
batch_size=128

train_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,shuffle=True,step=step,batch_size=batch_size)
test_gen=generator(float_data,lookback=lookback,delay=delay,min_index=300001,max_index=None,shuffle=True,step=step,batch_size=batch_size)
val_steps=(300000-200001-lookback)//batch_size #为了查看整个验证集,需要从val_gen中抽取多少次
test_steps=(len(float_data)-300001-lookback)//batch_size#为了查看整个测试集,需要从test_gen中抽取多少次

训练并评估一个基于GRU的模型(GRU全称gated recurrent unit,工作原理与LSTM相同,但做了一些简化,计算代价更低):

#训练并评估一个基于GRU的模型
# from keras.models import Sequential
# from keras import layers
# from keras.optimizers import RMSprop
#
# model=Sequential()
# model.add(layers.GRU(32,input_shape=(None,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=20,validation_data=val_gen,validation_steps=val_steps)

可以查看模型的结果,效果还是不错的,接下来训练并评估一个使用dropout正则化的基于GRU的模型:

#训练并评估一个使用dropout正则化的基于GRU的模型
from keras.models import Sequential
from keras import layers
from keras.optimizers import RMSprop

model=Sequential()
model.add(layers.GRU(32, dropout=0.2,recurrent_dropout=0.2,input_shape=(None, 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=Sequential()
model.add(layers.GRU(32, dropout=0.1,recurrent_dropout=0.5,return_sequences=True,input_shape=(None, float_data.shape[-1])))
model.add(layers.GRU(64,activation='relu', dropout=0.1,recurrent_dropout=0.5))
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)

在Keras中将一个双向RNN实例化,需要使用Bidirectional()层:

model=Sequential()
model.add(layers.Bidirectional(layers.GRU(32),input_shape=(None,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)

当然,以上并没有介绍过多的原理,如果读者感兴趣可以自己搜索一下原理,本案例只介绍项目对应的代码部分。

为了提高性能,还可以在堆叠循环层中调节每层的单元个数,调节RMSprop的学习率,使用LSTM代替GRU等等

有任何问题欢迎留言,感谢大家,恳求点赞哦!!!!如果需要数据或者其他,可以私信评论!!

以下是我的github主页,欢迎光临!

StatisticAdam (github.com)

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

使用Keras中的LSTM完成温度预测问题,并对模型提出不同的改进方法,如:逆向、双向、丢包等 的相关文章

随机推荐

  • 声笔码6.00版使用指南

    声笔码6 00版使用指南 声笔码发明人兼设计人 戴石麟 电邮 sbxlm 126 com 一 声笔码简介 1 声笔码6 00版的新特性 与声笔码5 00版相比 声笔码6 00版具有下面一些新的特性 1 对笔画的表示方式进行了调整 原来是用字
  • 解构赋值

    解构赋值是一种表达式 允许您使用数组或对象 将可迭代对象的值或属性分配给变量 解构赋值能让我们用更简短的语法进行多个变量的赋值 大大的减少了代码量 解构表达式有两种 array和object 1 数组 E6之前 我们可以这种形式将数组的内容
  • python点云处理算法汇总(长期更新版)

    目录 测试数据 百度网盘 一 读写显示 二 KD树与八叉树 三 点云特征 四 点云滤波 五 点云配准 六 点云分割拟合 七 mesh操作 八 三维重建 九 可视化 十 RGBD 十一 python 十二 基础操作 测试数据 Open3D算法
  • 【C】cannot convert ‘<brace-enclosed initializer list>‘ to ‘int‘ in assignment

    转载 https blog csdn net modi000 article details 108180978 原因 数组定义与初始化分开时 只能进行单个元素的赋值 而不能进行统一赋值
  • 深度确定性策略梯度(DDPG)

    1 从随机策略到确定性策略 从DDPG这个名字看 它是由D Deep D Deterministic PG Policy Gradient 组成 PG Policy Gradient 我们在强化学习 十三 策略梯度 Policy Gradi
  • Pytorch学习率调整策略

    PyTorch学习率调整策略 学习率可以直接控制模型参数更新的步伐 在整个模型训练过程中学习率并不是一成不变的 而是可以调整变化的 如果想要模型训练到理想的效果 必须在训练后期调整学习率 防止模型训练遇到局部最优就停下来了 PyTorch学
  • 决策树分类和预测算法的原理及实现

    作者 蓝鲸 算法决策树是一种通过对历史数据进行测算实现对新数据进行分类和预测的算法 简单来说决策树算法就是通过对已有明确结果的历史数据进行分析 寻找数据中的特征 并以此为依据对新产生的数据结果进行预测 决策树由3个主要部分组成 分别为决策节
  • Android相对布局(RelativeLayout)常用属性、练习使用按键、文本框等控件、线性布局(LinearLayout)属性

    RelativeLayout中子控件常用属性 子控件默认是从父控件的左上角开始排列的 相对于父控件 android layout alignParentTop true 和父控件的顶部对齐 android layout alignParen
  • 编译原理实验一 词法分析

    编译原理实验一 词法分析 实验目的 1 根据 PL 0 语言的文法规范 编写PL 0语言的词法分析程序 或者调研词法分析程序的自动生成工具LEX或FLEX 设计并实现一个能够输出单词序列的词法分析器 2 通过设计调试词法分析程序 实现从源程
  • 微信小程序头部导航栏返回键,返回到指定页面

    onUnload function wx reLaunch url my my onUnload 参考微信小程序页面路由
  • VTK教程(1):VTK基础知识

    VTK教程 1 VTK基础知识 VTK Visualization Toolkit 是一个功能强大的开源图形和可视化库 用于处理和可视化各种类型的数据 包括几何数据 图像 体数据 矢量场等 以下是VTK的基础知识 数据类型和数据集 VTK支
  • 数据库之MySQL基本操作

    数据库之MySQL 可以把MySQL看成一款支持远程操作文件的软件 库 gt gt gt 文件夹 表 gt gt gt 文件 记录 gt gt gt 文件内一行行的数据叫做一条条的记录 表头 就是表格的第一行数据 字段 字段名 字段类型 本
  • 【VUE3+AntV-G2】数据可视化 封装antv G2 气泡图组件

    一些废话 默默做前端 分享一些自己在项目需求实现中遇到的奇妙问题 主要是网上搜索不到解决办法自己解决后的总结方法和解决办法但不全面 自己整理总结的存档 事发背景 原型绘制了需要同时展示多个指标的数据气泡图 想到可以使用antv的气泡图 刚好
  • 顺序表和单链表基本操作的实现

    1 顺序表的建立 取指定元素 返回指定元素位置 2 顺序表中插入新元素 删除指定元素操作的实现 3 单链表的建立 取指定元素 返回指定元素位置 4 单链表中插入新元素 删除指定元素操作的实现 该主要完成单链表中基本操作的实现 单链表中的元素
  • 【C语言】简易计算器的模拟实现

    前言 最近在复习指针和数组 发现之前没写过利用函数指针数组来实现计算器的博客 所以今天就来写一下 引入 先来复习一下函数指针和函数指针数组的知识 函数指针 语法格式 函数返回类型 pf 函数各个参数的类型 函数名 例子 include
  • 2020-09-20

    一 Bootstrap Jumbotron 超大屏幕 1 1 基本的超大屏幕可以通过在 元素 中添加 jumbotron 类来创建 jumbotron
  • adf盖怎么打开_打印机墨盒怎么更换,看我这篇文章就够了

    有的小伙伴后台私信小编 说想更换打印机墨盒却不知道怎么下手 今天小编就给大家说说 教科书 般的墨盒更换方法 今天以HP deskjet 4729 为例来讲解 步骤一 取出需要更换的墨盒 1 将打印机接通电源并开机 请确保打印机处于正常待机状
  • Repeater没有数据时显示空行

    网上看了很多一般都是重写repeater控件 不过发现一个超简单的方法 直接利用FooterTemplate 在里面加上
  • 大佬给鸿星尔克写了一个 720° 看鞋展厅

    前段时间 在各大互联网平台 鸿星尔克成为了顶流般的存在 鸿星尔克官方账号更是一夜暴涨百万粉丝 直播间产品也被卖到下架 在鸿星尔克捐款的消息出现之后 在短短的几天里 鸿星尔克的销售额就超过了上半年的总销售额 一周前 有一个程序员 蓝色的秋风在
  • 使用Keras中的LSTM完成温度预测问题,并对模型提出不同的改进方法,如:逆向、双向、丢包等

    前言 本例使用的是一个天气时间序列数据集 由德国耶拿的马克思普朗克生物地球化学研究所的气象站记录 这个例子作为初学者必看的例子之一 在这个数据集中 每十分钟记录14个不同的量 比如风向 湿度等 其中包含多年的记录 最原始的数据可以追溯到20