Sobre el artículo de Domingos

Leí el otro día A Few Useful Things to Know about Machine Learning de Pedro Domingos, que me dejó ojiplático. Os cuento por qué.

El artículo yuxtapone una serie de temas (debidamente organizados en secciones independientes) tales como:

  • Lo que cuenta es la generalización
  • Que, por eso, los datos no son suficientes y hacen falta modelos testables
  • Que el overfitting es un problema serio
  • Que en dimensiones elevadas pasan cosas raras
  • Que hay que tener cuidado con la teoría (en particular, los resultados asintóticos)
  • Que hay que elegir muy bien las variables (las llama features) de los modelos
  • Que es bueno combinar modelos
  • Que la correlación no implica causalidad
  • Etc.

Cosas todas, como se puede apreciar, muy razonables. Por lo que el artículo no habría estado mal hace treinta o cuarenta años. Pero, desafortunadamente, es del 2012.

Selección de enlaces: censos, el Titanic, periodistas y mapas

El primer enlace de la selección de esta semana es The evolution of the modern census. Todos sabemos que lo que llevó a José y María a Belén hace más de 2000 años fue dizque tenían que censarse. Hay noticias de censos anteriores. Desde entonces hasta ahora ha habido muchos, muchísimos censos, pero su mismo concepto y finalidad ha ido cambiando a lo largo de la historia: ya no se trata solamente de contar, medir la riqueza o el poderío militar. Ahora nos interesan otros aspectos relacionados ya no tanto con el cuántos sino con el cómo somos.

El escritor exemplar

Nlp, R

El escritor exemplar es un experimento de escritura automática realizado por Molino de Ideas sobre una idea de Mario Tascón y con la colaboración de Carlos J. Gil Bellosta en conmemoración por los 400 años de la publicación de Las Novelas Ejemplares.

Eso reza el pie de página de El escritor exemplar un artilugio que a veces crea frases tales como

escritor_exemplar

que debieran ser aleatorias, no muy distintas en estilo de las Novelas Ejemplares y, con muchísima suerte, inspiradoras.

Veinte paquetes de R para científicos de datos

R

Me llegó recientemente un artículo con una lista de veinte paquetes de R para data scientists. Y no la encuentro afortunada. Voy a agrupar esos veinte paquetes en algunas categorías y añadiré comentarios. La primera de ellas es la de manipulación de datos, tal vez la más amplia, que recoge los siguientes: sqldf, plyr, stringr (para procesar texto), lubridate (para procesar fechas),reshape2 y los paquetes de acceso a bases de datos.

"Beautiful evidence", de Tufte

Acabo de leer Beautiful Evidence, el último de los libros de E. Tufte y voy a recoger aquí unas notas sobre él mismo. Espero que sirvan tanto a los interesados en el asunto como a mí mismo.

El libro consta de nueve capítulos prácticamente independientes entre sí. Los dos últimos son perfectamente prescindibles: están a medio caballo entre el autobombo y el márqueting; parece que Tufte es también escultor y no pierde ocasión de darlo a conocer. Tal vez por si entre nosotros sus lectores pudiera haber algún marchante de arte.

Guarjolización de fotos con R

Inspirado en esto aunque con la intención de mejorar el horrible código adjunto, escribí el otro día esto:

library("biOps")
library("cluster")

# leo una foto usando readJpeg de biOps
# el objeto devuelto es un array mxnx3 dimensional
# la última dimensión es el rgb de cada pixel

tmp <- tempfile()
download.file("http://blog.guiasenior.com/images/Retrato_Garber.jpg", tmp)
x <- readJpeg(tmp)

# si quieres mostrar la foto como un gráfico...
#plot(x)

# convertimos el array 3D nxmx3 en uno 2D (nm)x3
# luego buscamos 5 clústers
# esencialmente, buscamos 7 "píxels representativos"
d <- dim(x)
clarax <- clara(array(x, dim = c(d[1] * d[2], d[3])), 7)

# reemplazamos cada rgb de cada cluster por su
# "píxel representativo" (medioide) correspondiente
rgb.clusters <- clarax$medoids[clarax$cluster,]

# convertimos la matriz resultante en un array 3D
# (invirtiendo la transformación anterior)
# y representamos gráficamente
plot(imagedata(array(rgb.clusters, dim = d)))

Obviamente, podéis cambiar la foto y hacer variar el número de clústers. Pero conviene recordar que:

Victoria o diferencia de puntos, ahora con "random forests"

Después de hablar con tirios y troyanos sobre mi entrada sobre los efectos de binarizar una variable objetivo continua, he decidido tomarme la justicia por mi mano y llamar a la caballería. Es decir, utilizar random forests.

Aquí va el código:

library(randomForest)

set.seed(1234)

my.coefs <- -2:2
n <- 200
train.n <- floor(2*n/3)

test.error <- function(){
  X <- matrix(rnorm(n*5), n, 5)
  Y <- 0.2 + X %*% my.coefs + rnorm(n)
  Y.bin <- factor(Y>0)

  train <- sample(1:n, train.n)

  X <- as.data.frame(X)
  X$Y <- Y

  modelo <- randomForest(Y ~ .,
    data = X[train,])
  pred <- predict(modelo, X[-train,])
  error.cont <- length(pred) -
    sum(diag(table(pred >0, Y[-train]>0)))

  X$Y <- Y.bin
  modelo <- randomForest(Y ~ .,
    data = X[train,])
  pred <- predict(modelo, X[-train,])
  error.bin <- length(pred) -
    sum(diag(table(pred, Y.bin[-train])))

  data.frame(error.cont = error.cont,
    error.bin = error.bin)
}

errores <- do.call(rbind,
  replicate(1000, test.error(), simplify = F))

sapply(errores, fivenum)

El resultado, si te interesa, en tu pantalla.

¿Victoria o diferencia de puntos? ¿lm o glm?

Supongamos que queremos construir un modelo para predecir quién ganará un determinado partido de baloncesto basándonos en datos diversos. Y en un histórico, por supuesto.

Podemos utilizar una regresión logística así:

set.seed(1234)

my.coefs <- -2:2
n <- 200
train.n <- floor(2*n/3)

test.error.glm <- function(){
  X <- matrix(rnorm(n*5), n, 5)
  Y <- (0.2 + X %*% my.coefs + rnorm(n)) > 0

  train <- sample(1:n, train.n)

  X <- as.data.frame(X)
  X$Y <- Y

  mod.glm <- glm(Y ~ ., data = X[train,],
    family = binomial)

  glm.pred <- predict(mod.glm, X[-train,],
    type = "response")

  error <- length(glm.pred) -
    sum(diag(table(glm.pred > 0.5, Y[-train,])))
}

errores.glm <- replicate(1000, test.error.glm())

El código anterior hace lo siguiente:

El chocheo de los dioses

Uno tiene —o tuvo— dioses. Sentir admiración por alguien (y su obra) tiene, lo admito, una dimensión infantil. Es también, por supuesto, una sobre simplificación de la realidad. Porque la verdad no la escriben cuatro plumas: las ideas valiosas emergen por doquier. Desafortunadamente, nadie tiene tiempo para filtrar el flujo diario de noticias, libros, conceptos. Así que creo que es excusable que, por simplificar, uno eleve personal y subjetivamente a una serie de individuos a la categoría de dioses, de encargados de filtrar la información. De alguna manera, se conviertan en oráculos personales que desentrañan la complejidad del día a día y se convierten en fuente de preguntas y acaso respuestas.