En este blog se exploran las posibilidades de analizar datos y crear modelos basados en la Teoría de la Información usando Powerhouse

jueves, 11 de octubre de 2007

La información en los datos

Hace unas semanas encontré una tesis de grado en la que se mostraba cómo una red neuronal (NN) resolvía un problema de clasificación. El dataset usado tiene 41 variables independientes mas la variable dependiente. Se trata de clasificar el tipo de onda (hay tres clases) en base a los atributos dados por las variables. Si bien todas las variables contienen ruido, las últimas 20 no contienen información acerca del tipo de onda (son solo ruido).

La tesis muestra cómo con una NN se logra un modelo con aproximadamente un 83% de aciertos en la clasificación.

Quise ver si Powerhouse era capaz de lograr resultados similares, y en este artículo contaré paso por paso lo que fui logrando y las sorpresas que tuve.

Comencé como siempre lo hago, realizando un modelo default. Para ser más preciso, usé solamente las variables seleccionadas y luego el modelo OPFIT (una especie de regresión logística aplicada a los datos preparados por Powerhouse).

La siguiente pantalla de Powerhouse muestra la información que había disponible para resolver el problema


Para mantener las cosas simples, solo usaré 2 columnas de esta pantalla en todos los análisis de este artículo, la que muestra las variables seleccionadas y la que muestra la ganancia de información.

Powerhouse seleccionó solamente 3 variables x7, x11 y x15. Estas tres variables llevan más del 60% de la información necesaria para clasificar correctamente la forma de onda.

Esto significa que el modelo construído con estas tres variables sería bastante bueno, pero seguramente no tan bueno como el de las redes neuronales.

El modelo OPFIT basado en estas tres variables confirmó mi sospecha de que no lograría demasiado. Sólo se logra un 59% de aciertos en el Training Set (datos usados para construir el modelo) y un 56% en el Test Set (datos nunca vistos. Hay que considerar que en Powerhouse, a diferencia de una NN, el Test Set realmente no se usa para nada).

La matriz de confusión da un poco más de detalles sobre los resultados


Ya que el modelo OPFIT no lograba discriminar la clase "0", probé con otro modelo de Powerhouse llamado MAXIT.

Este modelo, al igual que el OPFIT, se basa en el mapa de información creado por Powerhouse. La diferencia es que mientras que OPFIT mapea la información usando una simple función de transferencia lineal, MAXIT lo hace mediante un conjunto de reglas. En general, OPFIT funciona bien con la mayoría de los problemas que aparecen en áreas de negocios, ya que las no linealidades encontradas en los datos son resueltas en la transformación de datos que se realiza cuando se construye el mapa de información, pero hay veces en que, si bien existe información, OPFIT no puede acceder a ella mientras que MAXIT si lo hace.

Los resultados del modelo MAXIT con estas mismas tres variables mejoraron respecto del OPFIT

Ahora el porcentaje de aciertos subió al 66% en el Training Set y 64% en el Test Set, y además los aciertos de la clase "0" mejoraron bastante. De todas maneras, todavía estaba lejos del 83% logrado por una NN. Pero claro, la NN usó todas las variables disponibles y estos modelos sólo usaron 3 variables.

Así que el siguiente paso fue construir los modelos con todas las variables disponibles. Pero en Powerhouse no es posible construir un modelo sin antes haber seleccionado las variables, así que primero se debe hacer una selección aclarando que se desean todas las variales disponibles. O sea, se espera lograr una lista de variables ordenadas según la información que aportan. Y acá fue donde apareció la sorpresa, no hacen falta todas las variables ya que ¡11 de ellas contienen el 100% de la información necesaria para predecir la clase!


En la columna de la ganancia de información se puede ver que las últimas 3 variables aportan menos que el 1% de información. Es más, también se puede comprobar que el algoritmo de selección de variables es muy robusto respecto del ruido, ya que variables que sólo aportan ruido (x21 hasta x41, según se aclara en el sitio donde se obtuvieron los datos) aparecen al final de una selección forzada a elegir todas las variables. Powerhouse no continúa seleccionando variables porque ya no es necesario. Estas 11 variables contienen toda la información necesaria.

El modelo MAXIT sobre estas 11 variables no mejoró demasiado, 72% para el TR y 67% para el TS. Así que me pregunté por qué MAXIT no estaba capturando toda la información disponible si una red neuronal lo hacía. Entonces recordé que la red (al menos la que yo construí usando un producto comercial llamado NeuralWare) contiene 3 nodos de salida, uno para cada clase. Así que intenté un método que muchas veces mejoró mis resultados: construir tres modelos distintos, uno para cada clase, en vez de pretender que un solo modelo prediga las tres clases.

Lo único que tuve que hacer es agregar tres variables a la tabla de datos. La primera contenía un 1 cada vez que la clase a predecir era "0" y un 0 cada vez que la clase era "1" ó "2". La segunda contenía un 1 cada vez que la clase era "1" y un 0 si era "0" ó "2". La tercera, un 1 si la clase era "2" y un 0 si era "0" ó "1". Así que primero construí un modelo (ahora usé el OPFIT) para predecir la primera variable agregada, o sea para predecir si la clase es "0". Luego hice los otros dos modelos (también OPFIT) , uno para predecir si la clase es "1" y otro para "2".

Luego los apliqué a los datos y consideré que la clase sería aquella en que el modelo OPFIT diera el score más alto (el modelo OPFIT no solo predice categorías y valores continuos, sino que en cada predicción muestra un score). Por ejemplo, si los scores eran 0.89, 0.95 y 0.32 para las clases "0", "1" y "2" respectivamente, la predicción sería la clase "1" por tener el score más alto.

¿El resultado? ¡Un 86% de aciertos en el Training set y un 83% en el Test set!

En este ejercicio podemos ver dos cosas importantes:

  1. Muchas veces unas pocas variables contienen toda la información necesaria para resolver el modelo. Agregar más variables complejiza el modelo innecesariamente.
  2. Una manera de mejorar los resultados es construir varios modelos y luego unirlos para obtener el resultado buscado.

No hay comentarios: