当训练数据位于多个不同长度时间序列的 csv 文件中时,如何提供 LSTM?
Posted
技术标签:
【中文标题】当训练数据位于多个不同长度时间序列的 csv 文件中时,如何提供 LSTM?【英文标题】:How to feed LSTM when training data is in multiple csv files of time series of different length? 【发布时间】:2019-07-14 15:30:30 【问题描述】:我正在运行 LSTM 来对每位患者的医疗记录进行分类。话虽如此,对于每位患者(一次观察),我都有一个 CSV 文件。整个数据集是多个 CSV 文件,每个文件都是时间序列的 DataFrame。 这不是很明显,因为用图像和时间序列输入 LSTM 之间有一个小的区别,它是序列的大小。 CNN 假设输入具有相同的大小,但这里我们有不同长度的输入
问题:
这种情况下如何喂 LSTM?
我敢肯定,如果您熟悉图像分类,您可以帮助解决我的问题,但这不仅仅是相同的方法。
示例
对于一位患者,我有一个 DataFrame,其中包含我想在 LSTM 中使用的所有记录。
df.shape
Out[29]: (5679000, 4)
# The 5679000 change from one patient to another but 4 columns are fixed
看看这里:
df.head(4)
Out[30]:
AIRFLOW SaO2 ECG Target
0 -34.0 31145.0 304.0 0.0
1 -75.0 31145.0 272.0 0.0
2 -63.0 31145.0 254.0 0.0
3 -57.0 31145.0 251.0 1.0
4 -60.0 31145.0 229.0 0.0
问题:
对我的网络有什么建议吗?
【问题讨论】:
您的问题是什么?这段代码有点混乱。如果您的每个数据点都有可变数量的时间步,那么您的批量大小需要为 1,因此您需要以小批量的方式进行训练,而不是一次全部训练。也就是说,除非您可以将具有相同时间步数的患者分组或固定时间步数。另外,你为什么使用批量大小作为第一个 LSTM 中的单元数? @LukeDeLuccia 你所问的正是我想要弄清楚的! mini_batches,batch_size,...如何正确执行?任何改进建议将不胜感激 【参考方案1】:在不同长度序列的情况下,你有两种我知道的主要方法:
1- 使用批量大小 1 训练您的模型,这并不理想,因为它需要多少时间以及它需要的资源。
2- 您可以确定最长的序列,将该长度用作批量大小,将填充值添加到其他序列并在模型训练期间忽略这些填充值。
【讨论】:
【参考方案2】:由于您的数据点具有可变的序列长度,因此您无法轻松地一次训练您的网络。相反,您必须以大小为 1 的小批量进行训练或固定您的序列长度,尽管根据您正在处理的数据,后者可能没有意义。
看看 Keras 函数train_on_batch。使用它,您可以使用每个患者来训练您的模型,尽管使用批量大小 1 有其自己的 issues。
至于型号,我建议使用Keras functional API。如果你想尝试一些简单的事情,只需使用可变长度的输入序列和3
的特征大小。这应该给你一个基线,这是我假设你想要的函数名称。像这样的:
input_ = Input(shape=(None, 3))
x = LSTM(128)(input_)
output = Dense(1, activation='sigmoid')(x)
model = Model(input_, output)
【讨论】:
【参考方案3】:lstm_baseline(df[['AIRFLOW','SaO2','ECG']], df['Target'], 64)
【讨论】:
64 指的是什么? 你的回答很明显!这是针对一名患者的,而不是所有的训练数据! 64 是你的 batch_size。 我认为你不能在多个患者身上训练这个 LSTM。在这里,网络会考虑数据列的一些先前值,以进行预测。但是将一位患者的数据用于下一位患者是否有意义?以上是关于当训练数据位于多个不同长度时间序列的 csv 文件中时,如何提供 LSTM?的主要内容,如果未能解决你的问题,请参考以下文章
从多个 csv 文件创建 libsvm 用于 xgboost 外部内存训练