CNTK - Modelo de clasificación
Este capítulo le ayudará a comprender cómo medir el rendimiento del modelo de clasificación en CNTK. Comencemos con la matriz de confusión.
Matriz de confusión
Matriz de confusión: una tabla con el resultado previsto frente al resultado esperado es la forma más fácil de medir el rendimiento de un problema de clasificación, donde el resultado puede ser de dos o más tipos de clases.
Para entender cómo funciona, vamos a crear una matriz de confusión para un modelo de clasificación binaria que predice si una transacción con tarjeta de crédito fue normal o un fraude. Se muestra de la siguiente manera:
Fraude real | Normal real | |
---|---|---|
Predicted fraud |
Verdadero positivo |
Falso positivo |
Predicted normal |
Falso negativo |
Verdadero negativo |
Como podemos ver, la matriz de confusión de muestra anterior contiene 2 columnas, una para fraude de clase y otra para clase normal. De la misma manera tenemos 2 filas, una se agrega para fraude de clase y otra se agrega para clase normal. A continuación se muestra la explicación de los términos asociados con la matriz de confusión:
True Positives - Cuando tanto la clase real como la clase pronosticada del punto de datos es 1.
True Negatives - Cuando tanto la clase real como la clase pronosticada del punto de datos es 0.
False Positives - Cuando la clase real de punto de datos es 0 y la clase prevista de punto de datos es 1.
False Negatives - Cuando la clase real de punto de datos es 1 y la clase prevista de punto de datos es 0.
Veamos, cómo podemos calcular el número de cosas diferentes de la matriz de confusión -
Accuracy- Es el número de predicciones correctas realizadas por nuestro modelo de clasificación ML. Se puede calcular con la ayuda de la siguiente fórmula:
Precision−Nos dice cuántas muestras se predijeron correctamente de todas las muestras que predijimos. Se puede calcular con la ayuda de la siguiente fórmula:
Recall or Sensitivity- La recuperación es el número de positivos devueltos por nuestro modelo de clasificación de ML. En otras palabras, nos dice cuántos de los casos de fraude en el conjunto de datos fueron realmente detectados por el modelo. Se puede calcular con la ayuda de la siguiente fórmula:
Specificity- Contrario a recordar, da la cantidad de negativos devueltos por nuestro modelo de clasificación ML. Se puede calcular con la ayuda de la siguiente fórmula:
Medida F
Podemos utilizar la medida F como alternativa a la matriz de confusión. La principal razón detrás de esto es que no podemos maximizar la recuperación y la precisión al mismo tiempo. Existe una relación muy fuerte entre estas métricas y eso se puede entender con la ayuda del siguiente ejemplo:
Supongamos que queremos usar un modelo DL para clasificar las muestras de células como cancerosas o normales. Aquí, para alcanzar la máxima precisión, necesitamos reducir el número de predicciones a 1. Aunque, esto puede darnos una precisión de alrededor del 100 por ciento, pero el recuerdo será realmente bajo.
Por otro lado, si queremos alcanzar el máximo recuerdo, necesitamos hacer tantas predicciones como sea posible. Aunque, esto puede darnos un alcance de alrededor del 100 por ciento de recuperación, pero la precisión será realmente baja.
En la práctica, necesitamos encontrar una forma de equilibrar la precisión y el recuerdo. La métrica de medida F nos permite hacerlo, ya que expresa un promedio armónico entre precisión y recuperación.
Esta fórmula se llama la medida F1, donde el término adicional llamado B se establece en 1 para obtener una proporción igual de precisión y recuperación. Para enfatizar la recuperación, podemos establecer el factor B en 2. Por otro lado, para enfatizar la precisión, podemos establecer el factor B en 0.5.
Usando CNTK para medir el desempeño de la clasificación
En la sección anterior, hemos creado un modelo de clasificación utilizando un conjunto de datos de flores de Iris. Aquí, mediremos su desempeño utilizando una matriz de confusión y una métrica de medida F.
Creando matriz de confusión
Ya creamos el modelo, por lo que podemos iniciar el proceso de validación, que incluye confusion matrix, en el mismo. Primero, vamos a crear una matriz de confusión con la ayuda delconfusion_matrix función de scikit-learn. Para ello, necesitamos las etiquetas reales para nuestras muestras de prueba y las etiquetas previstas para las mismas muestras de prueba.
Calculemos la matriz de confusión usando el siguiente código de Python:
from sklearn.metrics import confusion_matrix
y_true = np.argmax(y_test, axis=1)
y_pred = np.argmax(z(X_test), axis=1)
matrix = confusion_matrix(y_true=y_true, y_pred=y_pred)
print(matrix)
Salida
[[10 0 0]
[ 0 1 9]
[ 0 0 10]]
También podemos usar la función de mapa de calor para visualizar una matriz de confusión de la siguiente manera:
import seaborn as sns
import matplotlib.pyplot as plt
g = sns.heatmap(matrix,
annot=True,
xticklabels=label_encoder.classes_.tolist(),
yticklabels=label_encoder.classes_.tolist(),
cmap='Blues')
g.set_yticklabels(g.get_yticklabels(), rotation=0)
plt.show()
También deberíamos tener un número de rendimiento único, que podemos usar para comparar el modelo. Para esto, necesitamos calcular el error de clasificación usandoclassification_error función, del paquete de métricas en CNTK como se hizo al crear el modelo de clasificación.
Ahora, para calcular el error de clasificación, ejecute el método de prueba en la función de pérdida con un conjunto de datos. Después de eso, CNTK tomará las muestras que proporcionamos como entrada para esta función y hará una predicción basada en las características de entrada X_test.
loss.test([X_test, y_test])
Salida
{'metric': 0.36666666666, 'samples': 30}
Implementación de medidas F
Para implementar F-Measures, CNTK también incluye una función llamada fmeasures. Podemos usar esta función, mientras entrenamos el NN reemplazando la celdacntk.metrics.classification_error, con una llamada a cntk.losses.fmeasure al definir la función de fábrica de criterio de la siguiente manera
import cntk
@cntk.Function
def criterion_factory(output, target):
loss = cntk.losses.cross_entropy_with_softmax(output, target)
metric = cntk.losses.fmeasure(output, target)
return loss, metric
Después de usar la función cntk.losses.fmeasure, obtendremos una salida diferente para el loss.test llamada al método dada de la siguiente manera:
loss.test([X_test, y_test])
Salida
{'metric': 0.83101488749, 'samples': 30}