如何处理 .csv 以进行时间序列分类
machine-learning 227
原文标题 :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
回复
我来回复-
AloneTogether 评论
该回答已被采纳!
你的想法很好。问题是
train_target
和test_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年前