28 votos

Medición de la precisión de un modelo basado en la regresión logística

Tengo un modelo de regresión logística entrenado que estoy aplicando a un conjunto de datos de prueba. La variable dependiente es binaria (booleana). Para cada muestra del conjunto de datos de prueba, aplico el modelo de regresión logística para generar un % de probabilidad de que la variable dependiente sea verdadera. Luego registro si el valor acutal era verdadero o falso. Intento calcular un $R^2$ o ajustado $R^2$ como en un modelo de regresión lineal.

Esto me da un registro de cada muestra en el conjunto de pruebas como:

prob_value_is_true         acutal_value
   .34                          0
   .45                          1
   .11                          0
   .84                          0
    ....                        ....          

Me pregunto cómo probar la precisión del modelo. Mi primer intento fue usar una tabla de contingencia y decir "si prob_value_is_true > 0,80, adivina que el valor real es verdadero" y luego mide la proporción de clasificaciones correctas a incorrectas. Pero no me gusta eso, porque parece más bien que estoy evaluando el 0,80 como un límite, no la exactitud del modelo en su conjunto y en absoluto prob_value_is_true valores.

Luego traté de mirar cada valor discreto prob_value_is_true, como un ejemplo, mirando todas las muestras donde prob_value_is_true =0,34 y midiendo el % de esas muestras donde el valor acutal es verdadero (en este caso, la exactitud perfecta sería si el % de las muestras que fuera verdadero = 34%). Podría crear un puntaje de exactitud del modelo sumando la diferencia en cada valor discreto de prob_value_is_true . Pero los tamaños de las muestras son una gran preocupación aquí, especialmente para los extremos (cerca del 0% o 100%), de tal manera que los promedios de los valores acutales no son exactos, por lo que usarlos para medir la exactitud del modelo no parece correcto.

Incluso intenté crear enormes rangos para asegurar suficientes tamaños de muestra (0-.25, .25-.50, .50-.75, .75-1.0), pero la forma de medir la "bondad" de ese % del valor real me deja perplejo. Digamos que todas las muestras donde prob_value_is_true está entre 0,25 y 0,50 tienen un promedio acutal_value de 0,45. ¿Es eso bueno ya que está en el rango? ¿Malo ya que no está cerca del 37.5% (el centro del rango)?

Así que estoy atascado en lo que parece que debería ser una pregunta fácil, y esperando que alguien pueda señalarme un recurso o método para calcular una estadística de precisión para un modelo de regresión logística.

0 votos

Creo que el ejemplo de los rangos: (0-.25, .25-.50, .50-.75, .75-1.0) tienen sentido. ¿Sería útil si se reducen los rangos? Por ejemplo: 0-.03, .03-.06, .06-.09,..... es decir, cada .03. Esto podría ser útil para las regiones con muchos puntos de datos.

19voto

pkaeding Puntos 12935

Una medida que se suele utilizar para validar la regresión logística, es el AUC de la Curva ROC (gráfico de la sensibilidad frente a la 1-especificidad - sólo hay que buscar los términos en Google si es necesario). Esto, en esencia, evalúa toda la gama de valores de umbral.

En el lado negativo: la evaluación de toda la gama de valores de umbral puede ser no lo que buscas, ya que esto (normalmente) incluye umbrales que dan lugar a un gran número de falsos negativos o falsos positivos. Hay versiones del AUC que tienen en cuenta esto (AUC parcial), así que si eso es un problema para ti, puedes investigarlo.

1 votos

Dejando de lado el AUC por un momento, ¿estoy en lo cierto al suponer que la construcción de la curva ROC es algo así? Para cada valor discreto de prob_value_is_true, cree una tabla de contingencia utilizando el valor discreto como umbral. A continuación, registre la tasa de verdaderos positivos y la tasa de falsos positivos de cada tabla de contingencia. Represente las tasas de todas las tablas de contingencia en un gráfico de dispersión y debería ver la curva ROC. ¿Te parece correcto?

0 votos

He montado un código para hacer esto, simplemente alimentando valores aleatorios como la probabilidad y el valor real, y era una línea recta. Supongo que el AUC mide la desviación de la "curva" de un modelo ajustado frente a la "línea" o al azar.

0 votos

En cuanto a la ROC: sí, es más o menos así. Hay algunas variantes (más o menos suavizadas; teniendo en cuenta las probabilidades previstas para su elección de umbrales o no). Tenga en cuenta que (dependiendo del software/lenguaje que utilice) hay una miríada de herramientas que ya proporcionan esto. En cuanto al AUC, no es ni más ni menos que el área real bajo la curva ROC. No es el con un predictor aleatorio perfecto, la curva ROC sería una línea recta de (0,0) a (1,1), resultando en un AUC de 0,5. Sin embargo, el AUC tiene algunas buenas interpretaciones (véase Google o Wikipedia incluso :-) )

13voto

dan90266 Puntos 609

Si utilizas un divisor de tensión con resistencias de valor bastante alto, por ejemplo, dos de 499K en serie y derivas el centro, tu tensión máxima será de 4,5v y sólo consumirá 9 µA.

Si incluso esa cantidad de corriente fuera una preocupación, podrías atar la parte inferior del divisor de resistencia a un pin de salida de drenaje abierto en el microcontrolador y ponerlo a tierra sólo cuando necesites tomar una medida. En ese caso, podrías arreglártelas con resistencias de menor valor.

EDITAR:

Como menciona Russel McMahon, muchos micros no permitirán que la entrada del ADC suba mucho por encima de su tensión de alimentación (VDD), lo que ocurriría al quitar la tierra en el divisor de resistencias. Así que necesitarías un interruptor de lado alto en su lugar.

0 votos

Sé que este post es antiguo, pero ¿ningún comentario sobre las reglas de puntuación adecuadas? ¿Por qué prefieres $c$ -index sobre la puntuación de Brier o la pérdida del registro?

0 votos

No prefiero el índice c, aunque es un índice complementario útil para cuantificar la discriminación predictiva pura de un solo modelo. Las reglas de puntuación adecuadas son las primeras opciones.

0 votos

Así que no hay que tomarse demasiado en serio una diferencia en los índices c de los modelos del 90% frente al 91%, pero si obtengo una puntuación tan alta, hay que saber que he escrito un par de modelos que tienen una buena capacidad de discriminación. ¿Algo así?

11voto

Sean Hanley Puntos 2428

Si sus datos están agrupados por $x$ puede calcular el valor predicho por el modelo y su intervalo de confianza asociado, y ver si el porcentaje observado cae dentro de ese rango. Por ejemplo, si tiene 10 observaciones en $x=10$ , 10 obs en $x=20$ , 10 obs en $x=30$ etc., entonces mean(y[x==10]==1) , mean(y[x==20]==1) etc., se obtendrían porcentajes que pueden compararse con las predicciones. Tenga en cuenta que, incluso si el modelo es perfecto, algunos porcentajes observados se quedarán fuera del IC del 95%, al igual que en la regresión OLS. Si sus datos no están agrupados, puede formar sus propios grupos agrupando los datos según los rangos del $x$ como sugieres. Esto no es totalmente válido, ya que dependerá de la elección de los bins, puede ser útil como una forma de explorar su modelo.

En general, la tarea que se ha encomendado aquí es difícil. Esto se debe a que, con la regresión logística, está tratando con dos tipos de cosas diferentes. Las predicciones del modelo son una variable latente, mientras que su variable de respuesta observada (aunque presumiblemente generada por una variable latente) no lo es. Por supuesto, la gente a menudo querrá saber cuál es la respuesta predicha, y eso es totalmente razonable; éste es sólo uno de esos casos en los que la vida no es justa.

Si quieres predecir el resultado, tienes que decidir qué quieres maximizar. Si sólo tiene un caso, y quiere que su predicción tenga la mayor probabilidad de ser correcta, debería predecir $y=1$ , si $\hat y\ge .5$ . (Todo esto es bastante intuitivo.) Por otro lado, si quiere maximizar la precisión global sobre su muestra total (o cualquier otro grupo), debe predecir $y=1$ , si $\hat y \ge p(y=1)$ . Por ejemplo, digamos que en su muestra, el 30% de todos los casos son 1's, entonces si $\hat y = .31$ , debería predecir que $y$ será $1$ Aunque se trata de $<.5$ . Esto es contrario a la intuición, y mucha gente tropieza aquí, pero este algoritmo maximizará su precisión.

Una forma más completa de pensar en la cantidad de información que hay en su modelo, es integrar sobre la precisión que tendría dado cada umbral posible $(0, 1)$ . Se trata del área bajo la curva (AUC) de la característica operativa del receptor (ROC) del modelo, analizada por @Nick Sabbe. Recuerde que no hay $R^2$ para la regresión logística. Existen los llamados "pseudo $R^2$ pero el AUC (o la concordancia, $c$ , un sinónimo) es probablemente la mejor manera de pensar en esta cuestión.

0 votos

¡Gran respuesta! Entonces, en el ejemplo de que el 30% de todos los casos son 1, la probabilidad predicha de 0,31 de un caso particular es como un "ranking" de este caso en relación con otros casos sobre lo cerca que está de 1 (cuanto más grande, más cerca)? ¿Y no debería verse como la probabilidad predicha de que este caso particular sea 1?

1 votos

No estoy seguro de seguirte, @JunchiGuo. El $\hat y_i = .31$ significa que la probabilidad prevista de ser $1$ es $.31$ . Sin embargo, puedes clasificar las observaciones en función de sus probabilidades previstas, & $.31$ se situaría por encima de $.25$ , por ejemplo.

3voto

YequalsX Puntos 320

Creo que podría establecer un umbral (digamos 0,5), de modo que cuando su probabilidad sea igual o mayor que ese umbral su clase predicha sería 1, y 0 en caso contrario. Entonces, podrías obtener una medida de tu precisión de esta manera:

confusion_matrix <- ftable(actual_value, predicted_value)
accuracy <- sum(diag(confusion_matrix))/number of events*100

Dado que su probabilidad es la probabilidad de que dados sus datos (x) y utilizando su modelo su valor de clase (y) sea igual a 1, no entiendo por qué siempre obtiene valores de probabilidad inferiores a 0,5. ¿Cuál es la frecuencia de tus clases reales (valor_real)?

1voto

kbrinley Puntos 664

Esta es mi sugerencia rápida: Como su variable dependiente es binaria, puede suponer que sigue una distribución Bernoulli, con una probabilidad dada por la regresión logística $Pr_{i} = invlogit(a + bx_{i})$ .

Ahora, establece una simulación como la siguiente: $ y.rep[i] \sim Bernoulli (p[i])$

Luego, ejecute esta simulación, digamos, 100 veces. Tendrá una matriz con n filas (n es el número de sujetos) y k columnas (en este caso, k=100, el número de simulaciones). En código r:

for (j  in 1:100)
  mat.y.rep[,j] <- Bernoulli ( p) # p is a vector with a probability for each subject

Ahora se calcula la diferencia entre lo predicho en cada simulación y lo observado. Después de calcular esta diferencia, sólo hay que calcular el número medio de verdaderos y falsos positivos para cada fila (cada sujeto) y trazar el histograma. O calcule ambos para cada columna (simulación) y trace el histograma (yo prefiero esto).

Espero que ayude...

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