我想基于分类特征和其他文本特征来预测类。为了同时使用这两种数据类型,我使用了两个keras“子模型”(带有嵌入层的模型和用于分类数据的简单前馈NN)并将它们串联起来。
但是,在测试中,改变分类特征不会影响预测结果。
我尝试使用不同的激活函数以及更改NN的一般结构(例如,在NLP子系统中使用LSTM,更改Dense节点等)。
关于数据:
分类数据:一键编码有4个特征->一键编码后约有5000个特征
文本数据:使用Keras预处理进行特征提取。Tokenizer,对嵌入层使用了预先训练的嵌入矩阵(在与问题相关的特定语料库上训练)
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'])
在培训期间,我有兴趣准确检测的班级的查全率达到90%左右,召回率达到85%左右。 但是,该系统似乎仅在NLP部分进行训练,而忽略了分类子系统。
如何实现分类变量影响预测输出?