首页 > 解决方案 > 如何在 LSTM RNN 中传递分类信息和数值特征

问题描述

我有一个数据集,其中包含 1000 个用户的活动数据。由于一个用户的活动与另一个用户不同,我希望用户属性也发送到 LSTM RNN 模型,以便模型可以更好地了解每个用户的行为。我的数据集片段如下:

https://i.stack.imgur.com/poL31.jpg

我尝试了分类信息的 one-hot 编码和二进制编码,但模型没有产生好的结果。但是将 LSTM RNN 模型应用于单个用户的数据(不包括用户变量)会产生很好的结果。

我的用于异常检测的 lstm 自动编码器模型片段如下:

inputs = Input(shape = (timesteps, n_features))
L1 = LSTM(encoding_dim, activation='relu', return_sequences=True,
          kernel_regularizer=regularizers.l2(0.00))(inputs)
L2 = LSTM(hidden_dim, activation='relu', return_sequences=False)(L1)
L3 = RepeatVector(timesteps)(L2)
L4 = LSTM(hidden_dim, activation='relu', return_sequences=True)(L3)
L5 = LSTM(encoding_dim, activation='relu', return_sequences=True)(L4)
output = TimeDistributed(Dense(n_features))(L5)
lstm_model = Model(inputs=inputs, outputs=output)
lstm_model.summary()

现在我试过了,

n_features = 22; 不。特征 [ 1(带有 one-hot 编码的分类)+ 21(数字)]

encoding_dim = 16

hidden_​​dim = 8

如何使用此模型更好地处理分类属性,即用户变量?

标签: keraslstmrecurrent-neural-networkautoencoderlstm-stateful

解决方案


我正在分享我的代码 train_y 和 test_y 是类别。

使用以下命令加载数据集: train_size = int(len(df) * (1 - test_split))

X_train = df['sequence'].values[:train_size]
y_train = np.array(df['target'].values[:train_size])
X_test = np.array(df['sequence'].values[train_size:])
y_test = np.array(df['target'].values[train_size:])

然后加载数据并使用以下方法进行训练:X_train, y_train, X_test, y_test = load_data()

model = create_model(len(X_train[0]))

print ('Fitting model...')
hist = model.fit(X_train, y_train, batch_size=64, nb_epoch=10, validation_split = 
0.1, verbose = 1)

score, acc = model.evaluate(X_test, y_test, batch_size=1)
print('Test score:', score)

推荐阅读