Я хочу прогнозировать классы на основе как категориальных, так и дополнительных текстовых функций. Чтобы объединить оба типа данных, я использовал две «подмодели» keras (модель со слоем внедрения и простой NN прямой связи для категориальных данных) и объединил их.
Однако при тестировании изменение категориальных признаков не влияет на результат прогнозирования.
Я пытался использовать различные функции активации, а также изменять общую структуру NN (например, используя LSTM в подсистеме NLP, изменяя Плотные узлы и т. Д.).
По поводу данных:
Категориальные данные: 4 функции с горячим кодированием -> около 5000 функций после горячего кодирования
Текстовые данные: извлечение объектов с помощью предварительной обработки Keras. Токенизатор, использованная предварительно подготовленная матрица внедрения для слоя внедрения (обучена на конкретном корпусе, соответствующем проблеме)
def EmbeddingsModel():
inputs = Input(name='input_embeddings',shape=[MAX_LEN])
layer = Embedding(vocabulary_size, EMBEDDING_DIM, input_length=MAX_LEN, trainable=False, weights=[embedding_matrix])(inputs)
layer = Flatten()(layer)
# layer = LSTM(32)(layer)
layer = Dense(3,name='out_layer')(layer)
layer = Activation('sigmoid')(layer)
model = Model(inputs=inputs, outputs=layer)
return model
def FeedForwardModel(input_dim):
inputs = Input(name='input_categorical', shape=[input_dim])
layer = Dense(32, name='dense1_categorical')(inputs)
layer = Activation('relu')(layer)
layer = Dense(3, name='output_categorical')(layer)
layer = Activation('sigmoid')(layer)
model = Model(inputs=inputs, outputs=layer)
return model
# Create the sub nets
num_features_categorical = X_categorical.shape[1]
rnn_nlp = EmbeddingsModel()
mlp_cat = FeedForwardModel(num_features_categorical)
# Combine inputs
combinedInput = concatenate([mlp_cat.output, rnn_nlp.output])
# The final layers
x = Dense(32, activation='relu', name='combination_layer')(combinedInput)
x = Dense(3, activation='sigmoid', name='output_layer_final')(x)
# Finish up the model
model = Model(inputs=[mlp_cat.input, rnn_nlp.input], outputs=x)
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
Сюжет модели Keras
Во время обучения я достигаю точности около 90% и около 85% вспоминаю о классе, который меня интересует, чтобы точно определить.
Однако система, кажется, обучается исключительно на части НЛП и игнорирует категориальную подсистему.
Как мне добиться того, чтобы категориальные переменные влияли на вывод прогноза?