¿Cómo aplicar Softmax como función de activación en Perceptron multicapa en scikit-learn? [cerrado]

9

Necesito aplicar la función de activación Softmax al Perceptrón multicapa en scikit. La documentación de scikit sobre el tema de los modelos de red neuronal (supervisada) dice que "MLPClassifier admite la clasificación de varias clases mediante la aplicación de Softmax como la función de salida". La pregunta es cómo aplicar la función?

En el fragmento de código a continuación, cuando agrego Softmax bajo el parámetro de activación, no acepta.

MLPClassifier(activation='Softmax', alpha=1e-05, batch_size='auto',
       beta_1=0.9, beta_2=0.999, early_stopping=False,
       epsilon=1e-08, hidden_layer_sizes=(15,), learning_rate='constant',
       learning_rate_init=0.001, max_iter=200, momentum=0.9,
       nesterovs_momentum=True, power_t=0.5, random_state=1, shuffle=True,
       solver='lbfgs', tol=0.0001, validation_fraction=0.1, verbose=False,
       warm_start=False)

El código de error es:

ValueError: la activación 'Softmax' no es compatible. Las activaciones admitidas son ('identidad', 'logística', 'tanh', 'relu').

¿Hay alguna manera de aplicar la función de activación Softmax para la clasificación de varias clases en scikit-learn?

AdiT
fuente

Respuestas:

7

Supongo que la función Softmax se aplica cuando solicita una predicción de probabilidad llamando al método mlp.predict_proba(X).

Para apoyar mi suposición, he desarrollado este pequeño experimento:

from sklearn.neural_network import MLPClassifier
from sklearn.datasets import load_iris
import numpy as np

X,Y = load_iris().data, load_iris().target

mlp = MLPClassifier()
mlp.fit(X, Y)

print mlp.predict([3.1,  2.5,  8.4,  2.2])
print mlp.predict_proba([3.1,  2.5,  8.4,  2.2])
print "sum: %f"%np.sum(mlp.predict_proba([3.1,  2.5,  8.4,  2.2]))

Tenga en cuenta que no importa en qué valores estén enchufados predict_proba(), el vector de probabilidad de salida siempre suma 1. Esto solo se puede lograr mediante la función de activación Softmax. la capa será exactamente una, especialmente para una muestra invisible).

Si mi suposición es correcta, mirando la documentación no puedo encontrar ningún método para obtener la salida de la red antes de Softmax ... Tal vez porque esta clase está destinada únicamente a la clasificación (no a la regresión u otras configuraciones sofisticadas).

Daniel López
fuente
4

El MLPClassifier se puede usar para "clasificación multiclase", "clasificación binaria" y "clasificación multicabel". Entonces, la capa de salida se decide según el tipo de Y:

  1. Multiclase : la capa más externa es la capa softmax

  2. Multilabel o clase binaria : la capa más externa es la logística / sigmoidea.

  3. Regresión : la capa más externa es la identidad

Parte del código de sklearn utilizado en MLPClassifier que lo confirma:

        # Output for regression
        if not is_classifier(self):
            self.out_activation_ = 'identity'
        # Output for multi class
        elif self._label_binarizer.y_type_ == 'multiclass':
            self.out_activation_ = 'softmax'
        # Output for binary class and multi-label
        else:
            self.out_activation_ = 'logistic'
  1. Clasificación multiclase: para un Feature X, solo puede haber una clase. Por ejemplo, Análisis de opinión Dado un texto (X), es la salida (Y) es positiva, neutral o negativa. Binary es un caso de Multiclass donde solo hay 2 salidas posibles.
  2. Clasificación de múltiples etiquetas: para una característica X, puede haber varias clases.
Trideep Rath
fuente
1

No puedo estar de acuerdo con la respuesta de Daniel López. En mi caso, la respuesta predict_proba () no devuelve resultados de softmax.

La respuesta de TrideepRath puede resolver fácilmente este problema. Para aplicar softmax defina out_activation_:

your_model.out_activation_ = 'softmax'
MykolaSharhan
fuente