Documentos de Académico
Documentos de Profesional
Documentos de Cultura
FEBRERO 2002
RESUMEN
La Minera de Datos (Data Mining) es la bsqueda de patrones interesantes y de regularidades importantes en grandes bases de datos. El Aprendizaje Automtico es el campo de la Ingeniera Informtica en el que se estudian y desarrollan algoritmos que implementan los distintos modelos de aprendizaje y su aplicacin a la resolucin de problemas prcticos. La minera de datos inteligente utiliza mtodos de aprendizaje automtico para descubrir y enumerar patrones presentes en los datos.
Uno de los mtodos ms conocidos para describir los atributos de una entidad de una base de datos es utilizar un rbol de decisin o de clasificacin, que puede transformarse sin inconveniente a un conjunto de reglas de decisin.
En este contexto, el propsito de este proyecto es estudiar de que manera la familia TDIDT, que aborda el problema de inducir rboles de decisin, puede utilizarse para descubrir automticamente reglas de negocio a partir de la informacin disponible en una base de datos. Se trabaj en particular con los mtodos ID3 y C4.5, miembros de dicha familia. El trabajo contempla el diseo, especificacin e implementacin de un ambiente de minera de datos que integra ambos algoritmos. Adems, se desarroll un mtodo de evaluacin de los resultados para determinar la calidad de las reglas obtenidas.
Palabras clave: minera de datos, aprendizaje automtico, rboles de decisin, reglas de decisin, TDIDT, ID3, C4.5
ABSTRACT
Data mining is the search of interesting patterns and relevant regularities in large data bases. Machine Learning is the Informatic Engineerings field devoted to the analysis and development of algorithms implementing the different learning models and their application to the solution of practical problems. Intelligent data mining uses machine learning methods to find and list the patterns present in the data.
One of the best known methods to describe the attributes of an entity of a data base is the use of a decision or classification tree, which can easily be turned into a set of decision rules.
Within this context, the purpose of the present project is to analyze the way in which the TDIDT family, which studies the problem of inducing decision trees, can be used to discover automatically business rules from the information available in a data base.
Resumen
Magdalena Servente
The work was focused in the ID3 and C4.5 methods, which belong to the family above mentioned. The work includes the design, specification and implementation of a data mining system that combines both algorithms. Furthermore, to determine the quality of the rules obtained, an evaluation method of the corresponding results was developed.
Keywords: data mining, machine learning, decision trees, decision rules, TDIDT, ID3, C4.5
Resumen
Magdalena Servente
Indice
Magdalena Servente
INDICE
CAPTULO 1: INTRODUCCIN CAPTULO 2: ESTADO DEL ARTE
2.1. Aprendizaje Automtico 2.1.1. Clasificacin general de los sistemas de Aprendizaje Automtico 2.1.2. Esquema general de un sistema de Aprendizaje Automtico 2.1.2.1. Aprendizaje de conceptos 2.1.2.2. Representacin de conceptos 2.1.3. Aprendizaje 2.1.3.1. Aprendizaje supervisado y no supervisado 2.1.3.2. Tipos de aprendizaje automtico 2.1.3.3 Mtodos clsicos de aprendizaje 2.2. Minera de Datos 2.2.1. Descubrimiento de conocimientos 2.2.2. Problemas inherentes al proceso de aprendizaje 2.2.3. Tareas realizadas por un sistema de Minera de Datos 2.2.4. Mtodos de Minera de Datos 2.2.5. Componentes de la Minera de Datos 2.2.5.1. Algoritmos de Clasificacin (Classification Algorithms) 2.2.5.2. Algoritmos de reglas de asociacin 2.2.5.3. Anlisis de Secuencias 2.3. Aprendizaje Automtico y Minera de Datos 2.3.1. Aplicaciones 2.3.1.1. ID3 2.3.1.2. C4.5 2.3.1.3. AQ15 2.3.1.4. CN2 2.3.1.5. DBLearn 2.3.1.6. Meta-Dendral 2.3.1.7. RADIX/RX 2.3.1.8. BACON 2.3.1.9. SLIQ 2.4 La Familia TDIDT 2.4.1. Construccin de los rboles de decisin
ii Magdalena Servente
1 5
6 8 8 8 10 11 11 12 14 14 15 16 17 18 20 20 21 22 22 23 23 24 24 24 25 25 26 26 26 27 27
Indice
2.4.1.1. Clculo de la Ganancia de Informacin 2.4.1.2. Datos Numricos 2.4.1.3. Poda de los rboles generados 2.4.1.4. El Principio de Longitud de Descripcin Mnima 2.4.2. Atributos Desconocidos 2.4.2.1. Estudio sobre datos con atributos desconocidos en la Induccin 2.4.3. Transformacin a Reglas de Decisin 2.5.Evaluacin de los Mtodos de Aprendizaje 2.5.1 Evaluacin en la familia TDIDT 2.5.2. Mtodos de evaluacin 2.5.2.1. Evaluacin Cruzada (Cross-Validation) 2.5.2.2 Dejar-uno-afuera (Leave-one-out) 2.5.2.3. Bootstrap 2.5.3. Estimacin del costo
28 29 30 31 32 33 35 36 37 37 37 39 39 40
43
43 44
47
48 48 49 50 50 51 51 52 52 53 55 56 57 57 57 58
iii
4.3.1.5. Resolucin de un ejemplo utilizando el ID3 4.3.2. Limitaciones al ID3 4.3.2.1. Valores continuos 4.3.2.3. Ventanas 4.4. C4.5 4.4.1. Algoritmo C4.5 4.4.2. Caractersticas particulares del C4.5 4.4.2.1. Pruebas utilizadas 4.4.2.2. Pruebas sobre atributos continuos 4.4.2.2. Atributos desconocidos 4.4.3. Poda de los rboles de Decisin 4.4.3.1. Cundo debemos simplificar? 4.4.3.2. Poda en Base a Errores 4.4.4. Estimacin de la Proporcin de Errores para los rboles de Decisin 4.4.5. Construccin de un rbol de decisin utilizando el C4.5 4.4.6. Generalizacin de reglas 4.4.6.1. Conjuntos de Reglas 4.4.6.2. Orden de las clases y eleccin de la clase por defecto 4.4.6.3. Generalizacin de un rbol de decisin a reglas de decisin utilizando el C4.5 4.5. Sistema integrador 4.5.1. Descripcin general 4.5.2. Diseo del sistema integrador 4.5.2.1. Diseo para el ID3 4.5.2.2. Diseo para el C4.5
58 62 62 63 64 64 65 65 65 66 68 69 70 72 72 76 77 80 80 83 83 85 85 90
97
97 97 97 98 98 98 100 100 101 102 102
iv
Magdalena Servente
Indice
5.2.4. Estudio sobre hongos 5.2.5. Elita: Base de Asteroides 5.2.6. Hipotiroidismo 5.2.7. Identificacin de vidrios 5.3. Resultados Obtenidos con el ID3 5.3.1. Crditos 5.3.1.1. ID3 utilizando la ganancia como criterio de decisin 5.3.1.2. ID3 utilizando la proporcin ganancia como criterio de decisin 5.3.1.3. Conclusiones 5.3.2. Cardiologa 5.3.2.1. ID3 utilizando la ganancia como criterio de decisin 5.3.2.2. ID3 utilizando la proporcin ganancia como criterio de decisin 5.3.2.3. Conclusiones 5.3.3. Votaciones 5.3.4.1. ID3 utilizando la ganancia como criterio de decisin 5.3.4.2. ID3 utilizando la proporcin ganancia como criterio de decisin 5.3.4.3. Conclusiones 5.3.4. Estudio sobre hongos 5.3.4.1. ID3 utilizando la ganancia como criterio de decisin 5.3.4.2 ID3. utilizando la proporcin ganancia como criterio de decisin 5.3.4.3. Conclusiones 5.4. Resultados Obtenidos con el C4.5 5.4.1. Crditos 5.4.1.1. Utilizando la ganancia como criterio de decisin 5.4.1.2. Utilizando la proporcin de ganancia como criterio de decisin 5.4.1.3. Conclusiones 5.4.2. Cardiologa 5.4.2.1. Utilizando la ganancia como criterio de decisin 5.4.2.2. Utilizando la proporcin ganancia como criterio de decisin 5.4.2.3. Conclusiones 5.4.3. Votaciones 5.4.3.1. Utilizando la ganancia como criterio de decisin 5.4.3.2. Utilizando la proporcin ganancia como criterio de decisin 5.4.3.3. Conclusiones 5.4.4. Estudio sobre hongos 5.4.4.1. Utilizando la ganancia como criterio de decisin 5.4.4.2. Utilizando la proporcin ganancia como criterio de decisin 5.4.4.3. Conclusiones 5.4.5. Elita
Indice Magdalena Servente
103 104 105 106 107 108 108 110 112 113 113 115 117 118 118 123 128 129 129 132 134 135 135 135 137 139 140 140 142 144 145 145 147 149 150 150 153 157 158
v
5.4.5.1. Utilizando la ganancia como criterio de decisin 5.4.3.2. Utilizando la proporcin ganancia como criterio de decisin 5.4.5.3. Conclusiones 5.4.6. Hipotiroidismo 5.4.6.1. Utilizando la ganancia como criterio de decisin 5.4.6.2. Utilizando la proporcin ganancia como criterio de decisin 5.4.6.3. Conclusiones 5.4.7. Identificacin de vidrios 5.4.7.1. Utilizando la ganancia como criterio de decisin 5.4.7.2. Utilizando la proporcin ganancia como criterio de decisin 5.4.7.3. Conclusiones 5.5. Comparacin de los resultados obtenidos con el ID3 y con el C4.5 5.5.1. Crditos 5.5.2. Cardiologa 5.5.3. Votaciones 5.5.4. Estudio sobre hongos 5.6. Anlisis general de los resultados obtenidos 5.6.1. Porcentaje de error 5.6.2. Cantidad de datos de entrenamiento
158 160 162 163 163 166 169 169 169 173 177 177 177 180 181 185 187 187 188
CAPTULO 6: CONCLUSIONES
6.1. Conclusiones Generales 6.1.1. Conceptos destacables 6.1.2. Espacio de hiptesis 6.2. Anlisis de los Resultados Obtenidos 6.3. Anlisis de la solucin propuesta 6.4. Una mirada al futuro 6.4.1. Atributos multivaluados en el ID3 y el C4.5 6.4.2. El futuro de la Minera de Datos Inteligente
191
191 191 192 193 193 195 195 196
197
197 198 198
vi
Magdalena Servente
Indice
A.2.2. Descripcin del men A.2.2.1. Men Resolucin A.2.2.2. Men Evaluacin A.2.2.3. Men Opciones A.2.2.4. Men Ayuda
203 205
205 206 206 207 207 207 207 207 207 207 208 208 208 208 208 209 209 209 209 209 209 209 209 210 211
213
213
vii
D.2. Mdulos de Pantallas Principales D.2.1. UPrincipal D.2.1.1. UPrincipal.h D.2.1.1. UPrincipal.cpp D.2.2. UInfoGral D.2.2.1. UInfoGral.h D.2.2.2. UInfoGral.cpp D.3. Mdulos de opciones generales D.3.1. UBD D.3.1.1. UBD.h D.3.1.2. UBD.cpp D.3.2. UCambioTabla D.3.2.1. UCambioTabla.h D.3.2.2. UCambioTabla.cpp D.3.3. frmOpcionesSist D.3.3.1. frmOpcionesSist.h D.3.3.2. frmOpcionesSist.cpp D.3.4. UElegirRendimiento D.3.4.1. UElegirRendimiento.h D.3.4.2. UElegirRendmiento.cpp D.3.5. URendimiento D.3.5.1. URendimiento.h D.3.5.2. URendmiento.cpp D.3.6. Uarbol D.3.6.1. UArbol.h D.3.6.2. UArbol.cpp D.4. Mdulos de minera de datos D.4.1. UDMID3 D.4.1.1. UDMID3.h D.4.1.2. UDMID3.cpp D.4.2. UDMC45 D.4.2.1. UDMC45.h D.4.2.2. UDMC45.cpp D.5. Mdulos de clases de datos D.5.1. UTipos D.5.1.1. UTipos.h D.5.1.2. UTipos.cpp D.5.2. Types.h
214 214 214 215 217 217 218 219 219 219 219 220 220 220 223 223 224 225 225 226 228 228 228 229 229 229 231 231 231 233 251 251 256 332 332 332 333 337
viii
Magdalena Servente
Indice
339 339
REFERENCIAS
341
Indice
Magdalena Servente
ix
CAPTULO 1 INTRODUCCIN
La Minera de Datos (Data Mining) es la bsqueda de patrones interesantes y de regularidades importantes en grandes bases de datos [Fayad et al., 1996- Grossman et al., 1999]. Al hablar de minera de datos inteligente [Evangelos, 1996, Michalski et al., 1998] nos referimos especficamente a la aplicacin de mtodos de aprendizaje automtico u otros mtodos similares, para descubrir y enumerar patrones presentes en los datos.
El Aprendizaje Automtico es el campo de la Ingeniera Informtica en el que se estudian y desarrollan algoritmos que implementan los distintos modelos de aprendizaje y su aplicacin a la resolucin de problemas prcticos [Michalski, 1983- Dejong & Money 1986; Bergadano et al., 1992]. Entre los problemas abordados en este campo, est el de inducir conocimientos a partir de datos o ejemplos [Michalski, 1983,1991; Michie, 1988; Garca Martnez, 1994]. Esto resulta una alternativa de solucin a problemas que no pueden ser resueltos mediante algoritmos tradicionales, entre los cuales podemos mencionar especificacin de condiciones asociadas a diagnsticos tcnicos o clnicos, identificacin de caractersticas que permitan reconocimiento visual de objetos, descubrimiento de patrones o regularidades en estructuras de informacin (en particular en bases de datos de gran tamao), entre otros.
Los mtodos tradicionales de Anlisis de Datos incluyen el trabajo con variables estadsticas, varianza, desviacin estndar, covarianza y correlacin entre los atributos; anlisis de componentes (determinacin de combinaciones lineales ortogonales que maximizan una varianza determinada), anlisis de factores (determinacin de grupos correlacionados de atributos), anlisis de clusters (determinacin de grupos de conceptos que estn cercanos segn una funcin de distancia dada), anlisis de regresin (bsqueda de los coeficientes de una ecuacin de los puntos dados como datos), anlisis multivariable de la varianza, y anlisis de los discriminantes [Michalski et al., 1982]. numricamente. Son esencialmente cuantitativos. Todos estos mtodos estn orientados
En contraposicin, los mtodos basados en Aprendizaje Automtico, estn orientados principalmente hacia el desarrollo de descripciones simblicas de los datos, que puedan caracterizar uno o ms grupos de conceptos [Garca Martnez et al., 1987, Mitchel, 1996], diferenciar entre distintas clases, crear nuevas clases, crear una nueva clasificacin conceptual, seleccionar los atributos ms representativos, y ser capaces de predecir secuencias lgicas [Michalski et al., 1983; 1986; Michalski, Tecuci, 1994]. Son esencialmente cualitativos.
Introduccin
Magdalena Servente
En las bases de datos las entidades se caracterizan generalmente por el valor de los atributos y no por las relaciones entre ellas, con lo cual se utilizan mtodos atribucionales. Uno de los mtodos ms conocidos para describir los atributos de una entidad es utilizar un rbol de decisin o de clasificacin [Michalski et al., 1998Grossman et al., 1999], cuyos nodos corresponden a los atributos, las ramas que salen de ellos son los valores de los atributos, y las hojas son corresponden a clases individuales. La gran ventaja de los rboles de clasificacin es que se pueden transformar sin inconveniente a un conjunto de reglas de decisin.
En este contexto, el propsito de este proyecto es estudiar de que manera la familia TDIDT [Quinlan, 1986; 1990], que aborda el problema de inducir rboles de decisin, puede utilizarse para descubrir automticamente reglas de negocio a partir de la informacin disponible en una base de datos.
En el captulo 2 se presenta el estado actual del Aprendizaje Automtico (Seccin 2.1), en mltiples aspectos, que incluyen la clasificacin general de este tipo de sistemas (Seccin 2.1.1) el esquema general de un sistema de Aprendizaje Automtico (Seccin 2.1.2) y los distintos tipos de aprendizaje en general (Seccin 2.1.3). Luego, se presenta el estado actual de la Minera de Datos (Seccin 2.2), incluyendo descripciones de: el descubrimiento de conocimientos (Seccin 2.2.1), los problemas inherentes al aprendizaje de conceptos (Seccin 2.2.2), las tareas realizadas por un sistema de Minera de Datos (Seccin 2.2.3), los principales mtodos de la Minera de Datos (Seccin 2.2.4) y sus componentes (Seccin 2.2.5). A partir de la presentacin de estos dos grandes temas, se presentan varias aplicaciones en las que se realiza Minera de Datos con sistemas de Aprendizaje Automtico (Seccin 2.3.1), entre los cuales se encuentra la familia TDIDT (Top-Down-Induction-Trees) (Seccin 2.4) en la cual centraremos nuestra atencin. Se explica la construccin de los rboles TDIDT (Seccin 2.4.1), el tratamiento de los atributos desconocidos (Seccin 2.4.2), y la transformacin de los rboles a reglas de decisin (Seccin 2.4.3). Finalmente, se presentan varios mtodos utilizados actualmente para evaluar los distintos mtodos de Aprendizaje Automtico (Seccin 2.5)
En el captulo 3 se presenta el contexto de nuestro problema de inters (Seccin 3.1) y las cuestiones que los algoritmos ID3 y C4.5 pertenecientes a la familia TDIDT deben resolver (Seccin 3.2).
En el captulo 4 se presentan todos los aspectos de la solucin propuesta. Para ello se describen las caractersticas generales de la misma (Seccin 4.1): el marco terico (Seccin 4.1.1), las condiciones que deben cumplir los datos sobre los que se realiza la Minera de Datos (Seccin 4.1.2) y los tipos de resultados obtenidos (Seccin 4.1.3). En la Seccin 4.2 se presenta una descripcin general de los algoritmos ID3 y C4.5 que se utilizan para estudiar el problema. Se explica cmo realizar la divisin de los datos de entrada (Seccin 4.2.1) y la eleccin del criterio de divisin (Seccin 4.2.1.1). Luego, se presenta una descripcin detallada del algoritmo ID3 (Seccin 4.3.1) y de sus limitaciones (Seccin 4.3.2). A modo de ejemplo, se muestra la utilizacin del ID3 para generar un rbol y reglas de decisin (Seccin 4.3.1.5). Tambin se detalla el algoritmo C4.5 (Seccin 4.4) y sus caractersticas particulares (Seccin 4.4.2), las cuales lo diferencian del ID3, resaltando la poda de los rboles de decisin (Seccin
2 Magdalena Servente Introduccin
4.4.3) y la estimacin de errores en dichos rboles (Seccin 4.4.4). En la seccin 4.4.5 se ejemplifican los mtodos anteriores. La generalizacin de las reglas de decisin realizada por el C4.5 se explica en la seccin 4.4.6. A continuacin, se detalla el diseo del sistema integrador utilizado para estudiar el xito de la solucin propuesta (Seccin 4.5). Para este sistema se presenta una descripcin general (Seccin 4.5.1) y el diseo de las secciones del sistema para el ID3 (Seccin 4.5.2.1) y para el C4.5 (Seccin 4.5.2.2)
En el captulo 5 se presentan los resultados obtenidos. Primero, se explica la manera en que debe realizarse la interpretacin de los mismos (Seccin 5.1), se presentan los formatos de los rboles y las reglas de decisin tanto para el ID3 (Seccin 5.1.1) como para el C4.5 (Seccin 5.1.2). Luego, se describen los dominios de datos sobre los que se trabaj (Seccin 5.2), y se analizan los resultados obtenidos con el ID3 (Seccin 5.3) y con el C4.5 (Seccin 5.4). En cada caso se presenta, el rbol y las reglas de decisin obtenidos, y la evaluacin de resultados sobre el conjunto de datos de prueba. En la seccin 5.5 se comparan los resultados obtenidos con el ID3 y con el C4.5 en los distintos dominios. Y en la seccin 5.6 se realiza un anlisis general de los resultados.
En el captulo 6 se presentan las conclusiones del trabajo realizado. Primero se destacan los conceptos ms importantes a tener en cuenta a la hora de aplicar algn mtodo como el ID3 y el C4.5 (Seccin 6.1.1). Luego, se analiza la bsqueda que realizan estos dos mtodos en el espacio de hiptesis (Seccin 6.1.2). Se extraen conclusiones a partir de los resultados obtenidos (Seccin 6.2) y se analiza la solucin propuesta (Seccin 6.3). Finalmente, se plantean mejoras y temas a tener en cuenta para continuar con el desarrollo de este tipo de algoritmos de aprendizaje aplicados a la Minera de Datos (Seccin 6.4).
El Anexo A describe el sistema en forma de un resumido manual del usuario. Se describen las caractersticas generales del sistema (Seccin A.1) y las funciones de cada uno de los menes (Seccin A.2), detallando las acciones que pueden realizarse con cada una de las opciones disponibles.
En el Anexo B se detallan los conjuntos de datos utilizados para realizar las pruebas descriptas en el Captulo 5. Para cada uno de los dominios, se muestran los conjuntos de datos de entrenamiento y prueba. Los datos presentados corresponden a los siguientes dominios: Crditos (Seccin B.1), Cardiologa (Seccin B.2), Votaciones (Seccin B.3), Estudio sobre hongos (Seccin B.4), Elita: Base de Asteroides (Seccin B.5), Hipotiroidismo (Seccin B.6), Identificacin de vidrios (Seccin B.7).
El Anexo C es un complemento a la explicacin de la funcionalidad del sistema de la Seccin 4.5. En la seccin C.1 se detalla la interaccin entre los mdulos del sistema. Las principales funciones de cada uno de estos mdulos se presentan en la seccin C.2. En la seccin C.3 se detallan las principales estructuras de datos utilizadas por el sistema
Introduccin
Magdalena Servente
Finalmente, en el anexo D se presenta el cdigo fuente del sistema desarrollado. En la seccin D.1 se presenta el cdigo fuente del archivo TDIDT.cpp que es el archivo inicial del proyecto y es quien inicializa al resto de los formularios requeridos. En la seccin D.2 se presenta el cdigo fuente de las pantallas principales. A continuacin, se detallan los cdigos fuentes de los mdulos de opciones generales (Seccin D:3), de los mdulos de minera de datos (Seccin D.4) y de los mdulos de clases o estructuras de datos (Seccin D.5)
En las Referencias se detallan la bibliografa y las referencias utilizadas para realizar el trabajo.
Magdalena Servente
Introduccin
Este captulo presenta el estado actual del Aprendizaje Automtico (Seccin 2.1), en mltiples aspectos, que incluyen la clasificacin general de este tipo de sistemas (Seccin 2.1.1) el esquema general de un sistema de Aprendizaje Automtico (Seccin 2.1.2) y los distintos tipos de aprendizaje en general (Seccin 2.1.3). Luego, se presenta el estado actual de la Minera de Datos (Seccin 2.2), incluyendo descripciones de: el descubrimiento de conocimientos (Seccin 2.2.1), los problemas inherentes al aprendizaje de conceptos (Seccin 2.2.2), las tareas realizadas por un sistema de Minera de Datos (Seccin 2.2.3), los principales mtodos de la Minera de Datos (Seccin 2.2.4) y sus componentes (Seccin 2.2.5). A partir de la presentacin de estos dos grandes temas, se presentan varias aplicaciones en las que se realiza Minera de Datos con sistemas de Aprendizaje Automtico (Seccin 2.3.1), entre los cuales se encuentra la familia TDIDT (Top-Down-Induction-Trees) (Seccin 2.4) en la cual centraremos nuestra atencin. Se explica la construccin de los rboles TDIDT (Seccin 2.4.1), el tratamiento de los atributos desconocidos (Seccin 2.4.2), y la transformacin de los rboles a reglas de decisin (Seccin 2.4.3). Finalmente, se presentan varios mtodos utilizados actualmente para evaluar los distintos mtodos de Aprendizaje Automtico (Seccin 2.5)
El Aprendizaje Automtico (Machine Learning) es el campo dedicado al desarrollo de mtodos computacionales para los procesos de aprendizaje, y a la aplicacin de los sistemas informticos de aprendizaje a problemas prcticos [Michalski et al, 1998]. La Minera de Datos (Data Mining) es la bsqueda de patrones e importantes regularidades en bases de datos de gran volumen [Michalski et al, 1998].
Estos dos campos han ido creciendo a lo largo de los aos, y han cobrado una importancia considerable. Hoy en da, como se almacenan grandes volmenes de informacin en todas las actividades humanas, la Minera de Datos est cobrando gran importancia, se busca obtener informacin valiosa a partir de los datos guardados. La Minera de Datos utiliza mtodos y estrategias de otras reas o ciencias, entre las cuales podemos nombrar al Aprendizaje Automtico. Cuando este tipo de tcnicas se utilizan para realizar la minera, decimos que estamos ante una Minera de Datos Inteligente.
El campo de aplicacin del Aprendizaje Automtico, no obstante, no se limita nicamente a la Minera de Datos, existen mltiples aplicaciones de Aprendizaje Automtico en funcionamiento. Si analizamos su aplicacin a la Minera de Datos en particular, encontramos que hay varios mtodos que se utilizan con xito hoy en da, entre los cuales se encuentran los mtodos de induccin. Nuestro anlisis se centrar en
Magdalena Servente
una familia de mtodos de induccin conocida como la familia TDIDT (Top Down Induction Trees), y en particular en los algoritmos ID3 y C4.5 desarrollados por Quinlan, pertenecientes a la misma.
Cmo sabemos si un sistema ha adquirido algn conocimiento? Siguiendo el anlisis de Witten [Witten y Frank, 2000], podemos plantearnos las siguientes preguntas: qu es el aprendizaje?, y qu es el Aprendizaje Automtico? Si buscamos la definicin de Aprendizaje en la Enciclopedia, encontraremos las siguientes definiciones o alguna similar: Adquirir el conocimiento de alguna cosa por medio del estudio, de la experiencia o al ser instruido; Concebir alguna cosa por meras apariencias o con poco fundamento; Tomar algo en la memoria; Ser informado de; recibir instruccin [Espasa-Calpe, 1974]. Todas estas definiciones se aplican con facilidad a los seres humanos, veamos si pueden aplicarse tambin a los sistemas informticos. En trminos de Aprendizaje Automtico lo primero que debemos ser capaces de hacer es determinar si un sistema informtico ha aprendido o no. En el caso de las dos primeras definiciones esto es imposible: no existe ninguna manera de preguntarle si ha adquirido conocimiento, ya que si le hacemos preguntas acerca de las cosas que debera haber aprendido, no estaramos midiendo sus nuevos conocimientos, sino su capacidad de responder preguntas. En cuanto a las ltimas dos definiciones, el hecho de guardar en memoria y recibir instrucciones son triviales para una computadora, son actividades vitales para ella que realiza todo el tiempo. De esto se deduce que una computadora sera capaz de aprender a la luz de las ltimas dos definiciones.
Esta afirmacin no tiene nada de novedoso para nosotros. Si un sistema de informacin es capaz de aprender, entonces debe ser capaz de aplicar los conocimientos memorizados o instruidos en una nueva situacin. Esto es justamente lo que evaluamos para saber si un ser humano ha aprendido o no, evaluamos su respuesta ante una nueva situacin. Siguiendo esta lnea de pensamiento, podemos afirmar entonces que las cosas (y los seres humanos tambin) aprenden cuando cambian su comportamiento de manera tal que les permite desarrollarse mejor en el futuro. A la luz de esta definicin que asocia el aprendizaje a la performance ms que al conocimiento, el aprendizaje es ms fcil de medir: podemos analizar si un sistema ha aprendido al ponerlo en una situacin en la que estuvo anteriormente y observando si se desempea mejor.
Magdalena Servente
Esta definicin sigue siendo engaosa. Una gran variedad de objetos modifican su comportamiento de manera tal que los hacen desempearse mejor y, sin embargo, no se puede decir que hayan aprendido. Tomemos por ejemplo, nuestras mejores pantuflas, podemos decir que han aprendido la forma de nuestro pie? Sin embargo, han cambiado su forma, su comportamiento para adaptarse mejor a nuestro pie y ciertamente son ms cmodas que cuando eran nuevas. Llamamos entrenamiento al tipo de aprendizaje que se realiza sin pensar. Entrenamos a los animales y a las plantas, pero hablar del entrenamiento de una pantufla sera ridculo. El aprendizaje, a diferencia del entrenamiento, requiere pensar, implica tener el propsito, directo o indirecto, de aprender; alguien o algo que aprende debe tener la intencin de hacerlo. El aprendizaje sin pensar es meramente un entrenamiento. Los sistemas de Aprendizaje Automtico tienen la intencin de construir un modelo a partir de los datos de entrada y cambian su comportamiento de manera tal que son capaces de clasificar nuevos datos y desarrollarse mejor en antiguas situaciones. En fin, podemos afirmar que los sistemas son capaces de aprender. An no sabemos, sin embargo, cmo hacer para que los sistemas aprendan en el mismo grado que los humanos. No obstante, se han creado algoritmos efectivos en ciertas tareas de aprendizaje, y el entendimiento terico del aprendizaje est comenzando a emerger [Mitchell, 1997].
Para complementar el enfoque anterior, debemos preguntarnos cmo aprenden los seres humanos y analizar si los si los sistemas son capaces de aprender de la misma manera. Los humanos aprendemos mediante tres mecanismos distinguibles: induccin, deduccin y abduccin. Podemos afirmar que los sistemas aprenden cuando son capaces de generar nuevos conocimientos, por cualquiera de los tres mtodos anteriores [Monter, 2001]. En un sistema de Aprendizaje Automtico, dicha generacin de conocimientos se realiza cuando los datos se transforman a un nivel superior que nos es ms til. Por ejemplo, cuando los datos presentes en una base de datos se transforman en un modelo de datos que los clasifica segn sus caractersticas o atributos.
Los algoritmos de la familia TDIDT que analizaremos, justamente construyen un modelo de nivel superior. Podemos afirmar entonces que son sistemas de Aprendizaje Automtico?
El tema fundamental para construir un sistema de aprendizaje automtico es, segn Mitchell [Mitchell, 1997], plantear el problema de aprendizaje de manera correcta. Para ello, debe contar con las tres partes esenciales de la siguiente definicin:
Se puede afirmar que un programa computacional es capaz de aprender a partir de la experiencia E con respecto a un grupo de tareas T y segn la medida de performance P, si su performance en las tareas T, medida segn P, mejora con la experiencia E.
Magdalena Servente
Los conocimientos previos contienen la informacin acerca del lenguaje utilizado para describir los ejemplos y los conceptos, es decir, son una suerte de metalenguaje. El sistema utiliza entonces, los conocimientos previos para interpretar los ejemplos y para generar descripciones a partir de ellos.
Magdalena Servente
comparten todas las aves y que las diferencias del resto de los seres vivos). A la luz de esta definicin vemos que si los lmites entre conceptos no estn claramente definidos, puede no ser fcil clasificar un ejemplo en particular. Por ejemplo, cul es el lmite entre un edificio alto y un edificio bajo, entre una mujer atractiva y una no atractiva.
Existen dos tcnicas de inferencia generales que se utilizan para extraer descripciones a partir de los conceptos: la deduccin y la induccin. La deduccin es la tcnica que infiere informacin como una consecuencia lgica de los ejemplos y conocimientos de base [Holsheimer, Siebes, 1994]. La induccin es la tcnica que infiere informacin generalizada de los ejemplos y conocimientos de base.
En la induccin, podemos trabajar con jerarquas de generalizacin, representadas por rboles o grafos [Michalski et al, 1998]. En una jerarqua de generalizacin, un concepto puede describirse por los objetos del nivel base o por cualquier objeto en un nivel superior. Analizando la Figura 2.2, podemos describir a la Universidad de Buenos Aires con los objetos de nivel base, en cuyo caso decimos que es una institucin educativa, universitaria y pblica; o podemos describirla con los objetos de nivel superior diciendo que la Universidad de Buenos Aires es una institucin educativa.
Instituciones Educativas
Primarias
Secundarias
Terciarias
Universitarias
Pblicas
Privadas
UBA
UTN
En este tipo de jerarquas, podemos identificar tres nociones que relacionan los conceptos: efecto de nivel bsico (basic-level effect), tipicalidad (typicality) y dependencia contextual (contextual dependency) [Michalski et al, 1998]. El efecto de nivel bsico hace referencia al hecho de que los conceptos de nivel base pueden ser descriptos por caractersticas fcilmente identificables por los humanos, lo cual hace que su aprendizaje sea simple para nosotros. Mientras que los conceptos de nivel superior se definen como grupos de conceptos de nivel bsico que comparten alguna caracterstica en comn. La segunda nocin, la tipicalidad, analiza cun tpico es un concepto. Puede medirse de acuerdo a la cantidad de caractersticas comunes que comparte con otros conceptos, y a la cantidad de caractersticas heredadas de los superconceptos (conceptos de nivel superior). En el aprendizaje, la tipicalidad es muy importante, por ejemplo, tratar de ensear el concepto de pjaro con los ejemplos de un pingino, un ganso y un avestruz,
Estado del Arte Magdalena Servente 9
no ser muy efectivo. En cambio, utilizar una golondrina, un gorrin y una paloma ser exitoso. Por ltimo, la dependencia contextual es importante porque los conceptos aprendidos dependen del contexto en el que estamos. Al definir estudiantes podemos estar pensando en estudiantes universitarios, estudiantes primarios, o estudiantes del curso de Anlisis Matemtico; el concepto que estamos tratando de ensear, depender del contexto en el que estamos.
En la lgica de orden cero, los ejemplos y conceptos se describen como conjunciones de constantes booleanas que representan valores de los atributos. El poder descriptivo de este tipo de lgica es bajo, por lo cual, el Aprendizaje Automtico lo utiliza nicamente para describir conceptos muy simples. Un ejemplo de una clusula en lgica de orden cero es:
Para solucionar el problema del bajo poder descriptivo de la lgica de orden cero, puede utilizarse la lgica de atributos. La idea bsica detrs de la lgica de atributos es caracterizar los ejemplos y conceptos como valores de algunos atributos predefinidos. En lugar de utilizar conjunciones de valores fijos, cada atributo es una variable. El poder descriptivo de la lgica de atributos es mayor que el de la lgica de orden cero, aunque en sentido matemtico la expresividad es la misma. Una clusula en lgica de atributos podra ser Juego_Tenis <= Pronstico ^ Viento ^ Humedad). Los ejemplos generalmente se presentan en una tabla donde cada fila representa un ejemplo y cada columna, un atributo. La tabla 2.1 contiene ejemplos positivos y negativos para los das en que es posible jugar al tenis.
Objeto Da 1 Da 2 Da 3 Da 4 Da 5
Juego_Tenis Si No No Si No
Tabla 2.1 Ejemplos positivos y negativos del concepto Juego_Tenis <= Pronstico ^ Viento ^ Humedad 10 Magdalena Servente Estado del Arte
Como lenguaje descriptivo, la lgica de atributos es mucho ms prctica que la lgica de orden cero. Por eso, es utilizada en muchos programas de Aprendizaje Automtico, como los de la familia TDIDT (rboles inductivos de arriba hacia abajo - Top-Down Induction Trees).
La lgica de predicados de primer orden utiliza las clusulas de Horn para representar conceptos. Estas clusulas simplifican las descripciones complicadas mediante el uso de predicados y variables. Son bastante potentes, incluso permiten la expresin de conceptos recursivos. El lenguaje Prolog se basa en la lgica de predicados de primer orden. Este tipo de lgica se utiliza en algunos programas de Aprendizaje Automtico, como el algoritmo FOIL. Un ejemplo de una clusula de Horn sera:
Por ltimo, la lgica de predicados de segundo orden considera a los nombres de los predicados como variables. La expresin anterior quedara de la forma:
Este tipo de lgica es la de mayor poder descriptivo. Sin embargo, dada su complejidad rara vez se utiliza en los sistemas de Aprendizaje Automtico.
2.1.3. Aprendizaje
2.1.3.1. Aprendizaje supervisado y no supervisado
Existen dos tipos de aprendizaje: el supervisado y el no supervisado [Michalski et al, 1998], [Holsheimer, Siebes, 1994]. En el aprendizaje supervisado o aprendizaje a partir de ejemplos, el instructor o experto define clases y provee ejemplos de cada una. El sistema debe obtener una descripcin para cada clase. Cuando el instructor define una nica clase, provee ejemplos positivos (pertenecen a la clase) y negativos (no pertenecen a la clase). En este caso, los ejemplos importantes son los cercanos al lmite, porque proveen informacin til sobre los lmites de la clase. Cuando el instructor define varias clases, el sistema puede optar por realizar descripciones discriminantes o no. Un conjunto de descripciones es discriminante si el total de las descripciones cubren todas las clases, pero una descripcin cubre una sola clase en particular.
Magdalena Servente
11
En el aprendizaje no supervisado o aprendizaje a partir de observaciones y descubrimientos, el sistema debe agrupar los conceptos1 sin ayuda alguna de un instructor. El sistema recibe los ejemplos, pero no se predefine ninguna clase. Por lo tanto, debe observar los ejemplos y buscar caractersticas en comn que permitan formar grupos. Como resultado, este tipo de aprendizaje genera un conjunto de descripciones de clases, que juntas cubren todas las clases y en particular describen a una nica clase.
Observacin pasiva
Experimentacin activa
En el aprendizaje por memorizacin los sistemas reciben conocimientos del medio ambiente y los guardan sin ningn tipo de procesamiento. Su complejidad se encuentra en el almacenamiento de los conocimientos y no en su adquisicin. Lo importante en estos casos es que la informacin est disponible
12
Magdalena Servente
cuando se requiera; no hay ningn tipo de inferencia ni procesamiento, por lo tanto, los conocimientos deben ser adquiridos y almacenados en un nivel que los haga directamente utilizables.
En el caso del aprendizaje por instruccin, los conocimientos son provistos por un instructor o experto en la materia (aprendizaje supervisado). La informacin provista es abstracta o de ndole general, por lo tanto, el sistema tendr que inferir los detalles. Es decir, el sistema deber transformar la informacin provista en trminos abstractos de alto nivel, a reglas que puedan ser utilizadas directamente en la tarea del sistema.
El aprendizaje por deduccin o aprendizaje guiado por la especificacin destaca o especifica las relaciones existentes entre conceptos. El sistema transforma las especificaciones recibidas como entrada en un algoritmo que actualiza relaciones.
En el aprendizaje por analoga, el sistema, que recibe informacin relevante a problemas anlogos a los que est tratando de resolver, debe descubrir las analogas e inferir reglas aplicables al problema. Se trata de generar nuevos conocimientos utilizando informacin preexistente.
En el aprendizaje por induccin, el sistema genera nuevos conocimientos que no estn presentes en forma implcita dentro del conocimiento disponible. El aprendizaje por induccin abarca el aprendizaje por ejemplos y el aprendizaje por observacin y descubrimiento.
En el aprendizaje por ejemplos, el sistema recibe varios ejemplos como entrada y debe generalizarlos en un proceso inductivo para presentarlos como salida. Generalmente, en este tipo de aprendizaje existen dos tipos de ejemplos, los positivos y los negativos. Los ejemplos positivos fuerzan la generalizacin, mientras que los ejemplos negativos previenen que esta sea excesiva. Se trata de que el conocimiento adquirido cubra todos los ejemplos positivos y ningn ejemplo negativo. A este tipo de aprendizaje pertenece la familia TDIDT. Debe tenerse en cuenta, que los ejemplos a partir de los cuales aprende el sistema, deben ser representativos de los conceptos que se est tratando de ensear. Adems, la distribucin de las clases en el conjunto de ejemplos de entrenamiento, a partir de los que el sistema aprende, debe ser similar a la distribucin existente en los datos sobre los cuales se aplicar el modelo resultante.
En el aprendizaje por observacin y descubrimiento, el sistema forma teoras o criterios de clasificacin en jerarquas taxonmicas, a partir de la induccin realizando tareas de descubrimiento. Pertenece al tipo de aprendizaje no supervisado y, como tal, permite que el sistema clasifique la informacin de entrada para formar conceptos. Existen dos formas en las que el sistema interacta con el entorno: la observacin pasiva, en la cual el sistema clasifica las observaciones de mltiples puntos del medio; y la observacin activa, en la cual el sistema observa el entorno, realiza cambios en el mismo, y luego analiza los resultados.
Magdalena Servente
13
2.1.3.3.1 Aprendizaje AQ
El aprendizaje AQ se basa en la idea de cubrir progresivamente los datos de entrenamiento a medida que se generan reglas de decisin. Su esencia est en la bsqueda de un conjunto de reglas (conjunciones de pares atributo-valor o predicados arbitrarios) que cubran todos los ejemplos positivos y ningn ejemplo negativo. En lugar de dividir los ejemplos en subconjuntos, el aprendizaje AQ generaliza, paso a paso, las descripciones de los ejemplos positivos seleccionados [Michalski et al, 1998].
El aprendizaje divide y reinars particiona el conjunto de ejemplos en subconjuntos sobre los cuales se puede trabajar con mayor facilidad. En la lgica proposicional, por ejemplo, se parte el conjunto de acuerdo a los valores de un atributo en particular, entonces, todos los miembros de un subconjunto tendrn un mismo valor para dicho atributo. Dentro de este tipo de aprendizaje, encontramos la familia TDIDT (Top-Down Induction Trees), la cual se explica con mayor detalle en la Seccin 2.4
La Minera de Datos busca generar informacin similar a la que podra producir un experto humano, que adems satisfaga el Principio de Comprensibilidad. La Minera de Datos es el proceso de descubrir conocimientos interesantes, como patrones, asociaciones, cambios, anomalas y estructuras significativas
14
Magdalena Servente
a partir de grandes cantidades de datos almacenadas en bases de datos, data warehouses, o cualquier otro medio de almacenamiento de informacin.
La Minera de Datos es un campo en pleno desarrollo en el que se aplican mtodos de varias disciplinas como los presentes en sistemas de bases de datos, data warehousing, estadstica, el Aprendizaje Automtico, visualizacin de datos, obtencin de informacin y computacin de alta performance. Adems tambin se utilizan mtodos de las reas de redes neuronales, reconocimiento de patrones, anlisis espacial de datos, bases de datos de imgenes, procesamiento de seales y programacin lgica inductiva (ILP). Numerosos especialistas sealan que la Minera de Datos necesita de la integracin de enfoques de mltiples disciplinas [Mitchell, 1997].
Una gran cantidad de mtodos de anlisis de datos han sido desarrollados en estadstica. El Aprendizaje Automtico ha contribuido en el rea de clasificacin e induccin. Las redes neuronales, por su lado, son efectivas en la clasificacin, prediccin y clustering de datos. Sin embargo, con la gran cantidad de datos almacenados en las bases de datos sobre los cuales se debe hacer la minera de datos, todos estos mtodos deben re-analizarse o escalarse para ser efectivos.
Adems para procesar grandes volmenes de datos de los cuales deben extraerse patrones automticamente, es necesario contar con una gran capacidad computacional de procesamiento. Es necesario, entonces, desarrollar mtodos de minera de datos distribuidos, paralelos e incrementales.
Integracin de datos (Data integration) integracin de mltiples fuentes heterogneas de datos en una nica fuente.
Seleccin de datos (Data selection) extraccin de los datos relevantes al rea de anlisis del almacenamiento de datos.
Magdalena Servente
15
Transformacin de datos (Data transformation) transformacin o consolidacin de los datos en formas apropiadas para la minera mediante procedimientos de agregacin.
Minera de Datos: proceso esencial donde se aplican diversos mtodos para extraer patrones de los datos.
Evaluacin de patrones (Pattern evaluation) identificacin de patrones interesantes basndose en algn parmetro de comparacin impuesto por el usuario.
Presentacin de los conocimientos (Knowledge presentation) tcnicas de visualizacin y representacin de los conocimientos obtenidos.
Con los sistemas de bases de datos relacionales existentes hoy en da, los cuatro procesos iniciales: limpieza, integracin, seleccin y transformacin de datos pueden realizarse mediante la construccin de data warehouses. Los procesos de minera de datos, evaluacin de patrones y presentacin de conocimientos generalmente se agrupan en el proceso que se conoce como Minera de Datos. De ah la confusin que puede llegar a existir con el nombre.
16
Prediccin cualitativa
Cabe destacar que muchos de estos problemas son los mismos con los que se enfrenta un sistema de Aprendizaje Automtico que aprende a partir de ejemplos, que pueden tener imperfecciones o pueden estar incompletos, o incluso, no ser representativos del problema que se est analizando.
Asociacin: es el descubrimiento de relaciones de asociacin o correlacin en un conjunto de datos. Las asociaciones se expresan como condiciones atributo-valor y deben estar presentes varias veces en los datos.
Clasificacin: analiza un conjunto de datos de entrenamiento cuya clasificacin de clase se conoce y construye un modelo de objetos para cada clase. Dicho modelo puede representarse con rboles de decisin o con reglas de clasificacin, que muestran las caractersticas de los datos. El modelo puede ser utilizado para la mayor comprensin de los datos existentes y para la clasificacin de los datos futuros.
Prediccin: esta funcin de la minera predice los valores posibles de datos faltantes o la distribucin de valores de ciertos atributos en un conjunto de objetos.
Clustering: identifica clusters en los datos, donde un cluster es una coleccin de datos similares. La similitud puede medirse mediante funciones de distancia, especificadas por los usuarios o por expertos. La Minera de Datos trata de encontrar clusters de buena calidad que sean escalables a grandes bases de datos y a data warehouses multidimensionales.
Magdalena Servente
17
Anlisis de series a travs del tiempo: analiza un gran conjunto de datos obtenidos con el correr del tiempo para encontrar en l regularidades y caractersticas interesantes, incluyendo la bsqueda de patrones secuenciales, peridicos, modas y desviaciones.
Aprendizaje acumulativo (Cumulative learning): Muchas bases de datos crecen continuamente. Tomemos por ejemplo, una base de datos sobre transacciones financieras en un banco. Aprender a partir de bases de datos de este tipo es difcil ya que los datos deben ser analizados acumulativamente a medida que se incorporan a la base. Nos encontramos entonces ante el desafo de disear algoritmos que puedan incorporar nuevos datos y adaptarse a los cambios generados por la incorporacin de los mismos.
Aprendizaje multitarea (Multitask learning): Muchos dominios se caracterizan por pertenecer a familias de problemas de aprendizaje relacionados o similares. Tomemos, por ejemplo, el dominio mdico. Mientras que cada enfermedad posee su aprendizaje individual con bases de datos dedicadas, muchas enfermedades tienen causas y/o sntomas en comn, sera provechoso entonces favorecer el intercambio de informacin entre los distintos resultados de los algoritmos.
Aprendizaje a partir de datos tabulados y no tabulados (Learning from labeled and unlabeled data): en muchas aplicaciones el problema no est en la obtencin de los datos, sino en la tabulacin de los mismos.
18
Magdalena Servente
Aprendizaje relacional (Relational Learning): en muchos problemas de aprendizaje las entidades no se describen a partir de un conjunto esttico de atributos, sino a partir de las relaciones entre entidades. En las bases de datos inteligentes encontrar patrones o relaciones entre entidades es un problema primordial.
Aprendiendo a partir de bases de datos de gran tamao (Learning from extremely large databases): muchas bases de datos son demasiado grandes como para ser ledas y procesadas por una computadora ms de una vez. Lo cual imposibilita el uso de algoritmos que requieran mltiples pasadas sobre los datos. Debe afrontarse entonces, el desafo de encontrar algoritmos inteligentes que sean escalables eficientemente a grandes bases de datos.
Aprendiendo a partir de bases de datos extremadamente pequeas (Learning from extremely small databases): en el otro extremo, existen tambin bases de datos que son demasiado pequeas para los algoritmos existentes. Por ejemplo, en robtica la cantidad de ejemplos es limitada, sin embargo, muchos de los mtodos de aprendizaje actuales requieren un gran nmero de ejemplos. Debe encontrarse entonces un mtodo que trabaje eficientemente con un nmero limitado de datos, o bien, que se base en el conocimiento previo.
Aprendiendo con conocimientos previos (Learning with prior knowledge): En muchos casos, se poseen conocimientos efectivos acerca del fenmeno en estudio. Deben existir mtodos capaces de incorporar conocimientos previos tanto abstractos, como diversos o inciertos.
Aprendiendo a partir de datos de distintos tipos (Learning from mixed media data): Muchos juegos de datos contienen varios tipos de datos. Un buen ejemplo, se presenta en las bases de datos mdicas que contienen estadsticas acerca de los pacientes, grficos, rayos X, etc. La gran mayora de los algoritmos actuales slo pueden trabajar con un nico tipo de datos, con lo cual deben encontrarse mtodos capaces de manejar los distintos tipos o formatos de datos presentes en una base de datos.
Aprendiendo relaciones casuales (Learning casual relationships): La mayora de los algoritmos de aprendizaje detectan la correlacin entre los datos, pero son incapaces de determinar o modelar las casualidades, y, por lo tanto, fallan al tratar de predecir algunos efectos externos. Deben disearse, entonces, algoritmos que incorporen las casualidades.
Visualizacin y Minera de Datos interactiva (Visualization and Interactive Data Mining): En muchos casos, la minera de datos es un proceso interactivo, en el cual el anlisis de datos automtico se mezcla con las decisiones de control de un experto de campo. Deben disearse herramientas que contemplen el intercambio entre estas dos reas.
Magdalena Servente
19
En el Clustering o Clasificacin se analizan los datos y se generan conjuntos de reglas que agrupen y clasifiquen los datos futuros. Debe tenerse en cuenta que en la Minera de Datos se busca obtener reglas que particionen los datos en clases predefinidas, esto se torna complicado cuando hay una gran cantidad de atributos y millones de registros.
Una regla de asociacin es una regla que implica o presenta ciertas relaciones entre un grupo de objetos en una base de datos. En el proceso de la Minera de Datos se obtienen varias reglas de este tipo con distintos niveles de abstraccin. Nuevamente, no debemos olvidar que esto puede implicar el anlisis iterativo de bases de datos transaccionales o relacionales, con millones de registros, lo cual presenta un elevado costo operativo. Por lo tanto, la obtencin de reglas a partir de bases de datos relacionales o transaccionales es un importante tema de estudio.
Por ltimo, el anlisis de secuencias trata de encontrar patrones que ocurren con una secuencia determinada. Trabaja sobre datos que aparecen en distintas transacciones a diferencia de los datos que aparecen relacionados mediante reglas dentro de una misma transaccin -.
A continuacin se presentan ejemplos de algoritmos de Minera de Datos existentes, de cada uno de los tipos presentados.
A continuacin se describen brevemente aquellos mtodos de Aprendizaje Automtico que han sido aplicados a la Minera de Datos con cierto xito:
Algoritmos estadsticos: Muchos algoritmos estadsticos han sido utilizados por los analistas para detectar patrones inusuales en los datos y explicar dichos patrones mediante la utilizacin de modelos estadsticos, como, por ejemplo, los modelos lineales. Estos mtodos se han ganado su lugar y seguirn siendo utilizados en los aos venideros.
20
Magdalena Servente
Redes Neuronales: las redes neuronales imitan la capacidad de la mente humana para encontrar patrones. Han sido aplicadas con xito en aplicaciones que trabajan sobre la clasificacin de los datos.
Algoritmos genticos: tcnicas de optimizacin que utilizan procesos como el entrecruzamiento gentico, la mutacin y la seleccin natural en un diseo basado en los conceptos de la evolucin natural.
Mtodo del vecino ms cercano: es una tcnica que clasifica cada registro de un conjunto de datos en base a la combinacin de las clases de los k registros ms similares. Generalmente se utiliza en bases de datos histricas.
Visualizacin de los datos: la interpretacin visual de las relaciones entre datos multidimensionales
Clasificadores basados en instancias o ejemplos: Una manera de clasificar un caso es a partir de un caso similar cuya clase es conocida, y predecir que el caso pertenecer a esa misma clase. Esta filosofa es la base para los sistemas basados en instancias, que clasifican nuevos casos refirindose a casos similares recordados. Un clasificador basado en instancias necesita teoras simblicas. Los problemas centrales de este tipo de sistemas se pueden resumir en tres preguntas: cules casos de entrenamiento deben ser recordados?, cmo puede medirse la similitud entre los casos?, y cmo debe relacionarse el nuevo caso a los casos recordados?
Los mtodos de aprendizaje basados en reglas de clasificacin buscan obtener reglas o rboles de decisin que particionen un grupo de datos en clases predefinidas. Para cualquier dominio real, el espacio de datos es demasiado grande como para realizar una bsqueda exhaustiva en el mismo.
En cuanto a los mtodos inductivos, la eleccin del atributo para cada uno de los nodos se basa en la ganancia de entropa generada por cada uno de los atributos. Una vez que se ha recopilado la informacin acerca de la distribucin de todas las clases, la ganancia en la entropa se calcula utilizando la teora de la informacin o bien el ndice de Gini [Joshi, 1997].
transacciones, donde cada transaccin es un conjunto de tems, una regla de asociacin es una expresin de la forma XY, donde X e Y son conjuntos de tems. Un ejemplo de regla de asociacin sera: 30% de las transacciones que contienen nios, tambin contienen paales; 2% de las transacciones contienen ambas cosas. En este caso el 30% es el nivel de confianza de la regla y 2% es la cantidad de casos que respaldan la regla. La cuestin est en encontrar todas las reglas de asociacin que satisfagan los requerimientos de confianza mnima y mxima impuestos por el usuario.
ejemplos E
En la figura 2.6, el entorno E representa el mundo real, el entorno sobre el cual se realiza el aprendizaje. E representa un nmero finito de observaciones u objetos que son codificados en algn formato legible para Aprendizaje Automtico. El conjunto de ejemplos codificados constituye el conjunto de entrenamiento para el sistema de aprendizaje automtico.
Por su lado, en la figura 2.7, la codificacin C es reemplazada por una base de datos, que modela el entorno. Cada estado en la base de datos refleja algn estado de E, y cada transicin de estados en la base
22 Magdalena Servente Estado del Arte
de datos representa una transicin de estados en E. El algoritmo utilizado para realizar la minera de datos construye entonces un modelo a partir de los datos en la base de datos.
ejemplos E BD codificacin de los ejemplos DM
Aunque a simple vista, la Minera de Datos parece muy similar a Aprendizaje Automtico, hay importantes diferencias que deben tenerse en cuenta. La base de datos generalmente se construye con fines distintos a la Minera de Datos, con lo cual la base se disea segn los requerimientos del sistema y no segn los requerimientos del algoritmo de aprendizaje.
2.3.1. Aplicaciones
A continuacin se describen algunos algoritmos de Aprendizaje Automtico que han sido utilizados con xito en la Minera de Datos. Algunos de ellos son generales y pueden ser utilizados en varios dominios de conocimiento, mientras que otros fueron diseados para dominios particulares.
2.3.1.1. ID3
Este sistema ha sido el que ms impacto ha tenido en la Minera de Datos. Desarrollado en los aos ochenta por Quinlan, ID3 significa Induction Decision Trees, y es un sistema de aprendizaje supervisado que construye rboles de decisin a partir de un conjunto de ejemplos. Estos ejemplos son tuplas compuestas por varios atributos y una nica clase. El dominio de cada atributo de estas tuplas est limitado a un conjunto de valores. Las primeras versiones del ID3 generaban descripciones para dos clases: positiva y negativa. En las versiones posteriores, se elimin esta restriccin, pero se mantuvo la restriccin de clases disjuntas. ID3 genera descripciones que clasifican cada uno de los ejemplos del conjunto de entrenamiento.
Este sistema tiene una buena performance en un amplio rango de aplicaciones, entre las cuales podemos nombrar, aplicaciones de dominios mdicos, artificiales y el anlisis de juegos de ajedrez. El nivel de precisin en la clasificacin es alto. Sin embargo, el sistema no hace uso del conocimiento del dominio. Adems, muchas veces los rboles son demasiado frondosos, lo cual conlleva a una difcil interpretacin. En estos casos pueden ser transformados en reglas de decisin para hacerlos ms comprensibles.
Magdalena Servente
23
2.3.1.2. C4.5
El C4.5 es una extensin del ID3 que permite trabajar con valores continuos para los atributos, separando los posibles resultados en dos ramas: una para aquellos Ai<=N y otra para Ai>N. Este algoritmo fue propuesto por Quinlan en 1993. El algoritmo C4.5 genera un rbol de decisin a partir de los datos mediante particiones realizadas recursivamente. El rbol se construye mediante la estrategia de profundidad-primero (depth-first). El algoritmo considera todas las pruebas posibles que pueden dividir el conjunto de datos y selecciona la prueba que resulta en la mayor ganancia de informacin. Para cada atributo discreto, se considera una prueba con n resultados, siendo n el nmero de valores posibles que puede tomar el atributo. Para cada atributo continuo, se realiza una prueba binaria sobre cada uno de los valores que toma el atributo en los datos.
2.3.1.3. AQ15
El AQ15 fue desarrollado por Michalski. Es un sistema de aprendizaje inductivo que genera reglas de decisin, donde el antecedente es una frmula lgica. Una caracterstica particular de este sistema es la induccin constructiva (constructive induction), es decir, el uso de conocimientos del dominio para generar nuevos atributos que no estn presentes en los datos de entrada.
Al igual que el ID3, el AQ15 est diseado para la generacin de reglas fuertes, es decir, que para cada clase, se construye una regla que cubre todos los ejemplos positivos y ningn ejemplo negativo. El sistema soluciona el problema de los ejemplos incompletos o inconsistentes mediante un pre o post procesamiento. En el post procesamiento, adems, se reduce de forma drstica la cantidad de reglas generadas mediante el truncamiento de reglas, el cual no afecta la precisin de las reglas obtenidas.
AQ15 ha sido testeado en dominios mdicos, como el diagnstico en la limfografa, diagnstico de cncer de mama y la ubicacin del tumor primario. En estos casos, se obtuvieron reglas con el mismo nivel de precisin que el de los expertos humanos. En todos los casos, los datos de entrenamiento son conjuntos chicos, de unos cientos de ejemplos.
2.3.1.4. CN2
El sistema CN2, desarrollado por Clark y Niblett, es una adaptacin del AQ15. La gran desventaja del AQ15 es que elimina los ruidos mediante pre y post procesamiento y no durante la ejecucin del algoritmo. El objetivo del CN2 es, entonces, incorporar el manejo de datos ruidosos al algoritmo en s. Combina entonces las tcnicas de poda utilizadas en el ID3, con las tcnicas de reglas condicionales utilizadas en el AQ15.
24 Magdalena Servente Estado del Arte
El CN2 genera reglas simples y comprensibles en dominios donde los datos pueden tener ruido. Construye reglas probabilsticas, es decir, el antecedente en cada regla cubre ejemplos positivos de una clase, pero tambin puede cubrir ejemplos de otra clase en menor nmero. De esta forma no restringe el espacio de bsqueda nicamente a aquellas reglas inferibles a partir de los ejemplos.
La performance el ID3, AQ15 y CN2 ha sido comparada en dominios mdicos y artificiales. Las estructuras de conocimiento generadas en cada caso son de similar calidad y complejidad.
2.3.1.5. DBLearn
El sistema DBLearn fue diseado por Cai, Han y Cercone y utiliza conocimientos del dominio para generar descripciones para subconjuntos predefinidos de una base de datos relacional. Las caractersticas especiales de este sistema son su estrategia de bsqueda de abajo hacia arriba (bottom up); el uso de conocimientos del dominio como jerarquas de valores de atributos y el uso del lgebra relacional. El conjunto de entrenamiento es una tabla de datos relacional con n-tuplas.
El sistema DBLearn es relativamente simple, ya que utiliza solo dos operaciones de generalizacin para construir los descriptores. La generalizacin est orientada a los atributos, lo cual limita el conjunto de descriptores que pueden ser construidos. La performance del sistema es buena, y la complejidad en el tiempo est en el orden de los O(N logN), siendo N la cantidad inicial de tuplas.
2.3.1.6. Meta-Dendral
El sistema Meta-Dendral es un sistema especial para la generacin de reglas de conocimiento en la estereoscopia. Esta ciencia estudia la estructura tridimensional de la molcula. El Meta-Dendral es interesante porque utiliza un sistema de representacin de conocimientos totalmente diferente a los anteriores. Al buscar generar reglas que puedan predecir dnde se romper la estructura de una molcula, toma las estructuras moleculares como entrada.
El sistema ha sido exitoso para encontrar reglas de fragmentacin desconocidas hasta el momento. Sin embargo, la estrategia de bsqueda es ineficiente, ya que genera muchas reglas de decisin que luego son eliminadas en la etapa de optimizacin. Es muy difcil encontrar heursticas que guen la bsqueda y no existen tcnicas explcitas que ayuden a eliminar ruidos o a destacar casos especiales.
Magdalena Servente
25
2.3.1.7. RADIX/RX
El sistema RX se utiliza para el descubrimiento de relaciones en bases de datos clnicas. La diferencia importante con otros sistemas es que incorpora la nocin de tiempo: un dato es un conjunto de ejemplos que guardan informacin de un paciente en diferentes momentos, y los conocimientos generados son de naturaleza causal. El sistema divide su proceso de descubrimiento en dos etapas: primero genera hiptesis y, luego, utiliza tcnicas avanzadas de estadstica para validarlas.
El sistema RX fue utilizado en una base de reumatologa y sirvi para probar hiptesis acerca de la cantidad de droga prodnisone que aumenta el colesterol en la sangre. Sin embargo, la principal desventaja de este sistema es que no utiliza informacin del dominio para guiar la bsqueda. Una versin mejorada del RX, el RADIX, s lo hace.
2.3.1.8. BACON
El sistema BACON utiliza algoritmos de anlisis de datos para descubrir relaciones matemticas entre datos numricos. Ha redescubierto leyes como la ley de Ohm para circuitos elctricos y la ley de desplazamiento de Arqumides. Los datos de entrenamiento son numricos y, normalmente, son
generadas en algn experimento previo. Cada tupla esta constituida por los valores de las mediciones durante el experimento.
El sistema BACON tiene varias desventajas: no considera el ruido en los datos, ni la inconsistencia o los datos incompletos. Adems, considera que todas las variables son relevantes, y explora todas las soluciones posibles utilizando un grafo, lo cual empeora considerablemente su performance.
2.3.1.9. SLIQ
El algoritmo SLIQ (Supervised Learning In Quest) fue desarrollado por el equipo Quest de IBM. Este algoritmo utiliza los rboles de decisin para clasificar grandes cantidades de datos. El uso de tcnicas de pre-ordenamiento en la etapa de crecimiento del rbol, evita los costos de ordenamiento en cada uno de los nodos. SLIQ mantiene una lista ordenada independiente de cada uno de los valores de los atributos continuos y una lista separada de cada una de las clases. Un registro en la lista ordenada de atributos consiste en el valor del atributo y un ndice a la clase correspondiente en la lista de clases. SLIQ construye el rbol de forma ancho-primero (breadth-first). Para cada uno de los atributos busca en la lista correspondiente y calcula los valores de entropa para cada uno de los nodos de la frontera simultneamente. A partir de la informacin obtenida se particionan los nodos de la frontera, y se expanden para obtener una nueva frontera.
26 Magdalena Servente Estado del Arte
Aunque SLIQ trabaja con datos que pueden estar en disco mientras se ejecuta el algoritmo, necesita que cierta informacin resida en memoria permanentemente durante la totalidad de la ejecucin del mismo. Dicha informacin crece proporcionalmente a la cantidad de registros de entrada, lo cual limita en gran medida la cantidad de registros de entrenamiento. Para solucionar este problema el equipo de desarrollo del Quest, ha desarrollado otro algoritmo de clasificacin basado en rboles de decisin: el SPRINT (Scalable PaRallelizable INduction of decision Trees). El SPRINT elimina todas las restricciones de memoria presentes en el SLIQ.
El rbol de decisin es una hoja, pero la clase asociada debe ser determinada por informacin que no pertenece a T. Por ejemplo, una hoja puede escogerse de acuerdo a conocimientos de base del dominio, como ser la clase mayoritaria.
En este caso, la idea es refinar T en subconjuntos de casos que tiendan, o parezcan tender hacia una coleccin de casos pertenecientes a una nica clase. Se elige una prueba basada en un nico
Estado del Arte Magdalena Servente 27
atributo, que tiene uno o ms resultados, mutuamente excluyentes {O1, O2,. . ., On}. T se particiona en los subconjuntos T1, T2,. . ., Tn donde Ti contiene todos los casos de T que tienen el resultado Oi para la prueba elegida. El rbol de decisin para T consiste en un nodo de decisin identificando la prueba, con una rama para cada resultado posible. El mecanismo de construccin del rbol se aplica recursivamente a cada subconjunto de datos de entrenamientos, para que la isima rama lleve al rbol de decisin construido por el subconjunto Ti de datos de entrenamiento.
Supongamos que tenemos ejemplos positivos y negativos. En este contexto la entropa del subconjunto Si, H(Si), puede calcularse como:
(2.1)
Donde
pi+ es la probabilidad de que un ejemplo tomado al azar de Si sea positivo. Esta probabilidad
pi+ =
ni+ ni+ + ni
(2.2)
La probabilidad
Generalizando la expresin (2.1) para cualquier tipo de ejemplos, obtenemos la frmula general de la entropa:
H ( S i ) = p i log p i
i =1
(2.3)
28
Magdalena Servente
Si el atributo at divide el conjunto S en los subconjuntos Si, i = 1,2, . .. . . , n, entonces, la entropa total del sistema de subconjuntos ser:
H ( S , at ) = P(S i ) H (S i )
i =1
(2.4)
Donde
pertenezca a S i . Puede calcularse, utilizando los tamaos relativos de los subconjuntos, como:
P(S i ) =
Si S
(2.5)
I (S , at ) = H (S ) H (S , at )
(2.6)
Donde
El uso de la entropa para evaluar el mejor atributo no es el nico mtodo existente o utilizado en Aprendizaje Automtico. Sin embargo, es el utilizado por Quinlan al desarrollar el ID3 y su sucesor el C4.5.
Magdalena Servente
29
Para solucionar este problema, puede recurrirse a la binarizacin. Este mtodo consiste en formar dos rangos de valores de acuerdo al valor de un atributo, que pueden tomarse como simblicos. Por ejemplo, si en un da hubo 100ml de lluvia, pueden crearse los intervalos [0,100) y [100, +) y el clculo de la entropa se realiza como si los dos intervalos fueran los dos valores simblicos que puede tomar el atributo.
Existen dos enfoques para podar los rboles: la pre-poda (preprunning) y la post-poda (postprunning). En el primer caso se detiene el crecimiento del rbol cuando la ganancia de informacin producida al dividir un conjunto no supera un umbral determinado. En la post-poda se podan algunas ramas una vez que se ha terminado de construir el rbol.
El primer enfoque, tiene la atraccin de que no se pierde tiempo en construir una estructura que luego ser simplificada en el rbol final. El mtodo tpico en estos casos es buscar la mejor manera de partir el subconjunto y evaluar la particin desde el punto de vista estadstico mediante la teora de la ganancia de informacin, reduccin de errores, etc. Si esta evaluacin es menor que un lmite predeterminado, la divisin se descarta y el rbol para el subconjunto es simplemente la hoja ms apropiada. Sin embargo, este tipo de mtodo tiene la contra de que no es fcil detener un particionamiento en el momento adecuado, un lmite muy alto puede terminar con la particin antes de que los beneficios de particiones subsiguientes parezcan evidentes, mientras que un lmite demasiado bajo resulta en una simplificacin demasiado leve.
El segundo enfoque es, entonces, el utilizado por el ID3 y el C4.5. Una vez construido el rbol se procede a su simplificacin segn los criterios propios de cada uno de los algoritmos.
30
Magdalena Servente
Existe un principio de la ciencia conocido como Afeitadora de Occam (Occams Razor) [Mitchell, 2000a], que determina que cuando todas las condiciones son iguales, se prefieren las teoras simples. Es decir, la mejor teora cientfica es aquella que explica todos los hechos y tiene el menor tamao. Como Einstein sostuvo: Todo debe hacerse lo ms simple posible, pero no ms simple que eso. Cmo aplicamos la Afeitadora de Occam al Aprendizaje Automtico? En el caso de estos sistemas, todas las teoras generadas contienen errores, podemos decir que estos errores son como las excepciones a la misma. Entonces, para asegurarnos que todas las condiciones sean iguales, debemos incluir las excepciones en la teora.
El Principio de Longitud de Descripcin Mnima (MDL) [Joachims et al, 1995], [Mitchell, 2000b], [Quinlan, 1993d;1995], [Quinlan y Cameron-Jones, 1995] sostiene que la mejor teora para un conjunto de datos es aquella que minimiza el tamao de la teora y la cantidad de informacin necesaria para especificar las excepciones. Desde el punto de vista del Aprendizaje Automtico esto significa que dado un conjunto de instancias, un sistema de aprendizaje infiere una teora a partir de ellas. Supongamos una analoga con el campo de las comunicaciones: la teora con las excepciones debe ser transmitida por un canal perfecto. El MDL sostiene que la mejor generalizacin es aquella que requiere la menor cantidad de bits para transmitir la generalizacin junto con los ejemplos a partir de la cual fue generada. Esto evita las teoras que satisfacen los datos al extremo sobreajuste, ya que los ejemplos se transmiten tambin, y las teoras demasiado extensas sern penalizadas. Por otro lado, tambin se puede transmitir la teora nula que no ayuda en lo ms mnimo al transmitir los ejemplos. Entonces, pueden transmitirse tanto las teoras simples como aquellas muy complejas y el MDL provee una forma de medir la performance de los algoritmos basndose en los datos de entrenamiento nicamente. Esta parece ser la solucin ideal al problema de medir la performance.
Veamos cmo aplicamos el principio MDL. Supongamos que un sistema de aprendizaje genera una teora T, basada en un conjunto de entrenamiento E, y requiere una cierta cantidad de bits L[T] para codificar la teora. Dada la teora, el conjunto de entrenamiento puede codificarse en una cantidad L[E/T] de bits. L[E/T] est dada por la funcin de ganancia de informacin sumando todos los miembros del conjunto de entrenamiento. La longitud de descripcin total de la teora es L[E]+L[E/T]. El principio MDL recomienda la teora T que minimiza esta suma.
Recordemos que los algoritmos de la familia TDIDT realizan una bsqueda en el espacio de hiptesis posibles, constituido por todos los rboles de decisin posibles. Su sesgo inductivo, siguiendo el principio
Magdalena Servente
31
de la Afeitadora de Occam, es una preferencia sobre los rboles pequeos frente a los rboles ms profundos y frondosos.
Qu pasa cuando los datos estn incompletos como ocurre generalmente con cualquier conjunto de datos de la vida real? Podemos tomar dos caminos posibles ante los datos incompletos: descartar una proporcin importante de los datos por incompletos y declarar algunos casos como inclasificables, o adaptar los algoritmos para poder trabajar con valores de atributos faltantes. En la mayora de los casos, la primera opcin es inaceptable. Para poder aplicar la segunda opcin, hay tres cuestiones importantes que deben ser tenidas en cuenta:
1.
Seleccin de una prueba en la cual la particin del conjunto de entrenamiento se realiza en base a un criterio heurstico como ser la ganancia o la proporcin de ganancia. Si dos pruebas distintas utilizan atributos con distinta cantidad de valores desconocidos, cmo debe tenerse esto en cuenta al medir su importancia relativa?
2.
Una vez que una prueba ha sido seleccionada, los casos de entrenamiento con valores desconocidos para los atributos relevantes no pueden ser asociados con una respuesta particular de la prueba, y, por lo tanto, no pueden asignarse a un subconjunto {Ti}. Cmo deben tratarse estos casos durante la particin?
3.
Cuando el rbol de decisin se utiliza para clasificar un caso nuevo, cmo debe proceder el sistema al encontrarse con un valor de atributo desconocido para el nodo de decisin que est tratando de evaluar?
Varios autores han tratado de resolver estos problemas, generalmente rellenando los valores desconocidos con los valores ms frecuentes. En un estudio realizado por Quinlan, [Quinlan, 1989], se comparan las soluciones ms comunes a este problema. El autor llega a la conclusin general de que existen varios
32
Magdalena Servente
enfoques que son notablemente inferiores, pero no existe ningn enfoque que sea claramente superior. A continuacin se presenta un resumen del estudio.
Todos los enfoques descriptos a continuacin fueron implementados como variantes de un programa que construye un rbol de decisin utilizando la proporcin de ganancia [Quinlan, 1989]. Los rboles producidos no fueron podados. Varios enfoques para solucionar los tres problemas planteados fueron explorados. Cada uno de ellos tiene una letra identificatoria, tal que una combinacin de letras implica una combinacin de mtodos.
IR-
Ignorar los casos del conjunto de entrenamiento con valores desconocidos Reducir la ganancia de informacin aparente al testear A en la proporcin de casos con valores desconocidos para A: si A tiene una proporcin de valores desconocidos del x%, la prueba sobre A no dar informacin x% del tiempo. Completar los valores desconocidos de A antes de calcular la ganancia de A [Shapiro, 1983], basndose en los valores de otros atributos Completar los valores de A con el valor ms frecuente para el atributo antes de calcular la ganancia.
S-
C-
Al partir el conjunto de entrenamiento utilizando una prueba sobre el atributo A y un caso de entrenamiento tiene un valor desconocido de A.
IS-
Ignorar el caso Determinar el valor de A utilizando el mtodo de Shapiro y asignarlo al subconjunto correspondiente. Tratar el caso como si tuviera el valor ms comn de A. Asignar el caso a uno de los subconjuntos con probabilidad proporcional al nmero de casos con valores conocidos en cada subconjunto. Asignar una fraccin del caso a cada subconjunto utilizando las proporciones explicadas en el inciso anterior. Incluir el caso en todos los subconjuntos Desarrollar una rama separada para los casos de valores desconocidos de A.
CP-
F-
AU-
Magdalena Servente
33
Al clasificar un caso nuevo con un valor desconocido del atributo A que debe ser evaluado.
USCF-
Si existe una rama especial para los valores desconocidos de A, tomarla Determinar el resultado ms probable de A y actuar de acuerdo con ello. Tratar el caso como si fuese el del valor ms comn de A. Explorar todas las ramas, combinando los resultados para reflejar las probabilidades de los distintos resultados. Parar en este punto y asignar el caso a la clase ms frecuente.
H-
Valores desconocidos al particionar: los resultados de las pruebas revelan una clara superioridad del RFF (asignar casos fraccionales a los subconjuntos) y una clara desventaja del RIF (ignorar los casos de entrenamiento con valores desconocidos).
Valores desconocidos al clasificar: la estrategia de parar ante los valores desconocidos dio muy malos resultados, mientras que todos las otras estrategias dieron resultados similares
Valores desconocidos al seleccionar las pruebas: ignorar los valores desconocidos dio resultados peores que reducir la ganancia o completar los valores, pero no existi un mtodo claramente superior entre estos dos ltimos.
El estudio se concentr en dominios con altos niveles de valores desconocidos y conjuntos de entrenamiento chicos. Este estudio proporcion evidencia para las siguientes hiptesis:
En la evaluacin de pruebas, los enfoques que ignoran los casos con valores desconocidos (y por lo tanto no tienen en cuenta la proporcin de desconocimiento) presentan malos resultados cuando esta proporcin vara de atributo en atributo.
Cuando el conjunto de entrenamiento se divide ignorando los casos con valores desconocidos para el atributo probado, se obtienen resultados pobres (esta es la forma en que el ID3 realiza las particiones). El enfoque de dividir los casos entre los subconjuntos result muy bueno.
34
Magdalena Servente
Durante la clasificacin, tratar de determinar el resultado ms probable de una prueba, funciona bien en algunos dominios (aquellos en los cuales la sustitucin puede realizarse con confianza), pero muy mal en otros. La combinacin de todos los resultados posibles es ms resilente, dando una mayor certeza en la clasificacin general.
En cualquier rbol de decisin, las condiciones que deben satisfacerse cuando un caso se clasifica por una hoja pueden encontrarse analizando los resultados de las pruebas en el camino recorrido desde la raz. Es ms, si el camino fuese transformado directamente en una regla de produccin, dicha regla podra ser expresada como una conjuncin de todas las condiciones que deben ser satisfechas para llegar a la hoja. Consecuentemente, todos los antecedentes de las reglas generadas de esta manera seran mutuamente excluyentes y exhaustivos.
Entonces claseK
Diremos que una regla cubre un caso si el caso satisface todas las condiciones en el antecedente de la misma.
Magdalena Servente
35
Si se cuenta con una gran cantidad de datos, la evaluacin no es problema: se genera un modelo a partir de un conjunto grande de entrenamiento y, luego, se lo prueba con otro gran conjunto de datos. Sin embargo, aunque la Minera de Datos implica por su definicin trabajar con grandes cantidades de datos, los conjuntos de datos de buena calidad son pocos. Los datos de entrenamiento deben ser cuidadosamente generados y analizados por expertos humanos, un recurso que escasea.
Existen varios indicadores de la performance de un algoritmo de aprendizaje. Algunos de ellos se describen a continuacin [Michalski et al, 1998]:
Precisin: cantidad de ejemplos positivos y negativos evaluados correctamente. Algunas veces, es importante distinguir entre dos tipos de errores: los ejemplos positivos clasificados como negativos (errores de omisin) y viceversa (errores de comisin). Estos dos tipos de errores nos ayudan a determinar si los conceptos aprendidos son demasiado generales o demasiado especficos. Para que un sistema sea preciso, es necesario que genere descripciones que sean consistentes (no cubran ningn ejemplo negativo) y que sean completas (cubran todos los ejemplos positivos).
Eficiencia: un sistema debe ser capaz de generar descripciones correctas con un nmero mnimo de ejemplos. Un instructor no siempre puede dotar al sistema de una cantidad infinita de ejemplos, y la velocidad en el aprendizaje es un indicador de inteligencia. Dentro de la eficiencia, debemos evaluar tambin los requerimientos computacionales. Estos se miden en funcin a la cantidad de tiempo y recursos que un sistema necesita para llegar a una buena descripcin.
Comprensibilidad: es importante que los conceptos generados sean comprensibles al usuario, ya que el fin ltimo de estos sistemas es que el usuario aprenda algo de ellos.
Robustez: contra el ruido y contra los ejemplos incompletos. Cada sistema maneja estos dos problemas de forma diferente, con lo cual debe evaluarse en cada sistema en particular.
Requerimientos especiales: en algunos dominios, se requiere que un sistema aprenda a medida que llegan los ejemplos. Esto se conoce como aprendizaje incremental y es, especialmente, importante en aquellas reas en que los conceptos evolucionan, cambian su significado a travs del tiempo.
36
Magdalena Servente
Por supuesto, lo que nos interesa es estimar la proporcin de errores sobre los nuevos datos y no sobre los datos de entrenamiento, los cuales ya estn clasificados. Podemos decir que la proporcin de error estimada a partir de los datos de entrenamiento es correcta para los datos futuros? No, si los datos sobre los que se estim el error fueron utilizados al generar el clasificador. La proporcin de error sobre los datos de entrenamiento no es un buen indicador de los errores futuros; como el clasificador se gener a partir de estos datos, la proporcin de error es subjetiva y totalmente optimista. La proporcin de error generada a partir de los datos de entrenamiento se conoce como error de sustitucin, ya que se calcula al sustituir las instancias en un clasificador que fue construido a partir de ellas. A pesar de que no es un buen estimador para la prediccin de futuros errores, es muy til conocerlo.
Para predecir la performance del clasificador en los datos futuros, necesitamos evaluar la proporcin de error sobre datos no utilizados durante la construccin del mismo. El conjunto independiente de datos utilizado con este propsito es el conjunto de prueba. Es esencial que el conjunto de prueba no haya sido utilizado para nada en la generacin del clasificador. Entonces, aquellos esquemas en que la construccin se realiza en dos etapas o requieren probar el clasificador, trabajan con dos conjuntos de datos: el de entrenamiento y el de prueba.
Podemos decir que a mayor cantidad de datos, mejor clasificador y mejor estimador de error. El problema est cuando hay una pequea cantidad de datos de entrenamiento. En muchas situaciones, los datos de entrenamiento y prueba deben clasificarse manualmente. Debemos encontrar la forma de encontrar un buen estimador de error, an cuando los datos de prueba escasean. A continuacin, se explican varios mtodos para evaluar los algoritmos de clasificacin.
Magdalena Servente
37
Por supuesto, siempre cabe la posibilidad de que los datos utilizados para entrenamiento y prueba no sean representativos de los datos sobre los que se utilizar el modelo posteriormente. En general, no se puede afirmar si un conjunto es representativo o no, pero existe una prueba muy simple que vale la pena realizar: cada una de las clases del conjunto total de datos debera estar representada en la misma proporcin en los datos de entrenamiento y prueba, y esta proporcin debera ser similar a la que se presentar cuando se aplique el modelo generado al caso real. Supongamos que todos los ejemplos de una clase determinada no entran en el conjunto de entrenamiento, el clasificador generado ser incorrecto. Al trabajar con la hiptesis del Universo Cerrado, no podemos pretender que clasifique correctamente los miembros de una clase que no saba que exista. Si en el conjunto de prueba hay datos de esa clase, la proporcin de error obtenida ser muy grande. Entonces, al dividir al azar los datos preclasificados entre los conjuntos de entrenamiento y prueba, debemos garantizar que cada clase est correctamente representada tanto en los datos de prueba como en los de entrenamiento. Este procedimiento se conoce como estratificacin (stratification), y podemos hablar de una retencin estratificada.
Una manera de evitar la tendencia introducida por los datos retenidos, es repetir el proceso completo (entrenamiento y prueba) varias veces con distintas divisiones de los datos. En cada iteracin, una misma proporcin de los datos se retiene al azar para las pruebas y el resto se utiliza para el entrenamiento. Las proporciones de error obtenidas en las mltiples iteraciones se promedian para obtener una proporcin de error general. Este mtodo se conoce como retencin repetida (repeated holdout).
En un procedimiento de retencin general podramos elegir cambiar los roles de los datos de entrenamiento y de prueba entre s. No obstante, esto es factible nicamente si trabajamos con una proporcin 50:50, lo cual no es ideal ya que conviene utilizar ms del 50% de los datos para el entrenamiento. Para solucionar este problema utilizamos una variacin del mtodo estadstico de validacin cruzada (cross-validation).
En la validacin cruzada, se determina con anterioridad una cierta cantidad de pliegos o particiones de los datos. Supongamos que utilizamos tres, es decir, los datos se dividen al azar en tres particiones de aproximadamente la misma cantidad, y cada una a su turno se utiliza para prueba mientras que las otras dos se utilizan para entrenamiento. Por lo tanto, utilizamos un tercio para prueba y dos tercios para entrenamiento, y repetimos el procedimiento tres veces. Las tres proporciones de error obtenidas se promedian para llegar a una proporcin de error general. Este procedimiento conocido como validacin cruzada de tres pliegues (threefold cross-validation), puede trabajar con datos estratificados, en cuyo caso sera validacin cruzada de tres pliegues estratificada.
Podemos generalizar el mtodo para llegar a una validacin cruzada de n pliegues, estratificada o no. El caso ms utilizado para predecir la proporcin de error de una tcnica de aprendizaje es utilizar una validacin cruzada de diez pliegues. Adems, las pruebas han demostrado que el uso de la estratificacin mejora los resultados levemente [Witten y Frank, 2000]. Utilizar una validacin cruzada de diez pliegues puede no ser suficiente para obtener un buen estimador de la proporcin de error. Distintas validaciones
38 Magdalena Servente Estado del Arte
cruzadas de diez pliegues dan distintos resultados dado que la divisin en pliegues se realiza al azar. La estratificacin reduce la variacin entre los resultados pero no la elimina. Si se quiere obtener una estimacin de la proporcin de error muy precisa, generalmente, se repite la validacin cruzada de diez pliegues diez veces y se promedian los resultados. Esto implica invocar al algoritmo de aprendizaje cien veces con conjuntos de datos del tamao del 90% del conjunto original. Obtener una buena medida de la performance es un mtodo que consume grandes recursos computacionales.
Este procedimiento es atractivo por dos razones [Witten y Frank, 2000]. Primero, se utiliza la mayor cantidad de ejemplos posibles para el entrenamiento, lo cual se presume incrementa la posibilidad de que el clasificador sea correcto. Segundo, el procedimiento es determinstico: no se parten los datos al azar. Adems, no tiene sentido repetir el procedimiento diez ni cien veces, ya que siempre se obtendr el mismo resultado. Debe tenerse en cuenta que dado el alto costo computacional de aplicar este mtodo, no es factible utilizarlo para grandes conjunto de datos. Sin embargo, este mtodo es el mejor para pequeos conjuntos de datos porque, en cierta medida, evala todas las posibilidades.
2.5.2.3. Bootstrap
Este mtodo est basado en el procedimiento estadstico de obtener muestras con sustitucin. En los mtodos anteriores, cuando se tomaba una muestra de los datos de entrenamiento o de prueba, se lo haca sin reemplazo. Es decir, la misma instancia, una vez seleccionada, no poda seleccionarse nuevamente. La mayora de las tcnicas de aprendizaje pueden, no obstante, utilizar la misma instancia dos veces, y el hecho de repetirse genera una diferencia.
La idea del bootstrap es tomar muestras del conjunto de datos con remplazo para formar un conjunto de entrenamiento. Para ello, un conjunto de n instancias se muestrea n veces, con reemplazo, y se obtiene otro conjunto de datos de n instancias. Como algunas instancias del segundo conjunto estarn repetidas,
Estado del Arte Magdalena Servente 39
deben existir algunas instancias del conjunto original que no fueron seleccionadas. Utilizaremos estas instancias para el conjunto de prueba.
La probabilidad de que una instancia particular sea elegida para el conjunto de entrenamiento es de 1/n, y, por lo tanto, hay un 1-1/n de probabilidad de que no sea elegida. Si multiplicamos esto segn las n oportunidades de ser elegida, obtenemos la siguiente probabilidad de que no sea escogida:
1 -1 1 - = e = 0.368 n
Entonces, un conjunto de datos lo suficientemente grande contendr un 36.8% de instancias de prueba y un 63.2% de entrenamiento. Esta es la razn por la cual este mtodo se conoce como el 0.632 bootstrap.
El error estimado sobre el conjunto de prueba ser pesimista porque el clasificador tiene en cuenta slo el 63% de los datos del conjunto original, lo cual es poco frente al 90% de la validacin cruzada de diez pliegues. Para compensar el error del conjunto de entrenamiento se combina con el error en el conjunto de prueba de la siguiente manera:
Luego, todo el proceso de bootstrap se repite varias veces, y todos los estimadores de error se promedian.
40
Magdalena Servente
Si los costos son conocidos, pueden incluirse en el anlisis de los mtodos. Restringiremos nuestro anlisis a los casos que tienen clases s y no nicamente. Los cuatro resultados posibles de una prediccin pueden listarse en una matriz de confusin como la que se muestra a continuacin.
Clase predicha Clase verdadera S No S Verdadero positivo Falso Positivo No Falso Negativo Verdadero Negativo
Los verdaderos positivos y verdaderos negativos son los casos sin error. Los falsos positivos corresponden a aquellas instancias negativas que fueron clasificadas como positivas, mientras que los falsos negativos son aquellas instancias clasificadas como negativas cuando en realidad son positivas. Estos dos casos de errores generalmente tienen distintos costos, como los casos clasificados correctamente tienen distintos beneficios. El hecho de pensar en el costo genera mejores decisiones.
No obstante, la mayora de los algoritmos de aprendizaje automtico no tienen en cuenta el costo al aprender. Existen, sin embargo, dos maneras de transformarlo fcilmente. La primera idea para transformar un clasificador para que tome en cuenta el costo, es variar la cantidad de ejemplos positivos y negativos en los datos de entrenamiento de acuerdo a la importancia de cada uno de los errores. Otra idea es ponderar las instancias. Por ejemplo, al generar un rbol de decisin, una instancia puede dividirse en partes con un esquema de ponderacin que indique la proporcin con que debe tomarse cada rama.
Magdalena Servente
41
42
Magdalena Servente
En este captulo se presenta el contexto de nuestro problema de inters (Seccin 3.1) y las cuestiones que los algoritmos ID3 y C4.5 pertenecientes a la familia TDIDT deben resolver (Seccin 3.2).
Existen muchos tipos de anlisis y muchos tipos de resultados obtenibles. Por ejemplo, podemos realizar un anlisis estadstico sobre la distribucin de una poblacin de ardillas en un bosque a lo largo de los aos; u obtener la varianza y desviacin estndar de los depsitos japoneses en el mercado americano de la ltima dcada; o realizar un anlisis de componentes para un determinado experimento fsico, entre otros.
Los mtodos nombrados hasta ahora son esencialmente cuantitativos. Sin embargo, qu pasa cuando ms all de los modelos matemticos encerrados en los datos, nos interesan los modelos lgicos? Cundo ms all de las direcciones para hacer un mailing de la base de personas, nos interesa hacer un mailing slo a los potenciales clientes? Cmo distinguimos a los potenciales clientes del resto de la gente? Qu caractersticas tienen en comn? Qu datos los distinguen? Cuando el anlisis de los datos que estamos buscando excede los alcances de un modelo cuantitativo y est orientado hacia una descripcin cualitativa de los datos, debemos utilizar los algoritmos inteligentes.
Estos algoritmos del Aprendizaje Automtico estn orientados hacia el desarrollo de descripciones simblicas de los datos que puedan caracterizar a uno o ms conceptos, diferenciar entre clases de
Magdalena Servente
43
conceptos y describir porqu razn un objeto pertenece a una clase y no a otra. Con este tipo de algoritmos nuestro problema del anlisis de los potenciales clientes estara resuelto.
Existen muchos tipos de algoritmos de Aprendizaje Automtico; no obstante, los ms tiles para nosotros son aquellos que no quedan encerrados en el cerebro de la computadora, sino que pueden adaptarse a nuestra forma de pensar. Si el resultado de realizar Minera de Datos inteligente sobre una base es una red neuronal, sta puede ser muy til para clasificar nuevos ejemplos, en la medida en que sean clasificados por medio de un programa entrenado para ello. Una persona jams ser capaz de aplicar rpida y efectivamente una red neuronal u otro modelo similar para clasificar distintos datos. En cambio si la persona se encuentra ante un rbol de decisin o un conjunto de reglas de decisin que debe aplicar en orden como resultado de la Minera, la clasificacin del nuevo caso es tan fcil como la lectura del rbol desde la raz hasta las hojas.
Este tipo de modelo de datos que representa los conceptos inherentes y ocultos en los datos, de forma tal que son fciles de interpretar, utilizar e incorporar para la persona humana son los que ms enriquecen nuestro conocimiento y, como tales, aquellos sobre los cuales focalizaremos nuestra atencin.
En las bases de datos, las entidades se caracterizan, generalmente, por un conjunto de atributos que las describen. Los atributos pueden ser tanto discretos como continuos, pero lo importante es que todas las entidades estn descriptas por el mismo grupo de atributos. En los problemas de clasificacin, un atributo particular, conocido como clase, describe al tipo de concepto.
En qu medida los algoritmos de la familia TDIDT pueden usarse para generar modelos vlidos en los problemas de clasificacin?
Analizar la aplicacin de todos los Algoritmos Inteligentes a la Minera de Datos excedera los alcances de este trabajo; por ende, vamos a centrar nuestro anlisis en aquellos algoritmos que generan rboles y reglas de decisin que son modelos que un ser humano puede interpretar y aplicar fcilmente. Un buen modelo de datos para clasificar fenmenos meteorolgicos descriptos en funcin de varias medidas ambientales tomadas en los das previos, pueden ayudar a un meteorlogo a determinar si habr sol, llover, o habr un tornado.
44
Magdalena Servente
Cuestin 1:
Cuestin 2:
Qu condiciones deben cumplir los datos para que su anlisis con el ID3 o el C4.5 sea til y vlido?
Cuestin 3:
Cuestin 4:
Cuestin 5:
Magdalena Servente
45
46
Magdalena Servente
En este captulo se presentan todos los aspectos de la solucin propuesta. Para ello se describen las caractersticas generales de la misma (Seccin 4.1): el marco terico (Seccin 4.1.1), las condiciones que deben cumplir los datos sobre los que se realiza la Minera de Datos (Seccin 4.1.2) y los tipos de resultados obtenidos (Seccin 4.1.3). En la Seccin 4.2 se presenta una descripcin general de los algoritmos ID3 y C4.5 que se utilizan para estudiar el problema. Se explica cmo realizar la divisin de los datos de entrada (Seccin 4.2.1) y la eleccin del criterio de divisin (Seccin 4.2.1.1). Luego, se presenta una descripcin detallada del algoritmo ID3 (Seccin 4.3.1) y de sus limitaciones (Seccin 4.3.2). A modo de ejemplo, se muestra la utilizacin del ID3 para generar un rbol y reglas de decisin (Seccin 4.3.1.5). Tambin se detalla el algoritmo C4.5 (Seccin 4.4) y sus caractersticas particulares (Seccin 4.4.2), las cuales lo diferencian del ID3, resaltando la poda de los rboles de decisin (Seccin 4.4.3) y la estimacin de errores en dichos rboles (Seccin 4.4.4). En la seccin 4.4.5 se ejemplifican los mtodos anteriores. La generalizacin de las reglas de decisin realizada por el C4.5 se explica en la seccin 4.4.6. A continuacin, se detalla el diseo del sistema integrador utilizado para estudiar el xito de la solucin propuesta (Seccin 4.5). Para este sistema se presenta una descripcin general (Seccin 4.5.1) y el diseo de las secciones del sistema para el ID3 (Seccin 4.5.2.1) y para el C4.5 (Seccin 4.5.2.2)
La mayora de las aplicaciones de la Inteligencia Artificial a tareas de importancia prctica construyen un modelo de conocimiento utilizable por un experto humano. En algunos casos, la tarea que el experto realiza es una clasificacin, es decir, asigna objetos a categoras o clases determinadas segn sus propiedades [Quinlan 1993d]. En un modelo de clasificacin, la conexin entre clases y propiedades puede definirse utilizando desde un simple diagrama de flujo hasta un manual de procedimientos complejo y desestructurado. Si restringimos nuestra discusin a modelos ejecutables, es decir, a aquellos que pueden ser representados como programas de computacin, existen dos maneras muy diferentes en las que se puede construir un modelo. Por un lado, el modelo puede obtenerse a partir de entrevistas relevantes con uno o ms expertos. Por otro lado, si se cuenta con clasificaciones almacenadas con anterioridad, stas pueden ser examinadas para construir un modelo inductivo a partir de ellas, mediante una generalizacin de ejemplos especficos. Los sistemas ID3 y C4.5 pertenecen a este segundo grupo [Blockeel y De Raedt, 1997].
Solucin Propuesta
Magdalena Servente
47
Dados:
un conjunto C de clases,
Encontrar:
e E: H e = c H e c
(4.1)
un rbol de decisin,
El sistema generar un rbol de decisin fruto de la naturaleza en s de los algoritmos de la familia TDIDT. El rbol de induccin resultante ser construido desde raz hacia las hojas (top-down). El modelo generado es muy til para el usuario ya que permite una fcil visualizacin de los resultados. Adems, transformaremos el rbol a reglas de decisin que pueden ser utilizadas por otros programas de clasificacin o ser transformadas en sentencias SQL para clasificar nuevos datos rpidamente.
48
Magdalena Servente
Descripciones de atributo-valor (Attriute-value description): los datos a ser analizados deben poder expresarse como un archivo plano, es decir, toda la informacin de un objeto o caso debe poder expresarse en trminos de una coleccin fija de propiedades o atributos2. Cada atributo puede ser discreto o numrico, pero los atributos utilizados para describir un caso no pueden variar de un caso a otro. Esto restringe los dominios de aplicacin en los cuales los objetos tienen inherentemente atributos variables. El hecho de que los atributos no puedan variar de un caso a otro, no restringe aquellos casos en los cuales los valores de algunos atributos son desconocidos.
Clases predefinidas: las categoras a las cuales se asignan los casos deben estar establecidas de antemano. Esto significa que los algoritmos se aplican sobre un conjunto de datos de entrenamiento previamente clasificados, del tipo {valor_atributo1, valor_atributo2, ...., valor_atributon, clasek}. En la terminologa del Aprendizaje Automtico, esto se conoce como aprendizaje supervisado, en contraposicin al aprendizaje no supervisado en el cual la agrupacin de casos se encuentra mediante y durante el anlisis.
Clases discretas y disjuntas: las clases a las cuales se asignan los casos deben ser totalmente disjuntas: un caso pertenece o no pertenece a una clase, pero no puede pertenecer a dos clases a la vez. Adems, deben existir muchos ms casos que clases para que el modelo generado sea vlido en el dominio analizado. Por otro lado, dado la naturaleza de los rboles de decisin, las clases deben ser discretas o discretizarse en caso de ser continuas.
Datos suficientes: los patrones generados por la generalizacin inductiva no sern vlidos si no se los pueden distinguir de las casualidades. Como esta diferenciacin se basa generalmente en pruebas estadsticas, deben existir casos suficientes para que dichas pruebas sean efectivas. La cantidad de datos requeridos est afectada por factores como la cantidad de propiedades y clases, y la complejidad del modelo de clasificacin; a medida que estos se incrementan, se necesitan ms datos para construir un modelo confiable.
El hecho de que los datos deben poder expresarse como un archivo plano, no restringe la aplicacin del ID3 o del C4.5 a una nica
tabla de una base de datos, sino que para aplicarse a mltiples tablas, stas deben ser desnormalizadas hasta obtener una tabla con los atributos que se desea analizar.
Solucin Propuesta
Magdalena Servente
49
Los datos de entrenamiento pueden contener errores: segn Mitchell, los mtodos de aprendizaje utilizando rboles de decisin son robustos frente a los errores, tanto en los valores de las clases como en los valores de los atributos de los datos de entrenamiento [Mitchell 1997].
Los datos de entrenamiento pueden contener valores de atributos faltantes: los mtodos de la familia TDIDT pueden utilizarse an cuando no se conocen todos los valores de todos los atributos de los datos de entrenamiento. El tratamiento de valores faltantes vara de un algoritmo a otro y ser explicado para el ID3 en la seccin 4.3.1.3 y para el C4.5 en la seccin 4.4.2.2.
Modelos lgicos generados: los programas slo construyen clasificadores que pueden ser expresados como rboles de decisin o como un conjunto de reglas de produccin. Estos modelos restringen las descripciones de clases a una expresin lgica cuyas primitivas son afirmaciones acerca de los valores de atributos particulares. La expresin lgica representada por un rbol de decisin es una disyuncin de conjunciones. Todos aquellos casos que requieran un modelo de otra ndole no podrn ser analizados por los algoritmos ID3 o C4.5.
Entrada d1(p1)
Entrada: p1, p2
50
Magdalena Servente
Un rbol de decisin puede analizarse como una disyuncin de conjunciones. Cada camino desde la raz hasta las hojas representa una conjuncin, y todos los caminos son alternativos, es decir, son disyunciones.
Donde el antecedente es una conjuncin entre distintas pruebas de valor sobre los valores de los atributos; y el consecuente es una clase para todos los casos que satisfagan el antecedente. Por ejemplo,
Las reglas de decisin se presentan en orden, y deben interpretarse de esa manera. El orden determina cules reglas deben ejecutarse primero. Al clasificar un nuevo caso se avanza en la lista hasta llegar a un antecedente que sea satisfecho por el caso, entonces la clase del caso es la correspondiente al consecuente de dicha regla. El C4.5 en particular, agregar una ltima regla a la lista, sta no tiene antecedente, es la regla con la clase por defecto, es decir, si el caso no satisfizo ninguna de las reglas anteriores, entonces es de la clase indicada por la ltima regla que no tiene antecedente.
En el caso de las reglas de decisin, agregar una nueva regla implica simplemente aadirla a la lista de reglas sin necesidad de hacer cambios de estructura, mientras que agregar una nueva regla en un rbol implicara rehacer la estructura del mismo.
Solucin Propuesta
Magdalena Servente
51
Un nodo de decisin que especifica alguna prueba a ser realizada sobre un nico atributo, con una rama y subrbol para cada valor posible de la prueba.
El rbol de decisin generado por el C4.5 cuenta con varias caractersticas particulares: cada hoja tiene asociados dos nmeros, que indican el nmero de casos de entrenamientos cubiertos por cada hoja y la cantidad de ellos clasificados errneamente por la hoja. Es en cierta manera, un estimador del xito del rbol sobre los casos de entrenamiento. El ID3, en cambio, no clasifica errneamente a los datos de entrenamiento, con lo cual no son necesarios este tipo de indicadores. Es por ello, que este algoritmo, a diferencia del C4.5, corre el riesgo de caer en sobreajuste.
El propsito de construir modelos de clasificacin no se limita al desarrollo de predictores precisos, tambin es esencial que el modelo construido sea comprensible para los seres humanos. Michie critica al ID3 al sostener que los resultados recientes demuestran que los programas construidos sobre la base de sistemas tales como el ID3 pueden ser considerados, de alguna manera, super-programas y al mismo tiempo ser incomprensibles para las personas. [Michie 1986, p.233] Se han estudiado varias maneras de simplificar los rboles de decisin. Por ejemplo, en el sistema integrado propuesto, los rboles generados por el C4.5 como por el ID3 se transforman en un conjunto de reglas de produccin o decisin, un formato que parece ms comprensible que los rboles, cuando estos ltimos son demasiado extensos o frondosos.
tanto, tenga poder predictivo. Para ello, necesitamos un nmero importante de casos en cada hoja o, dicho de otra manera, la particin debe tener la menor cantidad de clases posibles. En el caso ideal, nos gustara elegir en cada paso la prueba que genere el rbol ms pequeo.
Entonces, estamos buscando un rbol de decisin compacto que sea consistente con los datos de entrenamiento. Podramos explorar todos los rboles posibles y elegir el ms simple.
Desafortunadamente, un nmero exponencial de rboles debera ser analizado. El problema de encontrar el rbol de decisin ms pequeo consistente con un conjunto de entrenamiento es de complejidad NPcompleta.
La mayora de los mtodos de construccin de rboles de decisin, incluyendo el C4.5 y el ID3, no permiten volver a estados anteriores, es decir, son algoritmos golosos sin vuelta atrs. Una vez que se ha escogido una prueba para particionar el conjunto actual, tpicamente basndose en la maximizacin de alguna medida local de progreso, la particin se concreta y las consecuencias de una eleccin alternativa no se exploran. Por este motivo, la eleccin debe ser bien realizada.
La solucin propuesta permite la utilizacin de ambos criterios. Se estudiarn y compararn los resultados obtenidos con el ID3 y con el C4.5 utilizando la ganancia y la proporcin de ganancia.
Solucin Propuesta
Magdalena Servente
53
Consideremos una medida similar luego de que T ha sido particionado de acuerdo a los n resultados de la prueba X. La informacin esperada (entropa) puede determinarse como la suma ponderada de los subconjuntos, de la siguiente manera
H (T , X ) =
i =1
Ti T
H (Ti )
(4.2)
La cantidad
I (T , X ) = H (T ) H (T , X )
(4.3)
mide la informacin ganada al partir T de acuerdo a la prueba X. El criterio de ganancia, entonces, selecciona la prueba que maximice la ganancia de informacin. Es decir, antes de particionar los datos en cada nodo, se calcula la ganancia que resultara de particionar el conjunto de datos segn cada uno de los atributos posibles. Se realiza la particin que resulta en la mayor ganancia.
Esta tendencia inherente al criterio de ganancia puede corregirse mediante una suerte de normalizacin, en la cual se ajusta la ganancia aparente, atribuible a pruebas con muchos resultados. Consideremos el contenido de informacin de un mensaje correspondiente a los resultados de las pruebas. Por analoga a la definicin de la I(S) tenemos:
I _ divisin(X ) =
i =1
Ti
Ti log 2 T T
(4.4)
Esto representa la informacin potencial generada al dividir T en n subconjuntos, mientras que la ganancia de informacin mide la informacin relevante a una clasificacin que nace de la misma divisin. Entonces,
proporcin _ de _ ganancia( X ) =
I (T , X ) I _ divisin( X )
(4.5)
54
Magdalena Servente
expresa la proporcin til de informacin generada en la particin. Si la particin es casi trivial, la informacin de la divisin ser pequea y esta proporcin se volver inestable. Para evitar este fenmeno, el criterio de proporcin de ganancia selecciona una prueba que maximice la expresin anterior, sujeto a la restriccin de que la informacin de la divisin sea grande, al menos tan grande como la ganancia promedio sobre todas las pruebas realizadas.
4.3. ID3
El algoritmo ID3 fue diseado en 1993 por J. Ross Quinlan [Quinlan, 93a, Quinlan, 1993b]. El ID3 toma objetos de una clase conocida y los describe en trminos de una coleccin fija de propiedades o de atributos, y produce un rbol de decisin sobre estos atributos que clasifica correctamente todos los objetos [Quinlan, 1993b]. Hay ciertas cualidades que diferencian a este algoritmo de otros sistemas generales de inferencia. La primera se basa en la forma en que el esfuerzo requerido para realizar una tarea de induccin crece con la dificultad de la tarea. El ID3 fue diseado especficamente para trabajar con masas de objetos, y el tiempo requerido para procesar los datos crece slo linealmente con la dificultad, como producto de:
la complejidad del concepto a ser desarrollado (medido por la cantidad de nodos en el rbol de decisin)
Esta linealidad se consigue a costo del poder descriptivo: los conceptos desarrollados por el ID3 slo toman la forma de rboles de decisin basados en los atributos dados, y este lenguaje es mucho ms restrictivo que la lgica de primer orden o la lgica multivaluada, en la cual otros sistemas expresan sus conceptos [Quinlan, 1993b].
El ID3 fue presentado como descendiente del CLS creado por Hunt. El ID3, como contrapartida de su antecesor, es un mecanismo mucho ms simple para el descubrimiento de una coleccin de objetos pertenecientes a dos o ms clases. Cada objeto debe estar descripto en trminos de un conjunto fijo de atributos, cada uno de los cuales cuenta con su conjunto de posibles valores de atributos. Por ejemplo, el atributo humedad puede tener los valores {alta, baja}, y el atributo clima, {soleado, nublado, lluvioso}.
Una regla de clasificacin en la forma de un rbol de decisin puede construirse para cualquier conjunto C de atributos de esa forma [Quinlan, 1993b]. Si C est vaco, entonces se lo asocia arbitrariamente a cualquiera de las clases. Si no, C contiene los representantes de varias clases; se selecciona un atributo y se particiona C en conjuntos disjuntos C1, C2,..., Cn, donde Ci contiene aquellos miembros de C que tienen
Solucin Propuesta Magdalena Servente 55
el valor i para el atributo seleccionado. Cada una de estos subconjuntos se maneja con la misma estrategia. El resultado es un rbol en el cual cada hoja contiene un nombre de clase y cada nodo interior especifica un atributo para ser testeado con una rama correspondiente al valor del atributo.
Dados:
Un conjunto de datos
Se desea obtener:
Un rbol de decisin simple basndose en la entropa, donde los nodos pueden ser:
1.
Nodos intermedios: en donde se encuentran los descriptores escogidos segn el criterio de entropa, que determinan cul rama es la que debe tomarse.
2.
Este procedimiento de formacin de reglas funcionar siempre dado que no existen dos objetos pertenecientes a distintas clases pero con idntico valor para cada uno de sus atributos; si este caso llegara a presentarse, los atributos son inadecuados para el proceso de clasificacin.
Hay dos conceptos importantes a tener en cuenta en el algoritmo ID3[Blurock, 1996]: la entropa y el rbol de decisin. La entropa se utiliza para encontrar el parmetro ms significativo en la
caracterizacin de un clasificador. El rbol de decisin es un medio eficiente e intuitivo para organizar los descriptores que pueden ser utilizados con funciones predictivas.
56 Magdalena Servente Manual del usuario
Funcin ID3 (R: conjunto de atributos no clasificadores, C: atributo clasificador, S: conjunto de entrenamiento) devuelve un rbol de decisin; Comienzo Si S est vaco, devolver un nico nodo con Valor Falla; Si todos los registros de S tienen el mismo valor para el atributo clasificador, Devolver un nico nodo con dicho valor; Si R est vaco, entonces devolver un nico nodo con el valor ms frecuente del atributo clasificador en los registros de S [Nota: habr errores, es decir, registros que no estarn bien clasificados en este caso]; Si R no est vaco, entonces D ! atributo con mayor Ganancia(D,S) entre los atributos de R; Sean {dj| j=1,2, .., m} los valores del atributo D; Sean {Sj| j=1,2, .., m} los subconjuntos de S correspondientes a los valores de dj respectivamente; Devolver un rbol con la raz nombrada como D y con los arcos nombrados d1, d2, .., dm que van respectivamente a los rboles ID3(R-{D}, C, S1), ID3(R-{D}, C, S2), .., ID3(R-{D}, C, Sm); Fin
Solucin Propuesta
Magdalena Servente
57
Estado Soleado Soleado Nublado Lluvia Lluvia Lluvia Nublado Soleado Soleado Lluvia Soleado Nublado Nublado Lluvia
Humedad Alta Alta Alta Alta Normal Normal Normal Alta Normal Normal Normal Alta Normal Alta
Viento Leve Fuerte Leve Leve Leve Fuerte Fuerte Leve Leve Leve Fuerte Fuerte Leve Fuerte
JuegoTenis No No Si Si Si No Si No Si Si Si Si Si Si
En el caso de este ejemplo, los rboles y las reglas obtenidos utilizando la ganancia y la proporcin de ganancia son iguales. Se mostrarn ambos ejemplos juntos con fines prcticos.
A partir de todos los datos disponibles, el ID3 analiza todas las divisiones posibles segn los distintos atributos y calcula la ganancia y/o la proporcin de ganancia. Comecemos analizando el atributo Estado.
58
Magdalena Servente
No Si Totales
Lluvia 1 4 5
Nublado 0 4 4
Soleado 3 2 5
Para calcular la ganancia y, por lo tanto, tambin la proporcin de ganancia, es necesario calcular la entropa del conjunto. Entonces,
H ( S ) = p Si log 2 p Si p No log 2 p No =
Calculamos ahora la entropa que tendran los conjuntos resultantes de la divisin de datos segn este atributo.
H ( S , Estado) = P(S i ) H (S i ) =
i =1
H ( S , Estado) =
Ahora calculamos la ganancia resultante de dividir al subconjunto segn el atributo Estado, tendremos:
Para calcular la proporcin de ganancia debemos conocer primero la informacin de la divisin que se calcula como:
I _ divisin(S ) =
i =1
Si
proporcin _ de _ ganancia( S ) =
De la misma manera en que calculamos la ganancia y la proporcin de ganancia para el caso anterior, calculamos para el atributo Humedad los siguientes valores:
Solucin Propuesta
Magdalena Servente
59
Ganancia=0.0746702 bits
Ganancia=0.00597769 bits
Una vez que hemos calculado las ganancias y proporciones de ganancia para todos los atributos disponibles, debemos elegir el atributo segn el cual dividiremos a este conjunto de datos. Recordemos que tanto en el caso de la ganancia como en el de la proporcin de ganancia, el mejor atributo para la divisin es aquel que la maximiza. En este ejemplo, la divisin segn el atributo Estado es la que mayor ganancia y proporcin de ganancia ofrece. Esto significa que el nodo raz del rbol ser un nodo que evala el atributo Estado.
La figura 4.2 esquematiza la construccin de un rbol de decisin utilizando el ID3 para el conjunto de datos en cuestin. La figura 4.3 presenta el rbol de decisin obtenido.
Como se explic en la seccin 4.3.1.3 para pasar un rbol de decisin a reglas de decisin, el ID3 lo recorre en preorden y cada vez que llega a una hoja, escribe la regla que tiene como consecuente el valor de la misma, y como antecedente, la conjuncin de las pruebas de valor especificados en todos los nodos recorridos desde la raz para llegar a dicha hoja. Analicemos el pasaje del rbol de la figura 4.3 a reglas de decisin.
El recorrido del rbol comienza por la raz Estado, contina por los nodos Viento y Humedad hasta llegar a la hoja SI. La regla generada para este recorrido ser:
Si seguimos el recorrido preorden, llegamos a continuacin a la hoja NO, obteniendo en este caso la siguiente regla:
60
Magdalena Servente
Estado Soleado Soleado Nublado Lluvia Lluvia Lluvia Nublado Soleado Soleado Lluvia Soleado Nublado Nublado Lluvia
Lluvia
Humedad Viento Alta Leve Alta Fuerte Alta Leve Alta Leve Normal Leve Normal Fuerte Normal Fuerte Alta Leve Normal Leve Normal Leve Normal Fuerte Alta Fuerte Normal Leve Alta Fuerte Estado
Nublado
JuegoTenis No No Si Si Si No Si No Si Si Si Si Si Si
Soleado
ESTADO ganancia=0.258521 proporcin de ganancia=0.491042 HUMEDAD Ganancia=0.0746702 Proporcin de ganancia =0.14934 VIENTO Ganancia=0.00597769 Proporcin de ganancia =0.0122457
JuegoTenis Si Si No Si Si
JuegoTenis Si Si Si Si
JuegoTenis No No No Si Si
HUMEDAD Ganancia=0.170951 Proporcin de ganancia =0.358525 VIENTO Ganancia=0.321928 Proporcin de ganancia =0.675162
HUMEDAD Ganancia=0.970951 Proporcin de ganancai=2.03632 Alta Normal VIENTO Ganancia=0.0199731 Proporcin de ganancia=0.0418885
Leve
Fuerte
JuegoTenis No No No
Estado Humedad Viento JuegoTenis Soleado Normal Leve Si Soleado Normal Fuerte Si SI
JuegoTenis Si Si Si
JuegoTenis No Si
Humedad
Alta
Normal
Estado Lluvia
Humedad Alta SI
Viento Fuerte
JuegoTenis Si
Estado Lluvia
Humedad Normal
Viento Fuerte NO
JuegoTenis No
Solucin Propuesta
Magdalena Servente
61
Lluvia
Estado
Nublado
Soleado
Viento SI
Humedad
Leve Fuerte
Alta
Normal
SI Humedad
NO
SI
Alta
Normal
SI
NO
Recorriendo en este sentido el rbol, el resto de las reglas obtenidas se muestran a continuacin.
Regla 2 SI Estado = Lluvia Y Viento = Leve ENTONCES JuegoTenis = Si Regla 3 SI Estado = Nublado ENTONCES JuegoTenis = Si Regla 4 SI Estado = Soleado Y Humedad = Alta ENTONCES JuegoTenis = No Regla 5 SI Estado = Soleado Y Humedad = Normal ENTONCES JuegoTenis = Si
Existen varias maneras de solucionar este problema del ID3, como la agrupacin de valores presentada en [Gallion et al, 1993] o la discretizacin de los mismos explicada en [Blurock, 1996], [Quinlan, 1993d]. El C4.5 resolvi el problema de los atributos continuos mediante la discretizacin, explicada en la Seccin 2.4.1.2.
4.3.2.3. Ventanas
El proceso descripto para la construccin de rboles de decisin asume que las operaciones de clculo, especialmente, las de evaluacin de las frecuencias relativas (en las que se deben contar elementos) del conjunto C, pueden ser realizadas eficientemente, lo cual significa, en la prctica, que para que el proceso sea rpido, C debe residir en memoria. Qu pasa si C es tan grande que no cabe en memoria? La solucin aplicada por ID3 es una solucin iterativa, que crea sucesivos rboles de decisin de precisin cada vez mayor, hasta llegar al rbol de decisin ptimo. El mtodo puede resumirse como [Quinlan, 1993b]:
Elegir un conjunto aleatorio de instancias (llamado ventana). Repetir: Formar una regla para explicar la ventana actual Encontrar las excepciones a la regla en el resto de las instancias Crear una nueva ventana a partir de la ventana actual y las excepciones a la regla generada a partir de ella Hasta que no queden excepciones a la regla.
El proceso termina cuando se forma una regla que no tenga excepciones y sea correcta para todo C. Se han testeado dos mtodos para formar la nueva ventana. En el primero, la ventana actual crece por la adicin de excepciones hasta un nmero especificado. El segundo mtodo trata de identificar los objetos claves en la ventana actual y reemplaza el resto por excepciones. Ambos mtodos fueron probados con un problema de clasificacin no trivial de 14 atributos y cerca de 20.000 objetos para los cuales un rbol de decisin correcto contena 20 nodos [Quinlan, 1993b]. Las conclusiones obtenidas de estas pruebas fueron:
Los mtodos convergen rpidamente; generalmente, se precisaron slo 4 iteraciones para llegar a un rbol de decisin correcto.
Fue posible desarrollar un rbol correcto a partir de la ventana final que contena slo una pequea fraccin del total de los objetos
Solucin Propuesta
Magdalena Servente
63
El tiempo requerido para obtener un rbol de decisin correcto para el problema de clasificacin crece linealmente con la cantidad de ejemplos que estn siendo analizados.
4.4. C4.5
El C4.5 se basa en el ID3, por lo tanto, la estructura principal de ambos mtodos es la misma. El C4.5 construye un rbol de decisin mediante el algoritmo divide y reinars y evala la informacin en cada caso utilizando los criterios de entropa y ganancia o proporcin de ganancia, segn sea el caso. A continuacin, se explicarn las caractersticas particulares de este mtodo que lo diferencian de su antecesor.
Funcin C4.5 (R: conjunto de atributos no clasificadores, C: atributo clasificador, S: conjunto de entrenamiento) devuelve un rbol de decisin; Comienzo Si S est vaco, devolver un nico nodo con Valor Falla; Si todos los registros de S tienen el mismo valor para el atributo clasificador, Devolver un nico nodo con dicho valor; Si R est vaco, entonces devolver un nico nodo con el valor ms frecuente del atributo clasificador en los registros de S [Nota: habr errores, es decir, registros que no estarn bien clasificados en este caso]; Si R no est vaco, entonces D ! atributo con mayor Proporcin de Ganancia(D,S) entre los atributos de R; Sean {dj| j=1,2, .., m} los valores del atributo D; Sean {Sj| j=1,2, .., m} los subconjuntos de S correspondientes a los valores de dj respectivamente; Devolver un rbol con la raz nombrada como D y con los arcos nombrados d1, d2, .., dm que van respectivamente a los rboles C4.5(R-{D}, C, S1), C4.5(R-{D}, C, S2), .., C4.5(R-{D}, C, Sm); Fin
64
Magdalena Servente
1.
La prueba estndar para los atributos discretos, con un resultado y una rama para cada valor posible del atributo.
2.
Una prueba
asignados a un nmero variable de grupos con un resultado posible para cada grupo, en lugar de para cada valor.
3.
Si un atributo A tiene valores numricos continuos, se realiza una prueba binaria con resultados A Z y A > Z, para lo cual debe determinarse el valor lmite Z.
Todas estas pruebas se evalan de la misma manera, mirando el resultado de la proporcin de ganancia, o alternativamente, el de la ganancia, resultante de la divisin que producen. Ha sido til agregar una restriccin adicional: para cualquier divisin, al menos dos de los subconjuntos Ti deben contener un nmero razonable de casos. Esta restriccin, que evita las subdivisiones casi triviales es tenida en cuenta solamente cuando el conjunto T es pequeo.
Sean {v1, v2,. . ., vm} los valores que toma el atributo A. Cualquier valor lmite entre vi y vi+1 tendr el mismo efecto al dividir los casos entre aquellos cuyo valor para A pertenece al subconjunto {v1, v2,. . ., vi} y aquellos cuyo valor pertenece a {vi+1, vi+2,. . ., vm}. Entonces, existen slo m 1 divisiones posibles de segn el valor de A y todas son examinadas. Al estar ordenados, las sucesivas pruebas para todos los valores, pueden realizarse en una nica pasada.
Tpicamente se elige el punto medio del intervalo como valor lmite representativo, entonces el isimo valor lmite sera:
Solucin Propuesta Magdalena Servente 65
vi + v i +1 2
(4.6)
C4.5 se diferencia de otros algoritmos en que elige el mayor valor de A en todo el conjunto de casos de entrenamiento que no excede el punto medio presentado, en lugar del punto medio en s mismo, como valor lmite; de esta manera se asegura que todos los valores lmites que aparezcan en el rbol y/o las reglas ocurran al menos una vez en los datos.
El mtodo utilizado para la binarizacin de atributos tiene una gran desventaja. Mientras que todas las operaciones de construccin de un rbol de decisin crecen linealmente con el nmero de casos de entrenamiento, el ordenamiento de d valores continuos crece proporcionalmente a d x log(d). Entonces, el tiempo requerido para construir un rbol a partir de un gran conjunto de datos de entrenamiento, puede estar dominado por el ordenamiento de datos con valores continuos.
La modificacin del criterio de ganancia es bastante directa. La ganancia de una prueba mide la informacin sobre la pertenencia a una clase que puede esperarse como resultado de partir un conjunto de datos de entrenamiento, calculada al restar la informacin que se espera que sea necesaria para identificar la clase de un objeto despus de la particin a la misma cantidad antes de la particin. Es evidente que una prueba no puede proveer informacin de pertenencia a una clase si no se conoce el valor de un atributo.
Sea T el conjunto de datos de entrenamiento y X una prueba basada en un atributo A, supongamos que el valor de A se conoce nicamente en una fraccin F de casos en T. Sean I(T) e IX(T) calculadas segn la ecuacin 2.4, excepto que slo se tienen en cuenta los casos para los cuales el valor de A es conocido. La definicin de ganancia puede corregirse a:
66
Magdalena Servente
(4.7)
o, en otras palabras, la ganancia aparente de mirar a los casos con valores conocidos, multiplicada por la fraccin de dichos casos en el conjunto de entrenamiento.
El clculo de la proporcin de ganancia se realiza de la misma manera que en la ecuacin 4.5. La definicin de informacin de la divisin puede modificarse de manera similar, considerando los casos con valores desconocidos como un grupo ms, entonces, si una prueba tienen n resultados, su informacin de la divisin se calcula como la prueba dividido n+1subconjuntos.
I _ divisin(X ) =
i =1
n +1
Ti log 2 T + 1 T +1 Ti
(4.8)
Una prueba puede seleccionar del conjunto de pruebas posibles, como antes, pero utilizando las versiones modificadas de ganancia e informacin de la divisin. Si la prueba X con resultados O1, O2, ..., ON es escogida y tiene algunos valores desconocidos para algunos de los datos de entrenamiento, el concepto de particionamiento debe ser generalizado, segn un criterio probabilstico.
Cuando un caso T con un resultado conocido Oi es asignado al subconjunto Ti, esto significa que la probabilidad de que el caso pertenezca a Ti es 1 y de que pertenezca a todos los otros subconjuntos es 0. Cuando el resultado es desconocido, slo se puede realizar una afirmacin estadstica ms dbil. Entonces, se asocia con cada caso del subconjunto Ti un peso representando la probabilidad de que el caso pertenezca a cada subconjunto. Si el resultado para el caso es conocido, entonces el peso es 1; si el caso tiene un resultado desconocido, entonces el peso es simplemente la probabilidad del resultado Oi en este punto. Cada subconjunto Ti es una coleccin de casos fraccionales posibles, tal que |Ti| debe ser reinterpretada como la suma de los pesos fraccionales de los casos pertenecientes al subconjunto.
Los casos de entrenamiento en T pueden tener pesos no unitarios, ya que T puede ser el resultado de una particin previa. Entonces, en general, un caso de T con peso p cuyo resultado no se conoce, es asignado a cada subconjunto Ti con peso:
P x probabilidad_de_resultado_Oi
(4.9)
Solucin Propuesta
Magdalena Servente
67
La probabilidad_de_resultado_Oi se estima como la suma de los pesos de los casos en T con valores conocidos que tienen resultado Oi, sobre la suma de los pesos de los casos en T con resultado conocidos para la prueba.
Se toma un enfoque similar cuando el rbol de decisin es utilizado para clasificar un caso. Si en un nodo de decisin el atributo relevante no se conoce, de manera tal que el resultado de la prueba no puede determinarse, el sistema explora todos los resultados posibles y combina aritmticamente las clasificaciones resultantes. Como para cada atributo pueden existir mltiples caminos desde la raz del rbol hasta las hojas, una clasificacin es una distribucin de clases ms que una nica clase. Cuando la distribucin de clases total para un caso nuevo ha sido establecida de esta manera, la clase con la probabilidad ms alta, es asignada como la clase predicha.
La informacin de la divisin an se determina a partir del conjunto de entrenamiento completo y es mayor, ya que existe una categora extra para los valores desconocidos.
Cada hoja en el rbol de decisin resultante tiene asociados dos valores: (N/E). N es la suma de los casos fraccionales que llegan a la hoja; y E es el nmero de casos cubiertos por la hoja, que no pertenecen a la clase de la misma.
Para entender este problema, supongamos que tenemos un conjunto de datos dos clases, donde una proporcin p 0.5 de los casos pertenecen a la clase mayoritaria. Si un clasificador asigna todos los casos con valores indeterminados a la clase mayoritaria, la proporcin esperada de error es claramente 1 p. Si,
68 Magdalena Servente Manual del usuario
en cambio, el clasificador asigna un caso a la clase mayoritaria con probabilidad p y a la otra clase con probabilidad 1 - p, su proporcin esperada de error es la suma de:
la probabilidad de que un caso perteneciente a la clase mayoritaria sea asignado a la otra clase, p x (1 p), y
la probabilidad de que un caso perteneciente a la otra clase sea asignado a la clase mayoritaria, (1 p) x p
que da como resultado 2 x p (1 p). Como p es al menos 0.5, esto es generalmente superior a 1 p, entonces el segundo clasificador tendr una mayor proporcin de errores. Un rbol de decisin complejo tiene una gran similitud con este segundo tipo de clasificador. Los casos no se relacionan a una clase, entonces, el rbol manda cada caso al azar a alguna de las hojas.
Un rbol de decisin no se simplifica borrando todo el rbol a favor de una rama, sino que se eliminan las partes del rbol que no contribuyen a la exactitud de la clasificacin para los nuevos casos, produciendo un rbol menos complejo, y por lo tanto, ms comprensible.
El primer enfoque, conocido como pre-poda, tiene la ventaja de que no se pierde tiempo en construir una estructura que luego ser simplificada en el rbol final. Los sistemas que lo aplican, generalmente buscan la mejor manera de partir el subconjunto y evalan la particin desde el punto de vista estadstico mediante la teora de la ganancia de informacin, reduccin de errores, etc. Si esta evaluacin es menor que un lmite predeterminado, la divisin se descarta y el rbol para el subconjunto es simplemente la hoja ms apropiada. Sin embargo, este tipo de mtodo tiene la desventaja de que no es fcil detener un particionamiento en el momento adecuado, un lmite muy alto puede terminar con la particin antes de que los beneficios de particiones subsiguientes parezcan evidentes, mientras que un lmite demasiado bajo resulta en una simplificacin demasiado leve.
El C4.5 utiliza el segundo enfoque, el mtodo de divide y reinars procesa los datos de entrenamiento libremente, y el rbol sobreajustado producido es podado despus. Los procesos computacionales extras invertidos en la construccin de partes del rbol que luego sern podadas pueden ser sustanciales, pero el
Solucin Propuesta
Magdalena Servente
69
costo no supera los beneficios de explorar una mayor cantidad de particiones posibles. El crecimiento y la poda de los rboles son ms lentos, pero ms confiables.
La poda de los rboles de decisin llevar, sin duda, a clasificar errneamente una mayor cantidad de los casos de entrenamiento. Por lo tanto, las hojas de un rbol podado no contendrn necesariamente una nica clase sino una distribucin de clases, como se explic con anterioridad. Asociado a cada hoja, habr una distribucin de clases especificando, para cada clase, la probabilidad de que un caso de entrenamiento en la hoja pertenezca a dicha clase.
Supongamos que fuera posible predecir la proporcin de errores de un rbol y sus subrboles. Esto inmediatamente llevara al siguiente mtodo de poda: Comenzar por las hojas y examinar cada subrbol. Si un reemplazo del subrbol por una hoja o por su rama ms frecuentemente utilizada, lleva a una proporcin de errores predicha (predicted error rate) menor, entonces podar el rbol de acuerdo a ello, recordando que las proporciones de errores predichas para todos los subrboles que lo contienen se vern afectadas. Como la proporcin de errores predicha para un rbol disminuye si disminuyen las proporciones de errores predichas en cada una de sus ramas, este proceso generara un rbol con una proporcin de errores predicha mnima.
Cmo podemos predecir la proporcin de errores? Est claro que calcular la proporcin de errores a partir de los datos de entrenamiento para los cuales el rbol fue construido, no es un estimador til, ya que en lo que respecta al conjunto de entrenamiento, la poda siempre aumenta la proporcin de errores. Existen dos familias de tcnicas para predecir la proporcin de errores. La primer familia predice la proporcin de errores de un rbol y sus subrboles utilizando un nuevo conjunto de casos distinto del conjunto de entrenamiento. Como estos casos no fueron examinados durante la construccin del rbol, los estimadores obtenidos a partir de ellos son insesgados y, de existir suficientes casos, confiables. Ejemplos de esta familia son:
Poda segn la complejidad del costo (Cost-complexity pruning) [Breinman et al, 1984] en la cual la proporcin de errores predicha para un rbol se modela como la suma ponderada de su complejidad y sus errores en los casos de entrenamiento, con los casos extras utilizados para determinar los coeficientes de la ponderacin.
70
Magdalena Servente
Poda de reduccin de errores (Reduced-error pruning)[Quinlan, 1987e], que evala la proporcin de errores de un rbol y sus componentes directamente a partir del nuevo conjunto de casos.
La desventaja de esta familia de tcnicas es simplemente que una parte del conjunto de datos preclasificados a partir de los que se construy el rbol debe guardarse para determinar los errores, entonces el rbol debe ser construido a partir de un conjunto de datos ms pequeo. Una solucin a este problema es utilizar un enfoque de referencias cruzadas. Este consiste en dividir los casos disponibles en bloques iguales de tamao C y, para cada bloque, un rbol se construye con todos los otros bloques y se miden los errores con el bloque elegido. Para valores moderados de C, se asume que el rbol construido a partir de todos los bloques menos uno ser muy similar al construido a partir de todos los datos. Por supuesto que deben construirse C rboles y no uno solo.
El enfoque tomado por el C4.5 pertenece a la segunda familia de tcnicas que utilizan nicamente el conjunto de entrenamiento a partir del cual se construy el rbol. La estimacin de la proporcin de errores pura se ajusta para reflejar su propia tendencia. El mtodo utilizado por el C4.5 se describe a continuacin.
Cuando una hoja cubre N casos de entrenamiento, E de ellos en forma errnea, el estimador de la proporcin de errores de resubstitucin para dicha hoja es N/E. Podemos entender esto de manera naif como E eventos en N pruebas. Si el conjunto de N casos de entrenamiento se tomase como una muestra (lo cual, por supuesto, no es cierto), nos podramos preguntar qu nos dice este resultado acerca de la probabilidad de un evento (error) en la totalidad de la poblacin de casos cubiertos por la hoja. La probabilidad de error no puede determinarse de forma exacta, pero cuenta con lmites de confianza. Para un lmite de confianza CF, el lmite superior de esta probabilidad puede encontrarse a partir de los lmites de confianza para la distribucin binomial; el lmite superior se expresa como UCF(E,N). Como en la distribucin binomial los lmites superior e inferior son simtricos, la probabilidad de que el promedio real de errores exceda UCF(E,N)es CF/2. El C4.5 simplemente iguala el estimador de error predicho de la hoja con su lmite superior, bajo el argumento de que el rbol fue construido para minimizar la proporcin de error observada. Aunque los fundamentos de esta heurstica son cuestionables y violan algunos principios estadsticos, las estimaciones producidas presentan frecuentemente resultados aceptables.
Para simplificar el clculo, las proporciones de error para las hojas y subrboles se computan asumiendo que fueron utilizados para clasificar un conjunto de nuevos casos del mismo tamao del conjunto de entrenamiento. Entonces, una hoja que cubre N casos de entrenamiento con un estimador de error predicho de UCF(E,N) generara N x UCF(E,N) errores predichos. Anlogamente, la cantidad de errores predichos asociados con un (sub)rbol es la suma de los errores predichos para cada una de sus ramas.
Solucin Propuesta
Magdalena Servente
71
La suma de los errores predichos en las hojas, dividido el nmero de casos de entrenamiento, es un estimador inmediato del error de un rbol podado sobre nuevos casos.
Estado ? Soleado Nublado Lluvia Lluvia Lluvia Nublado Soleado Soleado Lluvia Soleado Nublado Nublado Lluvia
Humedad Alta Alta Alta Alta Normal Normal Normal Alta Normal Normal Normal Alta Normal Alta
Viento Leve Fuerte Leve Leve Leve Fuerte Fuerte Leve Leve Leve Fuerte Fuerte Leve Fuerte
JuegoTenis No No Si Si Si No Si No Si Si Si Si Si Si
Este es el mismo conjunto de datos que fue utilizado en la seccin 4.3.1.5 para construir un rbol utilizando el ID3 con la diferencia que es el valor del atributo Estado para el primer caso es desconocido.
No Si Totales
Desconocido 1 0 1
Soleado 2 2 4
Nublado 0 4 4
Lluvia 1 4 5
72
Magdalena Servente
Primero calculamos la entropa del conjunto. Recordemos que, como se explic en la seccin 4.4.2.2, no debemos tener en cuenta los atributos desconocidos. Entonces, trabajamos sobre un total de 13 casos, de los cuales 3 son positivos. Tendremos,
H (S ) =
Calculamos ahora la entropa que tendran los conjuntos resultantes de la divisin de datos segn este atributo.
H ( S , Estado) =
4 2 2 2 log 2 log 2 13 4 4 4
2 4 0 0 4 + log 2 log 2 4 13 4 4 4
4 5 1 1 4 + log 2 log 2 4 13 5 5 5
4 = 0.58536bits 5
Ahora calculamos la ganancia resultante de dividir al subconjunto segn el atributo Estado, tendremos:
Ganancia(S , Estado ) =
Al calcular al informacin de la divisin, debemos tener en cuenta una categora extra para el valor desconocido para el atributo. La informacin de la divisin se calcula como:
I _ divisin(S ) =
proporcin _ de _ ganancia( S ) =
De la misma manera en que calculamos la ganancia y la proporcin de ganancia para el caso anterior, calculamos para el atributo Humedad los siguientes valores:
Ganancia=0.0746702 bits
Ganancia=0.00597769 bits
Al igual que con el ID3, conviene dividir el conjunto segn el atributo Estado tanto si trabajamos con la ganancia como si trabajamos con la proporcin de ganancia. Al dividir los 14 casos para continuar con la construccin del rbol, los 13 casos para los que el valor de Estado es conocido, no presentan problemas y se reparten segn el valor de Estado. Mientras que el caso en que no se conoce el valor de Estado, se
Solucin Propuesta
Magdalena Servente
73
reparte entre los conjuntos que tienen Soleado, Nublado y Lluvia con los pesos 4/13, 4/16 y 5/13 respectivamente.
Tomemos por ejemplo, la divisin de los datos para el valor Nublado del atributo Estado. Los datos que se tienen en cuenta en este caso son:
JuegoTenis No Si Si Si Si
Peso 4/13 1 1 1 1
No Si Totales
Desconocido 0 0 0
Normal 0 2 2
Ganancia=0.068 bits
Ganancia=0.068 bits
En este caso, vemos que la divisin del conjunto de datos no ofrece ninguna mejora, por lo tanto, colapsamos el rbol a la hoja Si, que es la que mayor peso tiene. La cantidad de casos cubiertos por la hoja, es decir, el N asociado a la misma, es 4.3. Y la cantidad de casos cubiertos incorrectamente, o el E asociado a la hoja, por la hoja son 0.3.
La figura 4.4 muestra un esquema de todos los pasos para la construccin del rbol de decisin en este caso. A continuacin se muestra el rbol obtenido.
Estado = Nublado: Si (4.3/0.3) Estado = Lluvia: Si (5.4/1.4) Estado = Soleado: Humedad = Alta: No (2.3) Humedad = Normal: Si (2.0) 74 Magdalena Servente Manual del usuario
Estado ? Soleado Nublado Lluvia Lluvia Lluvia Nublado Soleado Soleado Lluvia Soleado Nublado Nublado Lluvia
Lluvia
Humedad Alta Alta Alta Alta Normal Normal Normal Alta Normal Normal Normal Alta Normal Alta
Viento Leve Fuerte Leve Leve Leve Fuerte Fuerte Leve Leve Leve Fuerte Fuerte Leve Fuerte
JuegoTenis No No Si Si Si No Si No Si Si Si Si Si Si
Soleado
ESTADO ganancia=0.180 proporcin de ganancia=0.0.098 HUMEDAD Ganancia=0.075 Proporcin de ganancia =0.075 VIENTO Ganancia=0.006 Proporcin de ganancia =0.00609
Estado
Viento Juego Peso Tenis Leve No 5/13 Leve Si 1 Leve Si 1 Fuerte No 1 Leve Si 1 Fuerte Si 1 Estado ? Nublado Nublado Nublado Nublado
Nublado
Viento Juego Peso Tenis Leve No 4/13 Fuerte No 1 Leve No 1 Leve Si 1 Fuerte Si 1
HUMEDAD Ganancia=0.029 Proporcin de ganancia =0.029 VIENTO Ganancia=0.130 Proporcin de ganancia =0.136
Viento Juego Peso Tenis Leve No 4/13 Leve Si 1 Fuerte Si 1 Fuerte Si 1 Leve Si 1
HUMEDAD Ganancia=0.068 Proporcin de ganancia =0.068
Humedad
SI N=4.3 E=0.3
Normal
SI N=2.3 E=0
SI N=2 E=0
Recordemos que el C4.5 analiza los errores predichos en cada uno de los subrboles y ramas del rbol generado para analizar si es conveniente simplificarlo. En este caso, el error total predicho para el rbol estar dado por:
Error _ predicho( Arbol ) = 4.3 U 25% (0.3,4.3) + 5.4 U 25% (1.4,5.4) + 2.3 U 25% (0,2.3) + 2 U 25% (0,2)
Ahora, calculamos el error total predicho de simplificar el rbol por la hoja Si:
Si (14.0/5.76)
Para decidir cundo una condicin debe eliminarse, utilizaremos el siguiente mtodo. Sea R una regla de la forma:
si A entonces clase C
si A- entonces clase C,
donde A- se obtiene borrando la condicin X de las condiciones de A. La evidencia para la importancia de X debe encontrarse en los casos de entrenamiento utilizados para la construccin del rbol de decisin. Cada caso que satisface el antecedente ms corto A- pertenece o no a la clase C, y satisface o no la condicin X. Los nmeros de casos en cada uno de estos cuatro grupos pueden organizarse en una tabla de contingencias de 2 x 2:
Clase C Y1 Y2
Otras clases E1 E2
Y1+E1: casos que satisfacen A- y tambin X, por lo tanto, tambin estn cubiertos por la regla original R, E1 de ellos errneamente ya que pertenecen a clases distintas a C.
Y2+E2: casos que satisfacen A- pero no X que sern cubiertos por la regla generalizada R- pero no por la regla original. E2 de estos casos sern clasificados errneamente.
76
Magdalena Servente
De acuerdo a varios experimentos desarrollados por Quinlan [Quinlan, 1987] para medir la importancia de la tabla de contingencia al decidir si una condicin X debe ser eliminada o no, se encontr que se obtienen mejores resultados utilizando una estimacin pesimista de la precisin de las reglas R y R- sobre nuevos casos. No es muy probable que una hoja que cubre N casos con E errores tenga una proporcin de error tan baja como E/N al clasificar nuevos casos. En lugar de utilizar el estimador E/N al estimar la proporcin real de errores de una hoja como el lmite superior UCF(E,N) del intervalo de confianza para algn nivel de confianza CF. Si reemplazamos estos valores por los de las reglas R y R- obtendremos los siguientes estimadores pesimistas:
Si
U CF ( E1 + E 2 , Y1 + Y2 + E1 + E 2 ) U CF ( E1 , Y1 + E1 )
(4.10)
Entonces
Durante el proceso de generalizacin ser necesario eliminar ms de una condicin. En lugar de analizar todos los subconjuntos posibles de condiciones que podran eliminarse, el sistema de C4.5 realiza una eliminacin directa golosa (straightforward greedy elimination): De todas las reglas que pueden eliminarse por el mtodo descripto, se elimina aquella que produce la menor proporcin pesimista de error en la regla generalizada. Como en todos las bsquedas golosas el hecho de buscar el mnimo en cada paso no nos asegura llegar al mnimo global.
plantea una solucin simple: ordenar las reglas y la primera regla que cubre el caso se toma como la regla operativa. Es necesario, entonces, establecer prioridades para el ordenamiento de las reglas y decidir la clasificacin por defecto a utilizar.
Para establecer las prioridades se sigui un mtodo propuesto por Michie que determina que todas las reglas de una misma clase deben aparecer juntas y estos subconjuntos de clases son los que estn ordenados en lugar de las reglas en s. Este agrupamiento hace que las reglas sean ms entendibles y tiene la ventaja que el ordenamiento de las reglas en particular no es importante.
Supongamos que del conjunto de reglas elegimos un subconjunto S de reglas que cubren la clase C. La performance de este subconjunto puede medirse mediante el nmero de casos de entrenamiento cubiertos por S que no pertenecen a la clase C (falsos positivos) y el nmero de casos de entrenamiento de la clase C que no son cubiertos por ninguna regla de S (falsos negativos).El valor del subconjunto S se mide utilizando el Principio de Longitud de Descripcin Mnima [Rissanen, 1983], explicado en la seccin 2.4.1.4. Recordemos que este principio puede expresarse de la siguiente manera: Un Emisor y un Receptor cuentan con copias idnticas de un conjunto de casos de entrenamiento, pero los casos del Emisor tambin especifican la clase de cada caso, mientras que los casos del Receptor no tienen informacin de las clases. El Emisor debe comunicar esta informacin faltante al Receptor mediante la transmisin de una teora de clasificacin junto con las excepciones a la misma. El Emisor puede elegir la complejidad de la teora que enva (una teora relativamente simple con muchas excepciones, o una teora muy compleja con pocas excepciones). El Principio MDL afirma que la mejor teora derivable de los datos de entrenamiento minimizar la cantidad de bits necesarios para codificar el mensaje completo consistente de la teora y sus excepciones.
La informacin a transmitir es la identidad en los casos de entrenamiento que pertenecen a la clase C, utilizando un esquema de codificacin para la teora (subconjunto S de reglas) y sus excepciones. El esquema utilizado por el C4.5 es aproximado ya que en lugar de utilizar un mtodo de codificacin en particular, trata de encontrar un lmite inferior al nmero de bits. Podemos resumirlo de la siguiente manera:
1.
Para codificar una regla, debemos especificar cada antecedente. El consecuente no necesita ser codificado, porque todas las reglas del subconjunto pertenecen a la misma clase C. Existe una pequea complicacin: las condiciones deben enviarse en algn orden, pero el orden no importa porque las condiciones pertenecen a una conjuncin. Si existen x condiciones en el antecedente, existen x! ordenamientos posibles que podran enviarse, todos equivalentes del punto de vista de la especificacin de la regla. Por lo tanto, la cantidad de bits requerida para enviar cualquier ordenamiento en particular debe ser reducida en un crdito de log2(x!).
78
Magdalena Servente
2.
La codificacin de un conjunto de reglas requiere la suma de los bits para codificar cada regla, menos un crdito similar para el ordenamiento de las reglas (ya que todos los ordenamientos de reglas para una misma clase son equivalentes)
3.
Las excepciones se codifican indicando cules de los casos cubiertos por las reglas S son falsos positivos y cules falsos negativos. Si las reglas cubren r de los n casos de entrenamiento, con fp falsos positivos y fn falsos negativos, la cantidad de bits necesarios para codificar la excepcin es
r n r log 2 + log 2 fp fn
(4.11)
El primer trmino indica los bits necesarios para indicar los falsos positivos entre los casos cubiertos por las reglas y el segundo trmino indica los falsos negativos entre los casos no cubiertos por las reglas.
El valor de un subconjunto S en particular se mide con la suma de las longitudes de codificacin para las reglas y excepciones, a menor suma, mejor teora.
En la prctica, los mtodos de codificacin tienden a sobrestimar la cantidad de bits requeridos para codificar una teora relativa al conjunto de excepciones. Esto se explica por el hecho de que los conjuntos de atributos generalmente son redundantes, por lo que diferentes teoras pueden ser funcionalmente idnticas. Como la funcin de una teora para una clase es identificar un subconjunto de casos de entrenamiento, diferentes reglas que identifiquen al mismo conjunto son intercambiables, an cuando hayan sido codificadas de manera distinta. Para compensar este efecto, el sistema utiliza la suma ponderada:
(4.12)
donde W < 1.
El valor apropiado de W depender de la probabilidad de que dos teoras representen los mismos casos, lo cual depender del grado de redundancia en los datos. C4.5 utiliza el valor 0.5 por defecto para W, pero puede ajustarse a un valor menor si se encuentra un gran grado de redundancia en los datos. Sin embargo, no se ha encontrado que el resultado del algoritmo dependa en gran medida del valor de W.
Entonces, para enviar las reglas debe encontrarse un subconjunto S de reglas para la clase C que minimice esta codificacin total. Esto es similar a la generalizacin de reglas descripta anteriormente, pero en este caso la eliminacin golosa no parece ser efectiva. En cambio, el sistema analiza todos los subconjuntos posibles de reglas para una clase, si no son demasiados, y utiliza recocido simulado (simulated annealing) en caso contrario. En este ltimo caso, el sistema repetidamente elige una regla al azar y considera incluirla en el subconjunto S (si an no pertenece al mismo), o eliminarla de S (si ya pertenece). Esta
Solucin Propuesta Magdalena Servente 79
accin producir un cambio B en el total de bits necesario para codificar el subconjunto y las excepciones y, si el caso es beneficioso, entonces se lo acepta inmediatamente. Si la accin incrementa la longitud total de la codificacin tal que B es positivo, el cambio se acepta con una probabilidad de e-B/K donde K es una especia de temperatura sinttica. Al reducir gradualmente el valor de K al ir explorando los cambios, el sistema tiende a converger a un conjunto de reglas con una codificacin cerca del mnimo (near-minimun encoding).
Al decidir el ordenamiento de las clases es importante tener en cuenta los falsos positivos ya que ocasionarn clasificaciones incorrectas. Entonces, a la hora de decidir sobre el ordenamiento, se elige primero a la clase que tiene menos falsos positivos. Luego, los falsos positivos de los casos de entrenamiento que an no han sido seleccionados se recomputan y se vuelve a elegir la clase con menos falsos positivos, y as sucesivamente.
Como la clase por defecto ser utilizada cuando un caso no sea cubierto por ninguna de las reglas, stas reglas deberan tenerse en cuenta para determinar cul ser la clase por defecto. El C4.5 elige como clase por defecto aquella clase que cubre la mayora de los casos de entrenamiento no cubiertos por ninguna regla, resolviendo empates a favor de la clase con la mayor frecuencia absoluta.
Una vez que se ha determinado el ordenamiento y la clase por defecto, el conjunto de reglas se examina por ltima vez. Si existe alguna regla cuya eliminacin reduzca el nmero de errores de clasificacin, se la elimina y se recomputan los errores. El conjunto vuelve a chequearse. Este paso fue diseado para evaluar el conjunto de reglas en la forma en que ser utilizado.
Regla 1 SI Estado = Soleado Y Humedad = Alta ENTONCES JuegoTenis = No Regla 2 SI Estado = Soleado Y Humedad = Normal ENTONCES JuegoTenis = Si Regla 3 SI Estado = Nublado ENTONCES JuegoTenis = Si Regla 4 SI Estado = Lluvia ENTONCES JuegoTenis = Si
A continuacin, el C4.5 generaliza cada una de estas reglas, eliminando aquellas condiciones que generan un estimador de error pesimstico mayor. Calculamos este estimador para cada una de las reglas
presentadas y para las reglas resultantes de eliminar cada una de sus condiciones.
Errores 0 4 2
Las reglas resultantes de eliminar cualquiera de las dos condiciones del antecedente, tienen un estimador pesimstico de error superior al de la regla actual, con lo cual no es conveniente eliminar ninguna de las dos condiciones. Mantenemos, entonces, la regla tal como fue generada, agregndole la precisin de la misma.
Repetimos estos clculos para las reglas restantes. En el caso de la regla 2 tendremos:
Errores 0 1 2
En este caso, la regla resultante de eliminar la primera condicin tiene un estimador pesimstico del error menor que el de la regla actual, entonces, eliminamos esta condicin y repetimos los clculos, obteniendo:
Solucin Propuesta Magdalena Servente 81
Errores 1 4
Cant. De casos cubiertos Estimador pesimstico del error Condicin ausente 7 33.8% <regla actual> 14 41.3% Humedad=Normal
Errores 0 4
Cant. De casos cubiertos Estimador pesimstico del error Condicin ausente 4 29.3% <regla actual> 14 41.3% Estado=Nublado
Errores 1 4
Cant. De casos cubiertos Estimador pesimstico del error Condicin ausente 5 45.4% <regla actual> 14 41.3% Estado=Lluvia
Una vez que todas las reglas han sido generalizadas, el C4.5 agrupa las reglas segn la clase de su consecuente y busca los subconjuntos de reglas que generan una codificacin mnima para la clase. Entonces, calcula para cada subconjunto de reglas la cantidad de bits necesarios para codificar las reglas, y utiliza el mtodo del recocido simulado para determinar cules reglas son convenientes utilizar para representar cada clase. En este caso, las reglas escogidas son la regla 1 para la clase No y la regla 3 para la clase Si.
Finalmente, el C4.5 ordena las reglas y escoge la clase por defecto. Para ello, primero debemos computar los falsos positivos de cada una de las reglas para escoger la de menor falsos positivos como primera. En este caso, los falsos positivos para ambas reglas son nulos. Con lo cual, mantenemos el orden en que fueron generadas.
82 Magdalena Servente Manual del usuario
Para la eleccin de la clase por defecto, computamos la cantidad de casos de cada clase no cubiertos por las reglas escogidas. A continuacin se presentan la cantidad de casos de cada clase, especificndose la cantidad de casos de cada clase no cubiertos por ninguna de las reglas escogidas.
Casos 4 10
No cubiertos 2 6
Clase No Si
Como la mayora de los casos no cubiertos, pertenecen a la clase Si, sta es escogida como clase por defecto. Las reglas finales para este ejemplo se presentan a continuacin.
Regla 1 SI Estado = Soleado Y Humedad = Alta ENTONCES JuegoTenis = No [50.0%] Regla 3 SI Estado = Nublado ENTONCES JuegoTenis = Si [70.7%] Regla 5 Clase por defecto = Si
Solucin Propuesta
Magdalena Servente
83
ID3
rbol de decisin podado Transformacin a reglas de decisin Evaluacin del modelo generado
rbol de decisin
Reglas de decisin
DATOS DE ENTRENAMIENTO
DATOS DE PRUEBA
C4.5
rbol de decisin podado Transformacin a reglas de decisin
rbol de decisin
Reglas de decisin
84
Magdalena Servente
Solucin Propuesta
DATOS DE ENTRENAMIENTO
1 Generacin del rbol de decisin LOG DEL ID3 rbol de decisin sin podar
DATOS TRANSFORMACION
rbol de decisin podado REGLAS DE DECISIN 5 Guardado del rbol de decisin a disco SENTENCIAS SQL DATOS DE PRUEBA
Solucin Propuesta
Magdalena Servente
85
Cada uno de los procesos mostrados en la figura 4.6 se describe en las secciones siguientes.
4.5.2.1.1. Generacin del rbol de decisin Este proceso genera el rbol de decisin segn el algoritmo explicado para el ID3 en la seccin 4.3.1.1. El rbol se construye a partir de los datos de entrenamiento en formato Paradox, seleccionados por el usuario.
Durante este proceso se genera un archivo de log que guarda todos los clculos de ganancia y de proporcin de ganancia realizadas en cada paso; y el atributo escogido para realizar la divisin. El archivo de log se encuentra en el subdirectorio Log dentro del directorio donde est instalado el programa, y su nombre est compuesto de la siguiente manera: MtodoDD-MM-AA HH_MM_SSNombreTabla.log. Esto permite identificar fcilmente el log correspondiente a una corrida. El formato del archivo de log se especifica en la seccin 4.5.2.1.8.
4.5.2.1.2. Poda del rbol de decisin Este proceso realiza la poda del rbol de decisin segn la metodologa explicada en la seccin 4.3.1.2.
4.5.2.1.3. Impresin del rbol de decisin en pantalla Una vez podado, el rbol de decisin se muestra en pantalla, de forma tal que figure la prueba realizada en cada nodo y el valor de la prueba en cada rama, como aparece en la figura 4.7.
4.5.2.1.4. Transformacin a reglas de decisin A partir del rbol de decisin podado, se generan las reglas de decisin de acuerdo con el mtodo explicado en la seccin 4.3.1.3. Se guarda en disco un archivo de texto que contiene las reglas obtenidas, y un archivo de Paradox que contiene las sentencias SQL equivalentes. Tambin se genera otra tabla de Paradox, Datos Transformacin, que contiene los datos de necesarios para identificar la transformacin correspondiente a cada sentencia SQL.
86
Magdalena Servente
Solucin Propuesta
4.5.2.1.4. Transformacin a reglas de decisin A partir del rbol de decisin podado, se generan las reglas de decisin de acuerdo con el mtodo explicado en la seccin 4.3.1.3. Se guarda en disco un archivo de texto que contiene las reglas obtenidas, y un archivo de Paradox que contiene las sentencias SQL equivalentes. Tambin se genera otra tabla de Paradox, Datos Transformacin, que contiene los datos de necesarios para identificar la transformacin correspondiente a cada sentencia SQL.
4.5.2.1.5. Guardado del rbol de decisin a disco Una vez presentado el rbol por pantalla, se le ofrece al usuario la posibilidad de guardarlo en el disco rgido. Si acepta, debe elegir en qu directorio y con qu nombre desea guardarlo. La extensin del archivo resultante es tree.
4.5.2.1.6. Evaluacin de los resultados A partir de una lista de corridas realizadas, el usuario elige cul corrida del ID3 desea evaluar. Los datos de las corridas previas estn almacenados en la tabla de Datos Transformacin. Una vez realizada la eleccin, se obtienen de la tabla de Sentencias SQL las sentencias SQL generadas durante la transformacin del rbol a reglas de decisin (Seccin 4.5.2.1.4). Estas sentencias se aplican al conjunto de datos de prueba determinado por el usuario.
Solucin Propuesta
Magdalena Servente
87
Se genera una matriz de confusin que indica para cada clase la cantidad de casos correctamente clasificados y los incorrectamente clasificados. Se calcula la probabilidad de que un caso sea clasificado correctamente como perteneciente a esa clase. Finalmente, se obtienen los totales generales. La matriz de confusin obtenida se muestra en pantalla. La Figura 4.8 muestra un ejemplo de dicha matriz de confusin.
4.5.2.1.7. Formato de los datos de entrenamiento y de prueba Los datos de entrenamiento y prueba deben estar en formato de Paradox 3 (.db o .dbf) para poder ser procesados por el sistema. Se eligi este formato porque la mayora de los programas de manejo de datos pueden exportar sus archivos y tablas al formato de Paradox 3; lo cual permite analizar datos alamacenados en casi cualquier formato.
4.5.2.1.8. Archivo de Log del ID3 Durante la generacin del rbol de decisin, se genera un archivo de log que almacena todos los clculos realizados. En cada paso, se almacenan:
1.
el Nivel en el que se est, entendindose por Nivel el numero de ciclo de procesamiento en el que se est
2.
Una matriz con la cantidad de instancias pertenecientes a cada clase para cada valor posible del descriptor.
El valor de la ganancia
88
Magdalena Servente
Solucin Propuesta
3.
La ganancia o la proporcin de ganancia mxima (segn el criterio de divisin con el que se est trabajando).
Nivel=0 Descriptor=Estado Lluvia Nublado No 1 0 Si 4 4 5 4 Gain=0.258521 Gain Ratio=0.491042 -------------------------------------Descriptor=Humedad Alta Normal No 3 1 Si 4 6 7 7 14 Gain=0.0746702 Gain Ratio=0.14934 -------------------------------------Descriptor=Viento Fuerte Leve No 2 2 Si 4 6 6 8 14 Gain=0.00597769 Gain Ratio=0.0122457 -------------------------------------0.258521
Soleado 3 2 5 14
4.5.2.1.9. Archivo de Reglas de decisin del ID3 El archivo de reglas de decisin generado durante la transformacin a reglas de decisin contiene las reglas para el rbol analizado. Por cada regla guarda el nmero de regla y la regla en s.
4.5.2.1.10. Archivo del rbol de decisin del ID3 Cuando el usuario elige guardar el rbol de decisin a disco, este se almacena en un archivo plano, tabulndose n veces cada rengln, siendo n el nivel del nodo de decisin. A continuacin se muestra el contenido de un archivo .tree a modo de ejemplo.
Estado = Lluvia Viento = Fuerte Humedad = Alta Si Humedad = Normal No Viento = Leve Solucin Propuesta Magdalena Servente 89
DATOS DE ENTRENAMIENTO
DATOS DE PRUEBA
Reglas de decisin
La figura 4.9 presenta el DFD general para la seccin del C4.5. A simple vista, vemos que el diseo de este proceso difiere ligeramente del diseo del ID3. Aunque los procesos principales (generacin y poda del rbol de decisin, generacin de las reglas de decisin, evaluacin de los resultados) se mantienen, encontramos que hay dos evaluaciones de resultados, una para el rbol de decisin y otra para las reglas.
90
Magdalena Servente
Solucin Propuesta
Esto se debe a que, a diferencia del ID3, las reglas de decisin y el rbol generados por el C4.5 no son modelos de clasificacin equivalentes. Por otro lado, encontramos que tanto el archivo del rbol de decisin como el de las reglas de decisin se presentan junto a la evaluacin de resultados. Recordemos que, como se explic en la seccin 4.4, el C4.5 evala cada rama y cada regla en particular. Por lo tanto, la evaluacin no puede separarse de los modelos generados.
Cada uno de los procesos mostrados en la figura 4.9 se describe en las secciones siguientes.
4.5.2.2.1. Generacin del rbol de decisin Este proceso genera el rbol de decisin segn el algoritmo explicado para el C4.5 en las secciones 4.4.1 y 4.4.2. El rbol se construye a partir de los datos de entrenamiento en formato Paradox, seleccionados por el usuario.
4.5.2.2.2. Poda del rbol de decisin Este proceso realiza la poda del rbol de decisin segn la metodologa explicada en la seccin 4.4.3.
4.5.2.2.3. Evaluacin del rbol de decisin El rbol de decisin se evala segn el algoritmo explicado en la seccin 4.4.4. Se le agrega una prueba de valor a cada rama y se genera una matriz de confusin a partir de la performance del rbol sobre los datos de prueba.
4.5.2.2.4. Impresin del rbol de decisin en pantalla El rbol de decisin se muestra en pantalla para el usuario, de manera idntica al rbol generado para el ID3, explicado en la seccin 4.5.2.1.3.
Solucin Propuesta
Magdalena Servente
91
4.5.2.2.5. Transformacin a reglas de decisin El rbol de decisin generado, se transforma a reglas de decisin segn la metodologa explicada en la seccin 4.4.6. Las reglas se almacenan en un archivo plano cuyo formato se explica en la seccin 4.5.2.2.8.
4.5.2.2.6. Evaluacin de las reglas de decisin Una vez generadas las reglas de decisin, el sistema las evala contra los datos de prueba. Genera una apreciacin de exactitud para cada regla, segn lo explicado en la seccin 4.4.6, y una matriz de confusin general. Almacena todos los resultados en un archivo plano.
4.5.2.2.7. Formato de los datos de entrenamiento y de prueba Al igual que en el caso del ID3, los datos de entrenamiento y prueba deben estar en formato de Paradox 3 (.db o .dbf) para poder ser procesados por el sistema.
4.5.2.2.8. Archivo del rbol de decisin y evaluacin de resultados del C4.5 Durante la generacin del rbol de decisin, su correspondiente poda y su posterior evaluacin se genera un archivo de resultados obtenidos en cada paso. En este archivo se almacenan:
1.
el rbol de decisin sin podar, donde cada rama tiene asociados dos nmeros: N y E, cuyo sentido se detalla a continuacin:
2.
92
Magdalena Servente
Solucin Propuesta
E es la cantidad de errores predichos, segn la distribucin binomial, para la hoja si una cantidad N de nuevos casos fuese evaluada por el rbol
3.
Estimacin
Errores = x (y%)
Con:
Estimacin =
donde:
E
i =1
4.
una matriz de confusin que indica para cada clase, la cantidad de casos clasificados errneamente y la cantidad de casos de la misma clasificados como pertenencientes a otra clase.
Opciones: Datos <cardiolo> Los rboles sern evaluados sobre los datos de prueba Se utilizar el Gain criterion
Solucin Propuesta
Magdalena Servente
93
95 casos (7 atributos) ledos de cardiolo.data rbol de decisin: Duracin del Angor = MENOS DE 30 MIN: NO (48.0/1.0) Duracin del Angor = MAS DE 30 MIN: | Dolor de Pecho de Angor = TIPICO: SI (16.0/1.0) | Dolor de Pecho de Angor = AUSENTE: NO (16.0) | Dolor de Pecho de Angor = ATIPICO: | | Irradiacin del Angor = SI: SI (8.0) | | Irradiacin del Angor = NO: | | | Respuesta Vasodilatadora = POSITIVO: SI (4.0/1.0) | | | Respuesta Vasodilatadora = NEGATIVO: NO (3.0)
Evaluacin sobre los datos de prueba (95 tems): Antes de podar ---------------Tamao Errores 10 3( 3.2%) Despus de Podar --------------------------Tamao Errores Estimacin 10 3( 3.2%) (11.6%) <<
Evaluacin sobre los datos de prueba (95 tems): Antes de podar ---------------Tamao Errores 10 3( 3.2%) Despus de Podar --------------------------Tamao Errores Estimacin 10 3( 3.2%) (11.6%) <<
4.5.2.2.9. Archivo de Reglas de decisin y evaluacin de resultados del C4.5 El formato del archivo de reglas de decisin y evaluacin de los resultados es el siguiente:
1.
2.
Regla Donde:
Tamao
Error
Usada
Errores
Ventaja
Clase
Error es el estimador calculado como el complemento de la proporcin de xito asociada a cada regla
94
Magdalena Servente
Solucin Propuesta
Errores indica la cantidad de errores cometidos durante la evaluacin, y la proporcin de error calculada como dicha cantidad sobre la cantidad de veces en que se utiliz la regla.
c es la cantidad de casos que seran clasificados correctamente si dicha regla se omitiese por las reglas siguientes.
3.
Matriz de confusin para los datos de entrenamiento, con el mismo formato que la presentada en la seccin 4.5.2.2.8 para la evaluacin de los resultados del rbol de decisin.
4.
Evaluacin de los datos de prueba con el mismo formato que la evaluacin sobre los datos de entrenamiento.
5.
Matriz de confusin para los datos de prueba con el mismo formato que la matriz presentada para los datos de entrenamiento.
Opciones: Datos <cardiolo> Conjuntos de reglas evaluados sobre casos nuevos 95 casos (7 atributos) ledos de cardiolo -----------------Procesando el rbol 0 Reglas finales del rbol 0: Regla 6: Dolor de Pecho de Angor = AUSENTE -> clase NO [95.8%] Regla 1: Duracin del Angor = MENOS DE 30 MIN -> clase NO [94.6%] Regla 5: Solucin Propuesta Magdalena Servente 95
Dolor de Pecho de Angor = ATIPICO Irradiacin del Angor = NO Respuesta Vasodilatadora = NEGATIVO -> clase NO [82.0%] Regla 2: Dolor de Pecho de Angor = TIPICO Duracin del Angor = MAS DE 30 MIN -> clase SI [84.3%] Regla 3: Dolor de Pecho de Angor = ATIPICO Irradiacin del Angor = SI Duracin del Angor = MAS DE 30 MIN -> clase SI [84.1%] Regla 4: Dolor de Pecho de Angor = ATIPICO Duracin del Angor = MAS DE 30 MIN Respuesta Vasodilatadora = POSITIVO -> clase SI [70.0%] Clase por defecto: NO
Evaluacin sobre los datos de entrenamiento (95 tems): Regla ----6 1 5 2 3 4 Tamao -----1 1 3 2 3 3 Error ----4.2% 5.4% 18.0% 15.7% 15.9% 30.0% Usada ----32 32 3 16 8 4 Errores ------0 (0.0%) 1 (3.1%) 0 (0.0%) 1 (6.2%) 0 (0.0%) 1 (25.0%) << Ventaja ------0 0 0 14 4 2 (0|0) (0|0) (0|0) (15|1) (4|0) (3|1) NO NO NO SI SI SI
Evaluacin sobre los datos de prueba (95 tems): Regla ----6 1 5 2 3 4 Tamao -----1 1 3 2 3 3 Error ----4.2% 5.4% 18.0% 15.7% 15.9% 30.0% Usada ----32 32 3 16 8 4 Errores ------0 (0.0%) 1 (3.1%) 0 (0.0%) 1 (6.2%) 0 (0.0%) 1 (25.0%) << Ventaja ------0 0 0 14 4 2 (0|0) (0|0) (0|0) (15|1) (4|0) (3|1) NO NO NO SI SI SI
(a) (b) <-clasificado como ---- ---26 1 (a): clase SI 2 66 (b): clase NO
96
Magdalena Servente
Solucin Propuesta
En este captulo se presentan los resultados obtenidos. Primero, se explica la manera en que debe realizarse la interpretacin de los mismos (Seccin 5.1), se presentan los formatos de los rboles y las reglas de decisin tanto para el ID3 (Seccin 5.1.1) como para el C4.5 (Seccin 5.1.2). Luego, se describen los dominios de datos sobre los que se trabaj (Seccin 5.2), y se analizan los resultados obtenidos con el ID3 (Seccin 5.3) y con el C4.5 (Seccin 5.4). En cada caso se presenta, el rbol y las reglas de decisin obtenidos, y la evaluacin de resultados sobre el conjunto de datos de prueba. En la seccin 5.5 se comparan los resultados obtenidos con el ID3 y con el C4.5 en los distintos dominios. Y en la seccin 5.6 se realiza un anlisis general de los resultados.
Para cada dominio, se presentan dos conjuntos de resultados para cada uno de los sistemas: uno utilizando la ganancia como medida de la ganancia de informacin en cada iteracin del sistema, y otra utilizando la proporcin de ganancia con el mismo propsito. Entonces, para cada combinacin dominio - sistema medidor de ganancia, se presentan el rbol y las reglas de decisin obtenidas.
Resultados
Magdalena Servente
97
Como estimacin del xito del modelo generado se presenta una tabla o matriz obtenida de la evaluacin de los datos de prueba tanto con el rbol como con las reglas de decisin. La tabla generada, presentada en la seccin 4.5.2.1.6, cuenta con las siguientes columnas:
Correctos: cantidad de casos de los datos de prueba clasificados correctamente para cada clase
Errores: cantidad de casos de los datos de prueba clasificados errneamente para cada clase
Probabilidad: probabilidad de que un nuevo caso sea clasificado correctamente, se obtiene como:
(5.1)
Prueba 1 del atributo X: clase A (N/E) Prueba 2 del atributo X: Prueba 1 del atributo Y: Prueba 1 del atributo Z: clase A (N) Prueba 2 del atributo Z: clase B (N/E) Prueba 2 del atributo Y: clase A (N/E)
98
Magdalena Servente
Resultados
Como se explic previamente, en la seccin 4.5.2.2.8, en los rboles sin podar, N es la suma de los casos fraccionarios que llegan a cada hoja y E es la suma de los casos que pertenecen a una clase distinta de la correspondiente a la hoja, los falsos positivos. Es decir, que de los N casos cubiertos por la hoja, E casos son incorrectos. En los rboles podados, N es la cantidad de casos de entrenamiento cubiertos por la hoja, y E es la cantidad de errores predichos si una cantidad N de casos nuevos fuese clasificada por el rbol, segn la distribucin binomial. Con lo cual, puede obtenerse un rpido estimador de errores sobre datos nuevos de la siguiente manera:
E
i =1
(5.2)
N
Donde k es la cantidad de nodos, Ei es el error en la hoja i, y N es la cantidad total de casos de entrenamiento.
Para cada uno de los rboles se obtienen dos tablas de evaluacin de idntico formato: una a partir de los datos de entrenamiento y la otra a partir de los datos de prueba. Una tabla indica en cada caso:
Errores (porcentaje de error %): los errores indican la cantidad de casos clasificados errneamente; mientras que el porcentaje de error es dicha cantidad sobre la cantidad total de casos.
Estimacin: es un estimador del xito del rbol obtenido segn la ecuacin 5.1.
Adems, para cada uno de los rboles se presenta la matriz de confusin del tipo:
...
...
...
Donde se indica para cada clase, la cantidad de casos que fueron clasificados correctamente y la cantidad de casos que no fueron clasificados correctamente. Para estos ltimos se indica en particular, de qu clase fueron clasificados.
Resultados
Magdalena Servente
99
Adems, a continuacin de las reglas obtenidas, se presenta una tabla de performance de las mismas sobre los datos de prueba, con los siguientes datos, descriptos en la seccin 4.5.2.2.9:
Error: estimador del error de la regla (se obtiene restndole a 100 el estimador de xito presente en cada regla)
Error (porcentaje de error %): el error indica la cantidad de casos que fueron clasificados errneamente, y el porcentaje de error es dicha cantidad sobre la cantidad de veces en que la regla fue usada.
Ventaja: indica la performance del conjunto de reglas, si la regla en cuestin fuese omitida. Se expresa como: a(b|c), donde b es la cantidad de casos que seran clasificados errneamente, si esta regla no existiese; c es la cantidad de casos que seran clasificados correctamente por las reglas siguientes; y a=b-c es el beneficio neto de eliminar la regla.
100
Magdalena Servente
Resultados
Los datos de cada uno de los dominios se presentan en el Apndice B. En todos los casos, se dividieron los datos preclasificados en dos subconjuntos: uno de entrenamiento y uno de prueba, segn las proporciones 2:3 y 1:3, respectivamente.
5.2.1. Crditos
a) Descripcin Los ejemplos planteados en esta base de datos fueron provistos por el Gerente del Centro de Cmputos de Las Malvinas [Montalvetti, 1995] para el anlisis de solicitudes de crditos. Los campos de los ejemplos provistos son los parmetros que se tienen en cuenta al analizar un riesgo crediticio.
b) Atributos Nombre del campo Ingreso Composicin Familiar Vivienda Servicios Otros Crditos Valores Posibles ENTRE 451 Y 550, ENTRE 451 Y 550, MAS DE 551 SOLTERO, CASADO SIN HIJOS, CASADO Y UN HIJO, CASADO Y DOS HIJOS ALQUILA, PROPIA O IPVU BASICOS, BASICOS Y TIC, BASICOS TIC Y TEL UN CREDITO, DOS CREDITOS, TRES CREDITOS
Resultados
Magdalena Servente
101
5.2.2. Cardiologa
a) Descripcin Los ejemplos planteados en este caso corresponden a la patologa de Infarto Agudo de Miocardio, provistos por un cardilogo [Montalvetti, 1995]. En este caso, todos los ejemplos responden a personas de sexo masculino, entre 40 y 50 aos, fumadoras, con displidemia e hipertensin arterial presente. Pueden obtenerse dos diagnsticos de los ejemplos planteados: Si (Infarto Agudo de Miocardio) o No (no es un Infarto Agudo de Miocardio). Aunque en medicina es difcil realizar un diagnstico con una cantidad de variables reducidas, se determin que las variables planteadas en estos ejemplos alcanzan para realizar un diagnstico preliminar de gran ayuda al experto
b) Atributos Nombre del campo Dolor de Pecho de Angor Irradiacin del Angor Duracin del Angor Angor en Relacin Antigedad del Angor Respuesta Vasodilatadora Valores Posibles TIPICO, ATIPICO, AUSENTE SI, NO MENOS DE 30 MIN, MAS DE 30 MIN CON ESFUERZO, EN REPOSO RECIENTE, MAS DE 1 MES POSITIVO, NEGATIVO
c) Clases: SI, NO
5.2.3. Votaciones
a) Descripcin Estos datos fueron recolectados a partir del Almanaque Trimestral del Congreso, 2da sesin de 98 Congreso, 1984, Volumen XL: Congressional Quarterly Inc, Washington, D.C., 1985. Los datos incluyen los votos de cada congresista de la U.S. House of Representatives en 16 temas claves (CQA). Se identificaron nueve tipos diferentes de votos: votado a favor, convenio a favor, y pronunciado a favor (agrupados como a_favor), votado en contra, convenio en contra, y pronunciado en contra (agrupados
102
Magdalena Servente
Resultados
como en_contra), voto en persona, voto en persona para evitar conflictos de intereses, y abstencin de voto o no dio su voto a conocer (agrupados como desconocido). b) Atributos Nombre del campo Nios_discapacitados Participacin en el costo del proyecto del agua Adopcin de la resolucin sobre el presupuesto congelamiento de los honorarios mdicos ayuda a El Salvador grupos religiosos en las escuelas prohibicin de las pruebas anti satlites ayuda a los contras de Nicaragua misil mx inmigracin reduccin a la corporacin Synfuels presupuesto de educacin derecho a demandar de la Superfund crimen exportaciones sin impuestos acta sudafricana de administracin de exportaciones Valores Posibles A_favor, en_contra, desconocido A_favor, en_contra, desconocido A_favor, en_contra, desconocido A_favor, en_contra, desconocido A_favor, en_contra, desconocido A_favor, en_contra, desconocido A_favor, en_contra, desconocido A_favor, en_contra, desconocido A_favor, en_contra, desconocido A_favor, en_contra, desconocido A_favor, en_contra, desconocido A_favor, en_contra, desconocido A_favor, en_contra, desconocido A_favor, en_contra, desconocido A_favor, en_contra, desconocido A_favor, en_contra, desconocido
c) Clases: demcrata, republicano d) Cantidad de instancias y distribucin de las clases: Demcrata 184 83 267 republicano 116 52 168 Totales 300 135 435
Resultados
Magdalena Servente
103
b) Atributos Forma_sombrero Superficie_sombrero Color_sombrero Magulladuras Olor Tipo_membrana Espaciado_membrana Tamao_membrana Color_membrana Forma_tronco Raiz_tronco Superfice_tronco_arriba_anillo Superfice_tronco_debajo_anillo Color_tronco_arriba_anillo Color_tronco_debajo_anillo Tipo_velo Color_velo Cantidad_anillos Tipo_anillo Color_esporas Poblacion Habitat acampanada, cnica, convexa, chata, abotonada, hundida Fibrosa, ranurada, escamosa, suave marrn, piel, canela, gris, verde, rosa, violeta, rojo, blanco, amarillo Si, no Almendra, ans, creosota, pescado, hediondo, mohoso, ninguno, punzante, especioso Adherida, descendente, libre, muescada Cercano, poblado, distante Ancha, fina Negro, marron, piel, chocolate, gris, verde, naranja, rosa, violeta, rojo, blanco, amarillo Abultada, cnica bulbosa, agarrotada, copa, igual, rizomorfa, arraizada, ? Fibrosa, escamosa, sedosa, suave Fibrosa, escamosa, sedosa, suave Marron, piel, canela, gris, naranja, rosa, rojo, blanco, amarillo Marron, piel, canela, gris, naranja, rosa, rojo, blanco, amarillo Parcial, universal Marrn, naranja, blanco, amarillo Ninguno, uno, dos Tejido, evanescente, resplandeciente, grande, ninguno, pendiente, cubierto, zonal Negra, marrn, piel, chocolate, verde, naranja, violeta, blanco, amarillo abundante, agrupada, numerosa, dispersa, varios, solitaria Pastos, hojas, praderas, caminos, urbano, basura, bosques
Cantidad de Atributos desconocidos: 2480 (denotados por un "?"), todos para el primer atributo
d) Cantidad de instancias y distribucin de las clases: Ingerible 2805 1403 4208 Venenoso 2611 1305 3916 Totales 5416 2708 8124
104
Magdalena Servente
Resultados
valores continuos, ayuda a clasificar los asteroides en familias. Segn la teora de Hirayama, que examina la distribucin de los asteroides con respecto a sus elementos orbitales, en particular su movimiento principal, la inclinacin y la excentricidad, permite identificar a las familias KORONIS, EOS, THEMIS, FLORA, MARIA y PHOCAEA. Esta teora ha sido comprobada por Arnold
b) Atributos Nombre: Semieje Excentricidad Inclinacin seno_inclinacion argumento_perihelio Resonancia distancia_marte distancia_jupiter Clave Primaria Continuo Continuo Continuo Continuo Continuo Continuo Continuo Continuo
c) Clases: Las clases representan las familias de asteroides a las cuales cada asteroide puede pertenecer.
d) Cantidad de instancias y distribucin de las clases: EOS 44 22 66 FLORA 103 53 156 KORONIS 25 12 37 MARIA 13 7 20 PHOCAEA 23 11 34 THEMIS 45 22 67 Totales 253 127 380
5.2.6. Hipotiroidismo
a) Descripcin Estos datos fueron obtenidos de un estudio realizado sobre mltiples pacientes que presentaban sntomas de hipotiroidismo en el Garvan Institute.
b) Atributos Edad: Sexo: Toma tiroxina: Duda sobre tiroxina: Toma medicacin antitirodea: Enfermo:
Resultados
continuo M, F. f, v. f, v. f, v. f, v.
Magdalena Servente 105
Embarazada: Ciruga tirodea: Tratamiento I131: Es hipotiroide: Es hipertiroide: Litio: bocio: tumor: Hipopituitario: Psicolgico: Medicin TSH: TSH: Medicin T3: T3: Medicin TT4: TT4: Medicin T4U: T4U: Medicin FTI: FTI: Medicin TBG: TBG: Fuente de referencia:
f, v. f, v. f, v. f, v. f, v. f, v. f, v. f, v. f, v. f, v. f, v. continuo f, v. Continuo f, v. Continuo. f, v. Continuo. f, v. Continuo. f, v. Continuo. WEST, STMW, SVHC, SVI, SVHD, otros.
d) Cantidad de instancias y distribucin de las clases: Hipertiroide En el conjunto de entrenamiento En el conjunto de prueba Totales 0 0 0 Hipotiroide primario 64 31 95 Hipotiroide compensado 129 65 194 Hipotiroide secundario 1 1 2 Negativo 2320 1161 3481 Totales 2514 1258 3772
106
Magdalena Servente
Resultados
b) Atributos Id IR (ndice de refraccin) Na (Sodio medido como el porcentaje del peso del xido correspondiente, esto se aplica para los dems minerales) Mg (Magnesio) Al (Aluminio) Si (Silicio) K (Potasio) Ca (Calcio) Ba (Bario) Fe (Hierro) Clave Primaria continuo continuo continuo continuo continuo continuo continuo continuo continuo
d) Cantidad de instancias y distribucin de las clases: float contenedo vajilla Vidrios float para Vidrios para Vidrios construcciones construcciones para vehculos res no float 51 11 9 6 En el conjunto 47 de entrenamiento En el conjunto 23 25 6 4 3 de prueba Totales 70 76 17 13 9 lamparitas Totales
19
143
10 29
71 214
Resultados
Magdalena Servente
107
5.3.1. Crditos
5.3.1.1. ID3 utilizando la ganancia como criterio de decisin
rbol de decisin
Otros_Creditos = DOS CREDITOS Composicin_Familiar = CASADO SIN HIJOS SI Composicin_Familiar = CASADO Y DOS HIJOS Ingreso = ENTRE 451 Y 550 Vivienda = ALQUILA NO Vivienda = PROPIA 0 IPVU Servicios = BASICOS Y TIC SI Servicios = BASICOS, TIC Y TEL NO Ingreso = MAS DE 551 SI Composicin_Familiar = CASADO Y UN HIJO SI Composicin_Familiar = SOLTERO Vivienda = ALQUILA Ingreso = ENTRE 451 Y 550 SI Ingreso = MAS DE 551 NO Vivienda = PROPIA 0 IPVU SI Otros_Creditos = TRES CREDITOS NO Otros_Creditos = UN CREDITO Composicin_Familiar = CASADO SIN HIJOS SI Composicin_Familiar = CASADO Y DOS HIJOS Ingreso = ENTRE 451 Y 550 Vivienda = ALQUILA NO Vivienda = PROPIA 0 IPVU SI Ingreso = MAS DE 551 SI Composicin_Familiar = CASADO Y UN HIJO SI Composicin_Familiar = SOLTERO SI
Reglas de decisin
Regla 0 SI Otros_Creditos = DOS CREDITOS Y Composicin_Familiar = CASADO SIN HIJOS ENTONCES Otorga_Creditos = SI Regla 1 SI Otros_Creditos = DOS CREDITOS Y Composicin_Familiar = CASADO Y DOS HIJOS Y Ingreso = ENTRE 451 Y 550 Y Vivienda = ALQUILA ENTONCES Otorga_Creditos = NO Regla 2 SI Otros_Creditos = DOS CREDITOS Y Composicin_Familiar = CASADO Y DOS HIJOS Y Ingreso = ENTRE 451 Y 550 Y Vivienda = PROPIA 0 IPVU Y Servicios = BASICOS Y TIC ENTONCES Otorga_Creditos = SI 108 Magdalena Servente Resultados
Regla 3 SI Otros_Creditos = DOS CREDITOS Y Composicin_Familiar = CASADO Y DOS HIJOS Y Ingreso = ENTRE 451 Y 550 Y Vivienda = PROPIA 0 IPVU Y Servicios = BASICOS, TIC Y TEL ENTONCES Otorga_Creditos = NO Regla 4 SI Otros_Creditos = DOS CREDITOS Y Composicin_Familiar = CASADO Y DOS HIJOS Y Ingreso = MAS DE 551 ENTONCES Otorga_Creditos = SI Regla 5 SI Otros_Creditos = DOS CREDITOS Y Composicin_Familiar = CASADO Y UN HIJO ENTONCES Otorga_Creditos = SI Regla 6 SI Otros_Creditos = DOS CREDITOS Y Composicin_Familiar = SOLTERO Y Vivienda = ALQUILA Y Ingreso = ENTRE 451 Y 550 ENTONCES Otorga_Creditos = SI Regla 7 SI Otros_Creditos = DOS CREDITOS Y Composicin_Familiar = SOLTERO Y Vivienda = ALQUILA Y Ingreso = MAS DE 551 ENTONCES Otorga_Creditos = NO Regla 8 SI Otros_Creditos = DOS CREDITOS Y Composicin_Familiar = SOLTERO Y Vivienda = PROPIA 0 IPVU ENTONCES Otorga_Creditos = SI Regla 9 SI Otros_Creditos = TRES CREDITOS ENTONCES Otorga_Creditos = NO Regla 10 SI Otros_Creditos = UN CREDITO Y Composicin_Familiar = CASADO SIN HIJOS ENTONCES Otorga_Creditos = SI Regla 11 SI Otros_Creditos = UN CREDITO Y Composicin_Familiar = CASADO Y DOS HIJOS Y Ingreso = ENTRE 451 Y 550 Y Vivienda = ALQUILA ENTONCES Otorga_Creditos = NO Regla 12 SI Otros_Creditos = UN CREDITO Y Composicin_Familiar = CASADO Y DOS HIJOS Y Ingreso = ENTRE 451 Y 550 Y Vivienda = PROPIA 0 IPVU ENTONCES Otorga_Creditos = SI Regla 13 SI Otros_Creditos = UN CREDITO Y Composicin_Familiar = CASADO Y DOS HIJOS Y Ingreso = MAS DE 551 ENTONCES Otorga_Creditos = SI Regla 14 SI Otros_Creditos = UN CREDITO Y Composicin_Familiar = CASADO Y UN HIJO ENTONCES Otorga_Creditos = SI Regla 15 SI Otros_Creditos = UN CREDITO Y Composicin_Familiar = SOLTERO Resultados Magdalena Servente 109
ENTONCES Otorga_Creditos = SI
Evaluacin de los resultados Clases NO SI Totales Correctos 16 17 33 Errores 0 18 18 Probabilidad 1 0,485714 0,647058
Reglas de decisin
110
Magdalena Servente
Resultados
Regla 0 SI Otros_Creditos = DOS CREDITOS Y Composicin_Familiar = CASADO SIN HIJOS ENTONCES Otorga_Creditos = SI Regla 1 SI Otros_Creditos = DOS CREDITOS Y Composicin_Familiar = CASADO Y DOS HIJOS Y Ingreso = ENTRE 451 Y 550 Y Vivienda = ALQUILA ENTONCES Otorga_Creditos = NO Regla 2 SI Otros_Creditos = DOS CREDITOS Y Composicin_Familiar = CASADO Y DOS HIJOS Y Ingreso = ENTRE 451 Y 550 Y Vivienda = PROPIA 0 IPVU Y Servicios = BASICOS Y TIC ENTONCES Otorga_Creditos = SI Regla 3 SI Otros_Creditos = DOS CREDITOS Y Composicin_Familiar = CASADO Y DOS HIJOS Y Ingreso = ENTRE 451 Y 550 Y Vivienda = PROPIA 0 IPVU Y Servicios = BASICOS, TIC Y TEL ENTONCES Otorga_Creditos = NO Regla 4 SI Otros_Creditos = DOS CREDITOS Y Composicin_Familiar = CASADO Y DOS HIJOS Y Ingreso = MAS DE 551 ENTONCES Otorga_Creditos = SI Regla 5 SI Otros_Creditos = DOS CREDITOS Y Composicin_Familiar = CASADO Y UN HIJO ENTONCES Otorga_Creditos = SI Regla 6 SI Otros_Creditos = DOS CREDITOS Y Composicin_Familiar = SOLTERO Y Vivienda = ALQUILA Y Ingreso = ENTRE 451 Y 550 ENTONCES Otorga_Creditos = SI Regla 7 SI Otros_Creditos = DOS CREDITOS Y Composicin_Familiar = SOLTERO Y Vivienda = ALQUILA Y Ingreso = MAS DE 551 ENTONCES Otorga_Creditos = NO Regla 8 SI Otros_Creditos = DOS CREDITOS Y Composicin_Familiar = SOLTERO Y Vivienda = PROPIA 0 IPVU ENTONCES Otorga_Creditos = SI Regla 9 SI Otros_Creditos = TRES CREDITOS ENTONCES Otorga_Creditos = NO Regla 10 SI Otros_Creditos = UN CREDITO Y Composicin_Familiar = CASADO SIN HIJOS ENTONCES Otorga_Creditos = SI Regla 11 SI Otros_Creditos = UN CREDITO Y Composicin_Familiar = CASADO Y DOS HIJOS Y Ingreso = ENTRE 451 Y 550 Y Vivienda = ALQUILA ENTONCES Otorga_Creditos = NO Regla 12 SI Otros_Creditos = UN CREDITO Resultados Magdalena Servente 111
Y Composicin_Familiar = CASADO Y DOS HIJOS Y Ingreso = ENTRE 451 Y 550 Y Vivienda = PROPIA 0 IPVU ENTONCES Otorga_Creditos = SI Regla 13 SI Otros_Creditos = UN CREDITO Y Composicin_Familiar = CASADO Y DOS HIJOS Y Ingreso = MAS DE 551 ENTONCES Otorga_Creditos = SI Regla 14 SI Otros_Creditos = UN CREDITO Y Composicin_Familiar = CASADO Y UN HIJO ENTONCES Otorga_Creditos = SI Regla 15 SI Otros_Creditos = UN CREDITO Y Composicin_Familiar = SOLTERO ENTONCES Otorga_Creditos = SI
Evaluacin de los resultados Clases NO SI Totales Correctos 16 17 33 Errores 0 18 18 Probabilidad 1 0,485714 0,647058
5.3.1.3. Conclusiones
En este caso, tanto el rbol como las reglas obtenidas mediante el ID3 son idnticos para la ganancia y para la proporcin de ganancia. Si analizamos la tabla de evaluacin de los resultados, vemos que el clasificador3 obtenido es excelente para clasificar la clase NO, pero slo es exitoso en un 50% de los casos de la clase SI. Es decir, que un nuevo caso de clase NO tiene una probabilidad de 1 de ser clasificado correctamente. Mientras que un nuevo caso de clase SI, tiene solamente una probabilidad del 0,49 de ser clasificado como SI.
Creemos que este fenmeno puede deberse a una mala eleccin de los datos de entrenamiento y prueba. Un clasificador exitoso sobre los datos de entrenamiento, ser exitoso sobre los dems conjuntos de datos en la medida en que los datos de entrenamiento sean representativos de los otros conjuntos. Supongamos que tenemos para un dominio hipottico, los siguientes datos de entrenamiento:
Atributo A 1 1
Atributo B 5 90
Clase NO NO
En el caso del ID3, por clasificador nos referiremos tanto al rbol como a las reglas obtenidas, ya es indistinto utilizar uno u otro
112
Magdalena Servente
Resultados
90
SI
1.
2.
Si aplicamos el clasificador a la siguiente tupla de prueba: {2,3,NO}, el resultado ser errneo. Si todos los casos de prueba de clase NO tuviesen valores distintos de 1 para el atributo A, entonces la performance de los modelos obtenidos sobre estos datos de prueba sera poco alentadora. El conjunto de entrenamiento en ese caso no sera representativo de los conjuntos en el cual se aplic el clasificador. Entonces, podemos conjeturar que la performance de los clasificadores generados por el ID3 para el dominio Crditos, puede deberse a que los datos de entrenamiento no eran representativos de los datos de prueba. Podemos extrapolar, este problema de representatividad de los datos de aprendizaje a los humanos: no podemos ensearle a un nio el concepto de pjaro mostrndole slo distintas clases de pinginos, ya que cuando vea cualquier otro pjaro como una golondrina, un gorrin o una paloma, pensar que no son pjaros; para l los pjaros no vuelan, son gordos, grandes y caminan por el hielo.
5.3.2. Cardiologa
5.3.2.1. ID3 utilizando la ganancia como criterio de decisin
rbol de decisin
DURACION_DEL_ANGOR = MAS DE 30 MIN DOLOR_DE_PECHO_DE_ANGOR = ATIPICO IRRADIACION_DEL_ANGOR = NO RESPUESTA_VASODILATADORA = NEGATIVO NO RESPUESTA_VASODILATADORA = POSITIVO SI IRRADIACION_DEL_ANGOR = SI SI DOLOR_DE_PECHO_DE_ANGOR = AUSENTE NO DOLOR_DE_PECHO_DE_ANGOR = TIPICO ANGOR_EN_RELACION = CON ESFUERZO RESPUESTA_VASODILATADORA = NEGATIVO SI RESPUESTA_VASODILATADORA = POSITIVO IRRADIACION_DEL_ANGOR = NO NO IRRADIACION_DEL_ANGOR = SI SI ANGOR_EN_RELACION = EN REPOSO SI DURACION_DEL_ANGOR = MENOS DE 30 MIN DOLOR_DE_PECHO_DE_ANGOR = ATIPICO Resultados Magdalena Servente 113
NO DOLOR_DE_PECHO_DE_ANGOR = AUSENTE NO DOLOR_DE_PECHO_DE_ANGOR = TIPICO IRRADIACION_DEL_ANGOR = NO ANTIGEDAD_DEL_ANGOR = MAS DE 1 MES NO ANTIGEDAD_DEL_ANGOR = RECIENTE ANGOR_EN_RELACION = CON ESFUERZO SI ANGOR_EN_RELACION = EN REPOSO NO IRRADIACION_DEL_ANGOR = SI NO
Reglas de decisin
Regla 0 SI DURACION_DEL_ANGOR = MAS DE 30 MIN Y DOLOR_DE_PECHO_DE_ANGOR = ATIPICO Y IRRADIACION_DEL_ANGOR = NO Y RESPUESTA_VASODILATADORA = NEGATIVO ENTONCES DIAGNOSTICO = NO
Regla 1 SI DURACION_DEL_ANGOR = MAS DE 30 MIN Y DOLOR_DE_PECHO_DE_ANGOR = ATIPICO Y IRRADIACION_DEL_ANGOR = NO Y RESPUESTA_VASODILATADORA = POSITIVO ENTONCES DIAGNOSTICO = SI Regla 2 SI DURACION_DEL_ANGOR = MAS DE 30 MIN Y DOLOR_DE_PECHO_DE_ANGOR = ATIPICO Y IRRADIACION_DEL_ANGOR = SI ENTONCES DIAGNOSTICO = SI Regla 3 SI DURACION_DEL_ANGOR = MAS DE 30 MIN Y DOLOR_DE_PECHO_DE_ANGOR = AUSENTE ENTONCES DIAGNOSTICO = NO Regla 4 SI DURACION_DEL_ANGOR = MAS DE 30 MIN Y DOLOR_DE_PECHO_DE_ANGOR = TIPICO Y ANGOR_EN_RELACION = CON ESFUERZO Y RESPUESTA_VASODILATADORA = NEGATIVO ENTONCES DIAGNOSTICO = SI Regla 5 SI DURACION_DEL_ANGOR = MAS DE 30 MIN Y DOLOR_DE_PECHO_DE_ANGOR = TIPICO Y ANGOR_EN_RELACION = CON ESFUERZO Y RESPUESTA_VASODILATADORA = POSITIVO Y IRRADIACION_DEL_ANGOR = NO ENTONCES DIAGNOSTICO = NO Regla 6 SI DURACION_DEL_ANGOR = MAS DE 30 MIN Y DOLOR_DE_PECHO_DE_ANGOR = TIPICO Y ANGOR_EN_RELACION = CON ESFUERZO Y RESPUESTA_VASODILATADORA = POSITIVO Y IRRADIACION_DEL_ANGOR = SI ENTONCES DIAGNOSTICO = SI Regla 7 SI DURACION_DEL_ANGOR = MAS DE 30 MIN Y DOLOR_DE_PECHO_DE_ANGOR = TIPICO Y ANGOR_EN_RELACION = EN REPOSO ENTONCES DIAGNOSTICO = SI
114
Magdalena Servente
Resultados
Regla 8 SI DURACION_DEL_ANGOR = MENOS DE 30 MIN Y DOLOR_DE_PECHO_DE_ANGOR = ATIPICO ENTONCES DIAGNOSTICO = NO Regla 9 SI DURACION_DEL_ANGOR = MENOS DE 30 MIN Y DOLOR_DE_PECHO_DE_ANGOR = AUSENTE ENTONCES DIAGNOSTICO = NO Regla 10 SI DURACION_DEL_ANGOR = MENOS DE 30 MIN Y DOLOR_DE_PECHO_DE_ANGOR = TIPICO Y IRRADIACION_DEL_ANGOR = NO Y ANTIGEDAD_DEL_ANGOR = MAS DE 1 MES ENTONCES DIAGNOSTICO = NO Regla 11 SI DURACION_DEL_ANGOR = MENOS DE 30 MIN Y DOLOR_DE_PECHO_DE_ANGOR = TIPICO Y IRRADIACION_DEL_ANGOR = NO Y ANTIGEDAD_DEL_ANGOR = RECIENTE Y ANGOR_EN_RELACION = CON ESFUERZO ENTONCES DIAGNOSTICO = SI Regla 12 SI DURACION_DEL_ANGOR = MENOS DE 30 MIN Y DOLOR_DE_PECHO_DE_ANGOR = TIPICO Y IRRADIACION_DEL_ANGOR = NO Y ANTIGEDAD_DEL_ANGOR = RECIENTE Y ANGOR_EN_RELACION = EN REPOSO ENTONCES DIAGNOSTICO = NO Regla 13 SI DURACION_DEL_ANGOR = MENOS DE 30 MIN Y DOLOR_DE_PECHO_DE_ANGOR = TIPICO Y IRRADIACION_DEL_ANGOR = SI ENTONCES DIAGNOSTICO = NO
Evaluacin de los resultados Clases NO SI Totales Correctos 20 9 29 Errores 2 0 2 Probabilidad 0,909090 1 0,935483
RESPUESTA_VASODILATADORA = POSITIVO IRRADIACION_DEL_ANGOR = NO NO IRRADIACION_DEL_ANGOR = SI SI ANGOR_EN_RELACION = EN REPOSO SI DURACION_DEL_ANGOR = MENOS DE 30 MIN DOLOR_DE_PECHO_DE_ANGOR = ATIPICO NO DOLOR_DE_PECHO_DE_ANGOR = AUSENTE NO DOLOR_DE_PECHO_DE_ANGOR = TIPICO IRRADIACION_DEL_ANGOR = NO ANTIGEDAD_DEL_ANGOR = MAS DE 1 MES NO ANTIGEDAD_DEL_ANGOR = RECIENTE ANGOR_EN_RELACION = CON ESFUERZO SI ANGOR_EN_RELACION = EN REPOSO NO IRRADIACION_DEL_ANGOR = SI NO
Reglas de decisin
Regla 0 SI DURACION_DEL_ANGOR = MAS DE 30 MIN Y DOLOR_DE_PECHO_DE_ANGOR = ATIPICO Y IRRADIACION_DEL_ANGOR = NO Y RESPUESTA_VASODILATADORA = NEGATIVO ENTONCES DIAGNOSTICO = NO Regla 1 SI DURACION_DEL_ANGOR = MAS DE 30 MIN Y DOLOR_DE_PECHO_DE_ANGOR = ATIPICO Y IRRADIACION_DEL_ANGOR = NO Y RESPUESTA_VASODILATADORA = POSITIVO ENTONCES DIAGNOSTICO = SI Regla 2 SI DURACION_DEL_ANGOR = MAS DE 30 MIN Y DOLOR_DE_PECHO_DE_ANGOR = ATIPICO Y IRRADIACION_DEL_ANGOR = SI ENTONCES DIAGNOSTICO = SI Regla 3 SI DURACION_DEL_ANGOR = MAS DE 30 MIN Y DOLOR_DE_PECHO_DE_ANGOR = AUSENTE ENTONCES DIAGNOSTICO = NO Regla 4 SI DURACION_DEL_ANGOR = MAS DE 30 MIN Y DOLOR_DE_PECHO_DE_ANGOR = TIPICO Y ANGOR_EN_RELACION = CON ESFUERZO Y RESPUESTA_VASODILATADORA = NEGATIVO ENTONCES DIAGNOSTICO = SI Regla 5 SI DURACION_DEL_ANGOR = MAS DE 30 MIN Y DOLOR_DE_PECHO_DE_ANGOR = TIPICO Y ANGOR_EN_RELACION = CON ESFUERZO Y RESPUESTA_VASODILATADORA = POSITIVO Y IRRADIACION_DEL_ANGOR = NO ENTONCES DIAGNOSTICO = NO Regla 6 SI DURACION_DEL_ANGOR = MAS DE 30 MIN Y DOLOR_DE_PECHO_DE_ANGOR = TIPICO Y ANGOR_EN_RELACION = CON ESFUERZO Y RESPUESTA_VASODILATADORA = POSITIVO Y IRRADIACION_DEL_ANGOR = SI 116 Magdalena Servente Resultados
ENTONCES DIAGNOSTICO =
SI
Regla 7 SI DURACION_DEL_ANGOR = MAS DE 30 MIN Y DOLOR_DE_PECHO_DE_ANGOR = TIPICO Y ANGOR_EN_RELACION = EN REPOSO ENTONCES DIAGNOSTICO = SI Regla 8 SI DURACION_DEL_ANGOR = MENOS DE 30 MIN Y DOLOR_DE_PECHO_DE_ANGOR = ATIPICO ENTONCES DIAGNOSTICO = NO Regla 9 SI DURACION_DEL_ANGOR = MENOS DE 30 MIN Y DOLOR_DE_PECHO_DE_ANGOR = AUSENTE ENTONCES DIAGNOSTICO = NO Regla 10 SI DURACION_DEL_ANGOR = MENOS DE 30 MIN Y DOLOR_DE_PECHO_DE_ANGOR = TIPICO Y IRRADIACION_DEL_ANGOR = NO Y ANTIGEDAD_DEL_ANGOR = MAS DE 1 MES ENTONCES DIAGNOSTICO = NO Regla 11 SI DURACION_DEL_ANGOR = MENOS DE 30 MIN Y DOLOR_DE_PECHO_DE_ANGOR = TIPICO Y IRRADIACION_DEL_ANGOR = NO Y ANTIGEDAD_DEL_ANGOR = RECIENTE Y ANGOR_EN_RELACION = CON ESFUERZO ENTONCES DIAGNOSTICO = SI Regla 12 SI DURACION_DEL_ANGOR = MENOS DE 30 MIN Y DOLOR_DE_PECHO_DE_ANGOR = TIPICO Y IRRADIACION_DEL_ANGOR = NO Y ANTIGEDAD_DEL_ANGOR = RECIENTE Y ANGOR_EN_RELACION = EN REPOSO ENTONCES DIAGNOSTICO = NO Regla 13 SI DURACION_DEL_ANGOR = MENOS DE 30 MIN Y DOLOR_DE_PECHO_DE_ANGOR = TIPICO Y IRRADIACION_DEL_ANGOR = SI ENTONCES DIAGNOSTICO = NO
Evaluacin de los resultados Clases NO SI Totales Correctos 20 9 29 Errores 2 0 2 Probabilidad 0,909090 1 0,935483
5.3.2.3. Conclusiones
Al igual que en el caso anterior, vemos que tanto el rbol como las reglas de decisin obtenidas son iguales para el criterio de ganancia como para el de proporcin de ganancia. En este caso, no obstante, la performance del clasificador es notablemente mejor que en el caso anterior. El modelo generado tiene un 93% de probabilidad de clasificar correctamente un caso negativo, y un 100% de clasificar correctamente uno positivo.
Resultados
Magdalena Servente
117
Cabe destacar que la cantidad de casos de entrenamiento es menor a la del caso anterior y no obstante la cantidad de reglas obtenidas es 13, contra 15 obtenidas en el caso anterior. Entonces, podramos concluir, grosso modo, que la cantidad de datos de entrada no es proporcional al tamao del rbol ni la cantidad de reglas obtenidas.
5.3.3. Votaciones
5.3.4.1. ID3 utilizando la ganancia como criterio de decisin
rbol de decisin
Cong_honorarios_medicos = a_favor Reduccion_corp_Synfuels = a_favor Export_sin_impuestos = a_favor democrata Export_sin_impuestos = desconocido republicano Export_sin_impuestos = en_contra Presupuesto_de_educacion = a_favor Der_demanda_Superfund = a_favor Particip_proy_agua = a_favor republicano Particip_proy_agua = en_contra Acta_sudaf_admin_export = a_favor republicano Acta_sudaf_admin_export = desconocido republicano Acta_sudaf_admin_export = en_contra Nios discapacitados = a_favor republicano Nios discapacitados = en_contra democrata Der_demanda_Superfund = en_contra democrata Presupuesto_de_educacion = desconocido democrata Presupuesto_de_educacion = en_contra Acta_sudaf_admin_export = a_favor Adop_resolucion_presup = a_favor republicano Adop_resolucion_presup = en_contra Ayuda_a_El_Salvador = a_favor republicano Ayuda_a_El_Salvador = en_contra democrata Acta_sudaf_admin_export = desconocido democrata Acta_sudaf_admin_export = en_contra democrata Reduccion_corp_Synfuels = desconocido republicano Reduccion_corp_Synfuels = en_contra Export_sin_impuestos = a_favor Inmigracion = a_favor republicano Inmigracion = en_contra Acta_sudaf_admin_export = a_favor democrata Acta_sudaf_admin_export = desconocido Particip_proy_agua = a_favor republicano Particip_proy_agua = en_contra democrata Acta_sudaf_admin_export = en_contra republicano Export_sin_impuestos = desconocido republicano Export_sin_impuestos = en_contra 118 Magdalena Servente Resultados
Adop_resolucion_presup = a_favor Acta_sudaf_admin_export = a_favor republicano Acta_sudaf_admin_export = desconocido Nios discapacitados = a_favor republicano Nios discapacitados = en_contra democrata Adop_resolucion_presup = en_contra republicano Cong_honorarios_medicos = desconocido Misil_mx = a_favor Prohib_pruebas_anti_satel = a_favor democrata Prohib_pruebas_anti_satel = desconocido democrata Prohib_pruebas_anti_satel = en_contra republicano Misil_mx = desconocido republicano Misil_mx = en_contra democrata Cong_honorarios_medicos = en_contra Presupuesto_de_educacion = a_favor democrata Presupuesto_de_educacion = desconocido Adop_resolucion_presup = a_favor democrata Adop_resolucion_presup = en_contra republicano Presupuesto_de_educacion = en_contra democrata
Reglas de decisin
Regla 0 SI Cong_honorarios_medicos = a_favor Y Reduccion_corp_Synfuels = a_favor Y Export_sin_impuestos = a_favor ENTONCES Clase = democrata Regla 1 SI Cong_honorarios_medicos = a_favor Y Reduccion_corp_Synfuels = a_favor Y Export_sin_impuestos = desconocido ENTONCES Clase = republicano Regla 2 SI Cong_honorarios_medicos = a_favor Y Reduccion_corp_Synfuels = a_favor Y Export_sin_impuestos = en_contra Y Presupuesto_de_educacion = a_favor Y Der_demanda_Superfund = a_favor Y Particip_proy_agua = a_favor ENTONCES Clase = republicano Regla 3 SI Cong_honorarios_medicos = a_favor Y Reduccion_corp_Synfuels = a_favor Y Export_sin_impuestos = en_contra Y Presupuesto_de_educacion = a_favor Y Der_demanda_Superfund = a_favor Y Particip_proy_agua = en_contra Y Acta_sudaf_admin_export = a_favor ENTONCES Clase = republicano Regla 4 SI Cong_honorarios_medicos = a_favor Y Reduccion_corp_Synfuels = a_favor Y Export_sin_impuestos = en_contra Y Presupuesto_de_educacion = a_favor Y Der_demanda_Superfund = a_favor Resultados Magdalena Servente 119
Y Particip_proy_agua = en_contra Y Acta_sudaf_admin_export = desconocido ENTONCES Clase = republicano Regla 5 SI Cong_honorarios_medicos = a_favor Y Reduccion_corp_Synfuels = a_favor Y Export_sin_impuestos = en_contra Y Presupuesto_de_educacion = a_favor Y Der_demanda_Superfund = a_favor Y Particip_proy_agua = en_contra Y Acta_sudaf_admin_export = en_contra Y Nios discapacitados = a_favor ENTONCES Clase = republicano Regla 6 SI Cong_honorarios_medicos = a_favor Y Reduccion_corp_Synfuels = a_favor Y Export_sin_impuestos = en_contra Y Presupuesto_de_educacion = a_favor Y Der_demanda_Superfund = a_favor Y Particip_proy_agua = en_contra Y Acta_sudaf_admin_export = en_contra Y Nios discapacitados = en_contra ENTONCES Clase = democrata Regla 7 SI Cong_honorarios_medicos = a_favor Y Reduccion_corp_Synfuels = a_favor Y Export_sin_impuestos = en_contra Y Presupuesto_de_educacion = a_favor Y Der_demanda_Superfund = en_contra ENTONCES Clase = democrata Regla 8 SI Cong_honorarios_medicos = a_favor Y Reduccion_corp_Synfuels = a_favor Y Export_sin_impuestos = en_contra Y Presupuesto_de_educacion = desconocido ENTONCES Clase = democrata Regla 9 SI Cong_honorarios_medicos = a_favor Y Reduccion_corp_Synfuels = a_favor Y Export_sin_impuestos = en_contra Y Presupuesto_de_educacion = en_contra Y Acta_sudaf_admin_export = a_favor Y Adop_resolucion_presup = a_favor ENTONCES Clase = republicano Regla 10 SI Cong_honorarios_medicos = a_favor Y Reduccion_corp_Synfuels = a_favor Y Export_sin_impuestos = en_contra Y Presupuesto_de_educacion = en_contra Y Acta_sudaf_admin_export = a_favor Y Adop_resolucion_presup = en_contra Y Ayuda_a_El_Salvador = a_favor ENTONCES Clase = republicano Regla 11 SI Cong_honorarios_medicos = a_favor Y Reduccion_corp_Synfuels = a_favor Y Export_sin_impuestos = en_contra Y Presupuesto_de_educacion = en_contra Y Acta_sudaf_admin_export = a_favor Y Adop_resolucion_presup = en_contra Y Ayuda_a_El_Salvador = en_contra ENTONCES Clase = democrata Regla 12 SI Cong_honorarios_medicos = a_favor Y Reduccion_corp_Synfuels = a_favor Y Export_sin_impuestos = en_contra Y Presupuesto_de_educacion = en_contra Y Acta_sudaf_admin_export = desconocido ENTONCES Clase = democrata 120 Magdalena Servente Resultados
Regla 13 SI Cong_honorarios_medicos = a_favor Y Reduccion_corp_Synfuels = a_favor Y Export_sin_impuestos = en_contra Y Presupuesto_de_educacion = en_contra Y Acta_sudaf_admin_export = en_contra ENTONCES Clase = democrata Regla 14 SI Cong_honorarios_medicos = a_favor Y Reduccion_corp_Synfuels = desconocido ENTONCES Clase = republicano Regla 15 SI Cong_honorarios_medicos = a_favor Y Reduccion_corp_Synfuels = en_contra Y Export_sin_impuestos = a_favor Y Inmigracion = a_favor ENTONCES Clase = republicano Regla 16 SI Cong_honorarios_medicos = a_favor Y Reduccion_corp_Synfuels = en_contra Y Export_sin_impuestos = a_favor Y Inmigracion = en_contra Y Acta_sudaf_admin_export = a_favor ENTONCES Clase = democrata Regla 17 SI Cong_honorarios_medicos = a_favor Y Reduccion_corp_Synfuels = en_contra Y Export_sin_impuestos = a_favor Y Inmigracion = en_contra Y Acta_sudaf_admin_export = desconocido Y Particip_proy_agua = a_favor ENTONCES Clase = republicano Regla 18 SI Cong_honorarios_medicos = a_favor Y Reduccion_corp_Synfuels = en_contra Y Export_sin_impuestos = a_favor Y Inmigracion = en_contra Y Acta_sudaf_admin_export = desconocido Y Particip_proy_agua = en_contra ENTONCES Clase = democrata Regla 19 SI Cong_honorarios_medicos = a_favor Y Reduccion_corp_Synfuels = en_contra Y Export_sin_impuestos = a_favor Y Inmigracion = en_contra Y Acta_sudaf_admin_export = en_contra ENTONCES Clase = republicano Regla 20 SI Cong_honorarios_medicos = a_favor Y Reduccion_corp_Synfuels = en_contra Y Export_sin_impuestos = desconocido ENTONCES Clase = republicano Regla 21 SI Cong_honorarios_medicos = a_favor Y Reduccion_corp_Synfuels = en_contra Y Export_sin_impuestos = en_contra Y Adop_resolucion_presup = a_favor Y Acta_sudaf_admin_export = a_favor ENTONCES Clase = republicano Regla 22 SI Cong_honorarios_medicos = a_favor Y Reduccion_corp_Synfuels = en_contra Y Export_sin_impuestos = en_contra Y Adop_resolucion_presup = a_favor Y Acta_sudaf_admin_export = desconocido Y Nios discapacitados = a_favor ENTONCES Clase = republicano Resultados Magdalena Servente 121
Regla 23 SI Cong_honorarios_medicos = a_favor Y Reduccion_corp_Synfuels = en_contra Y Export_sin_impuestos = en_contra Y Adop_resolucion_presup = a_favor Y Acta_sudaf_admin_export = desconocido Y Nios discapacitados = en_contra ENTONCES Clase = democrata Regla 24 SI Cong_honorarios_medicos = a_favor Y Reduccion_corp_Synfuels = en_contra Y Export_sin_impuestos = en_contra Y Adop_resolucion_presup = en_contra ENTONCES Clase = republicano Regla 25 SI Cong_honorarios_medicos = desconocido Y Misil_mx = a_favor Y Prohib_pruebas_anti_satel = a_favor ENTONCES Clase = democrata Regla 26 SI Cong_honorarios_medicos = desconocido Y Misil_mx = a_favor Y Prohib_pruebas_anti_satel = desconocido ENTONCES Clase = democrata Regla 27 SI Cong_honorarios_medicos = desconocido Y Misil_mx = a_favor Y Prohib_pruebas_anti_satel = en_contra ENTONCES Clase = republicano Regla 28 SI Cong_honorarios_medicos = desconocido Y Misil_mx = desconocido ENTONCES Clase = republicano
Regla 29 SI Cong_honorarios_medicos = desconocido Y Misil_mx = en_contra ENTONCES Clase = democrata Regla 30 SI Cong_honorarios_medicos = en_contra Y Presupuesto_de_educacion = a_favor ENTONCES Clase = democrata Regla 31 SI Cong_honorarios_medicos = en_contra Y Presupuesto_de_educacion = desconocido Y Adop_resolucion_presup = a_favor ENTONCES Clase = democrata Regla 32 SI Cong_honorarios_medicos = en_contra Y Presupuesto_de_educacion = desconocido Y Adop_resolucion_presup = en_contra ENTONCES Clase = republicano Regla 33 SI Cong_honorarios_medicos = en_contra Y Presupuesto_de_educacion = en_contra ENTONCES Clase = democrata
Correctos
Errores
Probabilidad
Resultados
Magdalena Servente
2 5 7
republicano Nios discapacitados = en_contra democrata Adop_resolucion_presup = en_contra republicano Cong_honorarios_medicos = desconocido Misil_mx = a_favor Prohib_pruebas_anti_satel = a_favor democrata Prohib_pruebas_anti_satel = desconocido democrata Prohib_pruebas_anti_satel = en_contra republicano Misil_mx = desconocido republicano Misil_mx = en_contra democrata Cong_honorarios_medicos = en_contra Adop_resolucion_presup = a_favor democrata Adop_resolucion_presup = desconocido democrata Adop_resolucion_presup = en_contra Presupuesto_de_educacion = a_favor democrata Presupuesto_de_educacion = desconocido republicano Presupuesto_de_educacion = en_contra democrata
Reglas de decisin
Regla 0 SI Cong_honorarios_medicos = a_favor Y Reduccion_corp_Synfuels = a_favor Y Export_sin_impuestos = a_favor ENTONCES Clase = democrata Regla 1 SI Cong_honorarios_medicos = a_favor Y Reduccion_corp_Synfuels = a_favor Y Export_sin_impuestos = desconocido ENTONCES Clase = republicano Regla 2 SI Cong_honorarios_medicos = a_favor Y Reduccion_corp_Synfuels = a_favor Y Export_sin_impuestos = en_contra Y Presupuesto_de_educacion = a_favor Y Der_demanda_Superfund = a_favor Y Particip_proy_agua = a_favor ENTONCES Clase = republicano Regla 3 SI Cong_honorarios_medicos = a_favor Y Reduccion_corp_Synfuels = a_favor Y Export_sin_impuestos = en_contra Y Presupuesto_de_educacion = a_favor Y Der_demanda_Superfund = a_favor Y Particip_proy_agua = en_contra Y Acta_sudaf_admin_export = a_favor ENTONCES Clase = republicano Regla 4 SI Cong_honorarios_medicos = a_favor Y Reduccion_corp_Synfuels = a_favor Y Export_sin_impuestos = en_contra Y Presupuesto_de_educacion = a_favor Y Der_demanda_Superfund = a_favor Y Particip_proy_agua = en_contra Y Acta_sudaf_admin_export = desconocido ENTONCES Clase = republicano 124 Magdalena Servente Resultados
Regla 5 SI Cong_honorarios_medicos = a_favor Y Reduccion_corp_Synfuels = a_favor Y Export_sin_impuestos = en_contra Y Presupuesto_de_educacion = a_favor Y Der_demanda_Superfund = a_favor Y Particip_proy_agua = en_contra Y Acta_sudaf_admin_export = en_contra Y Nios discapacitados = a_favor ENTONCES Clase = republicano Regla 6 SI Cong_honorarios_medicos = a_favor Y Reduccion_corp_Synfuels = a_favor Y Export_sin_impuestos = en_contra Y Presupuesto_de_educacion = a_favor Y Der_demanda_Superfund = a_favor Y Particip_proy_agua = en_contra Y Acta_sudaf_admin_export = en_contra Y Nios discapacitados = en_contra ENTONCES Clase = democrata Regla 7 SI Cong_honorarios_medicos = a_favor Y Reduccion_corp_Synfuels = a_favor Y Export_sin_impuestos = en_contra Y Presupuesto_de_educacion = a_favor Y Der_demanda_Superfund = en_contra ENTONCES Clase = democrata Regla 8 SI Cong_honorarios_medicos = a_favor Y Reduccion_corp_Synfuels = a_favor Y Export_sin_impuestos = en_contra Y Presupuesto_de_educacion = desconocido ENTONCES Clase = democrata Regla 9 SI Cong_honorarios_medicos = a_favor Y Reduccion_corp_Synfuels = a_favor Y Export_sin_impuestos = en_contra Y Presupuesto_de_educacion = en_contra Y Acta_sudaf_admin_export = a_favor Y Adop_resolucion_presup = a_favor ENTONCES Clase = republicano Regla 10 SI Cong_honorarios_medicos = a_favor Y Reduccion_corp_Synfuels = a_favor Y Export_sin_impuestos = en_contra Y Presupuesto_de_educacion = en_contra Y Acta_sudaf_admin_export = a_favor Y Adop_resolucion_presup = en_contra Y Ayuda_a_El_Salvador = a_favor ENTONCES Clase = republicano Regla 11 SI Cong_honorarios_medicos = a_favor Y Reduccion_corp_Synfuels = a_favor Y Export_sin_impuestos = en_contra Y Presupuesto_de_educacion = en_contra Y Acta_sudaf_admin_export = a_favor Y Adop_resolucion_presup = en_contra Y Ayuda_a_El_Salvador = en_contra ENTONCES Clase = democrata Regla 12 SI Cong_honorarios_medicos = a_favor Y Reduccion_corp_Synfuels = a_favor Y Export_sin_impuestos = en_contra Y Presupuesto_de_educacion = en_contra Y Acta_sudaf_admin_export = desconocido ENTONCES Clase = democrata Regla 13 Resultados Magdalena Servente 125
SI Cong_honorarios_medicos = a_favor Y Reduccion_corp_Synfuels = a_favor Y Export_sin_impuestos = en_contra Y Presupuesto_de_educacion = en_contra Y Acta_sudaf_admin_export = en_contra ENTONCES Clase = democrata Regla 14 SI Cong_honorarios_medicos = a_favor Y Reduccion_corp_Synfuels = desconocido ENTONCES Clase = republicano Regla 15 SI Cong_honorarios_medicos = a_favor Y Reduccion_corp_Synfuels = en_contra Y Export_sin_impuestos = a_favor Y Inmigracion = a_favor ENTONCES Clase = republicano Regla 16 SI Cong_honorarios_medicos = a_favor Y Reduccion_corp_Synfuels = en_contra Y Export_sin_impuestos = a_favor Y Inmigracion = en_contra Y Acta_sudaf_admin_export = a_favor ENTONCES Clase = democrata Regla 17 SI Cong_honorarios_medicos = a_favor Y Reduccion_corp_Synfuels = en_contra Y Export_sin_impuestos = a_favor Y Inmigracion = en_contra Y Acta_sudaf_admin_export = desconocido Y Particip_proy_agua = a_favor ENTONCES Clase = republicano Regla 18 SI Cong_honorarios_medicos = a_favor Y Reduccion_corp_Synfuels = en_contra Y Export_sin_impuestos = a_favor Y Inmigracion = en_contra Y Acta_sudaf_admin_export = desconocido Y Particip_proy_agua = en_contra ENTONCES Clase = democrata Regla 19 SI Cong_honorarios_medicos = a_favor Y Reduccion_corp_Synfuels = en_contra Y Export_sin_impuestos = a_favor Y Inmigracion = en_contra Y Acta_sudaf_admin_export = en_contra ENTONCES Clase = republicano Regla 20 SI Cong_honorarios_medicos = a_favor Y Reduccion_corp_Synfuels = en_contra Y Export_sin_impuestos = desconocido ENTONCES Clase = republicano Regla 21 SI Cong_honorarios_medicos = a_favor Y Reduccion_corp_Synfuels = en_contra Y Export_sin_impuestos = en_contra Y Adop_resolucion_presup = a_favor Y Acta_sudaf_admin_export = a_favor ENTONCES Clase = republicano Regla 22 SI Cong_honorarios_medicos = a_favor Y Reduccion_corp_Synfuels = en_contra Y Export_sin_impuestos = en_contra Y Adop_resolucion_presup = a_favor Y Acta_sudaf_admin_export = desconocido Y Nios discapacitados = a_favor ENTONCES Clase = republicano
126
Magdalena Servente
Resultados
Regla 23 SI Cong_honorarios_medicos = a_favor Y Reduccion_corp_Synfuels = en_contra Y Export_sin_impuestos = en_contra Y Adop_resolucion_presup = a_favor Y Acta_sudaf_admin_export = desconocido Y Nios discapacitados = en_contra ENTONCES Clase = democrata Regla 24 SI Cong_honorarios_medicos = a_favor Y Reduccion_corp_Synfuels = en_contra Y Export_sin_impuestos = en_contra Y Adop_resolucion_presup = en_contra ENTONCES Clase = republicano Regla 25 SI Cong_honorarios_medicos = desconocido Y Misil_mx = a_favor Y Prohib_pruebas_anti_satel = a_favor ENTONCES Clase = democrata Regla 26 SI Cong_honorarios_medicos = desconocido Y Misil_mx = a_favor Y Prohib_pruebas_anti_satel = desconocido ENTONCES Clase = democrata Regla 27 SI Cong_honorarios_medicos = desconocido Y Misil_mx = a_favor Y Prohib_pruebas_anti_satel = en_contra ENTONCES Clase = republicano Regla 28 SI Cong_honorarios_medicos = desconocido Y Misil_mx = desconocido ENTONCES Clase = republicano Regla 29 SI Cong_honorarios_medicos = desconocido Y Misil_mx = en_contra ENTONCES Clase = democrata Regla 30 SI Cong_honorarios_medicos = en_contra Y Adop_resolucion_presup = a_favor ENTONCES Clase = democrata Regla 31 SI Cong_honorarios_medicos = en_contra Y Adop_resolucion_presup = desconocido ENTONCES Clase = democrata Regla 32 SI Cong_honorarios_medicos = en_contra Y Adop_resolucion_presup = en_contra Y Presupuesto_de_educacion = a_favor ENTONCES Clase = democrata Regla 33 SI Cong_honorarios_medicos = en_contra Y Adop_resolucion_presup = en_contra Y Presupuesto_de_educacion = desconocido ENTONCES Clase = republicano Regla 34 SI Cong_honorarios_medicos = en_contra Y Adop_resolucion_presup = en_contra Y Presupuesto_de_educacion = en_contra ENTONCES Clase = democrata
Correctos 81 47 128
Errores 2 5 7
5.3.4.3. Conclusiones
En comparacin con los dominios anteriores, los modelos obtenidos en este caso son de gran tamao. Los rboles de decisin tienen un tamao de 57 y 58 para la ganancia y proporcin de ganancia respectivamente, y se obtuvieron 34 reglas con la ganancia y 35 con la proporcin de ganancia. Los modelos generados utilizando la ganancia y la proporcin de ganancia son muy similares. Si analizamos los rboles de decisin, vemos que esta diferencia en tamao se origina en la rama Cong_honorarios_medicos=a_favor, donde el atributo Presupuesto_de_educacion genera la mayor ganancia, y el atributo Adop_resolucion_presup genera la mayor proporcin de ganancia.
Si miramos los tamaos de los modelos obtenidos a la luz de los dominios analizados anteriormente, podramos decir que, en este caso, los modelos obtenidos son de mayor tamao porque el sistema analiz una mayor cantidad de datos de entrenamiento. Con lo cual, nuestra hiptesis acerca de que la cantidad de datos de entrenamiento no afecta el tamao de los modelos generados se vera afectada. Podramos hilar ms fino, tomando la nueva hiptesis de que la cantidad de datos de entrenamiento influye en el tamao de los modelos generados, en la medida en que analizamos grandes diferencias en la cantidad de datos de entrenamiento. En cambio, cuando estas diferencias son ms pequeas, la cantidad de datos de entrenamiento no influye. Es decir, si construimos un modelo a partir de 400 datos de entrenamiento, obtenemos rboles de decisin del orden de X; y si construimos un modelo a partir de 40 datos de entrenamiento, obtenemos rboles de decisin del orden de Y, siendo Y menor que X. Sin embargo, si construimos un rbol de decisin a partir de 450 datos de entrenamiento, probablemente el rbol tenga un tamao del orden de X; y si lo construimos a partir de 35 datos de entrenamiento, uno de orden Y.
En cuanto a la proporcin de error sobre los datos de prueba, es de 5.19% en todos los casos. Adems, la probabilidad de clasificar un caso de prueba correctamente es alta para ambas clases.
128
Magdalena Servente
Resultados
Reglas de decisin
Regla 0 SI Olor = almendra ENTONCES Tipo_Hongo = ingerible Resultados Magdalena Servente 129
Regla 1 SI Olor = anis ENTONCES Tipo_Hongo = ingerible Regla 2 SI Olor = creosota ENTONCES Tipo_Hongo = venenoso Regla 3 SI Olor = especioso ENTONCES Tipo_Hongo = venenoso Regla 4 SI Olor = hediondo ENTONCES Tipo_Hongo = venenoso Regla 5 SI Olor = mohoso ENTONCES Tipo_Hongo = venenoso Regla 6 SI Olor = ninguno Y Color_sombrero = amarillo ENTONCES Tipo_Hongo = venenoso Regla 7 SI Olor = ninguno Y Color_sombrero = blanco Y Magulladuras = no ENTONCES Tipo_Hongo = ingerible Regla 8 SI Olor = ninguno Y Color_sombrero = blanco Y Magulladuras = si ENTONCES Tipo_Hongo = venenoso Regla 9 SI Olor = ninguno Y Color_sombrero = canela ENTONCES Tipo_Hongo = ingerible Regla 10 SI Olor = ninguno Y Color_sombrero = gris ENTONCES Tipo_Hongo = ingerible Regla 11 SI Olor = ninguno Y Color_sombrero = marron Y Sup_tronco_arriba_anillo = escamosa ENTONCES Tipo_Hongo = ingerible Regla 12 SI Olor = ninguno Y Color_sombrero = marron Y Sup_tronco_arriba_anillo = fibrosa ENTONCES Tipo_Hongo = ingerible Regla 13 SI Olor = ninguno Y Color_sombrero = marron Y Sup_tronco_arriba_anillo = sedosa ENTONCES Tipo_Hongo = venenoso Regla 14 SI Olor = ninguno Y Color_sombrero = marron Y Sup_tronco_arriba_anillo = suave ENTONCES Tipo_Hongo = ingerible Regla 15 SI Olor = ninguno Y Color_sombrero = piel Y Forma_sombrero = abotonada ENTONCES Tipo_Hongo = ingerible 130 Magdalena Servente Resultados
Regla 16 SI Olor = ninguno Y Color_sombrero = piel Y Forma_sombrero = acampanada ENTONCES Tipo_Hongo = venenoso Regla 17 SI Olor = ninguno Y Color_sombrero = piel Y Forma_sombrero = chata ENTONCES Tipo_Hongo = ingerible Regla 18 SI Olor = ninguno Y Color_sombrero = piel Y Forma_sombrero = convexa ENTONCES Tipo_Hongo = ingerible Regla 19 SI Olor = ninguno Y Color_sombrero = rojo ENTONCES Tipo_Hongo = ingerible Regla 20 SI Olor = ninguno Y Color_sombrero = rosa Y Color_esporas = blanca ENTONCES Tipo_Hongo = ingerible Regla 21 SI Olor = ninguno Y Color_sombrero = rosa Y Color_esporas = verde ENTONCES Tipo_Hongo = venenoso Regla 22 SI Olor = ninguno Y Color_sombrero = verde ENTONCES Tipo_Hongo = ingerible Regla 23 SI Olor = ninguno Y Color_sombrero = violeta ENTONCES Tipo_Hongo = ingerible Regla 24 SI Olor = pescado ENTONCES Tipo_Hongo = venenoso Regla 25 SI Olor = punzante ENTONCES Tipo_Hongo = venenoso
Evaluacin de los resultados Clases Ingerible Venenoso Totales Correctos 1403 1293 2696 Errores 0 12 12 Probabilidad 1 0,990804 0,995568
Resultados
Magdalena Servente
131
Reglas de decisin
Regla 0 SI Olor = almendra ENTONCES Tipo_Hongo = ingerible Regla 1 SI Olor = anis ENTONCES Tipo_Hongo = ingerible Regla 2 SI Olor = creosota ENTONCES Tipo_Hongo = Regla 3 SI Olor = especioso ENTONCES Tipo_Hongo = Regla 4 SI Olor = hediondo ENTONCES Tipo_Hongo =
venenoso
venenoso
venenoso
132
Magdalena Servente
Resultados
venenoso
Regla 6 SI Olor = ninguno Y Color_velo = amarillo ENTONCES Tipo_Hongo = venenoso Regla 7 SI Olor = ninguno Y Color_velo = blanco Y Tamao_membrana = ancha Y Color_esporas = blanca ENTONCES Tipo_Hongo = ingerible Regla 8 SI Olor = ninguno Y Color_velo = blanco Y Tamao_membrana = ancha Y Color_esporas = marron ENTONCES Tipo_Hongo = ingerible Regla 9 SI Olor = ninguno Y Color_velo = blanco Y Tamao_membrana = ancha Y Color_esporas = negro ENTONCES Tipo_Hongo = ingerible Regla 10 SI Olor = ninguno Y Color_velo = blanco Y Tamao_membrana = ancha Y Color_esporas = verde ENTONCES Tipo_Hongo = venenoso Regla 11 SI Olor = ninguno Y Color_velo = blanco Y Tamao_membrana = fina Y Magulladuras = no Y Sup_tronco_arriba_anillo = fibrosa ENTONCES Tipo_Hongo = ingerible Regla 12 SI Olor = ninguno Y Color_velo = blanco Y Tamao_membrana = fina Y Magulladuras = no Y Sup_tronco_arriba_anillo = sedosa ENTONCES Tipo_Hongo = venenoso Regla 13 SI Olor = ninguno Y Color_velo = blanco Y Tamao_membrana = fina Y Magulladuras = no Y Sup_tronco_arriba_anillo = suave ENTONCES Tipo_Hongo = ingerible Regla 14 SI Olor = ninguno Y Color_velo = blanco Y Tamao_membrana = fina Y Magulladuras = si ENTONCES Tipo_Hongo = venenoso Regla 15 SI Olor = ninguno Y Color_velo = marron ENTONCES Tipo_Hongo = ingerible Regla 16 SI Olor = ninguno Y Color_velo = naranja ENTONCES Tipo_Hongo = ingerible Resultados Magdalena Servente 133
Regla 17 SI Olor = pescado ENTONCES Tipo_Hongo = Regla 18 SI Olor = punzante ENTONCES Tipo_Hongo =
venenoso
venenoso
Evaluacin de los resultados Clases Ingerible Venenoso Totales Correctos 1403 1305 2708 Errores 0 0 0 Probabilidad 1 1 1
5.3.4.3. Conclusiones
Los resultados obtenidos en este dominio son muy interesantes. Vemos que los rboles de decisin y, a raz de ello las reglas, no son iguales para el caso de la ganancia y de la proporcin de ganancia. Si analizamos los rboles, vemos que en primer trmino, el atributo olor es el que ms informacin brinda tanto utilizando la ganancia como la proporcin de ganancia como medidores de informacin. Pero una vez en el caso de los ejemplos que tienen olor=ninguno, la ganancia considera que el atributo color_sombrero es el que brinda ms informacin, mientras que la proporcin de ganancia considera que el atributo color_velo brinda ms informacin que los dems. Analizando el archivo de log generado por el programa (seccin 4.5.2.1.8) para el caso de los ejemplos que tienen olor=ninguno, tenemos:
He aqu la diferencia en la eleccin de atributos de divisin para ambos medidores de informacin. Si analizamos las caractersticas de los datos, vemos que el atributo color_sombrero toma diez valores distintos, mientras que el atributo Color_velo toma cuatro valores distintos. Recordemos que la ganancia favorece a los atributos con ms valores y esa es la razn por la que se comenz a utilizar la proporcin de ganancia, que promedia o normaliza, el clculo de la ganancia de informacin en un conjunto de datos. Este es un ejemplo claro del porqu de esta tendencia.
A pesar de esta diferencia entre los modelos obtenidos en uno y otro caso, vemos que la proporcin de error en ambos casos es baja. Con lo cual, aunque la ganancia favorezca a los atributos con mayor cantidad de valores posibles, no podemos afirmar que esto influya en gran medida en el anlisis sobre los datos de prueba. Para el clasificador obtenido mediante la proporcin de ganancia no se realizaron errores al clasificar los casos de prueba.
134 Magdalena Servente Resultados
5.4.1. Crditos
5.4.1.1. Utilizando la ganancia como criterio de decisin
rbol de decisin
Otros Creditos = TRES CREDITOS: NO (23.0) Otros Creditos = UN CREDITO: Composicin Familiar = SOLTERO: SI (10.0) Composicin Familiar = CASADO SIN HIJOS: SI Composicin Familiar = CASADO Y UN HIJO: SI Composicin Familiar = CASADO Y DOS HIJOS: Ingreso = ENTRE 451 Y 550: SI (0.0) Ingreso = MAS DE 551: SI (5.0) Ingreso = ENTRE 451 Y 550: Vivienda = ALQUILA: NO (2.0) Vivienda = PROPIA 0 IPVU: SI (2.0) Otros Creditos = DOS CREDITOS: Composicin Familiar = CASADO SIN HIJOS: SI Composicin Familiar = CASADO Y UN HIJO: SI Composicin Familiar = SOLTERO: Vivienda = PROPIA 0 IPVU: SI (6.0) Vivienda = ALQUILA: Ingreso = ENTRE 451 Y 550: SI (2.0) Ingreso = ENTRE 451 Y 550: SI (0.0) Ingreso = MAS DE 551: NO (2.0) Composicin Familiar = CASADO Y DOS HIJOS: Ingreso = ENTRE 451 Y 550: NO (4.0/1.0) Ingreso = ENTRE 451 Y 550: SI (0.0) Ingreso = MAS DE 551: SI (5.0)
(10.0) (10.0)
(9.0) (9.0)
Otros Creditos = UN CREDITO: SI (39.0/3.8) Otros Creditos = DOS CREDITOS: SI (37.0/7.2) Otros Creditos = TRES CREDITOS: NO (23.0/1.3)
Resultados
Magdalena Servente
135
Estimacin (12.4%)
Antes de podar Despus de podar Tamao Errores Tamao Errores 25 19 (37.3%) 4 22 (43.1%)
Estimacin (12.4%)
Clase SI Clase NO
Clasificado como SI 17 4
Clasificado como NO 18 12
Reglas de decisin
Regla 12 SI Otros Creditos = TRES CREDITOS ENTONCES clase=NO [94.2%] Regla 2 SI Ingreso = ENTRE 451 Y 550 Y Composicin Familiar = CASADO Y DOS HIJOS Y Vivienda = ALQUILA ENTONCES clase=NO [79.4%] Regla 6 SI Ingreso = MAS DE 551 Y Composicin Familiar = SOLTERO Y Vivienda = ALQUILA Y Otros Creditos = DOS CREDITOS ENTONCES clase=NO [50.0%] Regla 1 SI Otros Creditos = UN CREDITO Y clase=SI [90.3%] Regla 11 SI Otros Creditos = DOS CREDITOS ENTONCES clase=SI [80.6%] Regla 13 Clase=SI
136
Magdalena Servente
Resultados
Usada 23 4 2 37 33
Clase NO NO NO SI SI
Regla Tamao Error 12 1 5.8% 2 3 20.6% 6 4 50.0% 1 1 9.7% 11 1 19.4% Probadas 51, errores 18 (35.3%)
Usada 30 2 2 8 9
Clase NO NO NO SI SI
Clase SI Clase NO
Clasificado como SI 17 0
Clasificado como NO 18 16
Otros Creditos = TRES CREDITOS: NO (23.0) Otros Creditos = UN CREDITO: Composicin Familiar = SOLTERO: SI (10.0) Composicin Familiar = CASADO SIN HIJOS: SI Composicin Familiar = CASADO Y UN HIJO: SI Composicin Familiar = CASADO Y DOS HIJOS: Vivienda = PROPIA 0 IPVU: SI (5.0) Vivienda = ALQUILA: Ingreso = ENTRE 451 Y 550: NO (2.0) Ingreso = ENTRE 451 Y 550: SI (0.0) Ingreso = MAS DE 551: SI (2.0) Otros Creditos = DOS CREDITOS: Composicin Familiar = CASADO SIN HIJOS: SI Composicin Familiar = CASADO Y UN HIJO: SI Composicin Familiar = SOLTERO: Vivienda = PROPIA 0 IPVU: SI (6.0) Vivienda = ALQUILA: Ingreso = ENTRE 451 Y 550: SI (2.0) Ingreso = ENTRE 451 Y 550: SI (0.0) Ingreso = MAS DE 551: NO (2.0) Resultados
(10.0) (10.0)
(9.0) (9.0)
Magdalena Servente
137
Familiar = CASADO Y DOS HIJOS: = ENTRE 451 Y 550: NO (4.0/1.0) = ENTRE 451 Y 550: SI (0.0) = MAS DE 551: SI (5.0)
Otros Creditos = UN CREDITO: SI (39.0/3.8) Otros Creditos = DOS CREDITOS: SI (37.0/7.2) Otros Creditos = TRES CREDITOS: NO (23.0/1.3)
Estimacin (12.4%)
Antes de podar Despus de podar Tamao Errores Tamao Errores 25 19 (37.3%) 4 22 (43.1%)
Estimacin (12.4%)
Clase SI Clase NO
Clasificado como SI 17 4
Clasificado como NO 18 12
Reglas de decisin
Regla 12 SI Otros Creditos = TRES CREDITOS ENTONCES clase=NO [94.2%] Regla 2 SI Ingreso = ENTRE 451 Y 550 Y Composicin Familiar = CASADO Y DOS HIJOS Y Vivienda = ALQUILA ENTONCES clase=NO [79.4%] Regla 6 SI Ingreso = MAS DE 551 138 Magdalena Servente Resultados
Y Composicin Familiar = SOLTERO Y Vivienda = ALQUILA Y Otros Creditos = DOS CREDITOS ENTONCES clase=NO [50.0%] Regla 1 SI Otros Creditos = UN CREDITO ENTOCNES clase=SI [90.3%] Regla 11 SI Otros Creditos = DOS CREDITOS ENTONCES clase=SI [80.6%] Regla 13 clase=SI
Usada 23 4 2 37 33
Clase NO NO NO SI SI
Usada 30 2 2 8 9
Errores Ventaja 18(60.0%) -8(10|18) 0(0.0%) 2(2|0) 0(0.0%) 2(2|0) 0(0.0%) 0(0|0) 0(0.0%) 0(0|0)
Clase NO NO NO SI SI
Clase SI Clase NO
Clasificado como SI 17 0
Clasificado como NO 18 16
5.4.1.3. Conclusiones
Los rboles de decisin sin simplificar obtenidos utilizando la ganancia y la proporcin de ganancia se diferencian solamente en la rama de Otros Crditos=UN CRDITO y Composicin Familiar=CASADO Y DOS HIJOS. Al llegar a este punto, se encontr que la mayor ganancia se obtena dividiendo a los
Resultados Magdalena Servente 139
datos segn el atributo Ingreso, mientras que la mayor proporcin de ganancia se obtuvo con el atributo Vivienda. A pesar de estas diferencias encontradas en los rboles sin simplificar, los rboles
simplificados son idnticos y tienen un nico nodo, lo cual los hace muy fciles de comprender.
En cuanto a las reglas obtenidas, son idnticas en ambos casos. Cabe destacar que, como el rbol de decisin simplificado es tan simple, el modelo de clasificacin ofrecido en ese caso se entiende ms rpidamente que el conjunto de reglas de decisin.
Analicemos la columna ventaja de la tabla de resultados para las reglas de decisin. Recordemos que la ventaja se expresa de la forma a(b|c) donde b es la cantidad de casos que seran clasificados errneamente por las reglas siguientes, de omitirse esa regla; c es la cantidad de casos que seran clasificados correctamente; y a es el beneficio neto de omitir la regla. En el caso de la regla 12, tenemos un beneficio neto negativo, con lo cual, a pesar de que con los mtodos utilizados por el C4.5 se consider que no era conveniente eliminarla, de utilizar este modelo para clasificar nuevos casos, debera analizarse la posibilidad de no tener esta regla en cuenta y trabajar con un modelo ms simple.
En cuanto al valor E asociado, en el rbol original representa la cantidad de casos cubiertos por una hoja que pertenece a una clase diferente de la indicada por la misma. Mientras que en el caso del rbol podado, E es la cantidad de errores predichos, segn la distribucin binomial, en dicha hoja si un conjunto de N nuevos casos fuesen evaluados por el rbol. Recordemos que los valores E tienen especial importancia, ya que el estimador del xito del modelo obtenido se calcula realizando la sumatoria de todos los valores E y dividindola por la cantidad de casos de entrenamiento. En este caso, la estimacin del xito del modelo es de un 12.4%.
5.4.2. Cardiologa
5.4.2.1. Utilizando la ganancia como criterio de decisin
rbol de decisin
Duracin del Angor = MENOS DE 30 MIN: NO (33.0/1.0) Duracin del Angor = MAS DE 30 MIN: Dolor de Pecho de Angor = TIPICO: SI (11.0/1.0) Dolor de Pecho de Angor = AUSENTE: NO (11.0) Dolor de Pecho de Angor = ATIPICO: Irradiacin del Angor = SI: SI (5.0) Irradiacin del Angor = NO: Respuesta Vasodilatadora = POSITIVO: SI (2.0) Respuesta Vasodilatadora = NEGATIVO: NO (2.0)
Estimacin (14.9%)
Estimacin (14.9%)
Clase SI Clase NO
Clasificado como SI 8 1
Clasificado como NO 1 21
Reglas de decisin
Regla 2 SI Dolor de Pecho de Angor = TIPICO Y Duracin del Angor = MAS DE 30 MIN ENTONCES clase=SI [77.7%] Regla 3 SI Dolor de Pecho de Angor = ATIPICO Y Irradiacin del Angor = SI Y Duracin del Angor = MAS DE 30 MIN ENTONCES clase=SI [75.8%] Regla 4 SI Dolor de Pecho de Angor = ATIPICO Y Duracin del Angor = MAS DE 30 MIN Y Respuesta Vasodilatadora = POSITIVO ENTONCES clase=SI [75.8%] Regla 6 SI Dolor de Pecho de Angor = AUSENTE ENTONCES clase=NO [93.9%] Regla 1 SI Duracin del Angor = MENOS DE 30 MIN ENTONCES clase=NO [92.2%] Regla 5 SI Dolor de Pecho de Angor = ATIPICO Y Irradiacin del Angor = NO Y Respuesta Vasodilatadora = NEGATIVO ENTONCES clase=NO [75.8%] Regla 7 Clase=NO
Resultados
Magdalena Servente
141
Usada 11 5 2 22 22 2
Clase SI SI SI NO NO NO
Usada 3 3 3 10 11 1
Clase SI SI SI NO NO NO
Clase SI Clase NO
Clasificado como SI 8 1
Clasificado como NO 1 21
Duracin del Angor = MENOS DE 30 MIN: NO (33.0/1.0) Duracin del Angor = MAS DE 30 MIN: Dolor de Pecho de Angor = TIPICO: SI (11.0/1.0) Dolor de Pecho de Angor = AUSENTE: NO (11.0) Dolor de Pecho de Angor = ATIPICO: Respuesta Vasodilatadora = POSITIVO: SI (5.0) Respuesta Vasodilatadora = NEGATIVO: Irradiacin del Angor = SI: SI (2.0) Irradiacin del Angor = NO: NO (2.0)
142
Magdalena Servente
Resultados
Estimacin (14.9%)
Estimacin (14.9%)
Clase SI Clase NO
Clasificado como SI 8 1
Clasificado como NO 1 21
Reglas de decisin
Regla 2 SI Dolor de Pecho de Angor = TIPICO Y Duracin del Angor = MAS DE 30 MIN ENTONCES clase=SI [77.7%] Regla 3 SI Dolor de Pecho de Angor = ATIPICO Y Duracin del Angor = MAS DE 30 MIN Y Respuesta Vasodilatadora = POSITIVO ENTONCES clase=SI [75.8%] Regla 4 SI Dolor de Pecho de Angor = ATIPICO Y Irradiacin del Angor = SI Y Duracin del Angor = MAS DE 30 MIN ENTONCES clase=SI [75.8%] Regla 6 SI Dolor de Pecho de Angor = AUSENTE ENTONCES clase=NO [93.9%] Regla 1 SI Duracin del Angor = MENOS DE 30 MIN ENTONCES clase=NO [92.2%] Regla 5 SI Dolor de Pecho de Angor = ATIPICO Y Irradiacin del Angor = NO Y Respuesta Vasodilatadora = NEGATIVO ENTONCES clase=NO [75.8%] Regla 7 Clase= NO
Resultados
Magdalena Servente
143
Usada 11 5 2 22 22 2
Clase SI SI SI NO NO NO
Usada 3 4 2 10 11 1
Clase SI SI SI NO NO NO
Clase SI Clase NO
Clasificado como SI 8 1
Clasificado como NO 1 21
5.4.2.3. Conclusiones
En este caso, tanto los rboles de decisin como las reglas que derivan de ellos, difieren entre la ganancia y la proporcin de ganancia. Esta diferencia surge del hecho de que frente a una misma situacin (Duracin del Angor=MAS DE 30 MIN Y Dolor de Pecho de Angor=Atipico), la ganancia y la proporcin de ganancia son distintas. Se obtuvo mejor proporcin de ganancia con el atributo Respuesta Vasodilatadora, y mejor ganancia con el atributo Irradiacin de Pecho de Angor. No obstante, al igual que en el caso del dominio de Estudio sobre Hongos utilizando el ID3, esta diferencia no influye en las proporciones de error de los modelos.
Podemos encontrar la misma diferencia en las reglas de decisin. Y, al igual que en el caso anterior, no influye en gran medida en la performance de los clasificadores sobre los datos de prueba
144
Magdalena Servente
Resultados
Notemos que en este caso los rboles de decisin no han sido podados. Dada su simplicidad, esto no fue necesario.
5.4.3. Votaciones
5.4.3.1. Utilizando la ganancia como criterio de decisin
rbol de decisin
cong_honorarios_medicos = en_contra: democrata (168.0/1.0) cong_honorarios_medicos = a_favor: reduccion_corp_Synfuels = en_contra: republicano (97.0/3.0) reduccion_corp_Synfuels = desconocido: republicano (4.0) reduccion_corp_Synfuels = a_favor: export_sin_impuestos = a_favor: democrata (2.0) export_sin_impuestos = desconocido: republicano (1.0) export_sin_impuestos = en_contra: presupuesto_de_educacin = a_favor: republicano (13.0/2.0) presupuesto_de_educacin = en_contra: democrata (5.0/2.0) presupuesto_de_educacin = desconocido: democrata (1.0) cong_honorarios_medicos = desconocido: misil_mx = a_favor: democrata (4.0/1.0) misil_mx = en_contra: democrata (3.0) misil_mx = desconocido: republicano (2.0)
cong_honorarios_medicos = a_favor: republicano (123.0/13.9) cong_honorarios_medicos = en_contra: democrata (168.0/2.6) cong_honorarios_medicos = desconocido: misil_mx = a_favor: democrata (4.0/2.2) misil_mx = en_contra: democrata (3.0/1.1) misil_mx = desconocido: republicano (2.0/1.0)
Estimacin (6.9%)
Antes de podar
Resultados
Despus de podar
Magdalena Servente 145
Tamao 16
Errores 7 (5.2%)
Tamao 7
Errores 4 (3.0%)
Estimacin (6.9%)
Reglas de decisin
Regla 7 SI cong_honorarios_medicos = en_contra ENTONCES clase=democrata [98.4%] Regla 3 SI reduccion_corp_Synfuels = a_favor Y presupuesto_de_educacin = en_contra ENTONCES clase=democrata [94.3%] Regla 9 SI cong_honorarios_medicos = desconocido Y misil_mx = en_contra ENTONCES clase=democrata [63.0%] Regla 5 SI cong_honorarios_medicos = a_favor ENTONCES clase=republicano [88.7%] Regla 10 SI cong_honorarios_medicos = desconocido Y misil_mx = desconocido ENTONCES clase=republicano [50.0%] Regla 11 clase=democrata
146
Magdalena Servente
Resultados
Usada 79 3 53
cong_honorarios_medicos = a_favor: reduccion_corp_Synfuels = en_contra: republicano (97.0/3.0) reduccion_corp_Synfuels = desconocido: republicano (4.0) reduccion_corp_Synfuels = a_favor: export_sin_impuestos = a_favor: democrata (2.0) export_sin_impuestos = desconocido: republicano (1.0) export_sin_impuestos = en_contra: presupuesto_de_educacin = a_favor: republicano (13.0/2.0) presupuesto_de_educacin = en_contra: democrata (5.0/2.0) presupuesto_de_educacin = desconocido: democrata (1.0) cong_honorarios_medicos = en_contra: adop_resolucion_presup = a_favor: democrata (151.0) adop_resolucion_presup = desconocido: democrata (1.0) adop_resolucion_presup = en_contra: presupuesto_de_educacin = a_favor: democrata (9.0) presupuesto_de_educacin = en_contra: democrata (6.0) presupuesto_de_educacin = desconocido: republicano (1.0) cong_honorarios_medicos = desconocido: particip_proy_agua = a_favor: democrata (4.0) particip_proy_agua = en_contra: democrata (0.0) particip_proy_agua = desconocido: misil_mx = a_favor: democrata (3.0/1.0) misil_mx = en_contra: republicano (0.0) misil_mx = desconocido: republicano (2.0)
cong_honorarios_medicos = a_favor: republicano (123.0/13.9) cong_honorarios_medicos = en_contra: democrata (168.0/2.6) cong_honorarios_medicos = desconocido: misil_mx = a_favor: democrata (4.0/2.2) misil_mx = en_contra: democrata (3.0/1.1) misil_mx = desconocido: republicano (2.0/1.0)
Resultados
Magdalena Servente
147
Estimacin (6.9%)
Estimacin (6.9%)
Reglas de decisin
Regla 1 SI reduccion_corp_Synfuels = a_favor Y export_sin_impuestos = a_favor ENTONCES clase=democrata [97.5%] Regla 11 SI particip_proy_agua = a_favor Y cong_honorarios_medicos = desconocido ENTONCES clase=democrata [70.7%] Regla 6 SI cong_honorarios_medicos = a_favor Y reduccion_corp_Synfuels = en_contra ENTONCES clase=republicano [94.8%] Regla 2 SI cong_honorarios_medicos = a_favor Y presupuesto_de_educacin = a_favor Y export_sin_impuestos = en_contra ENTONCES clase=republicano [94.0%] Regla 10 SI adop_resolucion_presup = en_contra Y presupuesto_de_educacin = desconocido ENTONCES clase=republicano [82.0%] Regla 13 SI cong_honorarios_medicos = desconocido Y misil_mx = desconocido ENTONCES clase=republicano [50.0%]
Regla 14 clase=democrata
148
Magdalena Servente
Resultados
Usada 54 3 97 15 3 2
Usada 24 1 41 8 2
5.4.3.3. Conclusiones
Los resultados obtenidos en este dominio con el C4.5 parecen satisfactorios a simple vista, ya que la proporcin de error no supera el 6% en ninguno de los casos. En cuanto a los rboles de decisin simplificados son iguales para la ganancia y para la proporcin de ganancia. No obstante, en los rboles sin simplificar hay una diferencia de tamao: el rbol obtenido con la ganancia es de tamao menor que el obtenido con la proporcin de ganancia. Esto se debe a que en la rama
cong_honorarios_medicos=desconocido en la ganancia se opt por dividir al conjunto segn el atributo misil_mx, y en la proporcin de ganancia se los dividi segn particip_proy_agua y luego en uno de los casos por misil_mx. Esta diferencia de tamao no influye en la performance de los rboles. Es decir, nos encontramos ante dos rboles de igual porcentaje de error, pero de distinto tamao. Con lo cual, de tener que optar entre ambos, eligiramos el obtenido con la ganancia.
Resultados
Magdalena Servente
149
En cuanto a las reglas de decisin, las primeras, derivadas utilizando la ganancia, tienen una proporcin de error similar a la de los rboles y son menos que las obtenidas con la proporcin de ganancia. Estas segundas, tienen una mayor proporcin de error. Nuevamente, en este caso, eligiramos las obtenidas utilizando la ganancia.
Olor = almendra: ingerible (168.0) Olor = anis: ingerible (178.0) Olor = creosota: venenoso (37.0) Olor = pescado: venenoso (489.0) Olor = hediondo: venenoso (1348.0) Olor = mohoso: venenoso (36.0) Olor = punzante: venenoso (164.0) Olor = especioso: venenoso (516.0) Olor = ninguno: Color_sombrero = canela: ingerible (28.0) Color_sombrero = gris: ingerible (716.0) Color_sombrero = verde: ingerible (14.0) Color_sombrero = violeta: ingerible (9.0) Color_sombrero = rojo: ingerible (483.0) Color_sombrero = amarillo: venenoso (10.0) Color_sombrero = marron: Sup_tronco_arriba_anillo = fibrosa: ingerible (87.0) Sup_tronco_arriba_anillo = escamosa: ingerible (13.0) Sup_tronco_arriba_anillo = sedosa: venenoso (3.0) Sup_tronco_arriba_anillo = suave: ingerible (744.0) Color_sombrero = piel: Tipo_anillo = tejido: ingerible (0.0) Tipo_anillo = evanescente: ingerible (41.0) Tipo_anillo = resplandescient: ingerible (0.0) Tipo_anillo = grande: ingerible (0.0) Tipo_anillo = ninguno: ingerible (0.0) Tipo_anillo = pendiente: venenoso (2.0) Tipo_anillo = cubierto: ingerible (0.0) Tipo_anillo = zonal: ingerible (0.0) Color_sombrero = rosa: Color_esporas = negro: ingerible (0.0) Color_esporas = marron: ingerible (0.0) Color_esporas = piel: ingerible (0.0) Color_esporas = chocolate: ingerible (0.0) Color_esporas = verde: venenoso (2.0) Color_esporas = naranja: ingerible (0.0) Color_esporas = violeta: ingerible (0.0) Color_esporas = blanca: ingerible (49.0) Color_esporas = amarillo: ingerible (0.0) Color_sombrero = blanco: Habitat = pastos: ingerible (259.0) Habitat = hojas: venenoso (1.0) Habitat = praderas: venenoso (3.0) Habitat = caminos: ingerible (0.0) Habitat = urbano: ingerible (0.0) Habitat = basura: ingerible (0.0) Habitat = bosque: ingerible (16.0)
150
Magdalena Servente
Resultados
Olor = almendra: ingerible (168.0/1.4) Olor = anis: ingerible (178.0/1.4) Olor = creosota: venenoso (37.0/1.4) Olor = pescado: venenoso (489.0/1.4) Olor = hediondo: venenoso (1348.0/1.4) Olor = mohoso: venenoso (36.0/1.4) Olor = punzante: venenoso (164.0/1.4) Olor = especioso: venenoso (516.0/1.4) Olor = ninguno: Color_sombrero = marron: ingerible (847.0/5.1) Color_sombrero = canela: ingerible (28.0/1.4) Color_sombrero = gris: ingerible (716.0/1.4) Color_sombrero = verde: ingerible (14.0/1.3) Color_sombrero = violeta: ingerible (9.0/1.3) Color_sombrero = rojo: ingerible (483.0/1.4) Color_sombrero = amarillo: venenoso (10.0/1.3) Color_sombrero = piel: Tipo_anillo = tejido: ingerible (0.0) Tipo_anillo = evanescente: ingerible (41.0/1.4) Tipo_anillo = resplandescient: ingerible (0.0) Tipo_anillo = grande: ingerible (0.0) Tipo_anillo = ninguno: ingerible (0.0) Tipo_anillo = pendiente: venenoso (2.0/1.0) Tipo_anillo = cubierto: ingerible (0.0) Tipo_anillo = zonal: ingerible (0.0) Color_sombrero = rosa: Color_esporas = negro: ingerible (0.0) Color_esporas = marron: ingerible (0.0) Color_esporas = piel: ingerible (0.0) Color_esporas = chocolate: ingerible (0.0) Color_esporas = verde: venenoso (2.0/1.0) Color_esporas = naranja: ingerible (0.0) Color_esporas = violeta: ingerible (0.0) Color_esporas = blanca: ingerible (49.0/1.4) Color_esporas = amarillo: ingerible (0.0) Color_sombrero = blanco: Habitat = pastos: ingerible (259.0/1.4) Habitat = hojas: venenoso (1.0/0.8) Habitat = praderas: venenoso (3.0/1.1) Habitat = caminos: ingerible (0.0) Habitat = urbano: ingerible (0.0) Habitat = basura: ingerible (0.0) Habitat = bosque: ingerible (16.0/1.3)
Estimacin (0.6%)
Estimacin (0.6%)
151
Reglas de decisin
Regla 5 SI Olor = hediondo ENTONCES Tipo_hongo = Regla 23 SI Olor = especioso ENTONCES Tipo_hongo = Regla 4 SI Olor = pescado ENTONCES Tipo_hongo = Regla 9 SI Color_sombrero = marron Y Sup_tronco_arriba_anillo = sedosa ENTONCES Tipo_hongo = venenoso [99.6%] Regla 22 SI Olor = punzante ENTONCES Tipo_hongo = Regla 3 SI Olor = creosota ENTONCES Tipo_hongo = Regla 6 SI Olor = mohoso ENTONCES Tipo_hongo = venenoso [96.2%] venenoso [96.3%] venenoso [99.7%] venenoso [99.9%]
venenoso
[99.7%]
venenoso
[99.2%]
Regla 21 SI Color_sombrero = amarillo Y Olor = ninguno ENTONCES Tipo_hongo = venenoso Regla 14 SI Color_esporas = verde ENTONCES Tipo_hongo = venenoso Regla 2 SI Olor = anis ENTONCES Tipo_hongo = Regla 1 SI Olor = almendra ENTONCES Tipo_hongo = Regla 11 SI Olor = ninguno ENTONCES Tipo_hongo = Regla 24 Tipo_hongo = ingerible ingerible ingerible
[87.1%]
[82.0%]
[99.2%]
[99.2%]
ingerible
[99.0%]
152
Magdalena Servente
Resultados
Error 0.10% 0.30% 0.30% 0.40% 0.80% 3.70% 3.80% 12.90% 18.00% 0.80% 0.80% 1.00%
Errores 0(0.00%) 0(0.00%) 0(0.00%) 0(0.00%) 0(0.00%) 0(0.00%) 0(0.00%) 0(0.00%) 0(0.00%) 0(0.00%) 0(0.00%) 1(0.00%)
Ventaja 1228(1228|0) 400(400|0) 372(372|0) 3(3|0) 164(164|0) 37(37|0) 24(24|0) 10(10|0) 7(7|0) 0(0|0) 0(0|0) 0(0|0)
Clase venenoso venenoso venenoso venenoso venenoso venenoso venenoso venenoso venenoso ingerible ingerible ingerible
Error 0.10% 0.30% 0.30% 0.40% 0.80% 3.70% 12.90% 18.00% 0.80% 0.80% 1.00%
Errores 0(0.00%) 0(0.00%) 0(0.00%) 0(0.00%) 0(0.00%) 0(0.00%) 0(0.00%) 0(0.00%) 0(0.00%) 0(0.00%) 7(0.70%)
Ventaja 788(788|0) 32(32|0) 60(60|0) 13(13|0) 92(92|0) 155(155|0) 14(14|0) 65(65|0) 0(0|0) 0(0|0) 0(0|0)
Clase venenoso venenoso venenoso venenoso venenoso venenoso venenoso venenoso ingerible ingerible ingerible
Olor = anis: ingerible (178.0) Olor = creosota: venenoso (37.0) Olor = pescado: venenoso (489.0) Olor = hediondo: venenoso (1348.0) Olor = mohoso: venenoso (36.0) Olor = punzante: venenoso (164.0) Olor = especioso: venenoso (516.0) Olor = ninguno: Tamao_membrana = ancha: Color_esporas = negro: ingerible (847.0) Color_esporas = marron: ingerible (921.0) Color_esporas = piel: ingerible (45.0) Color_esporas = chocolate: ingerible (0.0) Color_esporas = verde: venenoso (7.0) Color_esporas = naranja: ingerible (40.0) Color_esporas = violeta: ingerible (0.0) Color_esporas = blanca: ingerible (439.0) Color_esporas = amarillo: ingerible (43.0) Tamao_membrana = fina: ColorTronco_arriba_anillo = marron: ingerible (0.0) ColorTronco_arriba_anillo = piel: ingerible (0.0) ColorTronco_arriba_anillo = canela: ingerible (0.0) ColorTronco_arriba_anillo = gris: ingerible (0.0) ColorTronco_arriba_anillo = naranja: ingerible (0.0) ColorTronco_arriba_anillo = rosa: ingerible (0.0) ColorTronco_arriba_anillo = rojo: ingerible (0.0) ColorTronco_arriba_anillo = amarillo: venenoso (8.0) ColorTronco_arriba_anillo = blanco: Sup_tronco_arriba_anillo = fibrosa: ingerible (21.0) Sup_tronco_arriba_anillo = escamosa: ingerible (0.0) Sup_tronco_arriba_anillo = sedosa: venenoso (5.0) Sup_tronco_arriba_anillo = suave: Poblacion = abundante: ingerible (0.0) Poblacion = agrupada: venenoso (1.0) Poblacion = numerosa: ingerible (0.0) Poblacion = dispersa: ingerible (0.0) Poblacion = varios: ingerible (63.0) Poblacion = solitaria: ingerible (40.0)
Olor = almendra: ingerible (168.0/1.4) Olor = anis: ingerible (178.0/1.4) Olor = creosota: venenoso (37.0/1.4) Olor = pescado: venenoso (489.0/1.4) Olor = hediondo: venenoso (1348.0/1.4) Olor = mohoso: venenoso (36.0/1.4) Olor = punzante: venenoso (164.0/1.4) Olor = especioso: venenoso (516.0/1.4) Olor = ninguno: Tamao_membrana = ancha: Color_esporas = negro: ingerible (847.0/1.4) Color_esporas = marron: ingerible (921.0/1.4) Color_esporas = piel: ingerible (45.0/1.4) Color_esporas = chocolate: ingerible (0.0) Color_esporas = verde: venenoso (7.0/1.3) Color_esporas = naranja: ingerible (40.0/1.4) Color_esporas = violeta: ingerible (0.0) Color_esporas = blanca: ingerible (439.0/1.4) Color_esporas = amarillo: ingerible (43.0/1.4) Tamao_membrana = fina: Sup_tronco_arriba_anillo = fibrosa: ingerible (21.0/1.3) Sup_tronco_arriba_anillo = escamosa: venenoso (8.0/1.3) Sup_tronco_arriba_anillo = sedosa: venenoso (5.0/1.2) Sup_tronco_arriba_anillo = suave: ingerible (104.0/2.6)
154
Magdalena Servente
Resultados
Estimacin (0.5%)
Estimacin (0.5%)
Reglas de decisin
Regla 13 SI Tamao_membrana = fina Y Sup_tronco_arriba_anillo = sedosa ENTONCES Tipo_Hongo = venenoso [99.8%] Regla 19 SI Olor = especioso ENTONCES Tipo_Hongo = Regla 4 SI Olor = pescado ENTONCES Tipo_Hongo = Regla 18 SI Olor = punzante ENTONCES Tipo_Hongo = Regla 3 SI Olor = creosota ENTONCES Tipo_Hongo = Regla 6 SI Olor = mohoso ENTONCES Tipo_Hongo = venenoso [96.2%] venenoso [96.3%] venenoso [99.7%]
venenoso
[99.7%]
venenoso
[99.2%]
Regla 17 SI ColorTronco_arriba_anillo = amarillo ENTONCES Tipo_Hongo = venenoso [84.1%] Resultados Magdalena Servente 155
Regla 10 SI Color_esporas = verde ENTONCES Tipo_Hongo = venenoso Regla 9 SI Olor = ninguno Y Tamao_membrana = ancha ENTONCES Tipo_Hongo = ingerible
[82.0%]
[99.6%]
Regla 15 SI Olor = ninguno Y Sup_tronco_arriba_anillo = suave ENTONCES Tipo_Hongo = ingerible [99.5%] Regla 12 SI Olor = ninguno Y Sup_tronco_arriba_anillo = fibrosa ENTONCES Tipo_Hongo = ingerible [99.4%] Regla 2 SI Olor = anis ENTONCES Tipo_Hongo = Regla 1 SI Olor = almendra ENTONCES Tipo_Hongo = Regla 20 Tipo_Hongo = ingerible ingerible [99.2%] ingerible [99.2%]
Error 0.10% 0.20% 0.30% 0.30% 0.80% 3.70% 3.80% 15.90% 18.00% 0.40% 0.50% 0.60% 0.80% 0.80%
Usada 1348 497 261 252 164 37 36 8 7 2335 104 21 178 168
Errores 0(0.00%) 0(0.00%) 0(0.00%) 0(0.00%) 0(0.00%) 0(0.00%) 0(0.00%) 0(0.00%) 0(0.00%) 0(0.00%) 1(1.00%) 0(0.00%) 0(0.00%) 0(0.00%)
Ventaja 1088(1088|0) 5(5|0) 261(261|0) 252(252|0) 164(164|0) 37(37|0) 36(36|0) 8(8|0) 7(7|0) 0(0|0) 0(0|0) 0(0|0) 0(0|0) 0(0|0)
Clase venenoso venenoso venenoso venenoso venenoso venenoso venenoso venenoso venenoso ingerible ingerible ingerible ingerible ingerible
0.30% 0.30% 0.80% 3.70% 18.00% 0.40% 0.50% 0.60% 0.80% 0.80%
0(0.00%) 0(0.00%) 0(0.00%) 0(0.00%) 0(0.00%) 0(0.00%) 7(9.70%) 0(0.00%) 0(0.00%) 0(0.00%)
27(27|0) 36(36|0) 92(92|0) 155(155|0) 65(65|0) 0(0|0) 0(0|0) 0(0|0) 0(0|0) 0(0|0)
venenoso venenoso venenoso venenoso venenoso ingerible ingerible ingerible ingerible ingerible
5.4.4.3. Conclusiones
El rbol de decisin obtenido utilizando la ganancia como criterio de decisin es de mayor tamao que el obtenido utilizando la proporcin de ganancia. Esta diferencia se origina por la preferencia de la ganancia por atributos con ms cantidad de valores. Veamos que en la rama Olor=ninguno, el mtodo que utiliz la ganancia dividi los datos segn el atributo color_sombrero que toma diez valores distintos, mientras que el mtodo que utiliz la proporcin de ganancia, dividi los datos segn el atributo Tamao_membrana que tiene dos valores posibles. En este caso, el hecho de que un rbol sea de mayor tamao no favorece la performance del mismo: el segundo rbol, ms pequeo, tuvo una mejor performance en los casos de prueba, ya que clasific solo 7 de ellos errneamente, mientras que el rbol generado con la ganancia clasific 25 errneamente. A pesar de esta diferencia, la estimacin del error sobre futuros casos es muy buena para los dos rboles: del 0.6% para el generado utilizando la ganancia y del 0.5% para el generado utilizando la proporcin de ganancia.
Cabe destacar que en el rbol de decisin generado utilizando la proporcin de ganancia, el subrbol olor=ninguno y tamao_membrana=fina se simplific por una rama hija, que no contiene al atributo por el cual se realiz la primera divisin. Es decir, en el rbol sin simplificar la divisin en el nodo en cuestin se realiz segn el atributo ColorTronco_arriba_anillo; este atributo no aparece en el rbol simplificado.
En cuanto a las reglas de decisin, a pesar de que las primeras fueron obtenidas a partir de un rbol de mayor tamao, son menos que la cantidad de reglas obtenidas a partir del segundo rbol. Sin embargo, la performance sobre los datos de prueba fue igual en ambos casos.
Resultados
Magdalena Servente
157
5.4.5. Elita
5.4.5.1. Utilizando la ganancia como criterio de decisin
rbol de decisin
distancia_jupiter <= 0.2 : resonancia > 5.42 : EOS (45.0/1.0) resonancia <= 5.42 : distancia_jupiter <= 0.18 : THEMIS (45.0) distancia_jupiter > 0.18 : KORONIS (24.0) distancia_jupiter > 0.2 : resonancia <= 11.51 : FLORA (103.0/1.0) resonancia > 11.51 : distancia_jupiter <= 0.24 : MARIA (13.0) distancia_jupiter > 0.24 : PHOCAEA (23.0)
Estimacin (4.2%)
Estimacin (4.2%)
Evaluacin general:
Clase EOS Clase FLORA Clase KORONIS Clase MARIA Clase PHOCAEA Clase THEMIS
158
Magdalena Servente
Resultados
Reglas de decisin
Regla 1 SI resonancia <= 5.42 Y distancia_jupiter <= 0.18 ENTONCES Familia = THEMIS Regla 2 SI distancia_jupiter > 0.18 Y distancia_jupiter <= 0.2 ENTONCES Familia = KORONIS Regla 5 SI resonancia > 11.51 Y distancia_jupiter <= 0.24 ENTONCES Familia = MARIA [89.9%] Regla 6 SI resonancia > 11.51 Y distancia_jupiter > 0.24 ENTONCES Familia = PHOCAEA Regla 3 SI resonancia > 5.42 Y distancia_jupiter <= 0.2 ENTONCES Familia = EOS [94.3%] Regla 4 SI resonancia <= 11.51 Y distancia_jupiter > 0.2 ENTONCES Familia = FLORA Regla 7 Familia = FLORA
[97.0%]
[94.4%]
[94.2%]
[97.5%]
Usada 45 24 13 23 45 103
Regla 1 2 5 6 3 4
Resultados
Tamao 2 2 2 2 2 2
Usada 22 12 8 11 21 53
Magdalena Servente
Clase EOS Clase FLORA Clase KORONIS Clase MARIA Clase PHOCAEA Clase THEMIS
distancia_jupiter <= 0.2 : resonancia > 5.42 : EOS (45.0/1.0) resonancia <= 5.42 : distancia_jupiter <= 0.18 : THEMIS (45.0) distancia_jupiter > 0.18 : KORONIS (24.0) distancia_jupiter > 0.2 : resonancia <= 11.51 : FLORA (103.0/1.0) resonancia > 11.51 : distancia_jupiter <= 0.24 : MARIA (13.0) distancia_jupiter > 0.24 : PHOCAEA (23.0)
Estimacin (4.2%)
Estimacin (4.2%)
160
Magdalena Servente
Resultados
Evaluacin general:
Clase EOS Clase FLORA Clase KORONIS Clase MARIA Clase PHOCAEA Clase THEMIS
Reglas de decisin
Regla 1 SI resonancia <= 5.42 Y distancia_jupiter <= 0.18 ENTONCES Familia = THEMIS Regla 2 SI distancia_jupiter > 0.18 Y distancia_jupiter <= 0.2 ENTONCES Familia = KORONIS Regla 5 SI resonancia > 11.51 Y distancia_jupiter <= 0.24 ENTONCES Familia = MARIA [89.9%] Regla 6 SI resonancia > 11.51 Y distancia_jupiter > 0.24 ENTONCES Familia = PHOCAEA Regla 3 SI resonancia > 5.42 Y distancia_jupiter <= 0.2 ENTONCES Familia = EOS [94.3%] Regla 4 SI resonancia <= 11.51 Y distancia_jupiter > 0.2 ENTONCES Familia = FLORA Regla 7 Familia = FLORA
[97.0%]
[94.4%]
[94.2%]
[97.5%]
Regla 1 2 5 6
Resultados
Tamao 2 2 2 2
Usada 45 24 13 23
Magdalena Servente
5.70% 2.50%
45 103
Usada 22 12 8 11 21 53
Clase EOS Clase FLORA Clase KORONIS Clase MARIA Clase PHOCAEA Clase THEMIS
5.4.5.3. Conclusiones
En este caso, tanto los rboles como las reglas obtenidas son iguales si se utiliza la ganancia o la proporcin de ganancia como criterio de decisin. Los rboles son pequeos y poco frondosos, lo cual facilita su comprensin. Adems, no clasifican ningn ejemplo errneamente en los datos de prueba.
Las reglas de decisin generadas, tambin son pocas, lo cual hace que su lectura sea ms comprensible. Y clasifican slo un caso errneamente sobre los datos de entrenamiento. Por lo tanto, podemos decir que tanto los rboles como las reglas obtenidas en este dominio constituyen un buen clasificador.
Analicemos la diferencia entre trabajar con atributos discretos y con atributos continuos. Cuando trabajamos con atributos discretos y elegimos un atributo para dividir el conjunto en la raz, este atributo no participa en las divisiones posteriores. Es decir, como hay una rama descendiente de ese nodo para cada uno de los valores del atributo, todos los subconjuntos posteriores tienen un nico valor para ese atriburo, con lo cual, nunca ofrecer una mayor ganancia o proporcin de ganancia que los dems atributos. Por lo tanto, no existir otro nodo, descendiente del anterior, que utilice a dicho atributo como prueba de valor. En cambio, cuando un atributo continuo se utiliza como prueba de valor en un nodo, el
162 Magdalena Servente Resultados
C4.5 divide a los datos de acuerdo al resultado de la mejor binarizacin, con lo cual, la prueba de valor realizada en el nodo es una pregunta acerca de si el valor del atributo supera o no un determinado umbral. Puede utilizarse, no obstante, el mismo atributo para dividir los datos en un nodo hijo, variar el valor umbral por el que se realiza la binarizacin. Lo mismo ocurre con los antecedentes en las reglas de decisin. Observemos que este fenmeno se presenta tanto en los rboles como en las reglas de decisin obtenidos en este caso, ya que la prueba de valor distancia_jupiter se repite en nodos padres e hijos, y est presente en ms de un antecedente en las reglas de decisin.
5.4.6. Hipotiroidismo
5.4.6.1. Utilizando la ganancia como criterio de decisin
rbol de decisin
TSH <= 6 : negativo (2246.8/1.0) TSH > 6 : FTI <= 64 : Medicin T4U = f: Medicin TSH = f: negativo (4.1) Medicin TSH = v: hipotiroide compensado (4.5/2.1) Medicin T4U = v: Ciruga tirodea = v: negativo (3.0/1.0) Ciruga tirodea = f: Sexo = F: hipotiroide primario (41.4) Sexo = M: Fuente de referencia = WEST: hipotiroide primario (0.0) Fuente de referencia = STMW: hipotiroide primario (0.0) Fuente de referencia = SVHC: hipotiroide primario (0.0) Fuente de referencia = SVI: hipotiroide primario (7.3) Fuente de referencia = SVHD: hipotiroide primario (0.0) Fuente de referencia = otros: TT4 <= 46 : hipotiroide primario (8.3) TT4 > 46 : negativo (2.2/1.0) FTI > 64 : Toma tiroxina = v: negativo (35.2) Toma tiroxina = f: Medicin TSH = f: negativo (21.2) Medicin TSH = v: TT4 > 150 : negativo (6.1/0.1) TT4 <= 150 : Ciruga tirodea = v: negativo (3.7) Ciruga tirodea = f: Medicin T4U = v: hipotiroide compensado (120.0) Medicin T4U = f:[S1]
Subrbol [S1] Fuente Fuente Fuente Fuente Fuente Fuente de de de de de de referencia referencia referencia referencia referencia referencia = = = = = = WEST: hipotiroide compensado (0.0) STMW: hipotiroide primario (1.4) SVHC: hipotiroide compensado (0.0) SVI: hipotiroide primario (3.6/1.5) SVHD: hipotiroide compensado (0.0) otros: hipotiroide compensado (5.1)
Resultados
Magdalena Servente
163
rbol simplificado:
TSH <= 6 : negativo (2246.8/2.6) TSH > 6 : FTI <= 64 : Medicin T4U = f: Medicin TSH = f: negativo (4.1/1.2) Medicin TSH = v: hipotiroide compensado (4.5/3.3) Medicin T4U = v: Ciruga tirodea = f: hipotiroide primario (59.2/2.9) Ciruga tirodea = v: negativo (3.0/2.1) FTI > 64 : Toma tiroxina = v: negativo (35.2/1.4) Toma tiroxina = f: Medicin TSH = f: negativo (21.2/1.3) Medicin TSH = v: TT4 > 150 : negativo (6.1/1.4) TT4 <= 150 : Ciruga tirodea = f: hipotiroide compensado (130.2/5.7) Ciruga tirodea = v: negativo (3.7/1.2)
Estimacin (0.9%)
Estimacin (0.9%)
Evaluacin general:
Clasificad o como hipertiroid e Clase hipertiroide 0 Clase hipotiroide 0 primario Clase hipotiroide 0 compensado Clase hipotiroide 0 secundario Clase negativo 0
164
Magdalena Servente
Resultados
Reglas de decisin
Regla 12 SI Toma tiroxina = f Y Ciruga tirodea = f Y TSH > 6 Y TT4 <= 150 Y FTI > 64 ENTONCES clase = hipotiroide compensado Regla 1 SI TSH <= 6 ENTONCES clase = negativo [99.9%]
[98.9%]
Regla 15 SI Toma tiroxina = v Y FTI > 64 ENTONCES clase = negativo Regla 9 SI Medicin TSH = f ENTONCES clase = negativo Regla 14 SI TT4 > 150 ENTONCES clase = Regla 8 SI Ciruga tirodea = v ENTONCES clase = negativo Regla 4
[99.5%]
[99.5%]
negativo
[99.4%]
[92.7%]
SI Ciruga tirodea = f Y TSH > 6 Y FTI <= 64 ENTONCES clase = hipotiroide primario Regla 11 SI Medicin T4U = f Y Fuente de referencia = SVI Y TSH > 6 ENTONCES clase = hipotiroide primario Regla 16 Clase = hipotiroide compensado
[95.6%]
[35.2%]
Regla Tamao Error 12 5 1.10% 1 1 0.10% 15 2 0.50% 9 1 0.50% 14 1 0.60% 8 1 7.30% 4 3 4.40% 11 3 64.80% Probadas 2514, errores 9 (0.4%)
Clase hipotiroide compensado negativo negativo negativo negativo negativo hipotiroide primario hipotiroide primario
Resultados
Magdalena Servente
165
Regla Tamao Error 12 5 1.10% 1 1 0.10% 15 2 0.50% 9 1 0.50% 14 1 0.60% 8 1 7.30% 4 3 4.40% 11 3 64.80% Probadas 1258, errores 6 (0.5%)
Clase hipotiroide compensado negativo negativo negativo negativo negativo hipotiroide primario hipotiroide primario
Clasificado como hipertiroide Clase hipertiroide Clase hipotiroide primario Clase hipotiroide compensado Clase hipotiroide secundario Clase negativo 0 0 0 0 0
Clasificado como Clasificado como Clasificado hipotiroide hipotiroide como primario compensado hipotiroide secundario 0 0 0 30 1 0 1 0 64 0 2 0 0 0 0
TSH <= 6 : negativo (2246.8/1.0) TSH > 6 : FTI <= 64 : Medicin TSH = f: negativo (4.3) Medicin TSH = v: Medicin T4U = f: hipotiroide compensado (4.5/2.1) Medicin T4U = v: Ciruga tirodea = f: hipotiroide primario (59.0/1.0) Ciruga tirodea = v: negativo (3.0/1.0) FTI > 64 : Toma tiroxina = v: negativo (35.2) Toma tiroxina = f: Medicin TSH = f: negativo (21.2) Medicin TSH = v: Ciruga tirodea = v: negativo (3.7) Ciruga tirodea = f: TT4 > 150 : negativo (6.1/0.1) TT4 <= 150 : Medicin TT4 = f: hipotiroide primario (2.8/0.7) Medicin TT4 = v: hipotiroide compensado (127.4/1.5)
166
Magdalena Servente
Resultados
Estimacin (0.9%)
Estimacin (0.9%)
Evaluacin general:
Clasificado como hipertiroide Clase hipertiroide Clase hipotiroide primario Clase hipotiroide compensado Clase hipotiroide secundario Clase negativo 0 0 0 0 0
Clasificado como Clasificado como Clasificado como hipotiroide hipotiroide hipotiroide compensado primario secundario 0 0 0 28 1 0 1 2 64 0 2 0 0 0 0
Reglas de decisin
Regla 7 SI Toma tiroxina = f Y Ciruga tirodea = f Y TSH > 6 Y TT4 <= 150 Y FTI > 64 ENTONCES clase = hipotiroide compensado Regla 4 SI Ciruga tirodea = f Y TSH > 6 Y FTI <= 64 ENTONCES clase = hipotiroide primario Regla 6 SI Toma tiroxina = f Y Medicin TT4 = f Y TSH > 6 ENTONCES clase = hipotiroide primario Resultados
[98.9%]
[95.6%]
[45.3%] 167
Magdalena Servente
Regla 10 SI Toma tiroxina = v Y FTI > 64 ENTONCES clase = negativo Regla 2 SI Medicin TSH = f Y ENTONCES clase = Regla 8 SI TT4 > 150 ENTONCES clase = Regla 5 SI Ciruga tirodea = v ENTONCES clase = negativo negativo
[99.5%]
negativo
[99.5%]
[99.4%]
[92.7%]
Regla Tamao Error 7 5 1.10% 4 3 4.40% 6 3 54.70% 1 1 0.10% 10 2 0.50% 2 1 0.50% 8 1 0.60% 5 1 7.30% Probadas 2514, errores 8 (0.3%)
Clase hipotiroide compensado hipotiroide primario hipotiroide primario negativo negativo negativo negativo negativo
Regla Tamao Error 7 5 1.10% 4 3 4.40% 6 3 54.70% 1 1 0.10% 10 2 0.50% 2 1 0.50% 8 1 0.60% 5 1 7.30% Probadas 1258, errores 8 (0.6%)
Errores Ventaja 2(3.40%) 0(0|0) 1(3.40%) 28(28|0) 1(100.00%) -1(0|1) 1(0.10%) 816(816|0) 0(0.00%) 20(20|0) 0(0.00%) 106(106|0) 0(0.00%) 3(3|0) 1(20.00%) 4(4|0)
Clase hipotiroide compensado hipotiroide primario hipotiroide primario negativo negativo negativo negativo negativo
168
Magdalena Servente
Resultados
Clasificado como hipertiroide Clase hipertiroide Clase hipotiroide primario Clase hipotiroide compensado Clase hipotiroide secundario Clase negativo 0 0 0 0 0
Clasificado como Clasificado como Clasificado hipotiroide hipotiroide como primario compensado hipotiroide secundario 0 0 0 28 1 0 1 2 64 0 2 0 0 0 0
5.4.6.3. Conclusiones
El rbol de decisin obtenido utilizando la ganancia sin simplificar tiene mayor tamao que el obtenido utilizando la proporcin de ganancia. No obstante, al simplificar el primer rbol se obtiene un rbol ms pequeo que ambos. En cuanto a la proporcin de error, es igual para el rbol generado utilizando la ganancia y el generado utilizando la proporcin de ganancia. Por lo tanto, podramos afirmar que el tamao no parece estar relacionado con la performance.
En cuanto a las reglas de decisin, en ambos casos se obtuvieron nueve reglas. La proporcin de error observada en las reglas generadas utilizando la ganancia, es la menor de todas las observadas para este dominio.
Mg <= 1 : Ca <= 9 : Al > 2 : contenedores (2.0) Al <= 2 : Al > 1 : lamparitas (12.0/1.0) Al <= 1 : Ba > 0 : lamparitas (4.0) Ba <= 0 : Na <= 13 : lamparitas (2.0) Na > 13 : vajilla (3.0) Ca > 9 : Al <= 0 : vidrios_para_construcciones_no_float (4.0/1.0) Al > 0 : Si <= 72 : vidrios_para_construcciones_no_float (6.0/1.0) Si > 72 : contenedores (4.0) Mg > 1 : Ca <= 7 : Ca <= 6 : contenedores (2.0/1.0) Resultados Magdalena Servente 169
Ca > 6 : vidrios_para_construcciones_no_float (13.0/1.0) Ca > 7 : Mg <= 2 : Na <= 12 : vidrios_para_construcciones_no_float (4.0/1.0) Na > 12 : vidrios_float_para_construcciones (5.0/3.0) Mg > 2 : Si > 72 : vidrios_float_para_construcciones (21.0/6.0) Si <= 72 : Al <= 0 : vidrios_float_para_construcciones (13.0/4.0) Al > 0 : Si <= 71 : vidrios_float_para_construcciones (6.0/2.0) Si > 71 : vidrios_para_construcciones_no_float (42.0/23.0)
rbol simplificado
Mg <= 1 : Ca <= 9 : Al > 2 : contenedores (2.0/1.0) Al <= 2 : Al > 1 : lamparitas (12.0/2.5) Al <= 1 : Ba > 0 : lamparitas (4.0/1.2) Ba <= 0 : Na <= 13 : lamparitas (2.0/1.0) Na > 13 : vajilla (3.0/1.1) Ca > 9 : Al <= 0 : vidrios_para_construcciones_no_float (4.0/2.2) Al > 0 : Si <= 72 : vidrios_para_construcciones_no_float (6.0/2.3) Si > 72 : contenedores (4.0/1.2) Mg > 1 : Ca > 7 : vidrios_float_para_construcciones (91.0/48.8) Ca <= 7 : Ca <= 6 : contenedores (2.0/1.8) Ca > 6 : vidrios_para_construcciones_no_float (13.0/2.5)
Estimacin (45.8%)
Estimacin (45.8%)
170
Magdalena Servente
Resultados
Evaluacin general:
Clase vidrios_float_para_ construcciones Clase vidrios_para_constr ucciones_no_float Clase vidrios_float_para_ vehiculos Clase vidrios_para_vehc ulos_no_float Clase contenedores Clase vajilla Clase lamparitas
Clasificados Clasifica Clasifica dos como dos como contenedores como lamparit vajilla as 0 0 0
19
0 2 0
3 1 1
0 0 0
0 0 0
1 0 1
0 0 0
0 0 8
Reglas de decisin
Regla 8 SI Al > 0 Y Si > 72 Y Ca > 9 ENTONCES clase = Regla 5 SI Al > 2 ENTONCES clase = Regla 2 SI Na > 13 Y Mg <= 1 Y Al <= 1 Y Ca <= 9 Y Ba <= 0 ENTONCES clase = Regla 3 SI Al <= 2 Y Ca <= 9 Y Ba > 0 ENTONCES clase = Regla 4 SI Mg <= 1 Y Al > 1 Y Al <= 2 Y Ca <= 9 ENTONCES clase = Regla 1 SI Na <= 13 Y Mg <= 1 Y Al <= 1 Y Ca <= 9 ENTONCES clase = contenedores [63.0%]
contenedores
[70.7%]
vajilla
[63.0%]
lamparitas
[84.1%]
lamparitas
[79.4%]
lamparitas
[50.0%]
Resultados
Magdalena Servente
171
Regla 10 SI Mg > 1 Y Ca > 6 Y Ca <= 7 ENTONCES clase = Regla 7 SI Mg <= 1 Y Si <= 72 Y Ca > 9 ENTONCES clase = Regla 14 SI Mg > 2 Y Ca > 7 ENTONCES clase =
vidrios_para_construcciones_no_float
[80.9%]
vidrios_para_construcciones_no_float
[66.2%]
vidrios_float_para_construcciones
[48.0%]
Regla Tamao Error Usada 8 3 29.30% 4 5 1 37.00% 3 2 5 37.00% 3 3 3 15.90% 8 4 4 20.60% 9 1 4 50.00% 2 10 3 19.10% 13 7 3 33.80% 7 14 2 52.00% 82 Probadas 143, errores 48 (33.6%)
Errores 0(0.00%) 0(0.00%) 0(0.00%) 0(0.00%) 1(11.10%) 0(0.00%) 1(7.70%) 1(14.30%) 39(47.60%)
Ventaja 4(4|0) 3(3|0) 3(3|0) 5(5|0) 8(8|0) 2(2|0) 0(0|0) 0(0|0) 16(43|27)
Clase contenedores contenedores vajilla lamparitas lamparitas lamparitas vidrios_para_construcciones_no_float vidrios_para_construcciones_no_float vidrios_float_para_construcciones
Regla Tamao Error Usada 8 3 29.30% 1 3 3 15.90% 6 4 4 20.60% 3 10 3 19.10% 4 7 3 33.80% 6 14 2 52.00% 42 Probadas 71, errores 30 (42.3%)
172
Magdalena Servente
Resultados
Clase vidrios_float_para_ construcciones Clase vidrios_para_constr ucciones_no_float Clase vidrios_float_para_ vehiculos Clase vidrios_para_vehc ulos_no_float Clase contenedores Clase vajilla Clase lamparitas
15
10
0 0 0
3 3 1
0 0 0
0 0 0
1 0 0
0 0 0
0 0 9
Mg <= 1 : Ca <= 9 : Al > 2 : contenedores (2.0) Al <= 2 : Al > 1 : lamparitas (12.0/1.0) Al <= 1 : Ba > 0 : lamparitas (4.0) Ba <= 0 : Na <= 13 : lamparitas (2.0) Na > 13 : vajilla (3.0) Ca > 9 : Al <= 0 : vidrios_para_construcciones_no_float (4.0/1.0) Al > 0 : Si <= 72 : vidrios_para_construcciones_no_float (6.0/1.0) Si > 72 : contenedores (4.0) Mg > 1 : Ba > 0 : contenedores (2.0/1.0) Ba <= 0 : Mg <= 2 : Ca <= 8 : vidrios_para_construcciones_no_float (2.0) Ca > 8 : vidrios_float_para_construcciones (7.0/4.0) Mg > 2 : Ca <= 7 : vidrios_para_construcciones_no_float (13.0/1.0) Ca > 7 : Na > 13 : vidrios_float_para_construcciones (6.0/3.0) Na <= 13 : Si > 72 : vidrios_float_para_construcciones (21.0/6.0) Si <= 72 : Al <= 0 : vidrios_float_para_construcciones (7.0/1.0) Al > 0 :[S1] Subrbol [S1] Si <= 71 : vidrios_float_para_construcciones (6.0/2.0) Si > 71 : vidrios_para_construcciones_no_float (42.0/23.0) Resultados Magdalena Servente 173
rbol simplificado
Mg <= 1 : Ca <= 9 : Al > 2 : contenedores (2.0/1.0) Al <= 2 : Al > 1 : lamparitas (12.0/2.5) Al <= 1 : Ba > 0 : lamparitas (4.0/1.2) Ba <= 0 : Na <= 13 : lamparitas (2.0/1.0) Na > 13 : vajilla (3.0/1.1) Ca > 9 : Al <= 0 : vidrios_para_construcciones_no_float (4.0/2.2) Al > 0 : Si <= 72 : vidrios_para_construcciones_no_float (6.0/2.3) Si > 72 : contenedores (4.0/1.2) Mg > 1 : Ba > 0 : contenedores (2.0/1.8) Ba <= 0 : Ca <= 7 : vidrios_para_construcciones_no_float (13.0/2.5) Ca > 7 : vidrios_float_para_construcciones (91.0/48.8)
Antes de podar Tamao Errores 31 44 (30.8%) Evaluacin sobre los datos de prueba:
Estimacin (45.8%)
Estimacin (45.8%)
Evaluacin general:
Magdalena Servente
Resultados
0 2 0
3 1 1
0 0 0
0 0 0
1 0 1
0 0 0
0 0 8
Reglas de decisin
Regla 8 SI Al > 0 Y Si > 72 Y Ca > 9 ENTONCES clase = Regla 5 SI Al > 2 ENTONCES clase = Regla 2 SI Na > 13 Y Mg <= 1 Y Al <= 1 Y Ca <= 9 Y Ba <= 0 ENTONCES clase = Regla 3 SI Al <= 2 Y Ca <= 9 Y Ba > 0 ENTONCES clase = Regla 4 SI Mg <= 1 Y Al > 1 Y Al <= 2 Y Ca <= 9 ENTONCES clase = Regla 1 SI Na <= 13 Y Mg <= 1 Y Al <= 1 Y Ca <= 9 ENTONCES clase = Regla 11 SI Mg > 1 Y Ca <= 7 Y Ba <= 0 ENTONCES clase = Regla 7 SI Mg <= 1 Y Si <= 72 Y Ca > 9 ENTONCES clase = Regla 15 SI Mg > 2 Y Si > 72 Y Ca > 7 ENTONCES clase = Regla 10 SI Mg > 1 Y Ca > 8 ENTONCES clase = Resultados contenedores [63.0%]
contenedores
[70.7%]
vajilla
[63.0%]
lamparitas
[84.1%]
lamparitas
[79.4%]
lamparitas
[50.0%]
vidrios_para_construcciones_no_float
[80.9%]
vidrios_para_construcciones_no_float
[66.2%]
vidrios_float_para_construcciones
[61.7%]
[51.5%] 175
Regla 8 5 2 3 4 1 11
Tamao 3 1 5 3 4 4 3
Usada 4 3 3 8 9 2 13
33.80%
1(14.30%)
0(0|0)
15
38.30%
21
6(28.60%)
9(15|6)
10
48.50%
23
9(39.10%)
10(14|4)
Clase contenedores contenedores vajilla lamparitas lamparitas lamparitas vidrios_para_c onstrucciones_ no_float vidrios_para_c onstrucciones_ no_float vidrios_float_p ara_construccio nes vidrios_float_p ara_construccio nes
Regla 8 3 4 11
Tamao 3 3 4 3
Usada 1 6 3 4
33.80%
4(66.67%)
0(0|0)
15
38.30%
5(55.60%)
1(4|3)
10
48.50%
14
6(42.90%)
5(8|3)
Clase contenedores lamparitas lamparitas vidrios_para_c onstrucciones_ no_float vidrios_para_c onstrucciones_ no_float vidrios_float_p ara_construccio nes vidrios_float_p ara_construccio nes
176
Magdalena Servente
Resultados
Clase vidrios_float_para_ construcciones Clase vidrios_para_constr ucciones_no_float Clase vidrios_float_para_ vehiculos Clase vidrios_para_vehc ulos_no_float Clase contenedores Clase vajilla Clase lamparitas
19
0 2 1
3 1 0
0 0 0
0 0 0
1 0 0
0 0 0
0 0 9
5.4.7.3. Conclusiones
En este caso los modelos obtenidos utilizando la ganancia y la proporcin de ganancia son distintos, aunque el tamao de los rboles de decisin sea el mismo, y la diferencia en la cantidad de reglas obtenidas sea de una regla. Para ambos rboles de decisin el porcentaje de error sobre los datos de prueba es del 47.9%. Mientras que para los conjuntos de reglas de decisin es del 42.3%. Aunque en este segundo caso la performance sea mejor, no podemos afirmar que un clasificador con el 42% de error sea confiable.
Resultados
Magdalena Servente
177
50.00% 45.00% 40.00% 35.25% 35.00% 30.00% 25.00% 20.00% 15.00% 10.00% 5.00% 0.00% ID3-rbol- ID3-Reglas- ID3-rbol- ID3-Reglas- C4.5-rbolganancia ganancia proporcin proporcin ganancia de ganancia de ganancia Figura 5.1: Porcentajes de error obtenidos en el dominio Crditos C4.5C4.5-rbolC4.5Reglasproporcin Reglasganancia de ganancia proporcin de ganancia 35.25% 35.25% 35.25% 35.29% 35.29% 43.10% 43.10%
Los rboles generados con el ID3 son similares a los generados con el C4.5 sin simplificar. La nica diferencia destacable es que la rama expresada en el ID3 como:
Otros_Creditos = DOS CREDITOS Composicin_Familiar = CASADO Y DOS HIJOS Ingreso = ENTRE 451 Y 550 Vivienda = ALQUILA NO Vivienda = PROPIA 0 IPVU Servicios = BASICOS Y TIC SI Servicios = BASICOS, TIC Y TEL NO
Se simplific en el C4.5 a:
Otros Creditos = DOS CREDITOS: Composicin Familiar = CASADO Y DOS HIJOS: Ingreso = ENTRE 451 Y 550: NO (4.0/1.0)
Notemos que de los cuatro casos clasificados en el C4.5 por esta rama, slo uno se clasifica errneamente, y el rbol es ms claro.
En este caso, el modelo ms simple es el presentado por los rboles de decisin simplificados generados por el C4.5: representan en un rbol de decisin que tiene nicamente una raz y tres hojas aquello que los rboles generados por el ID3 representan en un rbol de tamao 26 y con una mayor proporcin de error. El modelo ms simple, ayuda a destacar los atributos importantes del problema, y, por lo tanto, a
178 Magdalena Servente Resultados
entenderlo ms profundamente. No obstante, es el que mayor proporcin de error tuvo en la prctica. Entonces, antes de decidirnos por un modelo, debemos analizar la relacin simplicidad - proporcin de error.
Analicemos los tamaos de los modelos obtenidos. La figura 5.2 compara los tamaos de los rboles de decisin obtenidos para el dominio Crditos. La figura 5.3 compara la cantidad de reglas de decisin obtenidas con cada algoritmo.
Del anlisis de estos dos grficos anteriores vemos que los modelos generados para este dominio por el C4.5 fueron ms pequeos y, por lo tanto, ms comprensibles que los generados por el ID3. Si tuviramos que elegir un modelo entre estos cuatro para representar al dominio, eligiramos las reglas generadas por el C4.5, ya que son ms simples que las generadas por el ID3 y tienen una proporcin de error similar.
Resultados
Magdalena Servente
179
5.5.2. Cardiologa
La figura 5.4 muestra los porcentajes de error obtenidos con cada uno de los mtodos para el dominio Cardiologa. Vemos que todos los porcentajes se encuentran entre el 6.45% y el 6.50%. Con lo cual, no hay ningn modelo que sea claramente superior que otro en este aspecto.
6.45%
6.45%
6.45%
6.45%
6.50%
6.50%
6.50%
6.50%
Las figuras 5.5 y 5.6 comparan los tamaos de los modelos obtenidos. Vemos que la cantidad de reglas obtenidas con el ID3 es el doble de la cantidad de reglas obtenidas con el C4.5. En el caso de los rboles de decisin, el tamao de los rboles obtenidos con el C4.5 es menor que la mitad del tamao de los rboles obtenidos con el ID3.
180
ID 3
30 25 20 15 10 5 0
14 7
14 7
ID3-Reglasganancia
C4.5-Reglasganancia
Analizando los rboles de decisin obtenidos para este dominio, podemos deducir que esta diferencia en tamaos se debe a que el ID3 ajusta el rbol de decisin para cubrir todos y cada uno de los datos de entrada, mientras que cada hoja de un rbol generado con el C4.5 cubre una distribucin de casos y puede contener errores. Veamos, por ejemplo, los rboles obtenidos utilizando la ganancia con ambos algoritmos. En el caso de DURACION_DEL_ANGOR = MENOS DE 30 MIN, en el rbol obtenido con el C4.5 nos encontramos con una hoja, que cubre 33 casos, 1 slo incorrectamente. Mientras que en el rbol obtenido con el ID3, nos encontramos con un subrbol de tamao 10, este subrbol tambin cubre 33 casos, ninguno incorrectamente. Ambos rboles tienen proporciones de errores similares. Cabe entonces preguntarnos si no es ms conveniente tener hoja con un 3.03% de error en lugar de un subrbol que cubra todos los casos, sin ningn error. Recordemos que la performance general de ambos rboles frente a los datos de prueba fue muy similar.
5.5.3. Votaciones
La figura 5.7 presenta los porcentajes de error obtenidos para el dominio de Votaciones. Vemos que con el ID3 el porcentaje de error ronda el 5.20%, mientras que con el C4.5, el porcentaje de error es ms bajo en el caso de ambos rboles de decisin y de las reglas utilizando la ganancia. Esto es destacable ya que si analizamos las figuras 5.8 y 5.9, que presentan el tamao de los modelos obtenidos, vemos que los modelos obtenidos con el C4.5 son mucho menores que los obtenidos con el ID3. Si a esto le agregamos el hecho de que el porcentaje de error en tres de los modelos es menor, podemos concluir que en este caso la performance del C4.5 es mejor que la del ID3.
Podemos preguntarnos a qu se debe la diferencia en los tamaos de los modelos generados con el ID3 y con el C4.5. Tomemos, por ejemplo, los rboles de decisin. En el caso de los rboles generados utilizando la ganancia, los atributos elegidos por el ID3 y por el C4.5 para realizar la particin de los datos son los mismos. Sin embargo, recordemos que cada hoja del C4.5 cubre una distribucin de casos (an en los rboles sin simplificar), entonces el rbol resultante es ms simple.
Resultados
Magdalena Servente
181
5.19%
5.19%
5.19%
5.20%
ID 3
40 30 20 10 0
34
35
ID3-Reglasganancia
C4.5-Reglasganancia
70 60 50 40 30 20 10 0
57
58
ID3-rbolganancia
C4.5-rbolganancia
A continuacin, en las figuras 5.10 y 5.11 se presentan ambos rboles de decisin y se pueden apreciar las simplificaciones realizadas por el C4.5.
182
Magdalena Servente
Resultados
Cong_honorarios_medicos = a_favor Reduccion_corp_Synfuels = a_favor Export_sin_impuestos = a_favor democrata Export_sin_impuestos = desconocido republicano Export_sin_impuestos = en_contra Presupuesto_de_educacion = a_favor Der_demanda_Superfund = a_favor Particip_proy_agua = a_favor republicano Particip_proy_agua = en_contra Acta_sudaf_admin_export = a_favor republicano Acta_sudaf_admin_export = desconocido republicano Acta_sudaf_admin_export = en_contra Nios discapacitados = a_favor republicano Nios discapacitados = en_contra democrata Der_demanda_Superfund = en_contra Democrata (1) Presupuesto_de_educacion = desconocido democrata Presupuesto_de_educacion = en_contra Acta_sudaf_admin_export = a_favor Adop_resolucion_presup = a_favor republicano Adop_resolucion_presup = en_contra Ayuda_a_El_Salvador = a_favor republicano Ayuda_a_El_Salvador = en_contra democrata Acta_sudaf_admin_export = desconocido democrata Acta_sudaf_admin_export = en_contra Democrata (2) Reduccion_corp_Synfuels = desconocido republicano Reduccion_corp_Synfuels = en_contra Export_sin_impuestos = a_favor Inmigracion = a_favor republicano Inmigracion = en_contra Acta_sudaf_admin_export = a_favor democrata Acta_sudaf_admin_export = desconocido Particip_proy_agua = a_favor republicano Particip_proy_agua = en_contra democrata Acta_sudaf_admin_export = en_contra republicano Export_sin_impuestos = desconocido republicano Export_sin_impuestos = en_contra Adop_resolucion_presup = a_favor Acta_sudaf_admin_export = a_favor republicano Acta_sudaf_admin_export = desconocido Nios discapacitados = a_favor republicano Nios discapacitados = en_contra democrata Adop_resolucion_presup = en_contra Republicano (3) Cong_honorarios_medicos = desconocido Misil_mx = a_favor Prohib_pruebas_anti_satel = a_favor democrata Prohib_pruebas_anti_satel = desconocido democrata Prohib_pruebas_anti_satel = en_contra Republicano (4) Misil_mx = desconocido republicano Resultados Magdalena Servente 183
Misil_mx = en_contra democrata Cong_honorarios_medicos = en_contra Presupuesto_de_educacion = a_favor democrata Presupuesto_de_educacion = desconocido Adop_resolucion_presup = a_favor democrata Adop_resolucion_presup = en_contra republicano Presupuesto_de_educacion = en_contra Democrata
(5)
Figura 5.10: rbol generado por el ID3 para el dominio Votaciones utilizando la ganancia
cong_honorarios_medicos = en_contra: democrata (168.0/1.0) cong_honorarios_medicos = a_favor: reduccion_corp_Synfuels = en_contra: republicano (97.0/3.0) reduccion_corp_Synfuels = desconocido: republicano (4.0) reduccion_corp_Synfuels = a_favor: export_sin_impuestos = a_favor: democrata (2.0) export_sin_impuestos = desconocido: republicano (1.0) export_sin_impuestos = en_contra: presupuesto_de_educacin = a_favor: republicano (13.0/2.0) presupuesto_de_educacin = en_contra: democrata (5.0/2.0) presupuesto_de_educacin = desconocido: democrata (1.0) cong_honorarios_medicos = desconocido: misil_mx = a_favor: democrata (4.0/1.0) misil_mx = en_contra: democrata (3.0) misil_mx = desconocido: republicano (2.0)
(5) (3)
(1) (2)
(4)
Figura 5.11: rbol generado por el C4.5 para el dominio Votaciones utilizando la ganancia
En el caso (1), podemos observar que el subrbol de tamao 10 generado por el ID3, se represent en el C4.5 con una hoja que cubre 13 casos, dos incorrectamente. En el caso (2), el C4.5 presenta una hoja que cubre 5 casos, dos de ellos errneamente, mientras que el ID3 presenta un subrbol de tamao 8. En el caso (3), el subrbol presentado por el ID3 es de tamao 17 y la hoja presentada en el mismo caso por el C4.5 clasifica 3 casos errrneamente de los 97 que cubre. La diferencia en el caso (4) no es tan notable, ya que el C4.5 representa en una hoja con N=4 y E=2, lo que el ID3 presenta en un nodo de decisin con tres hojas hijas. Finalmente, en el caso (5), el C4.5 se equivoca una sola vez en los 168 casos que cubre la hoja, mientras que el ID3 los clasifica a todos correctamente con un subrbol de tamao 6.
El ID3 no generaliza los resultados de una hoja, es decir, no permite que una hoja cubra casos de una clase distinta a la expresada. Por lo tanto, cubre exhaustivamente todos los casos de entrenamiento. Mientras que la generalizacin realizada por el C4.5 permite obtener rboles ms pequeos a un precio que parece ser no tan alto. Pensemos que, muchas veces es preferible tener una hoja con performance del 96.9%, como en el caso (3), que un rbol de tamao 17. Este fenmeno que ocurre en los rboles generados por el ID3 y, como consecuencia lgica, tambin en las reglas generadas por el mismo sistema, se conoce como sobreajuste. Como su nombre lo indica, se origina en que el ID3 cubre absolutamente todos los casos de entrenamiento correctamente, ajusta el modelo a todos los casos de entrenamiento.
184 Magdalena Servente Resultados
Existen muchas maneras de solucionar el sobreajuste. Podramos, por ejemplo, realizar una poda del rbol cuando un subrbol tenga una performance mayor a una cota predefinida, es decir, cuando (E*100)/N sea superior a una cota mnima de performance. Otra opcin sera realizar esta simplificacin y adjuntarle al rbol las reglas de decisin con las excepciones.
0.30%
0.30%
0.30%
0.00%
0.00%
0.00%
0.00%
En el caso de este dominio el porcentaje de error registrado con todos los clasificadores no supera el 1%, como lo muestra la figura 5.12. El mayor porcentaje de error se obtuvo con el rbol de decisin generado por el C4.5 utilizando la ganancia, y el menor, y ms destacable, se obtuvo utilizando el ID3 con la proporcin de ganancia. En este caso, todos los datos de entrenamiento fueron clasificados correctamente.
En caso de tener que optar entre alguno de los clasificadores generados, optaramos por los generados con el ID3 utilizando la proporcin de ganancia, ya que adems de no presentar errores, el tamao del rbol es aceptable, como lo muestra la figura 5.13. Mientras que la cantidad de reglas generadas en el mismo caso es superior a las generadas con el C4.5 utilizando la ganancia (figura 5.14), que tienen un porcentaje de error bajo.
Como se destac en las conclusiones particulares de este dominio para el ID3 (Seccin 5.3.4.3) y para el C4.5 (Seccin 5.4.4.3), vimos que la ganancia favoreci a atributos con muchos valores diferentes frente a otros atributos que generaban una mayor ganancia neta de informacin pero que tenan menos valores.
Resultados Magdalena Servente 185
ID 3
Este es un problema general de la ganancia y es una de las razones por las que se comenz a utilizar la proporcin de ganancia.
50 45 40 35 30 25 20 15 10 5 0
44 32 25 25
ID3-rbolganancia
C4.5-rbolganancia
ID3-rbolproporcin de ganancia
C4.5-rbolproporcin de ganancia
Figura 5.13: Tamao de los rboles de decisin obtenidos en el dominio Estudio sobre hongos
30 25 20 15 10 5 0
26 19 13 15
ID3-Reglasganancia
C4.5-Reglasganancia
ID3-Reglasproporcin de ganancia
C4.5-Reglasproporcin de ganancia
Figura 5.14: Cantidad de reglas de decisin obtenidas en el dominio Estudio sobre hongos
Si comparamos los rboles obtenidos en cada caso, veremos que en los rboles generados con el C4.5 existen muchas ramas en las que N=E=0. Es decir, ramas que no cubren ningn caso, pero que existen porque el C4.5 toma la informacin de dominio y tiene en cuenta esos posibles valores al analizar la ganancia y la proporcin de ganancia en todos los casos. El ID3, en cambio, no tiene en cuenta informacin de dominio, entonces, trabaja con la hiptesis de que los nicos valores vlidos para los atributos son aquellos que ocurren en los datos.
186
Magdalena Servente
Resultados
60.00%
50.00%
40.00%
30.00%
20.00%
Vidrios
10.00%
0.00% ID3-rboles- ID3-reglas- ID3-rboles- ID3-reglasganancia ganancia proporcin proporcin de ganancia de ganancia C4.5rbolesganancia C4.5-reglasganancia C4.5-reglasC4.5proporcin rbolespropocin de ganancia de ganancia
Figura 5.15: Porcentaje de error obtenido para cada uno de los mtodos en cada dominio de datos
En la figura 5.16 se han eliminado estos dos dominios para poder analizar ms claramente el porcentaje de error en el resto de los dominios. A partir de estos dos grficos, podramos decir que no hay un mtodo4 que genere un modelo claramente superior al resto para todos los dominios. Al contrario, podramos decir que el porcentaje de error en todos los casos no parece depender del mtodo utilizado sino del dominio analizado. Es decir, el rango de porcentajes de error dentro de cada uno de los dominios parecera estar acotado.
En este caso, por mtodo nos referimos a la combinacin de un algoritmo (ID3 o C4.5) utilizando ganancia o proporcin de
ganancia y generando un rbol o reglas de decisin (combinacin algoritmo criterio de decisin tipo de resultado).
Resultados
Magdalena Servente
187
7.00%
6.00%
1.00%
0.00% ID3-rbolesganancia ID3-reglasganancia ID3-rboles- ID3-reglasproporcin proporcin de ganancia de ganancia C4.5rbolesganancia C4.5-reglasganancia C4.5-reglasC4.5proporcin rbolespropocin de ganancia de ganancia
Figura 5.16: Porcentaje de error obtenido para cada uno de los mtodos en distintos dominios de datos
A pesar de lo que muestra el grfico no podemos afirmar que la relacin menor porcentaje de error a mayor cantidad de datos de entrenamiento sea una regla absoluta que se cumple siempre. Para ello, habra que hacer una cantidad de pruebas que excede los alcances de este trabajo.
188
Magdalena Servente
Resultados
60.00%
C4.5-rboles-ganancia
50.00%
C4.5-reglas-ganancia
Porcentaje de error
40.00%
C4.5-rboles-propocin de ganancia
30.00%
C4.5-reglas-proporcin de ganancia
20.00% ID3-rboles-ganancia 10.00% ID3-reglas-ganancia 0.00% 0 -10.00% Cantidad de datos de entrenam iento ID3-reglas-proporcin de ganancia 1000 2000 3000 4000 5000 6000 ID3-rboles-proporcin de ganancia
Figura 5.15: Porcentaje de error en funcin de la cantidad de datos de entrenamiento. Se ha agregado una lnea de tendencia logartmica para cada uno de los mtodos.
Resultados
Magdalena Servente
189
190
Magdalena Servente
Resultados
CAPTULO 6 CONCLUSIONES
En este captulo se presentan las conclusiones del trabajo realizado. Primero se destacan los conceptos ms importantes a tener en cuenta a la hora de aplicar algn mtodo como el ID3 y el C4.5 (Seccin 6.1.1). Luego, se analiza la bsqueda que realizan estos dos mtodos en el espacio de hiptesis (Seccin 6.1.2). Se extraen conclusiones a partir de los resultados obtenidos (Seccin 6.2) y se analiza la solucin propuesta (Seccin 6.3). Finalmente, se plantean mejoras y temas a tener en cuenta para continuar con el desarrollo de este tipo de algoritmos de aprendizaje aplicados a la Minera de Datos (Seccin 6.4).
El Aprendizaje de Conceptos puede verse como una bsqueda en un gran espacio de hiptesis predefinidas [Mitchell, 1997]. En el caso de la familia TDIDT este espacio de hiptesis, est constituido por todos los rboles de decisin posibles para los datos que se estn analizando.
Los datos ruidosos y faltantes pueden influir en la performance del algoritmo, y depende de cada mtodo en particular ser robusto o no ante estas situaciones.
Los algoritmos de aprendizaje son capaces de clasificar nuevos casos, nunca vistos para ellos, porque tienen un sesgo inductivo implcito, es decir, realizan alguna suposicin que les permite construir el modelo. En el caso de los algoritmos de la familia TDIDT, esta suposicin implcita se divide en dos:
1. Los datos sobre los que se construye el problema son representativos del dominio sobre el que se aplicar el modelo obtenido.
2. Las hiptesis (rboles de decisin en este caso) ms simples se prefieren sobre las hiptesis ms complejas, es decir, se aplica la Afeitadora de Occam.
Conclusiones Magdalena Servente 191
Si el espacio de hiptesis se extendiera hasta cubrir todos los casos posibles, se eliminara este sesgo inductivo. Sin embargo, trabajar con todos los rboles de decisin posibles para un conjunto de datos, no permitira realizar la clasificacin de un caso no presente en los datos de entrenamiento, ya que no sera clasificado por ningn rbol. Es decir, un modelo totalmente insesgado, no podra clasificar nuevos casos [Mitchell, 1997].
Recordemos que no cualquier problema de Minera de Datos es apto para ser analizado mediante los algoritmos de la familia TDIDT. Debe cumplirse que las instancias estn constituidas por pares atributovalor, y que los resultados de la funcin de clasificacin sean discretos. Adems, es conveniente que los algoritmos sean capaces de trabajar con atributos ruidosos y con atributos faltantes.
A medida que exploran el espacio de hiptesis, los algoritmos analizados mantienen una sola hiptesis actual y no todas aquellas consistentes con los datos analizados. Esto ocasiona que estos mtodos no sean capaces de representar todos los rboles consistentes con los datos de entrada.
Por otro lado, recordemos que estos mtodos no tienen vuelta atrs. Es decir, una vez que se seleccion un atributo como nodo del rbol, ste nunca se cambiar; los algoritmos no vuelven atrs para reconsiderar sus elecciones. Esto ocasiona que los algoritmos sean susceptibles de caer en un mximo local y que converjan a una solucin que no es globalmente ptima [Mitchell, 1997]. El C4.5 agrega un cierto grado de reconsideracin de sus elecciones en la postpoda que realiza.
Por ltimo, cabe destacar que el ID3 y el C4.5 utilizan todos los datos de entrenamiento en cada paso para elegir el mejor atributo; esta eleccin se realiza estadsticamente. Esto es favorable frente a otros mtodos de aprendizaje automtico que analizan los datos de entrada en forma incremental. El hecho de tener en cuenta todos los datos disponibles en cada paso, resulta en una bsqueda mucho menos sensible a errores en casos individuales.
192
Magdalena Servente
Conclusiones
Como lnea futura de trabajo, se propone analizar los datos de entrada con los cuatro mtodos (ID3 utilizando ganancia, ID3 utilizando proporcin de ganancia, C4.5 utilizando ganancia y C4.5 utilizando proporcin de ganancia) y elegir para el nuevo dominio, el modelo que presenta la menor proporcin de error. Teniendo en cuenta que si con el primer mtodo la proporcin de error es inaceptable, probablemente tambin sea inaceptable para el resto de los mtodos. En cuyo caso, convendra analizar el problema con otros mtodos de aprendizaje que enfoquen la resolucin del mismo desde otro ngulo.
La cantidad de datos presentada como entrada de los algoritmos debe ser la mayor posible, ya que los casos analizados parecen mostrar que proporcin de error disminuye a medida que la cantidad de datos de entrenamiento aumenta.
Cuestin 1:
Qu tipos de sistemas generan como resultado rboles de decisin? La familia de los Top Down Induction Trees (TDIDT) analiza datos previamente clasificados y genera rboles de induccin para los mismos. Nuestro anlisis se enfoc en dos algoritmos de dicha familia, el ID3 creado por Quinlan a mediados de los aos 80 [Quinlan, 1986] y el C4.5 creado por Quinlan unos aos ms tarde [Quinlan, 1993d]. Estos algoritmos generan como resultado rboles de decisin que pueden aplicarse tanto por un operador humano como por una mquina para clasificar nuevos casos.
Conclusiones
Magdalena Servente
193
Cuestin 2:
Qu condiciones deben cumplir los datos para que su anlisis con el ID3 o el C4.5 sea til y vlido? Como expresamos con anterioridad, no todos los datos son aptos para ser analizados con el ID3 y el C4.5. En lneas generales, estos algoritmos trabajan con problemas de clasificacin, es decir, problemas donde las instancias pertenecen o no a una clase. De esta manera, el rbol de decisin generado contiene en las hojas las distintas clases a las que pueden pertenecer los datos.
Cuestin 3:
Qu tan fcil es para un humano trabajar con estos algoritmos? Se plante el desarrollo de un ambiente integrado, en el que un usuario puede fcilmente aplicar estos dos algoritmos a bases de datos existentes. El usuario debe lidiar con una interface grfica mucho ms amigable de por s que la lnea de comandos, en donde, con una simple marca puede aplicar el ID3 o el C4.5 a la base de datos que seleccion previamente.
Cuestin 4:
Cules son los resultados del sistema? Adems, de producir los rboles de decisin, el sistema genera un conjunto de reglas de produccin que pueden aplicarse para clasificar nuevos casos. La interpretacin de este conjunto de reglas debe hacerse en orden: se leen hasta que el antecedente de alguna de las reglas satisfaga el caso en cuestin, entonces se lee el consecuente para obtener la clase. El sistema tambin presenta como resultado, la evaluacin de los modelos generados sobre un nuevo conjunto de datos de prueba.
Cuestin 5:
Cmo podemos medir la calidad de los resultados obtenidos? Una vez generado el modelo de decisin, el usuario puede elegir la opcin de evaluarlo contra un conjunto de datos de prueba, inditos para el sistema. Bsicamente, el sistema clasifica estos datos de prueba y compara las clases obtenidas contra las que debera haber obtenido, generando una matriz de clasificacin. De esta manera, se obtiene una medida de la calidad del sistema de informacin generado, bajo el supuesto que tanto los datos de entrenamiento como los de prueba sean representativos de la realidad a la cual el modelo de clasificacin generado se ver enfrentado una vez que entre en funcionamiento.
194
Magdalena Servente
Conclusiones
1.
Una de las consecuencias de particionar un conjunto de entrenamiento en numerosos subconjuntos es que cada subconjunto es pequeo. Por lo tanto, aquellos patrones tiles del subconjunto pueden tornarse indetectables por insuficiencia de datos.
2.
Si los atributos discretos varan en forma notable en sus valores, podemos estar seguros de que un criterio como la proporcin de ganancia los est evaluando de la mejor manera? La proporcin de ganancia mide la proporcin de informacin relevante a la clasificacin, que provee la divisin sobre la informacin producida por la divisin en s. El denominador crece rpidamente a medida que la cantidad de subconjuntos se incrementa, por lo cual, el estimador deja de ser efectivo al existir muchos valores para un atributo. Recordemos el ejemplo del clculo de la informacin de la divisin sobre la clave primaria de un conjunto de datos (Seccin 4.2.1.1.2)
Si deseamos reducir el nmero de resultados de un atributo multivaluado, debemos asociar uno o ms de sus valores en una coleccin de valores de atributos o grupo de valores. En los primeros trabajos sobre el tema [Hunt et al., 1966] la nica forma de agrupar valores era mediante la divisin binaria o binarizacin, como la realizada por el C4.5.
En lugar de realizar este tipo de divisin, los algoritmos podran asociar cada grupo de valores con una de las ramas en cantidad variable. En algunos dominios, la agrupacin de valores podra determinarse de acuerdo a los conocimientos sobre el dominio. De esta manera, adems de mejorar el manejo de atributos multivaluados, estaramos incorporando informacin previa al sistema. De no existir agrupaciones determinables de acuerdo al dominio, debera seguirse otro mtodo. Si un atributo tiene n valores, existen 2n-1-1 divisiones binarias no triviales de estos valores, entonces para un valor de n grande se hace imposible explorar todas estas combinaciones.
Conclusiones
Magdalena Servente
195
En cuanto al ID3, que no maneja atributos continuos, podra incorporrsele la binarizacin utilizada por el C4.5, o un mtodo similar, para que pueda trabajar con atributos de este tipo. El ID3 tal como fue presentado, no puede aplicarse a todos los dominios, adems de descartarse los dominios con clases continuas, como en el C4.5, se descartan los dominios con cualquier atributo continuo. El agregado de una mejora de este tipo lo liberara de esta restriccin y no es demasiado cara.
La Ley de Conservacin sostiene que ningn algoritmo puede superar a otro cuando la medida de performance es la precisin de generalizacin esperada, sobre la suposicin de que todos los resultados posibles son igualmente probables. El hecho de promediar la performance de un algoritmo sobre todos los casos posibles, asumiendo que todos son igualmente probables, sera como evaluar la performance de un auto en todos los terrenos posibles, asumiendo que todos son igualmente probables. Esta afirmacin es falsa para la prctica, ya que en un dominio en particular, es claro que no todos los casos son igualmente probables.
Quinlan, quien ha identificado familias de dominios paralelos y secuenciales, sostiene que las redes neuronales son ms eficientes en los dominios paralelos, mientras que los algoritmos que construyen rboles de decisin obtienen mejores resultados en los dominios secuenciales. Por lo tanto, aunque un nico algoritmo de induccin puede no ser ptimo en todas las situaciones posibles, debe analizarse el mejor algoritmo para cada situacin en particular.
El campo de la Minera de Datos es un campo en pleno desarrollo, donde la mayora de las herramientas utilizadas provienen de otros campos relacionados como el reconocimiento de patrones, la Estadstica o la teora de complejidad. Dada la novedad de las investigaciones en esta rea quedan todava varios problemas por afrontar, como ser el tamao de los datos y el ruido en los mismos.
En los ltimos aos se han desarrollado muchos sistemas de Minera de Datos y se espera que este desarrollo contine floreciendo dada la enorme cantidad de datos que son almacenados da a da, que requiere algn tipo de anlisis, entendimiento o clasificacin. La diversidad de los datos, y de las tcnicas y enfoques de la minera de datos, son un desafo para el crecimiento de este rea de la tecnologa.
196
Magdalena Servente
Conclusiones
En este Anexo se describen las caractersticas generales del sistema (Seccin A.1) y las funciones de cada uno de los menes (Seccin A.2), detallando las acciones que pueden realizarse con cada una de las opciones disponibles.
Cuando el usuario ingresa al sistema debe seleccionar la tabla sobre la cual desea trabajar y la columna de la tabla que servir como clasificador. Dicha tabla debe estar en formato de Paradox 4. Una vez seleccionada la tabla de trabajo, el usuario podr elegir el mtodo con el cual desea realizar la minera. Los mtodos disponibles son el ID3 utilizando la ganancia como criterio de decisin, el ID3 utilizando la proporcin de ganancia como criterio de decisin, el C4.5 utilizando la ganancia como criterio de decisin y el C4.5 utilizando la proporcin de ganancia con el mismo propsito.
Una vez finalizada la minera, el sistema mostrar en pantalla el rbol de decisin generado. El usuario tendr la opcin de guardar dicho rbol en disco. Adems, el sistema genera un conjunto de reglas de decisin. El formato de estas reglas es lo suficientemente general como para que puedan aplicarse y utilizarse a posteriori para clasificar datos cuya clase no se conoce. Es decir, tanto el rbol como las reglas nos sirven para comprender el modelo de clasificacin presente en los datos, y las reglas nos sirven para clasificar nuevos datos de la misma base de datos que no fueron utilizados por el sistema.
Magdalena Servente
197
A.2. FUNCIONALIDAD
A.2.1. Pantalla principal
Cuando el usuario ingresa al sistema se encontrar con la pantalla mostrada en la Figura A.1, donde podr ver un men de acceso rpido que detalla la tabla que el usuario eligi como predeterminada para trabajar, y el atributo clasificador de la misma. Si el usuario desea realizar una minera segn sus opciones por defecto puede hacerlo rpidamente, presionando los botones de ID3 o de C4.5, dependiendo en el tipo de mtodo que desee utilizar.
198
Magdalena Servente
A.2.2.1.2. C4.5 Al igual que con la opcin anterior, con la opcin C4.5 del men Resolucin, se aplica el C4.5 a la tabla elegida en la seccin de Cambio de Tabla (Men Opciones/Cambio de Tabla). Nuevamente, se utilizar la ganancia o la proporcin de ganancia de acuerdo a la opcin del men desplegable en que el usuario haya marcado.
A.2.2.2.1. C4.5 Al hacer clic sobre esta opcin de men, el usuario podr evaluar de manera similar a la explicada en la seccin anterior, las corridas realizadas con el C4.5.
Magdalena Servente
199
A.2.2.3.2. Cambiar Tabla Esta opcin despliega la pantalla mostrada en la figura A.3 donde el usuario puede cambiar la tabla de trabajo y la columna del clasificador (clase) de la misma. Si el usuario hace clic en Aceptar esta tabla se utilizar para todas las corridas hasta que se cierre el sistema. Si el usuario hace clic en Aplicar esta tabla quedar predeterminada, con lo cual se utilizar para todas las corridas posteriores y para las corridas realizadas cuando se utilice el sistema por prxima vez; queda determinada como tabla por defecto.
A.2.2.3.3. Parmetros del sistema Esta pantalla, permite cambiar los parmetros generales de trabajo que utiliza el sistema por defecto. Los parmetros que se pueden cambiar son el sistema de minera por defecto: ID3 o C4.5; el criterio de decisin por defecto: ganancia o proporcin de ganancia; y si se realiza o no la poda del rbol de decisin obtenido.
200
Magdalena Servente
Magdalena Servente
201
202
Magdalena Servente
En este Anexo se detallan los conjuntos de datos utilizados para realizar las pruebas descriptas en el Captulo 5. Para cada uno de los dominios, se muestran los conjuntos de datos de entrenamiento y prueba. Los datos presentados corresponden a los siguientes dominios: Crditos (Seccin B.1), Cardiologa (Seccin B.2), Votaciones (Seccin B.3), Estudio sobre hongos (Seccin B.4), Elita: Base de Asteroides (Seccin B.5), Hipotiroidismo (Seccin B.6), Identificacin de vidrios (Seccin B.7).
Los datos del anexo B se encuentran en el CD que acompaa este trabajo. Estn divididos en archivos segn los dominios a los que pertenecen:
Crditos: AnexoB-Creditos.doc
Cardiologa: AnexoB-Cardiologia.doc
Votaciones: AnexoB-Votaciones.doc
Hipotiroidismo: AnexoB-Hipotiroidismo.doc
Conjuntos de datos
Magdalena Servente
203
204
Magdalena Servente
Conjuntos de datos
Este anexo es un complemento a la explicacin de la funcionalidad del sistema de la Seccin 4.5. En la seccin C.1 se detalla la interaccin entre los mdulos del sistema. Las principales funciones de cada uno de estos mdulos se presentan en la seccin C.2. En la seccin C.3 se detallan las principales estructuras de datos utilizadas por el sistema.
Existe un mdulo principal, el Uprincipal, desde donde se realizan los llamados a los dems mdulos. Este mdulo es el formulario principal con el cual interacta el usuario. El corazn del sistema reside en los mdulos UDMID3 y UDMC45, quienes aplican el ID3 y el C4.5 respectivamente.
La figura C.1 detalla la interaccin entre los mdulos del sistema. Las flechas representan los mensajes entre ellos. Hemos divididos los mdulos en cuatro grupos: mdulos de pantallas principales, mdulos de opciones generales, mdulos de Minera de Datos y mdulos de clases de datos. Los mdulos de pantallas principales son aquellos que representan la pantalla principal y el men de acceso rpido. Su objetivo es llamar a los otros mdulos para llevar a cabo las acciones que el usuario indica en los menes. Los mdulos de opciones generales son aquellos mdulos que realizan todas las operaciones comunes al ID3 y al C4.5, como el cambio de la tabla de datos, el cambio del criterio de decisin utilizado por defecto, o la eleccin de la tabla sobre la cual se desea evaluar el rendimiento, entre otros. Por otro lado, los mdulos de Minera de Datos son aquellos que construyen los rboles y las reglas de decisin a partir de las tablas, para ello utilizan las estructuras de datos definidas en los mdulos de clases de datos.
El mdulo TDIDT no pertenece a ninguno de estos grupos ya es el mdulo de inicio del programa.
Las funciones principales de cada uno de estos mdulos se detallan en la Seccin C.2.
Magdalena Servente
205
UTipos
defns.h
Rulex.h
Types.h
TDIDT.cpp Inicializar
Utilizacin
Utilizacin
Inicializar
Mdulos de pantallas principales Inicializar UInfoGral Aplicar mtodo Aplicar ID3 UPrincipal Aplicar C4.5
UDMID3
UDMC45
Mostrar Tabla
Cambiar Tabla
UBD
UCambioTabla
frmOpcionesSist
UElegirRendimiento
URendimiento
UArbol
206
Magdalena Servente
C.2.2.2. UInfoGral
Este es un men de acceso rpido que aparece apenas se inicia el programa. El usuario puede elegir aplicar el ID3 o el C4.5 en las opciones previamente elegidas por defecto.
C.2.3.2. UCambioTabla
Lista todos los datos de la tabla sobre la cual se est trabajando por pantalla. Permite que el usuario seleccione otra tabla sobre la cual trabajar, y permite determinar la clase de los datos, es decir, el campo de tabla que cumple la funcin de clasificador.
Si el usuario aplica los cambios, la eleccin de la tabla y del campo clasificador sern guardadas como elecciones por defecto. En cambio, si el usuario acepta los cambios, la tabla y el campo escogidos sern utilizados hasta que se cierre el programa o hasta que el usuario modifique su eleccin.
C.2.3.3. frmOpcionesSist
En esta pantalla el usuario puede modificar las opciones por defecto del sistema. Estas opciones son el mtodo (ID3 o C4.5) aplicado con mayor preferencia, el criterio de decisin (ganancia o proporcin de
Magdalena Servente
207
ganancia) utilizado y la poda o no por defecto. Estas opciones se utilizan cuando el usuario realiza la Minera de Datos a travs del men de acceso rpido detallado en la Seccin C.2.2.2.
C.2.3.4. UElegirRendimiento
Cuando el usuario desea evaluar el rendimiento de alguno de los modelos generados con el sistema, deber entrar en este mdulo para elegir la tabla sobre la que desea trabajar y la fecha y hora en que se gener el modelo que est tratando de evaluar. Una vez que el usuario ha determinado todos estos datos, se realiza la evaluacin del rendimiento del modelo escogido.
C.2.3.5. URendimiento
Muestra por pantalla la matriz de evaluacin del rendimiento del modelo escogido por el usuario en la pantalla descripta en la seccin C.2.3.4. La matriz de evaluacin muestra, para cada clase, la cantidad de casos que fueron evaluados correctamente y la cantidad de casos que fueron evaluados incorrectamente, segn lo descripto en el Captulo 5.
C.2.3.6. UArbol
Este mdulo muestra el rbol obtenido por pantalla. El usuario puede guardar este rbol en el archivo de texto de su preferencia.
208
Magdalena Servente
C.2.4.2. UDMC45
Al igual que el mdulo anterior, este mdulo agrupa todas las funciones necesarias para aplicar el C4.5 a una tabla. Genera el rbol y las reglas de decisin, y evala los modelos generados.
C.2.5.1. UTipos
En este modulo se definen todos los tipos de datos propios del sistema, principalmente aquellos utilizados por el ID3.
C.2.5.2. Types.h
En este modulo se definen todos los principales tipos de datos utilizados en el C4.5.
C.2.5.3. Defns.h
Este mdulo complementa al anterior, y define an ms tipos de datos utilizados por el C4.5.
C.2.5.4. Rulex.h
En este modulo se definen los tipos de datos necesarios para aplicar el C4.5
Magdalena Servente
209
class TParametros { public: AnsiString ArchivoIni; AnsiString NombreBD; AnsiString TablaBD; AnsiString TablaReglas; AnsiString ColClasificador; AnsiString ExtensionFileReglas; TStringList *LClasificadores; int iFormatoReglas; /* 0: Insight2+ 1: KappaPC 2: ambos 3: ninguno*/ int iSistema; /* 0: ID3 1: C4.5 */ int iCriterio; /* 0: Ganancia 1: Proporcin de ganancia */ int iPoda; /* 0: Si 1: No */ int iConjuntos; /* indica si las pruebas en el C4.5 se realizan sobre grupos de atributos discretos 0: Si 1: No */ int iMinObjs; /* Cantidad mnima de objetos que debe tener una rama en el C4.5 */ int iCF; /* Nivel de confianza para la poda en el C4.5 */ TParametros(AnsiString ArchIni); //constructor //Toma los parmetros del archivo .ini ~TParametros(); //destructor //Refresca los parmetros a partir del archivo .ini /*Devuelve 0 si no hubo problemas, -1 en caso contrario*/ int RefrescarParams(); //Guardar los parmetros en el .ini /*Devuelve 0 si no hubo problemas, -1 en caso contrario*/ int GrabarParams(); };
/* 0 si es hoja y todos los valores son "Yes" 1 si es hoja y todos los valores son "No" 2 si es hoja y sus valores son mixtos 3 si no es hoja*/
int desc; tree_ptr pHijos[MAX_HIJOS]; //hijo derecho short int D[MAX_CANT_DESCRIPTORES];/*Descriptores vlidos para el nodo*/ }; typedef tree_ptr DECISION_TREE;
210
Magdalena Servente
typedef struct tree_record *Tree; struct tree_record { short NodeType; ClassNo Leaf; ItemCount Items, *ClassDist, Errors; Attribute Tested; short Forks; float Cut, Lower, Upper; Conjunto *Subset; Tree *Branch; }; typedef Tree DECISION_TREE_C45;
/* /* /* /* /* /* /* /* /* /* /* /*
0=hoja 1=rama 2=corte 3=subconj */ clase ms frecuente del nodo */ nro de items en el nodo */ distrib de clase de los items */ nro de errores en el nodo */ atribute referenciado en la prueba */ nro de ramas en el nodo */ lmite para los atrib continuos */ lmite inferior del valor lmite */ lmite superior del valor lmite */ subconj de valores discretos */ Branch[x] = (sub)rbol para el resultado x */
Magdalena Servente
211
212
Magdalena Servente
En este anexo se presenta el cdigo fuente del sistema desarrollado. En la seccin D.1 se presenta el cdigo fuente del archivo TDIDT.cpp que es el archivo inicial del proyecto y es quien inicializa al resto de los formularios requeridos. En la seccin D.2 se presenta el cdigo fuente de las pantallas principales. A continuacin, se detallan los cdigos fuentes de los mdulos de opciones generales (Seccin D:3), de los mdulos de minera de datos (Seccin D.4) y de los mdulos de clases o estructuras de datos (Seccin D.5)
D.1. TDIDT.CPP
//--------------------------------------------------------------------------#include <vcl.h> #pragma hdrstop USERES("TDIDT.res"); USEFORM("UPrincipal.cpp", FormPrincipal); USEFORM("UArbol.cpp", frm_Arbol); USEFORM("UDMID3.cpp", DMID3); /* TDataModule: DesignClass */ USEUNIT("UTipos.cpp"); USEFORM("UBD.cpp", frmBD); USEFORM("frmOpcionesSist.cpp", frmOpciones); USEFORM("UInfoGral.cpp", frmInfoGral); USEFORM("URendimiento.cpp", FrmRendimiento); USEFORM("UElegirRendimiento.cpp", frmElegirRendimiento); USEFORM("UCambioTabla.cpp", frmCambioTabla); USEFILE("C45\defns.h"); USEFILE("C45\TYPES.h"); USEFORM("C45\UDMC45.cpp", DMC45); /* TDataModule: DesignClass */ USEFILE("C45\Rulex.h"); //--------------------------------------------------------------------------WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { try { Application->Initialize(); Application->CreateForm(__classid(TDMID3), &DMID3); Application->CreateForm(__classid(TFormPrincipal), &FormPrincipal); Application->CreateForm(__classid(TfrmInfoGral), &frmInfoGral); Application->Run(); } catch (Exception &exception) { Application->ShowException(&exception); } return 0; }
Cdigo Fuente
Magdalena Servente
213
//--------------------------------------------------------------------------class TFormPrincipal : public TForm { __published: // IDE-managed Components TMainMenu *MenuPpal; TMenuItem *mnuGral; TMenuItem *mnuSep; TMenuItem *mnu_Salir; TMenuItem *mnuID3; TMenuItem *mnuC45; TMenuItem *mnuID3G; TMenuItem *mnuID3GR; TMenuItem *mnuC45G; TMenuItem *mnuC45GR; TMenuItem *mnuAyuda; TMenuItem *mnuHelpIndex; TMenuItem *mnuSep3; TMenuItem *mnuAcercaDe; TMenuItem *mnuEvaluacion; TMenuItem *mnuEvalID3; TMenuItem *mnuEvalC45; TMenuItem *mnuOpciones; TMenuItem *mnuTabla; TMenuItem *mnuCambiarTabla; TMenuItem *mnuParametros; void __fastcall FormCreate(TObject *Sender); void __fastcall FormClose(TObject *Sender, TCloseAction &Action); void __fastcall FormCloseQuery(TObject *Sender, bool &CanClose); void __fastcall mnu_ID3GainClick(TObject *Sender); void __fastcall mnu_ID3GainRatioClick(TObject *Sender); void __fastcall mnu_SalirClick(TObject *Sender); void __fastcall mnuID3GClick(TObject *Sender); void __fastcall mnuID3GRClick(TObject *Sender); void __fastcall FormShow(TObject *Sender); void __fastcall mnuEvalID3Click(TObject *Sender); void __fastcall mnuTablaClick(TObject *Sender); void __fastcall mnuParametrosClick(TObject *Sender); void __fastcall mnuCambiarTablaClick(TObject *Sender); void __fastcall mnuEvalC45Click(TObject *Sender); void __fastcall mnuC45GClick(TObject *Sender); void __fastcall mnuC45GRClick(TObject *Sender); private: TParametros *Params; public: __fastcall TFormPrincipal(TComponent* Owner); // void ActualizarParametros(TStringList *ListaParam); /* Esta funcin actualiza los parmetros del formulario La lista de parmetros debe tener el siguiente orden: ExtensionArchivoReglas; AliasBD; TablaBD ColClasificador; Lista de Clasificadores*/ 214 Magdalena Servente Cdigo Fuente
void ID3(short int MedidorGanancia); //llama al algoritmo ID3 sobre la tabla actual int EvalRendimiento; //indica si el usuario desea evaluar el rendimiento de una corrida o no }; //--------------------------------------------------------------------------extern PACKAGE TFormPrincipal *FormPrincipal; //--------------------------------------------------------------------------#endif
D.2.1.1. UPrincipal.cpp
//--------------------------------------------------------------------------#pragma hdrstop #include "UPrincipal.h" //--------------------------------------------------------------------------#pragma package(smart_init) #pragma resource "*.dfm" TFormPrincipal *FormPrincipal; Tfrm_Arbol *frm_Arbol; TfrmOpciones *frmOpciones; TfrmElegirRendimiento *frmElegirRendimiento; TFrmRendimiento *FrmRendimiento; TfrmBD *frmBD; TfrmCambioTabla *frmCambioTabla; //----------------------------------------------------------------------------//----------------------------------------------------------------------------// IMPLEMENTACION //----------------------------------------------------------------------------//----------------------------------------------------------------------------__fastcall TFormPrincipal::TFormPrincipal(TComponent* Owner) : TForm(Owner) { Params=new TParametros("Gap.ini"); } //--------------------------------------------------------------------------void __fastcall TFormPrincipal::FormCreate(TObject *Sender) { DMID3->RecibirParametros(Params); } //--------------------------------------------------------------------------void __fastcall TFormPrincipal::FormClose(TObject *Sender, TCloseAction &Action) { delete Params; } //---------------------------------------------------------------------------
void __fastcall TFormPrincipal::FormCloseQuery(TObject *Sender, bool &CanClose) { int rta; rta=MessageBox(FormPrincipal->Handle, "Est seguro de que desea salir de la aplicacin?", "Tesis", MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON1|MB_SYSTEMMODAL); if (rta==IDNO) //el usuario no desea salir de la aplicacin CanClose=false; } //---------------------------------------------------------------------------
void __fastcall TFormPrincipal::mnu_ID3GainClick(TObject *Sender) { ID3(0); } Cdigo Fuente Magdalena Servente 215
//--------------------------------------------------------------------------void __fastcall TFormPrincipal::mnu_ID3GainRatioClick(TObject *Sender) { ID3(1); } //--------------------------------------------------------------------------void TFormPrincipal::ID3(short int MedidorGanancia) {tree_ptr pRoot; TVecValores VecVal, VecDesc; int i; Cursor=crHourGlass; DMID3->RecibirParametros(Params); pRoot=DMID3->Principal(MedidorGanancia); DMID3->PruneTree(pRoot); DMID3->InformarValores(VecVal); DMID3->InformarDescrip(VecDesc); frm_Arbol= new Tfrm_Arbol(this); frm_Arbol->Cursor=crHourGlass; frm_Arbol->RecibirParametros(Params->LClasificadores,VecVal,VecDesc); frm_Arbol->PrintTree(pRoot); DMID3->ArmarReglas(pRoot); DMID3->EliminarTree(pRoot); free(pRoot); frm_Arbol->Cursor=crArrow; FormPrincipal->Cursor=crArrow; for (i=0;i<MAX_NIVELES;i++) { VecVal[i].~AnsiString(); VecDesc[i].~AnsiString(); } }
void __fastcall TFormPrincipal::mnuID3GClick(TObject *Sender) { ID3(0); } //--------------------------------------------------------------------------void __fastcall TFormPrincipal::mnuID3GRClick(TObject *Sender) { ID3(1); } void __fastcall TFormPrincipal::FormShow(TObject *Sender) { frmInfoGral->RecibirParametros(Params->TablaBD,Params->ColClasificador,Params>iCriterio); } //--------------------------------------------------------------------------void __fastcall TFormPrincipal::mnuEvalID3Click(TObject *Sender) { EvalRendimiento=0; frmElegirRendimiento= new TfrmElegirRendimiento(this); frmElegirRendimiento->ActualizarDatos(0,Params->NombreBD); frmElegirRendimiento->ShowModal(); if (EvalRendimiento==0) { FrmRendimiento= new TFrmRendimiento(this); FrmRendimiento->Cursor=crHourGlass; 216 Magdalena Servente Cdigo Fuente
DMID3->EvaluarReglas(frmElegirRendimiento->CodigoReglas); FrmRendimiento->Cursor=crArrow; } } //--------------------------------------------------------------------------void __fastcall TFormPrincipal::mnuTablaClick(TObject *Sender) { frmBD=new TfrmBD(this); frmBD->RecibirParametros(Params); } //--------------------------------------------------------------------------void __fastcall TFormPrincipal::mnuParametrosClick(TObject *Sender) { frmOpciones=new TfrmOpciones(this); frmOpciones->RecibirParametros(Params); frmOpciones->Show(); } //--------------------------------------------------------------------------void __fastcall TFormPrincipal::mnuCambiarTablaClick(TObject *Sender) { frmCambioTabla=new TfrmCambioTabla(this); frmCambioTabla->RecibirParametros(Params); frmCambioTabla->Show(); } //--------------------------------------------------------------------------void __fastcall TFormPrincipal::mnuEvalC45Click(TObject *Sender) { EvalRendimiento=0; frmElegirRendimiento= new TfrmElegirRendimiento(this); frmElegirRendimiento->ActualizarDatos(0,Params->NombreBD); frmElegirRendimiento->ShowModal(); if (EvalRendimiento==0) { FrmRendimiento= new TFrmRendimiento(this); FrmRendimiento->Cursor=crHourGlass; DMC45->EvaluacionRendimiento(); FrmRendimiento->Cursor=crArrow; } } //--------------------------------------------------------------------------void __fastcall TFormPrincipal::mnuC45GClick(TObject *Sender) { Params->iCriterio=0; DMC45->RecibirParametros(Params); DMC45->C45(); } //--------------------------------------------------------------------------void __fastcall TFormPrincipal::mnuC45GRClick(TObject *Sender) { Params->iCriterio=1; DMC45->RecibirParametros(Params); DMC45->C45(); } //---------------------------------------------------------------------------
D.2.2. UInfoGral
D.2.2.1. UInfoGral.h
//--------------------------------------------------------------------------#ifndef UInfoGralH #define UInfoGralH Cdigo Fuente Magdalena Servente 217
//--------------------------------------------------------------------------#include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Buttons.hpp> #include "UPrincipal.h" //--------------------------------------------------------------------------class TfrmInfoGral : public TForm { __published: // IDE-managed Components TLabel *lblTabla; TLabel *lblClase; TEdit *txtClase; TEdit *txtTabla; TBitBtn *BtnC45; TBitBtn *BtnID3; void __fastcall FormClose(TObject *Sender, TCloseAction &Action); void __fastcall BtnID3Click(TObject *Sender); private: short MedidorGanancia; public: __fastcall TfrmInfoGral(TComponent* Owner); void RecibirParametros(AnsiString tabla, AnsiString clase, short Ganancia); }; //--------------------------------------------------------------------------extern PACKAGE TfrmInfoGral *frmInfoGral; //--------------------------------------------------------------------------#endif
D.2.2.2. UInfoGral.cpp
//--------------------------------------------------------------------------#pragma hdrstop #include "UInfoGral.h" //--------------------------------------------------------------------------#pragma package(smart_init) #pragma resource "*.dfm" TfrmInfoGral *frmInfoGral; //--------------------------------------------------------------------------__fastcall TfrmInfoGral::TfrmInfoGral(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------void __fastcall TfrmInfoGral::FormClose(TObject *Sender, TCloseAction &Action) { Action = caFree; } //--------------------------------------------------------------------------void TfrmInfoGral::RecibirParametros(AnsiString tabla, AnsiString clase, short Ganancia) { txtTabla->Text=tabla; txtClase->Text=clase; MedidorGanancia=Ganancia; } void __fastcall TfrmInfoGral::BtnID3Click(TObject *Sender) { TFormPrincipal *pForm; pForm=FormPrincipal; pForm->Cursor=crHourGlass; pForm->ID3(MedidorGanancia); pForm->Cursor=crArrow; } //---------------------------------------------------------------------------
218
Magdalena Servente
Cdigo Fuente
D.3.1.2. UBD.cpp
//--------------------------------------------------------------------------#pragma hdrstop #include "UBD.h" //--------------------------------------------------------------------------#pragma package(smart_init) #pragma resource "*.dfm" TfrmBD *frmBD; //--------------------------------------------------------------------------__fastcall TfrmBD::TfrmBD(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------void __fastcall TfrmBD::FormClose(TObject *Sender, TCloseAction &Action) { Action = caFree; } //--------------------------------------------------------------------------void TfrmBD::RecibirParametros(TParametros *Parametros) { Params=Parametros; Tabla->DatabaseName=Params->NombreBD; Tabla->TableName=Params->TablaBD; Tabla->Active=true; }
Cdigo Fuente
Magdalena Servente
219
D.3.2. UCambioTabla
D.3.2.1. UCambioTabla.h
//--------------------------------------------------------------------------#ifndef UCambioTablaH #define UCambioTablaH //--------------------------------------------------------------------------#include <Buttons.hpp> #include <Classes.hpp> #include <Controls.hpp> #include <Db.hpp> #include <DBGrids.hpp> #include <DBTables.hpp> #include <Dialogs.hpp> #include <Grids.hpp> #include <StdCtrls.hpp> #include "UTipos.h" #include "UDMID3.h" #include "UInfoGral.h" //--------------------------------------------------------------------------class TfrmCambioTabla : public TForm { __published: // IDE-managed Components TDBGrid *DBGrid; TDataSource *DSTabla; TTable *Tabla; TEdit *txt_Tabla; TBitBtn *Btn_fod; TOpenDialog *fod_TablaBD; TLabel *lbl_TablaBD; TLabel *lbl_nbeColClasif; TComboBox *cbo_ColClasif; TBitBtn *btn_Aceptar; TBitBtn *btn_Cancelar; TBitBtn *btn_Aplicar; void __fastcall FormClose(TObject *Sender, TCloseAction &Action); void __fastcall Btn_fodClick(TObject *Sender); void __fastcall btn_CancelarClick(TObject *Sender); void __fastcall btn_AceptarClick(TObject *Sender); void __fastcall btn_AplicarClick(TObject *Sender); void __fastcall txt_TablaChange(TObject *Sender); void __fastcall cbo_ColClasifChange(TObject *Sender); private: /*Parmetros de la base sobre la que trabajaremos*/ TParametros *Params; void CargarCombo(); int ActualizarCambios(); /*Devuelve: 0: si los cambios fueron exitosos 1: si hubo problemas*/ public: __fastcall TfrmCambioTabla(TComponent* Owner); void RecibirParametros(TParametros *Parametros); }; //--------------------------------------------------------------------------extern PACKAGE TfrmCambioTabla *frmCambioTabla; //--------------------------------------------------------------------------#endif
D.3.2.2. UCambioTabla.cpp
//--------------------------------------------------------------------------#pragma hdrstop #include "UCambioTabla.h" //--------------------------------------------------------------------------#pragma package(smart_init) #pragma resource "*.dfm" 220 Magdalena Servente Cdigo Fuente
TfrmCambioTabla *frmCambioTabla; //--------------------------------------------------------------------------__fastcall TfrmCambioTabla::TfrmCambioTabla(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------void __fastcall TfrmCambioTabla::FormClose(TObject *Sender, TCloseAction &Action) { Action = caFree; } //--------------------------------------------------------------------------void TfrmCambioTabla::RecibirParametros(TParametros *Parametros) { Params=Parametros; //Cargamos los datos relacionados con la Base de Datos fod_TablaBD->FileName=Params->TablaBD; txt_Tabla->Text=Params->TablaBD; Tabla->TableName=Params->TablaBD; Tabla->DatabaseName=Params->NombreBD; Tabla->Active=true; CargarCombo(); btn_Aplicar->Enabled=false; }
//--------------------------------------------------------------------------void __fastcall TfrmCambioTabla::Btn_fodClick(TObject *Sender) { bool res; int index; AnsiString TablaBD;
res=fod_TablaBD->Execute(); if (res) { TablaBD=fod_TablaBD->FileName; index=TablaBD.LastDelimiter("\\"); TablaBD=TablaBD.SubString(index+1,TablaBD.Length()-index); txt_Tabla->Text=TablaBD; Tabla->Active=false; Tabla->TableName=TablaBD; Tabla->Active=true; cbo_ColClasif->Clear(); CargarCombo(); } TablaBD.~AnsiString(); } //--------------------------------------------------------------------------void __fastcall TfrmCambioTabla::btn_CancelarClick(TObject *Sender) { Close(); } //--------------------------------------------------------------------------void __fastcall TfrmCambioTabla::btn_AceptarClick(TObject *Sender) { if (ActualizarCambios()==0) Close(); } //--------------------------------------------------------------------------void TfrmCambioTabla::CargarCombo() { TStringList *listaCpos = new TStringList(); int i; bool fin; Tabla->GetFieldNames(listaCpos); cbo_ColClasif->Items->AddStrings(listaCpos); i=0; while (i<=cbo_ColClasif->Items->Count) { if (AnsiCompareText(cbo_ColClasif->Items->Strings[i].Trim(),"NIVEL")==0) cbo_ColClasif->Items->Delete(i); else Cdigo Fuente Magdalena Servente 221
i++; } fin=false; i=0; while (i<=cbo_ColClasif->Items->Count && !fin) { if (AnsiCompareText(cbo_ColClasif->Items->Strings[i].Trim(),Params>ColClasificador.Trim())==0) { cbo_ColClasif->ItemIndex=i; fin=true; } i++; } delete(listaCpos); }
//--------------------------------------------------------------------------int TfrmCambioTabla::ActualizarCambios() /*Devuelve: 0: si los cambios fueron exitosos 1: si hubo problemas*/ { AnsiString TablaAnterior; AnsiString sqlstring; TQuery *QValoresClasif=new TQuery(frmCambioTabla); int res; try { res=0; if (Params->TablaBD!=txt_Tabla->Text) //actualizamos los datos de la tabla { Params->TablaBD=txt_Tabla->Text; TablaAnterior=DMID3->TTennis->TableName; DMID3->TTennis->Active=false; DMID3->TTennis->DatabaseName=Params->NombreBD; DMID3->TTennis->TableName=Params->TablaBD; DMID3->TTennis->Active=true; //Inicializamos los queries que harn sus consultas sobre la base //especificada DMID3->QGral->DatabaseName=Params->NombreBD; //Inicializamos el campo Nivel en la Tabla sqlstring="Update "; AppendStr(sqlstring, Params->TablaBD); AppendStr(sqlstring," SET Nivel = 0 "); DMID3->QGral->SQL->Clear(); DMID3->QGral->SQL->Add(sqlstring); DMID3->QGral->ExecSQL(); DMID3->QGral->SQL->Clear(); DMID3->TTennis->Close(); DMID3->TTennis->Open(); } if (Params->ColClasificador!=cbo_ColClasif->Text) //Cambiamos la columna del clasificador { if (cbo_ColClasif->Text.Trim()=="") { ShowMessage("El nombre de la Columna del Clasificador no puede quedar en blanco"); cbo_ColClasif->SetFocus(); res=1; } else { Params->ColClasificador=cbo_ColClasif->Text; //Actualizamos la lista de Clasificadores sqlstring="SELECT DISTINCT(" + Params->ColClasificador + ") as Clasif FROM " + Params->TablaBD; QValoresClasif->DatabaseName=Params->NombreBD; QValoresClasif->SQL->Clear(); QValoresClasif->SQL->Add(sqlstring); QValoresClasif->Open(); 222 Magdalena Servente Cdigo Fuente
QValoresClasif->Last(); QValoresClasif->First(); Params->LClasificadores->Clear(); while (!QValoresClasif->Eof) { Params->LClasificadores->Add(QValoresClasif>FieldByName("Clasif")->AsString); QValoresClasif->Next(); } res=0; } } frmInfoGral->RecibirParametros(Params->TablaBD,Params->ColClasificador, Params->iCriterio); } catch(...) { ShowMessage("Problemas con la Base de Datos, no podr cambiar de tabla"); //Restauramos los valores anteriores DMID3->TTennis->Active=false; DMID3->TTennis->DatabaseName=Params->NombreBD; Params->TablaBD=TablaAnterior; DMID3->TTennis->TableName=Params->TablaBD; DMID3->TTennis->Active=true; //Inicializamos los queries que harn sus consultas sobre la base //especificada DMID3->QGral->DatabaseName=Params->NombreBD; cbo_ColClasif->Clear(); CargarCombo(); res=1; } sqlstring.~AnsiString(); TablaAnterior.~AnsiString(); delete(QValoresClasif); return(res); } //--------------------------------------------------------------------------void __fastcall TfrmCambioTabla::btn_AplicarClick(TObject *Sender) { ActualizarCambios(); Params->GrabarParams(); btn_Aplicar->Enabled=false; }
void __fastcall TfrmCambioTabla::txt_TablaChange(TObject *Sender) { btn_Aplicar->Enabled=true; } //--------------------------------------------------------------------------void __fastcall TfrmCambioTabla::cbo_ColClasifChange(TObject *Sender) { btn_Aplicar->Enabled=true; } //---------------------------------------------------------------------------
D.3.3. frmOpcionesSist
D.3.3.1. frmOpcionesSist.h
//--------------------------------------------------------------------------#ifndef frmOpcionesSistH #define frmOpcionesSistH //--------------------------------------------------------------------------#include <Buttons.hpp> #include <Classes.hpp> Cdigo Fuente Magdalena Servente 223
#include <Controls.hpp> #include <ExtCtrls.hpp> #include <StdCtrls.hpp> #include "UPrincipal.h" #include "UTipos.h" //-------------------------------------------------------------------------class TfrmOpciones : public TForm { __published: // IDE-managed Components TRadioGroup *rgSistema; TRadioGroup *rgCriterio; TRadioGroup *rgPoda; TBitBtn *btn_Aplicar; TBitBtn *btn_Cancelar; TBitBtn *btn_Aceptar; void __fastcall FormClose(TObject *Sender, TCloseAction &Action); void __fastcall btn_CancelarClick(TObject *Sender); void __fastcall btn_AceptarClick(TObject *Sender); void __fastcall btn_AplicarClick(TObject *Sender); private: // User declarations TParametros *Params; public: // User declarations __fastcall TfrmOpciones(TComponent* Owner); void RecibirParametros(TParametros *Parametros); }; //--------------------------------------------------------------------------extern PACKAGE TfrmOpciones *frmOpciones; //--------------------------------------------------------------------------#endif
D.3.3.2. frmOpcionesSist.cpp
//--------------------------------------------------------------------------#pragma hdrstop #include "frmOpcionesSist.h" //--------------------------------------------------------------------------#pragma package(smart_init) #pragma resource "*.dfm" TfrmOpciones *frmOpciones;
//--------------------------------------------------------------------------__fastcall TfrmOpciones::TfrmOpciones(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------void __fastcall TfrmOpciones::FormClose(TObject *Sender, TCloseAction &Action) { Action = caFree; } //--------------------------------------------------------------------------void TfrmOpciones::RecibirParametros(TParametros *Parametros) { Params=Parametros; //Cargamos los datos del sistema rgSistema->ItemIndex=Params->iSistema; //Cargamos los datos del Criterio de Evaluacin rgCriterio->ItemIndex=Params->iCriterio; //Cargamos los datos de la poda rgPoda->ItemIndex=Params->iPoda; } void __fastcall TfrmOpciones::btn_CancelarClick(TObject *Sender) { 224 Magdalena Servente Cdigo Fuente
Close(); } //--------------------------------------------------------------------------void __fastcall TfrmOpciones::btn_AceptarClick(TObject *Sender) { int cerrar; int rta; cerrar=0; Params->iSistema=rgSistema->ItemIndex; Params->iCriterio=rgCriterio->ItemIndex; Params->iPoda=rgPoda->ItemIndex; Params->iFormatoReglas=1; if (cerrar==0) Close(); } //--------------------------------------------------------------------------void __fastcall TfrmOpciones::btn_AplicarClick(TObject *Sender) { Params->iSistema=rgSistema->ItemIndex; Params->iCriterio=rgCriterio->ItemIndex; Params->iPoda=rgPoda->ItemIndex; Params->iFormatoReglas=1; Params->GrabarParams(); } //---------------------------------------------------------------------------
D.3.4. UElegirRendimiento
D.3.4.1. UElegirRendimiento.h
//--------------------------------------------------------------------------#ifndef UElegirRendimientoH #define UElegirRendimientoH //--------------------------------------------------------------------------#include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <ExtCtrls.hpp> #include <Buttons.hpp> #include <DBTables.hpp> #include <Dialogs.hpp> #include "UPrincipal.h" //--------------------------------------------------------------------------class TfrmElegirRendimiento : public TForm { __published: // IDE-managed Components TRadioGroup *rgCorrida; TGroupBox *gbSeleccionar; TLabel *lblTabla; TLabel *lblFecha; TComboBox *cbTabla; TComboBox *cbFecha; TBitBtn *btn_Cancelar; TBitBtn *btn_Aceptar; void __fastcall FormClose(TObject *Sender, TCloseAction &Action); void __fastcall btn_CancelarClick(TObject *Sender); void __fastcall rgCorridaClick(TObject *Sender); void __fastcall btn_AceptarClick(TObject *Sender); void __fastcall cbTablaChange(TObject *Sender); private: AnsiString Base; int Tipo; void CargarCboFechora(); public: int CodigoReglas; __fastcall TfrmElegirRendimiento(TComponent* Owner); Cdigo Fuente Magdalena Servente 225
void ActualizarDatos(int iTipo, AnsiString NombreBD); /* iTipo 0: ID3 1:C4.5*/ }; //--------------------------------------------------------------------------extern PACKAGE TfrmElegirRendimiento *frmElegirRendimiento; //--------------------------------------------------------------------------#endif
D.3.4.2. UElegirRendmiento.cpp
//--------------------------------------------------------------------------#pragma hdrstop #include "UElegirRendimiento.h" //--------------------------------------------------------------------------#pragma package(smart_init) #pragma resource "*.dfm" TfrmElegirRendimiento *frmElegirRendimiento;
//--------------------------------------------------------------------------__fastcall TfrmElegirRendimiento::TfrmElegirRendimiento(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------void __fastcall TfrmElegirRendimiento::FormClose(TObject *Sender, TCloseAction &Action) { Action = caFree; } //--------------------------------------------------------------------------void __fastcall TfrmElegirRendimiento::btn_CancelarClick(TObject *Sender) { FormPrincipal->EvalRendimiento=1; Close(); } //--------------------------------------------------------------------------void __fastcall TfrmElegirRendimiento::rgCorridaClick(TObject *Sender) { if (rgCorrida->ItemIndex==1) gbSeleccionar->Enabled=true; else gbSeleccionar->Enabled=false; } //---------------------------------------------------------------------------
void TfrmElegirRendimiento::ActualizarDatos(int iTipo, AnsiString NombreBD) { TQuery *QTabla=new TQuery(frmElegirRendimiento); AnsiString sqlstring; try { Base=NombreBD; Tipo=iTipo; QTabla->DatabaseName=NombreBD; sqlstring="SELECT distinct(Nombre_Tabla) FROM UpdatesHeader.db WHERE Metodo='"; if (iTipo==0) AppendStr(sqlstring,"ID3'"); else AppendStr(sqlstring,"C45'"); AppendStr(sqlstring,"ORDER BY Nombre_Tabla"); QTabla->SQL->Clear(); QTabla->SQL->Add(sqlstring); QTabla->Open(); QTabla->First(); while (!QTabla->Eof) { cbTabla->Items->Add(QTabla->FieldByName("Nombre_Tabla")->AsString); 226 Magdalena Servente Cdigo Fuente
QTabla->Next(); } cbTabla->ItemIndex=0; CargarCboFechora(); sqlstring.~AnsiString(); delete(QTabla); } catch(...) {ShowMessage("No se pudieron obtener los datos de la tabla de evaluacin"); sqlstring.~AnsiString(); delete(QTabla);} } //--------------------------------------------------------------------------void __fastcall TfrmElegirRendimiento::btn_AceptarClick(TObject *Sender) { TQuery *QTabla=new TQuery(frmElegirRendimiento); AnsiString sqlstring; try { QTabla->DatabaseName=Base; if (rgCorrida->ItemIndex==0) { /* sqlstring="SELECT Max(Codigo)as Codigo FROM UpdatesHeader.db WHERE Nombre_Tabla='" + cbTabla->Text +"' AND Metodo='"; */ sqlstring="SELECT Max(Codigo) as Codigo FROM UpdatesHeader.db WHERE Metodo='"; if (Tipo==0) AppendStr(sqlstring,"ID3'"); else AppendStr(sqlstring,"C45'"); } else { sqlstring="SELECT Codigo FROM UpdatesHeader.db WHERE Nombre_Tabla='" + cbTabla->Text +"' AND Metodo='"; if (Tipo==0) AppendStr(sqlstring,"ID3'"); else AppendStr(sqlstring,"C45'"); AppendStr(sqlstring,"AND Fecha='"); AppendStr(sqlstring,cbFecha->Text.SubString(0,8)); AppendStr(sqlstring,"' AND Hora='"); AppendStr(sqlstring,Trim(cbFecha->Text.SubString(9,cbFecha>Text.Length()-8))); AppendStr(sqlstring,"'"); } QTabla->SQL->Clear(); QTabla->SQL->Add(sqlstring); QTabla->Open(); CodigoReglas=QTabla->FieldByName("Codigo")->AsInteger; QTabla->First(); sqlstring.~AnsiString(); delete(QTabla); } catch(...) {ShowMessage("Problemas con la Base de Datos, no se pudo recuperar la tabla a procesar."); sqlstring.~AnsiString(); delete(QTabla);} } //--------------------------------------------------------------------------void __fastcall TfrmElegirRendimiento::cbTablaChange(TObject *Sender) { CargarCboFechora(); } void TfrmElegirRendimiento::CargarCboFechora() {TQuery *QTabla=new TQuery(frmElegirRendimiento); AnsiString sqlstring;
Cdigo Fuente
Magdalena Servente
227
if (cbTabla->Text!="") { try { QTabla->DatabaseName=Base; sqlstring="SELECT Fecha, Hora FROM UpdatesHeader.db WHERE Metodo='"; if (Tipo==0) AppendStr(sqlstring,"ID3'"); else AppendStr(sqlstring,"C45'"); AppendStr(sqlstring, " AND Nombre_Tabla='"); AppendStr(sqlstring,cbTabla->Text); AppendStr(sqlstring,"' ORDER BY Fecha DESC"); QTabla->SQL->Clear(); QTabla->SQL->Add(sqlstring); QTabla->Open(); QTabla->First(); cbFecha->Clear(); while (!QTabla->Eof) { sqlstring=QTabla->FieldByName("Fecha")->AsString + " " + QTabla>FieldByName("Hora")->AsString; cbFecha->Items->Add(sqlstring); QTabla->Next(); } cbFecha->ItemIndex=0; } catch(...) {ShowMessage("No se pudieron obtener los datos de la tabla de evaluacin");} } sqlstring.~AnsiString(); delete(QTabla); } //---------------------------------------------------------------------------
D.3.5. URendimiento
D.3.5.1. URendimiento.h
//--------------------------------------------------------------------------#ifndef URendimientoH #define URendimientoH #include <Classes.hpp> #include <Controls.hpp> #include <Grids.hpp> //--------------------------------------------------------------------------class TFrmRendimiento : public TForm { __published: // IDE-managed Components TStringGrid *GridResultados; void __fastcall FormClose(TObject *Sender, TCloseAction &Action); private: // User declarations public: // User declarations __fastcall TFrmRendimiento(TComponent* Owner); }; //--------------------------------------------------------------------------extern PACKAGE TFrmRendimiento *FrmRendimiento; //--------------------------------------------------------------------------#endif
D.3.5.2. URendmiento.cpp
//--------------------------------------------------------------------------#pragma hdrstop
228
Magdalena Servente
Cdigo Fuente
#include "URendimiento.h" //--------------------------------------------------------------------------#pragma package(smart_init) #pragma resource "*.dfm" TFrmRendimiento *FrmRendimiento; //--------------------------------------------------------------------------__fastcall TFrmRendimiento::TFrmRendimiento(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------void __fastcall TFrmRendimiento::FormClose(TObject *Sender, TCloseAction &Action) { Action = caFree; } //---------------------------------------------------------------------------
D.3.6. Uarbol
D.3.6.1. UArbol.h
//--------------------------------------------------------------------------#ifndef UArbolH #define UArbolH //--------------------------------------------------------------------------#include <Classes.hpp> #include <ComCtrls.hpp> #include <Controls.hpp> #include <Dialogs.hpp> #include "UPrincipal.h" #include "UTipos.h" //-------------------------------------------------------------------------class Tfrm_Arbol : public TForm { __published: // IDE-managed Components TTreeView *ArbolRes; TOpenDialog *fod_Archivo; void __fastcall FormClose(TObject *Sender, TCloseAction &Action); void __fastcall FormCloseQuery(TObject *Sender, bool &CanClose); private: /*String que tendr los valores posibles para el clasificador*/ TStringList *LClasificadores; TVecValores VecValores; TVecValores VecDescriptores; void PrintSubtree(tree_ptr Tree, int nivel); int ObtenerNuevoValor(); /*numeracin de valores del VecValores para la impresin del rbol*/ public: __fastcall Tfrm_Arbol(TComponent* Owner); void PrintTree(tree_ptr Tree); void RecibirParametros(TStringList *LClasif,TVecValores VecVal, TVecValores VecDescrip); }; //--------------------------------------------------------------------------extern PACKAGE Tfrm_Arbol *frm_Arbol; //--------------------------------------------------------------------------#endif
D.3.6.2. UArbol.cpp
//--------------------------------------------------------------------------#pragma hdrstop Cdigo Fuente Magdalena Servente 229
#include "UArbol.h" //--------------------------------------------------------------------------#pragma package(smart_init) #pragma resource "*.dfm" Tfrm_Arbol *frm_Arbol; TTreeNode *pNivel[MAX_CANT_DESCRIPTORES]; //para la visualizacin
//--------------------------------------------------------------------------__fastcall Tfrm_Arbol::Tfrm_Arbol(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------void __fastcall Tfrm_Arbol::FormClose(TObject *Sender, TCloseAction &Action) {int i; for (i=0;i<MAX_NIVELES;i++) { VecValores[i].~AnsiString(); VecDescriptores[i].~AnsiString(); } delete(ArbolRes); delete(LClasificadores); Action = caFree; } //--------------------------------------------------------------------------void __fastcall Tfrm_Arbol::FormCloseQuery(TObject *Sender, bool &CanClose) { int rta; bool res; rta=MessageBox(NULL, "Desea guardar el rbol en un archivo?", MB_ICONQUESTION|MB_YESNOCANCEL|MB_DEFBUTTON1|MB_SYSTEMMODAL); if (rta==IDCANCEL) //el usuario no desea salir de la aplicacin CanClose=false; else if (rta==IDYES) { res=fod_Archivo->Execute(); if (res) ArbolRes->SaveToFile(fod_Archivo->FileName); } } //--------------------------------------------------------------------------int Tfrm_Arbol::ObtenerNuevoValor() /*numeracin de valores del VecValores para la impresin del rbol*/ { static int i=0; i++; return(i); } //--------------------------------------------------------------------------//-------------------- IMPRESIN DEL RBOL EN PANTALLA ---------------------//--------------------------------------------------------------------------/****************************************************************************** ******************************************************************************/ void Tfrm_Arbol::PrintTree(tree_ptr Tree) { int nivel; TTreeNode *pNivel[MAX_CANT_DESCRIPTORES]; //para la visualizacin nivel=0;//nivel de la raz pNivel[nivel]= new TTreeNode(ArbolRes->Items); PrintSubtree(Tree, nivel); // frm_Arbol->ArbolRes->Width=Width-60; ArbolRes->Left=Left+30; ArbolRes->Top=Top+50; frm_Arbol->ArbolRes->Height=Height-100; ArbolRes->FullExpand(); Magdalena Servente Cdigo Fuente "TDIDT",
//
230
ArbolRes->Visible=true; } void Tfrm_Arbol::PrintSubtree(tree_ptr Tree, int nivel) { int i; int val; AnsiString nodo; if (nivel!=0) { val=ObtenerNuevoValor(); nodo=VecDescriptores[val]; AppendStr(nodo, " = "); AppendStr(nodo, VecValores[val]); pNivel[nivel]=ArbolRes->Items->AddChild(pNivel[nivel-1],nodo); } if (Tree->flag_hoja!=3) //es hoja ArbolRes->Items->AddChild(pNivel[nivel], LClasificadores->Strings[Tree>flag_hoja]); else //no es hoja { i=0; nivel++; while ((Tree->pHijos[i]!=NULL)&&(i<MAX_HIJOS)) { PrintSubtree(Tree->pHijos[i],nivel); i++; } }//end else nodo.~AnsiString(); return; } //--------------------------------------------------------------------------//--------------------------------------------------------------------------//--------------------------------------------------------------------------//--------------------------------------------------------------------------void Tfrm_Arbol::RecibirParametros(TStringList *LClasif,TVecValores VecVal, TVecValores VecDescrip) { int i; LClasificadores=LClasif; for (i=0;i<MAX_NIVELES;i++) { VecValores[i]=VecVal[i]; VecDescriptores[i]=VecDescrip[i]; } }
//--------------------------------------------------------------------------class TDMID3 : public TDataModule { __published: // IDE-managed Components TTable *TTennis; TDataSource *DSTTennis; TQuery *QGral; TQuery *QUpdates; void __fastcall DMID3Destroy(TObject *Sender); private: TParametros *Params; short int EvaluarResultados(AnsiString NombreTabla); public: __fastcall TDMID3(TComponent* Owner); //---------------------------------------------------------------------------//--------------------DECLARACION DE FUNCIONES-------------------------------//---------------------------------------------------------------------------tree_ptr Principal ( short int MedidorGanancia); /*Mdulo principal*/ void RecibirParametros(TParametros *Parametros); short int EsUniforme(int nivelArbol); /*verifica si estamos en una hoja*/ int ObtenerCantDescr();/*Obtiene la cantidad de descriptores de la tabla*/ int BuscarPK(short int ValidDs[]); /*Busca claves promarias en la tabla*/ tree_ptr BuildTree(int nivel, short int *pD); /*Funcin que construye el rbol de decisin segn el ID3*/ int ObtenerNuevoNivel(); /*numeracin de niveles para el rbol*/ int ObtenerNuevoValor(); /*numeracin de subndices del VecValores para la impresin del rbol*/ int ArmarTabla(TTablaCorrel& Tabla, int Nivel, int desc,TStringList *valores); /*arma la tabla de correlacin para el nro de descriptor indicado en el nivel del rbol indicado Si la funcin devuelve un 0 significa que no hubo problemas Hubo problemas en todo otro caso*/ int Particionar(int desc, int nivel, tree_ptr pNode, TStringList *valores); /*realiza la particin del conjunto de datos Si la funcin devuelve un 0 significa que no hubo problemas Hubo problemas en todo otro caso*/ short int PruneTree(tree_ptr Tree); /*realiza el "pruning" del rbol obtenido Devuelve 0 si todos los valores son "Yes" 1 si todos los valores son "No" 2 si los valores son mixtos -1 si los valores son distintos*/ void ArmarReglas(tree_ptr Tree); /*Arma las reglas de decisin generadas a partir del rbol de decisin "Tree"*/ void ObtenerReglas(tree_ptr Tree, TVecInt VecReglas, int nroRegla, int codigo); short int ObtenerNroRegla();/*numeracin de las reglas de decisin*/ short int ObtenerSubReglas(); short int ObtenerNroUpdate(); void AplicarReglas(AnsiString Tabla, int codigoReglas);/*Aplica a Tabla las reglas obtenidas*/ short int EvaluarReglas(int codigoReglas);/*Evalua las reglas obtenidas sobre los datos especificados*/ //----FUNCIONES UTILIZADAS PARA EL CLCULO DE LA ENTROPA float InfoTermino(int cant, int total); /*informacin brindada por un trmino*/ float Ianterior(int cant_clasificadores, int cant_descriptores, TTablaCorrel tabla); /*Esta funcin devuelve la informacin de un conjunto antes de realizar la particin*/ float Iposterior(int cant_clasificadores, int cant_descriptores, TTablaCorrel tabla); /*Esta funcin devuelve la informacin de un conjunto despus de realizar la particin segn el atributo por el que se arm la tabla*/ float Gain(float Ianterior, float Iposterior); /*Ganancia debida a la particin del conjunto segn el atributo en cuestin*/ float SplitInfo(int cant_clasificadores, int cant_descriptores, TTablaCorrel tabla); /*Informacin debida a la particin realizada*/ float GainRatio(float Ganancia, float SplitInformation); 232 Magdalena Servente Cdigo Fuente
/*Proporcin de ganancia debida a la particin del conjunto segn el atributo en cuestin*/ float GananciaEntropia(int cant_clasificadores, int cant_descriptores, TTablaCorrel tabla); /*Utiliza todas las funciones anteriores para obtener el Gain Ratio de la tabla recibida como parmetro*/
tree_ptr InicializarTree(); /*inicializa el rbol, devolviendo un ptr a la raz */ void EliminarTree(tree_ptr Tree); /*elimina todos los elementos del rbol, liberando la memoria*/ void InformarValores(TVecValores VecVal); /*Recibe los valores del arbol generado*/ void InformarDescrip(TVecValores VecDesc); /*Recibe las descripciones del arbol generado*/ }; //--------------------------------------------------------------------------extern PACKAGE TDMID3 *DMID3; //--------------------------------------------------------------------------#endif
D.4.1.2. UDMID3.cpp
//--------------------------------------------------------------------------#pragma hdrstop #include "UDMID3.h" //--------------------------------------------------------------------------#pragma package(smart_init) #pragma resource "*.dfm" TDMID3 *DMID3; tree_ptr pRoot;
//--------------------------------------------------------------------------__fastcall TDMID3::TDMID3(TComponent* Owner) : TDataModule(Owner) { } //--------------------------------------------------------------------------//==============================VARIABLES====================================== /*String que tendr los valores posibles para el clasificador*/
TVecValores VecValores; TVecValores VecDescriptores; fstream FReglas; //guarda las reglas generadas en formato de Insight 2+ fstream FVitacora; //guarda las tablas generadas en cada paso del ID3 int UsoGain; //vale 0 si uso gain, 1 si uso gain ratio //--------------------------------------------------------------------------//-----------------------IMPLEMENTACIN-------------------------------------//--------------------------------------------------------------------------/****************************************************************************** Funcin principal que comienza con el armado del rbol de decisin segn el algoritmo ID3 ******************************************************************************/ tree_ptr TDMID3::Principal ( short int MedidorGanancia) { int cant_descr; short int ValidDs[MAX_CANT_DESCRIPTORES]; short int *pValidDs = ValidDs; int i, error; char outFile[50]="Log\\ID3"; tree_ptr pRoot; UsoGain=MedidorGanancia;
Cdigo Fuente
Magdalena Servente
233
//Obtener cantidad de descriptores cant_descr=ObtenerCantDescr(); for (i=0;i<cant_descr; i++) ValidDs[i]=1; error=BuscarPK(ValidDs); if (error!=1) { DateSeparator='-'; TimeSeparator='_'; strcat(outFile, DateTimeToStr(Now()).c_str()); strcat(outFile, Params->TablaBD.c_str()); strcat(outFile, ".log"); FVitacora.open(outFile, ios::out); pRoot=BuildTree(ObtenerNuevoNivel(), pValidDs); FVitacora.close(); return(pRoot); } else { pRoot=NULL; return(pRoot); } }
void TDMID3::RecibirParametros(TParametros *Parametros) { int i; AnsiString sqlstring; Params=Parametros; TTennis->DatabaseName=Params->NombreBD; TTennis->TableName=Params->TablaBD; TTennis->Active=true;
//Inicializamos los queries que harn sus consultas sobre la base //especificada QGral->DatabaseName=Params->NombreBD; for (i=0; i<MAX_NIVELES;i++) { VecValores[i]=""; VecDescriptores[i]=""; } //Inicializamos el campo Nivel en la Tabla sqlstring="Update "; AppendStr(sqlstring, Params->TablaBD); AppendStr(sqlstring," SET Nivel = 0 "); QGral->SQL->Clear(); QGral->SQL->Add(sqlstring); QGral->ExecSQL(); QGral->SQL->Clear(); TTennis->Close(); TTennis->Open(); sqlstring.~AnsiString(); } /****************************************************************************** Verifica la uniformidad de un conjunto de filas, por uniformidad nos referimos al hecho que todos los valores del clasificador para dicho conjunto sean iguales Devuelve: 0 si todos los valores son "Yes" 1 si todos los valores son "No" 3 si los valores no son uniformes 4 si hubo un error ******************************************************************************/ short int TDMID3::EsUniforme(int nivelArbol) {//begin EsUniforme 234 Magdalena Servente Cdigo Fuente
short int aux; AnsiString sqlstring; try //intentamos abrir el QUniforme { sqlstring="Select Count(Distinct "; AppendStr(sqlstring, Params->ColClasificador); AppendStr(sqlstring,") AS diferentes FROM "); AppendStr(sqlstring,Params->TablaBD); AppendStr(sqlstring," WHERE Nivel= "); AppendStr(sqlstring,nivelArbol); QGral->SQL->Clear(); QGral->SQL->Add(sqlstring); sqlstring.~AnsiString(); QGral->Open(); aux=0; aux=(short int)QGral->FieldByName("diferentes")->AsInteger; if (aux!=1) //no son uniformes return(3); else { QGral->Close(); sqlstring="Select "; AppendStr(sqlstring, Params->ColClasificador); AppendStr(sqlstring," AS valor FROM "); AppendStr(sqlstring,Params->TablaBD); AppendStr(sqlstring," WHERE Nivel= "); AppendStr(sqlstring,nivelArbol); QGral->SQL->Clear(); QGral->SQL->Add(sqlstring); QGral->Open(); if (QGral->FieldByName("valor")->AsString == >LClasificadores->Strings[0]) aux=0; else aux=1; QGral->Close(); return(aux); } } catch(...) { sqlstring.~AnsiString(); ShowMessage("No se pudo abrir el Query"); return(4); } }//fin EsUniforme /****************************************************************************** Obtiene la cantidad de descriptores presentes en la tabla que ser la cantidad de atributos menos 2: el clasificador y el atributo nivel ******************************************************************************/ int TDMID3::ObtenerCantDescr() { int cant_descr; TTennis->Open(); cant_descr=TTennis->FieldCount; cant_descr-=2; return(cant_descr); } /****************************************************************************** /*Busca claves primarias en la tabla, para no trabajar sobre esos campos por no ofrecer ninguna ganancia de informacin Devuelve: 0 si no hubo problemas 1 si hubo algn error /******************************************************************************/ int TDMID3::BuscarPK(short int ValidDs[]) { AnsiString sqlstring; int i, cantCampos, cantReg;
Params-
cantCampos=TTennis->FieldCount; cantReg=TTennis->RecordCount;
Cdigo Fuente
Magdalena Servente
235
try { for (i=0; i<cantCampos-1; i++) { sqlstring="SELECT COUNT(DISTINCT "; AppendStr(sqlstring,TTennis->Fields->Fields[i]->FieldName); AppendStr(sqlstring," ) as Cant FROM "); AppendStr(sqlstring, Params->TablaBD); QGral->SQL->Clear(); QGral->SQL->Add(sqlstring); sqlstring.~AnsiString(); QGral->Open(); if (QGral->FieldByName("Cant")->AsInteger==cantReg) ValidDs[i]=0; //no es un desc vlido por ser PK QGral->Close(); } return(0); } catch(...) { sqlstring.~AnsiString(); ShowMessage("No se pudo abrir el Query"); return(1); } } //--------------------------------------------------------------------------/****************************************************************************** Funcin recursiva que arma el rbol de decisin segn el algoritmo ID3 ******************************************************************************/ tree_ptr TDMID3::BuildTree(int nivel, short int *pD) { float max_ganancia=-1000; short int desc_max_ganancia=-1; /*descriptor con la mayor ganancia*/ float ganancia; short int unif; tree_ptr pNewNode; short int i; int cant_clas, cant_valores_descr; int exito; TTablaCorrel Tabla; TStringList *valores = new TStringList(); TStringList *MaxValores = new TStringList(); cant_clas=Params->LClasificadores->Count; /* Inicializar Nodo*/ pNewNode=(DECISION_TREE)malloc(sizeof(struct tree_node)); if (pNewNode==0) { ShowMessage("No hay suficiente espacio en memoria para la operacin"); } else { for (i=0; i<MAX_HIJOS; i++) pNewNode->pHijos[i]=0; pNewNode->desc=-1; for (i=0; i<MAX_CANT_DESCRIPTORES; i++) pNewNode->D[i]=*(pD+i); FVitacora<<"******************************************************"; FVitacora<<endl; FVitacora<<"Nivel="; FVitacora<<nivel<<endl; /* EsUniforme?*/ unif=EsUniforme(nivel); if (unif!=4) /*no hubo un error*/ if (unif!=3) /*es hoja*/ { /* Si es hoja, tabularla*/ pNewNode->flag_hoja=unif; /*unif valdr 0 si todos los valores 236 Magdalena Servente Cdigo Fuente
son "Yes", y 1 si todos son "No"*/ delete valores; delete MaxValores; return pNewNode; } else /*no es hoja*/ { pNewNode->flag_hoja=3; /*Si no es hoja, calcular la entropa para cada descriptror vlido en el nivel que estamos analizando. Obtenemos el descriptor de mayor ganancia*/ for (i=0; i<MAX_CANT_DESCRIPTORES; i++) if (pNewNode->D[i]==1) /*es un descriptor vlido*/ { valores->Clear(); exito=ArmarTabla(Tabla,nivel,i, valores); if (exito==0) { cant_valores_descr=valores->Count; ganancia=GananciaEntropia(cant_clas, cant_valores_descr, Tabla); if (ganancia>max_ganancia) { max_ganancia=ganancia; desc_max_ganancia=i; MaxValores->Clear(); MaxValores->AddStrings(valores); } } } delete valores; /*Partir el conjunto segn el desciptor que ofrezca mayor entropa*/ if (desc_max_ganancia>=0) //es un descriptor vlido { pNewNode->desc=desc_max_ganancia; /*descriptor utilizado para realizar la particin*/ pNewNode->D[desc_max_ganancia]=0; FVitacora<<desc_max_ganancia; FVitacora<<" "; FVitacora<<max_ganancia<<endl; if (exito==0) exito=Particionar(desc_max_ganancia, pNewNode,MaxValores); delete MaxValores; return(pNewNode); } else /*se acabaron los descriptores, entonces habr errores en el resultado*/ { pNewNode->flag_hoja=2; delete valores; delete MaxValores; return pNewNode; } } // fin else no es hoja }//fin else } //--------------------------------------------------------------------------/****************************************************************************** Esta funcin proporciona un identificador nico para cada uno de los niveles del rbol ******************************************************************************/ int TDMID3::ObtenerNuevoNivel() /*numeracin de niveles para el rbol*/ { static int i=-1; i++; return(i); }
nivel,
//-----------------------------------------------------------------------------/****************************************************************************** Esta funcin devuelve la informacin brindada por un trmino cant: cantidad de ocurrencias de ese elemento total: total de elementos en el conjunto InfoTermino=-(cant/total)log2(cant/total) ******************************************************************************/ float TDMID3::InfoTermino(int cant, int total) { float temp; float temp1; float temp2;
if ((cant!=0)&&(total!=0)) { temp1=float(cant)*0.1; temp2=float(total)*0.1; temp=temp1/temp2; if (temp==0) temp=0; else temp*=Log2(temp); temp=-temp; return(temp); } else return(0); } /****************************************************************************** Esta funcin devuelve la informacin de un conjunto antes de realizar la particin cant_clasificadores: cantidad de valores posibles para los clasificadores, es decir, la cantidad de filas de la tabla de correlacin cant_descriptores: cantidad de descriptores vlidos para el nivel del rbol que se est analizando, es decir, la cantidad de columnas de la tabla de correlacin Ianterior(T)=Sum(i=1, i<k)(-(cant/Total)log2(cant/total)) ******************************************************************************/ float TDMID3::Ianterior(int cant_clasificadores, int cant_descriptores, TTablaCorrel tabla) { float auxI=0; float temp1, temp2; int i;
for (i=0; i<cant_clasificadores; i++) { temp1=float(tabla[i][cant_descriptores]); temp2=float(tabla[cant_clasificadores][cant_descriptores]); if (temp2!=0) temp1=temp1/temp2; if (temp1!=0) auxI+=temp1*(Log2(temp1));//InfoTermino(tabla[i][cant_descriptores],tabla[cant_clasificadores][cant_d escriptores]); } return(auxI); } /****************************************************************************** Esta funcin devuelve la informacin de un conjunto despus de realizar la particin segn el atributo por el que se arm la tabla cant_clasificadores: cantidad de valores posibles para los clasificadores, es decir, la cantidad de filas de la tabla de correlacin cant_descriptores: cantidad de descriptores vlidos para el nivel del rbol que se est analizando, es decir, la cantidad de columnas de la tabla de correlacin Iposterior(T)=Sum(i=1, i<k)(-(cant/Total)log2(cant/total)) ******************************************************************************/
238
Magdalena Servente
Cdigo Fuente
cant_clasificadores,
int
cant_descriptores,
TTablaCorrel
Iaux=0; for (i=0; i<cant_descriptores; i++) { Itemp=0; for (j=0; j<cant_clasificadores; j++) { Itemp+=InfoTermino(tabla[j][i], tabla[cant_clasificadores][i]); } if (tabla[cant_clasificadores][cant_descriptores]!=0) { Iaux+=(float(tabla[cant_clasificadores][i])/float(tabla[cant_clasificadores][cant_descri ptores]))*Itemp; } } return(Iaux); } /****************************************************************************** Ganancia debida a la particin del conjunto segn el atributo en cuestin Gain=Ianterior-Iposterior; ******************************************************************************/ float TDMID3::Gain(float Ianterior, float Iposterior) { return(Ianterior-Iposterior); } /****************************************************************************** Informacin debida a la particin realizada Sum(i=1, k)(|cant elementos segn la particin i||cant total de elementos|* *InfoTermino); ******************************************************************************/ float TDMID3::SplitInfo(int tabla) { float SIaux; int i; cant_clasificadores, int cant_descriptores, TTablaCorrel
SIaux=0; for (i=0; i<cant_descriptores; i++) { if (tabla[cant_clasificadores][cant_descriptores]!=0) { SIaux+=InfoTermino(tabla[cant_clasificadores][i],tabla[cant_clasificadores][cant_descrip tores])*(float(tabla[cant_clasificadores][i])/float(tabla[cant_clasificadores][cant_desc riptores])); } } return(SIaux); } /****************************************************************************** Proporcin de ganancia debida a la particin del conjunto segn el atributo en cuestin Gain=Gain/SplitInfo; ******************************************************************************/ float TDMID3::GainRatio(float Ganancia, float SplitInformation) { if (SplitInformation!=0) return(Ganancia/SplitInformation); else return(0); } /****************************************************************************** Utiliza todas las funciones anteriores para obtener el Gain Ratio de la tabla recibida como parmetro ******************************************************************************/ float TDMID3::GananciaEntropia(int cant_clasificadores, int cant_descriptores, TTablaCorrel tabla) Cdigo Fuente Magdalena Servente 239
{ float anterior, posterior, gano; float splitI, auxGE; anterior=Ianterior(cant_clasificadores, cant_descriptores, tabla); posterior=Iposterior(cant_clasificadores, cant_descriptores, tabla); gano=Gain(anterior, posterior); splitI=SplitInfo(cant_clasificadores, cant_descriptores, tabla); auxGE=GainRatio(gano,splitI); FVitacora<<"Gain="; FVitacora<<gano<<endl; FVitacora<<"Gain Ratio="; FVitacora<<auxGE<<endl; FVitacora<<"--------------------------------------"; FVitacora<<endl; if (UsoGain==0) return(gano); else return(auxGE); } //--------------------------------------------------------------------------/****************************************************************************** Arma la tabla de correlacin Nivel: es el nivel del rbol que se est analizando desc: es el descriptor segn el que se quiere armar la tabla Si la funcin devuelve un 0 significa que no hubo problemas Hubo problemas en todo otro caso ******************************************************************************/ int TDMID3::ArmarTabla(TTablaCorrel& Tabla, int Nivel, int desc, TStringList *valores) { int c, d, maxd; int cant_clas; int CantTotal; AnsiString sqlstring1(""); AnsiString sqlstring2(""); TStringList *lista = new TStringList(); valores->Clear(); cant_clas=Params->LClasificadores->Count; /*Obtenemos el nombre del atributo "desc" de la tabla*/ TTennis->GetFieldNames(lista); //====================================================================== //=================== MANEJO DEL QUERY PARA ============================ //===OBTENER TODOS LOS VALORES POSIBLES DE UN ATRIBUTO ================= //====================================================================== try //Intentamos abrir el Query { /*Obtenemos todos los valores posibles para el atributo descriptor*/ sqlstring1="SELECT DISTINCT("; AppendStr(sqlstring1,lista->Strings[desc]); AppendStr(sqlstring1,") as descriptor FROM "); AppendStr(sqlstring1, Params->TablaBD); AppendStr(sqlstring1," WHERE Nivel="); AppendStr(sqlstring1,IntToStr(Nivel)); QGral->SQL->Clear(); QGral->SQL->Add(sqlstring1); QGral->Open(); QGral->First(); sqlstring1.~AnsiString(); FVitacora<<"Descriptor="; FVitacora<<lista->Strings[desc].c_str()<<endl; d=0; while (!(QGral->Eof)) /*Obtenemos todos los valores posbiles para el descriptor en la lista valores*/ { valores->Add(QGral->FieldByName("Descriptor")->AsString); d++; QGral->Next(); }//fin del while 240 Magdalena Servente Cdigo Fuente
maxd=d-1; QGral->Close(); } catch(...) //De la apertura del Query { ShowMessage("No se pudo abrir el Query para obtener todos los valores de un descriptor"); delete lista; sqlstring1.~AnsiString(); sqlstring2.~AnsiString(); return(1); } //====================================================================== //=================== MANEJO DEL QUERY ============================= //===========CARGAMOS LOS VALORES INDIVIDUALES DE Tabla[c][d]=========== //==========================(NO LOS TOTALES)============================ //====================================================================== try //Intentamos abrir el QGral { d=0; while (d<=maxd) { FVitacora<<" "; FVitacora<<valores->Strings[d].c_str(); d++; } c=0; while (c<cant_clas) { d=0; FVitacora<<endl; FVitacora<<Trim(Params->LClasificadores->Strings[c]).c_str(); FVitacora<<" "; while (d<=maxd) { sqlstring2="SELECT (COUNT(*)) as Cant FROM "; AppendStr(sqlstring2, Params->TablaBD); AppendStr(sqlstring2," WHERE Nivel="); AppendStr(sqlstring2,IntToStr(Nivel)); AppendStr(sqlstring2," AND "); AppendStr(sqlstring2,lista->Strings[desc]); AppendStr(sqlstring2," = '"); AppendStr(sqlstring2,valores->Strings[d]); AppendStr(sqlstring2,"' AND "); AppendStr(sqlstring2, Params->ColClasificador); AppendStr(sqlstring2, " = '"); AppendStr(sqlstring2,Trim(Params->LClasificadores->Strings[c])); // AppendStr(sqlstring2,"Yes"); AppendStr(sqlstring2,"'"); QGral->SQL->Clear(); QGral->SQL->Add(sqlstring2); QGral->Open(); sqlstring2.~AnsiString(); Tabla[c][d]=QGral->FieldByName("Cant")->AsInteger; FVitacora<<Tabla[c][d]; FVitacora<<" QGral->Close(); d++; }//fin while (d<=maxd) c++; }//fin while (c<=cant_clas)
";
} catch(...) { ShowMessage("No se pudo abrir el Query para obtener la cantidad de registros con un valor determinado de descriptor"); delete lista; sqlstring2.~AnsiString(); return(1); }//fin del catch
Cdigo Fuente
Magdalena Servente
241
/*Obtenemos los totales de la tabla de correlacin*/ /* TOTALES POR FILA */ for (c=0; c<cant_clas; c++) { Tabla[c][maxd+1]=0; for (d=0; d<=maxd; d++) Tabla[c][maxd+1]+=Tabla[c][d]; } /* TOTALES POR COLUMNA Y CANTIDAD TOTAL*/ CantTotal=0; FVitacora<<endl; for (d=0; d<=maxd; d++) { Tabla[cant_clas][d]=0; FVitacora<<" "; for (c=0; c<cant_clas; c++) Tabla[cant_clas][d]+=Tabla[c][d]; CantTotal+=Tabla[cant_clas][d]; FVitacora<<Tabla[cant_clas][d]; FVitacora<<" "; } Tabla[cant_clas][maxd+1]=CantTotal; FVitacora<<Tabla[cant_clas][maxd+1]; FVitacora<<endl; delete lista; return(0); } //--------------------------------------------------------------------------/****************************************************************************** Particiona el conjunto de datos segn el descriptor indicado, en tantos conjuntos como valores pueda tomar el descriptor. desc: es el nro de descriptor con el que trabajamos pNode: es el nodo del rbol desde el cual se est haciendo la particin valores: es la lista de valores posibles que puede tomar el descriptor ******************************************************************************/ int TDMID3::Particionar(int desc, int nivel, tree_ptr pNode, TStringList *valores) { AnsiString sqlstring; AnsiString particion; TStringList *lista = new TStringList(); int i, maxValores; int nuevoNivel; short int *pDesc=pNode->D; /*Obtenemos el nombre del atributo "desc" de la tabla*/ TTennis->GetFieldNames(lista); maxValores=valores->Count; try { for (i=0; i<maxValores; i++) { sqlstring="Update "; AppendStr(sqlstring, Params->TablaBD); AppendStr(sqlstring," SET Nivel = "); nuevoNivel=ObtenerNuevoNivel(); AppendStr(sqlstring, IntToStr(nuevoNivel)); AppendStr(sqlstring," WHERE Nivel="); AppendStr(sqlstring,IntToStr(nivel)); AppendStr(sqlstring, " AND "); AppendStr(sqlstring, lista->Strings[desc]); AppendStr(sqlstring, "= '"); AppendStr(sqlstring, valores->Strings[i]); AppendStr(sqlstring, "'"); QGral->SQL->Clear(); QGral->SQL->Add(sqlstring); QGral->ExecSQL(); QGral->SQL->Clear(); particion=lista->Strings[desc]; //nombre del descriptor VecDescriptores[nuevoNivel]=lista->Strings[desc]; AppendStr(particion, " = "); AppendStr(particion, valores->Strings[i]); //valor del descriptor 242 Magdalena Servente Cdigo Fuente
VecValores[nuevoNivel]=valores->Strings[i]; TTennis->Close(); TTennis->Open(); pNode->pHijos[i]=BuildTree(nuevoNivel, pDesc); } sqlstring.~AnsiString(); particion.~AnsiString(); delete lista; return(0); } catch(...) { ShowMessage("No se pudo realizar la actualizacin"); sqlstring.~AnsiString(); particion.~AnsiString(); delete lista; return(1); } } //--------------------------------------------------------------------------/****************************************************************************** /*realiza el "pruning" del rbol obtenido Devuelve 0 si todos los valores son "Yes" 1 si todos los valores son "No" 2 si los valores son mixtos -1 si los valores son distintos ******************************************************************************/ short int TDMID3::PruneTree(tree_ptr Tree) { int i; short int hijo; short int iguales; /* 0 si todos los valores son "Yes" 1 si todos los valores son "No" 2 si todos los valores son mixtos -1 si no son iguales*/
if (Tree->flag_hoja!=3) //es hoja return(Tree->flag_hoja); else { i=0; iguales=3; while ((Tree->pHijos[i]!=NULL)&&(i<MAX_HIJOS)&&(iguales!=-1)) { hijo=PruneTree(Tree->pHijos[i]); if (iguales==3) iguales=hijo; else { if (iguales!=hijo) iguales=-1; } i++; } if (iguales!=-1) //se puede "podar" la rama { Tree->flag_hoja=iguales; i=0; while ((Tree->pHijos[i]!=NULL)&&(i<MAX_HIJOS)) { EliminarTree(Tree->pHijos[i]); i++; } } return(iguales); }//end else }//end PruneTree //--------------------------------------------------------------------------/****************************************************************************** **Arma las reglas de decisin generadas a partir del rbol de decisin "Tree"*** ******************************************************************************/ void TDMID3::ArmarReglas(tree_ptr Tree) { TVecInt VecReglas; Cdigo Fuente Magdalena Servente 243
char outFile[50]="Reglas\\"; int nroRegla; int i; nroRegla=0; char* tabla=""; char* delimitador="."; AnsiString sqlstring; int cod; //Iniciliazamos el vector de reglas for (i=0; i<MAX_NIVELES; i++) {VecReglas[i]=-1;} /*Creamos el archivo de texto donde quedarn las reglas de decisin con la extensin especificada por el usuario, ".prl" por default.*/
//Abrimos la tabla de Updates QUpdates->DatabaseName=Params->NombreBD; sqlstring="SELECT * FROM UpdatesHeader.db"; QUpdates->SQL->Clear(); QUpdates->SQL->Add(sqlstring); QUpdates->Open(); QUpdates->Last(); cod=QUpdates->RecordCount; cod++; QUpdates->SQL->Clear(); //Insertamos el Header de las Consultas DateSeparator='/'; TimeSeparator=':'; sqlstring="INSERT INTO UpdatesHeader.db (CODIGO, HORA) VALUES ("; AppendStr(sqlstring,cod); AppendStr(sqlstring,", '"); AppendStr(sqlstring, Params->TablaBD); AppendStr(sqlstring,"', 'ID3', '"); AppendStr(sqlstring, Date()); AppendStr(sqlstring,"', '"); AppendStr(sqlstring, Time()); AppendStr(sqlstring,"')"); QUpdates->SQL->Add(sqlstring); QUpdates->ExecSQL(); QUpdates->SQL->Clear(); //Concatenamos fecha y hora en los archivos DateSeparator='-'; TimeSeparator='_'; strcat(outFile, DateTimeToStr(Now()).c_str());
//Eliminamos la extensin de la tabla de la base de datos tabla=strtok(Params->TablaBD.c_str(),delimitador); strcat(outFile, tabla); //Les agregamos la extensin strcat(outFile, Params->ExtensionFileReglas.c_str()); FReglas.open(outFile, ios::out); //Obtenemos las reglas ObtenerReglas(Tree, VecReglas, nroRegla,cod); //Cerramos el archivo FReglas.close(); sqlstring.~AnsiString(); } void TDMID3::ObtenerReglas(tree_ptr Tree, TVecInt VecReglas, int nroRegla, int codigo) { char header[15]="Regla "; char then[]=" ENTONCES "; char si[]=" SI "; char is[]=" = "; char es[]=" = "; char and[]=" Y "; AnsiString sqlstring; AnsiString sqlstring2; AnsiString tabla; int i,j; 244 Magdalena Servente Cdigo Fuente
TRule rule=""; if (nroRegla!=0) { /*Agregamos el el vector de reglas el subindice del par "descriptor - valor" utilizado para armar a regla, es decir, utilizado para recorrer la rama del arbol */ j=0; while (VecReglas[j]!=-1) {j++;} VecReglas[j]=ObtenerSubReglas(); } if (Tree->flag_hoja!=3) //es hoja { //Agregamos el nro de regla "RULE N" FReglas << endl; FReglas << endl; FReglas << header; FReglas << ObtenerNroRegla() << endl; //Armamos la regla FReglas << si; //descriptor j=0; strcat(rule, VecDescriptores[VecReglas[j]].c_str()); sqlstring=VecDescriptores[VecReglas[j]]; AppendStr(sqlstring,"="); strcat(rule, es); //valor strcat(rule, VecValores[VecReglas[j]].c_str()); AppendStr(sqlstring,"'"); AppendStr(sqlstring,VecValores[VecReglas[j]]); AppendStr(sqlstring,"'"); FReglas << rule << endl; j++; while (VecReglas[j]!=-1) { strcpy(rule, and); AppendStr(sqlstring," and "); //descriptor strcat(rule, VecDescriptores[VecReglas[j]].c_str()); strcat(rule, es); AppendStr(sqlstring,VecDescriptores[VecReglas[j]]); AppendStr(sqlstring," = "); //valor strcat(rule, VecValores[VecReglas[j]].c_str()); AppendStr(sqlstring,"'"); AppendStr(sqlstring,VecValores[VecReglas[j]]); AppendStr(sqlstring,"'"); j++; FReglas << rule << endl; } //Agregamos la conclusion de la regla strcpy(header, then); strcat(header,Params->ColClasificador.c_str()); strcat(header, is); strcat(header, Params->LClasificadores->Strings[Tree>flag_hoja].c_str()); FReglas << header << endl; sqlstring.Insert("' WHERE ",0); sqlstring.Insert(Trim(Params->LClasificadores->Strings[Tree>flag_hoja]).c_str(),0); sqlstring.Insert(" = '",0); sqlstring.Insert(Params->ColClasificador,0); tabla=AnsiString(Params->TablaBD.c_str()); sqlstring.Insert(" SET ",0); sqlstring2="INSERT INTO Updates.db (CODIGO, NRO_REGLA, MODIFICACION) VALUES ("; AppendStr(sqlstring2,codigo); AppendStr(sqlstring2,", "); AppendStr(sqlstring2, ObtenerNroUpdate()); AppendStr(sqlstring2, ", "); AppendStr(sqlstring2,char(34)); //agregamos las comillas AppendStr(sqlstring2,sqlstring); AppendStr(sqlstring2,char(34)); AppendStr(sqlstring2,")"); Cdigo Fuente Magdalena Servente 245
} else //no es hoja { i=0; nroRegla++; while ((Tree->pHijos[i]!=NULL)&&(i<MAX_HIJOS)) { ObtenerReglas(Tree->pHijos[i], VecReglas, nroRegla,codigo); /*Eliminamos el valor de la ultima rama recorrida porque estamos cambiando de rama*/ j=0; while (VecReglas[j]!=-1) {j++;} VecReglas[j-1]=-1; i++; } }//end else tabla.~AnsiString(); sqlstring.~AnsiString(); sqlstring2.~AnsiString(); return; } /****************************************************************************** **Numeracin nica para las reglas de decisin generadas********************** ******************************************************************************/ short int TDMID3::ObtenerNroRegla() { static short int nroRegla=-1; nroRegla++; return(nroRegla); } short int TDMID3::ObtenerSubReglas() { static short int subRegla=0; subRegla++; return(subRegla); } short int TDMID3::ObtenerNroUpdate() { static short int nroRegla=-1; nroRegla++; return(nroRegla); }
//--------------------------------------------------------------------------/****************************************************************************** **Inicializa el rbol, creando un ptr a la raz del mismo********************** ******************************************************************************/ tree_ptr TDMID3::InicializarTree() { tree_ptr pNewNode; pNewNode=(DECISION_TREE)malloc(sizeof(struct tree_node)); if (pNewNode==0) { ShowMessage("No hay suficiente espacio en memoria para la operacin"); return(NULL); } else { pNewNode->pHijos[0]=0; return(pNewNode); } }
**Elimina todos los elementos del rbol, liberando la memoria****************** ******************************************************************************/ void TDMID3::EliminarTree(tree_ptr Tree) { int i; i=0; while ((Tree->pHijos[i]!=NULL)&&(i<5)) { EliminarTree(Tree->pHijos[i]); free(Tree->pHijos[i]); i++; } return; } void TDMID3::InformarValores(TVecValores VecVal) /*Recibe los valores del arbol generado*/ {int i; for (i=0;i<MAX_NIVELES;i++) {VecVal[i]=VecValores[i];} }; void TDMID3::InformarDescrip(TVecValores VecDesc) /*Recibe las descripciones del arbol generado*/ {int i; for (i=0;i<MAX_NIVELES;i++) {VecDesc[i]=VecDescriptores[i];} }; /****************************************************************************** ****************Evaluamos los resultados obtenidos***************************** *******************************************************************************/ void TDMID3::AplicarReglas(AnsiString Tabla, int codigoReglas) {AnsiString sqlstring; TQuery *QReglas=new TQuery(DMID3); TQuery *QAplicar=new TQuery(DMID3); QReglas->DatabaseName=Params->NombreBD; QAplicar->DatabaseName=Params->NombreBD; sqlstring="SELECT * FROM Updates.db where codigo="; AppendStr(sqlstring, codigoReglas); QReglas->SQL->Clear(); QReglas->SQL->Add(sqlstring); QReglas->Open(); QReglas->Last(); QReglas->First(); while (!QReglas->Eof) { sqlstring=QReglas->FieldByName("Modificacion")->AsString; sqlstring.Insert(Tabla,0); sqlstring.Insert("UPDATE ",0); QAplicar->SQL->Clear(); QAplicar->SQL->Add(sqlstring); QAplicar->ExecSQL(); QReglas->Next(); } delete(QReglas); delete(QAplicar); sqlstring.~AnsiString(); } //Evalua los resultados de las reglas aplicadas sobre la tabla de NombreTabla short int TDMID3::EvaluarResultados(AnsiString NombreTabla) /*Arma una tabla de resultados de la forma: Correcto Errores Probabilidad de acierto Clase1 x y t Clase2 m n l .... ... ... ... ClaseN z w v Totales totC totE totProb */ { TTablaCorrel TablaRes; int i, correctos,erroneos; Cdigo Fuente Magdalena Servente 247
TQuery *QClases=new TQuery(DMID3); TQuery *QRes=new TQuery(DMID3); AnsiString sqlstring; TFrmRendimiento *pForm; try { pForm=FrmRendimiento; //Inicializamos los nombres de las columnas pForm->GridResultados->Cells[0][0]="Clases"; pForm->GridResultados->Cells[1][0]="Correctos"; pForm->GridResultados->Cells[2][0]="Errores"; pForm->GridResultados->Cells[3][0]="Probabilidad de Aciertos"; QClases->DatabaseName=Params->NombreBD; QRes->DatabaseName=Params->NombreBD; //Obtenemos los nombres de todas las clases sqlstring="SELECT DISTINCT(ClaseReal) as Clase FROM "; AppendStr(sqlstring,NombreTabla); QClases->SQL->Clear(); QClases->SQL->Add(sqlstring); QClases->Open(); QClases->First(); i=0; while(!QClases->Eof) { pForm->GridResultados->Cells[0][i+1]=QClases->FieldByName("Clase")>AsString; //Correctos sqlstring=QClases->FieldByName("Clase")->AsString; sqlstring.Insert(" WHERE ClaseReal='",0); sqlstring.Insert(NombreTabla,0); sqlstring.Insert("SELECT Count(*) as Correctos FROM ",0); AppendStr(sqlstring,"' AND ClaseReal="); AppendStr(sqlstring,Params->ColClasificador); QRes->SQL->Clear(); QRes->SQL->Add(sqlstring); QRes->Open(); QRes->First(); TablaRes[i][0]=(double)QRes->FieldByName("Correctos")->AsInteger; pForm->GridResultados->Cells[1][i+1]=TablaRes[i][0]; //Errores sqlstring=QClases->FieldByName("Clase")->AsString; sqlstring.Insert(" WHERE ClaseReal='",0); sqlstring.Insert(NombreTabla,0); sqlstring.Insert("SELECT Count(*) as Erroneos FROM ",0); AppendStr(sqlstring,"' AND ClaseReal<>"); AppendStr(sqlstring,Params->ColClasificador); QRes->SQL->Clear(); QRes->SQL->Add(sqlstring); QRes->Open(); QRes->First(); TablaRes[i][1]=QRes->FieldByName("Erroneos")->AsInteger; pForm->GridResultados->Cells[2][i+1]=TablaRes[i][1]; QClases->Next(); pForm->GridResultados->RowCount++; i++; } QClases->First(); i=0; correctos=0; erroneos=0; while(!QClases->Eof) { /*Calculamos la probabilidad con que un ejemplo clasificado como de clase i pertenece a dicha clase*/ TablaRes[i][2]=TablaRes[i][0]/(TablaRes[i][0]+TablaRes[i][1]); pForm->GridResultados->Cells[3][i+1]=TablaRes[i][2]; correctos+=TablaRes[i][0]; erroneos+=TablaRes[i][1]; QClases->Next(); 248 Magdalena Servente Cdigo Fuente
i++; } //Resultados generales TablaRes[i][0]=correctos; TablaRes[i][1]=erroneos; TablaRes[i][2]=TablaRes[i][0]/(TablaRes[i][0]+TablaRes[i][1]); pForm->GridResultados->Cells[0][i+1]="Totales"; pForm->GridResultados->Cells[1][i+1]=TablaRes[i][0]; pForm->GridResultados->Cells[2][i+1]=TablaRes[i][1]; pForm->GridResultados->Cells[3][i+1]=TablaRes[i][2];
QClases->Close(); QRes->Close(); delete(QClases); delete(QRes); sqlstring.~AnsiString(); return(0); } catch(...) { delete(QClases); delete(QRes); sqlstring.~AnsiString(); return(-1); } }
short int TDMID3::EvaluarReglas(int codigoReglas) /*Devuelve: 0: no hubo problemas -1: problema general -2: problema en la creacin de la tabla de evaluacin -3: problema en la inicializacin de la tabla de evaluacin */
{boolean CrearTabla; AnsiString consulta; TStringList *listaCampos = new TStringList(); TQuery *QIni=new TQuery(DMID3); TTable *TEval=new TTable(DMID3); int i; short int errorNo; try { TEval->Active=false; TEval->DatabaseName=Params->NombreBD; TEval->TableName="Eval.db"; TEval->TableType=ttDefault; TEval->FieldDefs->Clear(); TFieldDef *NewField=TEval->FieldDefs->AddFieldDef(); NewField->DataType=ftString; NewField->Name="ClaseReal"; i=0; while ((TTennis->FieldDefs->Items[i]->Name!=Params->ColClasificador) (i<TTennis->FieldDefs->Count-1)) i++; if (i<TTennis->FieldDefs->Count-1) NewField->Size=TTennis->FieldDefs->Items[i]->Size; else NewField->Size=255; for (i=0; i<TTennis->FieldDefs->Count; i++) { NewField=TEval->FieldDefs->AddFieldDef(); NewField->DataType=TTennis->FieldDefs->Items[i]->DataType; NewField->Size=TTennis->FieldDefs->Items[i]->Size; NewField->Name=TTennis->FieldDefs->Items[i]->Name; } CrearTabla=false; if(TEval->Exists) {if (Application->MessageBox((AnsiString("Sobreescribimos la tabla") + TEval->TableName + AnsiString("?")).c_str(), "Tabla Existente", MB_YESNO) == IDYES) Cdigo Fuente Magdalena Servente 249
&&
CrearTabla=true;} else CrearTabla=true; if (CrearTabla) TEval->CreateTable(); TEval->Active=true; errorNo=0; } catch(...) {errorNo=-2;} if (errorNo==0) //no hubo problemas { //Inicializamos la tabla de evaluacin try { QIni->DatabaseName=Params->NombreBD; //Obtenemos los nombres de las columnas TEval->GetFieldNames(listaCampos); //Copiamos los datos de la tabla original consulta="INSERT INTO Eval.db ("; AppendStr(consulta,listaCampos->Strings[0]); for (i=1;i<listaCampos->Count;i++) { AppendStr(consulta,", "); AppendStr(consulta,listaCampos->Strings[i]); } AppendStr(consulta,") select trim("); AppendStr(consulta,Params->ColClasificador); AppendStr(consulta,") "); for (i=1;i<listaCampos->Count;i++) { AppendStr(consulta,", "); AppendStr(consulta,listaCampos->Strings[i]); } AppendStr(consulta," from "); AppendStr(consulta,Params->TablaBD); QIni->SQL->Clear(); QIni->SQL->Add(consulta); QIni->ExecSQL(); errorNo=0; } catch(...) {errorNo=-3;} } if (errorNo==0) //no hubo problemas { AplicarReglas(TEval->TableName ,codigoReglas); errorNo=EvaluarResultados(TEval->TableName); } TEval->Close(); TEval->DeleteTable(); delete(listaCampos); delete(TEval); delete(QIni); consulta.~AnsiString(); return(errorNo); } void __fastcall TDMID3::DMID3Destroy(TObject *Sender) {int i; for (i=0;i<MAX_NIVELES;i++) { VecValores[i].~AnsiString(); VecDescriptores[i].~AnsiString(); } } //---------------------------------------------------------------------------
250
Magdalena Servente
Cdigo Fuente
D.4.2. UDMC45
D.4.2.1. UDMC45.h
//--------------------------------------------------------------------------#ifndef UDMC45H #define UDMC45H //--------------------------------------------------------------------------#include <Classes.hpp> #include <Db.hpp> #include <DBTables.hpp> #include <fstream.h> #include <stdio.h> #include <string.h> #include #include #include #include "UTipos.h" "defns.h" "types.h" "Rulex.h"
#define Inc 2048 #define LocalVerbosity(x) #define Intab(x) #define Tab "| #define TabSize 4 #define Width 80
if (Sh >= 0 && VERBOSITY >= x) Indent(x, "| ") " /* ancho mx aproximado de un rbol en pantalla */
//--------------------------------------------------------------------------class TDMC45 : public TDataModule { __published: // IDE-managed Components TDataSource *DSTTennis; TTable *TTennis; void __fastcall DMC45Destroy(TObject *Sender); private: TParametros *Params; /* Datos externos descriptos en extern.i */ short MaxAtt, MaxClass, MaxDiscrVal; DiscrValue MaxAttVal[MAX_CANT_DESCRIPTORES]; TStringList *ClassName, *AttName; TTablaValores AttValName; TVecValores SpecialStatus; String FileName; ItemNo MaxItem; Description *Item; short VERBOSITY, TRIALS; Boolean GAINRATIO, SUBSET, UNSEENS; ItemNo MINOBJS; float CF; Tree *Pruned; Boolean AllKnown; ItemCount *Weight, /* Weight[i] = fraccin actual del item i */ **Freq, /* Freq[x][c] = nro de items de clase c con resultado x */ *ValFreq, /* ValFreq[x] = nro.de items con resultado x */ *ClassFreq; /* ClassFreq[c] = nro.de items de clase c */ float *Gain, /* Gain[a] = info gain al dividir segn el atrib a */ *Info, /* Info[a] = info potencial de div sobre el atrib a */ *Bar, /* Bar[a] = mejor valor lmite para el atrib a */ *UnknownRate; /* UnknownRate[a] = proporcin desconocida actual para el atrib a */
*Tested; MultiVal;
/* Tested[a] seteado si el atrib a ya ha sido testeado */ /* true cuando todos los atribs tienen muchos valores */
*SplitGain,
/* SplitGain[i] = gain con el valor del atrib del item i como lmite */ Magdalena Servente 251
Cdigo Fuente
*SplitInfo; ItemCount *Slice1, *Slice2; Conjunto **Subset; short short Tree FILE char *Subsets; Subtree; Subdef[100]; *TRf; Fn[500];
/* Slice1[c] /* Slice2[c]
/* Subset[a][s] = subconj s para atrib a */ /* Subsets[a] = nro. subconj para atrib a */ /* tamao mx de subrbol impreso */ /* punteros a los subrboles */ /* archivo para i/o del rbol */ /* nombre del archivo */
//---------------------------------------------------------------------void GetNames(); /* Lee los nombres de las clases, atributos y valores legales de */ /* atributos. */ void GetData(); //Lee los datos de la tabla Description GetDescription(); int VerificarPK(AnsiString Atrib); /* Verifica si el atributo Atrib es clave primaria de la tabla Devuelve: 0 si es PK 1 en caso contrario -1 si hubo error*/ int PosicionValor(AnsiString Valor,int nro_atrib, int pri, int ult); /* Busca la posicin del Valor para el atributo especificado por el nro_atrib en el Tabla de Valores de atributos y la devuelve */ int PosicionClase(AnsiString Valor); /* Busca la posicin del Valor en el vector de la clase */ void OneTree(); /* Construye y poda un rbol a partir de todos los datos */ void Evaluate(bool CMInfo,short Saved); /* Imprime los errores para cada una de las pruebas */ void InitialiseTreeData(); /* Reserva espacio para las tablas de construccin */ void InitialiseWeights(); /* Inicializa el peso de cada item */ Tree FormTree(ItemNo Fp, ItemNo Lp); /* Construye un rbol de decisin para los casos Fp hasta Lp */ ItemNo Group(DiscrValue V, ItemNo Fp, ItemNo Lp,Tree TestNode); /* Agrupa los tems correspondiente a la rama V de una prueba y y devuelve el ndice del ltimo tem */ void Intercambio(ItemNo a, ItemNo b); /* Intercambia los items en a y b */ ItemCount CountItems(ItemNo Fp, ItemNo Lp); /* Devuelve el peso total de los items desde Fp hasta Lp */
/*************************************************************************/ /* */ /* Calculo de la informacin, ganancia de informacin e */ /* impresin de distribuciones */ /* */ /*************************************************************************/ float Worth(float ThisInfo, float ThisGain, float MinGain); /* Determina el valor de una divisin particular segn el criterio elegido */ void ResetFreq(DiscrValue MaxVal); /* Resetea las tablas de frecuencia Freq[][] y ValFreq[] */ float ComputeGain(float BaseInfo,float UnknFrac, DiscrValue MaxVal,ItemCount TotalItems); /* Dadas las tablas Freq[][] y ValFreq[], computa la ganancia de informacin */ float TotalInfo(ItemCount V[], DiscrValue MinVal, DiscrValue MaxVal); /* Computa la informacin total en V[ MinVal..MaxVal ] */ void PrintDistribution(Attribute Att,DiscrValue MaxVal,bool ShowNames); /* Imprime la tabla de distribucin para un atributo determinado */ /*************************************************************************/ /* */ /* Rutinas de manejo de los rboles de decisin */ /* */ /*************************************************************************/
252
Magdalena Servente
Cdigo Fuente
Tree Leaf(ItemCount *ClassFreq, ClassNo NodeClass,ItemCount Cases,ItemCount Errors); /* Construye una hoja en un determinado nodo */ void Sprout(Tree Node, DiscrValue Branches); /* Inserta ramas en un nodo */ Tree PrintTree(Tree T); /*Imprime el rbol de decisin T*/ void Show(Tree T,short Sh); /* Muestra el rbol T con offset Sh*/ void ShowBranch(short Sh,Tree T,DiscrValue v); /* Imprime un nodo T con offset Sh, valor de rama v */ short MaxLine(Tree St); /* Encuentra el tamao mx de una lnea nodo para el subrbol St */ void Indent(short Sh,char *Mark); /* Indenta Sh columnas */ void SaveTree(Tree T,AnsiString Extension); /*Guarda el rbol T en el archivo con la extension especificada */ void OutTree(Tree T); /*Guarda el rbol T como caracteres */ Tree GetTree(AnsiString Extension); /*Obtiene el rbol T del archivo de la extensin especificada */ Tree InTree(); /*Recupera el rbol a partir de los caracteres guardados */ void StreamOut(AnsiString s,int n); void StreamIn(AnsiString s,int n); /* Stream caracteres de/hacia el archivo TRf desde/hacia una dir */ void ReleaseTree(Tree Node); /* Libera el espacio ocupado por Node */ int TreeSize(Tree Node); /*Cuenta los nodos de un rbol */ Tree CopyTree(Tree T); /* Devuelve una copia de tree T */ void SaveDiscreteNames(); /* Guarda los valores de los atributos ledos con "discrete N" */ void RecoverDiscreteNames(); /* Recupera los valores de los atributos ledos con "discrete N" */
/*************************************************************************/ /* */ /* Evaluacin del armado de subconjuntos sobre los atrib discretos */ /* */ /*************************************************************************/ void EvalSubset(Attribute Att, ItemNo Fp, ItemNo Lp,ItemCount Items); /* Evaluacin del armado de subconjuntos sobre un atrib discreto. */ void Combine(DiscrValue x,DiscrValue y,DiscrValue Last); /* Combina los valores de la distribucin de los atributos discretos x e y */ void Uncombine(DiscrValue x,DiscrValue y); /* Devuelve a x e y sus valores originales */ void PrintSubset(Attribute Att,Conjunto Ss); /* Imprime los valores del atributo Att que estan en el subconjunto Ss */ void SubsetTest(Tree Node,Attribute Att); /* Construye una prueba de nodo sobre un subconjunto de valores */ void EvalDiscreteAtt(Attribute Att,ItemNo Fp,ItemNo Lp,ItemCount Items); /* Setea Info[] and Gain[] para la particin discreta de items Fp hasta Lp */ void ComputeFrequencies(Attribute Att,ItemNo Fp,ItemNo Lp); /* Computa las tablas de frecuencia Freq[][] y ValFreq[] para Att */ float DiscrKnownBaseInfo(DiscrValue KnownItems,ItemCount MaxVal); /* Devuelve la informacin base de los items con valores conocidos de un atributo discreto, utilizando la tabla de frecuencias Freq[][] */ void DiscreteTest(Tree Node,Attribute Att); /* Construye y devuelve un nodo para una prueba sobre un atributo discreto */ /*************************************************************************/ /* */ /* Evaluacin de una prueba sobre un atributo continuo */ /* */ /*************************************************************************/ void EvalContinuousAtt(Attribute Att,ItemNo Fp,ItemNo Lp); void ContinTest(Tree Node,Attribute Att); /* Transforma una hoja en una prueba sobre un atributo continuo */ float GreatestValueBelow(Attribute Att,float t); /* Devuelve el mayor valor del atributo Att por debajo del lmite t */ void Quicksort(ItemNo Fp,ItemNo Lp,Attribute Att);//, void (*Exchange)()); /* Ordenamiento */
Cdigo Fuente
Magdalena Servente
253
/*************************************************************************/ /* */ /* Poda un rbol de decisin y predice su proporcin de error */ /* */ /*************************************************************************/ Conjunto *PossibleValues;//=Nil; bool Changed; bool Prune(Tree T); /*Poda el rbol T y devuelve true si el rbol fue modificado */ float EstimateErrors(Tree T, ItemNo Fp,ItemNo Lp,short Sh,bool UpdateTree); /*Estima los errores en un determinado subrbol */ void CheckPossibleValues(Tree T); /* Elimina pruebas de subconjuntos innecesarias sobre valores faltantes */
/* Computa los errores adicionales */ float Val[], Dev[]; float AddErrs(ItemCount N,ItemCount e); /*************************************************************************/ /* */ /* Determina la clase de un caso a partir del rbol de decisin */ /* */ /*************************************************************************/ float *ClassSum; /* ClassSum[c]= peso total de la clase c */ ClassNo Category(Description CaseDesc,Tree DecisionTree); /* Categoriza la descripcin de un caso utilizando el rbol de decisin */ void Classify(Description CaseDesc,Tree T,float Weight); /* Clasifica un caso utilizando el subrbol dado, ajustando el valor de ClassSum para cada clase */ Tree *Raw; void PrintConfusionMatrix(ItemNo *ConfusionMat); /*Imprime matrices de confusin */ /*************************************************************************/ /* */ /* REGLAS DE DECISIN */ /* */ /*************************************************************************/ /* Variables usadas en la generacin de reglas */ bool SIGTEST, /* uso de la prueba de significado en la poda de reglas */ SIMANNEAL; /* uso de simulated annealing */ float SIGTHRESH, REDUNDANCY; /* factor que estima la cantidad de de redundancia e irrelevancia en los atributos */ PR *Rule; /* reglas actuales */ RuleNo NRules, /* nro de reglas actuales */ *RuleIndex; /* ndice de reglas */ short RuleSpace; /* espacio reservado para las reglas */ ClassNo DefaultClass; /* clase por defecto */ RuleSet *PRSet; /* conjuntos de reglas */ float AttTestBits, /* bits para codificar el atrib testeado */ *BranchBits; /* idem para el valor del atrib */ fstream FReglas; //guarda los datos generados durante la generacin de las reglas con el C4.5 float *LogItemNo; double *LogFact; ItemNo *TargetClassFreq, /* [Boolean] */ *Errors, /* [Condicin] */ *Total; /* [Condicin] */ float *Pessimistic, /* [Condicin] */ *Actual, /* [Condicin] */ *CondSigLevel; /* [Condicin] */ bool **CondSatisfiedBy, /* [Condicin][NroItem] */ *Deleted; /* [Condicin] */ DiscrValue *SingleValue; /* [Atributo] */ Condition *Stack; short MaxDisjuncts, MaxDepth; ItemNo *Covered, /* Covered[i] = nro.de reglas que cubren el item i */ *FalsePos, /* FalsePos[c] = nro.de falsos positivos de las reglas seleccionadas para la calse c */ 254 Magdalena Servente Cdigo Fuente
float
bool
/* NoRule[c] = nro.de items cubiertos por ninguna de las reglas selecciondas */ *Right, /* Right[r] = nro. de aciertos */ *Wrong; /* Wrong[r] = nro. de fallas */ *Value, /* Value[r] = ventaja atribuble a la regla r o realizable si la regla r es includa */ SubsetValue, /* valor de la mejor clase del subconjunto */ CodeWeight; /* factor de multiplicacin para la codificacin de las reglas */ *RuleIn, /* RuleIn[r] = true si la regla r est includa */ **Match; /* Match[r][i] = true si el item i cumple las cond de la regla r */ /* lista de todas las reglas para la clase actual */
*NoRule,
FocusClass;
void GenerateLogs();// Creacin del vector LogItemNo void GenerateRules();/* Generacin de todos los conjuntos de reglas a partir de los rboles de decisin */ void FindTestCodes(); /*Determina las longitudes de los codigos para los atributos y las ramas */ void SwapUnweighted(ItemNo a,ItemNo b);/*Intercambio de los items en a y b. */ void CompositeRuleset();/*Creacin de un conjunto compuesto de reglas de todas las pruebas */ void FormRules(Tree t);/*Creacin de un conjunto de reglas del rbol de decisin t */ void TreeParameters(Tree t,short d);/* Calcula la profundidad mx y el nro de hojas en el arbol t con profundidad inicial d*/ void Scan(Tree t,short d);/* Extrae los disjuntos del arbol t en la profundidad d y los procesa */ void ConstructRuleset();/* Construccin de un subconjunto ordenado (indexado por el RuleIndex)a partir del actual conjunto de reglas*/ void InitialiseTables();/*Inicializacin de tablas*/ void CoverClass();/*Seleccionamos un subconjunto de las reglas para la FocusClass */ void AllCombinations(RuleNo NR); /* Probamos todas las combinaciones de reglas para encontrar la mejor */ void SimAnneal(RuleNo RuleCount);/*Bsqueda de un buen subconjunto mediante simulated annealing */ void SpotSearch(RuleNo RuleCount);/* Busca un buen subconjunto mediante una bsqueda golosa reiterativa*/ void HillClimb(RuleNo RuleCount);/* Mejora un subconjunto de reglas agregando o eliminando reglas */ void CalculateValue();/* Calculamos los aciertos y errores para las reglas de la FocusClass y determinamos el valor de dichas reglas. Si es el mejor hasta ahora, lo guardamos.*/ void AddRule(RuleNo r);/* Agregamos la regla r al conj de relgas incluidas e incrementamos la cantidad de reglas que cubren los items que disparan la regla*/ void DeleteRule(RuleNo r);/* Eliminamos la regla r del conj de reglas includas y decrementamos la cant de reglas que cubren cada uno de los items cubiertos por la regla*/ void MakeIndex();/* Crea un ndice de reglas includas en RuleIndex. Selecciona primero aquellas clases cuyas reglas tienen el menor nro de falsos positivos dentro de cada clase, pone las reglas con ms aciertos primero */ void FindDefault();/* Determina la clase por defecto. Los empates se resuelven a favor de la clase ms frecuente*/ float Fuerza(PR ThisRule,Description Case);/* Dados una regla y un caso, determina la fuerza con la que podemos determinar que el caso pertenece a la clase especificada en la regla */ float Biased(int N, int E, float ExpE);/* Determina el nro de bits necesarios para codificar las excepciones*/ float ExceptionBits(int Fires, int FP, int FN); void FindRuleCodes();/* Determina la longitud de codificacin para todas las reglas*/ float CondBits(Condition C);/* Determina el nro de bits requerido para Cdigo Fuente Magdalena Servente 255
codificar una condicin void SaveRules();/* void Test bool void bool
*/
Guarda el conjunto de reglas en el archivo de reglas segn el orden del ndice*/ GetRules();/* Obtiene un nuevo conj de reglas del archivo de reglas*/ FindTest(Test Newtest);/* Busca una prueba en el vector de pruebas, si no est all, la agrega */ SameTest(Test t1,Test t2);/*Verifica si la prueba t1 es igual a la prueba t2*/ InitialiseRules();/*Limpia las variables para un nuevo conj de reglas */ NewRule(Condition Cond[],short NConds,ClassNo TargetClass,float Err); /* Agrega una nueva regla, al conjunto de reglas actual. Actualiza Rule[],NRules y,en caso de ser necesario,RuleSpace*/ SameRule(RuleNo r,Condition Cond[],short NConds,ClassNo TargetClass); /* Decide si la regla actual duplica la regla r */ PrintIndexedRules();/*Imprime el conjunto indexado de reglas*/ PrintRule(RuleNo r);/*Imprime la regla r */ PrintCondition(Condition c);/*Imprime la condicin c de una regla de
void PruneRule(Condition Cond[],short NCond,ClassNo TargetClass); /* Poda la regla dadas las condiciones Cond, y el nro de condiciones NCond, y agrega la regla resultante al actual conjunto de reglas si es lo suficientemente precisa*/ bool Redundant(short R,Condition Cond[],short NCond);/* Verifica si la condicin R es redundante*/ bool IsSubset(Conjunto S1,Conjunto S2,Attribute Att); /* Decide si el subconj de valores S1 est contenido en S2 */ void FindTables(short NCond,ClassNo TargetClass);/* Busca las tablas de distribucin de frecuencias para la condiciones actuales*/ void UpdateCount(ItemNo T[],ItemNo E[],short d,bool OK); /* Incrementa los valores de Total[d] y Errors[d]*/ bool Satisfies(Description CaseDesc,Condition OneCond); /*Determina si la descripcin de un caso satisface la cond dada*/ double Hypergeom(int a,int r,int A,int B);/* Distribucin hipergeometrica (usa los log de los factoriales tabulados)*/ float TableProb(int t11,int t12,int t21,int t22);/* TableProb examina la tabla t de contingencias de 2x2 y calcula la probabilidad de que una divisin al azar pueda producir una divisin al menos tan extrema como esta. */ void EvaluateRulesets(bool DeleteRules);/*Evala todos los conj de reglas*/ ItemNo Interpret(ItemNo Fp,ItemNo Lp,bool DeleteRules, bool CMInfo, bool Arrow); /*Evala el conjunto de reglas actual*/ RuleNo BestRuleIndex(Description CaseDesc,RuleNo Start);/*Busca la mejor regla para el caso dado, dejando la probabilidad en Confidence*/ public: __fastcall TDMC45(TComponent* Owner); void RecibirParametros(TParametros *Parametros); void C45(); //dispara el proceso del C4.5 con los parmetros recibidos void GenerarReglasC45(); //dispara el proceso de generacin de las reglas de decisin }; //--------------------------------------------------------------------------extern PACKAGE TDMC45 *DMC45; //--------------------------------------------------------------------------#endif
D.4.2.2. UDMC45.cpp
//--------------------------------------------------------------------------#include <vcl.h> #pragma hdrstop #include "UDMC45.h" //--------------------------------------------------------------------------#pragma package(smart_init) #pragma resource "*.dfm" TDMC45 *DMC45; fstream FVitacora; //guarda los datos generados durante la ejecucin del C4.5 256 Magdalena Servente Cdigo Fuente
//--------------------------------------------------------------------------__fastcall TDMC45::TDMC45(TComponent* Owner) : TDataModule(Owner) { MaxDiscrVal = 2; FileName = "DF"; VERBOSITY = 0; TRIALS = 10; GAINRATIO = true; SUBSET = false; UNSEENS = false; MINOBJS = 2; AllKnown = true; Val[0]=0; Val[1]=0.001; Val[2]=0.005; Val[3]=0.01; Val[4]=0.05; Val[5]=0.10; Val[6]=0.20; Val[7]=0.40; Val[8]=1.00; //Val[] = { 0, Dev[0]=4.0; Dev[1]=3.09; Dev[2]=2.58; Dev[3]=2.33; Dev[4]=1.65; Dev[5]=1.28; Dev[6]=0.84; Dev[7]=0.25; Dev[8]=0.00; //Dev[] = {4.0, //*ClassSum=0; } //-----------------------------------------------------------------------------void TDMC45::RecibirParametros(TParametros *Parametros) { AnsiString sqlstring; TQuery *QGral=new TQuery(DMC45);
3.09,
2.58,
//Inicializamos los queries que harn sus consultas sobre la base //especificada QGral->DatabaseName=Params->NombreBD; //Inicializamos el campo Nivel en la Tabla sqlstring="Update "; AppendStr(sqlstring, Params->TablaBD); AppendStr(sqlstring," SET Nivel = 0 "); QGral->SQL->Clear(); QGral->SQL->Add(sqlstring); QGral->ExecSQL(); QGral->SQL->Clear(); TTennis->Close(); TTennis->Open(); sqlstring.~AnsiString(); delete(QGral); }
//--------------------------------------------------------------------------void __fastcall TDMC45::DMC45Destroy(TObject *Sender) {int i,j; delete ClassName; delete AttName; Cdigo Fuente Magdalena Servente 257
for (i=0;i<MAX_NIVELES;i++) { for (j=0;j<MAX_NIVELES;j++) {AttValName[i][j].~AnsiString();} SpecialStatus[i].~AnsiString(); } } /*************************************************************************/ /* */ /* Principal c4.5 */ /* -----------------*/ /* */ /* Basado en el cdigo propuesto por Quinlan en: */ /* Quinlan, "C4.5: Programs for Machine Learning" (1993) */ /* Morgan Kaufman Publishers, San Mateo, California */ /*************************************************************************/ void TDMC45::C45() { extern int optind; short Best; char outFile[50]="Log\\C45"; DateSeparator='-'; TimeSeparator='_'; strcat(outFile, DateTimeToStr(Now()).c_str()); strcat(outFile, Params->TablaBD.c_str()); strcat(outFile, ".log"); FVitacora.open(outFile, ios::out); FileName = Params->TablaBD; VERBOSITY = 5; //grado de explicacin en el Log if (Params->iCriterio==0) GAINRATIO = false; if (Params->iConjuntos==0) SUBSET = true; MINOBJS = Params->iMinObjs; CF =Params->iCF; Check(CF, Epsilon, 100); CF /= 100; /* Inicializacin */
GetNames(); GetData(); FVitacora<<(MaxItem+1); FVitacora<<" casos ("; FVitacora<<MaxAtt; FVitacora<<" atributos) ledos de "; FVitacora<<Params->TablaBD.c_str(); /* Construccin de los rboles de decisin */
TRIALS = 1; OneTree(); Best = 0; if ( TRIALS == 1 ) { FVitacora<<endl; FVitacora<<"El rbol ha sido guardado con xito."; FVitacora<<endl; } SaveTree(Pruned[Best], ".tree"); /* Evaluamos los resultados */ FVitacora<<endl; FVitacora<<endl; FVitacora<<"Evaluacin sobre los datos de prueba ("; FVitacora<<(MaxItem+1); FVitacora<<" tems):"; FVitacora<<endl; Evaluate(false, Best);
258
Magdalena Servente
Cdigo Fuente
if ( UNSEENS ) { GetData(); FVitacora<<endl; FVitacora<<"Evaluacin sobre los datos de prueba ("; FVitacora<<(MaxItem+1); FVitacora<<" tems):"; FVitacora<<endl; Evaluate(true, Best); } exit(0); FVitacora.close(); } /*************************************************************************/ /* */ /* Lee los nombres de las clases, atributos y valores legales de */ /* atributos. */ /* Cuando termina, los nombres se almacenan en: */ /* ClassName - nombres de las clases */ /* AttName - nombres de los atributos */ /* AttValName - nombres de los valores de los atributos */ /* con: */ /* MaxAttVal - cantidad de valores para cada atributo */ /* */ /* Las otras variables globales que se setean son: */ /* MaxAtt - nmero mximo de atributos */ /* MaxClass - nmero mximo de clases */ /* MaxDiscrVal - nmero mximo de valores discretos para */ /* cualquier atributo */ /* */ /*************************************************************************/ void TDMC45::GetNames() {int i,j; TQuery *QGral=new TQuery(DMC45); AnsiString sqlstring; try { /* Obtenemos los nombres de las clases */ ClassName = new TStringList(); ClassName->AddStrings(Params->LClasificadores); MaxClass = ClassName->Count; /* Obtenemos los atributos y los nombres de sus valores */ MaxAtt=TTennis->FieldCount-2; //le restamos la clase y la columna Nivel del ID3 AttName=new TStringList(); QGral->DatabaseName=Params->NombreBD; sqlstring=") as Campo from "; AppendStr(sqlstring, Params->TablaBD); MaxDiscrVal=-1; for (i=0;i<MaxAtt;i++) { if (TTennis->Fields->Fields[i]->FieldName!=Params->ColClasificador) { if (VerificarPK(TTennis->Fields->Fields[i]->FieldName)==0 TTennis->Fields->Fields[i]->FieldName=="Nivel" ) {SpecialStatus[i]="IGNORAR";} else { AttName->Add(TTennis->Fields->Fields[i]->FieldName); /* if //es contnuo {SpecialStatus[i] = "CONTINUOUS";} else //es discreto { SpecialStatus[i] = "DISCRETE"; //Cargamos los valores del atributo QGral->SQL->Clear(); Cdigo Fuente Magdalena Servente 259
||
QGral->SQL->Add("SELECT DISTINCT("+ >Fields->Fields[i]->FieldName + sqlstring); QGral->Open(); QGral->First(); j=0; while (!QGral->Eof) { AttValName[i][j]=QGral>FieldByName("Campo")->AsString; QGral->Next(); j++; } MaxAttVal[i] = (DiscrValue) j; /* Leemos la mxima cantidad de valores, y chequeamos MaxDiscrVal */ if (j>MaxDiscrVal) MaxDiscrVal=j; } } } } } catch(...) { Application->MessageBox("Error archivo","Error",MB_OK|MB_ICONWARNING); } delete(QGral); sqlstring.~AnsiString(); } //--------------------------------------------------------------------------/*************************************************************************/ /* */ /* Lee los casos de la tabla. */ /* */ /* Al terminar,los casos se almacenan en el vector Item con la forma */ /* de Descriptions (i.e. vectores de valores de atributos), */ /* y se le asigna a MaxItem el nmero de items de datos. */ /* */ /*************************************************************************/ void TDMC45::GetData() { ItemNo i=-1, ItemSpace; Description GetDescription(); TQuery *QData=new TQuery(DMC45); int Dv; float Cv; Variant Atributo; Description Dvec; Attribute Att; AnsiString AtDiscreto; try{ ItemSpace=0; QData->DatabaseName=Params->NombreBD; QData->SQL->Clear(); QData->SQL->Add("SELECT * FROM " + Params->TablaBD); QData->Open(); QData->First(); do { ++i; MaxItem = i; /* Verificamos si hay lugar para otro tem */
TTennis-
en
la
carga
de
los
datos
del
if ( i >= ItemSpace ) { if ( ItemSpace ) { ItemSpace += Inc; Item = (Description *) 260 Magdalena Servente Cdigo Fuente
realloc(Item, ItemSpace*sizeof(Description)); } else { Item = (Description *) malloc((ItemSpace=Inc)*sizeof(Description)); } } Dvec = (Description) calloc(MaxAtt+2, sizeof(AttValue)); for(Att=0;Att<MaxAtt;Att++) { Atributo=QData->FieldValues[TTennis->Fields->Fields[Att]->FieldName]; if ( SpecialStatus[Att] == "IGNORAR" ) { /* Salteamos este valor */ DVal(Dvec, Att) = 0; } else if ( MaxAttVal[Att] || SpecialStatus[Att] == "DISCRETE" ) { /* Valor discreto */ AtDiscreto=AnsiString(Atributo); if ( AtDiscreto.AnsiCompareIC("?")==0) { Dv = 0; } else { Dv = PosicionValor(AtDiscreto,Att, 0, MaxAttVal[Att]); } DVal(Dvec, Att) = Dv; } else { /* Valor Continuo */ if ( Atributo.VType==varEmpty || Atributo.VType==varNull) { Cv = Unknown; } else { Cv = double(Atributo); } CVal(Dvec, Att) = Cv; } } Class(Dvec) >AsString); Item[i] = Dvec; QData->Next(); } while ( Item[i] != NULL && !(QData->Eof) ); QData->Close();
PosicionClase(QData->FieldByName(Params->ColClasificador)-
en
la
carga
de
los
datos
del
//----------------------------------------------------------------------------int TDMC45::PosicionValor(AnsiString Valor,int nro_atrib, int pri, int ult) /* Busca la posicin del Valor para el atributo especificado por el nro_atrib en el Tabla de Valores de atributos y la devuelve */ {int i;
Cdigo Fuente
Magdalena Servente
261
i=pri; while (AttValName[nro_atrib][i].AnsiCompareIC(Valor)!=0 && i<=ult) i++; return(i<=ult ? i : pri-1); } int TDMC45::PosicionClase(AnsiString Valor) /* Busca la posicin del Valor en el vector de la clase */ {int i; i=0; while (ClassName->Strings[i].Trim()!=Valor.Trim() && i<=MaxClass) i++; return(i<=MaxClass ? i : -1); } //----------------------------------------------------------------------------int TDMC45::VerificarPK(AnsiString Atrib) /* Verifica si el atributo Atrib es clave primaria de la tabla Devuelve: o si es PK 1 en caso contrario -1 si hubo error */ { AnsiString sqlstring; int cantReg,res; TQuery *QGral=new TQuery(DMC45); cantReg=TTennis->RecordCount; try { sqlstring="SELECT COUNT(DISTINCT "; AppendStr(sqlstring,Atrib); AppendStr(sqlstring," ) as Cant FROM "); AppendStr(sqlstring, Params->TablaBD); QGral->DatabaseName=Params->NombreBD; QGral->SQL->Clear(); QGral->SQL->Add(sqlstring); QGral->Open(); QGral->First(); if (QGral->FieldByName("Cant")->AsInteger==cantReg) {res=0;} //es PK else {res=1;} } catch(...) { res=-1; } delete (QGral); sqlstring.~AnsiString(); return(res); }
/*************************************************************************/ /* Construye y poda un rbol a partir de todos los datos */ /* */ /*************************************************************************/ void TDMC45::OneTree() { ItemNo *TargetClassFreq; Tree *Raw; Tree *Pruned; InitialiseTreeData(); InitialiseWeights(); Raw = (Tree *) calloc(1, sizeof(Tree)); Pruned = (Tree *) calloc(1, sizeof(Tree)); AllKnown = true; Raw[0] = FormTree(0, MaxItem); FVitacora<<endl; PrintTree(Raw[0]); SaveTree(Raw[0], ".unpruned"); 262 Magdalena Servente Cdigo Fuente
Pruned[0] = CopyTree(Raw[0]); if ( Prune(Pruned[0]) ) { FVitacora<<endl; FVitacora<<"Simplificamos el "; PrintTree(Pruned[0]); } } /*************************************************************************/ /* */ /* Imprime los errores para cada una de las pruebas */ /* */ /*************************************************************************/ void TDMC45::Evaluate(bool CMInfo,short Saved) { char outFile[50]="Eval"; ClassNo RealClass, PrunedClass; short t; ItemNo *ConfusionMat, i, RawErrors, PrunedErrors; fstream FEvalRendimiento; //guarda los datos de la evaluacin de rendimiento //para el C4.5 if ( CMInfo ) { ConfusionMat = (ItemNo *) calloc((MaxClass+1)*(MaxClass+1), sizeof(ItemNo)); }
DateSeparator='-'; TimeSeparator='_'; strcat(outFile, DateTimeToStr(Now()).c_str()); strcat(outFile, Params->TablaBD.c_str()); strcat(outFile, ".log"); FEvalRendimiento.open(outFile, ios::out); FVitacora<<endl; if ( TRIALS > 1 ) { FVitacora<<"Prueba Antes de Podar Despus de Podar"; FVitacora<<endl; FVitacora<<"-------------------------------------"; FVitacora<<endl; } else { FVitacora<<" Antes de Podar Despus de Podar"; FVitacora<<endl; FVitacora<<" --------------------------------"; FVitacora<<endl; } FVitacora<<" Tamao Errores Tamao Errores Estimacin"; FVitacora<<endl; FVitacora<<endl; ForEach(t, 0, TRIALS-1) { RawErrors = PrunedErrors = 0; ForEach(i, 0, MaxItem) { RealClass = Class(Item[i]); if ( Category(Item[i], Raw[t]) != RealClass ) RawErrors++; PrunedClass = Category(Item[i], Pruned[t]); if ( PrunedClass != RealClass ) PrunedErrors++; if ( CMInfo && t == Saved ) { ConfusionMat[RealClass*(MaxClass+1)+PrunedClass]++; } } Cdigo Fuente Magdalena Servente 263
if ( TRIALS > 1 ) { FVitacora<<t; } FVitacora<<" "; FVitacora<<TreeSize(Raw[t]); FVitacora<<" "; FVitacora<<RawErrors; FVitacora<<"("; FVitacora<<(100.0*RawErrors / (MaxItem+1.0)); FVitacora<<") "; FVitacora<<TreeSize(Pruned[t]); FVitacora<<" "; FVitacora<<PrunedErrors; FVitacora<<"("; FVitacora<<(100.0*PrunedErrors / (MaxItem+1.0)); FVitacora<<") ("; FVitacora<<(100 * Pruned[t]->Errors / Pruned[t]->Items); FVitacora<<")"; if (t==Saved) {FVitacora<<" <<";} FVitacora<<endl; } if ( CMInfo ) { PrintConfusionMatrix(ConfusionMat); free(ConfusionMat); } FEvalRendimiento.close(); } /*************************************************************************/ /* */ /* Reserva espacio para las tablas de construccin */ /* */ /*************************************************************************/ void TDMC45::InitialiseTreeData() { DiscrValue v; Attribute a; Tested Gain Info Bar = (char *) calloc(MaxAtt+1, sizeof(char)); = (float *) calloc(MaxAtt+1, sizeof(float)); = (float *) calloc(MaxAtt+1, sizeof(float)); = (float *) calloc(MaxAtt+1, sizeof(float));
Subset = (Conjunto **) calloc(MaxAtt+1, sizeof(Conjunto *)); ForEach(a, 0, MaxAtt) { if ( MaxAttVal[a] ) { Subset[a] = (Conjunto *) calloc(MaxDiscrVal+1, sizeof(Conjunto)); ForEach(v, 0, MaxAttVal[a]) { Subset[a][v] = (Conjunto) malloc((MaxAttVal[a]>>3) + 1); } } } Subsets = (short *) calloc(MaxAtt+1, sizeof(short)); SplitGain = (float *) calloc(MaxItem+1, sizeof(float)); SplitInfo = (float *) calloc(MaxItem+1, sizeof(float)); Weight = (ItemCount *) calloc(MaxItem+1, sizeof(ItemCount)); Freq = (ItemCount **) calloc(MaxDiscrVal+1, sizeof(ItemCount *)); ForEach(v, 0, MaxDiscrVal) { Freq[v] = (ItemCount *) calloc(MaxClass+1, sizeof(ItemCount)); } ValFreq = (ItemCount *) calloc(MaxDiscrVal+1, sizeof(ItemCount)); ClassFreq = (ItemCount *) calloc(MaxClass+1, sizeof(ItemCount));
264
Magdalena Servente
Cdigo Fuente
Slice1 = (ItemCount *) calloc(MaxClass+2, sizeof(ItemCount)); Slice2 = (ItemCount *) calloc(MaxClass+2, sizeof(ItemCount)); UnknownRate = (float *) calloc(MaxAtt+1, sizeof(float)); /* Verificamos si todos los atributos tienen muchos valores discretos */
MultiVal = true; if ( ! SUBSET ) { for ( a = 0 ; MultiVal && a <= MaxAtt ; a++ ) { if ( SpecialStatus[a] != "IGNORAR" ) { MultiVal = MaxAttVal[a] >= 0.3 * (MaxItem + 1); } } } } /*************************************************************************/ /* */ /* Inicializa el peso de cada item */ /* */ /*************************************************************************/ void TDMC45::InitialiseWeights() { ItemNo i; ForEach(i, 0, MaxItem) { Weight[i] = 1.0; } } /*************************************************************************/ /* */ /* Construye un rbol de decisin para los casos Fp hasta Lp: */ /* */ /* - si todos los casos son de la misma clase, el rbol es una hoja, */ /* y devuelve una hoja con dicha clase */ /* */ /* - para cada atributo, calcular la informacin potencial provista */ /* por una prueba sobre el atributo (basada en las probabilidades */ /* de que cada caso tenga un valor particular para el atributo), */ /* y la ganancia en informacin que resultara de una prueba */ /* sobre el atributo (basada en las probabilidades de cada caso */ /* con un valor particular para el atributo pertenezca a una */ /* determinada clase). */ /* */ /* - sobre esta base, y dependiendo del criterio de seleccin actual, */ /* encontrar el mejor atributo para crear una rama. */ /* Nota: no se permitirn divisiones sobre un atributo a menos */ /* que dos o ms subconjuntos tengan al menos MINOBJS items. */ /* */ /* - intentar crear una rama y analizar si es mejor que crear una hoja */ /* */ /*************************************************************************/ Tree TDMC45::FormTree(ItemNo Fp, ItemNo Lp) { ItemNo i, Kp, Ep; ItemCount Cases, NoBestClass, KnownCases; float Factor, BestVal, Val, AvGain=0; Attribute Att, BestAtt, Possible=0; ClassNo c, BestClass; Tree Node; DiscrValue v; bool PrevAllKnown; Cases = CountItems(Fp, Lp); /* Generamos la distribucin en frecuencias de la clase */
BestClass = 0; ForEach(c, 0, MaxClass) { if ( ClassFreq[c] > ClassFreq[BestClass] ) { BestClass = c; } } NoBestClass = ClassFreq[BestClass]; Node = Leaf(ClassFreq, BestClass, Cases, Cases - NoBestClass); /* Si todos los casos son de la misma clase o no hay suficientes casos para dividir, el rbol es una hoja */ || Cases < 2 * MINOBJS )
Verbosity(1) { FVitacora<<(Lp-Fp+1); FVitacora<<" tems, peso total "; FVitacora<<Cases; FVitacora<<endl; } /* Para cada atributo disponible, calculamos la informacin y la ganancia */
ForEach(Att, 0, MaxAtt-1) { Gain[Att] = -Epsilon; if ( SpecialStatus[Att] == "IGNORAR" ) continue; if ( MaxAttVal[Att] ) { /* atributo discreto
*/
if ( SUBSET && MaxAttVal[Att] > 2 ) { EvalSubset(Att, Fp, Lp, Cases); } else if ( ! Tested[Att] ) { EvalDiscreteAtt(Att, Fp, Lp, Cases); } } else { /*
atributo continuo
*/
EvalContinuousAtt(Att, Fp, Lp); } /* Actualizamos la ganancia promedio, excluyendo los atributos con muchos valores */
if ( Gain[Att] > -Epsilon && ( MultiVal || MaxAttVal[Att] < 0.3 * (MaxItem + 1) ) ) { Possible++; AvGain += Gain[Att]; } } /* Buscamos el mejor atributo de acuerdo al criterio determinado */
266
Magdalena Servente
Cdigo Fuente
BestVal = -Epsilon; BestAtt = None; AvGain = ( Possible ? AvGain / Possible : 1E6 ); Verbosity(2) { if ( AvGain < 1E6 ) { FVitacora<<" ganancia promedio "; FVitacora<<AvGain; FVitacora<<endl; } } ForEach(Att, 0, MaxAtt-1) { if ( Gain[Att] > -Epsilon ) { Val = Worth(Info[Att], Gain[Att], AvGain); if ( Val > BestVal ) { BestAtt = Att; BestVal = Val; } } } /* Decidimos crear una rama o no */
if ( BestAtt != None ) { Verbosity(1) { FVitacora<<" mejor atributo "; FVitacora<<AttName->Strings[BestAtt].c_str(); if ( ! MaxAttVal[BestAtt] ) { FVitacora<<" corte "; FVitacora<<Bar[BestAtt]; } FVitacora<<" inf "; FVitacora<<Info[BestAtt]; FVitacora<<" ganancia "; FVitacora<<Gain[BestAtt]; FVitacora<<" val "; FVitacora<<BestVal; FVitacora<<endl; } /* Construir un nodo con la prueba seleccionada */
if ( MaxAttVal[BestAtt] ) { /* Atributo discreto */ if ( SUBSET && MaxAttVal[BestAtt] > 2 ) { SubsetTest(Node, BestAtt); } else { DiscreteTest(Node, BestAtt); } } else { /*
Atributo continuo
*/
PrevAllKnown = AllKnown; Kp = Group(0, Fp, Lp, Node) + 1; if ( Kp != Fp ) AllKnown = false; Cdigo Fuente Magdalena Servente 267
KnownCases = Cases - CountItems(Fp, Kp-1); UnknownRate[BestAtt] = (Cases - KnownCases) / (Cases + 0.001); Verbosity(1) { if ( UnknownRate[BestAtt] > 0 ) { FVitacora<<" proporciones desconocidas para "; FVitacora<<AttName->Strings[BestAtt].c_str(); FVitacora<<" = "; FVitacora<<UnknownRate[BestAtt]; FVitacora<<endl; } } /* Divide y reinars recursivo */
++Tested[BestAtt]; Ep = Kp - 1; Node->Errors = 0; ForEach(v, 1, Node->Forks) { Ep = Group(v, Kp, Lp, Node); if ( Kp <= Ep ) { Factor = CountItems(Kp, Ep) / KnownCases; ForEach(i, Fp, Kp-1) { Weight[i] *= Factor; } Node->Branch[v] = FormTree(Fp, Ep); Node->Errors += Node->Branch[v]->Errors; Group(0, Fp, Ep, Node); ForEach(i, Fp, Kp-1) { Weight[i] /= Factor; } } else { Node->Branch[v] = Leaf(Node->ClassDist, BestClass, 0.0, 0.0); } } --Tested[BestAtt]; AllKnown = PrevAllKnown; /* Analizamos si con una hoja obtenemos resultados similares */
if ( Node->Errors >= Cases - NoBestClass - Epsilon ) { Verbosity(1) { FVitacora<<"Colapsamos el rbol para "; FVitacora<<(Lp-Fp+1); FVitacora<<" tems a la hoja "; FVitacora<<ClassName->Strings[BestClass].c_str(); FVitacora<<endl; } Node->NodeType = 0; } } else { Verbosity(1) { FVitacora<<" no hay divisiones razonables "; FVitacora<<Cases; FVitacora<<" "; FVitacora<<(Cases - NoBestClass); FVitacora<<endl; 268 Magdalena Servente Cdigo Fuente
} } return Node; }
/*************************************************************************/ /* */ /* Agrupa los tems correspondiente a la rama V de una prueba y */ /* y devuelve el ndice del ltimo tem */ /* */ /* Nota: si V est vaca, agrupa valores desconocidos */ /* */ /*************************************************************************/ ItemNo TDMC45::Group(DiscrValue V, ItemNo Fp, ItemNo Lp,Tree TestNode) { ItemNo i; Attribute Att; float Thresh; Conjunto SS; Att = TestNode->Tested; if ( V ) { /* Agrupar items segn el valor del atributo Att, segn el tipo de rama */ switch ( TestNode->NodeType ) { case BrDiscr: for(i=Fp;i<Lp;i++) { if ( DVal(Item[i], Att) == V ) Intercambio(Fp++, i); } break; case ThreshContin: Thresh = TestNode->Cut; for(i=Fp;i<Lp;i++) { if ( (CVal(Item[i], Att) <= Thresh) == (V == 1) ) Intercambio(Fp++, i); } break; case BrSubset: SS = TestNode->Subset[V]; for(i=Fp;i<Lp;i++) { if ( In(DVal(Item[i], Att), SS) ) Intercambio(Fp++, i); } break; } } else { /* Agrupar valores desconocidos switch ( TestNode->NodeType ) { case BrDiscr: case BrSubset: for(i=Fp;i<Lp;i++) { if ( ! DVal(Item[i], Att) ) Intercambio(Fp++, i); } break; case ThreshContin: for(i=Fp;i<Lp;i++) { Cdigo Fuente Magdalena Servente 269
*/
if ( CVal(Item[i], Att) == Unknown ) Intercambio(Fp++, i); } break; } } return Fp - 1; } /*************************************************************************/ /* */ /* Intercambia los items en a y b */ /* */ /*************************************************************************/ void TDMC45::Intercambio(ItemNo a, ItemNo b) { register Description Hold; register ItemCount HoldW; Hold = Item[a]; Item[a] = Item[b]; Item[b] = Hold; HoldW = Weight[a]; Weight[a] = Weight[b]; Weight[b] = HoldW; }
/*************************************************************************/ /* */ /* Devuelve el peso total de los items desde Fp hasta Lp */ /* */ /*************************************************************************/ ItemCount TDMC45::CountItems(ItemNo Fp, ItemNo Lp) { register ItemCount Sum=0.0, *Wt, *LWt; if ( AllKnown ) return Lp - Fp + 1; for ( Wt = Weight + Fp, LWt = Weight + Lp ; Wt <= LWt ; ) { Sum += *Wt++; } return Sum; } //-----------------------------------------------------------------------------/*************************************************************************/ /* */ /* Determina el valor de una divisin particular segn el criterio */ /* elegido */ /* */ /* Parmetros: */ /* SplitInfo: informacin potencial de la divisin */ /* SplitGain: ganancia en informacin de la divisin */ /* MinGain: ganancia a partir de la cual el */ /* Gain Ratio puede usarse */ /* */ /* Si se est utilizando el criterio de Gain,se devuelve la ganancia de */ /* informacin de la divisin, pero si se est utilizando el criterio */ /* de GainRatio, se devuelve la proporcin de la ganancia de */ /* informacin con respecto a su informacin potencial. */ /* */ /*************************************************************************/ float TDMC45::Worth(float ThisInfo, float ThisGain, float MinGain) { if ( GAINRATIO ) { if ( ThisGain >= MinGain - Epsilon && ThisInfo > Epsilon ) { return ThisGain / ThisInfo; } else { 270 Magdalena Servente Cdigo Fuente
return -Epsilon; } } else { return ( ThisInfo > 0 && ThisGain > -Epsilon ? ThisGain : -Epsilon ); } } /*************************************************************************/ /* */ /* Resetea las tablas de frecuencia Freq[][] y ValFreq[] */ /* */ /*************************************************************************/ void TDMC45::ResetFreq(DiscrValue MaxVal) { DiscrValue v; ClassNo c; for (v=0;v<MaxVal;v++) { for (c=0;c<MaxClass;c++) { Freq[v][c] = 0; } ValFreq[v] = 0; } } /*************************************************************************/ /* */ /* Dadas las tablas Freq[][] y ValFreq[], computa la ganancia */ /* de informacin. */ /* */ /* Parmetros: */ /* BaseInfo: informacin promedio para todos los */ /* items con valores conocidos del */ /* atributo que se est testeando */ /* UnknownRate: fraccin de los items con valor del */ /* atributo desconocido */ /* MaxVal: cantidad de divisiones */ /* TotalItems: nro de items con valores conocidos para */ /* el atributo que se est testeando */ /* */ /* donde Freq[x][y] contiene el nro de casos con valor x para un */ /* atributo particular que pertenecen a la clase y, */ /* y ValFreq[x] contiene el nro de casos con valor x para un */ /* atributo particular */ /* */ /*************************************************************************/ float TDMC45::ComputeGain(float BaseInfo,float UnknFrac, DiscrValue MaxVal,ItemCount TotalItems) { DiscrValue v; float ThisInfo=0.0, ThisGain; short ReasonableSubsets=0; /* Verificamos si se conocen todos los valores o si son todos iguales */
if ( ! TotalItems ) return -Epsilon; /* Deben existir al menos dos subconjuntos con MINOBJS items for (v=1;v<MaxVal;v++) { if ( ValFreq[v] >= MINOBJS ) ReasonableSubsets++; } if ( ReasonableSubsets < 2 ) return -Epsilon; /* */
Calculamos la info total despus de la divisin, sumando la info de cada uno de los subconjuntos resultantes de la divisin */ for(v=1;v<MaxVal;v++) { ThisInfo += TotalInfo(Freq[v], 0, MaxClass); } /* Seteamos la ganancia de informacin para todos los items, ajustada para los desconocidos */ Magdalena Servente 271
Cdigo Fuente
ThisGain = (1 - UnknFrac) * (BaseInfo - ThisInfo / TotalItems); Verbosity(5) { FVitacora<<"CalculoEstaGanancia: items "; FVitacora<<(TotalItems + ValFreq[0]); FVitacora<<" info "; FVitacora<<ThisInfo; FVitacora<<" desc "; FVitacora<<UnknFrac; FVitacora<<" resultado "; FVitacora<<ThisGain<<endl; } return ThisGain; } /*************************************************************************/ /* */ /* Computa la informacin total en V[ MinVal..MaxVal ] */ /* */ /*************************************************************************/ float TDMC45::TotalInfo(ItemCount V[], DiscrValue MinVal, DiscrValue MaxVal) { DiscrValue v; float Sum=0.0; ItemCount N, TotalItems=0; for(v=MinVal;v<MaxVal;v++) { N = V[v]; Sum += N * Log(N); TotalItems += N; } return TotalItems * Log(TotalItems) - Sum; }
/*************************************************************************/ /* */ /* Imprime la tabla de distribucin para un atributo determinado */ /* */ /*************************************************************************/ void TDMC45::PrintDistribution(Attribute Att,DiscrValue MaxVal,bool ShowNames) { DiscrValue v; ClassNo c; String Val; FVitacora<<endl; FVitacora<<" "; for(c=0;c<MaxClass;c++) { FVitacora<<ClassName->Strings[c].c_str(); } FVitacora<<endl; for(v=0;v<MaxVal;v++) { if ( ShowNames ) { if ( !v) { Val="desconocidos"; } else { if (MaxAttVal[Att]) { Val=AttValName[Att][v]; } else { if(v == 1) 272 Magdalena Servente Cdigo Fuente
{ Val="menores"; } else { Val="mayores"; } } } FVitacora<<Val.c_str(); } else { FVitacora<<v; } for(c=0;c<MaxClass;c++) { FVitacora<<Freq[v][c]; } FVitacora<<endl; } } /*************************************************************************/ /* */ /* Construye una hoja en un determinado nodo */ /* */ /*************************************************************************/ Tree TDMC45::Leaf(ItemCount *ClassFreq, ClassNo NodeClass,ItemCount Cases,ItemCount Errors) { Tree Node; Node = (Tree) calloc(1, sizeof(tree_record)); Node->ClassDist = (ItemCount *) calloc(MaxClass+1, sizeof(ItemCount)); memcpy(Node->ClassDist, ClassFreq, (MaxClass+1) * sizeof(ItemCount)); Node->NodeType Node->Leaf Node->Items Node->Errors return Node; } /*************************************************************************/ /* */ /* Inserta ramas en un nodo */ /* */ /*************************************************************************/ void TDMC45::Sprout(Tree Node, DiscrValue Branches) { Node->Forks = Branches; Node->Branch = (Tree *) calloc(Branches+1, sizeof(Tree)); } = 0; = NodeClass; = Cases; = Errors;
/*************************************************************************/ /* */ /* Muestra todo el rbol de decisin T */ /* */ /*************************************************************************/ Tree TDMC45::PrintTree(Tree T) { short s; Subtree=0; FVitacora<<"rbol de decisin"; FVitacora<<endl; Show(T, 0); FVitacora<<endl; ForEach(s, 1, Subtree) { Cdigo Fuente Magdalena Servente 273
FVitacora<<endl; FVitacora<<endl; FVitacora<<"Subrbol "; FVitacora<<s; Show(Subdef[s], 0); FVitacora<<endl; } FVitacora<<endl; } /*************************************************************************/ /* */ /* Muestra el rbol T con offset Sh */ /* */ /*************************************************************************/ void TDMC45::Show(Tree T,short Sh) { DiscrValue v, MaxV; if ( T->NodeType ) { /* Verificamos si se necesita un nuevo subrbol */ if ( (T->Items!=0) && (Sh) && (Sh * TabSize + MaxLine(T) > Width) ) { if ( Subtree < 99 ) { Subdef[++Subtree] = T; FVitacora<<Subtree; } else { FVitacora<<"[S??]"; } } else { MaxV = T->Forks; /* Imprimimos los casos simples primero */ ForEach(v, 1, MaxV) { if ( ! T->Branch[v]->NodeType ) { ShowBranch(Sh, T, v); } } /* Imprimimos los subrboles */
ForEach(v, 1, MaxV) { if ( T->Branch[v]->NodeType ) { ShowBranch(Sh, T, v); } } } } else { FVitacora<<ClassName->Strings[T->Leaf].c_str(); FVitacora<<"("; FVitacora<<T->Items; if ( T->Errors > 0 ) FVitacora<<T->Errors; FVitacora>>")"; } } /*************************************************************************/ /* */ /* Imprime un nodo T con offset Sh, valor de rama v */ /* */ /*************************************************************************/ void TDMC45::ShowBranch(short Sh,Tree T,DiscrValue v) { DiscrValue Pv, Last; Attribute Att; 274 Magdalena Servente Cdigo Fuente
bool FirstValue; short TextWidth, Skip, Values=0, i; Att = T->Tested; switch ( T->NodeType ) { case BrDiscr: Indent(Sh, Tab); FVitacora<<AttName->Strings[Att].c_str(); FVitacora<<" = "; FVitacora<<AttValName[Att][v].c_str(); break; case ThreshContin: Indent(Sh, Tab); { FVitacora<<AttName->Strings[Att].c_str(); FVitacora<<" "; if (v==1) {FVitacora<<"<=";} else {FVitacora<<">";} FVitacora<<" "; FVitacora<<T->Cut; } if ( T->Lower != T->Upper ) { FVitacora<<"["; FVitacora<<T->Lower; FVitacora<<","; FVitacora<<T->Upper; } FVitacora<<":"; break; case BrSubset: /* Contar los valores de la rama ForEach(Pv, 1, MaxAttVal[Att]) { if ( In(Pv, T->Subset[v]) ) { Last = Pv; Values++; } } if ( ! Values ) return; Indent(Sh, Tab); if ( Values == 1 ) { FVitacora<<AttName->Strings[Att].c_str(); FVitacora<<" = "; FVitacora<<AttValName[Att][Last].c_str(); FVitacora<<":"; break; } FVitacora<<AttName->Strings[Att].c_str(); FVitacora<<" en {"; FirstValue = true; Skip = TextWidth = AttName->Strings[Att].Length() + 5; ForEach(Pv, 1, MaxAttVal[Att]) { if ( In(Pv, T->Subset[v]) ) { if ( ! FirstValue && TextWidth + AttValName[Att][Pv].Length() + 11 > Width ) { Indent(Sh, Tab); ForEach(i, 1, Skip) putchar(' '); TextWidth = Skip; FirstValue = true; } Cdigo Fuente Magdalena Servente 275
*/
FVitacora<<AttValName[Att][Pv].c_str(); if (Pv==Last) {FVitacora<<"}";} else {FVitacora<<",";} TextWidth += AttValName[Att][Pv].Length() + 1; FirstValue = false; } } putchar(':'); } Show(T->Branch[v], Sh+1); } /*************************************************************************/ /* */ /* Encuentra el tamao mx de una lnea nodo para el subrbol St. */ /* El formato de la lnea es */ /* <atributo> <> X.xx:[ <clase (<Items>)], o */ /* <atributo> = <DVal>:[ <clase> (<Items>)] */ /* */ /*************************************************************************/ short TDMC45::MaxLine(Tree St) { Attribute a; DiscrValue v, MaxV, Next; short Ll, MaxLl=0; a = St->Tested; MaxV = St->Forks; ForEach(v, 1, MaxV) { Ll = ( St->NodeType == 2 ? 4 : AttValName[a][v].Length() ) + 1; /* Buscamos la rama apropiada */
Next = v; if ( ! St->Branch[Next]->NodeType ) { Ll += ClassName->Strings[St->Branch[Next]->Leaf].Length() + 6; } MaxLl = Max(MaxLl, Ll); } return AttName->Strings[a].Length() + 4 + MaxLl; } /*************************************************************************/ /* */ /* Indenta Sh columnas */ /* */ /*************************************************************************/ void TDMC45::Indent(short Sh,char *Mark) { FVitacora<<endl; while ( Sh-- ) FVitacora<<Mark; } /*************************************************************************/ /* */ /* Guardamos el rbol T completo en el archivo */ /* de extensin Extension */ /* */ /*************************************************************************/ void TDMC45::SaveTree(Tree T,AnsiString Extension) { static char *LastExt=""; if ( strcmp(LastExt, Extension.c_str()) ) { LastExt = Extension.c_str(); if ( TRf ) fclose(TRf); 276 Magdalena Servente Cdigo Fuente
strcpy(Fn, FileName.c_str()); strcat(Fn, Extension.c_str()); if ( ! ( TRf = fopen(Fn, "w") ) ) { FVitacora<<"Error al abrir el archivo de salida del rbol"; FVitacora<<endl; } } putc('\n', TRf); OutTree(T); SaveDiscreteNames(); } /*************************************************************************/ /* */ /* Guardamos el rbol T como caracteres */ /* */ /*************************************************************************/ void TDMC45::OutTree(Tree T) { DiscrValue v; int Bytes; StreamOut((char StreamOut((char StreamOut((char StreamOut((char StreamOut((char *) *) *) *) *) &T->NodeType, sizeof(short)); &T->Leaf, sizeof(ClassNo)); &T->Items, sizeof(ItemCount)); &T->Errors, sizeof(ItemCount)); T->ClassDist, (MaxClass + 1) * sizeof(ItemCount));
if ( T->NodeType ) { StreamOut((char *) &T->Tested, sizeof(Attribute)); StreamOut((char *) &T->Forks, sizeof(short)); switch ( T->NodeType ) { case BrDiscr: break; case ThreshContin: StreamOut((char *) &T->Cut, sizeof(float)); StreamOut((char *) &T->Lower, sizeof(float)); StreamOut((char *) &T->Upper, sizeof(float)); break; case BrSubset: Bytes = (MaxAttVal[T->Tested]>>3) + 1; ForEach(v, 1, T->Forks) { StreamOut((char *) T->Subset[v], Bytes); } break; } ForEach(v, 1, T->Forks) { OutTree(T->Branch[v]); } } } /*************************************************************************/ /* */ /* Obtiene el rbol de decisin con extensin Extension */ /* */ /*************************************************************************/ Tree TDMC45::GetTree(AnsiString Extension) { Tree Hold; static char *LastExt=""; if ( strcmp(LastExt, Extension.c_str()) ) { LastExt = Extension.c_str(); Cdigo Fuente Magdalena Servente 277
if ( TRf ) fclose(TRf); strcpy(Fn, FileName.c_str()); strcat(Fn, Extension.c_str()); if ( ! ( TRf = fopen(Fn, "r") ) ) { FVitacora<<"Error al leer del archivo del rbol"; FVitacora<<endl; } } if ( ! TRf || getc(TRf) == EOF ) { Hold->Items=0; return Hold; } Hold = InTree(); RecoverDiscreteNames(); return Hold; } /*************************************************************************/ /* */ /* Recuperar el rbol a partir de los caracteres guardados */ /* */ /*************************************************************************/ Tree TDMC45::InTree() { Tree T; DiscrValue v; int Bytes; T = (Tree) malloc(sizeof(tree_record)); StreamIn((char StreamIn((char StreamIn((char StreamIn((char *) *) *) *) &T->NodeType, sizeof(short)); &T->Leaf, sizeof(ClassNo)); &T->Items, sizeof(ItemCount)); &T->Errors, sizeof(ItemCount));
T->ClassDist = (ItemCount *) calloc(MaxClass+1, sizeof(ItemCount)); StreamIn((char *) T->ClassDist, (MaxClass + 1) * sizeof(ItemCount)); if ( T->NodeType ) { StreamIn((char *) &T->Tested, sizeof(Attribute)); StreamIn((char *) &T->Forks, sizeof(short)); switch ( T->NodeType ) { case BrDiscr: break; case ThreshContin: StreamIn((char *) &T->Cut, sizeof(float)); StreamIn((char *) &T->Lower, sizeof(float)); StreamIn((char *) &T->Upper, sizeof(float)); break; case BrSubset: T->Subset = (Conjunto *) calloc(T->Forks + 1, sizeof(Conjunto)); Bytes = (MaxAttVal[T->Tested]>>3) + 1; ForEach(v, 1, T->Forks) { T->Subset[v] = (Conjunto) malloc(Bytes); StreamIn((char *) T->Subset[v], Bytes); } } T->Branch = (Tree *) calloc(T->Forks + 1, sizeof(Tree)); ForEach(v, 1, T->Forks) { T->Branch[v] = InTree(); 278 Magdalena Servente Cdigo Fuente
} } return T; } /*************************************************************************/ /* */ /* Stream caracteres de/hacia el archivo TRf desde/hacia una dir */ /* */ /*************************************************************************/ void TDMC45::StreamOut(AnsiString s,int n) {char *ss; ss=s.c_str(); while ( n-- ) putc(*ss++, TRf); } void TDMC45::StreamIn(AnsiString s,int n) {char *ss; while ( n-- ) *ss++ = getc(TRf); s=AnsiString(ss); }
/*************************************************************************/ /* */ /* Libera el espacio ocupado por Node */ /* */ /*************************************************************************/ void TDMC45::ReleaseTree(Tree Node) { DiscrValue v; if ( Node->NodeType ) { ForEach(v, 1, Node->Forks) { ReleaseTree(Node->Branch[v]); } free(Node->Branch); if ( Node->NodeType == BrSubset ) { free(Node->Subset); } } free(Node->ClassDist); free(Node); } /*************************************************************************/ /* */ /* Cuenta los nodos de un rbol */ /* */ /*************************************************************************/ int TDMC45::TreeSize(Tree Node) { int Sum=0; DiscrValue v; if ( Node->NodeType ) { ForEach(v, 1, Node->Forks) { Sum += TreeSize(Node->Branch[v]); } } return Sum + 1; } /*************************************************************************/ /* */ /* Devuelve una copia de tree T */ Cdigo Fuente Magdalena Servente 279
/* */ /*************************************************************************/ Tree TDMC45::CopyTree(Tree T) { DiscrValue v; Tree New; New = (Tree) malloc(sizeof(tree_record)); memcpy(New, T, sizeof(tree_record)); New->ClassDist = (ItemCount *) calloc(MaxClass+1, sizeof(ItemCount)); memcpy(New->ClassDist, T->ClassDist, (MaxClass + 1) * sizeof(ItemCount)); if ( T->NodeType ) { New->Branch = (Tree *) calloc(T->Forks + 1, sizeof(Tree)); ForEach(v, 1, T->Forks) { New->Branch[v] = CopyTree(T->Branch[v]); } } return New; } /*************************************************************************/ /* */ /* Guarda los valores de los atributos ledos con "discrete N" */ /* */ /*************************************************************************/ void TDMC45::SaveDiscreteNames() { Attribute Att; DiscrValue v; int Length; ForEach(Att, 0, MaxAtt) { if ( SpecialStatus[Att] != "DISCRETE" ) continue; StreamOut((char *) &MaxAttVal[Att], sizeof(int)); ForEach(v, 1, MaxAttVal[Att]) { Length = AttValName[Att][v].Length() + 1; StreamOut((char *) &Length, sizeof(int)); StreamOut((char *) AttValName[Att][v].c_str(), Length); } } } /*************************************************************************/ /* */ /* Recupera los valores de los atributos ledos con "discrete N" */ /* */ /*************************************************************************/ void TDMC45::RecoverDiscreteNames() { Attribute Att; DiscrValue v; int Length; ForEach(Att, 0, MaxAtt) { if ( SpecialStatus[Att] != "DISCRETE" ) continue; StreamIn(AnsiString(MaxAttVal[Att]), sizeof(int)); ForEach(v, 1, MaxAttVal[Att]) { StreamIn(AnsiString(Length), sizeof(int)); AttValName[Att][v] = (char *) malloc(Length); StreamIn(AttValName[Att][v], Length); } } 280 Magdalena Servente Cdigo Fuente
} /*************************************************************************/ /* */ /* Evaluacin del armado de subconjuntos sobre un atrib discreto. A */ /* partir de los subconjuntos elegidos Subset[Att][], se asigna a */ /* Subsets[Att] el nro de subconjuntos, y se calculan Info[] y Gain[] */ /* de una prueba sobre el atributo of a test on the attribute. */ /* */ /*************************************************************************/ void TDMC45::EvalSubset(Attribute Att, ItemNo Fp, ItemNo Lp,ItemCount Items) { DiscrValue V1, V2, BestV1, BestV2, Barred; ItemCount KnownItems; ClassNo c; float BaseInfo, MinGain, ThisGain, ThisInfo, Val, BestVal, BestGain, BestInfo, PrevVal, PrevGain, PrevInfo; short Blocks=0, MissingValues=0, ReasonableSubsets, Bytes, b; bool MergedSubsets = false; int SaveMINOBJS; SaveMINOBJS = MINOBJS; MINOBJS = 1; /* Primero calculamos Freq[][], ValFreq[], info de base, y la ganancia y la info total de una particin sobre el atrib discreto Att */
ComputeFrequencies(Att, Fp, Lp); KnownItems = Items - ValFreq[0]; if ( KnownItems < Epsilon ) { Verbosity(2) { FVitacora<<AttName->Strings[Att].c_str(); FVitacora<<" no tiene valores conocidos "; FVitacora<<endl; } Gain[Att] = -Epsilon; Info[Att] = 0; return; } BaseInfo = DiscrKnownBaseInfo(KnownItems, MaxAttVal[Att]); PrevGain = ComputeGain(BaseInfo, UnknownRate[Att], MaxAttVal[Att],KnownItems); PrevInfo = TotalInfo(ValFreq, 0, MaxAttVal[Att]) / Items; PrevVal = Worth(PrevInfo, PrevGain, Epsilon); Verbosity(2) { FVitacora<<AttName->Strings[Att].c_str(); Verbosity(3) PrintDistribution(Att, MaxAttVal[Att], true); FVitacora<<"inf "; FVitacora<<PrevInfo; FVitacora<<" ganancia "; FVitacora<<PrevGain; FVitacora<<" val="; FVitacora<<PrevVal; FVitacora<<endl; } /* Eliminamos de Freq[] and ValFreq[] aquellos valores del atributo que no estn representados, y creamos un subconjunto nuevo para cada uno de los valores representados del atributo */
Bytes = (MaxAttVal[Att]>>3) + 1; ClearBits(Bytes, Subset[Att][0]); ForEach(V1, 1, MaxAttVal[Att]) { if ( ValFreq[V1] > 0.5 ) { Cdigo Fuente Magdalena Servente 281
if ( ++Blocks < V1 ) { ValFreq[Blocks] = ValFreq[V1]; ForEach(c, 0, MaxClass) { Freq[Blocks][c] = Freq[V1][c]; } } ClearBits(Bytes, Subset[Att][Blocks]); SetBit(V1, Subset[Att][Blocks]); } else { SetBit(V1, Subset[Att][0]); MissingValues++; } } /* /* Unimos los subconjuntos de una nica clase con otrs de la misma clase */ Nota: ValFreq[V] > 0 para todo V */
ForEach(V1, 1, Blocks-1) { for ( c = 0 ; Freq[V1][c] < 0.1 ; c++ ) ; if ( Freq[V1][c] < ValFreq[V1] - 0.1 ) continue; /* Tenemos una nica clase -- buscamos otras */
for ( V2 = V1+1 ; V2 <= Blocks ; ) { if ( Freq[V2][c] < ValFreq[V2] - 0.1 ) { V2++; } else { /* Unimos estos subconjuntos */ Combine(V1, V2, Blocks); ForEach(b, 0, Bytes-1) { Subset[Att][V1][b] |= Subset[Att][V2][b]; Subset[Att][V2][b] = Subset[Att][Blocks][b]; } Blocks--; MergedSubsets = true; } } } if ( MergedSubsets ) { PrevGain = ComputeGain(BaseInfo, UnknownRate[Att], Blocks, KnownItems); PrevInfo = TotalInfo(ValFreq, 0, Blocks) / Items; PrevVal = Worth(PrevInfo, PrevGain, Epsilon); Verbosity(2) { FVitacora<<"Luego de unir subconjuntos de una nica clase:"; Verbosity(3) PrintDistribution(Att, Blocks, false); FVitacora<<"inf "; FVitacora<<PrevInfo; FVitacora<<" ganancia "; FVitacora<<PrevGain; FVitacora<<" val="; FVitacora<<PrevVal; FVitacora<<endl; } } /* 282 Examinamos los pares posibles de uniones y aplicamos "hill-climbing" Magdalena Servente */ Cdigo Fuente
MinGain = PrevGain / 2; while ( Blocks > 2 ) { BestVal = BestV1 = 0; BestGain = -Epsilon; /* Verificamos si existen subconjuntos razonables; si <3, unimos con el bloque ms grande */
ReasonableSubsets = 0; Barred = 1; ForEach(V1, 1, Blocks) { if ( ValFreq[V1] >= SaveMINOBJS ) ReasonableSubsets++; if ( ValFreq[V1] > ValFreq[Barred] ) Barred = V1; } if ( ReasonableSubsets >= 3 ) Barred = 0; /* Para cada par de valores posibles, calculamos la ganancia y la info total de una divisin en la cual se tratan como una unidad. Almacenamos el par con mejor ganancia. */
ForEach(V1, 1, Blocks-1) { ForEach(V2, V1+1, Blocks) { if ( V1 == Barred || V2 == Barred ) continue; Combine(V1, V2, Blocks); ThisGain = ComputeGain(BaseInfo, UnknownRate[Att], Blocks-1, KnownItems); ThisInfo = TotalInfo(ValFreq, 0, Blocks-1) / Items; Val = Worth(ThisInfo, ThisGain, Epsilon); Verbosity(4) { FVitacora<<"combinacin "; FVitacora<<V1; FVitacora<<" "; FVitacora<<V2; FVitacora<<" info "; FVitacora<<ThisInfo; FVitacora<<" ganancia "; FVitacora<<ThisGain; FVitacora<<" val "; FVitacora<<Val; PrintDistribution(Att, Blocks-1, false); } /* Forzamos una divisin si hay menos de dos subconj razonables o utilizamos la ganancia Elegimos esta divisin sobre la anterior si gain >= MinGain (y la anterior < MinGain), o val >= mejor valor anterior */
if ( ThisGain >= MinGain && BestGain < MinGain || Val >= BestVal || ! BestV1 && ( ! GAINRATIO || ReasonableSubsets < 2 ) ) { BestVal = Val; BestGain = ThisGain; BestInfo = ThisInfo; BestV1 = V1; BestV2 = V2; } Uncombine(V1, V2); } } if ( GAINRATIO && Cdigo Fuente Magdalena Servente 283
ReasonableSubsets >= 2 && ( ! BestV1 || BestVal < PrevVal + 1E-5 || BestVal == PrevVal && BestGain < PrevGain ) ) break; PrevGain = BestGain; PrevInfo = BestInfo; PrevVal = BestVal; Combine(BestV1, BestV2, Blocks); ForEach(b, 0, Bytes-1) { Subset[Att][BestV1][b] |= Subset[Att][BestV2][b]; Subset[Att][BestV2][b] = Subset[Att][Blocks][b]; } Blocks--; Verbosity(2) { FVitacora<<" formamos el subconjunto "; PrintSubset(Att, Subset[Att][BestV1]); FVitacora<<": "; FVitacora<<Blocks; FVitacora<<" subconjuntos, inf "; FVitacora<<BestInfo; FVitacora<<" ganancia "; FVitacora<<BestGain; FVitacora<<" val "; FVitacora<<BestVal; Verbosity(3) { FVitacora<<" combinacin "; FVitacora<<BestV1; FVitacora<<" "; FVitacora<<BestV2; PrintDistribution(Att, Blocks, false); } } } MINOBJS = SaveMINOBJS; if ( PrevVal { Gain[Att] Info[Att] } else { Gain[Att] Info[Att] <= 0 ) = -Epsilon; = 0;
if ( MissingValues ) { Blocks++; CopyBits(Bytes, Subset[Att][0], Subset[Att][Blocks]); } Subsets[Att] = Blocks; Verbosity(2) FVitacora<<" Subconjuntos finales: "; Verbosity(3) PrintDistribution(Att, Blocks, false); Verbosity(2) { FVitacora<<" inf "; FVitacora<< Info[Att]; FVitacora<<" ganancia "; FVitacora<<Gain[Att]; FVitacora<<" val "; FVitacora<< Worth(Info[Att], Gain[Att], Epsilon); } } }
284
Magdalena Servente
Cdigo Fuente
/*************************************************************************/ /* */ /* Combina los valores de la distribucin de los atributos discretos */ /* x e y, guardando los nuevos valores en Freq[x][] y ValFreq[x][]. */ /* Los valores anteriores se guardan en Slice1 y Slice2 */ /* */ /*************************************************************************/ void TDMC45::Combine(DiscrValue x,DiscrValue y,DiscrValue Last) { ClassNo c; ForEach(c, 0, MaxClass) { Slice1[c] = Freq[x][c]; Slice2[c] = Freq[y][c]; Freq[x][c] += Freq[y][c]; Freq[y][c] = Freq[Last][c]; } Slice1[MaxClass+1] = ValFreq[x]; Slice2[MaxClass+1] = ValFreq[y]; ValFreq[x] += ValFreq[y]; ValFreq[y] = ValFreq[Last]; }
/*************************************************************************/ /* */ /* Devuelve a x e y los valores de distribucin originales a partir */ /* de Slice1 y Slice2 */ /* */ /*************************************************************************/ void TDMC45::Uncombine(DiscrValue x,DiscrValue y) { ClassNo c; ForEach(c, 0, MaxClass) { Freq[x][c] = Slice1[c]; Freq[y][c] = Slice2[c]; } ValFreq[x] = Slice1[MaxClass+1]; ValFreq[y] = Slice2[MaxClass+1]; }
/*************************************************************************/ /* */ /* Imprime los valores del atributo Att que estan en el subconjunto Ss */ /* */ /*************************************************************************/ void TDMC45::PrintSubset(Attribute Att,Conjunto Ss) { DiscrValue V1; bool First=true; ForEach(V1, 1, MaxAttVal[Att]) { if ( In(V1, Ss) ) { if ( First ) { First = false; } else { FVitacora<<", "; } FVitacora<<AttValName[Att][V1].c_str(); } } }
Cdigo Fuente
Magdalena Servente
285
/*************************************************************************/ /* */ /* Construye una prueba de nodo sobre un subconjunto de valores */ /* */ /*************************************************************************/ void TDMC45::SubsetTest(Tree Node,Attribute Att) { short S, Bytes; Sprout(Node, Subsets[Att]); Node->NodeType Node->Tested Node->Errors = BrSubset; = Att; = 0;
Bytes = (MaxAttVal[Att]>>3) + 1; Node->Subset = (Conjunto *) calloc(Subsets[Att] + 1, sizeof(Conjunto)); ForEach(S, 1, Node->Forks) { Node->Subset[S] = (Conjunto) malloc(Bytes); CopyBits(Bytes, Subset[Att][S], Node->Subset[S]); } }
/*************************************************************************/ /* */ /* Setea Info[] and Gain[] para la particin discreta de items */ /* Fp hasta Lp */ /* */ /*************************************************************************/ void TDMC45::EvalDiscreteAtt(Attribute Att,ItemNo Fp,ItemNo Lp,ItemCount Items) { ItemCount KnownItems; ComputeFrequencies(Att, Fp, Lp); KnownItems = Items - ValFreq[0]; /* Caso especial cuando no existen valores conocidos del atributo */
if ( Items <= ValFreq[0] ) { Verbosity(2) { FVitacora<<AttName->Strings[Att].c_str();//AttName[Att]; FVitacora<<" no existen valores conocidos"; FVitacora<<endl; }
Gain[Att] = -Epsilon; Info[Att] = 0.0; return; } Gain[Att] = ComputeGain(DiscrKnownBaseInfo(KnownItems, MaxAttVal[Att]), UnknownRate[Att], MaxAttVal[Att], KnownItems); Info[Att] = TotalInfo(ValFreq, 0, MaxAttVal[Att]) / Items; Verbosity(2) { FVitacora<<AttName->Strings[Att].c_str(); Verbosity(3) PrintDistribution(Att, MaxAttVal[Att], true); FVitacora<<Info[Att]; FVitacora<<" ganancia "; FVitacora<<Gain[Att]; FVitacora<<endl; } }
/* Computa las tablas de frecuencia Freq[][] y ValFreq[] para el */ /* atrib Att para los items desde Fp hasta Lp, y determina la */ /* proporcin de desconocidos (UnknownRate) para Att */ /* */ /*************************************************************************/ void TDMC45::ComputeFrequencies(Attribute Att,ItemNo Fp,ItemNo Lp) { Description Case; ClassNo c; DiscrValue v; ItemNo p; ResetFreq(MaxAttVal[Att]); /* Determinamos la frecuencia de cada clase segn los casos de cada valor posible para el atributo dado */
ForEach(p, Fp, Lp) { Case = Item[p]; Freq[ DVal(Case,Att) ][ Class(Case) ] += Weight[p]; } /* Determinamos la frecuencia de cada valor posible para el atributo dado */
ForEach(v, 0, MaxAttVal[Att]) { ForEach(c, 0, MaxClass) { ValFreq[v] += Freq[v][c]; } } /* Determinamos la proporcin de valores desconocidos para cada atributo */
/*************************************************************************/ /* */ /* Devuelve la informacin base de los itemscon valores conocidos */ /* de un atributo discreto, utilizando la tabla de frecuencias Freq[][] */ /* */ /*************************************************************************/ float TDMC45::DiscrKnownBaseInfo(DiscrValue KnownItems,ItemCount MaxVal) { ClassNo c; ItemCount ClassCount; double Sum=0; DiscrValue v; ForEach(c, 0, MaxClass) { ClassCount = 0; ForEach(v, 1, MaxVal) { ClassCount += Freq[v][c]; } Sum += ClassCount * Log(ClassCount); } return (KnownItems * Log(KnownItems) - Sum) / KnownItems; }
/*************************************************************************/ /* */ /* Construye y devuelve un nodo para una prueba sobre un */ /* atributo discreto */ /* */ /*************************************************************************/ void TDMC45::DiscreteTest(Tree Node,Attribute Att) { ItemCount CountItems(); Cdigo Fuente Magdalena Servente 287
/*************************************************************************/ /* */ /* Evaluacin de una prueba sobre un atributo continuo */ /* --------------------------------------------------*/ /* */ /*************************************************************************/ /*************************************************************************/ /* */ /* Trabajamos ocmo si los atributos continuos tuviesen los siguientes */ /* valores posibles: */ /* 0 (desconocido), 1 (menor que el corte), 2(mayor que el corte) */ /* Esta rutina busca el mejor corte para los items desde Fp hasta Lp */ /* y setea Info[], Gain[] and Bar[] */ /* */ /*************************************************************************/ void TDMC45::EvalContinuousAtt(Attribute Att,ItemNo Fp,ItemNo Lp) { ItemNo i, BestI, Xp, Tries=0; ItemCount Items, KnownItems, LowItems, MinSplit; ClassNo c; float AvGain=0, Val, BestVal, BaseInfo, ThreshCost; Verbosity(2) { FVitacora<<"Atrib "; FVitacora<<AttName->Strings[Att].c_str(); } Verbosity(3) FVitacora<<endl; ResetFreq(2); /* Omitimos y contamos los valores desconocidos */
Items = CountItems(Fp, Lp); Xp = Fp; ForEach(i, Fp, Lp) { if ( CVal(Item[i],Att) == Unknown ) { Freq[ 0 ][ Class(Item[i]) ] += Weight[i]; Intercambio(Xp, i); Xp++; } } ValFreq[0] = 0; ForEach(c, 0, MaxClass) { ValFreq[0] += Freq[0][c]; } KnownItems = Items - ValFreq[0]; UnknownRate[Att] = 1.0 - KnownItems / Items; /* Caso especial cuando hay pocos valores conocidos */
if ( KnownItems < 2 * MINOBJS ) { Verbosity(2) { FVitacora<<"casos insuficientes con valores conocidos "; FVitacora<<endl; } Gain[Att] = -Epsilon; Info[Att] = 0.0; return; } 288 Magdalena Servente Cdigo Fuente
Quicksort(Xp, Lp, Att); /* Contamos los valores base y determimos la informacin base */
ForEach(i, Xp, Lp) { Freq[ 2 ][ Class(Item[i]) ] += Weight[i]; SplitGain[i] = -Epsilon; SplitInfo[i] = 0; } BaseInfo = TotalInfo(Freq[2], 0, MaxClass) / KnownItems; /* Probamos cortes posibles entre los items i e i+1, y determinamos la informacin y ganancia de cada corte.*/
MinSplit = 0.10 * KnownItems / (MaxClass + 1); if ( MinSplit <= MINOBJS ) MinSplit = MINOBJS; else if ( MinSplit > 25 ) MinSplit = 25; LowItems = 0; ForEach(i, Xp, Lp - 1) { c = Class(Item[i]); LowItems += Weight[i]; Freq[1][c] += Weight[i]; Freq[2][c] -= Weight[i]; if ( LowItems < MinSplit ) continue; else if ( LowItems > KnownItems - MinSplit ) break; if ( CVal(Item[i],Att) < CVal(Item[i+1],Att) - 1E-5 ) { ValFreq[1] = LowItems; ValFreq[2] = KnownItems - LowItems; SplitGain[i] = ComputeGain(BaseInfo, UnknownRate[Att], 2, KnownItems); SplitInfo[i] = TotalInfo(ValFreq, 0, 2) / Items; AvGain += SplitGain[i]; Tries++; Verbosity(3) { FVitacora<<" Corte en "; FVitacora<<(( CVal(Item[i],Att) + CVal(Item[i+1],Att) ) / 2); FVitacora<<" (ganancia "; FVitacora<<SplitGain[i]; FVitacora<<" val "; FVitacora<<Worth(SplitInfo[i], SplitGain[i], Epsilon); FVitacora<<"):"; PrintDistribution(Att, 2, true); } } } /* Encontramos el mejor atributo segn el criterio dado */
ThreshCost = Log(Tries) / Items; BestVal = 0; BestI = None; ForEach(i, Xp, Lp - 1) { if ( (Val = SplitGain[i] - ThreshCost) > BestVal ) { BestI = i; BestVal = Val; } } /* Si una prueba sobre el atributo es capaz de lograr una ganancia, setear el mejor break point, ganancia e informacin */
} } else { Bar[Att] = (CVal(Item[BestI],Att) + CVal(Item[BestI+1],Att)) / 2; Gain[Att] = BestVal; Info[Att] = SplitInfo[BestI]; Verbosity(2) { FVitacora<<" corte="; FVitacora<<Bar[Att]; FVitacora<<" inf "; FVitacora<<Info[Att]; FVitacora<<" ganancia "; FVitacora<<Gain[Att]; FVitacora<<endl; } } }
/*************************************************************************/ /* */ /* Transforma una hoja en una prueba sobre un atributo continuo */ /* */ /*************************************************************************/ void TDMC45::ContinTest(Tree Node,Attribute Att) { float Thresh; Sprout(Node, 2); Thresh = GreatestValueBelow(Att, Bar[Att]); Node->NodeType Node->Tested Node->Cut Node->Lower Node->Upper Node->Errors } /*************************************************************************/ /* */ /* Devuelve el mayor valor del atributo Att por debajo del lmite t */ /* */ /*************************************************************************/ float TDMC45::GreatestValueBelow(Attribute Att,float t) { ItemNo i; float v, Best; bool NotYet=true; ForEach(i, 0, MaxItem) { v = CVal(Item[i], Att); if ( v != Unknown && v <= t && ( NotYet || v > Best ) ) { Best = v; NotYet = false; } } return Best; } = ThreshContin; = Att; = = = Thresh; = 0;
/* Ordena los items desde Fp hasta Lp segn el atributo a */ /* */ /*************************************************************************/ //void TDMC45::Quicksort(ItemNo Fp,ItemNo Lp,Attribute Att, void (*Exchange)()) void TDMC45::Quicksort(ItemNo Fp,ItemNo Lp,Attribute Att) { register ItemNo Lower, Middle; register float Thresh; register ItemNo i; if ( Fp < Lp ) { Thresh = CVal(Item[Lp], Att); /* Separamos todos los items con valores <= lmite */
Middle = Fp; for ( i = Fp ; i < Lp ; i++ ) { if ( CVal(Item[i], Att) <= Thresh ) { if ( i != Middle ) Intercambio(Middle,i);//(*Exchange)(Middle, i); Middle++; } } /* Extraemos todos los valores iguales al lmite */
Lower = Middle - 1; for ( i = Lower ; i >= Fp ; i-- ) { if ( CVal(Item[i], Att) == Thresh ) { if ( i != Lower ) Intercambio(Lower,i);//(*Exchange)(Lower, i); Lower--; } } /* // Ordenamos los valores menores */
Quicksort(Fp, Lower, Att, Exchange); Quicksort(Fp, Lower, Att); /* Posicionamos el elemento del medio */
//
// } }
/*************************************************************************/ /* */ /* Poda el rbol T y devuelve true si el rbol fue modificado */ /* */ /*************************************************************************/ bool TDMC45::Prune(Tree T) { ItemNo i; Attribute a; InitialiseWeights(); AllKnown = true; Verbosity(1) FVitacora<<endl; Changed = false; Cdigo Fuente Magdalena Servente 291
EstimateErrors(T, 0, MaxItem, 0, true); if ( SUBSET ) { if ( ! PossibleValues ) { PossibleValues = (Conjunto *) calloc(MaxAtt+1, sizeof(Conjunto)); } ForEach(a, 0, MaxAtt) { if ( MaxAttVal[a] ) { PossibleValues[a] = (Conjunto) malloc((MaxAttVal[a]>>3) + 1); ClearBits((MaxAttVal[a]>>3) + 1, PossibleValues[a]); ForEach(i, 1, MaxAttVal[a]) { SetBit(i, PossibleValues[a]); } } } CheckPossibleValues(T); } return Changed; } /*************************************************************************/ /* */ /* Estima los errores en un determinado subrbol */ /* */ /*************************************************************************/ float TDMC45::EstimateErrors(Tree T, ItemNo Fp,ItemNo Lp,short Sh,bool UpdateTree) { ItemNo i, Kp, Ep; ItemCount Cases, KnownCases, *LocalClassDist, TreeErrors, LeafErrors, ExtraLeafErrors, BranchErrors,Factor, MaxFactor; DiscrValue v, MaxBr; ClassNo c, BestClass; bool PrevAllKnown; /* Generamos la distribucin de clases */
Cases = CountItems(Fp, Lp); LocalClassDist = (ItemCount *) calloc(MaxClass+1, sizeof(ItemCount)); ForEach(i, Fp, Lp) { LocalClassDist[ Class(Item[i]) ] += Weight[i]; } /* Buscamos la clase ms frecuente y actualizamos el rbol */
BestClass = T->Leaf; ForEach(c, 0, MaxClass) { if ( LocalClassDist[c] > LocalClassDist[BestClass] ) { BestClass = c; } } LeafErrors = Cases - LocalClassDist[BestClass]; ExtraLeafErrors = AddErrs(Cases, LeafErrors); if ( UpdateTree ) { T->Items = Cases; T->Leaf = BestClass; memcpy(T->ClassDist, LocalClassDist, (MaxClass + 1) * sizeof(ItemCount)); } if ( ! T->NodeType ) /* hoja */ { TreeErrors = LeafErrors + ExtraLeafErrors;
292
Magdalena Servente
Cdigo Fuente
if ( UpdateTree ) { T->Errors = TreeErrors; LocalVerbosity(1) { Intab(Sh); FVitacora<<ClassName->Strings[T->Leaf].c_str(); FVitacora<<" ( "; FVitacora<<T->Items; FVitacora<<":"; FVitacora<<LeafErrors; FVitacora<<"/"; FVitacora<<T->Errors; FVitacora<<endl; } } free(LocalClassDist); return TreeErrors; } /* Estimamos los errores para cada rama */
Kp = Group(0, Fp, Lp, T) + 1; KnownCases = CountItems(Kp, Lp); PrevAllKnown = AllKnown; if ( Kp != Fp ) AllKnown = false; TreeErrors = MaxFactor = 0; ForEach(v, 1, T->Forks) { Ep = Group(v, Kp, Lp, T); if ( Kp <= Ep ) { Factor = CountItems(Kp, Ep) / KnownCases; if ( Factor >= MaxFactor ) { MaxBr = v; MaxFactor = Factor; } ForEach(i, Fp, Kp-1) { Weight[i] *= Factor; } TreeErrors += EstimateErrors(T->Branch[v], Fp, Ep, Sh+1, UpdateTree); Group(0, Fp, Ep, T); ForEach(i, Fp, Kp-1) { Weight[i] /= Factor; } } } AllKnown = PrevAllKnown; if ( ! UpdateTree ) { free(LocalClassDist); return TreeErrors; } /* Analizamos la performance de la rama ms grande */
BranchErrors = EstimateErrors(T->Branch[MaxBr], Fp, Lp, -1000, false); LocalVerbosity(1) { Cdigo Fuente Magdalena Servente 293
Intab(Sh); FVitacora<<AttName->Strings[T->Tested].c_str(); FVitacora<<": ["; FVitacora<<((int) ((TreeErrors * 100) / (T->Items + 0.001))); FVitacora<<"N="; FVitacora<<T->Items; FVitacora<<" rbol="; FVitacora<<TreeErrors; FVitacora<<" hoja="; FVitacora<<LeafErrors; FVitacora<<"+"; FVitacora<<ExtraLeafErrors; FVitacora<<" br["; FVitacora<<MaxBr; FVitacora<<"]="; FVitacora<<BranchErrors; FVitacora<<endl; } /* Analizamos si el rbol debera ser reemplazado por la hoja o por la rama ms grande */
if ( LeafErrors + ExtraLeafErrors <= BranchErrors + 0.1 && LeafErrors + ExtraLeafErrors <= TreeErrors + 0.1 ) { LocalVerbosity(1) { Intab(Sh); FVitacora<<"Reemplazado por la hoja "; FVitacora<<ClassName->Strings[T->Leaf].c_str(); FVitacora<<endl; } T->NodeType = 0; T->Errors = LeafErrors + ExtraLeafErrors; Changed = true; } else if ( BranchErrors <= TreeErrors + 0.1 ) { LocalVerbosity(1) { Intab(Sh); FVitacora<<"Reemplazado por la rama "; FVitacora<<MaxBr; FVitacora<<endl; } AllKnown = PrevAllKnown; EstimateErrors(T->Branch[MaxBr], Fp, Lp, Sh, true); memcpy((char *) T, (char *) T->Branch[MaxBr], sizeof(tree_record)); Changed = true; } else { T->Errors = TreeErrors; } AllKnown = PrevAllKnown; free(LocalClassDist); return T->Errors; }
/*************************************************************************/ /* */ /* Elimina pruebas de subconjuntos innecesarias sobre */ /* valores faltantes */ /* */ /*************************************************************************/ void TDMC45::CheckPossibleValues(Tree T) { Conjunto HoldValues; int v, Bytes, b; Attribute A; 294 Magdalena Servente Cdigo Fuente
char Any=0; if ( T->NodeType == BrSubset ) { A = T->Tested; Bytes = (MaxAttVal[A]>>3) + 1; HoldValues = (Conjunto) malloc(Bytes); /* Analizamos si la ltima (default) rama puede simplificarse u omitirse */
ForEach(b, 0, Bytes-1) { T->Subset[T->Forks][b] &= PossibleValues[A][b]; Any |= T->Subset[T->Forks][b]; } if ( ! Any ) { T->Forks--; } /* Procesamos cada subrbol, dejando nicamente valores en los subconjuntos de las ramas */
CopyBits(Bytes, PossibleValues[A], HoldValues); ForEach(v, 1, T->Forks) { CopyBits(Bytes, T->Subset[v], PossibleValues[A]); CheckPossibleValues(T->Branch[v]); } CopyBits(Bytes, HoldValues, PossibleValues[A]); free(HoldValues); } else if ( T->NodeType ) { ForEach(v, 1, T->Forks) { CheckPossibleValues(T->Branch[v]); } } }
/*************************************************************************/ /* */ /* Computa los errores adicionales si la proporcin de error llega al */ /* lmite superior del nivel de confianza. El coeficiente es el */ /* cuadrado del nro de desviaciones estndar correspondientes al */ /* nivel de confianza seleccionado. */ /* (Basado en el Documenta Geigy Scientific Tables (Sixth Edition), */ /* p185 (with modifications).) */ /* */ /*************************************************************************/ float TDMC45::AddErrs(ItemCount N, ItemCount e) { static float Coeff=0; float Val0, Pr; if ( ! Coeff ) { /* Computa y retiene el valor del coeficiente, interpolando los valores de Val y Dev */ int i; i = 0; while ( CF > Val[i] ) i++; Coeff = Dev[i-1] + Cdigo Fuente Magdalena Servente 295
(Dev[i] - Dev[i-1]) * (CF - Val[i-1]) /(Val[i] - Val[i-1]); Coeff = Coeff * Coeff; } if ( e < 1E-6 ) { return N * (1 - exp(log(CF) / N)); } else if ( e < 0.9999 ) { Val0 = N * (1 - exp(log(CF) / N)); return Val0 + e * (AddErrs(N, 1.0) - Val0); } else if ( e + 0.5 >= N ) { return 0.67 * (N - e); } else { Pr = (e + 0.5 + Coeff/2 + sqrt(Coeff * ((e + 0.5) * (1 - (e + 0.5)/N) + Coeff/4)) ) / (N + Coeff); return (N * Pr - e); } }
/*************************************************************************/ /* */ /* Categoriza la descripcin de un caso utilizando el rbol de decisin */ /* */ /*************************************************************************/ ClassNo TDMC45::Category(Description CaseDesc,Tree DecisionTree) { ClassNo c, BestClass; if ( ! ClassSum ) { ClassSum = (float *) malloc((MaxClass+1) * sizeof(float)); } ForEach(c, 0, MaxClass) { ClassSum[c] = 0; } Classify(CaseDesc, DecisionTree, 1.0); BestClass = 0; ForEach(c, 0, MaxClass) { Verbosity(5) printf("clase %s peso %.2f\n", ClassName[c], ClassSum[c]); if ( ClassSum[c] > ClassSum[BestClass] ) BestClass = c; } return BestClass; } /*************************************************************************/ /* */ /* Clasifica un caso utilizando el subrbol dado, ajustando el valor */ /* de ClassSum para cada clase */ /* */ /*************************************************************************/ void TDMC45::Classify(Description CaseDesc,Tree T,float Weight) { DiscrValue v, dv; float Cv; Attribute a; ClassNo c;
296
Magdalena Servente
Cdigo Fuente
switch ( T->NodeType ) { case 0: /* hoja */ if ( T->Items > 0 ) { /* Actualizamos a partir de TODAS las clases */ ForEach(c, 0, MaxClass) { if ( T->ClassDist[c] ) { ClassSum[c] += Weight * T->ClassDist[c] / T->Items; } } } else { ClassSum[T->Leaf] += Weight; } return; case BrDiscr: /* prueba sobre un atrib discreto */
a = T->Tested; v = DVal(CaseDesc, a); if ( v && v <= T->Forks ) /* { Classify(CaseDesc, T->Branch[v], Weight); } else { ForEach(v, 1, T->Forks) { Classify(CaseDesc, T->Branch[v], (Weight * T->Branch[v]->Items) / T->Items); } } return; case ThreshContin: /* prueba sobre un atributo contnuo */ Nos aseguramos que no sea un nuevo valor discreto */
a = T->Tested; Cv = CVal(CaseDesc, a); if ( Cv == Unknown ) { ForEach(v, 1, 2) { Classify(CaseDesc, T->Branch[v], (Weight * T->Branch[v]->Items) / T->Items); } } else { v = ( Cv <= T->Cut ? 1 : 2 ); Classify(CaseDesc, T->Branch[v], Weight); } return; case BrSubset: /* prueba sobre un subconj de valores discretos */
a = T->Tested; dv = DVal(CaseDesc, a); if ( dv ) { ForEach(v, 1, T->Forks) { if ( In(dv, T->Subset[v]) ) { Classify(CaseDesc, T->Branch[v], Weight); Cdigo Fuente Magdalena Servente 297
/*************************************************************************/ /* */ /* Imprime matrices de confusin */ /* */ /*************************************************************************/ void TDMC45::PrintConfusionMatrix(ItemNo *ConfusionMat) { short Row, Col; if ( MaxClass > 20 ) return; /* /* No imprimir matrices sin sentido */
FVitacora<<endl; FVitacora<<endl; FVitacora<<" "; ForEach(Col, 0, MaxClass) { FVitacora<<" ("; FVitacora<<('a' + Col); FVitacora<<")"; } FVitacora<<" <-clasificado como "; FVitacora<<endl; FVitacora<<" "; ForEach(Col, 0, MaxClass) { FVitacora<<" ------"; } FVitacora<<endl; ForEach(Row, 0, MaxClass) { FVitacora<<" "; ForEach(Col, 0, MaxClass) { if ( ConfusionMat[Row*(MaxClass+1) + Col] ) { FVitacora<<ConfusionMat[Row*(MaxClass+1) + Col]; } else { FVitacora<<" "; } } FVitacora<<" ("; FVitacora<<('a'+Row); FVitacora<<"): clase"; FVitacora<<ClassName->Strings[Row].c_str(); FVitacora<<endl; } FVitacora<<endl; }
/*** REGLAS DE DECISIN *******/ /**************************************************************************************/ void TDMC45::GenerarReglasC45() { int o; extern char *optarg; extern int optind; bool FirstTime=true; char outFile[50]="Log\\C45Reglas"; //Inicializamos las variables FileName = "DF"; VERBOSITY = 5; UNSEENS = true; SIGTEST = false; SIMANNEAL = false; SIGTHRESH = 0.05; CF= 0.25; REDUNDANCY = 1.0; NRules = 0; RuleSpace = 0; NTests = 0; //Inicializamos el archivo strcat(outFile, DateTimeToStr(Now()).c_str()); strcat(outFile, Params->TablaBD.c_str()); strcat(outFile, ".log"); FReglas.open(outFile, ios::out); FReglas<<"C4.5 Generador de reglas FReglas<<DateTimeToStr(Now()).c_str(); FReglas<<endl; FReglas<<"---------------------------"; FReglas<<endl; FReglas<<endl; /* Inicializacin */
";
GetNames(); GetData(); FReglas<<(MaxItem+1); FReglas<<" casos ("; FReglas<<MaxAtt; FReglas<<" atributos) ledos de "; FReglas<<Params->TablaBD.c_str(); GenerateLogs(); /* Construccin de reglas GenerateRules(); /* Evaluaciones */ */
FReglas<<endl; FReglas<<endl; FReglas<<"Evaluacin sobre los datos de entrenamiento ("; FReglas<<MaxItem+1; FReglas<<" tems):"; FReglas<<endl; EvaluateRulesets(true); /* Guardamos el conjunto de reglas actual */
SaveRules(); if ( UNSEENS ) { GetData(); FReglas<<endl; FReglas<<endl; FReglas<<"Evaluacin sobre los datos de prueba ("; FReglas<<MaxItem+1; FReglas<<" tems):"; FReglas<<endl; EvaluateRulesets(false); } exit(0); } Cdigo Fuente Magdalena Servente 299
/*************************************************************************/ /* */ /* Creacin del vector LogItemNo para contener los logaritmos de */ /* enteros, y el vector LogFact para contener los logaritmos de los */ /* factoriales (todos en base 2) */ /* */ /*************************************************************************/ void TDMC45::GenerateLogs() { ItemNo i; LogItemNo = (float *) malloc((MaxItem+100) * sizeof(float)); LogFact = (double *) malloc((MaxItem+100) * sizeof(double)); LogItemNo[0] = -1E38; LogItemNo[1] = 0; LogFact[0] = LogFact[1] = 0; ForEach(i, 2, MaxItem+99) { LogItemNo[i] = log((float) i) / Log2; LogFact[i] = LogFact[i-1] + LogItemNo[i]; } } /*************************************************************************/ /* */ /* Para cada rbol, creamos un conj de reglas y lo procesamos. Luego */ /* componemos un conjunto de reglas a partir de estos conjuntos. */ /* Si hay un slo rbol, entoncesno se compone un nuevo conjunto. */ /* */ /* Los conj de reglas se almacenan desde PRSet[0] hasta PRSet[TRIALS], */ /* donde PRSet[TRIALS] contiene el conjunto compuesto. */ /* */ /* Al terminar, el conjunto actual es el compuesto (si es que uno se */ /* cre), sino es el conjunto de un rbol. */ /* */ /*************************************************************************/ void TDMC45::GenerateRules() { Tree DecisionTree, GetTree(); short t=0, RuleSetSpace=0, r; /* Buscamos los bits para codificar los atributos y las ramas */
while ( DecisionTree = GetTree() ) { FReglas<<endl; FReglas<<"------------------"; FReglas<<endl; FReglas<<"Procesando el rbol "; FReglas<<t; /* Creamos un conjunto de reglas del prximo rbol */
ConstructRuleset(); FReglas<<endl; FReglas<<"Reglas finales del rbol: "; FReglas<<t; FReglas<<endl; PrintIndexedRules(); /* Nos aseguramos de que hay suficiente lugar para el nuevo conj de reglas */
{ RuleSetSpace += 10; if ( RuleSetSpace > 10 ) { PRSet = (RuleSet *) realloc(PRSet, RuleSetSpace * sizeof(RuleSet)); } else { PRSet = (RuleSet *) malloc(RuleSetSpace * sizeof(RuleSet)); } } PRSet[t].SNRules = NRules; PRSet[t].SRule = Rule; PRSet[t].SRuleIndex = RuleIndex; PRSet[t].SDefaultClass = DefaultClass; ++t; } if ( ! t ) { FReglas<<endl; FReglas<<"ERROR: FReglas<<endl; exit(1); } TRIALS = t; /* Si hay ms de un rbol, creamos un conjunto compuesto de reglas a partir de las reglas de cada uno de los rboles */
if ( TRIALS > 1 ) { CompositeRuleset(); } } /*************************************************************************/ /* */ /* Determina las longitudes de los codigos para los atributos */ /* y las ramas */ /* */ /*************************************************************************/ void TDMC45::FindTestCodes() { Attribute Att; DiscrValue v, V; ItemNo i, *ValFreq; int PossibleCuts; float Sum, SumBranches=0, p; void SwapUnweighted(); BranchBits = (float *) malloc((MaxAtt+1) * sizeof(float));
ForEach(Att, 0, MaxAtt) { if ( (V = MaxAttVal[Att]) ) { ValFreq = (ItemNo *) calloc(V+1, sizeof(ItemNo)); ForEach(i, 0, MaxItem) { ValFreq[DVal(Item[i],Att)]++; } Sum = 0; ForEach(v, 1, V) { if ( ValFreq[v] ) { Sum += (ValFreq[v] / (MaxItem+1.0)) * (LogItemNo[MaxItem+1] - LogItemNo[ValFreq[v]]); } Cdigo Fuente Magdalena Servente 301
} free(ValFreq); BranchBits[Att] = Sum; } else { Quicksort(0, MaxItem, Att); PossibleCuts = 1; ForEach(i, 1, MaxItem) { if ( CVal(Item[i],Att) > CVal(Item[i-1],Att) ) { PossibleCuts++; } } BranchBits[Att] = PossibleCuts > 1 ? 1 + LogItemNo[PossibleCuts] / 2 : 0 ; } SumBranches += BranchBits[Att]; } AttTestBits = 0; ForEach(Att, 0, MaxAtt) { if ( (p = BranchBits[Att] / SumBranches) > 0 ) { AttTestBits -= p * log(p) / log(2.0); } } } /*************************************************************************/ /* */ /* Intercambio de los items en a y b. */ /* */ /*************************************************************************/ void TDMC45::SwapUnweighted(ItemNo a,ItemNo b) { Description Hold; Hold = Item[a]; Item[a] = Item[b]; Item[b] = Hold; } /*************************************************************************/ /* */ /* Creacin de un conjunto compuesto de reglas de todas las pruebas */ /* */ /*************************************************************************/ void TDMC45::CompositeRuleset() { RuleNo r; short t, ri; InitialiseRules(); /* Procesamos juntas todas las reglas de cada subconjunto */
ForEach(t, 0, TRIALS-1) { ForEach(ri, 1, PRSet[t].SNRules) { r = PRSet[t].SRuleIndex[ri]; NewRule(PRSet[t].SRule[r].Lhs, PRSet[t].SRule[r].Size, PRSet[t].SRule[r].Rhs, PRSet[t].SRule[r].Error); } } /* Seleccionamos un subconjunto */
FReglas<<"Conjunto compuesto de reglas:"; FReglas<<endl; PrintIndexedRules(); PRSet[TRIALS].SNRules = NRules; PRSet[TRIALS].SRule = Rule; PRSet[TRIALS].SRuleIndex = RuleIndex; PRSet[TRIALS].SDefaultClass = DefaultClass; } /*************************************************************************/ /* */ /* Creacin de un conjunto de reglas del rbol de decisin t */ /* */ /*************************************************************************/ void TDMC45::FormRules(Tree t) { short i; /* Buscamos los parmetros esenciales y reservamos lugar */
MaxDepth = 0; MaxDisjuncts = 0; TreeParameters(t, 0); Actual = (float *) calloc(MaxDepth+2, sizeof(float)); Total = (ItemNo *) calloc(MaxDepth+2, sizeof(ItemNo)); Errors = (ItemNo *) calloc(MaxDepth+2, sizeof(ItemNo)); Pessimistic = (float *) calloc(MaxDepth+2, sizeof(float)); CondSigLevel = (float *) calloc(MaxDepth+2, sizeof(float)); TargetClassFreq = (ItemNo *) calloc(2, sizeof(ItemNo)); Deleted = (Boolean *) calloc(MaxDepth+2, sizeof(Boolean)); CondSatisfiedBy = (bool **) calloc(MaxDepth+2, sizeof(char *)); Stack = (Condition *) calloc(MaxDepth+2, sizeof(Condition)); ForEach(i, 0, MaxDepth+1) { CondSatisfiedBy[i] = (bool *) calloc(MaxItem+1, sizeof(char)); Stack[i] = (Condition) malloc(sizeof(struct CondRec)); } SingleValue = (DiscrValue *) calloc(MaxAtt+1, sizeof(DiscrValue)); InitialiseRules(); /* Extraemos y podamos las reglas disjuntas */
ForEach(i, 0, MaxDepth+1) { free(CondSatisfiedBy[i]); free(Stack[i]); } free(Deleted); free(CondSatisfiedBy); free(Stack); free(Actual); free(Total); free(Errors); free(Pessimistic); free(CondSigLevel); free(TargetClassFreq); } /*************************************************************************/ /* */ /* Calcula la profundidad mx y el nro de hojas en el arbol t con */ Cdigo Fuente Magdalena Servente 303
/* profundidad inicial d */ /* */ /*************************************************************************/ void TDMC45::TreeParameters(Tree t,short d) { DiscrValue v; if ( t->NodeType ) { ForEach(v, 1, t->Forks) { TreeParameters(t->Branch[v], d+1); } } else { /* Es una hoja */ if ( d > MaxDepth ) MaxDepth = d; MaxDisjuncts++; } } /*************************************************************************/ /* */ /* Extrae los disjuntos del arbol t en la profundidad d y los procesa */ /* */ /*************************************************************************/ void TDMC45::Scan(Tree t,short d) { DiscrValue v; short i; Condition *Term; Test x, FindTest(); if ( t->NodeType ) { d++; x = (Test) malloc(sizeof(struct TestRec)); x->NodeType = t->NodeType; x->Tested = t->Tested; x->Forks = t->Forks; x->Cut = ( t->NodeType == ThreshContin ? t->Cut : 0 ); if ( t->NodeType == BrSubset ) { x->Subset = (Conjunto *) calloc(t->Forks + 1, sizeof(Conjunto)); ForEach(v, 1, t->Forks) { x->Subset[v] = t->Subset[v]; } } Stack[d]->CondTest = FindTest(); ForEach(v, 1, t->Forks) { Stack[d]->TestValue = v; Scan(t->Branch[v], d); } } else if ( t->Items >= 1 ) { /* Hoja del rbol de decisin - construimos el conjunto de condiciones asociadas con esta hoja y las podamos */ Term = (Condition *) calloc(d+1, sizeof(Condition)); ForEach(i, 1, d) { Term[i] = (Condition) malloc(sizeof(struct CondRec)); Term[i]->CondTest = Stack[i]->CondTest; Term[i]->TestValue = Stack[i]->TestValue; } PruneRule(Term, d, t->Leaf); free(Term); 304 Magdalena Servente Cdigo Fuente
} } /*************************************************************************/ /* */ /* Construccin de un subconjunto ordenado (indexado por el RuleIndex) */ /* a partir del actual conjunto de reglas */ /* */ /*************************************************************************/ void TDMC45::ConstructRuleset() { RuleNo r, OldNRules = NRules; /* Reservamos lugar para las tablas */
Right = (ItemNo *) calloc(NRules+1, sizeof(ItemNo)); Wrong = (ItemNo *) calloc(NRules+1, sizeof(ItemNo)); Value = (float *) calloc(NRules+1, sizeof(float)); RuleIn = (bool *) calloc(NRules+1, sizeof(Boolean)); Subset = (char ***) malloc((NRules+1) * sizeof(Boolean)); ClassRules = (RuleNo *) malloc((NRules+1) * sizeof(RuleNo)); ClassFreq = (float *) calloc(MaxClass+1, sizeof(ItemNo)); Covered = (ItemNo *) calloc(MaxItem+1, sizeof(ItemNo)); Match = (bool **) calloc(NRules+1, sizeof(Boolean *)); FalsePos = (ItemNo *) calloc(MaxClass+1, sizeof(ItemNo)); NoRule = (ItemNo *) calloc(MaxClass+1, sizeof(ItemNo)); ForEach(r, 1, NRules) { Match[r] = (Boolean *) calloc(MaxItem+1, sizeof(Boolean)); } /* Cubrimos cada una de las clases, y luego las ordenamos en un ndice de reglas */
InitialiseTables(); FindRuleCodes(); CodeWeight = 0.5; ForEach(FocusClass, 0, MaxClass) { CoverClass(); } MakeIndex(); FindDefault(); /* Liberamos espacio en memoria */
free(Value); free(RuleIn); free(ClassRules); free(Subset); free(Covered); free(FalsePos); free(NoRule); ForEach(r, 1, OldNRules) { free(Match[r]); } free(Match); } /*************************************************************************/ /* */ /* Inicializacin de tablas */ /* */ /*************************************************************************/ Cdigo Fuente Magdalena Servente 305
void TDMC45::InitialiseTables() { ItemNo i; RuleNo r; ClassNo c; float Strength(); ForEach(r, 1, NRules) { RuleIn[r] = false; Rule[r].Used = Rule[r].Incorrect = 0; } ForEach(c, 0, MaxClass) { ClassFreq[c] = 0; } ForEach(i, 0, MaxItem) { ClassFreq[Class(Item[i])]++; ForEach(r, 1, NRules) { Match[r][i] = Fuerza(Rule[r], Item[i]) > 0.1; if ( Match[r][i] ) { Rule[r].Used++; if ( Class(Item[i]) != Rule[r].Rhs ) Rule[r].Incorrect++; } } } } /*************************************************************************/ /* */ /* Seleccionamos un subconjunto de las reglas para la FocusClass */ /* */ /*************************************************************************/ void TDMC45::CoverClass() { RuleNo r, RuleCount=0; ItemNo i; Verbosity(1) { FReglas<<endl; FReglas<<"Clase "; FReglas<<ClassName->Strings[FocusClass].c_str(); FReglas<<endl; FReglas<<"-----"; FReglas<<"Accin Cambio Valor"; } ForEach(i, 0, MaxItem) { Covered[i] = 0; } ForEach(r, 1, NRules) { if ( Rule[r].Rhs == FocusClass ) { RuleCount++; ClassRules[RuleCount] = r; } } if ( ! RuleCount ) { return; } SubsetValue = 1E10; if ( RuleCount <= 10 ) 306 Magdalena Servente Cdigo Fuente
{ AllCombinations(RuleCount); } else if ( SIMANNEAL ) { SimAnneal(RuleCount); } else { SpotSearch(RuleCount); } memcpy(RuleIn, Subset, NRules+1); Verbosity(1) { FReglas<<endl; FReglas<<" Mejor valor "; FReglas<<SubsetValue; FReglas<<endl; } } /*************************************************************************/ /* */ /* Probamos todas las combinaciones de reglas para encontrar la mejor */ /* */ /*************************************************************************/ void TDMC45::AllCombinations(RuleNo NR) { RuleNo r; if ( ! NR ) { CalculateValue(); } else { r = ClassRules[NR]; AllCombinations(NR-1); AddRule(r); AllCombinations(NR-1); DeleteRule(r); Verbosity(1) FReglas<<endl; } } /*************************************************************************/ /* */ /* Bsqueda de un buen subconjunto mediante simulated annealing */ /* */ /*************************************************************************/ void TDMC45::SimAnneal(RuleNo RuleCount) { RuleNo r, OutCount; short ri, Tries; float Temp, Delta; Boolean Changed; /* Eliminamos y agregamos reglas hasta q no se pueda mejorar ms */
for ( Temp = 1000 ; Temp > 0.001 ; Temp *= 0.95 ) { CalculateValue(); Verbosity(2) { OutCount = 0; ForEach(ri, 1, RuleCount) { r = ClassRules[ri]; if ( ! RuleIn[r] ) Cdigo Fuente Magdalena Servente 307
{ if ( ! (OutCount++ % 3) ) printf("\n\t\t"); FReglas<< r; FReglas<<" "; FReglas<<Right[r]; FReglas<<" "; FReglas<<Wrong[r]; FReglas<<" "; FReglas<<Value[r]; } } FReglas<<endl; FReglas<<endl; } Changed = false; for ( Tries = 100 ; ! Changed && Tries > 0 ; Tries-- ) { /* Elegimos una relga para agregar o eliminar */ ri = RuleCount * Random + 1; r = ClassRules[ri]; Delta = ( RuleIn[r] ? -Value[r] : Value[r] ); if ( Delta > 0 || Random < exp(Delta / Temp) ) { if ( RuleIn[r] ) { DeleteRule(r); } else { AddRule(r); } Changed = true; } } if ( ! Changed ) break; } /* Tratamos de mejorar el mejor subconjunto mediante hill-climbing */
/*************************************************************************/ /* */ /* Busca un buen subconjunto mediante una bsqueda golosa reiterativa */ /* */ /*************************************************************************/ void TDMC45::SpotSearch(RuleNo RuleCount) { RuleNo r; short ri, Trial; float ProbIn; ForEach(Trial, 0, 10) { Verbosity(1) { FReglas<<endl; FReglas<<" Prueba "; FReglas<<Trial; } /* Agregamos reglas al azar al subconj inicial */ ProbIn = Trial / 10.0; ForEach(ri, 1, RuleCount) 308 Magdalena Servente Cdigo Fuente
{ r = ClassRules[ri]; RuleIn[r] = Random < ProbIn; } HillClimb(RuleCount); } } /*************************************************************************/ /* */ /* Mejora un subconjunto de reglas agregando o eliminando reglas */ /* */ /*************************************************************************/ void TDMC45::HillClimb(RuleNo RuleCount) { RuleNo r, Bestr; short ri, OutCount; ItemNo i; float Delta, BestDelta; ItemNo aux; ForEach(i, 0, MaxItem) { Covered[i] = 0; } ForEach(ri, 1, RuleCount) { r = ClassRules[ri]; if ( RuleIn[r] ) { ForEach(i, 0, MaxItem) { if ( Match[r][i] ) { Covered[i]++; } } } } /* Agregamos o eliminamos la regla con la mayor reduccin en el costo de codificacin */
while ( true ) { CalculateValue(); Verbosity(2) { OutCount = 0; ForEach(ri, 1, RuleCount) { r = ClassRules[ri]; if ( ! RuleIn[r] ) { if ( ! (OutCount++ % 3) ) printf("\n\t\t"); FReglas<<r; FReglas<<"<"; aux=Right[r]|Wrong[r]; FReglas<<aux; FReglas<<"="; FReglas<<Value[r]; } } FReglas<<endl; FReglas<<endl; } Bestr = BestDelta = 0; ForEach(ri, 1, RuleCount) { r = ClassRules[ri]; Delta = ( RuleIn[r] ? -Value[r] : Value[r] ); Cdigo Fuente Magdalena Servente 309
if ( Delta > BestDelta ) { Bestr = r; BestDelta = Delta; } } if ( ! Bestr ) break; if ( RuleIn[Bestr] ) { DeleteRule(Bestr); } else { AddRule(Bestr); } } }
/*************************************************************************/ /* */ /* Calculamos los aciertos y errores para las reglas de la FocusClass */ /* y determinamos el valor de dichas reglas. Si es el mejor hasta */ /* ahora, lo guardamos. */ /* */ /*************************************************************************/ void TDMC45::CalculateValue() /* -------------- */ { RuleNo r, Selected=0, InCount; ItemNo i, Times, FPos=0, FNeg=0, SumCover=0,aux; float BaseBits, RuleBits=0, NewBits; ClassNo ThisClass; Boolean *RuleMatch; ForEach(i, 0, MaxItem) { ThisClass = Class(Item[i]); if ( Covered[i] ) { SumCover++; if( ThisClass != FocusClass ) FPos++; } else if ( ThisClass == FocusClass ) { FNeg++; } } ForEach(r, 1, NRules) { if ( Rule[r].Rhs == FocusClass ) { Right[r] = Wrong[r] = 0; if ( RuleIn[r] ) { RuleBits += Rule[r].Bits; Selected++; } RuleMatch = Match[r]; ForEach(i, 0, MaxItem) { if ( RuleMatch[i] && ( ! (Times = Covered[i]) || Times == 1 && RuleIn[r] ) ) { if ( Class(Item[i]) == FocusClass ) { Right[r]++; } else 310 Magdalena Servente Cdigo Fuente
{ Wrong[r]++; } } } } } RuleBits -= LogFact[Selected]; BaseBits = CodeWeight * RuleBits + ExceptionBits(SumCover, FPos, FNeg); /* A partir de los aciertos y errores de cada regla, calculamos su valor */
";
ForEach(r, 1, NRules) { if ( Rule[r].Rhs == FocusClass ) { if ( RuleIn[r] ) { NewBits = ExceptionBits(SumCover-Right[r]-Wrong[r], FPos-Wrong[r], FNeg+Right[r]) + CodeWeight * (RuleBits - Rule[r].Bits + LogItemNo[Selected]); Value[r] = NewBits - BaseBits; } else { NewBits = ExceptionBits(SumCover+Right[r]+Wrong[r], FPos+Wrong[r], FNeg-Right[r]) + CodeWeight * (RuleBits + Rule[r].Bits - LogItemNo[Selected+1]); Value[r] = BaseBits - NewBits; } Verbosity(1) { if ( RuleIn[r] ) { if ( ++InCount && ! (InCount % 3) ) printf("\n\t\t"); FReglas<<r; FReglas<<"["; aux=Right[r]|Wrong[r]; FReglas<<aux; FReglas<<"="; FReglas<<Value[r]; } } } } Verbosity(1) { FReglas<<endl; FReglas<<" "; FReglas<<Selected; FReglas<<" reglas, "; FReglas<<SumCover; FReglas<<" cant de veces en que la regla se us: "; FReglas<<"F+="; FReglas<<FPos; FReglas<<" F-="; FReglas<<FNeg; FReglas<<", "; FReglas<<BaseBits; FReglas<<"bits (reglas="; FReglas<<RuleBits; FReglas<<endl; } if ( BaseBits < SubsetValue ) Cdigo Fuente Magdalena Servente 311
{ SubsetValue = BaseBits; memcpy(Subset, RuleIn, NRules+1); } } /*************************************************************************/ /* */ /* Agregamos la regla r al conj de relgas incluidas e incrementamos la */ /* cantidad de reglas q cubren los items q disparan la regla */ /* */ /*************************************************************************/ void TDMC45::AddRule(RuleNo r) { ItemNo i; RuleIn[r] = true; ForEach(i, 0, MaxItem) { if ( Match[r][i] ) { Covered[i]++; } } Verbosity(1) { FReglas<<r; FReglas<<"+ "; FReglas<<Value[r]; } }
/*************************************************************************/ /* */ /* Eliminamos la regla r del conj de reglas includas y decrementamos */ /* la cant de reglas que cubren cada uno de los items cubiertos por */ /* la regla */ /* */ /*************************************************************************/ void TDMC45::DeleteRule(RuleNo r) { ItemNo i; RuleIn[r] = false; ForEach(i, 0, MaxItem) { if ( Match[r][i] ) { Covered[i]--; } } Verbosity(1) { FReglas<<r; FReglas<<""; FReglas<<-Value[r]; } }
/*************************************************************************/ /* */ /* Crea un ndice de reglas includas en RuleIndex. Selecciona primero */ /* aquellas clases cuyas reglas tienen el menor nro de falsos positivos */ /* Dentro de cada clase, pone las relgas con ms aciertos primero */ /* */ /*************************************************************************/ void TDMC45::MakeIndex() { ClassNo c, BestC, Pass; 312 Magdalena Servente Cdigo Fuente
RuleNo r, BestR, NewNRules = 0; ItemNo i; Boolean *Included; Included = (Boolean *) calloc(MaxClass+1, sizeof(Boolean)); RuleIndex = (RuleNo *) calloc(NRules+1, sizeof(RuleNo)); Verbosity(1) printf("\nFalsosPos ForEach(i, 0, MaxItem) { Covered[i] = 0; } /* Seleccionamos la mejor clase para poner a continuacin */ Clase\n");
ForEach(Pass, 0, MaxClass) { ForEach(c, 0, MaxClass) { if ( Included[c] ) continue; FalsePos[c] = 0; ForEach(i, 0, MaxItem) { if ( Covered[i] || Class(Item[i]) == c ) continue; ForEach(r, 1, NRules) { if ( Rule[r].Rhs == c && RuleIn[r] && Match[r][i] ) { FalsePos[c]++; break; } } } } BestC = -1; ForEach(c, 0, MaxClass) { if ( ! Included[c] && ( BestC < 0 || FalsePos[c] < FalsePos[BestC] ) ) { BestC = c; } } Included[BestC] = true; Verbosity(1) { FReglas<<FalsePos[BestC]; FReglas<<" "; FReglas<<ClassName->Strings[BestC].c_str(); FReglas<<endl; } /* do { BestR = 0; /* Buscamos la mejor regla */ Ahora analizamos las reglas para esta clase */
ForEach(r, 1, NRules) { if ( RuleIn[r] && Rule[r].Rhs == BestC && ( ! BestR || Rule[r].Error < Rule[BestR].Error ) ) { BestR = r; } } if ( BestR ) { Cdigo Fuente Magdalena Servente 313
RuleIndex[++NewNRules] = BestR; RuleIn[BestR] = false; ForEach(i, 0, MaxItem) { Covered[i] |= Match[BestR][i]; } } } while ( BestR ); } NRules = NewNRules; free(Included); } /*************************************************************************/ /* */ /* Determina la clase por defecto. Los empates se resuelven a favor */ /* de la clase ms frecuente */ /* */ /*************************************************************************/ void TDMC45::FindDefault() { ClassNo c; ItemNo i; /* Determinamos los items no cubiertos por ninguna regla */
ForEach(c, 0, MaxClass) { NoRule[c] = 0; } ForEach(i, 0, MaxItem) { if ( ! Covered[i] ) { NoRule[Class(Item[i])]++; } } Verbosity(1) { FReglas<<endl; FReglas<<"Items: No cubiertos Clase"; FReglas<<endl; ForEach(c, 0, MaxClass) { FReglas<<ClassFreq[c]; FReglas<<" "; FReglas<<NoRule[c]; FReglas<<" "; FReglas<< ClassName->Strings[c].c_str(); FReglas<<endl; } FReglas<<endl; } DefaultClass = 0; ForEach(c, 1, MaxClass) { if ( NoRule[c] > NoRule[DefaultClass] || NoRule[c] == NoRule[DefaultClass] && ClassFreq[c] > ClassFreq[DefaultClass] ) { DefaultClass = c; } } } /*************************************************************************/ /* */ /* Dados una regla y un caso, determina la fuerza con la que podemos */ /* determinar que el caso pertenece a la clase especificada en la regla */ /* Si el caso no satisface todas las condiciones de la regla, entonces */ /* la fuerza vale 0. */ /* */ 314 Magdalena Servente Cdigo Fuente
/*************************************************************************/ float TDMC45::Fuerza(PR ThisRule,Description Case) { short d; if ( ThisRule.Error > 0.7 ) return 0.0; ForEach(d, 1, ThisRule.Size) { if ( ! Satisfies(Case, ThisRule.Lhs[d]) ) { return 0.0; } } return ( 1 - ThisRule.Error ); } /*************************************************************************/ /* */ /* Determina el nro de bits necesarios para codificar las excepciones */ /* */ /*************************************************************************/ float TDMC45::Biased(int N, int E, float ExpE) { float Rate; if ( ExpE { return } else if ( ExpE { return } <= 1E-6 ) ( E == 0 ? 0.0 : 1E6 );
Rate = ExpE / N; return -E * Log(Rate) - (N-E) * Log(1-Rate); } float TDMC45::ExceptionBits(int Fires, int FP, int FN) { if ( Fires > 0.5 * (MaxItem+1) ) { return Log(MaxItem+1) + Biased(Fires, FP, 0.5 * (FP+FN)) + Biased(MaxItem+1-Fires, FN, (float) FN); } else { return Log(MaxItem+1) + Biased(Fires, FP, (float) FP) + Biased(MaxItem+1-Fires, FN, 0.5 * (FP+FN)); } } /*************************************************************************/ /* */ /* Determina la longitud de codificacin para todas las reglas */ /* */ /*************************************************************************/ void TDMC45::FindRuleCodes() { RuleNo r; short d, NCond; float Bits; ForEach(r, 1, NRules) { NCond = Rule[r].Size; Bits = 0; ForEach(d, 1, NCond) { Bits += CondBits(Rule[r].Lhs[d]); } Cdigo Fuente Magdalena Servente 315
/*
Debemos codificar el nro de condiciones, pero mejorar la codificacin total mediante la forma en que las condiciones pueden reordenarse */
Rule[r].Bits = Bits + LogItemNo[NCond] - LogFact[NCond]; } } /*************************************************************************/ /* */ /* Determina el nro de bits requerido para codificar una condicin */ /* */ /*************************************************************************/ float TDMC45::CondBits(Condition C) { Test t; Attribute a; t = C->CondTest; a = t->Tested; switch ( t->NodeType ) { case BrDiscr: case ThreshContin:
/*************************************************************************/ /* */ /* Guarda el conjunto de reglas en el archivo de reglas segn el orden */ /* del ndice */ /* */ /*************************************************************************/ void TDMC45::SaveRules() { short ri, d, v, Bytes; RuleNo r; Test Tst; strcpy(Fn, FileName.c_str()); strcat(Fn, ".rules"); if ( ! ( TRf = fopen(Fn, "w") ) ) {FReglas<<"Error al abrir el archivo de reglas";} if ( TRf ) fclose(TRf); strcpy(Fn, FileName.c_str()); strcat(Fn, ".rules"); if ( ! ( TRf = fopen(Fn, "w") ) ) {FReglas<<"Error al abrir el archivo de reglas";} StreamOut((char *) &NRules, sizeof(RuleNo)); StreamOut((char *) &DefaultClass, sizeof(ClassNo)); ForEach(ri, 1, NRules) { r = RuleIndex[ri]; StreamOut((char *) &Rule[r].Size, sizeof(short)); ForEach(d, 1, Rule[r].Size) { Tst = Rule[r].Lhs[d]->CondTest; StreamOut((char *) &Tst->NodeType, sizeof(short)); StreamOut((char *) &Tst->Tested, sizeof(Attribute)); StreamOut((char *) &Tst->Forks, sizeof(short)); StreamOut((char *) &Tst->Cut, sizeof(float)); if ( Tst->NodeType == BrSubset ) { Bytes = (MaxAttVal[Tst->Tested]>>3) + 1; ForEach(v, 1, Tst->Forks) 316 Magdalena Servente Cdigo Fuente
{ StreamOut((char *) Tst->Subset[v], Bytes); } } StreamOut((char *) &Rule[r].Lhs[d]->TestValue, sizeof(short)); } StreamOut((char *) &Rule[r].Rhs, sizeof(ClassNo)); StreamOut((char *) &Rule[r].Error, sizeof(float)); } SaveDiscreteNames(); } /*************************************************************************/ /* */ /* Obtiene un nuevo conj de reglas del archivo de reglas */ /* */ /*************************************************************************/ void TDMC45::GetRules() { RuleNo nr, r; short n, d, v, Bytes; Condition *Cond; Test Tst; ClassNo c; float e; if ( TRf ) fclose(TRf); strcpy(Fn, FileName.c_str()); strcat(Fn, ".rules"); if ( ! ( TRf = fopen(Fn, "r") ) ) {FReglas<<"Error al abrir el archivo de reglas";} StreamIn((char *) &nr, sizeof(RuleNo)); StreamIn((char *) &DefaultClass, sizeof(ClassNo)); ForEach(r, 1, nr) { StreamIn((char *) &n, sizeof(short)); Cond = (Condition *) calloc(n+1, sizeof(Condition)); ForEach(d, 1, n) { Tst = (Test) malloc(sizeof(struct TestRec)); StreamIn((char *) &Tst->NodeType, sizeof(short)); StreamIn((char *) &Tst->Tested, sizeof(Attribute)); StreamIn((char *) &Tst->Forks, sizeof(short)); StreamIn((char *) &Tst->Cut, sizeof(float)); if ( Tst->NodeType == BrSubset ) { Tst->Subset = (Conjunto *) calloc(Tst->Forks + 1, sizeof(Conjunto)); Bytes = (MaxAttVal[Tst->Tested]>>3) + 1; ForEach(v, 1, Tst->Forks) { Tst->Subset[v] = (Conjunto) malloc(Bytes); StreamIn((char *) Tst->Subset[v], Bytes); } } Cond[d] = (Condition) malloc(sizeof(struct CondRec)); Cond[d]->CondTest = FindTest(Tst); StreamIn((char *) &Cond[d]->TestValue, sizeof(short)); } StreamIn((char *) &c, sizeof(ClassNo)); StreamIn((char *) &e, sizeof(float)); NewRule(Cond, n, c, e); free(Cond); } RecoverDiscreteNames(); } /*************************************************************************/ /* */ /* Busca una prueba en el vector de pruebas, si no est all, la agrega */ Cdigo Fuente Magdalena Servente 317
/* */ /*************************************************************************/ Test TDMC45::FindTest(Test Newtest) { static short TestSpace=0; short i; ForEach(i, 1, NTests) { if ( SameTest(Newtest, TestVec[i]) ) { free(Newtest); return TestVec[i]; } } NTests++; if ( NTests >= TestSpace ) { TestSpace += 1000; if ( TestSpace > 1000 ) { TestVec = (Test *) realloc(TestVec, TestSpace * sizeof(Test)); } else { TestVec = (Test *) malloc(TestSpace * sizeof(Test)); } } TestVec[NTests] = Newtest; return TestVec[NTests]; } /*************************************************************************/ /* */ /* Verifica si la prueba t1 es igual a la prueba t2 */ /* */ /*************************************************************************/ bool TDMC45::SameTest(Test t1,Test t2) { short i; if ( t1->NodeType != t2->NodeType || t1->Tested != t2->Tested ) { return false; } switch ( t1->NodeType ) { case BrDiscr: return true; case ThreshContin: return t1->Cut == t2->Cut; case BrSubset: ForEach(i, 1, t1->Forks) { if ( t1->Subset[i] != t2->Subset[i] ) { return false; } } } return true; } /*************************************************************************/ /* */ /* Limpia las variables para un nuevo conj de reglas */ /* */ /*************************************************************************/ void TDMC45::InitialiseRules() /* ---------------- */ { NRules = 0; Rule = 0; RuleSpace = 0; } 318 Magdalena Servente Cdigo Fuente
/*************************************************************************/ /* */ /* Agrega una nueva regla, al conjunto de reglas actual. Actualiza */ /* Rule[],NRules y,en caso de ser necesario,RuleSpace */ /* */ /*************************************************************************/ bool TDMC45::NewRule(Condition Cond[],short NConds,ClassNo TargetClass,float Err) { short d, r; /* Verificamos si la regla ya existe */
ForEach(r, 1, NRules) { if ( SameRule(r, Cond, NConds, TargetClass) ) { Verbosity(1) printf("\tduplica la regla %d\n", r); /* Mantenemos el estimador de error ms pesismista */
if ( Err > Rule[r].Error ) { Rule[r].Error = Err; } return false; } } /* Verificamos que haya suficiente espacio para una nueva regla */
NRules++; if ( NRules >= RuleSpace ) { RuleSpace += 100; if ( RuleSpace > 100 ) { Rule = (PR *) realloc(Rule, RuleSpace * sizeof(PR)); } else { Rule = (PR *) malloc(RuleSpace * sizeof(PR)); } } /* Formamos la nueva regla */
Rule[NRules].Size = NConds; Rule[NRules].Lhs = (Condition *) calloc(NConds+1, sizeof(Condition)); ForEach(d, 1, NConds) { Rule[NRules].Lhs[d] = (Condition) malloc(sizeof(struct CondRec)); Rule[NRules].Lhs[d]->CondTest = Cond[d]->CondTest; Rule[NRules].Lhs[d]->TestValue = Cond[d]->TestValue; } Rule[NRules].Rhs = TargetClass; Rule[NRules].Error = Err; Verbosity(1) PrintRule(NRules); return true; }
/*************************************************************************/ /* */ /* Decide si la regla actual duplica la regla r */ /* */ /*************************************************************************/ bool TDMC45::SameRule(RuleNo r,Condition Cond[],short NConds,ClassNo TargetClass) { short d, i; Test SubTest1, SubTest2;
Cdigo Fuente
Magdalena Servente
319
if ( Rule[r].Size != NConds || Rule[r].Rhs != TargetClass ) { return false; } ForEach(d, 1, NConds) { if ( Rule[r].Lhs[d]->CondTest->NodeType != Cond[d]->CondTest->NodeType || Rule[r].Lhs[d]->CondTest->Tested != Cond[d]->CondTest->Tested ) { return false; } switch ( Cond[d]->CondTest->NodeType ) { case BrDiscr: if ( Rule[r].Lhs[d]->TestValue != Cond[d]->TestValue ) { return false; } break; case ThreshContin: if ( Rule[r].Lhs[d]->CondTest->Cut != Cond[d]->CondTest->Cut ) { return false; } break; case BrSubset: SubTest1 = Rule[r].Lhs[d]->CondTest; SubTest2 = Cond[d]->CondTest; ForEach(i, 1, SubTest1->Forks) { if ( SubTest1->Subset[i] != SubTest2->Subset[i] ) { return false; } } } } return true; } /*************************************************************************/ /* */ /* Imprime el conjunto indexado de reglas actual */ /* */ /*************************************************************************/ void TDMC45::PrintIndexedRules() { short ri; ForEach(ri, 1, NRules ) { PrintRule(RuleIndex[ri]); } printf("\nClase por defecto: %s\n", ClassName[DefaultClass]); } /*************************************************************************/ /* */ /* Imprime la regla r */ /* */ /*************************************************************************/ void TDMC45::PrintRule(RuleNo r) { short d; printf("\nRegla %d:\n", r); ForEach(d, 1, Rule[r].Size) { printf(" "); PrintCondition(Rule[r].Lhs[d]); } printf("\t-> clase %s [%.1f%%]\n", 320 Magdalena Servente Cdigo Fuente
ClassName[Rule[r].Rhs], 100 * (1 - Rule[r].Error)); } /*************************************************************************/ /* */ /* Imprime la condicin c de una regla de produccin */ /* */ /*************************************************************************/ void TDMC45::PrintCondition(Condition c) { Test tp; DiscrValue v, pv, Last, Values=0; Boolean First=true; Attribute Att; tp = c->CondTest; v = c->TestValue; Att = tp->Tested; printf("\t%s", AttName[Att]); if ( v < 0 ) { printf(" es desconocido\n"); return; } switch ( tp->NodeType ) { case BrDiscr: printf(" = %s\n", AttValName[Att][v]); break; case ThreshContin: printf(" %s %g\n", ( v == 1 ? "<=" : ">" ), tp->Cut); break; case BrSubset: /* Contamos los valores en la rama
*/
for ( pv=1 ; Values <= 1 && pv <= MaxAttVal[Att] ; pv++ ) { if ( In(pv, tp->Subset[v]) ) { Last = pv; Values++; } } if ( Values == 1 ) { printf(" = %s\n", AttValName[Att][Last]); break; } printf(" en "); ForEach(pv, 1, MaxAttVal[Att]) { if ( In(pv, tp->Subset[v]) ) { if ( First ) { printf("{"); First = false; } else { printf(", "); } printf("%s", AttValName[Att][pv]); } } printf("}\n"); } } /*************************************************************************/ Cdigo Fuente Magdalena Servente 321
/* */ /* Poda la regla dadas las condiciones Cond, y el nro de condiciones */ /* NCond, y agrega la regla resultante al actual conjunto de reglas */ /* si es lo suficientemente precisa */ /* */ /*************************************************************************/ void TDMC45::PruneRule(Condition Cond[],short NCond,ClassNo TargetClass) { short d, dd, id, Bestd, Bestid, Remaining=NCond; float DefaultError, Extra; Boolean Alter; Condition Hold; ItemNo i; ForEach(d, 0, NCond) { Deleted[d] = false; } /* Evaluamos la matriz de satisfaccin */
TargetClassFreq[0] = TargetClassFreq[1] = 0; ForEach(i, 0, MaxItem) { ForEach(d, 1, NCond) { CondSatisfiedBy[d][i] = Satisfies(Item[i], Cond[d]); } TargetClassFreq[IsTarget(Item[i])]++; } DefaultError = 1.0 - (TargetClassFreq[true] + 1.0) / (MaxItem + 3.0); /* Buscamos las condiciones a eliminar */
Verbosity(1) { FReglas<<endl; FReglas<<"Poda de la regla para "; FReglas<<ClassName->Strings[TargetClass].c_str(); } do { Alter = false; FindTables(NCond, TargetClass); /* Buscamos la condicin, eliminando aquellas que produciran la mayor mejora en la precisin de la regla. Notas: se utiliza el promedio pesimstico de error, y no el promedio actual de error. Cuando d es 0, estamos trabajando con todas las condiciones */
Err Utilizado
Pesim\tCondicin ausente\n");
ForEach(d, 0, NCond) { if ( Deleted[d] ) continue; if ( Total[d] ) { Actual[d] = Errors[d] / (float) Total[d]; Extra = AddErrs((float) Total[d], (float) Errors[d]); Pessimistic[d] = (Errors[d] + Extra) / Total[d]; } else { Actual[d] = 0; Pessimistic[d] = DefaultError; } Verbosity(1) { 322 Magdalena Servente Cdigo Fuente
FReglas<<" "; FReglas<<Errors[d]; FReglas<<" "; FReglas<<Total[d]; FReglas<<100 * Pessimistic[d]; } if ( ! d ) { Verbosity(1) { FReglas<<" FReglas<<endl; } } else { id++; /*
<regla base>";
Si se est usando la opcin, llamamos al test de Fisher para estimar la probabilidad de que la divisin sobre d sea por casualidad */
if ( SIGTEST ) { CondSigLevel[d] = TableProb(Errors[0], Errors[d]-Errors[0], Total[0]-Errors[0], Total[d]-Total[0]-Errors[d]+Errors[0]); Verbosity(1) { FReglas<<" Sig="; FReglas<<CondSigLevel[d]; } } Verbosity(1) PrintCondition(Cond[d]); /* Bestd identifica la condicin con el menor error estimado */
if ( ! Bestd || Pessimistic[d] <= Pessimistic[Bestd] ) { Bestd = d; Bestid = id; } /* Alter ser true si vamos a eliminar una condicin (tanto porque el estimador pesimstico es menor, como porque una de las condiciones no pasa la prueba de sign)
*/
if ( Pessimistic[d] <= Pessimistic[0] || Actual[d] <= Actual[0] || SIGTEST && CondSigLevel[d] > SIGTHRESH ) { Alter = true; } } } if ( Alter ) { Verbosity(1) { FReglas<<" Eliminamos la prueba "; FReglas<<Bestid; FReglas<<endl; } Deleted[Bestd] = true; Remaining--; } } while ( Alter && Remaining ); if ( ! Remaining || ! Total[0] ) { Cdigo Fuente Magdalena Servente 323
return; } if ( Pessimistic[0] >= DefaultError ) { Verbosity(1) { FReglas<<" Muy impreciso"; FReglas<<endl; } return; } /* Ordenamos las condiciones */
ForEach(d, 1, Remaining) { dd = 0; ForEach(id, d, NCond) { if ( ! Deleted[id] && ( ! dd || Before(Cond[id]->CondTest, Cond[dd]->CondTest) ) ) { dd = id; } } if ( dd != d ) { Hold = Cond[d]; Cond[d] = Cond[dd]; Cond[dd] = Hold; Deleted[dd] = Deleted[d]; } Deleted[d] = true; } NewRule(Cond, Remaining, TargetClass, Pessimistic[0]); }
/*************************************************************************/ /* */ /* Verifica si la condicin R es redundante */ /* */ /*************************************************************************/ bool TDMC45::Redundant(short R,Condition Cond[],short NCond) { short d, v, vv; Test t, Rt; Rt = Cond[R]->CondTest; v = Cond[R]->TestValue; ForEach(d, 1, NCond) { if ( Deleted[d] || d == R ) continue; t = Cond[d]->CondTest; vv = Cond[d]->TestValue; if ( t->Tested != Rt->Tested ) continue; switch ( t->NodeType ) { case BrDiscr: /* prueba sobre un atrib discreto */ return false; case ThreshContin: /* prueba sobre un atrib contnuo */
if ( vv == v && ( v == 1 ? t->Cut < Rt->Cut : t->Cut > Rt->Cut ) ) { return true; 324 Magdalena Servente Cdigo Fuente
if ( IsSubset(t->Subset[vv], Rt->Subset[v], Rt->Tested) ) { return true; } } } return false; } /*************************************************************************/ /* */ /* Decide si el subconj de valores S1 est contenido en S2 */ /* */ /*************************************************************************/ bool TDMC45::IsSubset(Conjunto S1,Conjunto S2,Attribute Att) { DiscrValue v; ForEach(v, 1, MaxAttVal[Att]) { if ( In(v, S1) && ! In(v, S2) ) return false; } return true; }
/*************************************************************************/ /* */ /* Busca las tablas de distribucin de frecuencias para la condiciones */ /* actuales: */ /* */ /* Total[0] = items q satisfacen todas las condiciones */ /* Total[d] = items q satisfacen todas las condiciones menos d */ /* */ /* Errors[0] = items de clase errnea q satisfacen todas las cond */ /* Errors[d] = items de clase errnea q satisfacen todas las cond */ /* menos d */ /* */ /*************************************************************************/ void TDMC45::FindTables(short NCond,ClassNo TargetClass) { ItemNo i; short Misses, Missed[2], d; Boolean CorrectClass; /* Limpiamos las distribuciones */
ForEach(i, 0, MaxItem) { Misses = 0; CorrectClass = IsTarget(Item[i]); for ( d = 1 ; d <= NCond && Misses <= 1 ; d++ ) { if ( ! Deleted[d] && ! CondSatisfiedBy[d][i] ) { Missed[Misses++] = d; } } if ( ! Misses ) Cdigo Fuente Magdalena Servente 325
{ UpdateCount(Total, Errors, 0, CorrectClass); } else if ( Misses == 1 ) { UpdateCount(Total, Errors, Missed[0], CorrectClass); } } /* Ajustamos las cuentas para reflejar todos los casos q satisfacen todas las condiciones */
ForEach(d, 1, NCond) { if ( ! Deleted[d] ) { Total[d] += Total[0]; Errors[d] += Errors[0]; } } } /*************************************************************************/ /* */ /* Incrementa los valores de Total[d] y Errors[d] */ /* */ /*************************************************************************/ void TDMC45::UpdateCount(ItemNo T[],ItemNo E[],short d,bool OK) { T[d]++; if ( ! OK ) E[d]++; } /*************************************************************************/ /* */ /* Determina si la descripcin de un caso satisface la cond dada */ /* */ /*************************************************************************/ bool TDMC45::Satisfies(Description CaseDesc,Condition OneCond) { DiscrValue v; float cv; Test t; short s; bool Outcome; t = OneCond->CondTest; /* Determina el resultado de la prueba sobre el item actual */
switch ( t->NodeType ) { case BrDiscr: /* prueba sobre un atrib discreto */ v = DVal(CaseDesc, t->Tested); Outcome = ( v == 0 ? -1 : v ); break; case ThreshContin: /* prueba sobre un atrib contnuo */
cv = CVal(CaseDesc, t->Tested); Outcome = ( cv == Unknown ? -1 : cv <= t->Cut ? 1 : 2 ); break; case BrSubset: /* prueba sobre un subconj de atrib discretos */
v = DVal(CaseDesc, t->Tested); Outcome = -1; ForEach(s, 1, t->Forks) { if ( In(v, t->Subset[s]) ) { Outcome = s; break; } } 326 Magdalena Servente Cdigo Fuente
} return ( Outcome == OneCond->TestValue ); } /*************************************************************************/ /* */ /* Distribucin hipergeometrica (usa los log de los factoriales */ /* tabulados) */ /* */ /*************************************************************************/ double TDMC45::Hypergeom(int a,int r,int A,int B) { return exp( LogFact[A] + LogFact[B] + LogFact[r] + LogFact[A+B-r] ( LogFact[a] + LogFact[r-a] + LogFact[A-a] + LogFact[B-(r-a)] + LogFact[A+B]) ); } /*************************************************************************/ /* */ /* TableProb examina la tabla t de contingencias de 2x2 y calcula la */ /* probabilidad de que una divisin al azar pueda producir una divisin */ /* al menos tan extrema como esta. Esto tambin se conoce como la */ /* "Prueba Exacta de Fisher" */ /* */ /*************************************************************************/ float TDMC45::TableProb(int t11,int t12,int t21,int t22) { double Sum=0.0; int A, B, r, a, k, a0; /* Primero, llevamos la tabla a la forma cannica */
if ( t11 + t12 > t21 + t22 ) { A = t11 + t12; B = t21 + t22; if ( t11 { a0 = r = } else { a0 = r = } * (t21 + t22) > t21 * (t11 + t12) ) t11; t11 + t21;
} else { A = t21 + t22; B = t11 + t12; if ( t21 * (t11 + t12) > t11 * (t21 + t22) ) { a0 = t21; r = t21 + t11; } else { a0 = t22; r = t22 + t12; } } /* Ahora calculamos la probabilidad */
k = Min(r, A); ForEach(a, a0, k) { Sum += Hypergeom(a, r, A, B); } return Sum; } /*************************************************************************/ Cdigo Fuente Magdalena Servente 327
/* */ /* Evala todos los conj de reglas */ /* */ /*************************************************************************/ void TDMC45::EvaluateRulesets(bool DeleteRules) { short t; ItemNo *Errors; float AvSize=0, AvErrs=0; Boolean Final; if ( TRIALS == 1 ) { /* Evaluamos el conj de reglas actual como si no existiera un conj compuesto de reglas */ Interpret(0, MaxItem, DeleteRules, true, true); return; } Errors = (ItemNo *) malloc((TRIALS+1) * sizeof(ItemNo)); ForEach(t, 0, TRIALS) { NRules = PRSet[t].SNRules; Rule = PRSet[t].SRule; RuleIndex = PRSet[t].SRuleIndex; DefaultClass = PRSet[t].SDefaultClass; if ( t < TRIALS ) { FReglas<<endl; FReglas<<"Conjunto de reglas "; FReglas<<t; FReglas<<endl; } else { FReglas<<endl; FReglas<<"Conjunto compuesto de reglas:"; FReglas<<endl; } Final = (t == TRIALS); Errors[t] = Interpret(0, MaxItem, DeleteRules, Final, Final); AvSize += NRules; AvErrs += Errors[t]; if ( DeleteRules ) { PRSet[t].SNRules = NRules; } } /* Imprimimos los resultados */
Tamao ------
Errores"; -------";
ForEach(t, 0, TRIALS) { if ( t < TRIALS ) { FReglas<<t; } else { FReglas<<" **"; } FReglas<<" "; FReglas<<PRSet[t].SNRules; FReglas<<" "; FReglas<<Errors[t]; 328 Magdalena Servente Cdigo Fuente
FReglas<<"("; FReglas<<100 * Errors[t] / (MaxItem+1.0); FReglas<<"%)"; FReglas<<endl; } AvSize /= TRIALS + 1; AvErrs /= TRIALS + 1; FReglas<<" Tamao Promedio = "; FReglas<<AvSize; FReglas<<", errores promedio = "; FReglas<<AvErrs; FReglas<<" ("; FReglas<< 100 * AvErrs / (MaxItem+1.0); FReglas<<"%)"; FReglas<<endl; } /*************************************************************************/ /* */ /* Evala el conjunto de reglas actual */ /* */ /*************************************************************************/ ItemNo TDMC45::Interpret(ItemNo Fp,ItemNo Lp,bool DeleteRules, bool CMInfo, bool Arrow) { ItemNo i, Tested=0, Errors=0, *Better, *Worse, *ConfusionMat; bool FoundRule; ClassNo AssignedClass, AltClass; Attribute Att; RuleNo p, Bestr, ri, ri2, riDrop=0; float ErrorRate, BestRuleConfidence; if ( CMInfo ) { ConfusionMat = (ItemNo *) calloc((MaxClass+1)*(MaxClass+1), sizeof(ItemNo)); } ForEach(ri, 1, NRules) { p = RuleIndex[ri]; Rule[p].Used = Rule[p].Incorrect = 0; } Better = (ItemNo *) calloc(NRules+1, sizeof(ItemNo)); Worse = (ItemNo *) calloc(NRules+1, sizeof(ItemNo)); ForEach(i, Fp, Lp) { /* Buscamos la primera opcin de la regla para este item */ ri = BestRuleIndex(Item[i], 1); Bestr = ( ri ? RuleIndex[ri] : 0 ); FoundRule = Bestr > 0; if ( FoundRule ) { Rule[Bestr].Used++; AssignedClass = Rule[Bestr].Rhs; BestRuleConfidence = Confidence; /* Ahora buscamos la segunda opcin */
ri2 = BestRuleIndex(Item[i], ri+1); AltClass = ( ri2 ? Rule[RuleIndex[ri2]].Rhs : DefaultClass ); if ( AltClass != AssignedClass ) { if ( AssignedClass == Class(Item[i]) ) { Better[ri]++; } else if ( AltClass == Class(Item[i]) ) { Worse[ri]++; } } } Cdigo Fuente Magdalena Servente 329
else { AssignedClass = DefaultClass; } if ( CMInfo ) { ConfusionMat[Class(Item[i])*(MaxClass+1)+AssignedClass]++; } Tested++; if ( AssignedClass != Class(Item[i]) ) { Errors++; if ( FoundRule ) Rule[Bestr].Incorrect++; Verbosity(3) { FReglas<<endl; ForEach(Att, 0, MaxAtt) { FReglas<<" "; FReglas <<AttName->Strings[Att].c_str(); FReglas<<": "; if ( MaxAttVal[Att] ) { if ( DVal(Item[i],Att) ) { FReglas<<AttValName[Att][DVal(Item[i],Att)].c_str(); FReglas<<endl; } else { FReglas<<"?"; FReglas<<endl; } } else { if ( CVal(Item[i],Att) != Unknown ) { FReglas<<CVal(Item[i],Att); FReglas<<endl; } else { FReglas<<"?"; FReglas<<endl; } } } FReglas<<" "; FReglas<<i; FReglas<<": Clase dada"; FReglas<<ClassName->Strings[Class(Item[i])].c_str(); if ( FoundRule ) { FReglas<<" La regla "; FReglas<<Bestr; FReglas<<" ["; FReglas<<100 * BestRuleConfidence; FReglas<<"%] determina la clase"; } else { FReglas<<" Clase por defecto "; } FReglas<<ClassName->Strings[AssignedClass].c_str(); FReglas<<endl; } } } FReglas<<endl; FReglas<<"Regla FReglas<<endl; FReglas<<"----FReglas<<endl; 330
Tamao ------
Error -----
Usada -----
Errores -------
Ventaja"; -------";
Magdalena Servente
Cdigo Fuente
ForEach(ri, 1, NRules) { p = RuleIndex[ri]; if ( Rule[p].Used > 0 ) { ErrorRate = Rule[p].Incorrect / (float) Rule[p].Used; FReglas<<p; FReglas<<" "; FReglas<<Rule[p].Size; FReglas<<" "; FReglas<<100 * Rule[p].Error; FReglas<<"% "; FReglas<<Rule[p].Used; FReglas<<" "; FReglas<< Rule[p].Incorrect; FReglas<<" ("; FReglas<<100 * ErrorRate; FReglas<<"%) "; FReglas<<Better[ri]-Worse[ri]; FReglas<<" ("; FReglas<<Better[ri]; FReglas<<"|"; FReglas<<Worse[ri]; FReglas<<") "; FReglas<<ClassName->Strings[Rule[p].Rhs].c_str(); FReglas<<endl; /* Verificamos si esta regla debera ser eliminada. Nota: podemos eliminar solo una regla por vez, porque Better y Worse se ven afectados */
if ( DeleteRules && ! riDrop && Worse[ri] > Better[ri] ) { riDrop = ri; } } } free(Better); free(Worse); if ( riDrop ) { FReglas<<endl; FReglas<<"Eliminamos la regla "; FReglas<<RuleIndex[riDrop]; FReglas<<endl; ForEach(ri, riDrop+1, NRules) { RuleIndex[ri-1] = RuleIndex[ri]; } NRules--; if ( CMInfo ) free(ConfusionMat); return Interpret(Fp, Lp, DeleteRules, true, Arrow); } else { FReglas<<endl; FReglas<<"Probadas "; FReglas<<Tested; FReglas<<", errores "; FReglas<<Errors; FReglas<<" ("; FReglas<<100 * Errors / (float) Tested; FReglas<<"%)"; FReglas<<( Arrow ? " <<" : "" ); FReglas<<endl; } if ( CMInfo ) { PrintConfusionMatrix(ConfusionMat); free(ConfusionMat); } Cdigo Fuente Magdalena Servente 331
return Errors; } /*************************************************************************/ /* */ /* Busca la mejor regla para el caso dado, dejando la probabilidad */ /* en Confidence */ /* */ /*************************************************************************/ RuleNo TDMC45::BestRuleIndex(Description CaseDesc,RuleNo Start) { RuleNo r, ri; ForEach(ri, Start, NRules) { r = RuleIndex[ri]; Confidence = Fuerza(Rule[r], CaseDesc); if ( Confidence > 0.1 ) { return ri; } } Confidence = 0.0; return 0; }
//--------------------------------------------------------------------------//--------------------------------------------------------------------------// DECLARACION DE TIPOS //--------------------------------------------------------------------------//--------------------------------------------------------------------------//Tabla de correlacin //*****************EL TAMAO DE LA TABLA DEBERA SER DINMICO typedef double TTablaCorrel[MAX_CANT_DESCRIPTORES+1][MAX_CANT_CLASIFICADORES+1]; typedef struct tree_node *tree_ptr; struct tree_node { short int flag_hoja;
/* 0 si es hoja y todos los valores son "Yes" 1 si es hoja y todos los valores son "No" 2 si es hoja y sus valores son mixtos 3 si no es hoja*/
int desc;
332
Magdalena Servente
Cdigo Fuente
tree_ptr pHijos[MAX_HIJOS]; //hijo derecho short int D[MAX_CANT_DESCRIPTORES];/*Descriptores vlidos para el nodo*/ }; typedef tree_ptr DECISION_TREE; typedef typedef typedef typedef AnsiString TVecValores [MAX_NIVELES]; AnsiString TTablaValores [MAX_NIVELES][MAX_NIVELES]; char TRule [MAX_CHAR]; int TVecInt [MAX_NIVELES];
class TParametros { public: AnsiString ArchivoIni; AnsiString NombreBD; AnsiString TablaBD; AnsiString TablaReglas; AnsiString ColClasificador; AnsiString ExtensionFileReglas; TStringList *LClasificadores; int iFormatoReglas; /* 0: Insight2+ 1: KappaPC 2: ambos 3: ninguno*/ int iSistema; /* 0: ID3 1: C4.5 */ int iCriterio; /* 0: Ganancia 1: Proporcin de ganancia */ int iPoda; /* 0: Si 1: No */ int iConjuntos; /* indica si las pruebas en el C4.5 se realizan sobre grupos de atrib discretos 0: Si 1: No */ int iMinObjs; /* Cantidad mnima de objetos que debe tener una rama en el C4.5 */ int iCF; /* Nivel de confianza para la poda en el C4.5 */ TParametros(AnsiString ArchIni); //constructor //Toma los parmetros del archivo .ini ~TParametros(); //destructor //Refresca los parmetros a partir del archivo .ini /*Devuelve 0 si no hubo problemas, -1 en caso contrario*/ int RefrescarParams(); //Guardar los parmetros en el .ini /*Devuelve 0 si no hubo problemas, -1 en caso contrario*/ int GrabarParams(); };
//--------------------------------------------------------------------------#endif
D.5.1.2. UTipos.cpp
//--------------------------------------------------------------------------#include <vcl.h> #pragma hdrstop #include "UTipos.h" //--------------------------------------------------------------------------#pragma package(smart_init)
//--------------------------------------------------------------------------TParametros::TParametros(AnsiString ArchIni) //constructor //Toma los parmetros del archivo .ini { int i; char Buffer[80]; ArchivoIni=ArchIni; LClasificadores = new TStringList(); //Cargamos las opciones por default del archivo .ini //Cargamos los datos asociados con los clasificadores GetPrivateProfileString("Clasificadores", "ColClasif", "???", Buffer, Buffer, ArchivoIni.c_str()); if (Buffer!="???") ColClasificador=Trim(Buffer); GetPrivateProfileString("Clasificadores", "lClasif", "???", Buffer, Buffer, ArchivoIni.c_str()); if (Buffer!="???") { LClasificadores->Add(AnsiString(strtok(Buffer, ","))); i=0; while (Trim(LClasificadores->Strings[i])!="") { LClasificadores->Add(AnsiString(strtok(NULL, ","))); i++; } LClasificadores->Delete(i); }
sizeof
sizeof
//Cargamos los datos relacionados con la Base de Datos GetPrivateProfileString("BaseDeDatos", "Tabla", "???", ArchivoIni.c_str()); if (Buffer!="???") TablaBD=Trim(Buffer); GetPrivateProfileString("BaseDeDatos", ArchivoIni.c_str()); if (Buffer!="???") NombreBD=Trim(Buffer); "Alias", "???",
Buffer,
sizeof
Buffer,
Buffer,
sizeof
Buffer,
//Cargamos los datos asociados con las reglas de decisin GetPrivateProfileString("Reglas", "Extension", "???", Buffer, ArchivoIni.c_str()); if (Buffer!="???") ExtensionFileReglas=Trim(Buffer); GetPrivateProfileString("Reglas", "Formato", "???", ArchivoIni.c_str()); if (Buffer!="???") iFormatoReglas=StrToInt(Trim(Buffer)); Buffer,
sizeof
Buffer,
sizeof
Buffer,
//Cargamos los datos asociados con el sistema de resolucin y sus opciones GetPrivateProfileString("Resolucion", "Sistema", "???", Buffer, sizeof Buffer, ArchivoIni.c_str()); if (Buffer!="???") iSistema=StrToInt(Trim(Buffer)); GetPrivateProfileString("Resolucion", "Criterio", "???", Buffer, sizeof Buffer, ArchivoIni.c_str()); if (Buffer!="???") iCriterio=StrToInt(Trim(Buffer)); GetPrivateProfileString("Resolucion", "Poda", ArchivoIni.c_str()); if (Buffer!="???") iPoda=StrToInt(Trim(Buffer)); //Cargamos los datos asociados con el C4.5 GetPrivateProfileString("C45", "Conjuntos", ArchivoIni.c_str()); if (Buffer!="???") 334 Magdalena Servente "???", Buffer, sizeof Buffer,
"???",
Buffer,
sizeof
Buffer,
Cdigo Fuente
iConjuntos=StrToInt(Trim(Buffer)); GetPrivateProfileString("C45", "MinObjs", ArchivoIni.c_str()); if (Buffer!="???") iMinObjs=StrToInt(Trim(Buffer)); GetPrivateProfileString("C45", "CF", ArchivoIni.c_str()); if (Buffer!="???") iCF=StrToInt(Trim(Buffer)); } //--------------------------------------------------------------------------TParametros::~TParametros() //destructor { ArchivoIni.~AnsiString(); NombreBD.~AnsiString(); TablaBD.~AnsiString(); TablaReglas.~AnsiString(); ColClasificador.~AnsiString(); ExtensionFileReglas.~AnsiString(); delete LClasificadores; } //--------------------------------------------------------------------------int TParametros::RefrescarParams() //Refresca los parmetros a partir del archivo .ini /*Devuelve 0 si no hubo problemas, -1 en caso contrario*/ { int i; char Buffer[80]; try { LClasificadores = new TStringList(); //Cargamos las opciones por default del archivo .ini //Cargamos los datos asociados con los clasificadores GetPrivateProfileString("Clasificadores", "ColClasif", "???", Buffer, Buffer, ArchivoIni.c_str()); if (Buffer!="???") ColClasificador=Trim(Buffer); GetPrivateProfileString("Clasificadores", "lClasif", "???", Buffer, Buffer, ArchivoIni.c_str()); if (Buffer!="???") { LClasificadores->Add(AnsiString(strtok(Buffer, ","))); i=0; while (Trim(LClasificadores->Strings[i])!="") { LClasificadores->Add(AnsiString(strtok(NULL, ","))); i++; } LClasificadores->Delete(i); } "???", Buffer, sizeof Buffer,
"???",
Buffer,
sizeof
Buffer,
sizeof
sizeof
//Cargamos los datos relacionados con la Base de Datos GetPrivateProfileString("BaseDeDatos", "Tabla", "???", ArchivoIni.c_str()); if (Buffer!="???") TablaBD=Trim(Buffer); GetPrivateProfileString("BaseDeDatos", ArchivoIni.c_str()); if (Buffer!="???") NombreBD=Trim(Buffer); "Alias", "???",
Buffer,
sizeof
Buffer,
Buffer,
sizeof
Buffer,
//Cargamos los datos asociados con las reglas de decisin GetPrivateProfileString("Reglas", "Extension", "???", Buffer, ArchivoIni.c_str()); if (Buffer!="???") ExtensionFileReglas=Trim(Buffer); Cdigo Fuente Magdalena Servente
sizeof
Buffer,
335
Buffer,
sizeof
Buffer,
//Cargamos los datos asociados con el sistema de resolucin y sus opciones GetPrivateProfileString("Resolucion", "Sistema", "???", Buffer, sizeof Buffer, ArchivoIni.c_str()); if (Buffer!="???") iSistema=StrToInt(Trim(Buffer)); GetPrivateProfileString("Resolucion", "Criterio", "???", Buffer, sizeof Buffer, ArchivoIni.c_str()); if (Buffer!="???") iCriterio=StrToInt(Trim(Buffer)); GetPrivateProfileString("Resolucion", "Poda", ArchivoIni.c_str()); if (Buffer!="???") iPoda=StrToInt(Trim(Buffer)); //Cargamos los datos asociados con el C4.5 GetPrivateProfileString("C45", "Conjuntos", ArchivoIni.c_str()); if (Buffer!="???") iConjuntos=StrToInt(Trim(Buffer)); GetPrivateProfileString("C45", "MinObjs", ArchivoIni.c_str()); if (Buffer!="???") iMinObjs=StrToInt(Trim(Buffer)); GetPrivateProfileString("C45", "CF", ArchivoIni.c_str()); if (Buffer!="???") iCF=StrToInt(Trim(Buffer)); "???", Buffer, sizeof Buffer,
"???",
Buffer,
sizeof
Buffer,
"???",
Buffer,
sizeof
Buffer,
"???",
Buffer,
sizeof
Buffer,
return(0); } catch(...) { return(-1); } } //--------------------------------------------------------------------------int TParametros::GrabarParams() //Guardar los parmetros en el .ini /*Devuelve 0 si no hubo problemas, -1 en caso contrario*/ { AnsiString lista; int index;
try
//Actualizamos el archivo de inicio WritePrivateProfileString("Clasificadores", "ColClasif", ColClasificador.c_str(), ArchivoIni.c_str()); WritePrivateProfileString("BaseDeDatos", "Alias", NombreBD.c_str(), ArchivoIni.c_str()); WritePrivateProfileString("BaseDeDatos", "Tabla", TablaBD.c_str(), ArchivoIni.c_str()); WritePrivateProfileString("Reglas", "Extension", ExtensionFileReglas.c_str(), ArchivoIni.c_str()); //Clasificadores lista= ""; index=0; while (index<LClasificadores->Count) { AppendStr(lista, LClasificadores->Strings[index]); AppendStr(lista, ", "); index++; }
336
Magdalena Servente
Cdigo Fuente
WritePrivateProfileString("Clasificadores", ArchivoIni.c_str()); //Formato de las reglas lista=IntToStr(iFormatoReglas); WritePrivateProfileString("Reglas", ArchivoIni.c_str()); //Sistema de resolucin lista=IntToStr(iSistema); WritePrivateProfileString("Resolucion", ArchivoIni.c_str()); lista=IntToStr(iCriterio); WritePrivateProfileString("Resolucion", ArchivoIni.c_str()); lista=IntToStr(iPoda); WritePrivateProfileString("Resolucion", ArchivoIni.c_str());
"lClasif",
lista.c_str(),
"Formato",
lista.c_str(),
"Sistema",
lista.c_str(),
"Criterio",
lista.c_str(),
"Poda",
lista.c_str(),
//C4.5 lista=IntToStr(iConjuntos); WritePrivateProfileString("C45", "Conjuntos", lista.c_str(), ArchivoIni.c_str()); lista=IntToStr(iMinObjs); WritePrivateProfileString("C45", "MinObjs", lista.c_str(), ArchivoIni.c_str()); lista=IntToStr(iCF); WritePrivateProfileString("C45", "CF", lista.c_str(), ArchivoIni.c_str());
lista.~AnsiString(); return(0); } catch(...) { lista.~AnsiString(); return(-1); } } //--------------------------------------------------------------------------//--------------------------------------------------------------------------// FIN DE LA CLASE TParametros //--------------------------------------------------------------------------//---------------------------------------------------------------------------
D.5.2. Types.h
/*************************************************************************/ /* */ /* Definiciones de tipos para C4.5 */ /* ------------------------------*/ /* */ /*************************************************************************/ typedef typedef typedef typedef typedef typedef char *Conjunto; int ItemNo; float ItemCount; short ClassNo, DiscrValue; short Attribute;
/* nro de data item */ /* cant de items (parciales) */ /* nro de clase, 0..MaxClass */ /* valor discreto del atributo (0 = ?) */ /* nro de atributo, 0..MaxAtt */
union _attribute_value { DiscrValue _discr_val; float _cont_val; } AttValue, *Description; CVal(Case,Attribute) Case[Attribute]._cont_val DVal(Case,Attribute) Case[Attribute]._discr_val Class(Case) Case[MaxAtt+1]._discr_val Magdalena Servente 337
Cdigo Fuente
#define
Unknown
-999
/* tipos de nodo: /* /*
typedef struct tree_record *Tree; struct tree_record { short NodeType; ClassNo Leaf; ItemCount Items, *ClassDist, Errors; Attribute Tested; short Forks; float Cut, Lower, Upper; Conjunto *Subset; Tree *Branch; }; typedef Tree DECISION_TREE_C45;
/* /* /* /* /* /* /* /* /* /* /* /*
0=hoja 1=rama 2=corte 3=subconj */ clase ms frecuente del nodo */ nro de items en el nodo */ distrib de clase de los items */ nro de errores en el nodo */ atribute referenciado en la prueba */ nro de ramas en el nodo */ lmite para los atrib continuos */ lmite inferior del valor lmite */ lmite superior del valor lmite */ subconj de valores discretos */ Branch[x] = (sub)rbol para el resultado x */
#define #define
IGNORAR DISCRETE
1 2
/* estado especial de un atrib: no utilizar */ /* estado especial de un atrib: incorporar los valores a medida que se leen los datos */
typedef short
RuleNo;
/* nro de regla */
typedef struct TestRec *Test; struct TestRec { short Attribute short float Conjunto };
/* /* /* /* /*
tipo de prueba */ atributo testeado */ ramas posibles */ valor lmite (si es relevante) */ subconjunto (si es relevante) */
CondTest; TestValue;
typedef struct ProdRuleRec PR; struct ProdRuleRec { short Condition ClassNo float ItemNo
/* nro de condiciones */ /* condiciones */ /* clase resultante de la regla */ /* proporcin estimada de error */ /* bits para codificar la regla */ /* cant de veces en q se uso la regla */ /* cant de veces en q la regla fue incorrecta */
};
*SRule; SNRules,
ClassNo };
D.5.3. Defns.h
/*************************************************************************/ /* */ /* Definiciones utilizadas en el C4.5 */ /* ---------------------------------*/ /* */ /*************************************************************************/
#include <stdio.h> #include <math.h> #define None #define Epsilon long random(); #define Random #define #define #define #define #define #define #define #define #define #define Max(a,b) Min(a,b) Round(x) Log2 Log(x) Bit(b) In(b,s) ClearBits(n,s) CopyBits(n,f,t) SetBit(b,s) -1 1E-3
((random()&2147483647) / 2147483648.0) ((a)>(b) ? a : b) ((a)<(b) ? a : b) ((int) (x+0.5)) 0.69314718055994530942 ((x) <= 0 ? 0.0 : log((float)x) / Log2) (1 << (b)) ((s[(b) >> 3]) & Bit((b) & 07)) memset(s,0,n) memcpy(t,f,n) (s[(b) >> 3] |= Bit((b) & 07)) for(v=f ; v<=l ; ++v) if(VERBOSITY >= d) if ( v<l||v>h ) {printf("\t** valor invlido **\n"); exit(1);}
D.5.4. Rulex.h
/*************************************************************************/ /* */ /* Datos globales para la construccin y aplicacin de las reglas */ /* -------------------------------------------------------------*/ /* */ /*************************************************************************/ #define Before(n1,n2) (n1->Tested < n2->Tested || n1->NodeType < n2->NodeType ||n1>Tested == n2->Tested && n1->Cut < n2->Cut) #define IsTarget(case) extern PR extern RuleNo *Rule; NRules, *RuleIndex; RuleSpace; (Class(case) == TargetClass ? 1 : 0) /* reglas de produccin */ /* nro de relgas de produccin */ /* ndeice de las relgas de produccin */ /* espacio reservado para las relgas */ /* conjuntos de reglas */ /* clase por defecto asociada con un conj de reglas */ /* utilizar la prueba de Fisher en la Magdalena Servente 339
extern short
SIMANNEAL; extern float SIGTHRESH, REDUNDANCY, AttTestBits, *BranchBits; extern float extern double *LogItemNo; *LogFact;
poda de reglas */ /* usar simulated annealing */ /* nivel de sig usado en la poda de relgas */ /* factor que regula la codificacin entre reglas y excepciones */ /* bits promedio necesarios para codificar un atributo testeado */ /* idem para el valor del atributo */ /* LogItemNo[i] = log2(i) */ /* LogFact[i] = log2(i!) */
340
Magdalena Servente
Cdigo Fuente
REFERENCIAS
[Babic et al, 1998] Babic, A., Mathiesen, U., Hedin, K., Bodemar, G., Wigertz, O. 1998. Assessing an AI Knowledge-Base for Asymptomatic Liver Diseases. Department of Medical Informatics, Department of Internal Diseases, Department of Infectious Diseases, Linkping University Hospital, Suecia. Faculty of Electrical and Computer Engineering, University of Ljubljana, Eslovenia. Department of Internal Diseases, Oskarshamn County Hospital, Suecia. Baldwin, J.F., Lawry, J., Martin, T.P. 2000 Mass Assignment Induction of Decision Trees on Words. A.I. Group, Departament of Engineering Mathematics, University of Bristol, Reino Unido, {jim.baldwin, j.lawry, trevor.martin}@bristol.ac.uk Bergadano, F., Matwin, S. Michalski, R. S., Zhang, J. (1992) Learning Two-TieredDescriptions of flexible Concepts: the POSEIDON System. En Machine Learning, Volumen 8, pginas 5-43, DBLP, www.dblp.uni-tier.de, Dinamarca. Blockeel, H., De Raedt, L., 1997 Top-Down Induction of Logical Decision Trees. Katholieke Universiteit Leuven, Departament of Computer Science, Celestijnelaan, Blgica Blum, A., Langley, P. 1997 Selection of Relevant Features and Examples in Machine Learning. School of Computer Science, Carnegie Mellon University, Pittisburgh, Pennsylvania, Institute for the Study of Learning and Expertise, Palo Alto, California, EE.UU. Edward S. Blurock, 1996 The ID3 Algorithm, Research Institute for Symbolic Computation, www.risc.unilinz.ac.at/people/bulrock/ANALYSIS/manual/document, Austria Cabena, P., Choi, H.H., Kim, S., Otsuka, S., Reinschmidt, J., Saarenvirta, G. 2000. Intelligent Miner for Data Applications Guide, International Technical Support Organization, IBM, http://www.redbooks.ibm.com Callahan, B., Coombs, J. 1998 Training Decision Trees with ID3, http://www.css.tayloru.edu/~jcoombs/proj/ml/id3.htm Chen, H. 1994. Machine Learning for Information Retrieval: Neural Networks, Symbolic Learning, and Genetic Algorithms. JASIS, http://ai.bpa.arizona.edu/papers/mlir93/mlir93.html Davidsson, P. 1995. ID3-SD: An Algortithm for Learning Characteristic Decision Trees by Controlling the Degree of Generalization. Departament of Computer Science, Lund University, Suecia DeJong, G.F., Mooney, R.J. 1986. Explanation-Based Learning. An Alternative View, en Machine Learning, Volumen 1, pginas 145-176. Kluwer Academic Publishing Elomaa, T. 1993. In Defense of C4.5: Notes on Learning One-Level Decision Trees. Departament of Computer Science, University of Helsinki, Finlandia 1974 Diccionario Enciclopdico Abreviado. Espasa-Calpe S.A., Madrid. Tomo I, Sptima Edicin, Espaa. Fayad, U. M., Piatetsky-Shapiro, G., Smyth, P., Uhturudsamy, R. (eds). 1996 Advances in Knowledge Discovery and Data Mining, San Mateo, AAAI Press, EE.UU. Fjara, 2000. A Decision Tree Algorithm. www.cs.uml.edu/~fjara/mineset/id3/id3_example/id3_algoritm.html Frank, E. , Witten, I.H. 1999. Making Better Use of Global Discretization, Proceedings 16th International Conference on Machine Learning, pginas 115-123. Departament of Computer Science, University of Waikato, Nueva Zelanda Gallion, R., St Clair, D., Sabharwal, C., Bond, W.E. 1993. Dynamic ID3: A Symbolic Learning Algorithm for Many-Valued Attribute
Magdalena Servente 341
[Blurock, 1996]
[Davidsson, 1995]
[Elomaa, 1993]
[Holte, 1993]
[Korab, 1997]
[Michalski, 1983]
Domains. Engineering Education Center, University of MissouriRolla, St. Luis, EE.UU. Garca Martnez, R., Frtz, W., y Blanqu, J. 1987. Un algoritmo de aprendizaje de conceptos para sistemas inteligentes. Anales del V Congreso Nacional de Informtica y Teleinformtica. Pginas 91-96. Buenos Aires. Junio. Argentina Garca Martnez, R. 1994. Adquisicin de Conocimiento. En Abecasis, S. y Heras, C. Metodologa de la Investigacin. Prologado por el Dr. L. Santal. Editorial Nueva Librera. Argentina Garca Martnez, R. 1997 Sistemas Autnomos: Aprendizaje Automtico. Nueva Librera, Buenos Aires, Argentina Gestwicki, P. 1997 ID3: History, Implementation, and Applications, citeseer.nj.nec.com/398697.html Grossman, R., Kasif, S., Moore, R., Rocke, D., Ullman, J. 1999. Data Mining Research: Opportunities and Challenges, A Report of three NSF Workshops on Mining Large, Massive, and Distributed Data, January 1999, Chicago, EE.UU. Hall, P.W. 1998. Machine Learning ID3 Classification. Philipv@apk.net, http://junior.apk.net/~philiv/rschmlid.htm Holsheimer, M., Siebes, A.P.J.M. 1994. Data Mining: the search for knowledge in databases. Computer Science/Departament of Algorithmics and Architectire, Centrum voor Wiskunde en Informatica, CS-R9406, Amsterdam, Holanda. Holte, R.1993. Very Simple Classification Rules Perform Well on Most Commonly Used Datasets. Computer Science Departament, University of Ottawa, Canada. Hunt, E.B., Marin, J., Stone, P.J. 1966. Experiments in Induction. New York: Academic Press, EE.UU. Hunt, E.B. 1975. Artificial Intelligence. New York: Academic Press, EE.UU. Joachims, T., Freitag, D., Mitchell, T. 1997 Web Watcher: A Tour Guide for the World Wide Web, School of Computer Science, Carnegie Mellon University, EE.UU. Joachims, T., Mitchell, T., Freitag, D., Armstrong, R. 1995. Web Watcher: Machine Learning and Hypertext, School of Computer Science, Carnegie Mellon University, EE.UU. Joshi, K.P. 1997. Analysis of Data Mining Algorithms, http://userpages.umbc.edu/~kjoshi1/data-mine/proj_rpt.htm Kearns, M., Mansour, Y. 1996. On the Boosting Ability of Top-Down Decision Tree Learning Algorithms, AT&T Research, Tel-Aviv University, Israel. Klemettinen, M., Mannila, H., Ronkainen, P., Toivonen, H., Verkamo, A. 1994. Finding Interesting Rules from Large Sets of Discovered Association Rules, University of Helsinki, Department of Computer Science, Helsinki, Finlandia. Korab, H. 1997. Rule Induction: Decision Trees and Rules, http://www.ncsa.uiuc.edu/News/Access/Stories/97Stories/KUFRIN.ht ml Mannila, H., Toivonen, H., Verkamo, A. 1994. Efficient Algorithms for Discovering Association Rules, University of Helsinki, Department of Computer Science, Helsinki, Finlandia. Michalski, R.S., Bratko, I., Kubat M. 1998. Machine Learning and Data Mining. Methods and Applications. Wiley & Sons Ltd., EE.UU. Michalski, R. S., Baskin, A. B., Spackman, K. A. 1982. A LogicBased Approach to Conceptual Database Analysis, Sixth Annual Symposium on Computer Applications on Medical Care, George Washington University, Medical Center, Washington, DC, EE.UU. Michalski, R. S. 1983. A Theory and Methodology of Inductive Learning. En Michalski, R. S., Carbonell, J. G., Mitchell, T. M. (eds.). (1983) Machine Learning: An Artificial Intelligence Approach, Vol. I.
Magdalena Servente Referencias
342
Morgan-Kauffman, EE.UU. [Michalski, 1991] Michalski, R. S. 1991. Towards an Unified Theory of Learning: An Outline of Basic Ideas, Proceedings of the 3rd World Conference on the Fundamentals of Artificial Intelligence, Paris, Julio 1-5, 1991 [Michalski, Tecuci, 1994] Michalski, R. S., Tecuci, G. (eds) 1994. Machine Learning: A Multistrategy Approach, Vol.IV, Morgan Kauffinan, EE.UU. [Michie, 1986] Michie, D. 1986. On Machine Intelligence (2nd ed), Ellis Horwood, Chichester, Reino Unido [Michie, 1998] Michie, D. 1988 Machine Learning in the next five years, EWSL-88, 3rd European Working Session on Leaming, Pitman, Glasgow, Londres, Reino Unido. [Mitchell, 1997] Mitchell, T. 1997. Machine Learning. MCB/McGraw-Hill, Carnegie Mellon University, EE.UU. [Mitchell, 2000a] Mitchell, T. 2000 Decision Trees. Cornell University, www.cs.cornell.edu/courses/c5478/2000SP, EE.UU. [Mitchell, 2000b] Mitchell, T. 2000 Decision Trees 2. Cornell University, www.cs.cornell.edu/courses/c5478/2000SP, EE.UU. [Montalvetti, 1995] Montalvetti, Mario 1995. Sistemas de adquisicin automtica de conocimientos, Tesis de grado en Ingeniera en Computacin. Universidad Catlica de Santiago del Estero, Argentina. [Monter, 2001] Monter, C. 2001. Equiparacin de Marcos. Notas de Seminario. Escuela de Posgrado, Instituto Tecnolgico de Buenos Aires, Argentina [Quinlan y Cameron-Jones, 1995] Quinlan, J.R., Cameron-Jones, R.M. 1995. Oversearching and Layered Search in Empirical Learning. Basser Departament of Computer Science, University of Science, Australia. [Quinlan, 1986] Quinlan, J.R. 1986. Induction of Decision Trees. En Machine Learning, Captulo 1, p.81-106. Morgan Kaufmann, 1990 [Quinlan, 1987] Quinlan, J.R. 1987. Generating Production Rules from Decision trees. Proceeding of the Tenth International Joint Conference on Artificial Intelligence, pginas. 304-307. San Mateo, CA., Morgan Kaufmann, EE.UU. [Quinlan, 1988b] Quinlan, J.R. 1988. Decision trees and multi-valued attributes. En J.E. Hayes, D. Michie, and J. Richards (eds.), Machine Intelligence, Volumen II, pginas. 305-318.Oxford University Press, Oxford, Reino Unido [Quinlan, 1989] Quinlan, J.R. 1989. Unknown Attribute Values in Induction. Basser Departament of Computer Science, University of Science, Australia. [Quinlan, 1990] Quinlan, J. R. 1990. Learning Logic Definitions from Relations. En Machine Leaming, Vol 5, pginas 239-266. Oxford University Press, Oxford, Reino Unido [Quinlan, 1993a] Quinlan, J.R. 1993. The Effect of Noise on Concept Learning, En R. S. Michalski, J. G. Carbonell, & T. M. Mitchells (Eds.) Machine Learning, The Artificial Intelligence Approach. Morgan Kaufmann, Vol. I, Captulo 6, pginas149-167. San Mateo, CA: Morgan Kaufmann, EE.UU. [Quinlan, 1993b] Quinlan, J.R. 1993. Learning Efficient Classification Procedures and Their Application to Chess Games, En R. S. Michalski, J. G. Carbonell, & T. M. Mitchells (Eds.) Machine Learning, The Artificial Intelligence Approach. Morgan Kaufmann, Vol. II, Captulo 15, pginas 463-482, EE.UU. [Quinlan, 1993c] Quinlan, J.R. 1993. Combining Instance-Based and Model-Based Learning. Basser Departament of Computer Science, University of Science, Australia. [Quinlan, 1993d] Quinlan, J.R. 1993 C4.5: Programs for Machine Learning. Morgan Kaufmann Publishers, San Mateo, California, EE.UU. [Quinlan, 1995] Quinlan, J.R. 1995 MDL and Categorical Theories. Basser Departament of Computer Science, University of Science, Australia.
Referencias Magdalena Servente 343
[Quinlan, 1996a]
[Quinlan, 1996b]
[S/A, 19950]
[S/A, 1998]
Quinlan, J.R. 1996. Improved Use of Continuous Attributes in C4.5. Basser Departament of Computer Science, University of Science, Australia. Quinlan, J.R.1996. Learning First-Order Definitions of Functions. Basser Departament of Computer Science, University of Science, Australia Riddle, P.J. 1997. ID3 Algorithm. www.cs.auckland.ac.nz/~pat/706_99/ln/node75.html, Nueva Zelanda Rissanen, J. 1983. A universal prior for integers and estimation by minimum description length. En Annals of Statistics 11, Vol 2, p. 416431 S/A. 1995. Building Classification Models: ID3 and C4.5, yoda.cis.temple.edu:8080/UGAIWWW/lectures/C45, Pensilvania, EE.UU. S/A 1998.Confidence intervals for small sample sizes. En Engineering Statistics Handbook, Information Technology Laboratory, NIST, http://www.itl.nist.gov/div898/handbook/prc/section2/prc242.htm, EE.UU. S/A. 1999. What is Data Mining?, www.citeseer.nj.nec.com/69212.html. Thakore, M., St Clair, D. 1993. Effect of the X2 test on the Construction of ID3 decision trees, Sun Microsystems, University of MO-Rolla, Engineering Education Center, St. Louis, EE.UU. Thrun, S., Bala, J., Bratko, I., Cestnik, B., Cheng, J., De Jong, K., Dzeroski, S., Fahlman, S.E., Fisher, D., Hamann, R., Kaufman, K., Keller, S., Kononenko, I., Michalski, R.S., Mitchell, T., Pachowicz, P., Reich, Y., Vafaie, H., Van de Welde, W., Wenzel, W., Wnek, J, Zhang, J. 1991 The MONKs Problems. A Performance Comparison of Different Learning Algorithms, Carnegie Mellon University, Pittisburgh, EE.UU. Thrun, S., Faloustos, C., Mitchell, T., Wasserman, L. 1998 Automated Learning and Discovery: State-Of-The-Art and Research Topics in a Rapidly Growing Field. CMU-CALD-98-100, Center for Automated Learning and Discovery, Carnegie Mellon University, Pittisburgh, EE.UU. Witten, I.H., Frank, E. 2000. Data Mining: Practical Machine Learning Tools and Techniques with Java Implementations. Morgan Kaufmann, San Diego, EE.UU.
344
Magdalena Servente
Referencias