Minería de Datos con R Capítulo 2: Predicción de las floraciones de algas Minería de Datos con R. Aprendiendo con Casos de Estudio Luis Torgo Capítulo 2: Predicción de las Floraciones de Algas Resumen elaborado por: Yonel Peñaloza M. Universidad de Los Andes. Facultad de Ciencias Económicas y Sociales. Instituto de Estadística Aplicada y Computación. Mérida, Venezuela. yonelp@gmail.com El objetivo principal de este Capítulo, consiste en familiarizar al usuario con R. En este sentido, se trata el caso de estudio referido a la predicción de la floración de las algas, en el que el objetivo de investigación se centra en de predecir la frecuencia de la aparición de algas dañinas en varias muestras de agua, con la cual se desarrollan diversas tareas básicas de la Minería de Datos, como lo son pre-procesamiento de datos, análisis exploratorio de datos, y la construcción de modelos predictivos. 2.1 Descripción del problema y objetivos Las altas concentraciones de ciertas algas nocivas en los ríos constituyen un grave problema ecológico con un fuerte impacto no sólo en las formas de vida del río, sino también la calidad del agua. Con el objetivo de abordar este problema de predicción, varias muestras de agua se recogieron en diferentes ríos europeos y distintas veces durante un período de aproximadamente 1 año. Para cada muestra de agua, se midieron diferentes Propiedades químicas, así como la frecuencia de ocurrencia de siete algas nocivas. Algunas otras características del proceso de recolección de agua también fueron almacenadas, tales como la estación del año, el tamaño del río, y la velocidad del río. Una de las principales motivaciones detrás de esta aplicación radica en el hecho de que control químico es barato y fácil de automatizar, mientras que el análisis biológico de las muestras para identificar a las algas que se encuentran 1 Minería de Datos con R Capítulo 2: Predicción de las floraciones de algas presentes en el agua implica el examen microscópico, que requiere personal capacitado, y es por lo tanto caro y lento. Como estos modelos, logrando que sean capaces de precisión predecir las frecuencias de las algas sobre la base de las propiedades químicas facilitaría la creación de sistemas baratos y automatizados para el control de flores de algas nocivas. Otro de los objetivos de este estudio es proporcionar una mejor comprensión de los factores de las frecuencias de las algas. Es decir, queremos entender cómo estas frecuencias están relacionadas con ciertos atributos químicos de las muestras de agua, así como otras características de las muestras (como la estación del año, el tipo de río, etc.) 2.2 Descripción de datos Los datos disponibles para este problema fueron recolectados en el contexto de la red de investigación ERUDIT. y se utiliza en la COIL 1999. Está disponible de varias fuentes, como por ejemplo en la UCI, Maquina de Almacén de aprendizaje de conjunto datos. Hay dos conjuntos de datos principales para este problema. La RST se compone de datos de 200 muestras de agua. Para ser más precisos, cada observación en la disposición de conjuntos de datos se encuentra en efecto una agregación de varias muestras de agua recogidas del mismo río en un período de 3 meses, durante la misma temporada del año. Cada observación contiene información sobre 11 variables. Tres de estas variables son nominales, y describe la temporada del año, cuando las muestras de agua para ser agregada han sido recogidas, así como el tamaño y la velocidad del río en cuestión. Los ocho restantes variables son los valores de los diferentes parámetros Químicos medidos en las muestras de agua que forma la agregación, a saber: • • • • • • • • El valor de pH máximo El valor mínimo de O2 (oxígeno) El valor medio de Cl (cloro) El valor medio del NO3 (nitratos) El valor medio de NH4 (amonio) La media de (ortofosfato) La media de PO4 total (fosfato) La media de la clorofila Asociados a cada uno de estos parámetros son siete el número de la frecuencia de diferentes algas nocivas encontrados en las muestras de agua respectivas. No hay información dada en relación con los nombres de las algas que se identificaron. El segundo conjunto de datos contiene información sobre 140 observaciones adicionales. Utiliza la misma estructura básica, pero no incluye información relativa a la frecuencia de las siete algas nocivas. Estas observaciones adicionales pueden ser consideradas como especie de prueba de datos. El objetivo principal de nuestro estudio es predecir las frecuencias de las siete algas de estas 140 muestras de agua. Esto significa que estamos frente a una tarea de minería 2 Minería de Datos con R Capítulo 2: Predicción de las floraciones de algas predictiva de datos. Este es uno entre el conjunto de los diversos problemas abordado en la minería de datos. En este tipo de tarea, nuestro principal objetivo es obtener un modelo que nos permite predecir el valor de una variable, dados los valores de un conjunto de variables predictoras. Este modelo también puede proporcionar indicaciones sobre las variables de predicción que tienen un mayor impacto en la variable objetivo, es decir, el modelo puede proporcionar una descripción completa de los factores que influyen en la variable objetivo. 2.3 Carga de datos en R Vamos a considerar dos formas de obtener los datos en R: (1) un simplemente tomando ventaja de el paquete que acompaña el libro, que incluye los marcos de datos con los conjuntos de datos lista para su uso, y (2) por otro lado ir al sitio web del libro, descargar el texto de archivos con los datos, y luego cargarlos en R. El primero es, obviamente, mucho más práctico. Se incluye información sobre la segunda alternativa para propósitos ilustrativos sobre cómo cargar datos en R a partir de los textos. Si desea seguir el camino fácil, sólo tiene que cargar el paquete de libros, e inmediatamente tener un marco de datos con el nombre de algea disponibles para su uso. Este cuadro de datos contiene el primer conjunto de las 200 observaciones antes mencionada. > library(DMwR) > head(algae) season size speed mxPH mnO2 1 winter small medium 8.00 2 spring small medium 8.35 3 autumn small medium 8.10 4 spring small medium 8.07 5 autumn small medium 8.06 6 winter small high 8.25 a1 a2 a3 a4 a5 a6 1 0.0 0.0 0.0 0.0 34.2 8.3 2 1.4 7.6 4.8 1.9 6.7 0.0 3 3.3 53.6 1.9 0.0 0.0 0.0 4 3.1 41.0 18.9 0.0 1.4 0.0 5 9.2 2.9 7.5 0.0 7.5 4.1 6 15.1 14.6 1.4 0.0 22.5 12.6 9.8 8.0 11.4 4.8 9.0 13.1 a7 0.0 2.1 9.7 1.4 1.0 2.9 Cl NO3 NH4 oPO4 PO4 Chla 60.800 6.238 578.000 105.000 170.000 50.0 57.750 1.288 370.000 428.750 558.750 1.3 40.020 5.330 346.667 125.667 187.057 15.6 77.364 2.302 98.182 61.182 138.700 1.4 55.350 10.416 233.700 58.222 97.580 10.5 65.750 9.248 430.000 18.250 56.667 28.4 Un marco de datos puede ser visto como una especie de matriz o tabla con las columnas nombre, que es la estructura de datos ideal para la celebración de las tablas de datos en R. El director () función nos muestra las primeras seis líneas de cualquier cuadro de datos. Alternativamente, puede usar el texto en la sección "Datos" del sitio Web del libro. El enlace "Formación de datos" contiene las 200 3 Minería de Datos con R Capítulo 2: Predicción de las floraciones de algas muestras de agua enun fichero llamado "Analysis.txt", mientras que los "datos de prueba" enlace apunta al archivo "Eval.txt" que contiene las muestras de prueba 140. Existe un vínculo adicional que los puntos de un archivo ("Sols.txt") que contiene las frecuencias de las algas de las 140 muestras de ensayo. Este último archivo será utilizado para comprobar el rendimiento de nuestros modelos de predicción y se tomará como información desconocida por el momento. El archivo tiene los valores para cada observación en una línea diferente. Cada línea de la formación y el archivo prueba contiene los valores de las variables (de acuerdo con la descripción dada en la sección 2.2) separados por espacios. Valores desconocidos se indican con la cadena "XXXXXXX". La primera cosa a hacer es descargar los tres archivos de el sitio Web de libro y guardarlos en algún directorio de tu disco duro (de preferencia en el actual el directorio de trabajo de la sesión R de carrera, que usted puede comprobar la emisión del comando getwd() en el sistema). Después de descargar los archivos de datos en un directorio local, podemos empezar por carga en R los datos del archivo "Analysis.txt" (los datos de entrenamiento, es decir, los datos que serán utilizados para obtener los modelos de predicción). Para leer los datos del archivo es suficiente para emitir el siguiente comando > algae <- read.table('Analysis.txt', + header=F, + dec='.', + col.names=c('season','size','speed','mxPH','mnO2','Cl', + 'NO3','NH4','oPO4','PO4','Chla','a1','a2','a3','a4', + 'a5','a6','a7'), + na.strings=c('XXXXXXX')) El encabezado de parámetro = F indica que el archivo para ser leído no incluye una primera línea con los nombres de variables. dec = '.' establece que los números de uso del carácter '.' para separar decimales. Estos dos ajustes de parámetros anteriores podrían haber sido omitido ya que estamos usando los valores por defecto. col.names nos permite ofrecer un vector con los nombres de dar a las variables cuyos valores son que se lee. Por último, na.strings sirve para indicar un vector de cadenas que se interpretan como valores desconocidos. Estos valores se representan internamente en R por el valor de NA 2.4 Visualización de Datos y resumen 4 Minería de Datos con R Capítulo 2: Predicción de las floraciones de algas Dada la falta de información sobre el dominio del problema, es conveniente investigar algunas de las propiedades estadísticas de los datos, a fin de obtener una mejor comprensión del problema. Incluso si eso no fuera el caso, siempre es una buena idea para comenzar nuestro análisis con algún tipo de análisis exploratorio de datos similar al que se muestra a continuación. Un primer concepto de las propiedades estadísticas de los datos puede ser obtenido a través de un resumen de las estadísticas descriptivas: Esta simple instrucción inmediatamente nos da una primera visión general de las propiedades estadísticas de los datos. En el caso de las variables nominales (que son representado por los factores R de cuadros de datos), que proporciona recuentos de frecuencia para cada valor posible. Por ejemplo, podemos observar que hay más muestras de agua recogidos en invierno que en las otras estaciones. 5 Minería de Datos con R Capítulo 2: Predicción de las floraciones de algas Para variables numéricas, R nos da una serie de estadísticas como su media, mediana de, cuartiles y los valores extremos. Estas estadísticas dan una primera idea de la distribución de los valores de las variables (volveremos a este tema más adelante). En el caso de una variable tener algunos valores desconocidos, su número también se muestra después de las cadenas. Al observar la diferencia entre las medianas y los medios, así como el rango intercuartil (3 º cuartil menos el cuartil 1 º), podemos hacernos una idea de la asimetría de la distribución, así como su propagación. Sin embargo, la mayoría de las veces, esta información es mejor captada gráficamente. Veamos un ejemplo: > hist(algae$mxPH, prob = T) Esta instrucción nos muestra el histograma de la mxPH variable. Con el problema de parámetros prob= T tenemos probabilidades de cada intervalo de valores, mientras que la omisión de esta configuración de parámetros que nos dan un recuento de la frecuencia. La siguiente figura nos dice que los valores de la 6 Minería de Datos con R Capítulo 2: Predicción de las floraciones de algas variable de mxPH aparentemente siguen una distribución muy cerca de la distribución normal, con los valores bien agrupados en torno al valor medio. Un control más preciso de esta hipótesis se puede obtener utilizando las parcelas normales de QQ. La gráfica se ha obtenido con el siguiente código: > library(car) > par(mfrow=c(1,2)) > hist(algae$mxPH, prob=T, xlab='', + main='Histogram of maximum pH value',ylim=0:1) > lines(density(algae$mxPH,na.rm=T)) > rug(jitter(algae$mxPH)) > qq.plot(algae$mxPH,main='Normal QQ plot of maximum pH') > par(mfrow=c(1,1)) Después de cargar el paquete, el código comienza con una llamada a la par () la función que se puede utilizar para configurar varios parámetros del sistema de R gráficos. En este caso, estamos dividiendo la ventana de salida de gráficos en una línea de una en dos columnas de la zona, con el objetivo de obtener dos gráficos lado a lado en la misma figura. A continuación, obtenemos la primera gráfica, que es otra vez un histograma de la variable mxPH, excepto que esta vez se especifica un vacío del eje X, el cambio. Cambiamos el título de la gráfica, y proporcionar otros tipos de límites para el eje. La siguiente instrucción dibuja una versión suave del histograma (una estimación de la densidad del núcleo de la distribución de la variable), mientras que las parcelas después de los valores reales de la variable cerca del eje X, lo que permite fácil localización de los valores extremos 7 Minería de Datos con R Capítulo 2: Predicción de las floraciones de algas Por ejemplo, podemos observar que hay dos valores significativamente menor que todos los demás. Este tipo de inspección de datos es muy importante ya que puede identificar posibles errores en la muestra de datos, o incluso ayudar a localizar a los valores que son tan poco prácticos que sólo puede haber errores, o al menos sería mejor o despreciarlos en el análisis posterior. El segundo gráfico muestra una parcela Q-Q obtenidos con la qq.plot(), la cual representa los valores de las variables en contra los cuantiles teóricos de una distribución normal (línea de color negro sólido). La función también traza sobre un intervalo de confianza del 95% de la distribución normal (líneas discontinuas). Como podemos observar, hay varios valores bajos de la variable que claramente rompe la hipótesis de una distribución normal con 95% de Confianza. También debe tener en cuenta el amplio uso de la composición de funciones en el anterior ejemplo, con varias funciones que se llama con el resultado de otras funciones. Cada vez que se dificulte la comprensión de este tipo de instrucción, siempre se les puede llamar por separado, uno a la vez, para entender completamente lo que producen. Otro ejemplo que muestran este tipo de inspección de datos, se puede lograr con las siguientes instrucciones, esta vez para la variable oPO4 > boxplot(algae$oPO4, ylab = "Orthophosphate (oPO4)") > rug(jitter(algae$oPO4), side = 2) > abline(h = mean(algae$oPO4, na.rm = T), lty = 2) 8 Minería de Datos con R Capítulo 2: Predicción de las floraciones de algas La primera instrucción dibuja un diagrama de caja de variable oPO4. Los diagramas de caja proporcionan un resumen rápido de algunas de las propiedades clave de la distribución variable. Es decir, hay una caja cuyos límites verticales son el primer y tercer cuartiles de lavariable. Este cuadro tiene una línea horizontal en el interior que representa el valor de la mediana de la variable. Sea r el rango intercuartil. La pequeña raya horizontal por encima de la caja es la observación más grande que es menor o igual al tercer cuartil más 1.5.x r. El tablero pequeño horizontal debajo de la caja es la más pequeña observación que es mayor o igual al primer cuartil menos r. x 1.5. Los círculos por debajo o por encima de estos guiones pequeños representan las observaciones que son extremadamente bajas (altas) en comparación con todos los demás, y se consideran por lo general los valores extremos. Esto significa que los diagramas de caja nos dan un montón de información con respecto a no sólo el valor central y dispersión de la variable, sino también los valores extremos eventuales. La segunda instrucción se ha descrito antes (la única diferencia puede ser el lugar donde se trazan los datos), mientras que el tercero utiliza la función abline() para trazar una línea horizontal en la parte media de la variable, que se obtiene utilizando la función media (). Al comparar esta línea con la línea dentro de la caja lo que indica la mediana, podemos concluir que la presencia de valores atípicos varios ha distorsionado el valor de la media como una estadística de la centralidad (i.e, indicando el valor más común de la variable). 9 Minería de Datos con R Capítulo 2: Predicción de las floraciones de algas El análisis de la figura 2.3 nos muestra que la variable de oPO4 tiene una distribución de los valores observados claramente concentrado en los valores bajos, por lo tanto con un sesgo positivo. En la mayoría de las muestras de agua, el valor de oPO4 es baja, pero hay varias observaciones con valores altos, e incluso con tasas de valores extremadamente altas. A veces, cuando nos encontramos con los valores atípicos, estamos interesados en la inspección de las observaciones que tienen estos "extraños" valores. Vamos a mostrar dos maneras de hacer esto. En primer lugar, vamos a hacerlo de forma gráfica. Si graficamos los valores de la variable de NH4, que cuenta un valor muy grande. Podemos identificar la respectiva muestra de agua: > plot(algae$NH4, xlab = "") > abline(h = mean(algae$NH4, na.rm = T), lty = 1) > abline(h = mean(algae$NH4, na.rm = T) + sd(algae$NH4, na.rm = T), + lty = 2) > abline(h = median(algae$NH4, na.rm = T), lty = 3) > identify(algae$NH4) La primera instrucción grafica todos los valores de la variable. Las llamadas a la función abline() dibuja tres líneas informativas, una con el valor medio, otra con la media más una desviación estándar, y el otro con la mediana. No son necesarios para esta tarea la identificación. La última instrucción es interactiva y permite al usuario hacer clic en los puntos trazados con el botón izquierdo del ratón. Para cada punto se hace clic, R escribirá el número de fila correspondiente en el cuadro de los datos de las algas. El usuario puede terminar la interacción haciendo clic en el botón derecho del ratón. Si queremos examinar las observaciones respectivas en el cuadro de los datos de las algas, entonces es mejor proceder de la siguiente manera: > plot(algae$NH4, xlab = "") > clicked.lines <- identify(algae$NH4) > algae[clicked.lines, ] Como ya habrás imaginado antes, la función identificar (), da como resultado el número de las líneas correspondientes a los puntos de clic en el gráfico y por lo tanto podemos tomar ventaja de este hecho al índice del marco de datos de algas, por lo tanto obtener la información completa sobre estas observaciones. También podemos realizar esta inspección sin gráficos, como se muestra a continuación: > algae[algae$NH4 > 19000, ] 10 Minería de Datos con R Capítulo 2: Predicción de las floraciones de algas Esta instrucción ilustra otra forma de indexación de una trama de datos, utilizando una expresión lógica, como un selector de fila (véase la Sección 1.2.7 para más ejemplos de esta). La salida de esta instrucción puede parecer un poco extraña. Esto da como resultado del hecho de que hay algunas observaciones con valores de NA en la variable NH4. Por estas observaciones, R es incapaz de conocer el resultado de la comparación y por lo tanto la NAs. Podemos evitar este comportamiento mediante la emisión en lugar de la instrucción algea [! is.na (algea $ NH4) y algea $ NH4> 19000,]. La llamada a la función is.na () produce un vector de valores booleanos (true o false).Un elemento de este vector es cierto cuando NH4 es NA. Este vector tiene tantos elementos como filas hayan en el marco de datos algea. La construcción ! is.na (algas $ NH4), lo que devuelve un vector de valores booleanos que son verdaderas en posiciones correspondientes a las filas donde NH4 se sabe, porque '!' es el operador lógico de negación. En resumen, esta llamada alternativa que nos daría las filas del marco de datos que han conocido los valores de NH4 y son mayores de 19.000. Exploremos ahora algunos ejemplos de otro tipo de inspección de datos. Estos ejemplos utilizan la red (Sarkar, 2010) el paquete de R, que ofrece un amplio conjunto de herramientas gráficas impresionantes aplicación de las ideas detrás de enrejado gráficos (Cleveland, 1993). Supongamos que queremos estudiar la distribución de los valores de, por ejemplo, las algas a1. Podríamos utilizar cualquiera de las posibilidades discutidas antes. Sin embargo, si quería estudiar cómo esta distribución depende de otras variables, las nuevas herramientas se requieren. Gráficos acondicionados son representaciones gráficas que dependen de un cierto factor. Un factor es una variable nominal con un conjunto de valores finito. Por ejemplo, podemos obtener un conjunto de diagramas de caja para la variable a 1, para cada valor de la variable tamaño (ver figura 2.4). Cada uno de los diagramas de caja se obtuvieron usando el subconjunto de muestras de agua que tienen un cierto valor de la variable tamaño. Estos gráficos nos permiten estudiar cómo esta variable nominal puede influir en la distribución de los valores de A1. El código para obtener los diagramas de caja es: > library(lattice) > bwplot(size ~ a1, data=algae, ylab='River Size',xlab='Algal A1') La primera instrucción se carga en el paquete de red. El segundo obtiene un diagrama de caja utilizando la versión de red de estas graficas. El primer argumento de esta instrucción se puede leer como "a1 parcela para cada valor de tamaño". El resto de argumentos tienen un significado obvio. La Figura 2.4 nos permite observar que las frecuencias más altas de alga a1 son las esperadas en los ríos más pequeños, lo cual aporta valiosos conocimientos. Una variante interesante de este tipo de trama que nos da más información sobre la distribución de las variables que se traza, se percentil caja de parcelas, que están disponibles en Hmisc paquete. Veamos un ejemplo de su uso con las mismas algas a1 contra el tamaño de los ríos: 11 Minería de Datos con R Capítulo 2: Predicción de las floraciones de algas > library(Hmisc) > bwplot(size ~ a1, data=algae,panel=panel.bpplot, + probs=seq(.01,.49,by=.01), datadensity=TRUE, + ylab='River Size',xlab='Algal A1') El resultado de esta llamada se muestra en la siguiente figura. Los puntos son el valor medio de la frecuencia de las algas para los tamaños de río diferente. Las líneas verticales representan el primer cuartil, la mediana y tercer cuartil, en ese orden. Los gráficos nos muestran los valores reales de los datos con guionespequeños, y la información de la distribución de estos valores es proporcionado por las graficas cuantil. Estos gráficos por lo tanto proporcionan mucha más información que diagramas de caja estándar. Por ejemplo, podemos confirmar nuestra observación anterior que los ríos más pequeños tienen frecuencias más altas de esta alga, pero se puede observar también que el valor de las frecuencias observadas para estos pequeños ríos es mucho más generalizada en todo el dominio de las frecuencias que para otros tipos de ríos. Este tipo de grafica acondicionada no se limita a las variables nominales, ni a un solo factor. Puede llevar a cabo el mismo tipo de estudio acondicionado con las variables continuas, siempre y cuando exista previamente un "discretizado" de ellos. Vamos a ver un ejemplo al observar el comportamiento de la frecuencia de las algas a3 acondicionado según la estación y mnO2, siendo esta última 12 Minería de Datos con R Capítulo 2: Predicción de las floraciones de algas una variable continua. La siguiente figura muestra un gráfico y el código para lograr lo siguiente: > minO2 <- equal.count(na.omit(algae$mnO2), + number=4,overlap=1/5) La primera instrucción utiliza equal.count function () para crear una versión del MnO2 variable continua factorizada. El número de parámetro establece el número de contenedores que desee, mientras que la superposición de los conjuntos de parámetros de la superposición entre los contenedores cerca de sus respectivos límites (esto significa que algunas observaciones se le asignarán a los contenedores adyacentes). Los contenedores se crean de tal manera que contienen un número igual de observaciones. Usted puede haber notado que no hemos usado algea $ MnO2 directamente. La razón es la presencia de valores de NA en esta variable. Esto podría causar problemas en la función de los gráficos siguientes. Hemos utilizado la función na.omit () que elimina cualquier valor de NA de un vector. La segunda línea contiene la llamada a la función gráfica stripplot (). Esta es otra de las funciones gráficas del paquete de red. Se crea un gráfico que contiene los valores reales de una variable, en tiras diferentes en función de otra variable (en este caso la temporada). Gráficos diferentes son dibujados para cada intervalo de 13 Minería de Datos con R Capítulo 2: Predicción de las floraciones de algas la variable de mnO2. Los contenedores están ordenados de izquierda a derecha y de abajo hacia arriba. Esto significa que la grafica inferior izquierda corresponde a los valores más bajos de mnO2. La existencia de valores de NA en mnO2 también tiene algún impacto en los datos que se utiliza para dibujar el gráfico. En lugar de utilizar los datos de parámetros = algea (como la creación de la figura 2.4), que tuvo que "eliminar" a los filas correspondientes a las muestras con valores de NA en mnO2. 2.5 Los valores desconocidos Hay varias muestras de agua con valores desconocidos en algunas de las variables. Esta situación, bastante común en los problemas del mundo real, puede impedir el uso de ciertas técnicas que no son capaces de manejar los valores faltantes. Cada vez que estamos manejando un conjunto de datos con valores perdidos, podemos seguir varias estrategias. Los más comunes son: • • • • Retire los casos de incógnitas. Rellene los valores desconocidos mediante la exploración de las correlaciones entre las variables. Rellene los valores desconocidos mediante la exploración de la similitud entre los casos. Use herramientas que son capaces de manejar estos valores. 14 Minería de Datos con R Capítulo 2: Predicción de las floraciones de algas La última alternativa es la más restrictiva, ya que limita el conjunto de herramientas que se puede usar. No obstante, puede ser una buena opción siempre que se confié en el mérito de las estrategias utilizadas por las herramientas de minería de datos para manejar los valores faltantes. En las siguientes secciones vamos a mostrar ejemplos de cómo poner en práctica estas estrategias en R. Si usted decide probar el código indicado en estas secciones, deben ser conscientes de que no son complementarios. Esto significa que a medida que se vaya a otro método se debe tratar con los valores que faltan, debe leer de nuevo los datos originales para todos los casos desconocidos de nuevo, como cada sección maneja de una manera diferente. La forma más fácil de hacer esto es ejecutar el siguiente código: > library(DMwR) > data(algae) 2.5.1 Eliminación de las observaciones con valores desconocidos La opción de eliminar los casos con valores desconocidos es muy fácil de implementar, y también puede ser una opción razonable, cuando la proporción de casos con incógnitas son pequeños con respecto al tamaño del conjunto de datos disponibles. Antes de la eliminación de todas las observaciones con al menos un valor desconocido en alguna variable, siempre es aconsejable echar un vistazo, o al menos contar con: > algae[!complete.cases(algae),] ... ... > nrow(algae[!complete.cases(algae),]) La función complete.cases () produce un vector de valores booleanos con tantos elementos como filas haya en el marco de datos algea, un elemento es cierto si la fila respectiva esta "clean" de los valores de NA (i.e., es una observación completa). Así, la instrucción de arriba muestra las muestras de agua con algunos valores NA debido a que el operador '!' realiza una negación lógica, como se mencionó antes. Con el fin de eliminar estas 16 muestras de agua de nuestra hoja de datos, podemos simplemente hacer: > algae <- na.omit(algae) Incluso si decide no utilizar este método drástico para eliminar todos los casos con un valor desconocido, podemos eliminar algunas observaciones porque el número de valores desconocidos es tan alta que es casi inútil, y complejo, incluso métodos el de rellenar estos valores será muy poco fiable. Tenga en cuenta que si usted ha 15 Minería de Datos con R Capítulo 2: Predicción de las floraciones de algas ejecutado el comando anterior, usted debe leer los datos de nuevo, ya que esta instrucción ha eliminado todas las incógnitas, por lo que la siguiente sentencia no tendría sentido. En cuanto a los casos de incógnitas, podemos ver que tanto las muestras 62 y 199 tienen seis de las once variables explicativas con valores desconocidos. En estos casos, es prudente hacer caso omiso de estas observaciones, simplemente mediante la eliminación de ellos: > algae <- algae[-c(62, 199), ] En los problemas donde la inspección visual de todos los casos con incógnitas es inviable debido a su número, tenemos que ser capaces de encontrar las filas con un gran número de nuevos NAs. El siguiente código te da el número de valores desconocido de cada fila del conjunto de datos de algea: > apply(algae, 1, function(x) sum(is.na(x))) La función apply () pertenece a un conjunto de funciones muy potentes de R. Estas funciones son a veces conocidas como meta-funciones y permitir la aplicación de otras funciones a los objetos bajo ciertas condiciones. En el caso de la función apply (), podemos utilizarla para aplicar una función a una de las dimensiones de un objeto multidimensional. El uso de la función apply () que se está ejecutando un la función en todas las filas del cuadro de datos. Esta función, específicamente en la tercera edición argumento de la aplicación (), se llamará a cada fila de la trama de datos. La la función que hemos proporcionado en este caso es una función temporal. Es temporal ya que sólo existe dentro de la llamada de apply (). Por otra parte, podría haber suministrado el nombre de una función "normal". La función temporal básicamente calcula el número de nuevos NAs en el objeto x de su argumento. Tomar ventaja de este factor que un valor true en R es equivalente a el numero 1 y false vale 0 lo que significa que cuando se suma un vector de valores booleanos, se obtiene cuantos TRUE existen en el vector. En base a este código, podemos crear una función que nos da las filas en algae que tienen un cierto número de incógnitas. Tal función está disponible en el paquete de libro y se puede utilizar de la siguiente manera: > data(algae) > manyNAs(algae, 0.2) La llamada a data() sólo es necesario si previamente se han eliminado la filas con una gran cantidad de incógnitas. La función manyNAs () proporciona los números de fila que, en este caso, tienen más del 20% de las columnas con NA. En el segundo argumento puede alternativamente, proporcionar el número exacto de columnas que usted desea considerar como límite. Por lo tanto, una alternativa al 16 Minería de Datos con R Capítulo 2: Predicción de las floraciones de algas código dado antes, que no requiere saber el número de las filas con una gran cantidad de incógnitas es > algae <- algae[-manyNAs(algae), ] En este caso hemos usado el valor predeterminado del segundo argumento de manyNAs(), que es de 0,2. 2.5.2 Llenado de los Desconocidos con los valores más frecuentes Una alternativa a la eliminación de los casos con valores desconocidos es para tratar de encontrar el valor más probable para cada una de estas incógnitas. Una vez más, varias estrategias se pueden seguir, con diferentes soluciones de compromiso entre el nivel de aproximación y la complejidad computacional del método. La forma más sencilla y rápida de llenar los valores desconocidos es el uso de algunas estadísticas de la centralidad. Estas estadísticas reflejan el valor más frecuente de una distribución variable, por lo tanto son una elección natural para esta estrategia. Varias estadísticas de la centralidad de existir, al igual que la media, mediana, modo, etc La elección del valor más adecuado depende de la distribución de la variable. Para la distribución aproximadamente normal, donde todas las observaciones son bien agrupadas en torno a la media, esta estadística es la mejor opción. Sin embargo, para distribuciones asimétricas, o de las variables con valores extremos, la media puede ser desastrosa. Las distribuciones asimétricas tienen la mayoría de los valores agrupados cerca de uno de los lados de la rango de valores de la variable, por lo que la media no es claramente representativo de la el valor más común. Por otro lado, la presencia de valores atípicos (extremos valores) puede distorsionar el cálculo de la media, lo que conduce a similares problemas de representatividad. Por lo tanto, no es conveniente utilizar la media, sin una inspección anterior de la distribución de la variable usando, por ejemplo, algunas de las herramientas gráficas de R (por ejemplo, la Figura 2.2). Para distribuciones sesgadas o para las variables con valores extremos, la mediana es una mejor estadística de la centralidad. Por ejemplo, las algas de la muestra [48], no tiene valor en la variable mxPH. A medida que la distribución de esta variable es casi normal que podría usar su valor medio para llenar el "hueco". Esto podría ser realizado por > algae[48, "mxPH"] <- mean(algae$mxPH, na.rm = T) Donde la función mean() da el valor medio de un vector de números, y na.rm = T no tiene en cuenta los valores de NA en este vector en el cálculo. 17 Minería de Datos con R Capítulo 2: Predicción de las floraciones de algas La mayoría de las veces estaremos interesados en la cumplimentación de todas las incógnitas de una columna en lugar de trabajar sobre una base caso por caso que el anterior. Veamos un ejemplo de esto con el CHLA variable. Esta variable no es conocida en 12 muestras de agua. Por otra parte, se trata de una situación fuera de la media es un representante muy pobre de el valor más frecuente de la variable. En efecto, la distribución de la CHLA es sesgada hacia valores más bajos, y hay algunos valores extremos que hacen que la media valor (13.971) muy poco representativo del valor más frecuente. Por lo tanto, vamos a utilizar el medio para llenar todas las incógnitas en esta columna, > algae[is.na(algae$Chla), "Chla"] <- median(algae$Chla, na.rm = T) La función centralImputation(), disponible en el paquete de libros, llena en todas las incógnitas en un conjunto de datos con una estadística de la centralidad. Esta función utiliza la mediana para las columnas numéricas y utiliza el valor más frecuente (la moda) para las variables nominales. Usted puede utilizarlo de la siguiente manera: > data(algae) > algae <- algae[-manyNAs(algae), ] > algae <- centralImputation(algae) Aunque la presencia de valores desconocidos pueden poner en peligro el uso de algunos métodos, llenar sus valores usando una estrategia que el anterior se considera generalmente como un mal idea. Esta estrategia simple, aunque muy rápido, y por lo tanto atractiva para grandes conjuntos de datos, puede introducir un sesgo importante en los datos, que pueden influir en nuestra el análisis posterior. Sin embargo los métodos imparciales, que encontrar el valor óptimo para rellenar un desconocido son extremadamente complejos y pueden no ser adecuados para algunos grandes problemas de minería de datos. 2.5.3 Llenado de los valores desconocidos mediante la exploración de correlaciones Una alternativa para obtener los estimadores menos sesgados de los valores desconocidos es explorar las relaciones entre las variables. Por ejemplo, utilizando la correlación entre los valores de las variables, podríamos descubrir que una determinada variable es muy correlacionado con mxPH, que nos permiten obtener otros, valores más probables para el número de la muestra 48, que cuenta con un desconocido en esta variable. Este puede ser preferible el uso de la media como lo hicimos anteriormente. Para obtener la correlación de las variables que puede ejecutar el comando 18 Minería de Datos con R Capítulo 2: Predicción de las floraciones de algas > cor(algae[, 4:18], use = "complete.obs") La función Cor() produce una matriz con los valores de correlación entre las variables (hemos evitado las primeras 3 variables/columnas porque son nominales). El uso de la opción de R = "complete.obs" indica hacer caso omiso de las observaciones con valores de NA en este cálculo. Valores cercanos a 1 (-1) indican una fuerte y positiva (negativo) de correlación lineal entre los valores de los respectivos dos variables. Otras funciones de R podría ser utilizado para aproximar el funcionamiento forma de esta correlación lineal, que a su vez nos permiten estimar el los valores de una variable a partir de los valores de la variable relacionada. El resultado de esta función cor() no es muy legible, pero podemos ponerlo a través de la función symnum () para mejorar esto: > symnum(cor(algae[,4:18],use="complete.obs")) 19 Minería de Datos con R Capítulo 2: Predicción de las floraciones de algas Antes de analizar la información proporcionada por la función summary() cuando se aplica a los modelos lineales, digamos algo acerca de cómo manejar el R tres variables nominales. Cuando se utiliza como se muestra arriba, R va a crear un conjunto de las variables auxiliares. Es decir, para cada variable de factor con los niveles k, R crear k-1 variables auxiliares. Estas variables tienen los valores 0 o 1. Un valor de 1 significa que el valor asociado del factor está "presente", y que También significa que las variables auxiliares otro tendrá el valor 0. Si todos los k – 1 las variables son 0, entonces significa que la variable de factor tiene el resto de KTH de valor. Volviendo al resumen presentado anteriormente, podemos ver que R ha creado tres variables auxiliares para la temporada de los factores (seasonspring, seasonsummer y seasonwinter). Esto significa que si tenemos una muestra de agua con la valor de "otoño" en la temporada de variable, las tres variables auxiliares se ajustará a cero. La aplicación del resumen function () a un modelo lineal da una información de diagnóstico sobre el modelo obtenido. En primer lugar, hemos información relativa a los residuos (es decir, los errores) de la t de la lineal modelo a los datos utilizados. Estos residuos deben tener una media 20 Minería de Datos con R Capítulo 2: Predicción de las floraciones de algas de cero y debe tienen una distribución normal (y, obviamente, ser tan pequeño como sea posible). Para cada coeficiente (variable) de la ecuación de regresión múltiple, R mostrar su valor y su error estándar (una estimación de la variabilidad de los estos coeficientes). Con el fin de comprobar la importancia de cada coeficiente, se puede la hipótesis de que cada uno de ellos es nulo, es decir, H0: i = 0. Para poner a prueba esta hipótesis, el t-test se utiliza normalmente. R calcula un valor de t, que es definido como el cociente entre el valor del coeficiente y su error estándar, que es decir, Bi/sBi. R nos mostrará una columna (Pr (> | t |)) asociados a cada coeficiente con el nivel en el que la hipótesis de que el coeficiente es nula es rechazada. Así, un valor de 0,0001 tiene el significado que estamos seguros de que el 99,99% el coeficiente no es nulo. R marcas de cada prueba con el símbolo correspondiente a un conjunto de niveles comunes de Con cia para realizar dichas pruebas. En resumen, sólo de los coeficientes que tienen algún símbolo en frente de ellos podemos rechazar la hipótesis de que puede ser nulo con anza al menos el 90%.En resumen, sólo de los coeficientes que tienen algún símbolo en frente de ellos podemos rechazar la hipótesis de que puede ser nulo, con al menos el 90% de confianza. Otra pieza de información de diagnóstico relevante reproducidas por R son los R2 coeficientes (múltiples y ajustado). Estos indican el grado de t del modelo a los datos, es decir, la proporción de la varianza en los datos que es explicada por el modelo. Valores cercanos a 1 son mejores (casi el 100% se explica varianza) mientras que los más pequeños los valores, mayor es la falta de t. El coeficiente R2 ajustado es más exigente, ya que toma en cuenta el número de parámetros del modelo de regresión. > anova(lm.a1) 21 Minería de Datos con R Capítulo 2: Predicción de las floraciones de algas Estos resultados indican que la variable season es la variable menos que contribuye a la reducción del error de ajuste del modelo. Quitémosla del modelo: > lm2.a1 <- update(lm.a1, . ~ . - season) La función update() se puede utilizar para realizar pequeños cambios en un modelo lineal existente. En este caso lo usamos para obtener un nuevo modelo mediante la eliminación de la variable season del modelo lm.a1. La información de summary de este nuevo modelo es la siguiente: 22 Minería de Datos con R Capítulo 2: Predicción de las floraciones de algas El t ha mejorado un poco (32,8%), pero todavía no es demasiado impresionante. Se puede llevar a cabo una comparación más formal entre los dos modelos mediante el usando de nuevo la función ANOVA(), pero esta vez con los dos modelos como argumentos: > anova(lm.a1,lm2.a1) 23 Minería de Datos con R Capítulo 2: Predicción de las floraciones de algas Esta función realiza un análisis de varianza de los dos modelos que utilizan un Ftest para evaluar la importancia de las encontró diferencia. En este caso, aunque la suma de los errores al cuadrado se ha reducido (-448), la comparación muestra que la encontró diferencia no es significativa (un valor de 0,6971 nos dice que con sólo alrededor del 30% de confianza se puede decir que son diferentes). 2.6.2 Los árboles de regresión Veamos ahora en otro tipo de modelo de regresión disponible en R. Es decir, vamos a aprender cómo obtener un árbol de regresión (e.g., Breiman et al., 1984) para predecir el valor de las frecuencias de las algas a1. A medida que estos modelos de manejar bases de datos con valores perdidos, sólo tenemos que extraer muestras de 62 y 199 por las razones se mencionó antes. Las instrucciones necesarias para obtener un árbol de regresión se presentan a continuación: > library(rpart) > data(algae) > algae <- algae[-manyNAs(algae), ] > rt.a1 <- rpart(a1 ~ ., data = algae[, 1:12]) La primera instrucción para cargar rpart (Therneau y Atkinson, 2010) pagina que implementa la regresión por árboles en R. La última instrucción obtiene el árbol. Tenga en cuenta que esta función utiliza el mismo esquema que el lm () para describir la forma funcional del modelo. El segundo argumento de rpart () indica que los datos a utilizar para obtener el árbol. El contenido del objeto rt.a1 objeto es el siguiente: 24 Minería de Datos con R Capítulo 2: Predicción de las floraciones de algas Un árbol de regresión es una jerarquía de pruebas lógicas sobre algunas de las variables explicativas. Modelos basados en árbol automáticamente seleccionan las variables más relevantes, y por esta razón, no todas las variables necesitan aparecer en el árbol. El árbol es leído desde el nodo raíz que es marcado por R con el número 1. R provee alguna información de los datos en este nodo. Se puede observar que hay 198 muestras para este nodo (corresponde a los datos de entrenamiento utilizados para generar el árbol), esas 198 muestras tienen un valor promedio para la frecuencia del tipo de alga a1 de 16.99 y su desviación respecto a este valor es 90401.29. Cada nodo del árbol tiene dos ramas, las cuales están relacionadas con el resultado de la prueba sobre una de las variables predictoras. Por ejemplo, desde el nodo raíz se tiene una rama (etiquetada por R con “2)”) para los casos donde la prueba “PO4≥43.818” es verdadera (147 muestras cumplen esa condición) y también una rama para los 51 casos restantes que no satisfacen esa condición (marcada con R con “3)”). Desde el nodo 2 se tienen otras dos rama hacia los nodos 4 y 5, dependiendo del resultado de la prueba sobre la variable Cl. Esta prueba continua hasta que un nodo hoja es alcanzado. Estos nodos son marcados con un asterisco por R. estas hojas tienen las predicciones del árbol. Esto significa que si se desea utilizar un árbol para obtener una predicción para 25 Minería de Datos con R Capítulo 2: Predicción de las floraciones de algas una muestra de agua particular, solo se necesita seguir una rama desde el nodo raíz hasta una hoja, de acuerdo al resultado de la prueba para esta muestra. El valor promedio encontrado para la variable objetivo hasta la hoja que se ha alcanzado es la predicción del árbol. También se puede obtener una representación gráfica del árbol. Esto se puede efectuar aplicando repetidamente las funciones plot() y text() para el árbol. Estas funciones tienen varios parámetros para controlar la visualización del árbol. Para facilitar la obtención del gráfico se ha incluido la función prettyTree(). > prettyTree(rt.a1) Existe una estrategia utilizada por R en los arboles de regresión para manejar valores faltantes y es conocida como divisiones o particiones sustitutas. Los arboles son usualmente obtenidos en dos pasos. Inicialmente, un árbol de gran tamaño está creciendo y después este árbol es podado eliminando los nodos inferiores a través del proceso de estimación estadística. Este proceso tiene como finalidad evitar el sobreajuste. Esto se presenta cuando arboles de gran tamaño se ajustan perfectamente al conjunto de datos de entrenamiento, pero posteriormente presentan un desempeño bajo cuando se enfrentan a nuevos datos para obtener las respectivas predicciones. La función rpart() que se ha utilizado para obtener el árbol, solo hace crecer el árbol, deteniéndose cuando cierto criterio se alcanza. El árbol para de crecer cuando: 26 Minería de Datos con R Capítulo 2: Predicción de las floraciones de algas 1) El decremento de la desviación va por debajo de cierto umbral. 2) El número de muestras en el nodo es menor que otro umbral. 3) La profundidad del árbol excede otro valor. Estos umbrales son controlados por los parámetros cp, minsplit y maxdepth, respectivamente. Por defecto estos valores son 0.01, 20 y 30, respectivamente. Si se desea evitar el problema del sobreajuste se debe verificar la validez de estos criterios. El paquete rpart implementa un método para podar llamado costo de complejidad de podar. Este método utiliza el valor del parámetro cp que R calcula para cada nodo del árbol. Este método para podar trata de estimar el valor de cp que asegura el mejor compromiso entre la precisión predictiva y el tamaño del árbol. Dado un árbol obtenido con la función rpart(), R puede producir un conjunto de sub-arboles de este árbol y estimar su desempeño predictivo. Esta información puede ser obtenida utilizando la función printcp(). El árbol producido por la función rpart() es el ultimo árbol de esa lista (árbol 9). Este árbol tiene un valor de cp de 0.01 (el valor por defecto de ese parámetro), incluye nueve pruebas y tiene un error relativo (comparado con el nodo raíz) de 0.354. Sin embargo, R estima, utilizando un proceso interno de 10 veces la 27 Minería de Datos con R Capítulo 2: Predicción de las floraciones de algas validación cruzada que este árbol tendrá en promedio un error relativo de 0.70241±0.11523. Utilizando la información provista por estas estimaciones de desempeño más confiables, la cual evita el problema de sobreajuste, se puede observar que teóricamente podría tener un mejor ajuste con el árbol número 8, el cual tiene un error relativo estimado menor (0.67733). Una regla de selección alternativa es escoger el mejor árbol de acuerdo a la regla 1-SE, la cual consiste en mirar el error estimado para la validación cruzada (columna “xerror”) y su desviación estándar (columna “xstd”). La función rpartXse() automatiza este proceso y toma como argumento ese valor, por defecto es 1: 2.7. Evaluación y selección de modelos. Existen varios criterios para la evaluación y comparación de modelos, siendo el más popular el cálculo del desempeño predictivo. Aun así, existen otros criterios tales como la interpretabilidad del modelo, o la eficiencia computacional, que puede ser importante para problemas grandes de minería de datos. 28 Minería de Datos con R Capítulo 2: Predicción de las floraciones de algas El desempeño predictivo de los modelos de regresión es obtenido comparando las predicciones de los modelos con los valores reales de las variables objetivo, y calcular alguna medida de error promedio de esta comparación. Tal medida es el error medio absoluto (MAE, por sus siglas en inglés). Para los ejemplos que se han venido presentando se tendrá esta medida para los dos modelos obtenidos (regresión lineal y árbol de regresión). El primer caso es obtener las predicciones del modelo para el conjunto de casos donde se quiere evaluar. Para obtener las predicciones de cualquier modelo en R, se utiliza la función predict(). La cual recibe un modelo y prueba un conjunto de datos arrojando las correspondientes predicciones del modelo: Estas dos instrucciones poseen las predicciones de los modelos obtenidos en la sección 2.6 para el tipo de alga a1. Note que se ha usado la instrucción clean.algae sobre el data frame del modelo lineal debido a los datos faltantes. Una vez que se tienen las predicciones de los modelos, se calcula su error absoluto medio como se muestra a continuación: Otra conocida medida para el error es el error cuadrático medio (MSE, por sus siglas en inglés). Esta medida se obtiene de la siguiente manera: La desventaja de este estadístico es que no está siendo medido en las mismas unidades que la variable objetivo, y así es menos interpretable desde la perspectiva del usuario. Aun si se utiliza el estadístico MAE, la pregunta es ¿Cuándo el valor obtenido es considerado como bueno o malo? 29 Minería de Datos con R Capítulo 2: Predicción de las floraciones de algas Una alternativa estadística que provee una respuesta razonable es el error cuadrático medio normalizado (NMSE, por sus siglas en inglés). Este estadístico calcula un radio entre el desempeño de los modelos y una línea base predictora, usualmente tomada como el valor medio de la variable objetivo, el código se muestra a continuación: La figura muestra un ejemplo de este tipo de análisis para las predicciones de los dos modelos, y se produjo con el siguiente código: 30 Minería de Datos con R Capítulo 2: Predicción de las floraciones de algas Observando la figura se puede apreciar que los modelos presentan un pobre desempeño en ambos casos. El escenario ideal, donde se hicieran correctamente las predicciones para todos los casos, se identificaría por la ubicación de todos los círculos sobre la línea punteada, la cual se genera con el comando abline(0,1,lty=2). Dado que cada círculo en el gráfico obtiene su coordenada de los valores predichos y verdaderos de la variable objetivo, si esos valores son iguales, los círculos deberían estar ubicados sobre la línea. Como se puede observar, este no es el caso. Se puede verificar cual es el número de la muestra donde se realizo particularmente una mala predicción, esto se efectúa a través de la función identify(), la cual se ha utilizado haciendo “click” interactivamente sobre los puntos del gráfico, el código se muestra a continuación: Mirando la figura anterior (parte izquierda) con las predicciones del modelo lineal, se puede apreciar que este modelo predice frecuencias negativas para las algas en algunos casos. En este dominio de la aplicación, no tiene sentido decir que una ocurrencia de una alga en una muestra de agua sea negativa (como mínimo, puede ser cero). Así, se puede tomar ventaja y utilizar el mínimo valor como una forma de mejorar el desempeño del modelo lineal, lo cual se efectúa a través del siguiente código: Se ha utilizado la función ifelse() para alcanzar este efecto. Esta función tiene tres argumentos. El primero es una condición lógica, el segundo es el resultado de una llamada a la función cuando la condición es verdadera, mientras que el tercer 31 Minería de Datos con R Capítulo 2: Predicción de las floraciones de algas argumento es el resultado cuando la condición es falsa. Note como este pequeño detalle ha incrementado el desempeño del modelo. De acuerdo a medidas de desempeño calculadas previamente, se debería preferir el árbol de regresión para obtener las predicciones para las 140 muestras de prueba ya que se obtuvo un menor valor de NMSE. Sin embargo, se ha analizado la capacidad predictiva del modelo sobre los mismos datos de entrenamiento, y el factor clave es obtener una estimación confiable del desempeño de un modelo sobre datos para los cuales no se conocen los verdaderos valores de la variable objetivo. La validación cruzada k-fold está entre los métodos frecuentemente utilizados para obtener estas estimaciones confiables para pequeños conjuntos de datos como en este caso de estudio. Este método puede ser descrito brevemente como se describe a continuación. Se obtienen k subconjuntos aleatorios y de igual tamaño, de los datos de entrenamiento. Para cada uno de esos k subconjuntos, se construye un modelo utilizando los k-1 subconjuntos restantes y se valúa este modelo para el subconjunto k. Se almacena el desempeño del modelo y se repite el proceso para los subconjuntos restantes. Al final, se tienen k medidas de desempeño, todas obtenidas probando un modelo sobre datos no utilizados para su construcción, y ese es el factor clave. La validación cruzada k-fold estima el promedio de estas k medidas. Una escogencia común es tomar k igual a 10. Algunas veces se repite el proceso varias veces para obtener estimaciones más confiables. En este ejemplo ilustrativo, se asume que se desea utilizar el NMSE como evaluación métrica del árbol de regresión y los modelos lineales. Habiendo definido las funciones que se encargaran del aprendizaje y fase de prueba de los modelos, se llevará a cabo la comparación validación cruzada como sigue: 32 Minería de Datos con R Capítulo 2: Predicción de las floraciones de algas La siguiente instrucción provee un resumen de los resultados de la comparación: 33 Minería de Datos con R Capítulo 2: Predicción de las floraciones de algas 34 Minería de Datos con R Capítulo 2: Predicción de las floraciones de algas Se puede llevar a cabo un experimento comparativo similar para todas predicciones de siete tareas que se enfrenta al mismo tiempo. El siguiente código implementa esta idea: La figura se obtiene con: > plot(res.all) 35 Minería de Datos con R Capítulo 2: Predicción de las floraciones de algas 2.8. Predicciones para los siete tipos de algas. En esta sección se mostrará como obtener las predicciones para los siete tipos de algas sobre las 140 muestras de prueba. La sección 2.7 describió como proceder para escoger los mejores modelos para obtener esas predicciones. El procedimiento utilizado consistió en obtener estimadores insesgados del NMSE para un conjunto de modelos sobre las siete predicciones, por medio del proceso experimental de validación cruzada. La meta principal en este problema de minería de datos es obtener las siete predicciones para cada una de las 140 muestras de prueba. Cada una de estas siete predicciones se obtendrán utilizando el modelo que el proceso de validación cruzada ha indicado como el “mejor” para esta tarea. Será cualquier modelo resultante del llamado a la función bestScores()en la sección previa. Será cualquiera de estos: “cv.rf.v3”, “cv.rf.v2”, “cv.rf.v1”, o “cv.rpart.v3”. Se comenzará obteniendo estos modelos utilizando todos los datos de entrenamiento que se puedan aplicar para el conjunto de prueba. Note que, por simplicidad, crecerá el árbol de regresión utilizando clean.algae sobre el data frame que tenia los valores NA sustituidos por el proceso de imputación de los k vecinos más cercanos. Esto puede ser evitado para el árbol de regresión incorporando su propio método para lidiar con valores desconocidos. Los bosques aleatorios, por el contrario, no incluye tal método, y necesitan aprender utilizando el data frameclean.algae. 36 Minería de Datos con R Capítulo 2: Predicción de las floraciones de algas El siguiente código obtiene todos los siete modelos: El data frametest.algae, contiene las 140 muestras de prueba. Este conjunto de datos también incluye valores desconocidos, así, el primer paso será rellenar estos valores faltantes utilizando la misma metodología usada anteriormente. La primera tentación para llevar a cabo esta tarea seria ejecutar la función knnImputation() para el data frametest.algae. Esto solucionaría el problema de los datos faltantes pero iría ligeramente en contra de una de las reglas de oro de los modelos predictivos, la cual es, no usar ninguna información del conjunto de datos de prueba para obtener los modelos. En efecto, aplicando la función directamente sobre el conjunto de prueba, se podría utilizar los otros casos de prueba para encontrar los 10 vecinos más cercanos que podrían ser usados para llenar cada valor faltante. Aunque no se usará la información sobre las variables objetivo, la cual sería realmente incorrecta, se puede evitar este proceso utilizando los datos de entrenamiento para encontrar los vecinos. Esto seria más correcto pero también más realista en el sentido de que si se fueran a aplicar los modelos en problemas reales, se obtendrían probablemente las muestras de agua secuencialmente, una a la vez. La función knnImputation()tiene un argumento extra que puede ser utilizado para las situaciones de llenar los valores faltantes en un conjunto de datos de prueba. Se puede utilizar la siguiente instrucción: El argumento de distData nos lleva a suministrar un conjunto de datos extra donde los 10 vecinos más cercanos son encontrados para cada caso con valores faltantes en el data frametest.algae. Note que se ha omitido las variables objetivo del conjunto de datos algae, como el conjunto de prueba no incluye información sobre estas variables. 37 Minería de Datos con R Capítulo 2: Predicción de las floraciones de algas Con el siguiente código se obtendrá la matriz con las predicciones para el conjunto de prueba entrero: Con este simple código se obtuvo una matriz (preds) con las 7 x 140 predicciones requeridas. En esta etapa se puede comparar estas predicciones con los valores reales, para obtener alguna realimentación (“feedback”) sobre la calidad de nuestro enfoque para el problema de la predicción. Los valores verdaderos del conjunto de datos de prueba están contenidos en el data framealgae.sols. El siguiente código calcula los valores de NMSE de los modelos: Primero se obtienen las predicciones de la línea base del modelo utilizado para calcular el NMSE, el cual, en este caso consiste en predecir el valor promedio de la variable objetivo. Después se procede a calcular los valores de NMSE para los siete modelos/alga. La función scale() puede ser utilizada para normalizar el conjunto de datos. Este trabaja restando el segundo argumento del primero y después divide el resultado entre el tercero, a menos que el argumento sea falso (FALSE), como es el caso anterior. En este ejemplo se está utilizando para restar un vector (el valor objetivo promedio de todas las siete algas) de cada línea de una matriz. Los resultados obtenidos previamente con la estimación de la validación cruzada confirman la dificultad en obtener un buen resultado para el tipo de alga 7, mientras que para los otros problemas los resultados son más competitivos, en particular para el tipo de alga 1. En resumen, con la selección del modelo apropiado, estamos capacitados para obtener valores interesantes para estos problemas de predicción. 38 Minería de Datos con R Capítulo 3: Predicción de Beneficios del Mercado Bursátil Minería de Datos con R Aprendiendo con Casos de Estudio Luis Torgo Capítulo 3: Predicción de Beneficios del Mercado Bursátil Resumen elaborado por: Yonel Peñaloza M. El objetivo principal de este capítulo es introducir al lector a una aplicación más real de la minería de datos. En este sentido, se abordará el manejo de datos de series de tiempo, frente a un sistema muy dinámico con los posibles cambios de régimen, y moviendo desdelas predicciones del modelo en acciones concretas en el dominio de aplicación. Vamos a abordar la tarea de construir un sistema de comercio de acciones sobre la base de los modelos de predicción obtenidos con cotizaciones de acciones diarias de los datos. Varios modelos serán juzgados con el objetivo de predecir los rendimientos futuros del índice del mercado de S & P 500. Estas predicciones se utilizan junto con una estrategia de negociación para llegar a una decisión con respecto a las órdenes de mercado para generar. En este capítulo se trata de varios temas nuevos de minería de datos, entre los que son: (1) el uso de R analizar los datos almacenados en una base de datos (2) cómo manejar los problemas con la predicción un tiempo de orden entre las observaciones de datos (también conocido como de series de tiempo), y (3) un ejemplo de las dificultades de la traducción de las predicciones del modelo en las decisiones y acciones en aplicaciones del mundo real. 3.1 Descripción del problema y Objetivos La bolsa de comercio es un dominio de aplicación con un gran potencial para la minería de datos. En efecto, la existencia de una enorme cantidad de datos históricos sugiere que la minería de datos puede proporcionar una ventaja competitiva con respecto a la inspección de estos datos. Por otro lado, hay investigadores que pretenden que los mercados se adapten tan rápidamente en términos de ajustes de precios que no hay espacio para obtener beneficios de 39 Minería de Datos con R Capítulo 3: Predicción de Beneficios del Mercado Bursátil forma consistente. Esto es generalmente conocido como la hipótesis de mercados eficientes. El objetivo general del comercio de acciones es mantener una cartera de activos sobre la base de órdenes de compra y venta. El objetivo a largo plazo es lograr la mayor ganancia posible de estas acciones comerciales. En el contexto de este capítulo vamos a limitar un poco más de este panorama general. Es decir, sólo el "comercio" un solo valor, en realidad un índice de mercado. Teniendo en cuenta esta seguridad y un capital inicial, vamos a tratar de maximizar nuestros beneficios durante un período de prueba el futuro por medio de acciones comerciales (compra, venta, retención). Nuestra estrategia comercial se utiliza como base para la toma de decisiones las indicaciones proporcionadas por el resultado de un proceso de minería de datos. Este proceso consistirá en tratar de predecir la evolución futura del índice basado en un modelo de datos obtenidos con citas históricas. Por lo tanto nuestro modelo de predicción se incorporará en un sistema de comercio que genera sus decisiones en base a las predicciones del modelo. Nuestros criterios de evaluación global será el rendimiento de este sistema comercial, es decir, la ganancia / pérdida resultante de las acciones del sistema, así como algunas otras estadísticas que son de interés para los inversores. Esto significa que nuestros principales criterios de evaluación serán los resultados operacionales de la aplicación de los conocimientos descubiertos por nuestro proceso de minería de datos y no a la exactitud de predicción de los modelos desarrollados durante este proceso. 3.2 Los Datos disponibles En nuestro caso de estudio nos concentraremos en el comercio de la S & P 500 del mercado. Datos diarios sobre la cita de esta seguridad están disponibles gratuitamente en muchos lugares, por ejemplo, el Yahoo Finanzas site. Los datos que usaremos están disponibles en el paquete de libros. Una vez más vamos a explorar otros medios de obtener los datos como una forma de ilustrar algunas de las capacidades de R. Con el fin de obtener los datos a través del paquete R, es suficiente para escribir: > library(DMwR) > data(GSPC) La acción diaria de datos incluye información sobre cotizaciones de las siguientes propiedades: • Fecha de la sesión de bolsa de valores • Precio de puertas abiertas en el comienzo de la sesión • Precio más alto durante la sesión 40 Minería de Datos con R Capítulo 3: Predicción de Beneficios del Mercado Bursátil • El precio más bajo • Precio de cierre de la sesión • El volumen de transacciones • Precio de cierre ajustado 3.2.1 Manejo de datos dependientes del tiempo en R Los datos disponibles para este estudio de caso dependen del tiempo. Esto significa que cada observación de nuestra base de datos tiene una etiqueta de tiempo que se le atribuye. Este tipo de datos es frecuentemente conocido como datos de series temporales. La principal característica distintiva de este tipo de datos es que el orden entre los asuntos de los casos, debido a sus etiquetas de tiempo conectado. En términos generales, una serie de tiempo es un conjunto de observaciones ordenadas de una variable: y1 , y2 , . . . , yt−1 , yt , yt+1 , . . . , yn Donde yt es el valor de la variable serie en el tiempo t. El objetivo principal del análisis de series temporales es la obtención de un modelo basado en el pasado observaciones de la variable, y1, y2,. . . , yt-1, yt, que nos permite realizar predicciones en relación con futuras observaciones de la variable, yt +1,. . . , Yn. En el caso de nuestros datos, tenemos lo que se conoce generalmente como una serie de tiempo multivariado, porque evaluamos distintas variables en las etiquetas mismo tiempo, es decir, el Abierto, H IGH, bajo, pierden C, Volumen y ADJC lose. R tiene varios paquetes dedicados al análisis de este tipo de datos, y en el efecto que tiene clases especiales de objetos que se utilizan para almacenar dependiente del tipo de datos. Además, R tiene muchas funciones, atento a este tipo de objetos, como funciones especiales de ploteo, etc. Entre los paquetes de R más flexible para el manejo de datos dependientes del tiempo son zoo (Zeileis y Grothendieck, 2005) y XTS (Ryan y Ulrich, 2010). Tanto el poder como una oferta similar, aunque XTS ofrece un conjunto de servicios adicionales (por ejemplo, en términos de sub-ajuste con la norma ISO 8601 cadenas de tiempo) para manejar este tipo de datos. En términos técnicos, el XTS clase extiende el zoológico de clase, lo que significa que cualquier objeto XTS es también un objeto de zoológico, y por lo tanto se puede aplicar cualquier método diseñado para objetos zoológico de objetos XTS. Vamos a basar nuestro análisis en este capítulo se centran principalmente en los objetos XTS. Empezamos con unos cuantos ejemplos ilustrativos de la creación y utilización de este tipo de objeto. Tenga en cuenta que ambos zoológico y XTS son paquetes adicionales (es decir, que no vienen con la instalación base de R), y que es necesario descargar e instalar en R. 41 Minería de Datos con R Capítulo 3: Predicción de Beneficios del Mercado Bursátil La función xts() recibe los datos de series de tiempo en el primer argumento. Esto puede ser un vector o una matriz, si tenemos una serie de tiempo multivariante. En este último caso cada columna de la matriz se interpreta como una variable que se muestra en cada etiqueta de tiempo (es decir, cada fila). Las etiquetas de tiempo se proporcionan en el segundo argumento. Esto tiene que ser un conjunto de etiquetas de tiempo en cualquiera de las clases de tiempo existentes en R. Definición de las tareas de predicción. En general, nuestro objetivo es tener buenos pronósticos de los precios futuros del índice S & P 500 para que las órdenes rentable puede ser colocado en el tiempo. Este objetivo general que nos permitirá definir con facilidad lo que para predecir con nuestros modelos, se debe recurrir a la previsión de los valores futuros de la serie temporal de precios. Sin embargo, es fácil ver que incluso con esta simple tarea de inmediato frente a varias preguntas, a saber, (1) ¿Cuál de las cotizaciones diarias? o (2) para que en el futuro? Responder a estas preguntas no es fácil y por lo general depende de cómo las predicciones se utilizan para la generación de órdenes de operaciones. 3.1 Definiendo las tareas de predicción En general, nuestro objetivo es tener buenos pronósticos de los precios en el futuro de los indices S & P 500 para que las órdenes rentables puedan tomar lugar en el tiempo. Este objetivo general nos permitirá definir con facilidad lo que predecir con nuestros modelos, debe recurrir a la previsión de los valores futuros de la serie temporal de precios. Sin embargo, es fácil ver que incluso con esta simple tarea de inmediato nos enfrentamos a varias preguntas, es decir, (1) ¿Cuál de las cotizaciones diarias? o (2) para que el tiempo en el futuro? Responder a estas preguntas no es fácil y por lo general depende de cómo las predicciones se utilizan para generar órdenes de negociación. 3.3.1 ¿Qué predecir? Las estrategias de negociación que se describen en la Sección 3.5 suponen que se obtiene una predicción de la tendencia del mercado en los próximos días. Sobre la base de esta predicción, vamos a hacer pedidos que será rentable si la tendencia se confirma en el futuro. Vamos a suponer que si los precios varían más de p%, consideramos que esto valga la pena en términos de comercio (por ejemplo, que cubre los costos de transacción). En este contexto, queremos que nuestros modelos de predicción para pronosticar si este margen se puede alcanzar en los próximos k días. Se debe tener en cuenta que en estos días k en realidad podemos observar los precios por encima y por debajo de este porcentaje. Esto significa que la predicción de una cotización especial para una fecha futura específica t + k no 42 Minería de Datos con R Capítulo 3: Predicción de Beneficios del Mercado Bursátil puede ser la mejor idea. En efecto, lo que queremos es tener una predicción de la dinámica global de los precios en los k días, y esto no es capturado por un precio determinado en un momento determinado. Por ejemplo, el precio de cierre en el momento t + k puede representar una variación mucho menor que p%, pero podría haber sido precedida por un período de precios que representan variaciones mucho mayores que p% dentro del períodp t, …, t + k. Por lo tanto, lo que queremos en realidad es tener una buena predicción de la tendencia general de los precios en los k días siguientes. Vamos a describir una variable, calculando con los datos de las cotizaciones, que puede ser visto como un indicador (un valor) de la tendencia en los k días siguientes. El valor de este indicador debe estar relacionado con la confianza que tenemos de que el p margen objetivo se podrá alcanzar en el día k próximo. En esta etapa es importante tener en cuenta que cuando se menciona una variación en p%, que significa por encima o por debajo del precio actual. La idea es que las variaciones positivas que nos llevan a comprar, mientras que las variaciones negativas disparará la venta de las acciones. El indicador que estamos proponiendo resume la tendencia, con un solo valor, positivo para las tendencias al alza, y negativos para las tendencias de reducción de precios. Supongamos que el precio medio diario se determina por 𝐶𝑖 + 𝐻𝑖 + 𝐿𝑖 3 Donde Ci, Hi y Li son el cierre, alta y baja para el día i, respectivamente. 𝑃�𝑖 = Sea Vi el conjunto de las k variaciones porcentuales al cierre de hoy a los siguientes k días de acuerdo a los precios medios: 𝑘 𝑃�𝑖+𝑗 − 𝐶𝑖 𝑉𝑖 = � � 𝐶𝑖 𝑗=1 Nuestra variable de indicador es la suma total de las variaciones cuyo valor absoluto está por encima de nuestro objetivo p% marginal: 𝑇𝑖 = �{𝑣 ∈ 𝑉𝑖 : 𝑣 > 𝑝% ⋁ 𝑣 < −𝑝%} 𝑣 La idea general de la variable T es señal de k-día períodos que tienen varios días con un promedio de precios diarios muy por encima de la variación de destino. Altos valores positivos de la T significa que hay varios precios promedio diario que se p% más alto que el cierre de hoy. Estas situaciones son buenos indicadores de las posibles oportunidades para emitir una orden de compra, como hemos buenas expectativas de que los precios subirán. Por otro lado, los valores muy negativos de la T sugerir acciones que vender, dado que los precios probablemente se 43 Minería de Datos con R Capítulo 3: Predicción de Beneficios del Mercado Bursátil reducirán. Valores en torno a cero puede ser causada por períodos de "plano" o por los precios contradictorios variaciones positivas y negativas que se cancelan mutuamente. La siguiente función implementa este indicador: > T.ind <- function(quotes, tgt.margin = 0.025, n.days = 10) { + v <- apply(HLC(quotes), 1, mean) + r <- matrix(NA, ncol = n.days, nrow = NROW(quotes)) + for (x in 1:n.days) r[, x] <- Next(Delt(v, k = x), x) + x <- apply(r, 1, function(x) sum(x[x > tgt.margin | x < + -tgt.margin])) + if (is.xts(quotes)) + xts(x, time(quotes)) + else x +} La función comienza por la obtención del precio medio. La funciónHLC () extrae los valores correspondientes al alta, baja, y cierre de un objeto entre comillas. Se obtiene la devolución de los días próximos n días con respecto al precio de cierre actual. La función Next() permite cambiar los valores de una serie de tiempo (tanto delante o hacia atrás). La función Delt () puede ser utilizada para calcular los beneficios porcentuales o registro de una serie de los precios. Por último, la función T.ind () resume la función de rentabilidad absoluta grande, es decir, vuelve sobre el margen de variación de destino, que hemos establecido por defecto al 2,5%. Podemos tener una mejor idea del comportamiento de este indicador en la figura, que se produjo con el siguiente código: > candleChart(last(GSPC, "3 months"), theme = "white", TA = NULL) > avgPrice <- function(p) apply(HLC(p), 1, mean) > addAvgPrice <- newTA(FUN = avgPrice, col = 1, legend = "AvgPrice") > addT.ind <- newTA(FUN = T.ind, col = "red", legend = "tgtRet") > addAvgPrice(on = 1) > addT.ind() 44 Minería de Datos con R Capítulo 3: Predicción de Beneficios del Mercado Bursátil Como se puede observar en la figura el indicador T alcanza valores más altos cuando existe un periodo subsecuente de variaciones positivas. Obviamente, para obtener el valor del indicador para el tiempo i, se necesita los datos para los siguientes 10 días, no estamos diciendo que T anticipa estos movimientos. Esta no es la menta del indicador. La meta es resumir el comportamiento futuro observado de los precios en un valor simple y no predecir este comportamiento. La interpretación para el tiempo t será “comprar” si el valor de T es más alto que un cierto umbral, y “vender” si dicho valor está por debajo de otro umbral. En otro caso, la señal será no hacer nada (“mantener”). En resumen, se desea predecir la señal correcta para el tiempo t. 3.4. Modelos de predicción. En esta sección se explorarán algunos modelos que pueden ser utilizados para el manejo de la predicción. Esta selección de modelos se realizó guiada principalmente por el hecho de que estas técnicas son conocidas por su habilidad para el manejo de problemas de regresión no lineales. 45 Minería de Datos con R Capítulo 3: Predicción de Beneficios del Mercado Bursátil 3.4.2. Las herramientas de modelado. 3.4.2.1. Redes neuronales artificiales. Las redes neuronales son utilizadas frecuentemente en las predicciones financieras debido a su habilidad para tratar con problemas no lineales. El paquete nnet implementa la red neuronal en R. La red neuronal artificial está formada por un conjunto de unidades (neuronas) unidas unas u otras. Cada una de las conexiones de las neuronas tiene un peso asociado. Construir una red neuronal artificial consiste en establecer una arquitectura para la red y después utilizar un algoritmo para encontrar los pesos de las conexiones entre las neuronas. La red organiza sus neuronas en capas. La primera capa contiene las entradas de la red. Las observaciones de entrenamiento son presentadas a la red a través de estas entradas. La capa final contiene las predicciones de la red neuronal para cualquier caso que se presente a las neuronas de entrada. Entre la capa inicial y la final se encuentran las capas ocultas, usualmente se tienen más de una. Los algoritmos de actualización de los pesos, como el método de “back-propagation”, tratan de obtener los pesos de las conexiones que optimizan un cierto criterio de error, esto es, tratando de asegurar que las salidas de la red se comporte de acuerdo a los casos presentados al modelo. La red neuronal con una capa oculta puede obtenerse fácilmente en R utilizando la función del paquete nnet. La red obtenida por esta función puede ser utilizada para los problemas de clasificación y de regresión, y es aplicable a los problemas de predicción. Las redes neuronales son conocidas por ser sensibles a diferentes escalas de las variables utilizadas en un problema de predicción. En este contexto, tiene sentido hacer la transformación de los datos antes de introducirlos a la red, para evitar un eventual impacto negativo en el desempeño de la misma. En este caso, se normalizarán los datos con la finalidad de que todas las variables tengan media cero y desviación estándar igual a uno. Esto se puede realizar fácilmente aplicando la siguiente transformación a cada columna del conjunto de datos: 𝑦𝑖 = 𝑥𝑖 − 𝑥̅ 𝜎𝑥 46 Minería de Datos con R Donde 𝑥̅ estándar. Capítulo 3: Predicción de Beneficios del Mercado Bursátil es el valor medio de la variable original X, y 𝜎𝑥 es la desviación La función scale() puede ser utilizada para realizar la transformación de los datos. A continuación se mostrará una simple ilustración de cómo obtener y usar este tipo de red neuronal artificial en R: Por defecto, la función nnet() asigna los pesos iniciales de los enlaces entre los nodos con valores aleatorios entre el intervalo [-0.5 , 0.5]. Esto significa que dos corridas sucesivas de la función con exactamente los mismo argumentos pueden arrojar diferentes soluciones. Para asegurar que se obtienen los mismo resultados que se presentan a continuación, se añade la función set.seed() que inicializa el generador de números aleatorios a algún numero de semilla. Esto asegura que se obtendrá exactamente la misma red neuronal que se muestra aquí. En este ejemplo ilustrativo se han usado los primeros 1.000 casos para obtener la red, y para probar el modelo los siguientes 1.000 casos. Después de normalizar los datos de entrenamiento, se llama a la función nnet() para obtener el modelo. Los primeros dos parámetros son los usuales para cualquier función de modelado en R: la forma funcional del modelo especificado por una fórmula, y las muestras de entrenamiento para obtener el modelo. También se han utilizado algunos de los parámetros de la función nnet(). El parámetro size permite especificar cuantos nodos tendrá la capa oculta. La función trading.signals() transforma las predicciones numéricas en señales, dados los umbrales para comprar y vender, respectivamente. La función sigs.PR() obtiene una matriz con las puntuaciones de precisión (precisión) y capacidad para 47 Minería de Datos con R Capítulo 3: Predicción de Beneficios del Mercado Bursátil recordar (recall) de los dos tipos de eventos, y en general. Las puntuaciones muestran que el desempeño de la red neuronal no es tan brillante. Bajas puntuaciones en la precisión significa que el modelo arrojó señales incorrectas con bastante frecuencia. Si las señales son utilizadas para el comercio, esto puede llevar a seria pérdidas de dinero. 3.4.2.2. Máquinas de soporte vectoriales. Las máquinas de soporte vectoriales (SVMs) son herramientas de modelado que al igual que lasredes neuronales pueden ser aplicadas para tareas de regresión y clasificación. En R ha variasimplementaciones de dicha técnica, entre las cuales se puede hacer referencia al paquetekernlabcon varias funcionalidades disponibles, también la función svm() del paquete e1071. La idea básica detrás de los SVMs es la transformación o “mapeo” de los datos originales en uno nuevo espacio multidimensional, donde es posible la aplicación de modelos lineales para obtener un hiper plano de separación, por ejemplo, la separación de clases de un problema, es el caso de la clasificación. El “mapeo” o transformación de los datos originales en un nuevo espacio es llevado a cabo con la ayuda de las funciones denominadas Kernel. La separación de los hiperplanos en la nueva representación dual se realiza con frecuencia mediante la maximización de un margen de separación entre los casos que pertenecen a clases diferentes ver la figura a continuación. Este es un problema de optimización a menudo resuelto con métodos de programación cuadrática. 48 Minería de Datos con R Capítulo 3: Predicción de Beneficios del Mercado Bursátil 3.5 Uso de las Predicciones En esta sección se abordará la cuestión de cómo vamos a utilizar las predicciones de señales obtenidas con las técnicas de modelado se ha descrito anteriormente. Dado un conjunto de señales de salida por algún modelo que hay muchas maneras que podemos utilizar para actuar en el mercado. 3.5.1 ¿Cómo usar las predicciones? En nuestro caso de estudio vamos a suponer que va a considerar el comercio en los mercados futuros. Estos mercados se basan en contratos para comprar o vender una mercancía en una fecha determinada en el futuro en el precio determinado por el mercado en ese momento en el futuro. Esto significa que nuestro sistema de comercio será capaz de abrir dos tipos de posiciones: a corto y largo plazo. Las posiciones largas se abren mediante la compra de una mercancía en el tiempo t y p el precio, y su venta en un momento posterior t + x. Si nuestros modelos ofrecen indicios de que los precios subirán en el futuro cercano, con los valores pronosticados de alta T o señales de compra, vamos a considerar la apertura de una posición larga. Esta posición sólo se abrirá si se encuentran fuera del mercado. Con este fin vamos a publicar una orden de compra que se llevará a cabo en un tiempo t y pr precio. Al igual que antes, inmediatamente se publicará dos nuevos pedidos. La primera será una orden limitada de venta con un precio objetivo de la pr + p%, lo que sólo será ejecutada si el mercado alcanza un precio de + pr% o por encima de p. Esta orden límite de venta tendrá un plazo de 10 días, como antes. El segundo orden es una venta dejar de orden con el precio PR - l%, que a su vez limitará los eventuales pérdidas de l%. Esta primera estrategia puede ser vista como conservador un poco, ya que sólo tendrá una sola posición abierta en cualquier momento. Por otra parte, después de 10 días de espera para el objetivo de beneficio, las posiciones se cierran inmediatamente. También vamos a considerar un aspecto más "arriesgada" estrategia de negociación. Esta otra estrategia es similar a la anterior, con la excepción de que siempre vamos a abrir nuevas posiciones si hay señales con dicha indicación, y si tenemos suficiente dinero para eso. Por otra parte, vamos a esperar por siempre para las posiciones a llegar a un objetivo de beneficio o la pérdida máxima permitida. Sólo se consideran estas dos estrategias principales de comercio, con ligeras variaciones en los parámetros utilizados (por ejemplo, tiempo de mantenimiento, el margen de beneficio esperado, o la cantidad de dinero invertido en cada posición). Como se ha mencionado, estas son simplemente elegidas con fines ilustrativos. 49 Minería de Datos con R Capítulo 3: Predicción de Beneficios del Mercado Bursátil La función tradingEvaluation() se puede utilizar para obtener una serie de económico indicadores del desempeño durante este período de la simulación: También podemos obtener una representación gráfica de la actuación del operador utilizando la función de trama () como sigue: > plot(t1, market, theme = "white", name = "SP500") El resultado puede verse en la siguiente figura: 50 Minería de Datos con R Capítulo 3: Predicción de Beneficios del Mercado Bursátil 3.6 Modelo de Evaluación y Selección En esta sección vamos a estudiar la forma de obtener estimaciones fiables de los criterios de evaluación seleccionados. Estas estimaciones nos permiten comparar y seleccionar adecuadamente entre los diferentes sistemas alternativos de negociación. 3.6.1 Estimaciones de Monte Carlo Problemas de series de tiempo como el que estamos abordando traer nuevos desafíos en términos de la obtención de estimaciones fiables de las métricas nuestra evaluación. Esto es causado por el hecho de que todas las observaciones de datos tienen una etiqueta de tiempo adjunto que impone un orden entre ellos. Este orden se debe respetar con el riesgo de obtener estimaciones que no son fiables. En el capítulo 2 se utilizó el método de validación cruzada para obtener estimaciones fiables de las estadísticas de evaluación. Esta metodología incluye un nuevo muestreo aleatorio paso que cambia el orden original de las observaciones. Esto significa que la validación cruzada no se debe aplicar a los problemas de series de tiempo. La aplicación de este método podría significar para probar los modelos en las observaciones que son mayores que las utilizadas para su obtención. Esto no es factible en la realidad, y por lo tanto los estimados obtenidos por este proceso son poco fiables y posiblemente optimista demasiado, ya que es más fácil predecir el pasado dado el futuro que lo contrario. Nuestra base de datos incluye cerca de 30 años de cotizaciones diarias. Vamos a evaluar todas las alternativas mediante la estimación de su rendimiento en un equipo de prueba de 5 años de cotizaciones, cuando se les da 10 años de datos de entrenamiento. Esto asegura tren y tamaños de prueba que son suficientemente grandes, y, además, que deja espacio para las repeticiones diferentes de este proceso de prueba como tenemos 30 años de datos. En cuanto a la metodología experimental, vamos a utilizar un Monte Carlo expeperimento de obtener estimaciones fiables de las métricas nuestra evaluación. Métodos de Monte Carlo se basan en un muestreo aleatorio para obtener sus resultados. Vamos a utilizar este proceso de toma de muestras para elegir un conjunto de puntos R en nuestro período de 30 años de cotizaciones. Para cada punto de tiempo r seleccionados al azar, vamos a utilizar la anterior 10 años de cotizaciones para obtener los modelos y los siguientes 5 años para ponerlos a prueba. Al final de estas iteraciones R tendremos estimaciones R para cada una de las métricas nuestra evaluación. Cada una de estas estimaciones se obtiene en una ventana seleccionada al azar de 15 años de datos, los primeros 10 años utilizados para la formación y los años restantes re-5 para la prueba. Esto asegura que nuestros experimentos siempre respetar el tiempo de ordenamiento de las series temporales de datos. Repitiendo el proceso R veces se asegurará suficiente variabilidad en el tren + condiciones de la prueba, lo que aumenta la fiabilidad de 51 Minería de Datos con R Capítulo 3: Predicción de Beneficios del Mercado Bursátil nuestras estimaciones. Por otra parte, si se utiliza el mismo conjunto de puntos de I seleccionados al azar para evaluar distintas alternativas, podemos llevar a cabo comparaciones por pares para obtener los niveles estadísticos de confianza en las diferencias observadas de rendimiento medio. La figura que sigue a continuación, resume el método de Monte Carlo experimental. Observe que, como hemos de garantizar que por cada punto r azar hay 10 años de datos antes y después de 5 años, esto elimina algunos de los datos de la selección al azar de los puntos R. La función experimentalComparison (), que se utilizó en el Capítulo 2 para llevar a cabo k veces validación cruzada experimentos, también se puede utilizar para experimentos de Monte Carlo. En la siguiente sección vamos a utilizar para obtener estimaciones confiables de los parámetros de evaluación seleccionados para varios sistemas alternativos de negociación. 3.6.3 Análisis de los Resultados El código proporcionado en la sección anterior generales ve los datos con la objetos que contienen los resultados de todas las variantes que afectan a los sistemas de aprendizaje he hemos intentado. Estos datos se les denomina \ svmR.Rdata ", \ svmC.Rdata", \ earth.Rdata ", \ nnetR.Rdata", y \ nnetC.Rdata ". Cada uno de ellos contiene un objeto con el mismo nombre del fichero, excepto la extensión. Estos objetos son de clase compExp, y nuestro paquete contiene varios métodos que pueden ser utilizados para explorar los resultados que se almacenan. Debido a que es probable que no se haya ejecutado los, puedes acceder a los ficheros en la página web del libro. Descarga a tu ordenador y luego usa los siguientes comandos para cargar los objetos en R: > load("svmR.Rdata") > load("svmC.Rdata") > load("earth.Rdata") > load("nnetR.Rdata") > load("nnetC.Rdata") 52 Minería de Datos con R Capítulo 3: Predicción de Beneficios del Mercado Bursátil Es posible que tengamos una mejor idea de la distribución de los puntajes en algunas de estas estadísticas en todas las 20 repeticiones por el trazado del objeto compExp: El resultado de este código se muestra en la figura a continuación: Las puntuaciones de los dos sistemas que utilizan esquemas de ventanas son muy similares, por lo que es difícil distinguir entre ellos. Por el contrario, los resultados de "single.nnetR.v12" son claramente distintos. Podemos observar que la rentabilidad media alta se consigue gracias a un rendimiento claramente anormales (alrededor de 2800%) en una de las iteraciones del experimento de Monte Carlo. El resto de las puntuaciones de este sistema parecen claramente inferiores a las puntuaciones de los otros dos. Sólo por curiosidad, podemos comprobar la configuración de este sistema de comercio en particular usando la función getVariant (): 53 Minería de Datos con R Capítulo 3: Predicción de Beneficios del Mercado Bursátil En resumen, teniendo en cuenta estos resultados, si tuviéramos que seleccionar cualquiera de las alternativas consideradas, es probable que salte la "single.nnetR.v12", dada su inestabilidad. Sin embargo, en la siguiente sección vamos a aplicar nuestros tres mejores sistemas de comercio en los últimos 9 años de datos que se quedaron fuera de la evaluación final de los mejores sistemas. 3.7 El sistema de comercio En esta sección se presentan los resultados obtenidos por los "mejores" modelos en el período de evaluación final, que se quedó fuera de la comparación de los modelos y las etapas de selección. Este periodo está formado por 9 años de cotizaciones, y vamos a aplicar los cinco sistemas seleccionados para el comercio durante este período con nuestro simulador. 3.7.1 Evaluación de los Datos de Prueba Final Para aplicar cualquiera de los sistemas seleccionados en el período de evaluación, tenemos que en los últimos 10 años antes de este período de evaluación. Los modelos se pueden obtener con estos 10 años de datos y, a continuación se le pedirá para que su señal de predicción ciones de los 9 años del período de evaluación. Estas predicciones en realidad puede implicar la obtención de modelos más en el caso de los sistemas que utilizan sistemas de ventanas. El siguiente código obtiene las estadísticas de evaluación de estos sistemas en el período de prueba de 9 años. Ahora procedemos a un análisis más profundo del funcionamiento de este sistema de comercio de los mejores en todo el período de evaluación. Para que esto sea posible, tenemos que obtener el registro de comercio del sistema durante este período. La función de crecimiento () no devuelve este objeto, por lo que tenemos que obtener por otros medios: 54 Minería de Datos con R Capítulo 3: Predicción de Beneficios del Mercado Bursátil La figura a continuación referida a parcelas el registro comercial del sistema, se obtuvo como sigue: > plot(trade.res, market, theme = "white", name = "SP500 - final test") El análisis de la figura revela que el sistema pasó por un largo período de tiempo casi sin actividad comercial, es decir, desde mediados de 2003 hasta mediados de 2007. Esto es algo sorprendente, ya que fue un período de aumento significativo en el mercado. Esto de alguna manera muestra que el sistema no se está comportando tan bien como pudo, a pesar de los resultados globales observados. También cabe destacar que el sis-tema sobrevivido muy bien en la tendencia 55 Minería de Datos con R Capítulo 3: Predicción de Beneficios del Mercado Bursátil general a la baja en el período comprendido entre 2000 hasta 2003, y también durante la crisis financiera de 2007-2009. El Paquete PerformanceAnalytics proporciona un conjunto enorme de herramientas para analizar el rendimiento de cualquier sistema de comercio. A continuación presentamos un vistazo a algunas de estas herramientas para obtener una mejor visión del rendimiento de nuestro sistema de comercio. Las herramientas de este paquete de trabajo en las declaraciones de la estrategia en evaluación. Los rendimientos de nuestra estrategia pueden obtenerse como sigue: > library(PerformanceAnalytics) > rets <- Return.calculate(trade.res@trading$Equity) La figura a continuación muestra los beneficios acumulados de la estrategia a través de todas las pruebas períodos. Para obtenerla, es suficiente para ejecutar el siguiente código: > chart.CumReturns(rets, main = "Cumulative returns of the strategy", + ylab = "returns") Durante la mayor parte del período, el sistema se encuentra en el lado positivo, habiendo alcanzado un máximo del 10% de rendimiento a mediados de 2008. Con frecuencia es útil para obtener información sobre los rendimientos sobre una base anual o incluso mensual. El paquete PerformanceAnalytics proporciona 56 Minería de Datos con R Capítulo 3: Predicción de Beneficios del Mercado Bursátil algunas herramientas para ayudar con este tipo de análisis, a saber, el yearlyReturn function(): > yearlyReturn(trade.res@trading$Equity) yearly.returns 2000-12-29 0.028890251 2001-12-31 -0.005992597 2002-12-31 0.001692791 2003-12-31 0.013515207 2004-12-31 0.002289826 2005-12-30 0.001798355 2006-12-29 0.000000000 2007-12-31 0.007843569 2008-12-31 0.005444369 2009-08-31 -0.014785914 La figura a continuación presenta esta información de forma gráfica y podemos observar que sólo había 2 años con rentabilidades negativas. > plot(100*yearlyReturn(trade.res@trading$Equity), + main='Yearly percentage returns of the trading system') > abline(h=0,lty=2) 57