Объедините категориальные и текстовые функции с «Конкатенацией» в Keras, категориальные функции не влияют на вывод - PullRequest
1 голос
/ 29 апреля 2019

Я хочу прогнозировать классы на основе как категориальных, так и дополнительных текстовых функций. Чтобы объединить оба типа данных, я использовал две «подмодели» 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% вспоминаю о классе, который меня интересует, чтобы точно определить. Однако система, кажется, обучается исключительно на части НЛП и игнорирует категориальную подсистему.

Как мне добиться того, чтобы категориальные переменные влияли на вывод прогноза?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...