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();
}
}