|
Archivo
Entradas Etiquetadas ‘minería de datos’
Sigo con mi lacónica serie sobre data.table.
La protagonista:
frases[sample(1:nrow(frases), 3),]
#pos.es pos.en length.es length.en en es frase tfe qjilm num
#1: 15 43 72 72 i de 2632 4.881416e-02 0.01369863 6.686871e-04
#2: 33 48 46 48 X países 5321 2.726146e-06 0.02040816 5.563563e-08
#3: 2 35 53 66 in preguntar 4582 2.424379e-08 0.01492537 3.618476e-10
dim(frases)
#[1] 6340091 10
El tiempo:
system.time({
setkey(frases, "frase", "es")
denominadores <- frases[, sum(num), by = key(frases)]
setnames(denominadores, c("frase", "es", "den") )
frases <- merge(frases, denominadores)
frases$delta <- frases$num / frases$den
})
#user system elapsed
#5.628 0.208 5.841
En particular,
system.time( denominadores <- frases[, sum(num), by = key(frases)] )
#user system elapsed
#0.228 0.000 0.228
Increíble, ¿no?
Los protagonistas (tres tablas grandecitas):
dim(qjilm)
# [1] 3218575 5
dim(tf)
# [1] 6340091 7
dim(tfe)
#[1] 1493772 3
head(qjilm, 2)
#pos.es length.en length.es pos.en qjilm
#1 1 2 1 1 0.8890203
#2 1 2 1 2 0.1109797
head(tf, 2)
#frase es pos.es length.es en pos.en length.en
#1 996 ! 42 42 ! 43 44
#2 1231 ! 37 37 ! 37 38
head(tfe, 2)
#en es tfe
#1 ! ! 4.364360e-01
#2 ! !" 4.945229e-24
El objetivo (cruzarlas por los campos comunes):
El tiempo (usando merge):
res <- merge(merge(tf, tfe), qjilm)
#user system elapsed
#442.991 2.496 446.832
dim(res)
#[1] 6340091 9
Y con data.table:
library(data.table)
system.time({
res.dt <- merge(data.table( tf, key = c("en", "es")),
data.table( tfe, key = c("en", "es")) )
res.dt <- merge( setkeyv(res.dt, cols = c("pos.es", "pos.en", "length.es", "length.en")),
data.table(qjilm, key = c("pos.es", "pos.en", "length.es", "length.en") )
)
})
#user system elapsed
#32.070 0.012 32.118
dim(res.dt)
#[1] 6340091 9
Y, finalmente, suponiendo que los data.tables ya tienen asociado un índice de antemano:
Resumen:
- Había hecho unas pruebas con data.table previamente que no resultaron del todo satisfactorias.
- Anoche,
data.table me sacó de un apuro muy serio.
- Ahora soy fan.
- Gracias a
data.table, el límite de tamaño de los conjuntos de datos con los que soy capaz de trabajar razonablemente con R ha crecido en todo un orden de magnitud: ya no me asusta que me hablen de millones.
RapidMiner ha colgado en Youtube tres vídeos que componen un tutorial rápido que cubre la instalación y los primeros pasos de su producto:

Guardaba en la cartera un artículo que ya pronto cumple sus cinco años. Sirve de contrapunto a toda esa literatura que describe la minería de datos como una suerte de panacea, la cómoda senda hacia un futuro de armonía y color.
Se trata de una entrevista a Peter Fader sobre a lo que la minería de datos alcanza y no alcanza.
Los estadísticos se sienten relativamente cómodos ascendiendo de lo particular a lo general (por ejemplo, calculando una media). En contraposición, la promesa de la minería de datos consiste en la predicción del comportamiento de los individuos, de cada individuo, a partir de modelos construidos sobre repositorios de datos cada vez más extensos y perfiles más detallados de cada sujeto.
Distingue por tanto Fader entre propensión y comportamiento. El comportamiento, la acción que realiza un individuo concreto, está sujeto a una aleatoriedad tal, es tan etéreo, que, entiende, es inútil tratar de acotarlo (o adivinarlo) mediante modelos predictivos. Quien lo probó, lo sabe.
Nótese además, que una predicción de comportamiento tiene una doble vertiente: el qué y el cuándo. Y que muchas de las predicciones que uno encuentra (y construye) ignoran esa componente temporal.
¿La alternativa? El estudio de las propensiones, que afectan ya no tanto a individuos concretos sino a grupos de ellos. Defiende Fader, como alternativa a los modelos típicos de la minería de datos, lo que llama modelos probabilísticos —sin entrar en mayores detalles—. Una de sus pecularidades es que no precisan de tal cantidad de información —y, en particular, tantas variables— como los que gustan a los mineros de datos. Lo que le lleva a abogar por una especie de involución hacia el small data.
La noticia es vieja y posiblemente conocida de muchos. Además, procede de esta otra bitácora. Pero no está de más dejar constancia de ella aquí.
Estas ocho técnicas son:
- La regresión lineal
- Los árboles de decisión tradicionales (yo los uso mucho, sin embargo, como herramienta descriptiva)
- El análisis discriminante lineal
- Las k-medias para construir clústers (véase esto)
- Las redes neuronales (por su difícil interpretación, inestabilidad y su tendencia al sobreajuste)
- La estimación por máxima verosimilitud, particularmente cuando la dimensionalidad del problema es elevada
- Naive Bayes (véase esto)
Un excompañero me contaba ayer que asistió a las jornadas Big Data Spain 2012 y le sorprendió lo pequeños que le resultaban los conjuntos de datos de los que se hablaba. En su trabajo existen (me consta) tablas de 1TB y nunca ha oído a nadie hablar de big data.
En particular, hablaba de un caso de negocio en el que se trataba un conjunto de datos de 260GB. Y las preguntas que lanzo a mis lectores son:
- ¿Consideráis que 260GB es big data?
- ¿Cuál es el conjunto de datos más grande con el que habéis trabajado (en cuestiones que tengan algo de analítico, claro)?
Comparto con mis lectores la noticia que he recibido del paquete (aún en ciernes) RDataMining. El objetivo de sus promotores es construirlo colaborativamente (¡se buscan programadores!) e incluir en él algoritmos publicados que no tengan todavía implementación en R.

Existen en R muchos paquetes útiles para la minería de datos. De todos ellos, me atrevería a recomendar el paquete caret que, más allá de integrar diversos algoritmos, incluye funciones auxiliares útiles para seleccionar modelos, comparar la importancia de funciones, realizar validaciones cruzadas, etc. utilizando una sintaxis coherente y homogénea. Que es algo a lo que los autores de las APIs de los distintos paquetes prestan poca atención, desafortunadamente.
El objetivo del nuevo paquete es acelerar el proceso de incorporación de los avances teóricos en el campo de la minería de datos en R. Porque muchos algoritmos publicados no incluyen implementación o, de hacerlo, se implementa en otros lenguajes de programación.
Y recuerda: ¡estás invitado a participar en el desarrollo del paquete!
Se levantó un revuelo hace unos días en la profesión a raíz de la noticia de que Target había descubierto que una adolescente estaba embarazada antes que sus mismos padres. En el artículo se explica cómo lo hacen:
[...] identificó unos 25 productos que, cuando se analizaban juntos, le permitían asignar a cada cliente una “probabilidad de embarazo”. Más aún, podía estimar la fecha del parto con una gran precisión, de manera que Target podía enviar cupones de acuerdo con la fase del embarazo.
La noticia ha aparecido en diversos medios (p.e., aquí, aquí y aquí). Incluso ha habido una encuesta en KDNuggets sobre las cuestiones éticas que rodean a esa posible intromisión en la privacidad.
Pero la noticia ha sido presentada desde una óptica prácticamente taumatúrgica, como si Target poseyese una de bola de cristal infalible. Y estoy seguro, casi seguro, me apostaría muchísimo, a que la realidad dista mucho de lo que se ha contado. Y me sorprende que nadie se haya planteado las preguntas adecuadas:
- ¿cuántas mujeres (¡y hombres!) están recibiendo cupones premamá?
- ¿cuántas mujeres embarazadas reciben cupones de lociones de afeitado?
- Y más fundamentalmente, ¿gana dinero Target realmente a través de esos cupones premamá?
Nota: el autor de esta entrada trabajó hace un tiempo en el piloto de lo que se convertiría en el Club Carrefour. Los responsables de la cosa estaban muy interesados en que los cupones se canjeasen. Pero ante preguntas como si se habían planteado la conveniencia de que la gente recibiese descuentos por cosas que tal vez comprasen de todos modos sin descuento y otras similares (que incidían en el problemático desalineamiento entre canjear cupones y ganar dinero)… ¡ponían una cara más rara!
He decidido limpiar mi cartera. Llevo en ella unos cuantos artículos impresos que me acompañan desde hace mucho y que, por un lado, me da pena tirar y, por el otro, no me aportan en el día a día. Voy a reciclar el papel sobre el que los imprimí y, a la vez, dejar en enlace a ellos por si a mí un día (o a alguno de mis lectores otro) me da por volver sobre ellos. Son:
- Don’t be loopy: Re-Sampling and Simulation the SAS Way, del que ya he hablado en otras ocasiones.
- Dealing with Outliers: Maintain your Data’s Integrity, un estupendo resumen sobre el origen, naturaleza y efectos de los outliers. No hay que perderse tampoco algunos de las referencias.
- A practical solution to the pervasive problems of p values, que trata algunos problemas, como este, que plantea el uso de los p-valores y propone una alternativa bayesiana como remedio.
- Is Portfolio Theory Harming Your Portfolio?, un artículo en el que se examinan conceptos que la teoría moderna de los mercados financieros asume acríticamente. Por ejemplo, el autor se rebela frente a la asimilación de riesgo y varianza, cuando el primero debería ser, netamente, la probabilidad de perder dinero. Y examina los límites reales a la diversificación y la presunta eficiencia de los mercados.
- The code of Nature: making authors part with their programs, que repasa algunos fraudes científicos y discute la necesidad que los resultados publicados sean reproducibles y reconstructibles.
- Statistical Modeling: The Two Cultures, en el que Leo Breiman vuelve sobre la lábil frontera entre la estadística y, por llamarlo de alguna manera, la minería de datos. Imperdibles las réplicas y contrarréplicas de Efron y Cox.
Escribo hoy al hilo de una pregunta de la lista de correo de quienes estamos leyendo The elements of statistical learning.
Hace referencia a la discusión del capítulo 2 del libro anterior en el que trata:
- El compromiso (trade off) entre el sesgo y la varianza de los modelos predictivos.
- Cómo los modelos locales (como los k-vecinos) tienden a tener poco sesgo y mucha varianza.
- Cómo los modelos globales (como los de regresión) tienden a tener poca varianza y mucho sesgo.
- Cómo la maldición de la dimensionalidad afecta muy seriamente a los modelos locales y mucho menos a los globales.
Y voy a tratar de ilustrar esos conceptos con un ejemplo extraído de mi experiencia de consultor.
Trabajé un otoño-invierno en un banco que quería precedir la propensión de sus clientes a adquirir nosequé producto. Nuestros lumbreras de turno pergeñaron un procedimiento —nosotros, en eso, éramos unos mandaos— que consistía en lo siguiente:
- Seleccionar unas cuantas variables altamente predictivas.
- Partirlas en 2, 3 o 4 tramos.
- Asignar a los clientes —unos dos millones— a la casilla (determinada por los tramos de las variables) que les correspondía.
- Deducir las propensiones de los clientes de cada casilla, esencialmente, a partir de los de una muestra de unos cuantos miles de clientes seleccionados —aproximadamente— mediante un muestreo estratificado por celda a los que se hacía una especie, digamos, de encuesta.
Si hay pocas variables, hay pocas celdas y a cada una le corresponden muchos casos de muestra. Pero si se quieren utilizar muchas variables, el número de casos por celda comienza a descender. Y en ocasiones, como nos sucedía, había celdas vacías: no existía ninguna clienta de edad avanzada con residencia en municipios de menos de 5000 habitantes, etc.
El problema es el mismo que el plantea el libro bajo el epígrafe de maldición de la dimensionalidad, aunque bajo una óptica algo distinta.
Nuestro modelo de predicción era bastante local. Imaginemos —aunque no era exactamente así—, que predecimos la propensión de los clientes de una celda como la media de la de los seleccionados en dicha celda. Nos podemos preguntar:
- ¿Qué pasa si en una determinada celda sólo hay un (por ejemplo) cliente seleccionado?
- ¿Hasta qué punto es fiable extrapolar a una casilla entera las propensiones de, únicamente, doña Juana y doña Miguela?
Las predicciones de cada casilla —una especie de modelo local—, por el hecho de responder a muy pocos sujetos —efecto de la maldición de la dimensionalidad— son muy inestables.
Si el año siguiente se hubiese repetido el estudio —¿lo habrán repetido realmente?— en cada casilla eligirían, probablemente, representantes distintos y, muy probablemente también, variarían mucho los resultados.
Si por un lado el proceso se repitiese año tras año, durante muchos, muchos años obteniéndose la serie de propensiones estimadas y, por el otro, Dios bajase de los cielos y revelase el valor verdadero, de la propensión en una casilla determinada, entonces podríamos calcular

El segundo término representa el sesgo de la predicción en la casilla, la diferencia entre la predicción media (sobre muestras distintas) y el valor verdadero del parámetro. Y podemos conceder que, si el número de años es suficientemente alto, podría considerarse próximo a cero. Y el primero correspondería a la variabilidad de las predicciones entre los distintos años que, de acuerdo con la discusión anterior, sería elevado. Precisamente porque, debido a la maldición de la dimensionalidad, las predicciones están basadas en muy pocos sujetos.
Pero imaginemos que en lugar de utilizar el esquema anterior nos hubiésemos decantado por un modelo de regresión logística basado en unos cuantos cientos o miles de sujetos. Y que cada año, como en la situación anterior, se repitiese el análisis. Seguramente, los coeficientes del modelo no variarían sustancialmente de año en año pero que el error de predicción en algunos subconjuntos de sujetos singulares —piénsese en las celdas de la discusión anterior— estuviese desviado, igualmente desviado, todos los años. Por lo que cabría esperar muy poca variación interanual pero mucho sesgo.
¿Qué es preferible? ¿Cómo pueden mitigarse estos problemas? Pues, primero, siendo conscientes de que existen. Y segundo, leyendo el libro, sea con nuestros 22 voluntarios o por cuenta propia.
|