深度学习处理时间序列(3)

news2025/4/1 11:34:59

基于常识、不使用机器学习的基准

在开始使用像黑盒子一样的深度学习模型解决温度预测问题之前,我们先尝试一种基于常识的简单方法。它可以作为一种合理性检查,还可以建立一个基准,更高级的机器学习模型需要超越这个基准才能证明其有效性。对于一个尚没有已知解决方案的新问题,这种基于常识的基准很有用。一个经典的例子是不平衡分类任务,其中某些类别比其他类别更常见。如果数据集中包含90%的类别A样本和10%的类别B样本,那么对于分类任务,一种基于常识的方法就是对新样本始终预测类别A。这种分类器的总体精度为90%,因此任何基于机器学习的方法的精度都应该高于90%,才能证明其有效性。有时候,这样的简单基准可能很难超越。

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

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

评估循环如代码清单10-9所示。

代码清单10-9 计算基于常识的基准的MAE

def evaluate_naive_method(dataset):
    total_abs_err = 0.
    samples_seen = 0
    for samples, targets in dataset:
        preds = samples[:, -1, 1] * std[1] + mean[1]----温度特征在第1列,所以samples[:, -1, 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)之前,尝试简单且计算代价很小的机器学习模型(比如小型的密集连接网络)也是很有用的。这样做可以保证进一步增加问题复杂度是合理的,能够带来真正的好处。代码清单10-10给出了一个全连接模型:首先将数据展平,然后是两个Dense层。请注意,最后一个Dense层没有激活函数,这是回归问题的典型特征。我们使用均方误差(MSE)作为损失,而不是平均绝对误差(MAE)​,因为MSE在0附近是光滑的(而MAE不是)​,这对梯度下降来说是一个有用的属性。我们在compile()中监控MAE这项指标。

代码清单10-10 训练并评估一个密集连接模型

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)

model = keras.models.load_model("jena_dense.keras")---- (本行及以下1)重新加载最佳模型,并在测试数据上进行评估
print(f"Test MAE: {model.evaluate(test_dataset)[1]:.2f}")

我们来绘制训练和验证的损失曲线,如代码清单10-11和图10-3所示。

代码清单10-11 绘制结果

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

在这里插入图片描述

部分验证损失接近不使用机器学习的基准方法,但并不稳定。这也展示了首先建立基准的优点,事实证明,要超越这个基准并不容易。我们的常识中包含大量有价值的信息,而机器学习模型并不知道这些信息。你可能会问,如果从数据到目标之间存在一个简单且表现良好的模型(基于常识的基准)​,那么我们训练的模型为什么没有找到它并进一步改进呢?我们在模型空间(假设空间)中搜索解决方案,这个模型空间是具有我们所定义架构的所有双层网络组成的空间。基于常识的启发式方法只是这个空间所表示的数百万个模型中的一个。这就好比大海捞针。从技术上说,假设空间中存在一个好的解决方案,但这并不意味着你可以通过梯度下降找到它。总体来说,这是机器学习的一个重要限制:如果学习算法没有被硬编码为寻找某种特定类型的简单模型,那么有时候算法无法找到简单问题的简单解决方案。这就是好的特征工程和架构预设非常重要的原因:你需要准确告诉模型它要寻找什么

一维卷积模型

说到利用正确的架构预设,由于输入序列具有每日周期性的特征,或许卷积模型可能有效。时间卷积神经网络可以在不同日期重复使用相同的表示,就像空间卷积神经网络可以在图像的不同位置重复使用相同的表示。你已经学过Conv2D层和SeparableConv2D层,它们通过在二维网格上滑动的小窗口来查看输入。这些层也有一维甚至三维的版本:Conv1D层、SeparableConv1D层和Conv3D层2。Conv1D层是在输入序列上滑动一维窗口,Conv3D层则是在三维输入物体上滑动三维窗口。2请注意,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}")

得到的训练曲线和验证曲线如图10-4所示。

在这里插入图片描述

事实证明,这个模型的性能甚至比密集连接模型更差。它的验证MAE约为2.9摄氏度,比基于常识的基准差很多。出了什么问题?有以下两个原因。首先,天气数据并不完全遵循平移不变性假设。虽然数据具有每日周期性,但早晨的数据与傍晚或午夜的数据具有不同的属性。天气数据只在某个时间尺度上具有平移不变性。其次,数据的顺序很重要。要想预测第2天的温度,最新的数据比5天前的数据包含更多的信息。一维卷积神经网络无法利用这一点。特别是,最大汇聚层和全局平均汇聚层在很大程度上破坏了顺序信息。

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

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

相关文章

VectorBT:使用PyTorch+LSTM训练和回测股票模型 进阶二

VectorBT:使用PyTorchLSTM训练和回测股票模型 进阶二 本方案基于LSTM神经网络构建多时间尺度股票收益率预测模型,结合VectorBT进行策略回测。核心原理是通过不同时间窗口(5/10/20/30日)捕捉股价的短期、中期、长期模式&#xff0c…

蓝桥杯 第十二天 819 递增序列

注意注意&#xff1a;不考虑左上的情况&#xff0c;因为题目给的样例没有 public static int is1(char ch[][],int m,int n){int ans0;for (int i0;i<m;i){//起始点在哪for (int j0;j<n;j){int add1;while(jadd<n){if(ch[i][j]<ch[i][jadd]) ans; //横add;}add1…

【YOLOv11】目标检测任务-实操过程

目录 一、torch环境安装1.1 创建虚拟环境1.2 启动虚拟环境1.3 安装pytorch1.4 验证cuda是否可用 二、yolo模型推理2.1 下载yolo模型2.2 创建模型推理文件2.3 推理结果保存路径 三、labelimg数据标注3.1 安装labelimg3.2 解决浮点数报错3.3 labelimg UI界面介绍3.4 数据标注案例…

C++_STL之vector篇

一、vector的常见用法 注&#xff1a;C中若使用vector需包含头文件<vector>. 1.vector的构造函数 int n 10,ret1;vector<int> nums(n,ret); //n表示vector初始的容量 ret表示vector中初始化的值for (auto e : nums)cout << e << " "; 扩展…

sqli-labs靶场 less 9

文章目录 sqli-labs靶场less 9 时间盲注 sqli-labs靶场 每道题都从以下模板讲解&#xff0c;并且每个步骤都有图片&#xff0c;清晰明了&#xff0c;便于复盘。 sql注入的基本步骤 注入点注入类型 字符型&#xff1a;判断闭合方式 &#xff08;‘、"、’、“”&#xf…

【Golang】第八弹----面向对象编程

&#x1f525; 个人主页&#xff1a;星云爱编程 &#x1f525; 所属专栏&#xff1a;Golang &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 前言&#xff1a;Go语言面向对象编程说明 Golang也支持面向对…

java基础以及内存图

java基础 命名&#xff1a; 大驼峰&#xff1a;类名 小驼峰&#xff1a;变量名方法名等其他的 全部大写&#xff1a;常量名字.. // 单行注释 /**/ 多行注释 变量类型 变量名 一、基本类型&#xff08;8个&#xff09; 整数&#xff1a;byte-8bit short-16bit int 32-b…

【嵌入式学习3】TCP服务器客户端 - UDP发送端接收端

目录 1、TCP TCP特点 TCP三次握手&#xff08;建立TCP连接&#xff09;&#xff1a; TCP四次握手【TCP断开链接的时候需要经过4次确认】&#xff1a; TCP网络程序开发流程 客户端开发&#xff1a;用户设备上的程序 服务器开发&#xff1a;服务器设备上的程序 2、UDP 为…

Linux之基础知识

目录 一、环境准备 1.1、常规登录 1.2、免密登录 二、Linux基本指令 2.1、ls命令 2.2、pwd命令 2.3、cd命令 2.4、touch命令 2.5、mkdir命令 2.6、rmdir和rm命令 2.7man命令 2.8、cp命令 2.9、mv命令 2.10、cat命令 2.11、echo命令 2.11.1、Ctrl r 快捷键 2…

llamafactory微调效果与vllm部署效果不一致如何解决

在llamafactory框架训练好模型之后&#xff0c;自测chat时模型效果不错&#xff0c;但是部署到vllm模型上效果却很差 这实际上是因为llamafactory微调时与vllm部署时的对话模板不一致导致的。 对应的llamafactory的代码为 而vllm启动时会采用大模型自己本身设置的对话模板信息…

WebSocket通信的握手阶段

1. 客户端建立连接时&#xff0c;通过 http 发起请求报文&#xff0c;报文表示请求服务器端升级协议为 WebSocket&#xff0c;与普通的 http 请求协议略有区别的部分在于如下的这些协议头&#xff1a; 上述两个字段表示请求服务器端升级协议为 websocket 协议。 2. 服务器端响…

分布式ID服务实现全面解析

分布式ID生成器是分布式系统中的关键基础设施&#xff0c;用于在分布式环境下生成全局唯一的标识符。以下是各种实现方案的深度解析和最佳实践。 一、核心需求与设计考量 1. 核心需求矩阵 需求 重要性 实现难点 全局唯一 必须保证 时钟回拨/节点冲突 高性能 高并发场景…

dom0运行android_kernel: do_serror of panic----failed to stop secondary CPUs 0

问题描述&#xff1a; 从日志看出,dom0运行android_kernel&#xff0c;刚开始运行就会crash,引发panic 解决及其原因分析&#xff1a; 最终问题得到解决&#xff0c;发现是前期在调试汇编阶段代码时&#xff0c;增加了汇编打印的指令&#xff0c;注释掉这些指令,问题得到解决。…

HarmonyOS NEXT——【鸿蒙原生应用加载Web页面】

鸿蒙客户端加载Web页面&#xff1a; 在鸿蒙原生应用中&#xff0c;我们需要使用前端页面做混合开发&#xff0c;方法之一是使用Web组件直接加载前端页面&#xff0c;其中WebView提供了一系列相关的方法适配鸿蒙原生与web之间的使用。 效果 web页面展示&#xff1a; Column()…

优选算法的慧根之翼:位运算专题

专栏&#xff1a;算法的魔法世界 个人主页&#xff1a;手握风云 一、位运算 基础位运算 共包含6种&(按位与&#xff0c;有0就是0)、|(按位或有1就是1)、^(按位异或&#xff0c;相同为0&#xff0c;相异为1)、~(按位取反&#xff0c;0变成1&#xff0c;1变成0)、<<(左…

图论问题集合

图论问题集合 寻找特殊有向图&#xff08;一个节点最多有一个出边&#xff09;中最大环路问题特殊有向图解析算法解析步骤 1 &#xff1a;举例分析如何在一个连通块中找到环并使用时间戳计算大小步骤 2 &#xff1a;抽象成算法注意 实现 寻找特殊有向图&#xff08;一个节点最多…

【数据结构】栈 与【LeetCode】20.有效的括号详解

目录 一、栈1、栈的概念及结构2、栈的实现3、初始化栈和销毁栈4、打印栈的数据5、入栈操作---栈顶6、出栈---栈顶6.1栈是否为空6.2出栈---栈顶 7、取栈顶元素8、获取栈中有效的元素个数 二、栈的相关练习1、练习2、AC代码 个人主页&#xff0c;点这里~ 数据结构专栏&#xff0c…

Redis设计与实现-哨兵

哨兵模式 1、启动并初始化sentinel1.1 初始化服务器1.2 使用Sentinel代码1.3 初始化sentinel状态1.4 初始化sentinel状态的master属性1.5 创建连向主服务器的网络连接 2、获取主服务器信息3、获取从服务器的信息4、向主从服务器发送信息5、接受主从服务器的频道信息6、检测主观…

C++进阶——封装哈希表实现unordered_map/set

与红黑树封装map/set基本相似&#xff0c;只是unordered_map/set是单向迭代器&#xff0c;模板多传一个HashFunc。 目录 1、源码及框架分析 2、模拟实现unordered_map/set 2.1 复用的哈希表框架及Insert 2.2 iterator的实现 2.2.1 iteartor的核心源码 2.2.2 iterator的实…

【算法day25】 最长有效括号——给你一个只包含 ‘(‘ 和 ‘)‘ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。

32. 最长有效括号 给你一个只包含 ‘(’ 和 ‘)’ 的字符串&#xff0c;找出最长有效&#xff08;格式正确且连续&#xff09;括号子串的长度。 https://leetcode.cn/problems/longest-valid-parentheses/ 2.方法二&#xff1a;栈 class Solution { public:int longestValid…