inteligencia en redes de comunicaciones práctica de minería de datos
Transcription
inteligencia en redes de comunicaciones práctica de minería de datos
INTELIGENCIA EN REDES DE COMUNICACIONES PRÁCTICA DE MINERÍA DE DATOS: SISTEMA DE PREDICCIÓN METEOROLÓGICA UTLIZANDO WEKA Alumnos: Sergio Hernández Ruiz 100031151 Guillermo Félix Tapia Casellas 100029691 1. INTRODUCCIÓN A LA MINERÍA DE DATOS Las técnicas de minería de datos se emplean para mejorar el rendimiento de procesos de negocio o industriales en los que se manejan grandes volúmenes de información estructurada y almacenada en bases de datos. Se trata de un proceso analítico diseñado para explorar grandes volúmenes de datos (generalmente datos de negocio y mercado) con el objeto de descubrir patrones y modelos de comportamiento o relaciones entre diferentes variables. Esto permite generar conocimiento que ayuda a mejorar la toma de decisiones en los procesos fundamentales de un negocio. La minería de datos permite obtener valor a partir de la información que registran y manejan las empresas, lo que ayuda a dirigir esfuerzos de mejora respaldados en datos históricos de diversa índole. Por ejemplo, se usan con éxito en aplicaciones de control de procesos productivos, como herramienta de ayuda a la planificación y a la decisión en marketing, finanzas, etc. Asimismo, la minería de datos es fundamental en la investigación científica y técnica, como herramienta de análisis y descubrimiento de conocimiento a partir de datos de observación o de resultados de experimentos. La minería de datos comprende una serie de técnicas, algoritmos y métodos cuyo fin es la explotación de grandes volúmenes de datos de cara al descubrimiento de información previamente desconocida y que pueda ser empleada como ayuda a la toma de decisiones. Para llevar a cabo este proceso, la minería de datos se puede clasificar en varias fases, como ilustra el siguiente dibujo: Las técnicas de minería de datos se pueden clasificar grosso modo en dos tipos: - Técnicas descriptivas: - Segmentación - Análisis de asociaciones - Técnicas predictivas: - Clasificación/predicción - Análisis de secuencias/similitud de series temporales La segmentación y es muy importante, ya que sirve para detectar agrupamientos o estructuras intrínsecas en el conjunto de datos. Puede llegar a identificar grupos homogéneos, propiedades que lo caracterizan y prototipos representativos de cada grupo. La idea básica es agrupar en un mismo grupo a todos los objetos muy parecidos entre sí y muy diferentes a los demás. Hay diversas técnicas de segmentación: algoritmos clásicos (iterativo, aglomerativo, por división); mapas autoorganizativos de Kohonen (redes neuronales). En cuanto a la clasificación y la predicción (que es lo que a nosotros nos interesará), se basa en que partiendo de un conjunto de datos, tenemos que conseguir un modelo que clasifique objetos en función de sus características y un modelo que permita calcular valores desconocidos de variables de salida (predecir). Para predecir hay diversas técnicas, entre las que podemos nombrar los árboles de decisión/reglas de inducción y las redes neuronales (ej. perceptrón multicapa). Los árboles de decisión utilizan algoritmos como el ID3 (sólo datos nominales) o el C.45 (también datos numéricos). En cuanto a las redes neuronales, la estructura de red neuronal más sencilla es el perceptrón multicapa. Por último, simplemente comentar que lo mejor para una buena predicción es, a partir de unos datos dados, analizarlos bien y realizar una segmentación, y sobre los grupos que se han conseguido segmentar, realizar el entrenamiento grupo a grupo, lo que mejorará notablemente nuestras predicciones. 2. PREPROCESADO DE LOS DATOS Para esta práctica se proporciona un conjunto de datos meteorológicos del aeropuerto de Madrid Barajas (código internacional: LEMD), desde el año 1996 al 2004, con las siguientes medidas cada media hora: • • • • • • • • • • • • • • • Año Mes Dia Hora (como es cada media hora, varía entre 0 (24:00) y 47 (23:30)) Temperatura (grados Farenheit) Punto de rocío (grados Farenheit) Humedad Presión (pulgadas) Visibilidad Dirección del viento Velocidad del viento (millas por hora) Velocidad de ráfagas de viento (millas por hora) Precipitación Eventos Condiciones Antes de que consiguiéramos cargar el archivo en Weka, hubo que procesar diversas cuestiones: Para empezar, lo primero que tuvimos que hacer es declarar los atributos, para lo que nos hemos ayudado de prácticas de años anteriores, para ver los diversos valores que podía tomar el atributo condiciones: @attribute año1 numeric @attribute mes1 numeric @attribute dia1 numeric @attribute hora1 numeric @attribute temperaturaF1 numeric @attribute nivelRocio1 numeric @attribute humedad1 numeric @attribute presion1 numeric @attribute direccionViento1 {Calm,Este,Norte,Sur,Oeste,ONO,NNO,NE,NO,ENE,NNE,ESE,SE,SSO,OSO,SSE,SO ,Variable} @attribute velocidadViento1 numeric @attribute condiciones1 {Nubes_de_Polvo,Arena,Nube_en_Embudo,Llovizna_Helada_Leve,Lluvia_Helada_Le ve,Niebla,Niebla_Leve,Abundante_Niebla,Granizo_Leve,Despejado,Bruma_Helada_Le ve,Fuertes_Lluvias,Tormenta,Parcialmente_Nublado,Nubes_Dispersas,Altamente_Nubl ado,Tormentas_y_Lluvia,Tormentas_Leves_y_Lluvia,Fuertes_Tormentas_y_Lluvia,Llu vias,Nublado,Llovizna_Leve,Llovizna,Llovizna_Abundante,Neblina,Bruma,Bancos_de _Bruma,Bruma_Leve,Bruma_Ligera,Lluvia,Lluvia_Leve,Abundantes_Lluvias,Nieve,N evada_Leve,Caídas_de_Nieve,Abundante_Nieve} Hubo valores de este atributo que posteriormente, al cargarlos en Weka veíamos que no tenían ninguna ocurrencia, por lo que decidimos quitarlos de la declaración del atributo, así como otros que el año pasado no estaban y tuvimos que añadirlos. En cuanto al atributo precipitación hemos puesto dos valores al azar ya que está desconocido en absolutamente todos los registros. También hubo que pulir diversos detalles del archivo: - había atributos que tenían como valor N/A, -, -9999.0, -9999, los cuales los pusimos todos a ?, que es como reconoce Weka los valores desconocidos. - por otra parte el atributo velocidadViento había veces que tomaba el Valor Calm, saltando un error porque este atributo está declarado como numeric, por lo que lo cambiamos por 0 - por otra parte, vimos que no había datos de ningún tipo (salvo año, mes, día y hora) hasta el 5 de julio del 96, por lo que eliminamos todas las entradas anteriores del archivo Llegados a este punto, teníamos el archivo listo para cargarlo en Weka, carga tras la cual vimos que el 96% del atributo hechos estaba desconocido, el 100% del atributo precipitación, el 99% de la velocidad de ráfaga y el 44% de la visibilidad, por lo que decidimos eliminarlos de nuestro análisis ya que no aportaban ninguna información, o muy escasa en el caso de la visibilidad. Tras este pequeño procesado, tenemos que recordar cuál es el objetivo de nuestra predicción, en concreto hay que desarrollar tres modelos de predicción: • • • Predicción de temperatura a 1 hora Predicción de temperatura a 24 horas Predicción de condiciones meteorológicas (Despejado, Parcialmente Nublado, etc) a 24 horas Hay que recordar también que nuestros valores críticos en la predicción serán el error medio para la temperatura (valor numérico) y la tasa de aciertos para las condiciones meteorológicas (valor nominal). Es decir, que lo que intentaremos será reducir al máximo el primero y llevar al máximo el segundo. En este punto lo que tenemos es que decidir qué datos utilizaremos para realizar las predicciones, en principio lo que haremos es, ayudados por ficheros java y del archivo con todos los datos, elaborar los archivos que realmente cargaremos en Weka para la predicción. En nuestro caso hemos decidido: - - Para la predicción de la temperatura una hora después, utilizaremos los datos de la hora actual, los datos de la anterior, y los datos de 8 horas antes, teniendo en cuenta que los ciclos en meteorología cambian aproximadamente cada 8 horas. Para la predicción de la temperatura y las condiciones meteorológicas 24 horas después al momento actual, utilizaremos los datos de la hora actual, los de la misma hora del día anterior, y los de la misma hora de hace dos días. A la hora de cargar los archivos en Weka, dada la gran cantidad de datos que teníamos, tuvimos muchos problemas a la hora de predecir, o visualizar, con la memoria disponible, así como con el tiempo que estaba simulando (excesivo), por lo que finalmente decidimos filtrar los datos y utilizar sólo los datos del año 2003, ya que es el año más cercano al que vamos a tener que predecir los datos (2005). Es cierto que hay datos del año 2004, pero faltan muchos datos de ese año, hay bastantes más del 2003, por lo que se ha escogido este año finalmente. Por otro lado, también podríamos decir que podríamos haber hecho una segmentación de los datos: - por estaciones - o por ejemplo por grupos de condiciones meteorológicas, es decir, todas las que tuvieran que ver con lluvia por un lado, por otro las que tuvieran que ver con nieve, otras con bruma…etc - otras posibles segmentaciones Sin embargo, debido al tiempo que nos hubiera llevado esto, decidimos hacerlo con los datos tal cual. 3. PREDICCIÓN DE LA TEMPERATURA A 1 HORA Tras la carga en Weka de los datos, lo primero que hacemos es, del último día, eliminar todos los valores menos el de temperatura, que es el que tenemos que predecir, el resto no los sabemos. Y del resto de días, eliminamos todos los atributos referentes al año, mes, día y hora, ya que siempre siguen el mismo patrón, y no aportan información. Donde tenemos realmente la información es en los datos meteorológicos, de los que cabe destacar que la temperatura a predecir guarda mucha relación con las temperaturas anteriores (sobre todo con las de una y dos horas antes), así como con el nivel de rocío. Se ve una relación mas o menos lineal, como podemos comprobar en las gráficas siguientes: Donde temperaturaF1 es la temperatura 8 horas antes de la actual y temperaturaF4 es la temperatura una hora después de la actual (la que luego habrá que predecir). Aquí temperaturaF2 es la temperatura una hora antes de la hora actual. En esta última gráfica temperaturaF3 es la temperatura actual. También se ve que temperaturaF4 guarda una relación fuerte con los niveles de rocío de medidas anteriores y con los niveles de humedad de las dos horas inmediatamente anteriores, aunque nos abstenemos de dibujar las gráficas ya que en Word vemos (por las gráficas anteriores) que no se aprecian bien los dibujos. Llegados a este punto nos queda utilizar los métodos de predicción, y jugar con ellos y con las distintas variables de las que disponemos, es decir, quitar y poner atributos meteorológicos de las medidas anteriores en función de su importancia y en pro de conseguir una mejor predicción. Decir que para todos los modelos de predicción se ha utilizado el modo de entrenamiento de percentage split a un 66%. Empezamos con un modelo de regresión lineal con todas las variables de las que disponemos: Attributes: 22 temperaturaF1 nivelRocio1 humedad1 presion1 direccionViento1 velocidadViento1 condiciones1 temperaturaF2 nivelRocio2 humedad2 presion2 direccionViento2 velocidadViento2 condiciones2 temperaturaF3 nivelRocio3 humedad3 presion3 direccionViento3 velocidadViento3 condiciones3 temperaturaF4 El subíndice 1 quiere decir datos de 8 horas antes a la hora actual, el 2, 1 hora antes a la actual, el 3 es la hora actual y el 4 una hora después. Hemos conseguido los siguientes resultados: === Evaluation on test split === === Summary === Correlation coefficient 0.9745 Mean absolute error 2.4247 Root mean squared error 3.6829 Relative absolute error 17.75 % Root relative squared error 22.427 % Total Number of Instances 5696 Ignored Class Unknown Instances 261 Ahora vamos a realizar el mismo modelo de predicción, pero eliminando variables como la temperatura y el nivel de rocío de la hora actual y una hora anterior, para comprobar que realmente eran variables importantes en la predicción, debido a su alta correlación con la variable a predecir. Attributes: 18 temperaturaF1 nivelRocio1 humedad1 presion1 direccionViento1 velocidadViento1 condiciones1 humedad2 presion2 direccionViento2 velocidadViento2 condiciones2 humedad3 presion3 direccionViento3 velocidadViento3 condiciones3 temperaturaF4 Obtenemos los siguientes resultados: === Evaluation on test split === === Summary === Correlation coefficient Mean absolute error Root mean squared error Relative absolute error Root relative squared error Total Number of Instances 0.9352 4.4486 5.8146 32.5653 % 35.4078 % 5696 Ignored Class Unknown Instances 261 Como podemos observar, el error es mucho mayor en este caso. Vamos a probar utilizando los atributos siguientes: Attributes: 13 temperaturaF1 nivelRocio1 humedad1 presion1 direccionViento1 velocidadViento1 condiciones1 temperaturaF2 nivelRocio2 condiciones2 temperaturaF3 condiciones3 temperaturaF4 Nos da los siguientes resultados: === Evaluation on test split === === Summary === Correlation coefficient 0.9738 Mean absolute error 2.4652 Root mean squared error 3.7357 Relative absolute error 18.0461 % Root relative squared error 22.7484 % Total Number of Instances 5696 Ignored Class Unknown Instances 261 Estos resultados son bastantes parecidos a los obtenidos con el primer modelo, pero con menos variables y, por tanto, menor coste de tiempo en computación. 4. PREDICCIÓN DE LA TEMPERATURA A 24 HORAS Vamos a realizarlo con el modelo de regresión lineal, con todas las variables disponibles: Attributes: 22 temperaturaF1 nivelRocio1 humedad1 presion1 direccionViento1 velocidadViento1 condiciones1 temperaturaF2 nivelRocio2 humedad2 presion2 direccionViento2 velocidadViento2 condiciones2 temperaturaF3 nivelRocio3 humedad3 presion3 direccionViento3 velocidadViento3 condiciones3 temperaturaF4 Donde los subíndices 1, 2, 3 y 4 indican medidas tomadas hace 48 horas, medidas tomadas hace 24 horas, medidas actuales y medida de la temperatura una hora después. Los resultados conseguidos son los siguientes: === Evaluation on test split === === Summary === Correlation coefficient 0.948 Mean absolute error 3.9702 Root mean squared error 5.206 Relative absolute error 29.0636 % Root relative squared error 31.836 % Total Number of Instances 5669 Ignored Class Unknown Instances 288 Como podemos comprobar, el error es mayor en esta predicción que en la anterior. 5. PREDICCIÓN DE LAS CONDICIONES METEOROLÓGICAS A 24 HORAS Vamos a realizarlo con árboles de decisión. Utilizando el modelo J48 (algoritmo C.45), y las siguientes variables: Attributes: 22 temperaturaF1 nivelRocio1 humedad1 presion1 direccionViento1 velocidadViento1 condiciones1 temperaturaF2 nivelRocio2 humedad2 presion2 direccionViento2 velocidadViento2 condiciones2 temperaturaF3 nivelRocio3 humedad3 presion3 direccionViento3 velocidadViento3 condiciones3 condiciones4 donde los índices indican lo mismo que para el apartado de la temperatura a 24 horas. Se han obtenido los siguientes resultados: === Evaluation on test split === === Summary === Correctly Classified Instances 3163 56.4418 % Incorrectly Classified Instances 2441 43.5582 % Kappa statistic 0.3733 Mean absolute error 0.0294 Root mean squared error 0.134 Relative absolute error 72.5051 % Root relative squared error 94.2412 % Total Number of Instances 5604 Ignored Class Unknown Instances 353 Aunque nos da un porcentaje de error muy alto, podríamos decir que no es del todo malo, ya que es 43,5582 % de errores teniendo en cuenta que tenemos 36 clases distintas, y que se tiene en cuenta también un error menor como predecir Bancos_de_bruma y que realmente fuera Bruma_ligera, lo que no es un error grave. Vamos a probar con ID3, con las mismas variables que antes. Los resultados obtenidos son: === Evaluation on test split === === Summary === Correctly Classified Instances 3114 55.5675 % Incorrectly Classified Instances 2490 44.4325 % Kappa statistic 0.3861 Mean absolute error 0.0248 Root mean squared error 0.1569 Relative absolute error 61.16 % Root relative squared error 110.3354 % Total Number of Instances 5604 Ignored Class Unknown Instances 353 Vemos que los resultados son un poquito peores, aunque son muy similares. Se podrían utilizar otros modelos de predicción, así como jugar con las variables (ir eliminando variables) para mejorar estos resultados. 6. CONCLUSIONES Tras la realización en esta práctica, nos hemos iniciado en el mundo de la minería de datos, en pro de predecir futuros hechos, relevantes en mayor o menor medida, como pueden ser para meteorología, medicina o el mundo de los negocios. Nos hemos dado cuenta de que la fase más crítica y más ardua es la del preprocesado de los datos, así como su análisis y posibles segmentaciones del grupo de datos. Sin embargo, también es la fase más importante ya que determinará en gran medida lo buenas que serán después las predicciones, ya que los algoritmos de predicción no son buenos por sí solos, depende mucho de cómo sean los datos de entrada. En cuanto a la fase de predicción, es costosa en tiempo de computación, así como en capacidad de memoria. Debido a esta limitación en el tiempo no hemos podido realizar un estudio exhaustivo, con mayor número de modelos de predicción, probando con varios de ellos y cambiando sus parámetros para ver las diferencias. 7. BIBLIOGRAFÍA - Apuntes de clase Explorer Guide (facilitada en la página web de la asignatura) Trabajos del curso pasado WEKA Machine Learning Algorithms in Java (pdf) ANEXO CON EL CÓDIGO JAVA Los archivos java están preparados para actuar con archivos en los que sólo hay registros, es decir, sin las cabeceras de los archivos .arff, que luego se añadirían manualmente. import java.io.*; //Para pasar al archive que utilizaremos para la predicción a 24 horas, tanto de //temperatura como de condiciones, el resto se procesaría en Weka. public class CopiaFicheros2{ BufferedReader entrada; BufferedWriter salida; CopiaFicheros2 (String ficheroEntrada,String ficheroSalida) throws IOException { entrada = new BufferedReader(new FileReader(ficheroEntrada)); salida = new BufferedWriter(new FileWriter(ficheroSalida)); } public void cerrarFicheros() throws IOException { entrada.close(); salida.close(); } void mezclaParaUnDia() throws IOException { String lineas[]=new String[48*4]; int i; for (i=0;i<48*4;i++){ lineas[i]=entrada.readLine(); } do { salida.write(lineas[0] + "," + lineas[48] + "," + lineas[48*2] + "," + lineas[48*3]); salida.newLine(); for (i=0;i<(48*4-1);i++){ lineas[i]=lineas[i+1]; } lineas[48*4 -1]=entrada.readLine(); }while (lineas[48*4-1] != null); } import java.io.*; public class CopiaFicheros3{ BufferedReader entrada; BufferedWriter salida; //Para pasar el archivo al formato que queremos para la predicción de la temperatura //a una hora, el resto se procesa en Weka CopiaFicheros3 (String ficheroEntrada,String ficheroSalida) throws IOException { entrada = new BufferedReader(new FileReader(ficheroEntrada)); salida = new BufferedWriter(new FileWriter(ficheroSalida)); } public void cerrarFicheros() throws IOException { entrada.close(); salida.close(); } void mezclaParaUnDia() throws IOException { String lineas[]=new String[19]; int i; for (i=0;i<19;i++){ lineas[i]=entrada.readLine(); } do { salida.write(lineas[0] + "," + lineas[14] + "," + lineas[16] + "," + lineas[18]); salida.newLine(); for (i=0;i<(19-1);i++){ lineas[i]=lineas[i+1]; } lineas[19 -1]=entrada.readLine(); }while (lineas[19-1] != null); } import java.io.*; public class Filtra{ BufferedReader entrada; BufferedWriter salida; //Sirve para filtrar solo los datos del año 2003 Filtra (String ficheroEntrada,String ficheroSalida) throws IOException { entrada = new BufferedReader(new FileReader(ficheroEntrada)); salida = new BufferedWriter(new FileWriter(ficheroSalida)); } public void cerrarFicheros() throws IOException { entrada.close(); salida.close(); } void filtra() throws IOException { String linea; linea=entrada.readLine(); while(linea != null) { if (linea.startsWith("2003")==true) { salida.write(linea); salida.newLine(); } linea=entrada.readLine(); } } public static void main(String[] args)throws IOException { Filtra filtro= new Filtra(args[0],args[1]); filtro.filtra(); filtro.cerrarFicheros(); } }