¡Esta es una revisión vieja del documento!
Veamos ahora otras métricas de clasificación.
En problemas de clasificación en los que hay muchísimos clases a clasificar , se puede usar otra métrica llamada Top-N Accuracy. Veamos en que consiste.
El problema de clasificación de ImageNet hay 1000 posibles clases a clasificar. En ese caso cuando decimos que un "gato" es un "gato" es que la clase gato tiene la mayor probabilidad. Veamos un ejemplo con 10 objetos.
Clase | Probabilidad |
---|---|
Casa | 0.06 |
Botella | 0,04 |
Farola | 0,15 |
Gato | 0,34 |
Perro | 0,28 |
Niño | 0,04 |
Adulto | 0,02 |
Bicicleta | 0,03 |
Semáforo | 0,001 |
Puente | 0,039 |
Si la imagen es de un gato, en este caso diríamos que ha acertado ya que la probabilidad de ser gato es del 34% y es la mayor de todas. Y con eso calcularíamos el valor de Accuracy
.
Sin embargo veamos este otro ejemplo:
Clase | Probabilidad |
---|---|
Casa | 0.06 |
Botella | 0,04 |
Farola | 0,15 |
Gato | 0,28 |
Perro | 0,34 |
Niño | 0,04 |
Adulto | 0,02 |
Bicicleta | 0,03 |
Semáforo | 0,001 |
Puente | 0,039 |
En este nuevo ejemplo, también le hemos pasado una imagen de una gato pero la probabilidad de ser gato es del 28% mientras que la de ser perro es del 34%. Por ello diríamos que no ha acertado.
Sin embargo usando la métrica de Top-2 Accuracy
, diríamos que ha acertado si el gato está entre las 2 que tiene mayor probabilidad. Y en este caso si que diríamos que ha acertado.
Esta métrica tiene sentido cuando hay muchísimas clases (En ImageNet hay 1000 clases). Y aunque la predicción correcta no sea la mejor al menos está entre las 2 primeras Top-2-Accuracy
.
En el siguiente artículo Image classification with Vision Transformer se ve como se usa la métrica de Top-5-Accuracy
.
en keras se puede usar esta métrica con tf.keras.metrics.SparseTopKCategoricalAccuracy.
Por defecto esta métrica calcula es top-5-Accuracy
.Pero se puede cambiar con el parámetro k
.
1 |
model. compile (optimizer = 'sgd' ,loss = 'sparse_categorical_crossentropy' ,metrics = [keras.metrics.SparseTopKCategoricalAccuracy()]) |
1 |
model. compile (optimizer = 'sgd' ,loss = 'sparse_categorical_crossentropy' ,metrics = [keras.metrics.SparseTopKCategoricalAccuracy(k = 5 , name = 'top-5-accuracy' )]) |
Más información:
El Fβ-score permite ajustar si penalizamos más los falsos positivos o los falsos negativos. Al dar más importancia a uno que a otro realmente no es una métrica de rendimiento general ya que está "ponderada".
La formula es:
Fβ-score=(1+β2)⋅precision⋅sensibilidadβ2⋅precision+sensibilidad
Si β=1 la fórmula es la de F1-score por eso se le llama así porque la β es un 1.
Interpretación de β
Veamos ahora unos ejemplos:
Sensibilidad | Precisión | β | F1-score |
---|---|---|---|
0,2 | 0,6 | 0,5 | 0,3 |
0,6 | 0,2 | 0,5 | 0,3 |
Sensibilidad | Precisión | β | F2-score |
---|---|---|---|
0,2 | 0,6 | 2 | 0,23 |
0,6 | 0,2 | 2 | 0,43 |
El caso base es 0,3 y al usar β=2 con una baja sensibilidad el resultado es más bajo aun (0,23) mientras que con una alta sensibilidad el valor es mayor (0,43)
Sensibilidad | Precisión | β | F0.5-score |
---|---|---|---|
0,2 | 0,6 | 0,5 | 0,43 |
0,6 | 0,2 | 0,5 | 0,23 |
El caso base es 0,3 y al usar β=2 con una baja precisión el resultado es más bajo aun (0,23) mientras que con una alta precisión el valor es mayor (0,43)
¿Pero cuanto es realmente se valor? Veámoslo con un ejemplo con β = 2 frente a β = 2.5.
Es decir, el valor de β no es la relación directa entre sensibilidad y precisión, sino que se eleva al cuadrado. A medida que β aumenta, la sensibilidad pesa exponencialmente más en la precisión.
Para calcular la β se usa la regla de:
β=√n
β=√1n
Más información:
Por último veamos cuando deberíamos usar el fβ-score.
Cuando es más costoso cometer falsos negativos (FN), es decir, cuando es crítico detectar todos los casos positivos aunque implique aumentar los falsos positivos.
Cuando es más costoso cometer falsos positivos (FP), es decir, cuando es crítico que los positivos realmente sean correctos, aunque se pasen por alto algunos casos positivos reales.
En keras se puede usar esta métrica con tf.keras.metrics.FBetaScore.
Lo importante es que hay que establecer el parámetro de β (como un float
y no como un int
).
1 |
metrics = [tf.keras.metrics.FBetaScore(beta = 2.0 )] |
1 2 |
history.history[ 'fbeta_score' ] history.history[ 'val_fbeta_score' ] |
Más información: