10 votos

Cálculo de la precisión y la recuperación en R

Supongamos que estoy construyendo un clasificador de regresión logística que predice si alguien está casado o soltero. (1 = casado, 0 = soltero) Quiero elegir un punto en la curva de precisión-recuerdo que me dé al menos un 75% de precisión, por lo que quiero elegir umbrales $t_1$ y $t_2$ para que..:

  • Si el resultado de mi clasificador es mayor que $t_1$ , salgo "casado".
  • Si el resultado es inferior a $t_2$ , yo salgo "soltero".
  • Si la salida está en el medio, doy un "no sé".

Un par de preguntas:

  1. Creo que, según la definición estándar de precisión, se medirá la precisión de la clase de casados únicamente (es decir, precisión = # de veces que predigo correctamente casados / # total de veces que predigo casados). Sin embargo, lo que realmente quiero hacer es medir la precisión global (es decir, el total de veces que predigo correctamente casado o soltero / el total de veces que predigo casado o soltero). ¿Está bien hacer esto? Si no, ¿qué debería hacer?
  2. ¿Hay alguna manera de calcular esta curva "global" de precisión/recuperación en R (por ejemplo, utilizando el paquete ROCR o alguna otra biblioteca)? Actualmente estoy utilizando el paquete ROCR, pero parece que sólo me da la precisión/recuperación de una sola clase a la vez.

9voto

zm15 Puntos 320

Escribí una función para este propósito, basada en el ejercicio del libro Data Mining with R:

# Function: evaluation metrics
    ## True positives (TP) - Correctly idd as success
    ## True negatives (TN) - Correctly idd as failure
    ## False positives (FP) - success incorrectly idd as failure
    ## False negatives (FN) - failure incorrectly idd as success
    ## Precision - P = TP/(TP+FP) how many idd actually success/failure
    ## Recall - R = TP/(TP+FN) how many of the successes correctly idd
    ## F-score - F = (2 * P * R)/(P + R) harm mean of precision and recall
prf <- function(predAct){
    ## predAct is two col dataframe of pred,act
    preds = predAct[,1]
    trues = predAct[,2]
    xTab <- table(preds, trues)
    clss <- as.character(sort(unique(preds)))
    r <- matrix(NA, ncol = 7, nrow = 1, 
        dimnames = list(c(),c('Acc',
        paste("P",clss[1],sep='_'), 
        paste("R",clss[1],sep='_'), 
        paste("F",clss[1],sep='_'), 
        paste("P",clss[2],sep='_'), 
        paste("R",clss[2],sep='_'), 
        paste("F",clss[2],sep='_'))))
    r[1,1] <- sum(xTab[1,1],xTab[2,2])/sum(xTab) # Accuracy
    r[1,2] <- xTab[1,1]/sum(xTab[,1]) # Miss Precision
    r[1,3] <- xTab[1,1]/sum(xTab[1,]) # Miss Recall
    r[1,4] <- (2*r[1,2]*r[1,3])/sum(r[1,2],r[1,3]) # Miss F
    r[1,5] <- xTab[2,2]/sum(xTab[,2]) # Hit Precision
    r[1,6] <- xTab[2,2]/sum(xTab[2,]) # Hit Recall
    r[1,7] <- (2*r[1,5]*r[1,6])/sum(r[1,5],r[1,6]) # Hit F
    r}

Donde para cualquier tarea de clasificación binaria, esto devuelve la precisión, el recuerdo, y F-stat para cada clasificación y la exactitud global así:

> pred <- rbinom(100,1,.7)
> act <- rbinom(100,1,.7)
> predAct <- data.frame(pred,act)
> prf(predAct)
      Acc     P_0       R_0       F_0       P_1       R_1       F_1
[1,] 0.63 0.34375 0.4074074 0.3728814 0.7647059 0.7123288 0.7375887

Calcular la P, R y F de cada clase de esta manera te permite ver si una u otra te está dando más dificultad, y es fácil luego calcular las estadísticas generales de P, R y F. No he utilizado el paquete ROCR, pero podrías obtener fácilmente las mismas curvas ROC entrenando el clasificador sobre el rango de algún parámetro y llamando a la función para clasificadores en puntos a lo largo del rango.

0 votos

Creo que tienes el código de precisión y el de recuperación intercambiados. Debería ser r[1,5] <- xTab[2,2]/suma(xTab[2, ])

8voto

Xenph Yan Puntos 20883

Como bien dijo Robert, Precisión es el camino a seguir. Sólo quiero añadir que es posible hacer el cálculo con ROCR. Echa un vistazo a help(performance) para seleccionar diferentes medidas.

Por ejemplo, en ROCR sólo se utiliza un umbral de decisión que se denomina corte . El siguiente código traza la precisión frente al corte y extrae el corte para la máxima precisión.

require(ROCR)

# Prepare data for plotting
data(ROCR.simple)
pred <- with(ROCR.simple, prediction(predictions, labels))
perf <- performance(pred, measure="acc", x.measure="cutoff")

# Get the cutoff for the best accuracy
bestAccInd <- which.max(perf@"y.values"[[1]])
bestMsg <- paste("best accuracy=", perf@"y.values"[[1]][bestAccInd], 
              " at cutoff=", round(perf@"x.values"[[1]][bestAccInd], 4))

plot(perf, sub=bestMsg)

lo que resulta en

enter image description here

Para operar con dos umbrales con el fin de crear una región media de incertidumbre (que es una forma válida de hacerlo si las circunstancias / la aplicación de destino lo permiten) se pueden crear dos objetos de rendimiento con ROCR

  1. corte frente a la tasa de verdaderos positivos (tpr), es decir, la precisión de la clase positiva
  2. corte frente a la tasa de verdaderos negativos (tnr), es decir, la precisión de la clase negativa

Selecciona un corte adecuado de los vectores de rendimiento (utilizando el método R que) y combínalos para lograr el equilibrio deseado. Esto debería ser sencillo, por lo que lo dejo como ejercicio para el lector.

Una última nota: ¿Cuál es la diferencia entre la exactitud y el cálculo de la precisión para ambas clases por separado y, por ejemplo, combinarlas en una media (ponderada)?

La precisión calcula una media ponderada, en la que el peso de la clase c es equivalente al número de instancias con la clase c. Esto significa que si se sufre una fuerte asimetría de clases (98% de negativos, por ejemplo) se puede simplemente "optimizar" la precisión estableciendo la predicción de la etiqueta negativa para todas las instancias. En tal caso, una media simple no ponderada de las precisiones de ambas clases evita el juego de la métrica. En el caso de clases equilibradas, ambos métodos de cálculo conducen, por supuesto, al mismo resultado.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X