Evaluar nuestro algoritmo de aprendizaje automático es una parte esencial de cualquier proyecto. Las métricas permite evaluar el desempeño de un modelo de acuerdo a criterios que el diseñador del modelo desea observar.
Por ejemplo, el puntaje de precisión precision_score
, puede arrojar resultados deficientes cuando se evalúa con otras métricas, como cross_entropy
o cualquier otra métrica similar.
La mayoría de las veces usamos la exactitud
de la clasificación para medir el rendimiento de nuestro modelo, sin embargo, no es suficiente para juzgar verdaderamente nuestro modelo. En esta lección, cubriremos los diferentes tipos de métricas de evaluación disponibles.
Las funciones de pérdida pueden ser usada como métricas ne algunos casos. Por ejemplo, es bastante común tener como función de pérdida en un problema el error cuadrático medio (ECM) y como métrica el el error absoluto medio (EAM). En esta lección no revisaremos las funciones de pérdida, pero podemos tener en cuenta de varias de ellas se puede usar como métricas.
La matriz de confusión, como sugiere el nombre, nos da una matriz como resultado y describe el rendimiento completo del modelo.
Supongamos que tenemos un problema de clasificación binaria. Tenemos algunas muestras pertenecientes a dos clases: SÍ o NO. Además, tenemos nuestro propio clasificador que predice una clase para una muestra de entrada dada. Al probar nuestro modelo en N muestras, obtenemos el siguiente resultado.
Clasificados como Positivos | Clasificados como Negativos | |
---|---|---|
Etiquetados como Positivos | Verdaderos Positivos | Falsos Negativos |
Etiquetados como Negativos | Falsos Positivos | Verdaderos Negativos |
Fuente Wiki-commons
En problemas con varias clases, la matriz de confusión permite tener una idea de primera mano de como está funcionando el modelo. Revise el siguiente ejemplo. La matriz de confusión, como sugiere el nombre, nos da una matriz como resultado y describe el rendimiento completo del modelo.
Fuente Wiki-commons
Aparentemente el modelo esta confundiendo muchos ejemplo en la clase en.
La mayor parte de las métricas son explicados para el caso binario, pero en general pueden ser aplicadas al caso de $J$ clases.
Clasificados como Positivos | Clasificados como Negativos | |
---|---|---|
Etiquetados como Positivos | Verdaderos Positivos | Falsos Negativos |
Etiquetados como Negativos | Falsos Positivos | Verdaderos Negativos |
La exactitud de la clasificación es lo que generalmente queremos decir cuando usamos el término exactitud. Es la relación entre el número de predicciones correctas y el número total de muestras de entrada. En el caso binario es usual la siguiente nomenclatura.
$$ Accuracy = \frac{\text{verdaderos positivos} + \text{verdaderos negativos} }{\text{total de la muestra}} $$El mejor valor es 1 y el peor valor es 0.
Esta métrica indica que tan preciso es el número de positivos detectados por el modelo. Se puede pensar como enfocada en minimizar los falsos positivos.
El mejor valor es 1 y el peor valor es 0.
La sensibilidad o recuperación (recall) es intuitivamente la capacidad del clasificador para encontrar todas las muestras positivas. El mejor valor es 1 y el peor valor es 0.
$$ Recall = \frac{\text{verdaderos positivos} }{\text{verdaderos positivos}+ \text{falsos negativos}} $$En algunos problemas con datos altamente desbalanceados como en el problema de detección de fraude en tarjetas de crédito o la detección temprana de cáncer de seno, un valor alto de exactitud, no es realmente lo mejor. En estos problemas, la recuperación, que es la métrica que mide la capacidad del modelo para detectar muestras positivas es la métrica que se privilegia por encima de las demás. En estos casos es usual el uso de pesos diferenciados de las observaciones. Se puede pensar como enfocada en minimizar los falsos negativos.
La puntuación F1 es la media armónica entre la precisión y la recuperación. El rango para F1 Score es $[0, 1]$. F1 nos dice qué tan preciso es el clasificador (cuántas instancias clasifica correctamente), así como qué tan robusto es (no pierde una cantidad significativa de instancias).
Alta precisión pero menor recuperación, le brinda una precisión extrema, pero luego pierde una gran cantidad de instancias que son difíciles de clasificar. Cuanto mayor sea el F1 Score, mejor será el rendimiento de nuestro modelo. Matemáticamente, se puede expresar como: $$ F1 = 2 \times \frac{1}{\frac{1}{precision} + \frac{1}{recall}} $$
El puntaje F1 intenta encontrar el equilibrio entre precision y recall.
Las siguientes son las métricas disponibles de Keras en el año 2022.
En el momento de compilar el modelo las métricas para el modelo se definen en una lista, como se observa en el siguiente fragmento de código.
model.compile(
optimizer='adam',
loss='mean_squared_error',
metrics=[
metrics.MeanSquaredError(),
metrics.AUC(),
]
)
En general las métricas van acumulado resultados a lo largo de cada época. En necesario reiniciarlas al comienza de la época y totalizarlas al final. Sin embargo todo lo hace Keras debajo del capó.
En Pytorch es necesario instalar el módulo TorchMetrics como sigue
# conda install -c conda-forge torchmetrics
Este módulo ha sido desarrollado principalmente por Pytorch-Lightning. El módulo incluye más de 80 métricas para cada uno se las siguientes áreas:
Para los detalles visite torchmetrics.
TorchMetrics
puede usarse directamente en Python como se ilustra en el siguiente fragmento de código. Vaya la lección de Pytorch-lightning, para verficar como usarlas alli.
from torchmetrics.classification import Accuracy
train_accuracy = Accuracy()
valid_accuracy = Accuracy()
for epoch in range(epochs):
for x, y in train_data:
y_hat = model(x)
# training step accuracy
batch_acc = train_accuracy(y_hat, y)
print(f"Accuracy of batch{i} is {batch_acc}")
for x, y in valid_data:
y_hat = model(x)
valid_accuracy.update(y_hat, y)
# total accuracy over all training batches
total_train_accuracy = train_accuracy.compute()
# total accuracy over all validation batches
total_valid_accuracy = valid_accuracy.compute()
print(f"Training acc for epoch {epoch}: {total_train_accuracy}")
print(f"Validation acc for epoch {epoch}: {total_valid_accuracy}")
# Reset metric states after each epoch
train_accuracy.reset()
valid_accuracy.reset()