【发布时间】:2018-09-23 00:24:33
【问题描述】:
我是 keras 机器学习的新手,我正计划进行机器学习实验,基于具有 lstm 层的递归神经网络预测视频游戏比赛中购买的前十个物品的序列。
假设给定一个由gameId、side和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对的表
在训练神经网络之前,我还需要插入一个填充,因为上面提到的时间序列是 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)
与:
history = model.fit(x_train, y_train, epochs=2, validation_split=0.33, callbacks=[monitor, checkpointer], verbose=0).history
我如何才能正确使用处理填充的遮罩层?
提前感谢您在该线程上花费的任何时间!
编辑:
根据要求,这里是生成的 numpy 数组(我认为)我想得到,以便根据 timestamp 预测 itemId,在 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] ],
...
]
和之后填充:
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] ],
...
]
但是,在实际示例中,将有更多的功能,而不仅仅是时间戳。
【问题讨论】:
-
您能否添加 x 和 y 的预期 numpy 数组的样子,以及考虑到您的 lstm 的当前结构,为什么 y 是 3d
-
你是对的,考虑到时间步长,在这种情况下 y 将是二维的。更正了。
-
你的 x 和 y 是多少?
-
时间戳和 itemId。我在原帖的编辑版本中设置了一个示例。
标签: python pandas numpy keras lstm