Keras LSTM中的面板数据

时间:2017-03-09 11:52:13

标签: neural-network keras lstm panel-data

我正在查看面板数据,其结构如下:

D = \{(x^{(k)}_{t},y^{(k)}_{t})\,|\, k=1,\dots,N\, , t=t_0,\dots,t_k \}_{k=1}^{N}

其中x^{(k)}表示k'序列,x^{(k)}_{t}表示k时序列值t,此外,x^{(k)}_{i,t}是向量i中的x^{(k)}_{t}个条目。即x^{(k)}_{t}是时间kt&#39序列的特征向量。子脚本和超级脚本对于标签数据y^{(k)}_{t}意味着相同的事情,但这里y^{(k)}_{t} \in \{0,1\}

简单来说:数据集包含随时间观察的个体,并且对于观察个体的每个时间点,记录他是否购买了一个项目(y\in \{0,1\})。

我想使用来自Keras的LSTM单元的循环神经网络,用于预测某人是否会在给定时间点购买物品。我只能找到RNN的例子,其中每个序列都有一个标签值(philipperemy link),而不是每个序列元素都有标签值的例子,如我所描述的问题。

到目前为止,我的方法是创建一个尺寸(样本,时间步长,特征)的张量,但我无法弄清楚如何格式化标签,这样keras可以将它们与特征相匹配。它应该是这样的(样本,时间步长,1),其中最后一个维度表示包含标签值0或1的单个维度。

此外,我遇到的一些方法会拆分序列,以便将子序列添加到训练数据中,从而极大地增加了对内存的需求(mlmastery link)。在我的情况下这是不可行的,因为我有多个GB的数据,如果我添加了子序列,我将无法将其存储在内存中。

我想使用的模型是这样的:

mod = Sequential()
mod.add(LSTM(30,input_dim=116, return_sequences = True))
mod.add(LSTM(10))
mod.add(Dense(2))

有没有人有使用keras中的面板数据的经验?

2 个答案:

答案 0 :(得分:4)

尝试:

mod = Sequential()
mod.add(LSTM(30, input_shape=(timesteps, features), return_sequences = True))
mod.add(LSTM(10, return_sequences = True))
mod.add(TimeDistributed(Dense(1, activation='sigmoid')))
# In newest Keras version you can change the line above to mod.add(Dense(1, ..))

mod.compile(loss='binary_crossentropy', optimizer='rmsprop')

答案 1 :(得分:0)

看起来唯一的选择是在数据不平衡时分别为每个人(这里是一个序列)运行lstm,因为我假设这是因为时间取决于你问题中的k。