Explicación de los scorings de «ciertos» modelos

Esta entrada la hago por petición popular y para rematar de alguna manera lo que incoé hace unos días. Seré breve hasta lo telegráfico:

  1. Tomo las observaciones con scorings más altos (en un árbol construido con ranger y cariño).
  2. Veo cuáles son los árboles que les asignan scorings más altos.
  3. Anoto las variables implicadas en las ramas por donde bajan las observaciones (1) en los árboles (2).
  4. Creo una matriz positiva: filas = casos, columnas = variables, valores = conteos.
  5. Y la descompongo (vía NMF).
  6. Etc.

Es hasta paquetizable.

Notas:

  • No me interesa (al menos en el caso de uso que motivó el desarrollo del algoritmo anterior) explicar todas las predicciones sino solamente las que tienen scorings más altos. El resto, no se usan para nada.
  • Los métodos al uso para explicar predicciones lo hacen en términos de las variables del modelo. Sin embargo, los usuarios finales de la explicación pueden no tener mucha idea de qué puede llegar a significar una variable como max_call_device_usage_period. Porque también existen conjuntos de datos que no son Titanic. Se hace necesario postprocesar reglas basadas en la intervención de variables de ese estilo en motivos comprensibles.
  • Podría añadirse el sentido del corte en las variables, es decir, registrar no solo que la observación ha pasado por una bifurcación de un árbol en que interviene edad sino también si lo ha hecho por la rama del > o del <.

4 comentarios sobre “Explicación de los scorings de «ciertos» modelos

  1. Jose Luis Cañadas Reche 15 octubre, 2020 20:13

    El último paso lo de ver si es izqda o derecha no lo había pensado , pero molaría.

  2. emilio 16 octubre, 2020 13:31

    Gracias por compartir tu sabiduría. Mi ignorancia aumenta cada día.

    ¿A partir de rg$predictions y de ranger::treeInfo obtuviste los registros y las variables más representativas del Random Forest? ¡Menudo trabajo!


    library(titanic) # Data
    library(ranger) # Random forest

    titanic <- titanic_train[!is.na(titanic_train$Age),] ## remove missing data
    rg <- ranger(Survived ~ ., data = titanic, importance = "impurity",write.forest=TRUE,keep.inbag=TRUE)
    summary(rg)

    head(rg$predictions) ## Check the most scored values
    rg$num.trees ## (500 trees)
    treeInfo(rg,3) ## Analyse this tree

  3. Jose Luis Cañadas Reche 20 octubre, 2020 8:09

    No es tan duro. Yo me entretuve en hacerlo una tarde.
    Funciones para sacar nodos terminales dado un árbol, guardar las variables(nodos padres) que llevan a cada nodo y luego iterar. Se puede paralelizar también. Pero la idea genial desde luego es de Carlos. Muy interesante.

Comenta

Your email address will not be published.

Puedes usar estas etiquetas y atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.