当前位置: 首页 > 知识库问答 >
问题:

使用Keras理解多元时间序列分类

禹正阳
2023-03-14

我试图理解如何正确地将数据输入到我的keras模型中,以便使用LSTM神经网络将多变量时间序列数据分为三类。

我已经看了不同的资源——主要是杰森·布朗利的这三篇优秀的博客文章,其他的SO问题和不同的论文,但是没有一个信息完全符合我的问题案例,我也不知道我的问题是否数据预处理/将其输入模型是正确的,所以我想如果我在这里指定我的确切条件,我可能会得到一些帮助。

我试图对多元时间序列数据进行分类,其原始形式的结构如下:

>

  • 我有200个样品

    一个示例是一个csv文件。

    一个示例可以有1到50个功能(即csv文件有1到50列)。

    每个功能都在固定的时间步长内“跟踪”其值,比如说100(即每个csv文件正好有100行)。

    每个csv文件有三个类(“好”、“太小”、“太大”)中的一个

    因此,我目前的状态如下所示:

    我有一个numpy数组“samples”,其结构如下:

    # array holding all samples
    [
        # sample 1        
        [
            # feature 1 of sample 1 
            [ 0.1, 0.2, 0.3, 0.2, 0.3, 0.1, 0.2, 0.4, 0.5, 0.1, ... ], # "time series" of feature 1
            # feature 2 of sample 1 
            [ 0.5, 0.6, 0.7, 0.6, 0.4, 0.3, 0.2, 0.1, -0.1, -0.2, ... ], # "time series" of feature 2
            ... # up to 50 features
        ],
        # sample 2        
        [
            # feature 1 of sample 2 
            [ 0.1, 0.2, 0.3, 0.2, 0.3, 0.1, 0.2, 0.4, 0.5, 0.1, ... ], # "time series" of feature 1
            # feature 2 of sample 2 
            [ 0.5, 0.6, 0.7, 0.6, 0.4, 0.3, 0.2, 0.1, -0.1, -0.2, ... ], # "time series" of feature 2
            ...  # up to 50 features
        ],
        ... # up to sample no. 200
    ]
    

    我也有一个Numpy数组标签与相同长度的样本数组(即。200)。标签的编码方式如下:

    • “好”=0
    • “太小”=1
    • “太大”=2
    [0, 2, 2, 1, 0, 1, 2, 0, 0, 0, 1, 2, ... ] # up to label no. 200
    

    然后使用keras'to_category函数对该“标签”数组进行编码

    to_categorical(labels, len(np.unique(labels)))
    

    我的模型定义目前看起来是这样的:

    max_nb_features = 50
    nb_time_steps = 100
    
    model = Sequential()
    model.add(LSTM(5, input_shape=(max_nb_features, nb_time_steps)))
    model.add(Dense(3, activation='softmax'))
    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
    
    • LSTM层中的5个单元目前只是随机选取的
    • 我的三节课在致密层有3个输出神经元

    然后,我将数据拆分为培训/测试数据:

    samples_train, samples_test, labels_train, labels_test = train_test_split(samples, labels, test_size=0.33)
    

    这样我们就有134个样本用于培训,66个样本用于测试。

    我目前遇到的问题是,以下代码不起作用:

    model.fit(samples_train, labels_train, epochs=1, batch_size=1)
    

    错误如下:

    Traceback (most recent call last):
      File "lstm_test.py", line 152, in <module>
        model.fit(samples_train, labels_train, epochs=1, batch_size=1)
      File "C:\Program Files\Python36\lib\site-packages\keras\models.py", line 1002, in fit
        validation_steps=validation_steps)
      File "C:\Program Files\Python36\lib\site-packages\keras\engine\training.py", line 1630, in fit
        batch_size=batch_size)
      File "C:\Program Files\Python36\lib\site-packages\keras\engine\training.py", line 1476, in _standardize_user_data
        exception_prefix='input')
      File "C:\Program Files\Python36\lib\site-packages\keras\engine\training.py", line 113, in _standardize_input_data
        'with shape ' + str(data_shape))
    
    ValueError: Error when checking input: expected lstm_1_input to have 3 dimensions, but got array with shape (134, 1)
    

    对我来说,它似乎不起作用,因为我的样本可能具有可变数量的特性。如果我使用“假”(生成的)数据,其中所有参数都是相同的,除了每个样本具有完全相同数量的特征(50),那么代码可以工作。

    现在我试图理解的是:

    1. 我对如何为LSTM输入构建数据的一般假设是否正确?参数(batch\u sizeinput\u shape)是否正确/合理?
    2. keras LSTM模型是否通常能够处理具有不同数量特征的样本?
    3. 如果是,我必须如何调整我的代码以使其能够使用不同数量的功能?
    4. 如果否,“零填充”(填充)样本中少于50个特征的列是否有效?有没有其他更喜欢的方法来实现我的目标
  • 共有2个答案

    郑理
    2023-03-14

    LSTM模型需要[样本、时间步长、特征]形式的3D输入

    在定义LSTM模型的第一层时,我们只需要指定时间步骤和特征。尽管这可能看起来是2D的,但实际上是3D的,因为样品大小(即批量大小)是在模型拟合时指定的。

    features = x_train_d.shape[1]
    

    因此,我们首先需要以3D格式重塑输入:

    x_train_d = np.reshape(x_train_d, (x_train_d.shape[0], 1, x_train_d.shape[1]))
    

    下面是LSTM第一层:

    model.add(LSTM(5,input_shape=(1, features),activation='relu'))
    

    模型拟合指定样本数为LSTM预期的50

    model.fit(x_train_d,y_train_d.values,batch_size=50,epochs=100)
    

    对于使用可变长度输入提出的问题,在https://datascience.stackexchange.com/questions/26366/training-an-rnn-with-examples-of-different-lengths-in-keras

    翟鹏
    2023-03-14

    我认为KERA的输入形状应为:

    输入形状=(样本数、时间步数、最大特征数)。

    通常,nb_时间_步数=1

    附言:我试图解决一个非常相似的实习职位问题(但我的结果是错误的)。你可以看看这里:https://github.com/AbbasHub/Deep_Learning_LSTM/blob/master/2018-09-22_Multivariate_LSTM.ipynb(看看你是否能发现我的错误!)

     类似资料:
    • 我是时间序列的新手,需要学科专家的帮助。所以我有一个有11个变量的实验室数据,报告了时间。10个变量是可控的,第11个变量是输出。我用LSTM预测了第11个变量的时间序列。结果比预期好得多。第11个变量预测为0.001 RMSE。训练数据有5000个样本,测试数据有4599个。我对预测很满意。现在我需要分析输入10个变量是如何影响第11个输出变量的。请建议一个好的库,类似问题的教程。

    • 我正在阅读Keras中关于使用LSTM进行多元时间序列预测的教程https://machinelearningmastery.com/multivariate-time-series-forecasting-lstms-keras/#comment-442845 我已经看完了整个教程,遇到了一个如下的问题- 在本教程中,在步骤“t-1”中,列车和测试拆分有8个功能,即“污染”、“露水”、“温度”、

    • 我有一个包含一整年数据的时间序列数据集(日期是索引)。数据每15分钟测量一次(全年),结果是每天96个时间步。数据已规范化。这些变量是相关的。除VAR外的所有变量都是天气度量值。 VAR在一天期间和一周期间都是季节性的(因为它在周末看起来有点不同,但每个周末都不一样)。VAR值是固定的。我想预测未来两天(前192步)和未来七天(前672步)的VAR值。 以下是数据集的示例: 下面是我准备train

    • 我试图使用Keras对多个变量进行同时预测。在这里使用这个例子,我想预测所有特征的值,包括pm 2.5,DEWP,TEMP等,而不仅仅是污染(pm 2.5)。本质上,这是,给定所有变量,建立一个模型来预测所有变量作为时间序列,而不仅仅是预测一个变量。 我使用重塑后的3D数据修改了原始示例代码,但出现了一个错误。代码如下: 输出为: 数据集在这里可用。 我的问题是: Keras LSTM层不是为此设

    • 我试图使用LSTM对多元数据进行时间序列预测。我有50000个15维的样品。我想用10的回顾。输入到LSTM层的形状是什么。会吗 或 我正在使用Keras。

    • 我的任务是使用MATLAB和任何神经网络框架对时间序列数据进行分类。 更具体地描述任务:是计算机视觉领域的一个问题。Is是一项场景边界检测任务。 源数据是来自视频流的4个相邻帧直方图相关阵列。基于此数据,我们必须将此时间序列分为两类: “场景中断” “没有场景中断” 因此,每个源数据输入的网络输入是4个双倍值,输出是一个二进制值。我将在下面展示src数据的示例: 问题是,来自Matlab神经工具箱