arboles de decisión
Short Description
Download arboles de decisión...
Description
ARBOLES DE DECISION Edgar Acuna/CIIC 8015 Introducción
El uso de árboles de decisión tuvo tuvo su origen en las ciencias sociales con con los trabajos de Sonquist y Morgan (1964) y Morgan y Messenger (1979) (1979) realizado en el Survey Research Center del Institute for Social Research de la Universidad de Michigan. El programa AID (Automatic Interaction Detection), de Sonquist, Baker y Morgan (1971), fue uno de los primeros métodos de ajuste de los datos basados en árboles de clasificación. En estadística, Kass (1980) introdujo un algoritmo recursivo de clasificación no binario, llamado CHAID (Chi-square automatic automatic interaction detection). Más tarde, Breiman, Breiman, Friedman, Olshen Olshen y Stone (1984) introdujeron un nuevo algoritmo algoritmo para la construcción construcción de arboles y los aplicaron aplicaron a problemas de regresión y clasificación. El método es conocido como CART (Classification and regression trees) por sus siglas en inglés. Casi al mismo tiempo el proceso de indución mediante árboles de decisión decisión comenzó a ser usado por la comunidad comunidad de “Machine Learning” Learning” (Michalski, (1973), Quinlan (1983)) y la comunidad de “Pattern Recognition” (Henrichon y Fu, 1969). “Machine Learning “ es un sub-área de Inteligencia Artificial que cae dentro del campo de ciencias de computación. computación. “Pattern Recognition” cae dentro del área de Ingeniería Ingeniería Eléctrica. Eléctrica. Hoy en día los que más están contribuyendo al desarrollo de clasificación basada en árboles de decisión es la gente de “Machine Learning”. El término árboles es por la gráfica, aunque aunque los arboles son mostrados mostrados creciendo hacia hacia la parte inferior de la página. La raíz es el nodo superior, en cada nodo se hace una partición hasta llegar a un nodo terminal u hoja. Cada nodo no-terminal contiene una pregunta en la cual se basa la división del nodo. Cada nodo terminal contiene el valor de la variable de respuesta (árboles para regresión) o el nombre de la clase a la cual pertenece(árboles para clasificación).
Figura 1: Un árbol de clasificación para un problema con J = 3 clases y p = 25 variables predictoras
Existen muchos algoritmos algoritmos ,entre los algoritmos mas usados usados están:
C4.5. Introducido por Quinlan (1983) dentro de la comunidad de “Machine Learning”. CHAID. Significa “Chi-square automatic interaction detection”, fue introducido por Kass (1980) y es un derivado del THAID: “A sequential search program for the analysis of nominal scale dependent variables” (Morgan and Messenger, 1973). Está disponible como un modulo del paquete estadístico SPSS. El criterio para particionar está basado en χ2 y para terminar el proceso se requiere definir de antemano un “threshold” (umbral). NewId. Es muy similar a C4.5. CART. Introducido por Breiman et al. (1984), propiamente es un algoritmo de árboles de decisión binario. Existe una versión similar llamada IndCART y que está disponible en el paquete IND distribuido por la NASA El citerio para particionar es la impureza del nodo. Arboles Bayesianos: Está basado en aplicación de métodos Bayesianos a arboles de decisión. Buntine (1992. Disponible en el paquete IND distribuido por la NASA. CN2. Introducido por Clark and Niblett (1988).
En este curso usaremos solo C4.5 y RPART (PARTicionamiento Recursivo), una versión de CART disponible en R. Un árbol de decisión particiona el espacio de variables predictoras en un conjunto de hiperrectángulos y en cada uno de ellos ajusta un modelo sencillo, generalmente una constante. Es decir y=c, donde y es la variable de respuesta. La construcción de un árbol de decisión se basa pues en cuatro elementos: a) Un conjunto de preguntas binarias Q de la forma { x ∈ A?} donde A es un subconjunto del espacio muestral. b) El método usado para particionar los nodos. c) La estrategia requerida para parar el crecimiento del árbol. d) La asignación de cada nodo terminal a un valor de la variable de respuesta (regresión) o a una clase (clasificación). Las diferencias principales entre los algoritmos para construir árboles se hallan en la estrategia para podar los árboles, la regla para particionar los nodos y el tratamiento de valores perdidos (“missing values”).
Ejemplo (árboles para regresión) Las variables predictoras son gestage= tiempo de gestación, y birthwt=peso y la variable de respuesta es headcirc=circunferencia de la cabeza de 100 nacidos. Los datos están disponibles en http://math.uprm.edu/~edgar/headcirc.txt .Ajustar un modelo de regresión por árboles.
Usando la librería Rpart se obtiene los siguientes resultados >datos1=read.table(“http://math.uprm.edu/~edgar/headcirc.txt”,header=T) >arbol1=rpart(headcirc~gestage+birthwt,data=datos1) > arbol1 n= 100
node), split, n, deviance, yval * denotes terminal node 1) root 100 634.750000 26.45000 2) birthwt< 840 21 25.809520 23.09524 4) birthwt< 720 14 9.214286 22.64286 * 5) birthwt>=720 7 8.000000 24.00000 * 3) birthwt>=840 79 309.772200 27.34177 6) gestage< 30.5 54 97.500000 26.50000 12) birthwt< 1180 30 27.200000 25.60000 24) birthwt< 1045 15 15.733330 25.13333 * 25) birthwt>=1045 15 4.933333 26.06667 * 13) birthwt>=1180 24 15.625000 27.62500 26) gestage< 29.5 17 7.529412 27.29412 * 27) gestage>=29.5 7 1.714286 28.42857 * 7) gestage>=30.5 25 91.360000 29.16000 14) birthwt< 1430 15 63.333330 28.66667 * 15) birthwt>=1430 10 18.900000 29.90000 * >plot(arbol1) >text(arbol1,use.n=TRUE)
El siguiente programa en R particiona el espacio de las variables predictoras en las 8 regiones definidas por los nodos terminales plot(datos1$gestage,datos1$birthwt,type="n",xlab="gestage",ylab="birthwt") abline(h=720) abline(h=840) lines(c(30.5,30.5),c(840,1550)) lines(c(29.5,29.5),c(1180,1550)) lines(c(0,30.5),c(1180,1180)) lines(c(30.5,36),c(1430,1430)) lines(c(0,30.5),c(1045,1045)) text(30,600,"R1") text(30,780,"R2") text(27,950,"R3") text(27,1100,"R4")
text(27,1350,"R5") text(30,1350,"R6") text(32,1250,"R7") text(32,1470,"R8")
El siguiente programa en R visualiza el modelo creado por el árbol de decision ggest=seq(min(datos1$gestage),max(datos1$gestage),length=50) gbw=seq(min(datos1$birthwt),max(datos1$birthwt),length=50) grid1=list(gestage=ggest,birthwt=gbw) grid1=expand.grid(grid1) estimado=predict(arbol1,grid1) matest=matrix(estimado,50,50) persp(ggest, gbw, matest, theta=30, phi=45, xlab="gestage", ylab="birthwt", zlab="headcir", col="lightgreen")
En este caso la superficie de regresión es estimada usando el siguiente modelo aditivo K
s ( x) =
∑ ci I N ( x) i
i =1
las constantes c i son constantes y I Ni(x)= 1 si x ε Ni y es igual a 0 en otro caso. Las k regiones N i son hiperectángulos disjuntos con lados paralelos a los ejes coordenados. Los hiperrectángulos son construidos por particionamiento recursivo y pueden ser representados por un árbol. Ejemplo (árboles para clasificación).
Las variables predictoras son notas en los exámenes I y II de un estudiante y hay dos clases: P, pasar la clase o F: fracasar la clase.
Los datos están disponibles en http://math.uprm.edu/~edgar/eje1disc.dat. Hallar un clasificador basado en árboles. > library(rpart) > eje1dis=read.table(“http://math.uprm.edu/~edgar/eje1disc.dat”) >arbol=rpart(V4~V1+V2, data=eje1dis,method=”class”,control=rpart.control(minbucket=2)) > print(arbol) n= 32 node), split, n, loss, yval, (yprob) * denotes terminal node 1) root 32 8 p (0.25000000 0.75000000) 2) V2< 43.5 9 2 f (0.77777778 0.22222222) 4) V1< 75.5 6 0 f (1.00000000 0.00000000) * 5) V1>=75.5 3 1 p (0.33333333 0.66666667) * 3) V2>=43.5 23 1 p (0.04347826 0.95652174) * > De la información de los tres nodos terminales se puede ver que hay dos observaciones mal clasificadas. Dos observaciones que deberían ser clasificadas como “f” fueron clasificadas como “p” >. Una explicación detallada de cada paso es como sigue: > summary(arbol) Call: rpart(formula = V4 ~ V1 + V2, data = eje1, method = "class", control = rpart.control(minbucket = 2)) n= 32 CP nsplit rel error xerror xstd 1 0.625 0 1.000 1.000 0.3061862 2 0.125 1 0.375 0.625 0.2567449 3 0.010 2 0.250 0.625 0.2567449 Node number 1: 32 observations, complexity param=0.625 predicted class=p expected loss=0.25 class counts: 8 24 probabilities: 0.250 0.750 left son=2 (9 obs) right son=3 (23 obs) Primary splits: V2 < 43.5 to the left, improve=6.975845, (0 missing) V1 < 63 to the left, improve=3.000000, (0 missing) Surrogate splits: V1 < 50.5 to the left, agree=0.75, adj=0.111, (0 split) Node number 2: 9 observations, complexity param=0.125 predicted class=f expected loss=0.2222222 class counts: 7 2 probabilities: 0.778 0.222 left son=4 (6 obs) right son=5 (3 obs) Primary splits: V1 < 75.5 to the left, improve=1.7777780, (0 missing)
V2 < 33.5 to the right, improve=0.7111111, (0 missing) Surrogate splits: V2 < 25.5 to the right, agree=0.778, adj=0.333, (0 split) Node number 3: 23 observations predicted class=p expected loss=0.04347826 class counts: 1 22 probabilities: 0.043 0.957 Node number 4: 6 observations predicted class=f expected loss=0 class counts: 6 0 probabilities: 1.000 0.000 Node number 5: 3 observations predicted class=p expected loss=0.3333333 class counts: 1 2 probabilities: 0.333 0.667 > # graficando el arbol > plot(arbol) > text(arbol,use.n=T) ># Graficando las regiones creadas por el arbol en que el espacio muestral >plot(eje1dis$V1,eje1dis$V2,type="n",xlab="E1",ylab="E2") >text(eje1dis$V1,eje1dis$V2,as.character(eje1dis$V4)) >lines(c(75.5,75.5),c(0,43.5)) > abline(h=43.5) > ajuste=predict(arbol) > ajuste f p 1 0.04347826 0.9565217 2 0.04347826 0.9565217 3 0.04347826 0.9565217 4 0.04347826 0.9565217 5 0.04347826 0.9565217 6 0.04347826 0.9565217 7 0.04347826 0.9565217 8 0.04347826 0.9565217 9 0.04347826 0.9565217 10 0.04347826 0.9565217 11 0.04347826 0.9565217 12 0.04347826 0.9565217 13 0.04347826 0.9565217 14 0.04347826 0.9565217 15 0.04347826 0.9565217 16 0.33333333 0.6666667 17 0.04347826 0.9565217 18 0.04347826 0.9565217 19 0.33333333 0.6666667 20 0.04347826 0.9565217 21 0.04347826 0.9565217
22 0.04347826 0.9565217 23 0.04347826 0.9565217 24 0.04347826 0.9565217 25 0.04347826 0.9565217 26 1.00000000 0.0000000 27 1.00000000 0.0000000 28 1.00000000 0.0000000 29 1.00000000 0.0000000 30 1.00000000 0.0000000 31 0.33333333 0.6666667 32 1.00000000 0.0000000 > > classpredi=apply(ajuste,1,which.max) > classpredi 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 27 28 29 30 31 32 1 1 1 1 2 1 > c("F","P")[classpredi] [1] "P" "P" "P" "P" "P" "P" "P" "P" "P" "P" "P" "P" "P" "P" "P" "P" "P" "P" "P" [20] "P" "P" "P" "P" "P" "P" "F" "F" "F" "F" "F" "P" "F" > eje1dis$V4 [1] p p p p p p p p p p p p p p p p p p p p p p p p f f f f f f f f Levels: f p Notar que hay dos observaciones mal clasificadas. Dando una tasa de error estimada de 6.25%. Más adelante se verá otra forma de estimar el error usando validación cruzada.
La siguiente figura muestra la regiones de clasificación predichas por el método de árboles
View more...
Comments