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
.
model.compile(optimizer='sgd',loss='sparse_categorical_crossentropy',metrics=[keras.metrics.SparseTopKCategoricalAccuracy()]) model.compile(optimizer='sgd',loss='sparse_categorical_crossentropy',metrics=[keras.metrics.SparseTopKCategoricalAccuracy(k=5, name='top-5-accuracy')])
Más información:
El $F_{\beta}\text{-score}$ es como F1-score pero 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_{\beta}\text{-score}=\frac{(1+\beta^2) \cdot precision \cdot sensibilidad}{\beta^2 \cdot precision+sensibilidad} $$
Si $\beta=1$ la fórmula es la de $F_1\text{-score}$ por eso se le llama así porque la $\beta$ es un 1.
Interpretación de β
Veamos ahora unos ejemplos:
Sensibilidad | Precisión | β | $F_{1}\text{-score}$ |
---|---|---|---|
$0,2$ | $0,6$ | $0,5$ | $0,3$ |
$0,6$ | $0,2$ | $0,5$ | $0,3$ |
Sensibilidad | Precisión | β | $F_{2}\text{-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 (0,2) el resultado es más bajo aun (0,23) mientras que con una alta sensibilidad (0,6) el valor es mayor (0,43)
Sensibilidad | Precisión | β | $F_{0.5}\text{-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 (0,2) el resultado es más bajo aun (0,23) mientras que con una alta precisión (0,6) el valor es mayor (0,43)
Más información:
¿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 que la precisión.
Para calcular la $\beta$ se usa la regla de:
$$ \beta=\sqrt{n} $$
$$ \beta=\sqrt{\frac{1}{n}} $$
Veamos ahora ejemplo de valores alto y bajos de β.
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
).
metrics=[tf.keras.metrics.FBetaScore(beta=2.0)]
history.history['fbeta_score'] history.history['val_fbeta_score']
Más información: