4 votos

¿Cómo puedo convertir el resultado de una regresión logística en un conjunto de clases?

Tengo una regresión logística $\text{logit} ( p_i ) = \beta_0 + \sum_j \beta_j x_{ij}$ con una variable de respuesta binaria de la que me gustaría formar una especie de tabla de puntuación. Con la creación de un cuadro de mando me refiero simplemente a tomar el resultado de la regresión logística y dividirlo, cortarlo o dividirlo de otra manera para determinar (a) si se debe tomar una acción, y luego (b) a qué escala se debe tomar la acción (por ejemplo, si (a) se debe hacer un préstamo y (b) a qué tipo de interés se debe hacer).

Una forma de manejar (a) es transformar mi salida en una probabilidad $p$ para cada observación y luego tomar $(1-p)$ multiplicado por, digamos, 1000 para obtener una puntuación $0 \leq s \leq 100$ de la que (creo) puedo tomar el estadístico K-S como límite.

Creo que este es probablemente un método bastante débil al menos porque sólo estoy obteniendo un corte y no un conjunto de bins por encima del corte con el que calificar aún más las observaciones.

Teniendo esto en cuenta, tengo dos preguntas:

1) ¿Cómo mejorarías el método anterior?

2) ¿Cuáles son algunas formas de pasar de los resultados de (a) a (b)?

0 votos

Las regresiones logísticas suelen estar bien calibradas. ¿Ha comprobado la calibración de su modelo? Además, ¿podría ampliar/definir la "tarjeta de puntuación"? Podría utilizar el resultado de la regresión logística como puntuación [0-1] y multiplicarlo por 100. Pero si "scorecard" implica más bien un corte rojo/amarillo/verde o rojo/verde, eso es otra cuestión.

0 votos

@Wayne Actualizó la pregunta en un esfuerzo por ser más específico sobre lo que estoy buscando.

0 votos

Bien, gracias. ¿Cuál es el objetivo de la regresión logística? Supongo que algo así como "préstamo exitoso" o "préstamo malo", por lo que está queriendo dividir la salida de la regresión logística [0,1] en bandas de algo así como "Riesgo alto -- Ningún préstamo", "Riesgo medio -- Préstamo con mayor tasa de interés", o "Riesgo bajo -- Préstamo con menor tasa de interés". ¿Es ese el objetivo y su meta con la salida? Si su objetivo es, por ejemplo, "Préstamo malo" y su regresión está bien calibrada, sólo necesita que las PYMES decidan en qué puntos de probabilidad (en [0,1]) quieren cortar las cosas.

4voto

fcop Puntos 2891

Deberías probar una técnica llamada ''regresión logística ordenada''; mientras que la regresión logística tiene un resultado binario como variable dependiente, la ''regresión logística ordenada'' tiene un resultado categórico ordenado como variable dependiente.

Así que si tienes datos históricos sobre el $x_{ij}$ y datos históricos sobre la clase de salida como ''ningún préstamo concedido'', ''préstamo de alto interés concedido'' 'préstamo de bajo interés concedido', ... (ordenado), entonces puede aplicar la regresión logística ordenada.

El resultado de la regresión logística ordenada son las estimaciones para el $\beta$ 's pero también los puntos de corte .

Así que utilizando la regresión logística ordenada podrá calcular una puntuación (una probabilidad o un número real (el logaritmo de la probabilidad)) y luego también le dan umbrales $T_1, T_2, ...$ . Estos umbrales se estiman mediante la regresión logística ordenada, por lo que después de estimar se sabe que estos .

Utilizando la puntuación y los umbrales podrá predecir el resultado, es decir, uno de los siguientes (véase supra): ''no se concede el préstamo'', ''se concede el préstamo con un interés alto'', ''se concede el préstamo con un interés bajo'', ... (ordenado).

Por ejemplo, le dirá que si la puntuación está entre los umbrales $T_i=4$ y $T_{i+1}=9$ (los números son sólo ejemplos de lo que puede dar la estimación, por lo que el 4 y el 9 salen de la estimación) entonces es ''préstamo de alto interés concedido'' (sólo un ejemplo de cómo se puede predecir).

En R se puede hacer utilizando la función polr función.

1 votos

¡Buen enfoque! En R, el valor por defecto sería polr en el paquete MASS pero también se puede utilizar un enfoque bayesiano con rstanarm 's polr o utilizar brm en el paquete brms . (Ambas opciones utilizan Stan bajo el capó).

1voto

rst Puntos 1

Digamos que usted ha dividido sus datos en tren (desarrollo) y prueba, ha elegido algunos intervalos óptimos para sus variables y ha creado su modelo de regresión logística, y su objetivo es "préstamo que va mal" (crédito a @Wayne).

El modelo le dará la probabilidad de que un préstamo sea incobrable. Por supuesto, se puede multiplicar por 1.000 para crear una mayor "sensación de puntuación", lo que también es bueno cuando se presenta a personas que no tienen formación estadística (lo hace un poco más sencillo).

Ahora bien, cuando se quiere elegir un punto de corte (en la puntuación) para tomar medidas, esto se convierte en un proceso muy subjetivo, y yo no recomendaría tomar la estadística KS como punto de corte.

Lo que suelo hacer es que divido mis datos en mosaicos iguales, 10 mosaicos la mayoría de las veces, puedes ir a 20 también si quieres obtener una mirada más refinada de tu modelo.

Si se hace un mosaico, los datos se dividirán de forma equitativa y se podrán representar las probabilidades predichas frente a las observadas, lo que también puede servir para comprobar la calidad del modelo. Si hay un elemento de efectivo (por ejemplo, si se trata de ver si alguien va a devolver su préstamo, y se tiene una variable de efectivo que indica cuánto ha pagado), también se puede observar la distribución de efectivo en los mosaicos.

Ya he creado una función que crea su tabla de mosaicos y emite el gráfico que pegaré al final de esta respuesta. Pero los mosaicos pueden ser utilizados como una gran guía para la elección de sus puntos de corte, ya que crea un conjunto de grupos y se puede elegir qué grupos le gustaría centrarse en. Obviamente, asegúrese de hacer lo mismo con sus datos de prueba para asegurarse de que sus resultados son sólidos.

Si no he sido lo suficientemente claro, pregunte. Espero que esto haya servido de ayuda.

donde model is the name of your model y is your target variable cash is your cash variable df is your dataset / dataframe mt and st are main title and sub title respectively

tile <- function(model, y = ds1$target, cash = NULL, df = ds1, mt = "Model Lift Chart", st = " ") {
  require(dplyr)

  p1 <- predict(model, df, type = "response")
  pred <- df$pred <- p1

  df$Tile <- ntile(pred , 10)

  if (is.null(cash)) {
  predict <- aggregate(pred, by=list(Tile = df$Tile), FUN=mean)
  observed <- aggregate(y, by=list(Tile = df$Tile), FUN=mean)
  count <- aggregate(pred, by=list(Tile = df$Tile),FUN=length)

  lift_mod <- data.frame(cbind(predict, observed, count))
  lift_mod$Tile.1 <- NULL
  lift_mod$Tile.2 <- NULL
  lift_mod$predict <- lift_mod$x
  lift_mod$observed <- lift_mod$x.1
  lift_mod$count <- lift_mod$x.2
  lift_mod$x <- NULL
  lift_mod$x.1 <- NULL
  lift_mod$x.2 <- NULL
  } else {
    predict <- aggregate(pred, by=list(Tile = df$Tile), FUN=mean)
    observed <- aggregate(y, by=list(Tile = df$Tile), FUN=mean)
    Cash_Mean <- aggregate(cash, by=list(Tile = df$Tile), FUN=mean) 
    count <- aggregate(pred, by=list(Tile = df$Tile),FUN=length)

    lift_mod <- data.frame(cbind(predict, observed, Cash_Mean, count))
    lift_mod$Tile.1 <- NULL
    lift_mod$Tile.2 <- NULL
    lift_mod$Tile.3 <- NULL
    lift_mod$predict <- lift_mod$x
    lift_mod$observed <- lift_mod$x.1
    lift_mod$Cash_Mean <- lift_mod$x.2
    lift_mod$count <- lift_mod$x.3
    lift_mod$x <- NULL
    lift_mod$x.1 <- NULL
    lift_mod$x.2 <- NULL
    lift_mod$x.3 <- NULL
  }
  print(lift_mod)
  a <- sum(lift_mod$Cash_Mean[1:3])/sum(lift_mod$Cash_Mean)
  b <- sum(lift_mod$Cash_Mean[8:10])/sum(lift_mod$Cash_Mean)
  print(sprintf("Bottom 3 = %.*f", 3, a))
  print(sprintf("Top 3 = %.*f", 3, b))
  mplot(lift_mod$Tile, lift_mod$predict, lift_mod$observed, mt=mt, st=st, xl = "Tile", yl = "Output")
  legend(x = "topleft", legend = c("Predict", "Actual"), lty = c(1, 1), col = c("steelblue2", "firebrick2"), pch = 19)
  t <- lift_mod$observed
  v <- t[2]
  w <- t[8]
  text(2, v, sprintf("Bottom 3 = %.*f%s", 1, a*100, "%"), col = "forestgreen", pos = 3, cex = 1.1)
  text(8, w, sprintf("Top 3 = %.*f%s", 1, b*100, "%"), col = "forestgreen", pos = 3, cex = 1.1)
  z <- lift_mod
}

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