Implementé un MLP básico en Keras con tensorflow y estoy tratando de resolver un problema de clasificación binaria. Para la clasificación binaria, parece que sigmoid es la función de activación recomendada y no entiendo muy bien por qué y cómo trata Keras con esto.
Entiendo que la función sigmoide producirá valores en un rango entre 0 y 1. Según tengo entendido, para los problemas de clasificación que usan sigmoide, se usará un cierto umbral para determinar la clase de una entrada (típicamente 0.5). En Keras, no veo ninguna forma de especificar este umbral, así que supongo que se hace implícitamente en el back-end. Si este es el caso, ¿cómo distingue Keras entre el uso de sigmoide en un problema de clasificación binaria o un problema de regresión? Con la clasificación binaria, queremos un valor binario, pero con la regresión se necesita un valor nominal. Todo lo que puedo ver que podría indicar esto es la función de pérdida. ¿Es eso informar a Keras sobre cómo manejar los datos?
Además, suponiendo que Keras está aplicando implícitamente un umbral, ¿por qué genera valores nominales cuando uso mi modelo para predecir nuevos datos?
Por ejemplo:
y_pred = model.predict(x_test) print(y_pred)da:
[7.4706882e-02] [8.3481872e-01] [2.9314638e-04] [5.2297767e-03] [2.1608515e-01] ... [4.4894204e-03] [5.1120580e-05] [7.0263929e-04 ]
Yo mismo puedo aplicar un umbral al predecir para obtener una salida binaria, sin embargo, seguramente Keras debe estar haciendo eso de todos modos para clasificar correctamente. ¿Quizás Keras está aplicando un umbral cuando entrena el modelo, pero cuando lo uso para predecir nuevos valores, el umbral no se usa ya que la función de pérdida no se usa para predecir? ¿O no está aplicando un umbral en absoluto, y los valores nominales generados funcionan bien con mi modelo? Verifiqué que esto está sucediendo en el ejemplo de Keras para la clasificación binaria, por lo que no creo que haya cometido ningún error con mi código, especialmente porque está prediciendo con precisión.
Si alguien pudiera explicarme cómo funciona esto, se lo agradecería mucho.
Aquí está mi modelo como punto de referencia:
model = Sequential() model.add(Dense(124, activation='relu', input_shape = (2,))) model.add(Dropout(0.5)) model.add(Dense(124, activation='relu')) model.add(Dropout(0.1)) model.add(Dense(1, activation='sigmoid')) model.summary() model.compile(loss='binary_crossentropy', optimizer=SGD(lr = 0.1, momentum = 0.003), metrics=['acc']) history = model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, verbose=1, validation_data=(x_test, y_test)) score = model.evaluate(x_test, y_test, verbose=0)El resultado de una clasificación binaria es la probabilidad de que una muestra pertenezca a una clase.
¿Cómo distingue Keras entre el uso de sigmoides en un problema de clasificación binaria o un problema de regresión?
No es necesario. Utiliza la función de pérdida para calcular la pérdida, luego los derivados y actualizar los pesos.
En otras palabras:
y^ y real.Puede asignar el umbral explícitamente en compile() usando
tf.keras.metrics.BinaryAccuracy( name="binary_accuracy", dtype=None, threshold=0.5 )como lo siguiente:
model.compile(optimizer='sgd', loss='mse', metrics=[tf.keras.metrics.BinaryAccuracy()])