Experimentos con el paquete gbm

No conocía el paquete gbm. Pero como ahora ando rodeado de data scientists que no son estadísticos…

Bueno, la cuestión es que había que ajustar un modelo para el que yo habría hecho algo parecido a

dat <- read.csv("http://www.ats.ucla.edu/stat/data/poisson_sim.csv")
summary(m.glm <- glm(num_awards ~ prog + math, family = "poisson", data = dat))
# Call:
#   glm(formula = num_awards ~ prog + math, family = "poisson", data = dat)
# 
# Deviance Residuals: 
#   Min       1Q   Median       3Q      Max  
# -2.1840  -0.9003  -0.5891   0.3948   2.9539  
# 
# Coefficients:
#   Estimate Std. Error z value Pr(>|z|)    
# (Intercept) -5.578057   0.676823  -8.242   <2e-16 ***
#   prog         0.123273   0.163261   0.755     0.45    
# math         0.086121   0.009586   8.984   <2e-16 ***
#   ---
#   Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# 
# (Dispersion parameter for poisson family taken to be 1)
# 
# Null deviance: 287.67  on 199  degrees of freedom
# Residual deviance: 203.45  on 197  degrees of freedom
# AIC: 385.51
# 
# Number of Fisher Scoring iterations: 6

como en esta página.

La alternativa con el paquete gbm es esta:

library(gbm)
summary(m.gbm <- gbm(num_awards ~ prog + math, distribution = "poisson", data = dat))
# var rel.inf
# math math     100
# prog prog       0
 
m.gbm
# gbm(formula = num_awards ~ prog + math, distribution = "poisson", 
#     data = dat)
# A gradient boosted model with poisson loss function.
# 100 iterations were performed.
# There were 2 predictors of which 1 had non-zero influence.

El resultado es bastante sorprendente. Al menos, a mí me sorprende. Así que voy a tratar de invertir un tiempo estos días tratando de entender:

  • Cómo funciona gbm
  • Si la selección de variables que parece que realiza internamente es útil (véase esto)
  • Y, sobre todo, por qué demonios glm y gbm no se ponen de acuerdo en cuál es la variable menos relevante en el modelo.

Mientras tanto, si algún lector tiene alguna pista sobre la respuesta a alguna de las preguntas anteriores…

7 comentarios sobre “Experimentos con el paquete gbm

  1. Otto F. Wagner 6 febrero, 2014 10:54

    He mirado «muy por encima» la ayuda del paquete y usa un algoritmo de AdaBoost. Cómo no soy ni matemático ni estadístico pero me encantan estas cosas mi curiosidad me ha llevado a Google y en la Wikipedia se expone lo siguiente:

    «AdaBoost is adaptive in the sense that subsequent classifiers built are tweaked in favor of those instances misclassified by previous classifiers. AdaBoost is sensitive to noisy data and outliers. In some problems, however, it can be less susceptible to the overfitting problem than most learning algorithms suffer from. The classifiers it uses can be weak (i.e., display a substantial error rate), but as long as their performance is slightly better than random (i.e. their error rate is smaller than 0.5 for binary classification), they will improve the final model. Even classifiers with an error rate higher than would be expected from a random classifier will be useful, since they will have negative coefficients in the final linear combination of classifiers and hence behave like their inverses»

    Lo que me hace pensar es que lo que influya son el tratemiento de los outliers, por ejemplo.

    Saludos!

  2. José Luis 6 febrero, 2014 12:36

    ¿Habéis probado el paquete MuMIN ?
    partiendo de un modelo
    ajusta todos los posibles modelos con menos parámetros y calcula el criterio de información de Akaike de segundo orden , AICc (Burnham and Anderson, 2002). Tiene una función importance que devuelve la importancia relativa de cada variable.

  3. Isidro Hidalgo 7 febrero, 2014 3:29

    Hay varias cosas que comentar. PRIMERO: si puedes modelizarlo estadísticamente con glm, ¿para que se complican la vida tus colegas «data scientists»? SEGUNDO: ¿Es posible que la «Loss function» de la distribución de Poisson tenga mínimos locales? Si así fuera, pudiera ser que el «gradient descent» te llevara a un mínimo local, que afecte a los valores de los coeficientes ¿lo has lanzado unas cuántas veces para descartarlo? TERCERO: hay varios parámetros a optimizar: nº de iteraciones y shrinkage principalmente. Éste último aconsejan bajarlo, siempre que no se alargue mucho el tiempo de ejecución. Y el nº de iteraciones óptimo lo puedes determinar con validación cruzada con la función gbm.perf().
    RESUMIENDO: para mí lo que dice glm() va a Misa. Lo otro intuyo que es dar palos de ciego. Porque, si visualizando los datos ves que Poisson se acerca a la distribución que tienes, ¿por qué narices no utilizar glm? Me debo estar perdiendo algo, pero estoy realmente intrigado… Ya nos contarás…

  4. David Hervás 9 febrero, 2014 11:51

    Para mí, en este caso donde la aplicación de glm no presenta ningún problema, ni me plantearía utilizar gbm. Otra cosa sería cuando tenemos un elevado número de variables (o incluso p>n), entonces sí que recurro a soluciones como random forest, elastic net o gbm.
    Un saludo

  5. David Hervás 9 febrero, 2014 20:24

    Por curiosidad he mirado los datos, ¿es posible que la variable «prog» sea un factor ordinal? En este caso resulta que las dos variables serían buenos predictores:

    summary(m.glm <- glm(num_awards ~ ordered(prog) + math, family = "poisson", data = dat))

Los comentarios están desabilitados.