En Keras, estoy usando algo similar al Ejemplo de Keras IMDB para construir un ejemplo de modelado de temas. Sin embargo, a diferencia del ejemplo, que tiene una única clasificación "positiva/negativa", yo tengo más de cien temas que no son mutuamente excluyentes. Cada ejemplo de entrenamiento tiene una salida correspondiente que es un vector de ceros con 3 o 4 unos. ex :[0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0 ..... 0]
model = Sequential()
model.add(Embedding(max_features, 128))
model.add(LSTM(128, dropout=0.2, recurrent_dropout=0.2))
model.add(Dense(120, activation='sigmoid'))
# try using different optimizers and different optimizer configs
model.compile(loss='binary_crossentropy',
optimizer='adam',
metrics=['accuracy'])
print('Train...')
model.fit(x_train, y_train,
batch_size=batch_size,
epochs=15,
validation_data=(x_test, y_test))
score, acc = model.evaluate(x_test, y_test,
batch_size=batch_size)
print('Test score:', score)
print('Test accuracy:', acc)
Por supuesto, el modelo salta rápidamente a un 95-97% de precisión, pero cuando miro el resultado, por supuesto que no predice más que ceros. Está claro que el desequilibrio de clases (cada clase tiene más ejemplos negativos que positivos) está provocando que mis predicciones se queden en 0. ¿Hay alguna forma de ajustar el modelo para que entienda los ejemplos binarios dispersos?