如何训练序列项目的LSTM模型?

beu*_*beu 8 recommendation-engine sequence market-basket-analysis lstm keras

我尝试将LSTM模型用于下一个篮子推荐.我想应用与本文相同的方法:下一个篮子推荐的动态循环模型

在我的情况下,我有一些用户,他们在不同的时间购买一些物品.所以我设计了我的X数据,如:

    user ID       timestep     sequence items    
    user1            1          array(1, 20)
    user1            2            ...       

    user2            1            ...
    user2            2            ...
    user2            3            ...

    user3            1            ...
    user3            1            ...
Run Code Online (Sandbox Code Playgroud)

序列项表示具有形状(1,20)的数组.这些向量是在每个序列期间购买的每个项目(使用word2vec生成)的平均表示.

然后我设计我的标签y:

    user ID       label    
    user1         np.array(1, 6000)
    user2         ...
    user3         ... 
Run Code Online (Sandbox Code Playgroud)

标签用户表示每个用户的下一个订单,在他们过去的订单之后表示X数据.另外,标签是[1 0 1 0 0 0 .. 1]之类的向量,其中1表示用户购买了该项目,否则为0.

因此,我想使用LSTM来训练每个用户的过去序列以预测下一个购买序列.下面,我定义了一个LSTM模型,我没有返回序列,因为我有一个用户标签.

  model_rnn = Sequential()
  model_rnn.add(LSTM(20, return_sequences=False, input_shape=(None, 20)))
  model_rnn.add(Dropout(0.2))
  model_rnn.add(Dense(nb_classes)) 
  model_rnn.add(Activation("sigmoid"))                

  model_rnn.compile(loss='binary_crossentropy', optimizer="Adagrad")
  n_index = X.index.values
  n_sample = int(len(X.index.values)*0.7)
  user_index = np.random.choice(n_index, n_sample, replace=False)
  n_epochs = 10      
  for _ in range(n_epochs):
       for index in user_index:
          X_train = X.ix[index, "sequence_items"]
          X_train.reshape(1, X_train.shape[0], X_train.shape[1])
          y_train = y[index, :].toarray()
          model_rnn.fit(X_train, y_train, batch_size=1, epochs=1, shuffle=1)
Run Code Online (Sandbox Code Playgroud)

如您所见,我使用batch_size = 1训练LSTM,因为用户之间的时间步长不同.我在70%的用户身上安装了该模型,并在其余部分测试了该模型.

我的结果非常差,模型为每个用户测试推荐的前n项非常相似.例如,对于特定用户,模型会推荐从未出现在旧序列中的项目.虽然规范,它必须预测最后序列比较的项目,因此,它应该预测过去购买的项目的高概率.

显然,我的方法似乎是错误的.也许设计和培训数据不适合我的目标.您有任何想法或建议来适应数据,达到我的目标吗?

注意:当我只使用一个用户的LSTM模型,每次都有他的序列和标签(表示每个时间序列的下一个顺序)时,我会得到很好的结果来预测下一个用户订单的顺序.但是这种方法迫使我训练N用户的LSTM模型,所以不对.

谢谢,

Par*_*jee 1

我不是专家,但我不确定批量大小。据我所知,Keras LSTM 在每个批次后都会重置其状态。因此,当您的批量大小为 1 时,LSTM 会重置其内存。因此,您在处理时间步 2 时忘记了用户 1 在时间步 1 所做的事情。最大购买数量可以是您的批量大小。您可以使用遮罩来避免填充的影响。