Dwa*_*art 5 python numpy pandas lstm 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
....
Run Code Online (Sandbox Code Playgroud)
现在,我想将数据帧重塑为两个(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)
Run Code Online (Sandbox Code Playgroud)
带有:
history = model.fit(x_train, y_train, epochs=2, validation_split=0.33, callbacks=[monitor, checkpointer], verbose=0).history
Run Code Online (Sandbox Code Playgroud)
我如何能够正确地采用遮罩层来处理填充物?
预先感谢您在该线程上花费的第二秒!
编辑:应要求,这是我想要得到的numpy数组,以便在填充之前预测itemId基于timestamp具有keras中lstm层的神经网络的numpy数组:
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] ],
...
]
Run Code Online (Sandbox Code Playgroud)
和填充后:
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] ],
...
]
Run Code Online (Sandbox Code Playgroud)
但是,在实际示例中,将不仅具有时间戳记,还具有更多功能。
通过从pandas groupby对象中提取数据,可以通过几个步骤来实现此目的。在前两个步骤中,我们将创建groupby对象,以便稍后在代码中对其进行操作。从groupby对象中,我们将找到最大的组,以便我们可以相应地填充零
gb = df.groupby(['gameId','side']) # Create Groupby object
mx = gb['side'].size().max() # Find the largest group
Run Code Online (Sandbox Code Playgroud)
创建x和y的步骤非常相似。我们可以使用列表推导遍历每个组,将数据帧转换为numpy数组,并使用填充零np.pad()。然后将每个数组重塑为3d
x = np.array([np.pad(frame['timestamp'].values,
pad_width=(0,mx-len(frame)),
mode='constant',
constant_values=0)
for _,frame in gb]).reshape(-1,mx,1)
y = np.array([np.pad(frame['itemId'].values,
pad_width=(0,mx-len(frame)),
mode='constant',
constant_values=0)
for _,frame in gb]).reshape(-1,mx,1)
Run Code Online (Sandbox Code Playgroud)
在此示例中,该设置适用于多对多lstm。在评论中,我指出您的当前设置不支持3d输出值,因为在lstm层中您没有参数return_sequence=True。
目前尚不清楚您正在寻找该问题的结构。在确定我使用的LSTM网络时,我喜欢参考下图。假设您添加return_sequence=True到LSTM层,则上面的代码将支持多对多网络。如果您想要多对一,.reshape(-1,mx,1)则从y 下降,现在您有了一个带有mx输出的网络。
对于这两种设置,您都需要修改input_shape模型的参数。此参数必须指定x的第二维和第三维的形状,即
# v Use input_shape here
model.add(LSTM(128, dropout=0.2, recurrent_dropout=0.2, input_shape=x.shape[1:]))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1249 次 |
| 最近记录: |