Minería de Datos con R Cap 2 y 3

Anuncio
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. [email protected]
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
Descargar