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模型,所以不对.
谢谢,
我不是专家,但我不确定批量大小。据我所知,Keras LSTM 在每个批次后都会重置其状态。因此,当您的批量大小为 1 时,LSTM 会重置其内存。因此,您在处理时间步 2 时忘记了用户 1 在时间步 1 所做的事情。最大购买数量可以是您的批量大小。您可以使用遮罩来避免填充的影响。
| 归档时间: |
|
| 查看次数: |
743 次 |
| 最近记录: |