如何处理 .csv 以进行时间序列分类

原文标题How to process .csv for time series classification

我想知道如何处理记录的时间序列数据以将其输入 RNN。

我想用 16 个时间步长的数据和 15 个标签来让 RNN 对第 16 个时间步长进行分类(如果这有意义的话)。通过使用批处理的每三个条目,我可以覆盖大约 3 秒的数据,每秒有合理数量的条目。

这是记录数据的较小 .csv。“时间”和“五月天”列仅供参考,以确保所有内容都正确标记,因此可以删除。
这是删除不相关列后我的数据的样子

到目前为止,这是我在谷歌 colabun 中尝试过的方法,幸运的是,这种方法不起作用,并且在调用 model.fit 时出现“AttributeError:’tuple’ object has no attribute ‘shape’”。

或者我也试过这个:

data = pd.read_csv("slim.csv", sep=",")
data.drop(['Time', 'Mayday'], axis=1)
dataset = tf.data.Dataset.from_tensor_slices(data)

但是从那里开始,我不确定如何处理数据以获得所需的结果,因为在数据集上调用 tf.keras.preprocessing.timeseries_dataset_from_array() 会以错误消息终止

'TensorSliceDataset' object is not subscriptable

原文链接:https://stackoverflow.com//questions/71667965/how-to-process-csv-for-time-series-classification

回复

我来回复
  • AloneTogether的头像
    AloneTogether 评论

    你的想法很好。问题是train_targettest_target正在返回元组,因为正如文档所述:

    返回一个 tf.data.Dataset 实例。如果传递了目标,则数据集产生元组 (batch_of_sequences, batch_of_targets)。如果没有,数据集仅产生 batch_of_sequences。

    由于您只对这种情况下的目标感兴趣,因此您可以运行:

    data_set = tf.data.Dataset.zip( (train_input ,train_target.map(lambda x, y: y)))
    test_set = tf.data.Dataset.zip( (test_input ,test_target.map(lambda x, y: y)))
    

    但请注意,这仍然行不通,因为您的目标具有形状(32, 11),而模型的输出形状是(32, 3)。所以你应该问问自己你到底想要达到什么目标。

    更新 1

    尝试:

    
    import tensorflow as tf
    
    data = pd.read_csv("slim.csv", sep=",")
    data.drop(['Time', 'Mayday'], axis=1)
    
    window_size = 16
    dataset = tf.data.Dataset.from_tensor_slices((data.values)).window(window_size, shift=3, drop_remainder=True)
    dataset = dataset.flat_map(lambda window: window.batch(window_size)).batch(32)
    dataset = dataset.map(lambda x: (x[:, :, :10], x[:, 15, -1]))
    
    model = tf.keras.models.Sequential([
    tf.keras.layers.GRU(input_shape=(None, 10), units= 128),
    tf.keras.layers.Dropout(0.1),
    tf.keras.layers.Dense(units=128, activation='tanh'),
    tf.keras.layers.Dense(units=3, activation='softmax')
    ])
    
    model.compile(optimizer="adam", loss="sparse_categorical_crossentropy", metrics=["accuracy"])
    
    model.fit(dataset, epochs=5)
    
    2年前 0条评论