我是 keras 机器学习的新手,我计划进行一项机器学习实验,该实验基于具有 lstm 层的循环神经网络来预测视频游戏比赛中购买的前 10 件物品的序列。
假设一个示例表预先排序gameId
,side
and timestamp
给出:
gameId side timestamp itemId
3030038208 100 4260 1055
3030038208 100 4648 2010
3030038208 100 5036 3340
3030038208 100 291561 1001
3030038208 100 295807 1083
3030038208 100 296457 2010
3030038208 200 3257 1055
3030038208 200 3516 2003
3030038208 200 3775 3340
3030038208 200 321461 1038
3030038208 200 321818 2003
3030038208 200 321979 2003
3030038208 200 491099 3006
3030038208 200 492238 1042
3030038208 200 743864 3086
3030038208 200 744773 1043
....
我现在想将数据帧重塑为两个(x 和 y)3d numpy 数组,其中第三维描述购买序列的长度(ItemId
) - 这样基本上结果序列中的每个 2d numpy 数组都构成了相同的表gameId
, side
pair
在训练神经网络之前,我还需要插入一个填充,因为上面提到的时间序列为 10。在本例中,填充值为 0 似乎没问题,但在实际场景中,我正在使用一个稀疏矩阵,其中包括很多0值。
现在有一些问题:
1)是否有 numpy、pandas 甚至 keras 的内置函数可以有效地实现我既定的目标。我想不出有什么东西不需要我花很长时间才能想出一个合理的预处理函数。
2)还有其他需要注意的事项吗?特别是在填充的情况下。在处理稀疏矩阵时,填写“-999”不是更有意义吗?
3)假设模型看起来像这样
model = Sequential()
model.add(LSTM(128, dropout=0.2, recurrent_dropout=0.2, input_dim=1))
model.add(Dense(y.shape[1], activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['acc'])
monitor = EarlyStopping(monitor='val_loss', min_delta=1e-3, patience=5, verbose=0, mode='auto')
checkpointer = ModelCheckpoint(filepath=filepath + "best_weights.hdf5", verbose=0, save_best_only=True)
With:
history = model.fit(x_train, y_train, epochs=2, validation_split=0.33, callbacks=[monitor, checkpointer], verbose=0).history
我如何才能正确使用遮罩层来处理填充?
预先感谢您在该线程上花费的任何时间!
edit:
根据要求,这里是我想得到的结果 numpy 数组(我认为),以便预测itemId
基于timestamp
使用 keras 中带有 lstm 层的神经网络填充前:
y = [
[1055, 2010, 3340, 1001, 1083, 2010],
[1055, 2003, 3340, 1038, 2003, 2003, 3006, 1042, 3086, 1043],
...
]
x = [
[[4260], [4648], [5036], [291561], [295807], [296457]],
[[3257], [3516], [3775], [321461], [321818], [321979], [491099], [492238], [743864], [744773] ],
...
]
and after填充:
y = [
[1055, 2010, 3340, 1001, 1083, 2010, 0, 0, 0, 0],
[1055, 2003, 3340, 1038, 2003, 2003, 3006, 1042, 3086, 1043],
...
]
x = [
[[4260], [4648], [5036], [291561], [295807], [296457], [0], [0], [0], [0]],
[[3257], [3516], [3775], [321461], [321818], [321979], [491099], [492238], [743864], [744773] ],
...
]
然而,在实际的例子中,除了时间戳之外,还会有更多的功能。