Archivos de la categoría Data Mining

De estadístico a minero de datos a científico de datos…

Hace unos meses estuve en un data beers que organizó Accenture que mas parecía una reunión de viejas glorias de Neo Metrics y hablé sobre la transformación de un dinosaurio a un científico de datos, por cierto, me llamó la atención como el resto de compañeros hicieron sus presentaciones con software del siglo pasado y eso que yo era el dinosaurio... Hoy ha salido una noticia sobre el uso de la información de Facebook para tarificar en seguros que define hacía donde quiero ir y los problemas con los que he de lidiar. Así que hoy voy a escribir sobre mi y la transformación del dinosaurio al científico de datos.

Un poco de mi vida. Yo antes fui aplicador de plaguicidas, Infante de Marina, oficial de segunda en mantenimiento industrial,... y por las tardes dio por estudiar y en 2001 me diplomé en estadística y en 2003 sacrifiqué mi sueldo de oficial de mantenimiento para trabajar en una consultora de esas que hace body shopping (yo soy partidario del body shopping) aunque ganaba más y trabajaba menos como oficial de mantenimiento descubrí que me gustaba mucho la estadística, había una web en geocities que lo demuestra, con uno de los primeros cursos de R en español. Al principio, en mi trabajo, hacía eso estadísticas, y a esto lo empezaron a llamar Business Intelligence y allí estaba yo con SAS y mis primeras segmentaciones, mis primeras regresiones logísticas con más o menos acierto y sobre todo con mis primeras reglas de negocio, empezaban a sonar términos como data mining. [La primera entrada de la wikipedia sobre data mining data de 2002]. SAS, Clementine, Pretium, software comercial muy caro, consultoras que se forraron, yo decía que R era capaz de hacer todo aquello gratis, pero nadie me escuchaba. Me gustaba mucho lo que hacía, disfruté y aprendí en telecos, bancos y ASEGURADORAS,... Bueno pues en las aseguradoras conocí a los actuarios y con ellos llevo mano a mano 10 años, ellos me consideran actuario, yo no. El paradigma de como la estadística ha mejorado los negocios es el sector asegurador. En concreto en el ámbito del cálculo de precios que es donde yo trabajo las relaciones lineales entre variables llevan siendo beneficiosas desde hace muchos años tanto para las compañías como para los asegurados.

Me gusta mucho mi trabajo,  llevo 10 años buscando relaciones lineales en aseguradoras. He establecido relaciones lineales en seguros de crédito, multirriesgo, hogar, RC,... pero sobre todo en Automóviles. Además de que me gusta creo que no se me da mal. Ahí está mi curriculum y he cambiado mucho y siempre con un motivo y la compañía para la que actualmente trabajo opina lo mismo que yo hay que ir más alla de las técnicas clásicas de minería de datos, eso ya lo hacen todas las aseguradoras, no es una ventaja, y sobre todo las compañías de venta directa necesitan añadir más a esos modelos de prima de riesgo que tan buenos resultados han dado a lo largo de los años. Ahora no hay data mining ahora hay data science. [La primera entrada en la wikipedia data de 2012] y desde entonces hasta ahora no se para de hablar machine learning, nosql, spark, hadoop, big data, concursos de científicos de datos, del trabajo del nuevo milenio,... La verdad es que da un tufillo a burbuja pero es cierto que es necesario diferenciarse, evolucionar y no seguir encapsulado en crear relaciones lineales cuando el software y sobre todo el hardware nos permite ir más allá. Ya no tengo que ser un actuario (de esos), ahora soy un científico de datos (por más que no me guste el término).

Sin embargo, ¿no nos estaremos pasando? La noticia con la que empiezo esta entrada: Facebook no permite usar su información para personalizar precios a Admirall es un jarro de agua fría pero si no lo permite Facebook usamos R en Twitter y sino Instagram, el BOE, Testra, Google,... tenemos información de muchas fuentes pero en el sector asegurador también tenemos regulación, que no se nos olvide por ejemplo no nos dejan usar el sexo para tarificar (esto perjudica a las mujeres por cierto). Son ellos los que dentro de su marco regulatorio deben establecer los límites, pero es curioso que no te dejen usar el sexo para crear un precio y si te permitan saber si empleas el coche las noches de los fines de semana. Pero no se lo tenemos en cuenta porque están muy liados con Solvencia II para que se forren más consultoras.

"Tengo que dejar de ser un dinosaurio para ser un científico de datos" esto se lo dije una vez a alguien de Amazon Web Services pero inmediatamente después comenté "los dinosaurios pesaban toneladas y duraron 65 millones de años no sé si el Homo Sapiens va a durar tanto" le ruboricé pero en el fondo sabía que yo tenía razón.

El parámetro gamma, el coste, la complejidad de un SVM

letra_o_svm_r

Cuando clasificamos datos con SVM es necesario fijar un margen de separación entre observaciones, si no fijamos este margen nuestro modelo sería tan bueno tan bueno que sólo serviría para esos datos, estaría sobrestimando y eso es malo. El coste C y el gamma son los dos parámetros con los que contamos en los SVM. El parámetro C es el peso que le

damos a cada observación a la hora de clasificar un mayor coste implicaría un mayor peso de una observación y el SVM sería más estricto (este link aclara mejor las cosas). Si tuvieramos un modelo que clasificara observaciones en el plano como una letra O podemos ver como se modifica la estimación en esta secuencia en la que se ha modificado el parámetro C:

r_svm_2

Sigue leyendo El parámetro gamma, el coste, la complejidad de un SVM

Como salva la linealidad una red neuronal

En los últimos tiempos estoy empeñado en usar redes neuronales para la tarificación en seguros. Históricamente la tarificación de seguros, el pricing, se ha basado en modelos lineales generalizados GLM (sus siglas en inglés) porque su estructura es sencilla, se interpreta bien y no olvidemos que el sector asegurador está regulado y es necesario elaborar una nota detallada de cómo se articula una tarifa y el GLM nos ofrece una estructura multiplicativa que se comprende y con la que los reguladores se sienten muy cómodos. Sin embargo, una red neuronal es el paradigma de "caja negra", ¿cómo podemos saber que hace esa caja negra? Estoy trabajando en ello, la descripción del funcionamiento de las ponderaciones de una red está muy arriba en la lista de mis tareas pendientes.

Pero esta entrada del blog va encaminada a describir de forma como las neuronas de una red neuronal salvan la linealidad y como un mayor número de neuronas son capaces de ajustar mejor a una estructura compleja y si llegamos a describir como funciona esa estructura compleja podremos usar estas técnicas para realizar tarifas de riesgo. 
Como siempre, para ilustrar el funcionamiento se emplea un ejemplo muy sencillo:

#Variable independiente
indep = runif(500,100,3000)
#Función para crear la variable dependiente
foo = function(x){ mean(x)*(1-sin(-0.006042*x)+sqrt(x/100))
}
dep = sapply(indep,foo)

dep=dep+(runif(length(dep),-500,500))

dep = as.matrix(dep)
indep = as.matrix(indep)
plot(indep,dep)

redes_neuronales_tarificacion_seguros1

Creamos unos datos aleatorios que serán en una matriz nuestros datos inependientes y como variable dependiente una variable que dibuja una nube de puntos que simula una curva de observaciones. Si realizamos un modelo lineal se ajustará una recta sobre los datos, una red neuronal mejorará los resultados. Y para demostrarlo vamos a emplear el paquete de R monmlp que realiza un perceptrón multicapa Sigue leyendo Como salva la linealidad una red neuronal

Qué pasa si uso una regresión de poisson en vez de una regresión logística

Para un tema de mi trabajo voy a utilizar una regresión de poisson en vez de una regresión logística, el evento es si o no y no tiene nada que ver el tiempo, ni se puede contabilizar como un número, pero a efectos prácticos es mejor para mi usar una regresión de poisson. Entonces, ¿qué pasa si hago una poisson en vez de binomial? Como siempre si mi n es muy grande hay relación entre ambas distribuciones. Pero yo quiero saber si me puede clasificar mis registros igual una regresión de poisson y una binomial y se me ha ocurrido hacer un ejercicio teórico muy simple.

Construyo con SAS 10.000 datos aleatorios con las variables independientes x e y normalmente distribuidas y la variable dependiente z que es una función logística "perfecta" de x e y:

data logistica;
do i=1 to 10000;
x=rannor(8);
y=rannor(2);
prob=1/(1+exp(-(-10+5*x-5*y)));
z=ranbin(8,1,prob);
output;
end;
drop i;
run;

data entrenamiento test;
set logistica;
if ranuni(6)>0.8 then output test;
else output entrenamiento;
run;

proc freq data=entrenamiento;
tables z;
quit;

Separo los datos en entrenamiento y test y vemos que un 8% aproximadamente de mis registros tienen valor 1. Sobre estos datos hago una logística y una poisson y veo los parámetros Sigue leyendo Qué pasa si uso una regresión de poisson en vez de una regresión logística

Juego de modelos de regresión con R

Rplot

Os propongo un juego con R. El juego parte de unos datos aleatorios que he generado con R (los que veis arriba) que dividimos en entrenamiento y test. Sobre el conjunto de datos de entrenamiento he realizado varios modelos y valoro las predicciones gráficamente sobre los datos de test. El juego consiste en asociar cada resultado gráfico de test a cada código de R correspondiente y justificar brevemente la respuesta.

Los gráficos de los datos de test son:

Figura A:
Rplot01

Figura B:
Rplot02

Figura C:
Rplot03

Figura D:
Rplot05

Figura E:
Rplot07

Figura F:
Rplot08

Figura G:
Rplot06

Los códigos R que tenéis que asociar a cada figura son:

Código 1: Red neuronal con una sólo capa y 2 nodos:
mejor.red {
mejor.rss for(i in 1:50){
modelo.rn linout=T, trace=F,decay=0.1)
if(modelo.rn$value < mejor.rss){
mejor.modelo mejor.rss

return(mejor.modelo)
}}
}

mejor.red(2)

Código 2: Regresión lineal
lm(dep ~ indep,entrenamiento)

Código 3: Máquina de vector de soporte con un margen muy alto
svm(dep ~ indep ,entrenamiento, method="C-classification",
kernel="radial",cost=100,gamma=100)

Código 4: Árbol de regresión
rpart(dep~indep,entrenamiento)

Código 5: Regresión LOESS
loess (dep ~ indep, data = entrenamiento)

Código 6: Máquina de vector de soporte con un margen bajo
svm(dep ~ indep ,entrenamiento, method="C-classification",
kernel="radial",cost=10,gamma=10)

Código 7: K vecinos más cercanos K-nn
train.kknn(dep ~ indep, data = entrenamiento,
k = 4, kernel = c("rectangular"))

Por ejemplo la figura A irá con el código 2 porque se trata de una estimación lineal. Y ahora os toca a vosotros asociar figuras a modelos de R.

Medir la importancia de las variables en una red neuronal con R

Sigo a vueltas con esta gran web y hoy vamos a medir la importancia de las variables en una red neuronal. Al igual que sucede en un modelo de regresión los parámetros obtenidos pueden servirnos para determinar la importancia de una variable dentro del modelo. En el caso de una red neuronal los pesos de la red pueden ser utilizados para determinar cómo influye una variable en el modelo. Para ilustrar este tipo de tareas el gran @beckmw realizó esta entrada:

http://beckmw.wordpress.com/2013/08/12/variable-importance-in-neural-networks/

El método que emplea para determinar esta importancia fue propuesto por Garson en 1991 y parte de la idea de buscar todas las conexiones que tiene una variable dentro de una red neuronal y se ponderan para obtener un valor único que describe el grado de asociación de nuestra variable dependiente con cada una de sus regresoras. Garson realizó este método para poder obtener un valor de 0 a 1, pero @beckmw lo ha modificado para que el signo tenga su importancia. La función que ha creado este genio la tenéis en Github

source(url('https://gist.githubusercontent.com/fawda123/6206737/raw/d6f365c283a8cae23fb20892dc223bc5764d50c7/gar_fun.r'))

Por cierto, qué manía tienen algunos con usar devtools. Haciendo sólo:

#Dejamos los nombres de los coeficientes de una forma más adecuada
tr=nnet.fit$coefnames
tr=substr(tr,16,30)
nnet.fit$coefnames=tr

#Pintamos la importancia de las variables
gar.fun('medv',nnet.fit)

Obtenemos el gráfico con el que comienza esta entrada al blog. Ni se os ocurra comenzar a tocar este gráfico con los temas de ggplot2, somos gente productiva. Vemos como a la izquierda del gráfico se sitúan las variables con mayor peso negativo y a la derecha las variables con mayor peso positivo. Podemos eliminar algunas variables y seguramente el comportamiento predictivo del modelo no empeoraría.

Hay que dejar de pensar en las redes neuronales como una caja negra sin sentido. Saludos.

Representación de redes neuronales con R

En la última entrada realizamos un modelo de regresión con redes neuronales. Hoy quería mostraros como representar gráficamente la red neuronal creada en esa entrada. A la modelización con redes neuronales siempre se le ha achacado un comportamiento de “caja negra”, nosotros pasamos unas variables de entrada por una capa oculta y obtenemos una salida. No hay parámetros ni inferencia sobre los mismos, no sabemos lo que hace la red por dentro. En el caso concreto de R y continuando con la entrada anterior  si hacemos summary(bestnn):

a 12-4-1 network with 57 weights
options were - linear output units decay=1e-05
b->h1 i1->h1 i2->h1 i3->h1 i4->h1 i5->h1 i6->h1 i7->h1 i8->h1 i9->h1
-5.61 -3.80 -1.03 0.74 -2.81 2.83 2.37 2.86 6.72 4.68
i10->h1 i11->h1 i12->h1
1.65 0.87 -8.16 Sigue leyendo Representación de redes neuronales con R

Regresión con redes neuronales en R

La última técnica que me estoy estudiando este verano es la regresión con redes neuronales. El ejemplo que os voy a poner es completamente análogo a este: http://heuristically.wordpress.com/2011/11/17/using-neural-network-for-regression/ Vamos a trabajar con el paquete nnet, si dispusiera de tiempo replicaría este ejemplo en otra entrada con neuranet. Para realizar el ejemplo tenemos el conjunto de datos housing que contiene el censo de 1970 de 506 hogares de Boston. Empecemos a trabajar con la consola de RStudio (¡!)

#install.packages("mlbench")
library(mlbench)
data(BostonHousing)
summary(BostonHousing$medv)

Como variable dependiente vamos a emplear el valor mediano de las vivendas ocupadas en dólares.  El primer paso será realizar un modelo de regresión lineal:

lm.fit <- lm(medv ~ ., data=BostonHousing)
lm.predict <- predict(lm.fit)
mean((lm.predict - BostonHousing$medv)^2)

plot(BostonHousing$medv, lm.predict,
main="Regresión lineal",
xlab="Actual")

El ajuste ofrece una suma de cuadrados de 21.9  Vamos a realizar este modelo con redes neuronales Sigue leyendo Regresión con redes neuronales en R

Analisis cluster con SAS. La importancia de las semillas en las k-medias

El PROC FASTCLUS en SAS nos permite realizar análisis de agrupamiento dirigido mediante el algoritmo de las k-medias. Este algoritmo tiene algunos problemas pero nos puede servir para agrupar de forma multivariante observaciones. Es rápido, sencillo de explicar y con algunas lagunas no funciona mal. Como aproximación a nuestras segmentaciones puede ser muy práctico. Hoy se va a utilizar para identificar a los clientes más complicados de segmentar, a aquellas observaciones que quedan en las zonas grises. (http://www.datanalytics.com/blog/2011/08/03/clustering-iii-sobresimplificacion/)
Estas zonas grises en muchos casos son más importantes que la segmentación en sí. Si estamos con un problema de taxonomía (clasificar especies) puede ser menos importante, pero si clasificamos inversiones, clientes,… ¿qué pasa con aquellos que no sabemos ubicar? Escribimos segmentar en un buscador y tenemos esta imagen:

¡Qué sencillo es segmentar! Cada muñeco queda en su pelota, Sigue leyendo Analisis cluster con SAS. La importancia de las semillas en las k-medias

Trucos SAS. Medir la importancia de las variables en nuestro modelo de regresión logística

Hoy quería proponeros una forma poco ortodoxa de medir la importancia de las variables en un modelo de regresión logística con SAS. La cuestión es: dado un modelo de regresión logística crear un ranking con las variables más importantes dentro del modelo. Para esta tarea recomiendo el uso de random forest, pero puede ser imposible disponer de un software que realice este tipo de modelos. Imaginemos un caso concreto, disponemos de SAS STAT y nos da reparo trabajar con R. Para este caso podemos emplear el siguiente truco. El AIC (criterio de información de Akaike) es un estadístico que relaciona el cociente de la verosimilitud con el número de parámetros del modelo que ajustamos. Cuanto menor sea este cociente mejor será nuestro modelo. Si eliminamos una variable del modelo ¿cuánto empeora este modelo? Esa será la filosofía que emplearemos para analizar la importancia de las variables presentes en nuestro modelo. En la línea habitual hacemos un ejemplo para que podáis copiar y pegar en vuestro SAS:

Vamos a crear un dataset preparado para hacer una regresión logística perfecta donde en un 10% de los casos sucede un evento:

*REGRESION LOGISTICA PERFECTA;
data logistica;
do i=1 to 10000;
  normal1=rannor(8);
  normal2=rannor(45);
  normal3=rannor(32);
  normal4=rannor(7);
  normal5=rannor(98);
  unif1=ranuni(2);
  unif2=ranuni(21);
  unif3=ranuni(22);
  unif4=ranuni(23);
  unif5=ranuni(24);
  prob=1/(1+exp(-(-3.16+0.1*normal1-0.2*normal2+0.3*normal3-0.4*normal4+0.5*normal5+
	   0.1*unif1+0.2*unif2+0.3*unif3+0.4*unif4+0.5*unif5)));
  sucede=ranbin(8,1,prob);
  *TRAMIFICAMOS LAS VARIABLES;
  normal1=round(rannor(8),0.1);
  normal2=round(rannor(45),0.2);
  normal3=round(rannor(32),0.3);
  normal4=round(rannor(7),0.4);
  normal5=round(rannor(98),0.5);
  unif1=round(ranuni(2),0.1);
  unif2=round(ranuni(21),0.2);
  unif3=round(ranuni(22),0.3);
  unif4=round(ranuni(23),0.4);
  unif5=round(ranuni(24),0.5);
  output;
end;
drop i;
run;

title "Logistica con un 10% aprox de casos positivos";
proc freq data=logistica;
tables sucede;
quit;

Incialmente necesitamos las variables presentes en el modelo y el ajuste inicial, también un conjunto de datos SAS con los nombres de las variables. Esto es un poco chapuza, pero si seguís el blog podéis hacer este código mucho más elegante [no os lo voy a dar todo hecho] Sigue leyendo Trucos SAS. Medir la importancia de las variables en nuestro modelo de regresión logística