政安晨:【深度学习处理实践】(四)—— 实施一个温度预测示例

news2025/2/27 4:50:18

在开始使用像黑盒子一样的深度学习模型解决温度预测问题之前,我们先尝试一种基于常识的简单方法。

它可以作为一种合理性检查,还可以建立一个基准,更高级的机器学习模型需要超越这个基准才能证明其有效性。对于一个尚没有已知解决方案的新问题,这种基于常识的基准很有用。

对于一个尚没有已知解决方案的新问题,这种基于常识的基准很有用。

一个经典的例子是不平衡分类任务,其中某些类别比其他类别更常见。如果数据集中包含90%的类别A样本和10%的类别B样本,那么对于分类任务,一种基于常识的方法就是对新样本始终预测类别A。这种分类器的总体精度为90%,因此任何基于机器学习的方法的精度都应该高于90%,才能证明其有效性。有时候,这样的简单基准可能很难超越。

在本例中,我们可以放心地假设温度时间序列是连续的(明天的温度很可能接近今天的温度),并且具有每天的周期性变化。因此,一种基于常识的方法是,始终预测24小时之后的温度等于现在的温度。我们用平均绝对误差(MAE)指标来评估这种方法,这一指标的定义如下:

np.mean(np.abs(preds - targets))

政安晨的个人主页政安晨

欢迎 👍点赞✍评论⭐收藏

收录专栏政安晨的机器学习笔记

希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正!


我们这篇文章是接着上一篇文章来进行演绎示例:

政安晨:【深度学习处理实践】(三)—— 处理时间序列的数据准备icon-default.png?t=N7T8https://blog.csdn.net/snowdenkeke/article/details/136570679评估循环如下代码所示:

计算基于常识的基准的MAE

def evaluate_naive_method(dataset):
    total_abs_err = 0.
    samples_seen = 0
    for samples, targets in dataset:
        # 温度特征在第1列,所以samples[:, -1, 1]是输入序列最后一个温度测量值。
        # 之前我们对特征做了规范化,所以要得到以摄氏度为单位的温度值,
        # 还需要乘以标准差并加上均值,以实现规范化的逆操作
        preds = samples[:, -1, 1] * std[1] + mean[1]
        total_abs_err += np.sum(np.abs(preds - targets))
        samples_seen += samples.shape[0]
    return total_abs_err / samples_seen

print(f"Validation MAE: {evaluate_naive_method(val_dataset):.2f}")
print(f"Test MAE: {evaluate_naive_method(test_dataset):.2f}")

大家可以尝试下,看看评估结果:

对于这个基于常识的基准,验证MAE为2.44摄氏度,测试MAE为2.62摄氏度。

因此,如果假设24小时之后的温度总是与现在相同,那么平均会偏差约2.5摄氏度。

这个结果不算太差,但你可能不会基于这种启发式方法来推出天气预报服务。

接下来,我们将利用深度学习知识来得到更好的结果。

基本的机器学习模型

在尝试机器学习方法之前,建立一个基于常识的基准是很有用的。

同样,在开始研究复杂且计算代价很大的模型(如RNN)之前,尝试简单且计算代价很小的机器学习模型(比如小型的密集连接网络)也是很有用的。

这样做可以保证进一步增加问题复杂度是合理的,能够带来真正的好处。

如下代码给出了一个全连接模型首先将数据展平,然后是两个Dense层。请注意,最后一个Dense层没有激活函数,这是回归问题的典型特征。我们使用均方误差(MSE)作为损失,而不是平均绝对误差(MAE),因为MSE在0附近是光滑的(而MAE不是),这对梯度下降来说是一个有用的属性。我们在compile()中监控MAE这项指标。

训练并评估一个密集连接模型

from tensorflow import keras
from tensorflow.keras import layers

inputs = keras.Input(shape=(sequence_length, raw_data.shape[-1]))
x = layers.Flatten()(inputs)
x = layers.Dense(16, activation="relu")(x)
outputs = layers.Dense(1)(x)
model = keras.Model(inputs, outputs)

callbacks = [
    # 这个回调函数用于保存具有最佳性能的模型
    keras.callbacks.ModelCheckpoint("jena_dense.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)

# (本行及以下1行)重新加载最佳模型,并在测试数据上进行评估
model = keras.models.load_model("jena_dense.keras")

print(f"Test MAE: {model.evaluate(test_dataset)[1]:.2f}")

演绎如下:

打印出来:

我们来绘制训练和验证的损失曲线,代码和画的图如下所示:

import matplotlib.pyplot as plt
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()

画图如下:

(上图为:一个简单的密集连接网络在耶拿温度预测任务上的训练MAE和验证MAE

部分验证损失接近不使用机器学习的基准方法,但并不稳定。这也展示了首先建立基准的优点,事实证明,要超越这个基准并不容易。我们的常识中包含大量有价值的信息,而机器学习模型并不知道这些信息。

你可能会问,如果从数据到目标之间存在一个简单且表现良好的模型(基于常识的基准),那么我们训练的模型为什么没有找到它并进一步改进呢?

我们在模型空间(假设空间)中搜索解决方案,这个模型空间是具有我们所定义架构的所有双层网络组成的空间。基于常识的启发式方法只是这个空间所表示的数百万个模型中的一个

这就好比大海捞针。从技术上说,假设空间中存在一个好的解决方案,但这并不意味着你可以通过梯度下降找到它。

总体来说,这是机器学习的一个重要限制如果学习算法没有被硬编码为寻找某种特定类型的简单模型,那么有时候算法无法找到简单问题的简单解决方案这就是好的特征工程和架构预设非常重要的原因:你需要准确告诉模型它要寻找什么。

一维卷积模型

说到利用正确的架构预设,由于输入序列具有每日周期性的特征,或许卷积模型可能有效。时间卷积神经网络可以在不同日期重复使用相同的表示,就像空间卷积神经网络可以在图像的不同位置重复使用相同的表示。

你已经学过Conv2D层和SeparableConv2D层,它们通过在二维网格上滑动的小窗口来查看输入。这些层也有一维甚至三维的版本:Conv1D层、SeparableConv1D层和Conv3D层。Conv1D层是在输入序列上滑动一维窗口,Conv3D层则是在三维输入物体上滑动三维窗口。

请注意,Keras中没有SeparableConv3D层

这并不是因为任何理论上的原因,只是因为我还没有实现它。

因此,你可以构建一维卷积神经网络,它非常类似于二维卷积神经网络。它适用于遵循平移不变性假设的序列数据。这个假设的含义是,如果沿着序列滑动一个窗口,那么窗口的内容应该遵循相同的属性,而与窗口位置无关。

我们在温度预测问题上试一下一维卷积神经网络。

我们选择初始窗口长度为24,这样就可以每次查看24小时的数据(一个周期)。我们对序列进行下采样时(通过MaxPooling1D层),也会相应地减小窗口尺寸。

inputs = keras.Input(shape=(sequence_length, raw_data.shape[-1]))

x = layers.Conv1D(8, 24, activation="relu")(inputs)
x = layers.MaxPooling1D(2)(x)
x = layers.Conv1D(8, 12, activation="relu")(x)
x = layers.MaxPooling1D(2)(x)
x = layers.Conv1D(8, 6, activation="relu")(x)
x = layers.GlobalAveragePooling1D()(x)

outputs = layers.Dense(1)(x)

model = keras.Model(inputs, outputs)

callbacks = [
    keras.callbacks.ModelCheckpoint("jena_conv.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)

model = keras.models.load_model("jena_conv.keras")

print(f"Test MAE: {model.evaluate(test_dataset)[1]:.2f}")

演绎执行如下:

打印评估如下:

得到的训练曲线和验证曲线如下所示

一维卷积神经网络在耶拿温度预测任务上的训练MAE和验证MAE

事实证明,这个模型的性能甚至比密集连接模型更差。它的验证MAE约为2.9摄氏度,比基于常识的基准差很多。出了什么问题?

有以下两个原因:

首先,天气数据并不完全遵循平移不变性假设。虽然数据具有每日周期性,但早晨的数据与傍晚或午夜的数据具有不同的属性。天气数据只在某个时间尺度上具有平移不变性。

其次,数据的顺序很重要。要想预测第2天的温度,最新的数据比5天前的数据包含更多的信息。一维卷积神经网络无法利用这一点。特别是,最大汇聚层和全局平均汇聚层在很大程度上破坏了顺序信息。

第一个RNN基准

全连接网络和卷积神经网络的效果都不是很好,但这并不意味着机器学习不适用于这个问题。密集连接网络首先将时间序列展平,这从输入数据中去除了时间的概念。

卷积神经网络对每段数据都用同样的方式处理,甚至还应用了汇聚运算,这会破坏顺序信息。

我们来看一下数据本来的样子它是一个序列,其中因果关系和顺序都很重要

有一类专门处理这种数据的神经网络架构,那就是RNN,其中,长短期记忆(Long Short Term Memory,LSTM)层长期以来一直很受欢迎。

我们稍后会介绍这种模型的工作原理,但我们先来试用一下LSTM层,代码如下所示:

基于LSTM的简单模型

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)

model = keras.models.load_model("jena_lstm.keras")

print(f"Test MAE: {model.evaluate(test_dataset)[1]:.2f}")

如下图所示,该模型的结果比之前的模型好多了!

验证MAE低至2.36摄氏度,测试MAE为2.55摄氏度。

基于LSTM的模型终于超越了基于常识的基准(尽管目前只超越了一点点),这证明了机器学习在这项任务上的价值。

基于LSTM的模型在耶拿温度预测任务上的训练MAE和验证MAE。

注意,图中没有显示第1轮,因为第1轮的训练MAE很大(7.75),会影响显示比例)

为什么LSTM模型的性能明显好于密集连接网络或卷积神经网络呢?我们又该如何进一步完善该模型呢?

以后的文章中,咱们会仔细看一下RNN


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1504701.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从零开始:神经网络(1)——神经元和梯度下降

声明:本文章是根据网上资料,加上自己整理和理解而成,仅为记录自己学习的点点滴滴。可能有错误,欢迎大家指正。 一. 神经网络 1. 神经网络的发展 先了解一下神经网络发展的历程。从单层神经网络(感知器)开…

【Java网络编程】TCP核心特性(下)

1. 拥塞控制 拥塞控制:是基于滑动窗口机制下的一大特性,与流量控制类似都是用来限制发送方的传送速率的 区别就在于:"流量控制"是从接收方的角度出发,根据接收方剩余接收缓冲区大小来动态调整发送窗口的;而…

【编译原理】1、python 实现一个 JSON parser:lex 词法分析、parser 句法分析

文章目录 一、实现 JSON lexer(词法解析器)二、lex 词法分析2.1 lex string 解析2.2 lex number 解析2.3 lex bool 和 null 解析 三、syntax parser 句法分析3.1 parse array 解析数组3.2 parse object 解析对象 四、封装接口 一、实现 JSON lexer&#…

论文阅读:Diffusion Model-Based Image Editing: A Survey

Diffusion Model-Based Image Editing: A Survey 论文链接 GitHub仓库 摘要 这篇文章是一篇基于扩散模型(Diffusion Model)的图片编辑(image editing)方法综述。作者从多个方面对当前的方法进行分类和分析,包括学习…

时间感知自适应RAG(TA-ARE)

原文地址:Time-Aware Adaptive RAG (TA-ARE) 2024 年 3 月 1 日 介绍 随着大型语言模型(LLM)的出现,出现了新兴能力的概念。前提或假设是LLMs具有隐藏的和未知的能力,等待被发现。企业家们渴望在LLMs中发现一些无人知晓…

LLM实施的五个阶段

原文地址:Five Stages Of LLM Implementation 大型语言模型显着提高了对话式人工智能系统的能力,实现了更自然和上下文感知的交互。这导致各个行业越来越多地采用人工智能驱动的聊天机器人和虚拟助手。 2024 年 2 月 20 日 介绍 从LLMs的市场采用情况可以…

Day26:安全开发-PHP应用模版引用Smarty渲染MVC模型数据联动RCE安全

目录 新闻列表 自写模版引用 Smarty模版引用 代码RCE安全测试 思维导图 PHP知识点: 功能:新闻列表,会员中心,资源下载,留言版,后台模块,模版引用,框架开发等 技术:输…

超分辨率(1)--基于GAN网络实现图像超分辨率重建

目录 一.项目介绍 二.项目流程详解 2.1.数据加载与配置 2.2.构建生成网络 2.3.构建判别网络 2.4.VGG特征提取网络 2.5.损失函数 三.完整代码 四.数据集 五.测试网络 一.项目介绍 超分辨率(Super-Resolution),简称超分&#xff08…

React组件(函数式组件,类式组件)

函数式组件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>React Demo</title> <!-- 引…

嵌入式Linux串口和 poll() 函数的使用

一、poll() 函数的介绍 poll() 函数用于监控多个文件描述符的变化的函数。它可以用来检查一个或多个文件描述符的状态是否改变&#xff0c;比如是否可读、可写或有错误发生。它常用于处理 I/O 多路复用&#xff0c;这在需要同时处理多个网络连接或文件操作时非常有用。 头文件…

ZJUBCA研报分享 | 《BTC/USDT周内效应研究》

ZJUBCA研报分享 引言 2023 年 11 月 — 2024 年初&#xff0c;浙大链协顺利举办为期 6 周的浙大链协加密创投训练营 &#xff08;ZJUBCA Community Crypto VC Course&#xff09;。在本次训练营中&#xff0c;我们组织了投研比赛&#xff0c;鼓励学员分析感兴趣的 Web3 前沿话题…

【杂记】IDEA和Eclipse如何查看GC日志

1.Eclipse查看GC日志 1.1 右击代码编辑区 -> Run As -> Run Configurations 1.2 点击Arguments栏 -> VM arguments:区域填写XX参数 -> Run 1.3 控制台输出GC详细日志 2.IDEA查看GC日志 2.1 鼠标右击代码编辑器空白区域&#xff0c;选择Edit 项目名.main()... 2.…

IPsec VPN之安全联盟

一、何为安全联盟 IPsec在两个端点建立安全通信&#xff0c;此时这两个端点被称为IPsec对等体。安全联盟&#xff0c;即SA&#xff0c;是指通信对等体之间对某些要素的约定&#xff0c;定义了两个对等体之间要用何种安全协议、IP报文的封装方式、加密和验证算法。SA是IPsec的基…

【JavaEE初阶 -- 多线程】

认识线程&#xff08;Thread&#xff09;Thread类及常见方法 1.认识线程&#xff08;Thread&#xff09;1.1 线程1.2 进程和线程的关系和区别1.3 Java的线程和操作系统线程的关系1.4 创建线程 2. Thread类及常用的方法2.1 Thread的常见构造方法2.2 Thread的几个常见属性2.3 启动…

在 Python 中 JSON 数据格式的使用

在 Python 中 JSON 数据格式的使用 JSON 简介 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式。它易于阅读和编写&#xff0c;并且与许多编程语言兼容。 Python 中的 JSON 模块 Python 标准库中包含一个 json 模块&#xff0c;用于处理…

docker-compose这下会用了吗?

概要 默认的模板文件是 docker-compose.yml&#xff0c;其中定义的每个服务可以通过 image 指令指定镜像或 build 指令&#xff08;需要 Dockerfile&#xff09;来自动构建。 注意如果使用 build 指令&#xff0c;在 Dockerfile 中设置的选项(例如&#xff1a;CMD, EXPOSE, V…

Normalizer(归一化)和MinMaxScaler(最小-最大标准化)的区别详解

1.Normalizer&#xff08;归一化&#xff09;&#xff08;更加推荐使用&#xff09; 优点&#xff1a;将每个样本向量的欧几里德长度缩放为1&#xff0c;适用于计算样本之间的相似性。 缺点&#xff1a;只对每个样本的特征进行缩放&#xff0c;不保留原始数据的分布形状。 公式…

IM6ULL学习总结(四-七-1)输入系统应用编程

第7章 输入系统应用编程 7.1 什么是输入系统 ⚫ 先来了解什么是输入设备&#xff1f; 常见的输入设备有键盘、鼠标、遥控杆、书写板、触摸屏等等,用户通过这些输入设备与 Linux 系统进行数据交换。 ⚫ 什么是输入系统&#xff1f; 输入设备种类繁多&#xff0c;能否统一它们的…

java 数据结构二叉树

目录 树 树的概念 树的表示形式 二叉树 两种特殊的二叉树 二叉树的性质 二叉树的存储 二叉树的基本操作 二叉树的遍历 二叉树的基本操作 二叉树oj题 树 树是一种 非线性 的数据结构&#xff0c;它是由 n &#xff08; n>0 &#xff09;个有限结点组成一个具有层次…

ROS——Ubuntu环境搭建

Ubuntu安装 首先下载 Ubuntu 的镜像文件&#xff0c;链接如下:ubuntu-releases-20.04安装包下载_开源镜像站-阿里云ubuntu-releases-20.04安装包是阿里云官方提供的开源镜像免费下载服务&#xff0c;每天下载量过亿&#xff0c;阿里巴巴开源镜像站为包含ubuntu-releases-20.04…