【数据挖掘】使用 LSTM 进行时间和序列预测

这篇具有很好参考价值的文章主要介绍了【数据挖掘】使用 LSTM 进行时间和序列预测。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、说明

        每天,人类在执行诸如过马路之类的任务时都会做出被动预测,他们估计汽车的速度和与汽车的距离,或者通过猜测球的速度并相应地定位手来接球。这些技能是通过经验和实践获得的。然而,由于涉及众多变量,预测天气或经济等复杂现象可能很困难。在这种情况下使用时间和序列预测,依靠历史数据和数学模型对未来趋势和模式进行预测。在本文中,我们将看到使用航空公司数据集使用数学概念进行预测的示例。

 

二、第1部分:

2.1 数学概念

【数据挖掘】使用 LSTM 进行时间和序列预测,数据挖掘,lstm,人工智能

        在本文使用的时间序列预测算法的上下文中,该算法不是手动计算线的斜率和截距,而是使用具有 LSTM 层的神经网络来学习时间序列数据中的基础模式和关系。神经网络在一部分数据上进行训练,然后用于对剩余部分进行预测。在该算法中,下一个时间步长的预测基于前面n_inputs的时间步长,类似于线性回归示例中使用 y(t) 预测 y(T+1) 的概念。但是,该算法中的预测不是使用简单的线性方程,而是使用 LSTM 层的激活函数生成的。激活函数允许模型捕获数据中的非线性关系,使其更有效地捕获时间序列数据中的复杂模式。

2.2 激活功能

【数据挖掘】使用 LSTM 进行时间和序列预测,数据挖掘,lstm,人工智能

摄影:@learnwithutsav

        LSTM 模型中使用的激活函数是整流线性单元 (ReLU) 激活函数。这种激活函数通常用于深度学习模型,因为它在处理梯度消失问题方面简单有效。在 LSTM 模型中,ReLU 激活函数应用于每个 LSTM 单元的输出,以在模型中引入非线性,并允许它学习数据中的复杂模式。ReLU 函数具有简单的阈值行为,其中任何负输入都映射到零,任何正输入都保持不变地通过,从而使其计算效率高。

三、第 2 部分:

3.1 实施

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv('airline-passengers.csv', index_col='Month', parse_dates=True)
df.index.freq = 'MS'
df.shape
df.columns
plt.figure(figsize=(20, 4))
plt.plot(df.Passengers, linewidth=2)
plt.show()

        该代码导入了三个重要的库:numpy、pandas 和 matplotlib。熊猫库用于读取“航空公司乘客.csv”文件,并将“月”列设置为索引,从而允许随时间分析数据。然后,该代码使用 matplotlib 库创建一个线图,显示一段时间内的航空公司乘客数量。最后,使用“plt.show”功能显示绘图。此代码对于任何对分析时序数据感兴趣的人都很有用,它演示了如何使用 pandas 和 matplotlib 来可视化数据趋势。

【数据挖掘】使用 LSTM 进行时间和序列预测,数据挖掘,lstm,人工智能

nobs = 12
df_train = df.iloc[:-nobs]
df_test = df.iloc[-nobs:]
df_train.shape
df_test.shape

        此代码通过将现有时间序列数据帧“df”拆分为训练集和测试集来创建两个新的数据帧“df_train”和“df_test”。“nobs”变量设置为 12,这意味着“df”的最后 12 个观测值将用于测试,而其余数据将用于训练。训练集存储在“df_train”中,由“df”中除最后12行以外的所有行组成,而测试集存储在“df_test”中,仅由“df”的最后12行组成。然后使用“shape”属性打印每个数据框中的行数和列数,从而确认拆分正确完成。此代码通过将时序数据拆分为两组,可用于准备用于建模和测试目的的时序数据。

3.2 模型架构

【数据挖掘】使用 LSTM 进行时间和序列预测,数据挖掘,lstm,人工智能

图片来源:@learnwithutsav

from keras.preprocessing.sequence import TimeseriesGenerator
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
scaler.fit(df_train)
scaled_train = scaler.transform(df_train)
scaled_test = scaler.transform(df_test)
n_inputs = 12
n_features = 1
generator = TimeseriesGenerator(scaled_train, scaled_train, length = n_inputs, batch_size =1)

for i in range(len(generator)):
    X, y = generator[i]
    print(f' \n {X.flatten()} and {y}')

        此代码片段演示了如何使用 Keras 的“TimeseriesGenerator”类和 scikit-learn 的“MinMaxScaler”类为时间序列预测模型生成输入和输出数组。代码首先创建“MinMaxScaler”类的实例,并将其拟合到训练数据集(“df_train”),以便缩放数据。然后将缩放后的数据存储在“scaled_train”和“scaled_test”数据框中。时间步长数 ('n_inputs“) 设置为 12,要素数 ('n_features') 设置为 1。使用“scaled_train”数据创建“TimeseriesGenerator”对象,窗口长度为“n_inputs”,批大小为 1。最后,循环用于迭代“生成器”对象并打印出每个时间步的输入和输出数组。“X”和“y”变量分别表示每个时间步长的输入和输出数组。“flatten()”方法用于将输入数组转换为一维数组,以便于打印。总体而言,此代码对于准备使用滑动窗口方法预测模型的时间序列数据非常有用。

【数据挖掘】使用 LSTM 进行时间和序列预测,数据挖掘,lstm,人工智能

X.shape

此代码返回数组或矩阵“X”的形状。“shape”属性是 NumPy 数组的一个属性,并返回一个表示数组维度的元组。该代码没有提供任何其他上下文,因此不清楚“X”的形状是什么。输出将采用以下格式(行、列)。

【数据挖掘】使用 LSTM 进行时间和序列预测,数据挖掘,lstm,人工智能

from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM

model = Sequential()
model.add(LSTM(200, activation='relu', input_shape = (n_inputs, n_features)))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mse')

model.summary()

        此代码演示如何使用 Keras 创建用于时间序列预测的 LSTM 神经网络模型。首先,导入必要的 Keras 类,包括“顺序”、“密集”和“LSTM”。该模型被创建为“顺序”对象,并添加了一个包含 200 个神经元、“relu”激活函数以及由“n_inputs”和“n_features”定义的输入形状的 LSTM 层。然后将 LSTM 层输出传递到具有单个输出神经元的“密集”层。该模型使用“adam”优化器和均方误差(“mse”)损失函数进行编译。'summary()' 方法用于显示架构的摘要,包括参数的数量以及每层输入和输出张量的形状。此代码可用于创建用于时间序列预测的 LSTM 模型,因为它提供了一个易于遵循的示例,可以适应不同的数据集和预测问题。

【数据挖掘】使用 LSTM 进行时间和序列预测,数据挖掘,lstm,人工智能

3.3 训练阶段

【数据挖掘】使用 LSTM 进行时间和序列预测,数据挖掘,lstm,人工智能

model.fit(generator, epochs = 50)

        此代码使用 Keras 中的“fit()”方法训练 LSTM 神经网络模型 50 个 epoch。“TimeseriesGenerator”对象生成成批的输入/输出对,供模型学习。'fit()' 方法使用基于模型编译期间定义的损失函数和优化器的反向传播来更新模型参数。通过训练模型,它学习根据训练数据中学习的模式对新的、看不见的数据进行预测。

【数据挖掘】使用 LSTM 进行时间和序列预测,数据挖掘,lstm,人工智能

plt.plot(model.history.history['loss'])

【数据挖掘】使用 LSTM 进行时间和序列预测,数据挖掘,lstm,人工智能

last_train_batch = scaled_train[-12:]

last_train_batch = last_train_batch.reshape(1, 12, 1)

last_train_batch

model.predict(last_train_batch)

此代码使用经过训练的 LSTM 神经网络模型对新数据点进行预测。从训练数据中选择、缩放并调整为模型的适当格式。在模型上调用“predict()”方法,将重塑的数据作为输入,输出是时间序列中下一个时间步长的预测值。这是使用 LSTM 模型进行时间序列预测的重要步骤。

【数据挖掘】使用 LSTM 进行时间和序列预测,数据挖掘,lstm,人工智能
<span style="background-color:#f9f9f9"><span style="color:#242424">scaled_test[0]</span></span>

此代码打印缩放测试数据数组的第一个元素。“scaled_test”变量是使用“MinMaxScaler”对象转换的测试数据的 NumPy 数组。打印此数组的第一个元素将显示测试数据中第一个时间步长的缩放值。

【数据挖掘】使用 LSTM 进行时间和序列预测,数据挖掘,lstm,人工智能

3.4 预测

y_pred = []

first_batch = scaled_train[-n_inputs:]
current_batch = first_batch.reshape(1, n_inputs, n_features)

for i in range(len(scaled_test)):
    batch = current_batch
    pred = model.predict(batch)[0]
    y_pred.append(pred)
    current_batch = np.append(current_batch[:,1:, :], [[pred]], axis = 1)


y_pred


scaled_test

此代码使用经过训练的 LSTM 模型生成测试数据的预测。它使用 for 循环循环遍历缩放测试数据中的每个元素。在每次迭代中,当前批处理用于使用模型的“predict()”方法进行预测。然后将预测值添加到“y_pred”列表中,并更新当前批次。最后,将“y_pred”列表与“scaled_test”数据一起打印,以将预测值与实际值进行比较。此步骤对于评估 LSTM 模型在测试数据上的性能至关重要。

【数据挖掘】使用 LSTM 进行时间和序列预测,数据挖掘,lstm,人工智能

df_test

y_pred_transformed = scaler.inverse_transform(y_pred)

y_pred_transformed = np.round(y_pred_transformed,0)

y_pred_final = y_pred_transformed.astype(int)

y_pred_final

此代码使用 scaler 对象的“inverse_transform()”方法将上一步中生成的预测值转换回原始比例。转换后的值使用 'round()' 函数舍入到最接近的整数,并使用 'astype()' 方法转换为整数。打印生成的预测值数组“y_pred_final”,以显示测试数据的最终预测值。此步骤对于评估 LSTM 模型在数据原始尺度上的预测的准确性非常重要。

【数据挖掘】使用 LSTM 进行时间和序列预测,数据挖掘,lstm,人工智能

df_test.values, y_pred_final

df_test['Predictions'] = y_pred_final

df_test

        上面的代码显示了添加到原始测试数据集的 LSTM 模型生成的预测值。首先,“values”属性用于提取“df_test”数据帧的值,然后将其与预测值“y_pred_final”配对。然后,将一个名为“预测”的新列添加到“df_test”数据帧以存储预测值。最后,使用新添加的“预测”列打印“df_test”数据帧。此步骤对于直观地将测试数据集的实际值与预测值进行比较并评估模型的准确性非常重要。

【数据挖掘】使用 LSTM 进行时间和序列预测,数据挖掘,lstm,人工智能

plt.figure(figsize=(15, 6))
plt.plot(df_train.index, df_train.Passengers, linewidth=2, color='black', label='Train Values')
plt.plot(df_test.index, df_test.Passengers, linewidth=2, color='green', label='True Values')
plt.plot(df_test.index, df_test.Predictions, linewidth=2, color='red', label='Predicted Values')
plt.legend()
plt.show()

此代码块正在使用库生成绘图。它首先设置图形大小,然后将训练数据绘制为黑线,将真实测试值绘制为绿线,将预测的测试值绘制为红线。它还向绘图添加图例,并使用该方法显示图例。matplotlibshow()

【数据挖掘】使用 LSTM 进行时间和序列预测,数据挖掘,lstm,人工智能

3.5均方误差

【数据挖掘】使用 LSTM 进行时间和序列预测,数据挖掘,lstm,人工智能

        均方误差 (MSE) 是回归线与一组点的接近程度的度量。它是通过取预测值和实际值之间的平方差的平均值来计算的。MSE 的平方根称为均方根误差 (RMSE),这是预测准确性的常用度量。在此代码块中,RMSE 是使用模块中的函数和模块 中的函数计算的 。RMSE 用于评估 LSTM 模型预测的准确性与测试集中的真实值相比。mean_squared_errorsklearn.metricssqrtmath

from sklearn.metrics import mean_squared_error
from math import sqrt

sqrt(mean_squared_error(df_test.Passengers, df_test.Predictions))

        此代码计算测试集中的实际乘客值 () 与预测乘客值 () 之间的均方根误差 (RMSE)。RMSE 是评估回归模型性能的常用指标。它测量预测值和实际值之间的平均距离,同时考虑它们之间差值的平方。RMSE 是一个有用的指标,因为它对大误差的惩罚比小误差更严重,使其成为模型预测整体准确性的良好指标。df_test.Passengersdf_test.Predictions

【数据挖掘】使用 LSTM 进行时间和序列预测,数据挖掘,lstm,人工智能

        总之,我们在 Keras 中使用 LSTM 算法实现了时间序列预测模型。我们在每月航空公司乘客数据集上训练了模型,并使用它来预测未来 12 个月。该模型表现良好,均方根误差为 30.5。真实值、预测值和训练值的可视化表明,该模型能够捕获数据中的总体趋势和季节性。这证明了 LSTM 在捕获时间序列数据中复杂时间关系方面的强大功能及其进行准确预测的潜力。

四、结论

        本文示例是一个典型的时间序列处理办法,可以当作经典来用。读者可以多花一些时间消化该案例;事实表明,用LSTM这种工具不仅可以处理NLP,而且可以针对任何的时间序列,比如股票预测。文章来源地址https://www.toymoban.com/news/detail-605383.html

到了这里,关于【数据挖掘】使用 LSTM 进行时间和序列预测的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Linux进行时】进程控制

    1.1fork函数 在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。 进程调用fork,当控制转移到内核中的fork代码后,内核做: 分配新的内存块和内核数据结构给子进程 将父进程部分数据结构内容拷贝至子进程 添加子进

    2024年02月08日
    浏览(38)
  • 【Linux进行时】进程状态

    ❓假设我们在上课,在B站上上课,请问我们的B站是不是一直运行呢?💡不是的! ❓假设我们同时打开了B站和PDF阅读器时,是怎么运行的呢? 💡每一个进程在CPU跑一会,再从CPU拿下来放上另外一个上去,周而复始,这种叫做 分时操作系统 ❓那就有一个问题,假设先用B站,

    2024年02月08日
    浏览(36)
  • 【Linux进行时】磁盘文件结构

    上篇文章,我们提及文件是存放在磁盘当中,本篇文件我们来了解一下磁盘的结构!!! ❓什么是磁盘? 💡磁盘(disk)是指利用磁记录技术存储数据的存储器。 磁盘是计算机主要的存储介质,可以存储大量的二进制数据,并且断电后也能保持数据不丢失。早期计算机使用

    2024年02月05日
    浏览(46)
  • 【Linux进行时】进程地址空间

    我们在讲C语言的时候,老师给大家画过这样的空间布局图,但是我们对它不了解 我们写一个代码来验证Linux进程地址空间 这里没什么问题,就是他们的g_valule 和其地址都是一样的, 我们将代码调整一下,让子进程的g_value++ 我们可以发现子进程的g_value变了,但是父进程没有

    2024年02月08日
    浏览(41)
  • MySQL:查询时进行时间比较

    在 MySQL 中查数据的时候,往往需要对记录的创建时间进行筛选,比如只需要查询今年1-5月份的,或者查询距离当前时间多久以前的。 本文介绍了在 MySQL 中查询记录时如何进行时间比较 解决办法:使用 TIMESTAMPDIFF 函数 查询特定时间范围的记录有多种方法,这里介绍几种 查询

    2024年02月16日
    浏览(44)
  • 如何使用Python进行数据挖掘?

    使用Python进行数据挖掘需要掌握以下几个关键步骤: 数据收集:首先,你需要获取你要进行数据挖掘的数据。可以从公共数据集、API、数据库等各种来源收集数据。 数据清洗:清洗数据是一个重要的步骤,它包括去除重复数据、处理缺失值、处理异常值、标准化数据等操作

    2024年02月16日
    浏览(58)
  • 【Linux进行时】环境变量and进程优先级

    ❓首先一个问题:我写的代码(这个代码很简单,不用管)编译之后运行的时候为什么要带./ ? 或者说我怎么才可以让我不用带./ ? 💡.代表当前文件下,/是文件分隔符,这是用相对路径的方式来访问,所以我们也可以用绝对路径 myproc和ls都是指令,ls可以直接输入,但是我

    2024年02月08日
    浏览(46)
  • Arrow:在项目中进行时间处理的强大工具

    目录 一、Arrow简介 二、安装与配置 三、基础功能与使用 1. 日期和时间格式转换 2. 时区处理 3. 时间序列分析 四、进阶应用与案例分析 五、性能与优化 六、最佳实践与经验分享 七、总结与展望 在处理日期和时间时,我们经常需要一个精确、可靠的库来帮助我们。Python的Ar

    2024年02月02日
    浏览(55)
  • ESP8266调用NTP服务器进行时间校准

    NTP是网络时间协议(Network Time Protocol,简称NTP),是一种用于同步计算机时间的协议。NTP服务器指的是提供NTP服务的计算机或设备。NTP服务器的主要功能是保证网络上的所有设备的时间同步,以确保各个设备相互之间的时间协调一致。NTP服务器通常连接到具有高度精确时间源

    2024年02月08日
    浏览(43)
  • Mybatis-Plus如何进行时间日期的比较

    获取数据库中跟当前日期相等的记录时,还是调用eq方法,所以实体类包括数据库中的类型是Date,而不是DateTime,否则只能获取相同时刻的数据。 Mybatis-Plus的时间比较是基于数据库的函数进行的,而不是字符串的比较。在Mybatis-Plus中,可以使用Wrapper对象的 ge、gt、le、lt 方法

    2024年02月11日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包