Sesión 013. “El árbol no me deja ver el bosque: Clasificación y Selección de Variables de Interés” 1480-Técnicas Estadísticas en Investigación de Mercados Grado en Estadística empresaria Curso 2012-13 – Segundo semestre Profesor: Xavier Barber i Vallés Departamento: Estadística, Matemáticas e Informática La naturaleza está viva… Deja que los datos te hablen… Índice • Definición de Árbol • Árboles frente a Logística – Ventajas y Desventajas • Diferentes tipos • Diferentes tipos de Modelos – Índice Gini – Selección de Recursiva: CART • En R: rpart() & ctree() Los “Tree Models” • Habitualmente llamados como: – Árboles de Decisión, – o simplemente Árboles • Son métodos para modelizar la predicción. • Un ejemplo clásico es “Considerar una regla para decidir que tarjeta de crédito ofrecer al cliente”: – – – – Interés inferior al 25% Meses de carencia de pago >1 Salario mensual superior a 3000€ Si ya dispone de alguna trarjeta similar El Algoritmo de búsqueda • Para crear un árbol usaremos un algoritmo basado en la información de los datos. • El algoritmo de búsqueda para la regla de decisión se basa en la variables predictoras para progresivamente dividir los “casos” en pequeños grupos “afines”. – Los grupos finales los llamamos “hojas”. Tree vs. Logistic 1. Ambos modelos necesitan información histórica, variables predictoras y una variable OBJETIVO (Target) binaria. 2. Ambos algoritmos usan información histórica para crear (estimar) el modelo que relaciona a los predictores con el Target. 3. Los modelos de regresión necesitan de una formula algebraica, mientras que los Árboles son una secuencia de reglas. Tree vs. Logistic 4. Uno y otro modelo, una vez generado, puede usar un nuevo caso para predecir el comportamiento de la variable Target. 5. El modelo de regresión calcula la probabilidad de que una variable target tome un valor “bueno” para ese caso. Se utilizarán estas probabilidades para dividir en dos grupos. 6. El modelo de Árbol puede saignar directamente un nuevo caso al grupo del Target. Ventajas y Desventajas • La interpretación del calibrado del árbol es muy sencilla, siendo muy útil su uso para audiencias no especializadas. • Es más flexible que la regresión logística en las asunciones para su ajuste, y se ve menos afectado por los valores perdidos. • Pero los modelos de regresión pueden detectar efectos más débiles con un número menor de datos Diferentes tipos de modelos Los algoritmos varian según su características, incluyendo el tipo de objetivo , manejando la complejidad de las ramas. Utilizaremos la librería de R, rpart (recursive partitioning) (Venables and Ripley 2002). Tambien se utilizarán las librerias party y party. Índice Gini Definimos PL y PR como las proporciones de el nodo original en la derecha y en la izquierda, cuyo resultado es: = PL n= PR nNo / N Sí / N Definimos la proporción de un tipo (1) dentro de los subnodos derecho e izquierdo como pL y pR, dados por = pL n= pR nX 1B / nNo X 1 A / nSi Definimo el Índice Gini como (medida de cambio impurea al resultado al particionar los datos) PL ( pL )(1 − pL ) + PR ( pR )(1 − pR ) Selección recursiva Y=Sí o Y=No X1=A y Y=Sí etc. etc. X1=B y Y= NO etc. Reglas de Parada • Todos los casos en un nodo tienes igual valor para los predictores • La “profundidad” del árbol sobrepasa el máximo establecido. • El tamaño del nodo es más pequeño que el mínimo establecido. • El corte de un nodo va a provocar un tamaño menor del establecido. • El nodo se convierte en “puro”. • … Y algunas relacionas con estás mismas Validación del resultado: Cross-Validation y Random Forest • Como en los métodos de regresión es muy importante validar el modelo: – Particionar la base de datos en dos y utilizar uan para Estimar y otra para Validar – Realizar una validación cruzada (ajustar tantos modelos como Datos, eliminando el dato i-ésimo en el modelo i-ésimo). – Utilizando Random Forest (próxima Sesión) MÁS ALGORITMOS, MÁS MEDIDAS DE EFICIENCIA CLASIFICANDO EN R Reseña Histórica. Análisis y decisión (www.analisisydecision.es) Formación para la óptima gestión de la información: …… Tanto el programa comercial CART como la función rpart() están basados en el libro Classification and Regression Trees. Como lector y revisor de alguno de sus primeros borradores, llegué a dominar la materia. CART comenzó como un enorme programa en Fortran que escribió Jerry Friedman y que sirvió para contrastar las ideas contenidas en el libro. Tuve el código durante un tiempo y realicé algunos cambios, pero me resultó demasiado frustrante el trabajar con él. Fortran no es el lenguaje adecuado para un algoritmo recursivo [...]. Salford Systems adquirió los derechos de dicho código e ignoro si alguna de las líneas origininales permanecen en él todavía. Mantuve muchas conversaciones con su principal programador (hace 15 o 20 años) sobre procedimientos para hacerlo más eficiente, esencialmente un problema interesante de indexación óptima. ….. Rpart se llama rpart porque los autores registraron comercialmente el término CART. Era la mejor alternativa que se me ocurrió entonces. Me parece curioso que una de las consecuencias de haber registrado "CART" es que ahora se utilice "particionamiento recursivo" mucho más a menudo que CART como nombre genérico para los métodos basados en árboles. rpart() libraryry(rpart) ### recuperamos los datos del CCS data(CCS, package="BCA") #### Seccionamos la muestra para evitar problemas de overfitting CCS$Sample <- create.samples(CCS, est = 0.34, val = 0.33, rand.seed = 1) tree1CCS<-rpart(MonthGive ~ Age20t29 + Age70pls + AveDonAmt + AveIncEA + DonPerYear + EngPrmLang + FinUnivP + LastDonAmt + Region + YearsGive, data=CCS[CCS$Sample=="Estimation",], method="class") print(tree1CCS) ################### El gráfico ############### par(mar = rep(0.1, 4)) plot(tree1CCS) text(tree1CCS, cex=0.8) rpart() > print(tree1CCS) n= 544 node), split, n, loss, yval, (yprob) * denotes terminal node 1) root 544 264 No (0.5147059 0.4852941) 2) AveDonAmt< 11.45833 166 28 No (0.8313253 0.1686747) * 3) AveDonAmt>=11.45833 378 142 Yes (0.3756614 0.6243386) 6) DonPerYear< 0.5227273 206 93 Yes (0.4514563 0.5485437) 12) DonPerYear>=0.08712121 192 93 Yes (0.4843750 0.5156250) 24) Age20t29< 0.110101 98 41 No (0.5816327 0.4183673) 48) EngPrmLang< 0.9751829 59 18 No (0.6949153 0.3050847) 96) AveDonAmt< 62.91667 48 11 No (0.7708333 0.2291667) * 97) AveDonAmt>=62.91667 11 4 Yes (0.3636364 0.6363636) * 49) EngPrmLang>=0.9751829 39 16 Yes (0.4102564 0.5897436) * 25) Age20t29>=0.110101 94 36 Yes (0.3829787 0.6170213) 50) LastDonAmt< 17.5 13 3 No (0.7692308 0.2307692) * 51) LastDonAmt>=17.5 81 26 Yes (0.3209877 0.6790123) 102) YearsGive< 2.5 15 5 No (0.6666667 0.3333333) * 103) YearsGive>=2.5 66 16 Yes (0.2424242 0.7575758) * 13) DonPerYear< 0.08712121 14 0 Yes (0.0000000 1.0000000) * 7) DonPerYear>=0.5227273 172 49 Yes (0.2848837 0.7151163) 14) AveIncEA>=54376.5 72 29 Yes (0.4027778 0.5972222) 28) AveIncEA< 69546 42 18 No (0.5714286 0.4285714) 56) LastDonAmt< 27.5 24 5 No (0.7916667 0.2083333) * 57) LastDonAmt>=27.5 18 5 Yes (0.2777778 0.7222222) * 29) AveIncEA>=69546 30 5 Yes (0.1666667 0.8333333) * 15) AveIncEA< 54376.5 100 20 Yes (0.2000000 0.8000000) * rpart() AveDonAmt< 11.46 | DonPerYear< 0.5227 No DonPerYear>=0.08712 AveIncEA>=5.438 Age20t29< 0.1101 AveIncEA< 6.955e+04 Yes Yes LastDonAmt< 27.5 Yes EngPrmLang< 0.9752 LastDonAmt< 17.5 AveDonAmt< 62.92 YearsGive< 2.5 Yes No Yes No No Yes No Yes rpart() > printcp(tree4CCS) Classification tree: rpart(formula = MonthGive ~ AveIncEA + DonPerYear + Log.AveDonAmt + NewRegion + Log.LastDonAmt, data = CCS[CCS$Sample == "Estimation", ], method = "class") Variables actually used in tree construction: [1] AveIncEA DonPerYear Log.AveDonAmt Log.LastDonAmt NewRegion Root node error: 264/544 = 0.48529 n= 544 1 2 3 4 CP nsplit rel error 0.356061 0 1.00000 0.020202 1 0.64394 0.017677 5 0.55682 0.010000 8 0.50379 xerror 1.00000 0.64773 0.64773 0.62879 xstd 0.044155 0.041016 0.041016 0.040681 • rel error= rel error(before) - (nsplit nsplit(before)) * CP(before); where (before) always denotes the entry in the row above. • xerror=The xerror column contains of estimates of cross-validated prediction error for different numbers of splits. • xstd= standard errors of those estimates party() & partykit() > tree1<-(MonthGive ~ Age20t29 + Age70pls + AveDonAmt + AveIncEA + + DonPerYear + EngPrmLang + FinUnivP + LastDonAmt + Region + YearsGive) > > tree1CCS<-ctree(tree1, data=CCS[CCS$Sample=="Estimation",]) > tree1CCS Conditional inference tree with 5 terminal nodes Response: MonthGive Inputs: Age20t29, Age70pls, AveDonAmt, AveIncEA, DonPerYear, EngPrmLang, FinUnivP, LastDonAmt, Region, YearsGive Number of observations: 544 1) AveDonAmt <= 11.25; criterion = 1, statistic = 40.318 2) AveDonAmt <= 5.25; criterion = 0.991, statistic = 11.024 3)* weights = 78 2) AveDonAmt > 5.25 4) YearsGive <= 1; criterion = 0.964, statistic = 8.446 5)* weights = 18 4) YearsGive > 1 6) DonPerYear <= 0.5714286; criterion = 0.989, statistic = 10.719 7)* weights = 59 6) DonPerYear > 0.5714286 8)* weights = 11 1) AveDonAmt > 11.25 9)* weights = 378 party() & partykit() 1 AveDonAmt p < 0.001 11.25 11.25 2 AveDonAmt p = 0.009 5.25 9 n = 378 y = (0.376, 0.62 5.25 3 n = 78 y = (0.936, 0.064) 4 YearsGive p = 0.036 1 1 6 DonPerYear p = 0.011 5 n = 18 y = (0.389, 0.611) 0.571 0.571 7 n = 59 y = (0.898, 0.102) 8 n = 11 y = (0.455, 0.545) partykit() 1 Log.AveDonAmt library(partykit) plot(as.party(tree4CCS), tp_args= list(id=FALSE)) < 2.52225 >= 2.52225 3 DonPerYear < 0.52273 >= 0.08712 >= 0.52273 4 11 DonPerYear AveIncEA < 0.08712 >= 54376.5 < 54376.5 5 12 NewRegion AveIncEA VanFraser 7 < 69546 >= 69546 13 Log.LastDonAmt Log.LastDonAmt No n = 30 1 0.8 0.6 0.4 0.2 0 Yes No n = 18 1 0.8 0.6 0.4 0.2 0 Yes n = 24 1 0.8 0.6 0.4 0.2 0 No No n = 14 1 0.8 0.6 0.4 0.2 0 Yes No n = 87 1 0.8 0.6 0.4 0.2 0 < 3.34604 >= 3.34604 Yes No n=7 1 0.8 0.6 0.4 0.2 0 Yes No n = 98 1 0.8 0.6 0.4 0.2 0 Yes No n = 166 1 0.8 0.6 0.4 0.2 0 Yes Yes No < 2.1719 >= 2.1719 Yes Other n = 100 1 0.8 0.6 0.4 0.2 0 Seguimos trabajando… Habrá que leer algo para terminar de entender esto. Lecturas recomendadas rpart() – An Introduction to Recursive Partitioning – User Written Split Functions library(party) ctree() – party with the mob – party: A Laboratory for Recursive Partytionin library(partykit) – partykit: A Toolkit for Recursive Partytioning – Resumen Y un buen resumen Un buen resumen lo vamos a encontrar en : http://www.statmethods.net/advstats/cart.html Y en HSUAR