《python深度学习》读书笔记(8) - 深度学习处理时间序列

预测温度

bash 复制代码
wget https://s3.amazonaws.com/keras-datasets/jena_climate_2009_2016.csv.zip
unzip jena_climate_2009_2016.csv.zip

这份数据大概就这样:

准备数据

python 复制代码
import os

import matplotlib.pyplot as plt
import numpy as np

# 这份数据是 每10分钟记录一次 一共是14个物理量
fname = os.path.join("jena_climate_2009_2016.csv")

if __name__ == '__main__':
    with open(fname) as f:
        data = f.read()
    lines = data.split("\n")
    header = lines[0].split(",")
    lines = lines[1:]
    print(header)
    print(len(lines))

    # 舍弃了 date time 这一项
    temperature = np.zeros((len(lines),))
    raw_data = np.zeros((len(lines), len(header) - 1))
    for i, line in enumerate(lines):
        values = [float(x) for x in line.split(",")[1:]]
        temperature[i] = values[1]
        raw_data[i, :] = values[:]
    plt.plot(range(len(temperature)), temperature)
    # 时间跨度为8年的温度曲线变化
    plt.show()
    # 看下前10天的数据
    plt.plot(range(1440), temperature[:1440])
    plt.show()

可以看出来这8年的温度变化曲线是差不多的

再看下头几天的温度曲线

准备训练集

python 复制代码
# 创建3个数据集

# 每6个数据点保存一个,这个很好理解,因为数据是10分钟采集一次 2个10分钟之间 温度的变化其实很小 因此没必要保留这么多数据
sampling_rate = 6
# 给定过去5天的数据
sequence_length = 120
delay = sampling_rate * (sequence_length + 24 - 1)
batch_size = 256

train_dataset = keras.utils.timeseries_dataset_from_array(
    raw_data[:-delay],
    targets=temperature[delay:],
    sampling_rate=sampling_rate,
    sequence_length=sequence_length,
    shuffle=True,
    batch_size=batch_size,
    start_index=0,
    end_index=num_train_samples)

val_dataset = keras.utils.timeseries_dataset_from_array(
    raw_data[:-delay],
    targets=temperature[delay:],
    sampling_rate=sampling_rate,
    sequence_length=sequence_length,
    shuffle=True,
    batch_size=batch_size,
    start_index=num_train_samples,
    end_index=num_train_samples + num_val_samples)

test_dataset = keras.utils.timeseries_dataset_from_array(
    raw_data[:-delay],
    targets=temperature[delay:],
    sampling_rate=sampling_rate,
    sequence_length=sequence_length,
    shuffle=True,
    batch_size=batch_size,
    start_index=num_train_samples + num_val_samples)

可以看下这个输出

bash 复制代码
for samples, targets in train_dataset:
    print("samples shape:", samples.shape)
    print("targets shape:", targets.shape)
    break

sample就是包含256个样本的批量,每个样本是连续120小时的数据, targets 是对应的256个目标温度的数组

注意这里因为shuffle是true。所以sample[0] 和 sample[1] 不一定在时间上是连续接近的

基于LSTM的简单模型

有一种专门处理 因果关系和顺序关系都很重要的序列 的神经网络架构 RNN

其中LSTM 是应用范围最广的

这里用LSTM 来处理上述的任务

python 复制代码
inputs = keras.Input(shape=(sequence_length, raw_data.shape[-1]))
x = layers.LSTM(16)(inputs)
outputs = layers.Dense(1)(x)
model = keras.Model(inputs, outputs)
callbacks = [
    keras.callbacks.ModelCheckpoint("jena_lstm.keras", save_best_only=True)
]
model.compile(optimizer="rmsprop", loss="mse", metrics=["mae"])
history = model.fit(train_dataset, epochs=10, validation_data=val_dataset, callbacks=callbacks)

loss = history.history["mae"]
val_loss = history.history["val_mae"]
epochs = range(1, len(loss) + 1)
plt.figure()
plt.plot(epochs, loss, "bo", label="Training MAE")
plt.plot(epochs, val_loss, "b", label="Validation MAE")
plt.title("Training and validation MAE")
plt.legend()
plt.show()

model = keras.models.load_model("jena_lstm.keras")
print(f"Test MAE: {model.evaluate(test_dataset)[1]:.2f}")

测试的mae为

换一种写法

使用dropout正则化 总是需要更长时间才能完全收敛,所以这里 模型的训练书调整为原来的5倍

python 复制代码
inputs = keras.Input(shape=(sequence_length, raw_data.shape[-1]))
# 正则化
x = layers.LSTM(32, recurrent_dropout=0.25)(inputs)
x = layers.Dropout(0.5)(x)
outputs = layers.Dense(1)(x)
model = keras.Model(inputs, outputs)
callbacks = [
    keras.callbacks.ModelCheckpoint("jena_lstm_dropout.keras", save_best_only=True)
]
model.compile(optimizer="rmsprop", loss="mse", metrics=["mae"])
history = model.fit(train_dataset, epochs=50, validation_data=val_dataset, callbacks=callbacks)

总结

如果顺序对数据很重要,特别是对于时间序列数据,那么循环神经网络RNN是一种很适合的方法

相关推荐
东坡肘子10 小时前
从开放平台到受控生态:谷歌宣布 Android 开发者验证政策 | 肘子的 Swift 周报 #0101
android·swiftui·swift
脚踏实地,坚持不懈!11 小时前
ANDROID,Jetpack Compose, 贪吃蛇小游戏Demo
android
Just_Paranoid11 小时前
【JobScheduler】Android 后台任务调度的核心组件指南
android·alarmmanager·jobscheduler·workmanager
我命由我1234511 小时前
Android 开发 - 一些画板第三方库(DrawBoard、FingerPaintView、PaletteLib)
android·java·java-ee·android studio·安卓·android-studio·android runtime
程序员的世界你不懂11 小时前
【Flask】测试平台开发,工具模块开发 第二十二篇
android·python·flask
Digitally13 小时前
如何在安卓手机/平板上找到下载文件?
android·智能手机·电脑
硬件学长森哥16 小时前
Android影像基础--cameraAPI2核心流程
android·计算机视觉
前行的小黑炭21 小时前
Android 协程的使用:结合一个环境噪音检查功能的例子来玩玩
android·java·kotlin
阿华的代码王国21 小时前
【Android】内外部存储的读写
android·内外存储的读写
inmK11 天前
蓝奏云官方版不好用?蓝云最后一版实测:轻量化 + 不限速(避更新坑) 蓝云、蓝奏云第三方安卓版、蓝云最后一版、蓝奏云无广告管理工具、安卓网盘轻量化 APP
android·工具·网盘工具