Sesión 016. “Seguimos Tomando Deciciones…” 1480-Técnicas Estadísticas en Investigación de Mercados Grado en Estadística empresarial Curso 2012-13 – Segundo semestre Profesor: Xavier Barber i Vallés Departamento: Estadística, Matemáticas e Informática ÁRBOLES Y BOSQUES Diferencias entre Árboles de Clasificación y de Regresión DIFERENCIA 1: Esto puede parecer un asunto trivial, ¡pues se sabe la diferencia! Árboles de clasificación, como su nombre indica se utiliza para separar el conjunto de datos en clases que pertenecen a la variable de respuesta. Por lo general, la variable de respuesta tiene dos clases: Sí o No (1 ó 0). Por lo tanto los árboles de clasificación se utilizan cuando la variable de respuesta o de destino es categórica en la naturaleza. Se necesitan árboles de regresión cuando la variable respuesta es numérica o continua. Por ejemplo, el precio predicho de un bien de consumo. Por lo tanto los árboles de regresión son aplicables para los problemas de predicción en lugar de clasificación. En cualquier caso, los predictores o variables independientes pueden ser categóricas o numéricas. Es la variable de destino la que determina qué tipo de árbol de decisión es necesario. Diferencias entre Árboles de Clasificación y de Regresión DIFERENCIA 2: En un árbol de clasificación estándar, la idea es dividir el conjunto de datos basado en la homogeneidad de los datos. Digamos, por ejemplo, tenemos dos variables: la edad y el peso que predicen si una persona va a registrarse para ser socio de un gimnasio o no. En los datos de “calentamiento” se observó que el 90% de las personas que son mayores de 40 años se ha registrado, dividimos los datos aquí y la edad se convierte en un nodo superior del árbol. Casi podemos decir que esta separación ha hecho que los datos de "90% de pureza". Medidas rigurosas de impurezas, basado en la proporción de cálculo de los datos que pertenecen a una clase, tales como la entropía o índice de Gini se utilizan para cuantificar la homogeneidad en los árboles de clasificación. En un árbol de regresión, la idea es la siguiente: dado que la variable de destino no tiene clases, ajustar un modelo de regresión para la variable de destino con cada una de las variables independientes. Luego, para cada variable independiente, los datos se dividen en varios puntos de división. En cada punto de división, se eleva al cuadrado el "error" entre el valor predicho y los valores reales de conseguir una "suma de errores cuadrados (SSE)“ mínima. RANDOM FOREST Random forest, ¿qué son? • • • • Random Forest son un tipo de método de particionamiento recursivo especialmente adecuado para pequeñas n y grandes p (pocos datos y muchas variables). Se calculan subconjuntos de árboles de regresión al azar, es decir, se eligen subconjuntos de X frente a la misma Y. De esta manera, los bosques aleatorios son capaces de examinar mejor la contribución y el comportamiento que cada predictor tiene, aun cuando por lo general se eclipsa el efecto de un predictor por sus competidores más importantes en los modelos más simples. Por otra parte, los resultados de un conjunto de árboles de clasificación/regresión se han demostrado mejores para producir predicciones que los resultados de un solo árbol de clasificación. ¿cómo funciona? library(randomforest) – randomForest implements Breiman’s random forest algorithm for classification and regression. It can also be used in unsupervised mode for assessing proximities among data points. library (party): – cforest: An implementation of the random forest and bagging ensemble algorithms utilizing conditional inference trees as base learners. Random Forests Leo Breiman and Adele Cutler http://www.stat.berkeley.edu/~breiman/RandomForests/ Random Forests(tm) is a trademark of Leo Breiman and Adele Cutler and is licensed exclusively to Salford Systems for the commercial release of the software. Our trademarks also include RF(tm), RandomForests(tm), RandomForest(tm) and Random Forest(tm) En marcha!! > library(languageR) > library(Design) > library(Party) ### ajustando los parámetros del random forest. > data.controls <- cforest_unbiased(ntree=1000, mtry=3) ## inicializando la semilla > set.seed(47) #### ajuste del RF > data.cforest <- cforest(Resp ~ x + y + z…, data = mydata, controls=data.controls) #### obteniendo la “importancia” de cada variable” data.cforest.varimp <- varimp(data.cforest, conditional TRUE) > write.table(data.cforest.varimp, file="FILEPATH.txt") > dotplot(sort(data.cforest.varimp)) #(Note: conditional variable importance will take a while and is fairly CPU-intensive, #especially for data sets with many variables, observations, and levels to the #variables. I would highly recommend running these calculations on a high-powered #computer.) “Importancia” de las Variables “Importancia” de las variable “Importancia” de las variable “Estadísticos” del bosque C = concordancia (medida de 0 a 1). Dxy= D de Sommers que mide la diferencia entre la concondarcia y la discordancia. CARIDAD MENSUAL VÍA RANDOM FOREST Selección Aleatoria del Árbol Cargamos las librerías que vamos a utilizar y creamos el objeto de los datos: library(languageR) ## por si necesitamos algunas funcioens library(design) ## por si queremos hacer ANOVAs a lso modelos lineales library(party) ## Importante… library(BCA) ## los datos library(rpart) ## Importante library(rms) ## diagnostico de rpart library(randomForest)## otra versión de random forest library(ModelGood) ## ajustes del modelo logistico ### recuperamos los datos del CCS data(CCS, package="BCA") de la sesión anterior (paquete BCA-> CCS) #### Seccionamos la muestra para evitar problemas de overfitting CCS$Sample <- create.samples(CCS, est = 0.34, val = 0.33, rand.seed = 1) CCS$Sample<-factor(CCS$Sample) ¡Me estás “estresando”! ### ajustando los parámetros del random forest. data.controls <- cforest_unbiased(ntree=10, mtry=3) ## inicializando la semilla set.seed(47) #### ajuste del RF # [1] "Region" "YearsGive" "AveDonAmt" "LastDonAmt" # [5] "DonPerYear" "NewDonor" "Age20t29" "Age20t39" # [9] "Age60pls" "Age70pls" "Age80pls" "AdultAge" #[13] "SomeUnivP" "FinUnivP" "hh1t2mem" "hh1mem" #[17] "AveIncEA" "DwelValEA" "EngPrmLang" "Sample" <<--OJO!!! #[21] "Log.AveDonAmt" "Log.DonPerYear" "Log.LastDonAmt" "Log.YearsGive" #[25] "NewRegion" CCS2<-data.frame(CCS[,-20]) ### por problemas de espacio de mi ordenador quito alguna variable, data.cforest <- cforest(MonthGive ~ . ,data =CCS2[CCS$Sample=="Estimation",1:12] , controls=data.controls) #### obteniendo la “importancia” de cada variable” data.cforest.varimp <- varimp(data.cforest, conditional=TRUE) write.table(data.cforest.varimp, file="FILEPATH.txt") dotplot(sort(data.cforest.varimp)) Los resultados Region YearsGive AveDonAmt LastDonAmt DonPerYear NewDonor Age20t29 Age20t39 Age60pls -0.003 0.001 0.002 0.004 -0.003 0.000 0.002 -0.001 0.002 LastDonAmt Age60pls Age20t29 AveDonAmt YearsGive NewDonor Age20t39 Region DonPerYear -0.002 0.000 0.002 sort(data.cforest.varimp) 0.004 Importancia de las variables dotplot(sort(data.cforest.varimp), LastDonAmt xlab="Variable Importance in DATA\n -predictors to right of dashed vertical line are Age60pls significant-", panel = function(x,y){ Age20t29 panel.dotplot(x, y, col='darkblue', pch=16, cex=1.1) panel.abline(v=abs(min(data.cforest.varimp)), col='red', AveDonAmt lty='longdash', lwd=2) } ) YearsGive NewDonor Age20t39 Region DonPerYear -0.002 0.000 0.002 0.004 Variable Importance in DATA -predictors to right of dashed vertical significant- Probando con otras variables ## Hay que poner más "arboles y más variables"#### ### ajustando los parámetros del random forest. data.controls <- cforest_unbiased(ntree=1000, mtry=3) ## inicializando la semilla set.seed(47) ### todas la variables o algunas?? dependerá de la capacidad de cálculo de nuestro ordenador sele=c(1, 16:19,21:25) data.cforest2 <- cforest(MonthGive ~ . , data=CCS2[CCS$Sample=="Estimation",sele] , controls=data.controls) #### obteniendo la “importancia” de cada variable” data.cforest.varimp2 <- varimp(data.cforest2, conditional=TRUE) data.cforest.varimp2 La importancia de las variables > data.cforest.varimp2 hh1t2mem 0.00040 hh1mem 0.00050 AveIncEA 0.00170 DwelValEA Log.AveDonAmt 0.00010 0.00415 Log.DonPerYear Log.LastDonAmt Log.YearsGive NewRegion 0.00220 0.00485 0.00280 -0.00040 La importancia de las Variables Log.LastDonAmt Log.AveDonAmt Log.YearsGive Log.DonPerYear AveIncEA hh1mem hh1t2mem DwelValEA NewRegion 0.000 0.001 0.002 0.003 0.004 0.005 Importancia de las Variables en CCS -Las variables a la derecha de la lin La concordancia del Modelo Una vez obtenida la importancia de las variables, nos queda saber si el modelo va a ser un buen modelo para predecir. Para ello o bien realizamos el árbol de “decisión” o “regresión”, o bien realizamos una regresión log´sitica sólo con las variables “importantes”. La concordancia del Modelo ################# ##### o bien creamos un árbol con las variables: ##### log.AveDonamt+Log.LastDonamt+Log.YearGive ##### o bien generamos una regresión logistica ####con estas variables sólo: treeFinal.lrm.model <- lrm(MonthGive~ Log.AveDonAmt + Log.LastDonAmt + Log.YearsGive, data=CCS2[CCS$Sample=="Estimation",]) treeFinal.lrm.model Logistic Regression Model lrm(formula = MonthGive ~ Log.AveDonAmt + Log.LastDonAmt + Log.YearsGive, data = CCS2[CCS$Sample == "Estimation", ]) Obs 544 No 280 Yes 264 max |deriv| 2e-07 Model Likelihood Ratio Test LR chi2 108.15 d.f. 3 Pr(> chi2) <0.0001 Coef Intercept -3.0231 Log.AveDonAmt 0.7013 Log.LastDonAmt 0.4616 Log.YearsGive -0.3599 S.E. Wald Z 0.4542 -6.66 0.3094 2.27 0.2836 1.63 0.1509 -2.39 Discrimination Indexes R2 0.240 g 1.170 gr 3.222 gp 0.246 Brier 0.204 Pr(>|Z|) <0.0001 0.0234 0.1036 0.0171 Rank Discrim. Indexes C 0.748 Dxy 0.496 gamma 0.499 tau-a 0.248 Predicciones con mis Importantes pred.lrm.treefinal <- predictStatusProb(treeFinal.lrm.model, newdata=CCS2[CCS$Sample=="Validation",]) boxplot(pred.lrm.treefinal~CCS2$MonthGive[CCS$Sample=="Validation"]) abline(h = 0.5, col="red") #### Clasifica bien??????? No Yes 0.2 0.4 0.6 0.8 1.0