Aprendizaje Con Redes Neuronales Con R



Comments



Description

Redes neuronales con REste es un trabajo sobre redes neuronales y R, sin asumir ningún conocimiento previo del tema salvo que se tiene R instalado en el sistema y se sabe acceder a su consola para ejecutar órdenes. Los lenguajes de programación, hojas de cálculo, bases de datos y otras aplicaciones software incorporan funciones predefinidas que nos permiten calcular rápidamente la raíz cuadradada de un número, el seno de un ángulo, logaritmos, la media de un conjunto de valores, etc. Todas estas son operaciones cuya formulación matemática se conoce, por lo que es posible implementarlas de manera relativamente sencilla e invocarlas cuando se necesitan. Una vez programadas, cada función será capaz de realizar exclusivamente la operación enconmendada. Es como si contásemos con una calculadora con esa operación, produciendo siempre la misma salida a partir de las mismas entradas. Una red neuronal artificial (ANN, Artificial Neural Network), asumiendo que tenga la estructura adecuada y cuente con un algoritmo de aprendizaje correcto, es capaz de aprender a realizar teóricamente cualquier operación, sin necesidad de que le facilitemos su formulación matemática. Solo necesita que le facilitemos varios ejemplos de la salida que se produce a partir de ciertas entradas. Si los ejemplos son suficientes y representativos del problema, tras el aprendizaje la red neuronal será capaz de efectuar dicha operación con una alta precisión. Cabe preguntarse la razón por la cual querríamos usar una ANN en lugar de una función capaz de efectuar la operación con total acierto. Esto último, sin embargo, solo es posible si conocemos la formulación del problema y, además, somos capaces de trasladarlo a un lenguaje para implementarla en software. Hay muchas situaciones en las que se conocen las salidas que producen unas ciertas entradas, pero la función que se aplica a estas últimas para generar las primeras es desconocida o bien resulta muy compleja de calcular. Es en estas situaciones en las que una ANN (u otro modelo de minería de datos, pero aquí nos centramos en las ANN) son considerablemente útiles. Una red neuronal que calcula hipotenusas Comprobemos en la práctica la anterior aseveración de que una ANN puede aprender por sí misma virtualmente cualquier función. El objetivo es obtener una ANN capaz de calcular la hipotenusa a partir de las medidas de lo catetos, pero sin facilitarle la fórmula exacta para hacerlo. Para ello nos serviremos del paquete neuralnet de R. El primer paso es cargar el paquete, introduciendo en la consola de R el siguiente comando: library(neuralnet) Datos de ejemplo Lo primero que necesitamos son algunos datos de ejemplo que permitan a la ANN aprender la función. A partir de ahí es posible facilitarle solo los datos de entrada para obtener la salida correspondiente. cada una de las cuales tendrá tres columnas.seed(42) # Establece la semilla aleatoria para asegurar reproducibilidad data <. Esto mostraría las 100 filas. un centenar de ejemplos. max = 10)). Este paquete de R cuenta con una función. llamada neuralnet(). devolviendo esta como resultado. min = 1.486833 ## 3 4 3 5. devueltas por la función head().frame debe tener una columna adicional con la hipotenusa correspondiente a cada pareja de catetos. Podemos comprobar cuál es el contenido del data. El data. La añadimos de la siguiente manera: data$Hyp <.packages('neuralnet').sqrt(data$Cat1*data$Cat1 + data$Cat2*data$Cat2) head(data) ## Cat1 Cat2 Hyp ## 1 9 7 11. Las dos primeras contendrán las medidas de dos catetos y las obtendremos así: set.433981 ## 5 7 9 11. max = 10))) head(data) ## Cat1 Cat2 ## 1 9 7 ## 2 9 3 ## 3 4 3 ## 4 8 5 ## 5 7 9 ## 6 6 10 La función runif() devuelve valores de una distribución uniforme. Cat2 = round(runif(100. que a partir de una serie de ejemplos se encarga de conducir el aprendizaje de la ANN.401754 .000000 ## 4 8 5 9.Si la respuesta fuese que el paquete no está disponible. Para ello vamos a preparar un data.frame simplemente escribiendo en la consola data y pulsando Intro.401754 ## 2 9 3 9.data. Para comprobar la estructura es suficiente con algunas de ellas. tras lo cual volveríamos a ejecutar el la orden anterior. En este caso concreto le solicitamos 100 valores entre 1 y 10 para cada uno de los catetos.frame (un tipo de dato de R similar a una matriz) con 100 filas.frame( Cat1 = round(runif(100. min = 1. tendremos que instalarlo con el comando install. 055385 head(train) ## Cat1 Cat2 Hyp ## 1 6 4 7. Cuando se trabaja con un data.944272 . serán los correspondientes a los ejemplos que usaremos para validación. es tomar dos tercios para entrenamiento y el tercio restante para validación.485281 ## 3 8 7 10. ] train <. para seleccionar las filas adecuadas del data.630146 ## 4 8 4 8.test. nrow(data) / 3) fold. Si el número de fila o columna es omitido se asume que se tomarán todas las filas o todas las columnas.data[-fold.810250 ## 50 9 1 9.test. Lo habitual.test. usando como índices vectores de números.frame. según puede apreciarse a continuación.630146 ## 81 8 4 8. Para crear nuestra partición de entrenamiento y de validación usaremos los índices anteriores. También es habitual seleccionar los ejemplos de forma aleatoria.828427 ## 93 2 6 6. cuando no se va a efectuar validación cruzada (varias repeticiones del experimento con distintas particiones de datos). El número de filas se obtiene con la función nrow().test ## [1] 89 52 84 43 16 97 91 46 24 92 49 58 30 6 39 72 90 88 45 73 40 14 95 ## [24] 75 94 62 23 79 4 18 25 11 21 Esos índices. un tercio del total.data[fold. ncolumna]. no los datos en sí: fold.661904 Particiones de entrenamiento y validación De los 100 ejemplos que contiene nuestro data.frame: test <. Mediante la función sample() vamos a tomar aleatoriamente un tercio de los índices correspondientes a las filas (ejemplos) existentes en el data.sample(nrow(data).test <.944272 ## 62 5 6 7. ] head(test) ## Cat1 Cat2 Hyp ## 92 2 2 2.frame vamos a usar una parte para que la ANN aprenda (partición de entrenamiento o training) y otra para comprobar lo bien que ha aprendido (partición de validación o test).211103 ## 2 6 6 8. También es posible obtener múltiples datos simultáneamente. almacenados en la variable fold.## 6 6 10 11. según el caso.324555 ## 29 7 8 10. Lo que obtenemos como resultado.frame es posible acceder a cualquier dato individual mediante la notación variable[nfila. es un vector con índices aleatorios. frame original las tres columnas de las filas cuyos índices contiene fold. hidden = 10. pero la mayor parte toman valores por defecto adecuados. por lo que en la práctica bastará con una llamada como la siguiente: ann <. con las mismas tres columnas que data. data = train.009604500 8799 .009883311 7593 ## 3 0.frame que contiene las variables a las que se hace referencia en la anterior fórmula. Ambas son objetos data.006725962 0.test. se facilitan las variables de entrada de la misma manera. Finalizado el proceso de aprendizaje. ] es similar. La expresión data[-fold. Con el parámetro rep se cambia el número de repeticiones (en el proceso hay una componente aleatoria que provoca que cada red obtenida tras el entrenamiento sea distinta). rep = 3) Los dos primeros parámetros son obligatorios. con el objetivo de obtener la mejor ANN posible.frame. algunos de ellos relativamente complejos.899495 ## 6 8 3 8. De esta forma obtenemos dos conjuntos disjuntos de ejemplos. El segundo parámetro es el data. Con él indicamos el número de neuronas que existirá en cada una de las capas ocultas de la ANN. tras el símbolo ~. Entrenamiento de la red neuronal Teniendo preparados los datos que actuarán como ejemplos de la función a aprender. hidden = 10.test. estamos en disposición de entrenar nuestra red neuronal.012119691 0.544004 Con la expresión data[fold.test.test. La sintaxis es simple: disponemos los nombres de las columnas del data. pero tomando las filas cuyos índices no están en el vector fold.frame que contienen datos a obtener como resultado de la red neuronal. ] estamos tomando del data. Podemos imprimirla para obtener un resumen del rendimiento de las ANN: ann ## Call: neuralnet(formula = Hyp ~ Cat1 + Cat2. El parámetro hidden es opcional. En este caso vamos a tener una sola capa oculta con 10 neuronas. rep = 3) ## ## 3 repetitions were calculated. A continuación. en este caso es solo una. separados entre sí mediante el operador +.## 5 7 7 9. la estructura de las distintas ANN obtenidas queda almacenada en la variable ann. uno en la variable train y otro en la variable test. Para ello no hay más que invocar a la función neuralnet() mencionada anteriormente. Por defecto la función neuralnet() efectúa una sola vez el proceso de entrenamiento de la ANN. El primero es una fórmula mediante la que se indica qué variables son predictoras (los catetos) y qué variables se van a predecir (la hipotenusa). Esta puede tomar un conjunto bastante importante de parámetros. ## ## Error Reached Threshold Steps ## 1 0. train.neuralnet(Hyp ~ Cat1 + Cat2. el umbral alcanzado y el número de pasos que ha demandado el aprendizaje. incluyendo los pesos asignados a cada una de las conexiones existentes entre ellas. puede limitarse o ampliarse. En función de la magnitud de ese error se ajustarán los pesos asociados a las conexiones entre las neuronas de las distintas capas. plot(ann. Examinando la estructura de la ANN Aunque podemos examinar el contenido de la variable ann para obtener información sobre las conexiones entre las neuronas. encargada de dibujar la ANN a partir de los datos devueltos por neuralnet(). tras efectuar cambios en dichos pesos como resultado del procesamiento de otros ejemplos. rep = "best") . el error que ha cometido la ANN en su salida. Durante el proceso de aprendizaje se usa un algoritmo que determina. usaremos el parámetro rep para indicar que se represente la mejor de ellas.028969166 0. en general nos resultará más sencillo analizar esta información visualmente. será distinta.## 2 0. El número de pasos. Para estabilizar la red se procesan los mismos ejemplos de manera reiterada y en distinto orden. también conocido como épocas. Para ello facilitaremos dicha variable a la función plot(). hasta que se converge a un cierto umbral de mejora o se alcanza un máximo de pasos.009210339 28154 Por cada repetición se indica el error cometido. lo cual afectará a la precisión de la ANN. con distintas tasas de error. para las entradas facilitadas. Esto provoca que para unos valores de entrada se genere una cierta salida que en el futuro. Dado que en la variable ann tenemos varias ANN. determinar qué variable aporta más peso a la predicción de una salida. por ejemplo.A partir de esta representación. también podemos utilizar la función gwplot() para obtener una representación de los pesos generalizados (GW. Sobre ese valor se aplicaría una función. la función de activación de la neurona. Por defecto neuralnet usa la función de activación logística o sigmoidal. son temas a analizar con más detalle con posterioridad Además de el diagrama de la red con sus conexiones y pesos. cuyo valor se calcula como la suma ponderada de todas esas entradas. no es de extrañar . así como la forma en que se ajustan los pesos que conectan las neuronas. Las posibles funciones de activación y su naturaleza. De esta forma se obtiene una salida de cada neurna de la capa oculta. Primero habría que multiplicar esos valores por los pesos que indica cada uno de los enlaces. tras aprender la función hipotenusa. Esta neurona de salida no efectúa procesamiento alguno sobre dicho valor. como no lo hacen las de entrada. En nuestra ANN de ejemplo. Todas ellas actúan como entrada para la neurona de salida. Esto nos permitiría. podríamos tomar dos valores cualesquiera como catetos y seguir paso a paso su evolución por la ANN. o usando directamente los datos contenidos en la variable ann. que generará un valor de salida. A continuación sumaríamos todas las entradas que llegan a cada neurona oculta. Generalized Weights) de una variable de entrada respecto a una de salida. Para ello le facilitaremos la variable que contiene la configuración de la ANN. opcionalmente. Para ello usaremos la función compute().frame con los valores para las variables de entrada y.covariate = 'Cat2'. las predicciones hechas por la ANN. rep = 'best') gwplot(ann.2)) gwplot(ann. indicaremos cuál de las repeticiones de la ANN queremos usar. sino para obtener una predicción de cual debería ser el valor resultante de la función aprendida.covariate = 'Cat1'. las variables Cat1 y Cat2 y se las facilitamos a la mencionada función. selected. selected. tal y como se aprecia en las siguientes gráficas. un data. que contenía datos que nos hemos usado para el entrenamiento de la red. podemos entregarle nuevas entradas no con el objetivo de que continúe aprendiendo. rep = 'best') Usar la red para predecir nuevos resultados Teniendo la red ya entrenada.que ambas variables predictoras tengan una aportación muy similar a la única salida existente. par(mfrow=c(1. Guardamos el resultado. en una . En el siguiente ejemplo tomamos de la variable test. 211103 7.944272 8. .440676 0. test[ .0073460068 ## 11 7.806248 12.848858 9.0004486178 ## 50 9.324555 6.0030554192 ## 23 12.770330 10.0001631464 ## 65 9.833014 0.433981 9.830952 5.output$net.324555 6.752390 0.708204 6. De hecho. output <. una ANN que ha aprendido la fórmula de cálculo de la hipotenusa a partir de un conjunto de ejemplos.result.661904 11.065179 0. calculado al inicio con la fórmula estándar.0112463423 ## 46 6.816654 10.055385 8.453624 13.frame(Real = test$Hyp.240295 0.0091933728 ## 56 2.variable.298307 0.806746 0.308947 0. c("Cat1".result) / test$Hyp) ## Real Predicted Error ## 92 2.0024678879 ## 29 10.0017158867 ## 13 9.0004764913 ## 40 10.833014 0. Error = abs(test$Hyp .191375 0.295630 10.801268 0.605551 3.0016218635 ## 93 6.0103002953 ## 67 7.0009562177 ## 81 8. Predicted = output$net. con capacidad para calcularla con una precisión bastante aceptable.0308848440 ## 70 9.417614 0.0016218635 ## 27 10.450169 0.285211 0.634956 0.0022507360 ## 42 10.775711 0.082763 6.0015643057 ## 52 13.0016656643 ## 80 6. si nos quedásemos solo con los dos primeros decimales en muchos casos no habría error.433981 9.594130 0.833014 0.329940 0.0024678879 ## 73 6.062258 8.810250 7.0014224150 ## 91 6.0007543457 ## 78 7. A continuación generamos una tabla de resultados mostrando en la primera columna el valor real de la hipotenusa.0002592288 ## 83 9.0013909484 ## 98 11.530750 0.847251 0.800146 0.630146 10.828427 2.0014093093 Tenemos.779209 0.280110 7.646775 0.219544 9.061162 0.285211 0.0007006547 ## 82 11.0016218635 ## 7 7.280110 7.640311 0.0041501777 ## 88 5.615773 7.630146 10.828427 2.658925 0.0081552986 ## 39 11.180340 11. en la segunda el valor predicho por la ANN y en la tercera el error cometido.828427 2.compute(ann. "Cat2")].0088738476 ## 10 3.0007006547 ## 33 8.324555 6.308947 0.0028418888 ## 85 2.0012352937 ## 62 7.281120 0.216542 0.401754 11.081186 0.0001358848 ## 60 10. rep = 1) data.955321 0.0007096880 ## 61 9. por tanto.219544 9.
Copyright © 2024 DOKUMEN.SITE Inc.