Full text
TRABAJO DE FIN DE GRADO Modelos de Aprendizaje Profundo. Aplicaciones con R y Python Presentado por: Raquel Beltrán Barba Tutor: D. RAFAEL PINO MEJÍAS FACULTAD DE MATEMÁTICAS Sevilla, Junio de 2022
Índice general 1 Introducción 11 1.1 De la Inteligencia Artificial al Aprendizaje Profundo . . . . . . . . . . . 11 1.2 ¿Qué es el aprendizaje profundo? . . . . . . . . . . . . . . . . . . . . . . 12 1.3 Ventajas que ofrece el aprendizaje profundo . . . . . . . . . . . . . . . . 13 1.4 Aplicaciones................................. 14 2 Redes Neuronales Artificiales 15 2.1 Fundamentos biológicos de las redes neuronales . . . . . . . . . . . . . . 15 2.2 Redes Neuronales Artificiales . . . . . . . . . . . . . . . . . . . . . . . . 17 2.2.1 Conceptos básicos . . . . . . . . . . . . . . . . . . . . . . . . . 17 2.2.2 Mecanismos de aprendizaje . . . . . . . . . . . . . . . . . . . . . 22 2.2.3 Tiposderedes............................ 23 2.2.4 Elperceptrón ............................ 25 2.2.4.1 El perceptrón simple . . . . . . . . . . . . . . . . . . . 25 2.2.4.2 El perceptrón múltiple . . . . . . . . . . . . . . . . . . 25 2.3 Redes de aprendizaje profundo en RStudio y Python . . . . . . . . . . . . 27 2.3.1 Análisis de RNAs en RStudio: Trabajando con la librería h2o . . . 27 2.3.2 Análisis de RNAs en Python: Trabajando con las librerías Tensorflow, Scikit-Learn y Keras . . . . . . . . . . . . . . . . . . . . . 29 3 Ejemplo de clasificación 31 3.1 Planteamiento del problema . . . . . . . . . . . . . . . . . . . . . . . . . 31 3.2 Comentarios sobre la base de datos . . . . . . . . . . . . . . . . . . . . . 31 3.3 Resolución en RStudio . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 3.3.1 Comentarios sobre los resultados obtenidos . . . . . . . . . . . . 48 3.4 ResoluciónenPython............................ 49 3.4.1 Comentarios sobre los resultados obtenidos . . . . . . . . . . . . 58 3.5 Comparación de eficiencia de ambos programas . . . . . . . . . . . . . . 58 4 Ejemplo de regresión 59 4.1 Planteamiento del problema . . . . . . . . . . . . . . . . . . . . . . . . . 59 4.2 Comentarios sobre la base de datos . . . . . . . . . . . . . . . . . . . . . 59 4.3 Resolución en RStudio . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 4.3.1 Comentarios sobre los resultados obtenidos . . . . . . . . . . . . 67 4.4 ResoluciónenPython............................ 67 4.4.1 Comentarios sobre los resultados obtenidos . . . . . . . . . . . . 73 4.5 Comparación de eficiencia de ambos programas . . . . . . . . . . . . . . 73 2
Índice general 3 5 Ejemplo de clasificación de imágenes 75 5.1 Planteamiento del problema . . . . . . . . . . . . . . . . . . . . . . . . . 75 5.2 Comentarios sobre la base de datos . . . . . . . . . . . . . . . . . . . . . 76 5.3 Resolución en RStudio . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 5.3.1 Comentarios sobre los resultados obtenidos . . . . . . . . . . . . 80 5.4 ResoluciónenPython............................ 80 5.4.1 Comentarios sobre los resultados obtenidos . . . . . . . . . . . . 87 5.5 Comparación de eficiencia de ambos programas . . . . . . . . . . . . . . 87 Bibliografía 89 Anexos 91
Resumen La Inteligencia Artificial avanza desde hace unos años a pasos agigantados. El Aprendizaje Profundo (Deep Learning), una rama específica de ésta, no se queda atrás. Se ha desarrollado tanto que lo podemos aplicar en muchos los ámbitos de nuestra vida. Este aprendizaje es característico por estar basado en el funcionamiento de las redes neuronales que conforman el cerebro biológico. El análisis de estas redes y algunas aplicaciones concretas serán el objeto de estudio de este Trabajo de Fin de Grado. El trabajo comienza con una introducción a la Inteligencia Artificial hasta llegar a la explicación del Aprendizaje Profundo, donde se habla de sus ventajas y aplicaciones en el día a día. Tras comentar brevemente la similitud con el cerebro humano, se pasa a la clasificación de los modelos según el aprendizaje y la topología. Explicamos también algunos conceptos relacionados. Antes de empezar a trabajar con los ejemplos, se hace una breve introducción a las librerías de los programas que se van a utilizar y sus correspondientes funciones. Los ejemplos que se resuelven son tres: Detección de transacciones fraudulentas con tarjetas de crédito, Predicción del precio del vino español y Clasificación de diferentes prendas a través de imágenes. 5
6 Índice general
Abstract Artificial Intelligence has taken quantum leaps these last years. Deep Learning, an especific branch of A.I., isn’t too far behind. It has developed so much that it is useful in almost every aspect of our lives. This type of learning is special because it is based on how neural networks work inside biological brains. The analysis of these networks and its applications will be the subject of this Final Degree Project. This dissertation starts by introducing Artificial Intelligence until reaching Deep Learning, where all its advantages and applications are explained. After a brief comment on its similarity with the biological brain, different neural networks are classified by it topology and Machine Learning methods. Some necessary concepts are also explained. Before we start working on some Deep Learning examples, a brief introduction on libraries and its functions used in Rstudio and Python are explained. We are solving three examples: Credit card fraud detection, Spanish wine price prediction and image clasification of different types of clothing. 7
Índice de figuras 2.1 Partes de una neurona biológica . . . . . . . . . . . . . . . . . . . . . . . 16 2.2 Representacion gráfica de las 3 capas de una Red Neuronal Artificial . . . 17 2.3 Representación gráfica de la función de activación lineal . . . . . . . . . 18 2.4 Representación gráfica de la función de activación paso . . . . . . . . . . 19 2.5 Representación gráfica de la función de activación sigmoidea . . . . . . . 19 2.6 Representación gráfica de la función de activación tangente hiperbólica . . 20 2.7 Representación gráfica de la función de activación ReLU . . . . . . . . . 20 2.8 Representación gráfica de la función de activación Softmax . . . . . . . . 21 2.9 Estructura de un perceptrón simple . . . . . . . . . . . . . . . . . . . . . 23 2.10 Estructura de un perceptrón multicapa . . . . . . . . . . . . . . . . . . . 23 2.11 Estructura de una Red Neuronal Convolucional . . . . . . . . . . . . . . 24 2.12 Estructura de una Red Neuronal Recurrente . . . . . . . . . . . . . . . . 24 3.1 Representación gráfica de la matriz de correlaciones . . . . . . . . . . . . 32 3.2 Representación gráfica de las variables Amount y V2 . . . . . . . . . . . 33 3.3 Representación gráfica de las variables Time y V3 . . . . . . . . . . . . . 34 3.4 Curva ROC y AUC correspondiente al primer modelo de clasificación . . 37 3.5 Curvas ROC para los conjuntos entrenamiento y test . . . . . . . . . . . . 37 3.6 Importancia de las variables del modelo . . . . . . . . . . . . . . . . . . 38 3.7 Curva ROC y AUC correspondiente al segundo modelo de clasificación . 40 3.8 Curvas ROC para los conjuntos entrenamiento y test . . . . . . . . . . . . 41 3.9 Importancia de las variables del modelo . . . . . . . . . . . . . . . . . . 41 3.10 Curva ROC y AUC correspondiente al tercer modelo de clasificación . . . 43 3.11 Curvas ROC para los conjuntos entrenamiento y test . . . . . . . . . . . . 44 3.12 Importancia de las variables del modelo . . . . . . . . . . . . . . . . . . 44 3.13 Curva ROC y AUC correspondiente al cuarto modelo de clasificación . . 46 3.14 Curvas ROC para los conjuntos entrenamiento y test . . . . . . . . . . . . 47 3.15 Importancia de las variables del modelo . . . . . . . . . . . . . . . . . . 47 3.16 Proporcion de transacciones fraudulentas y no fraudulentas . . . . . . . . 49 3.17 Representación gráfica de las variables Amount y V2 . . . . . . . . . . . 50 3.18 Representación gráfica de las variables Amount y V7 . . . . . . . . . . . 50 3.19 Representación gráfica de la curva ROC en el primer modelo . . . . . . . 52 3.20 Representación gráfica de la curva ROC en el segundo modelo . . . . . . 54 3.21 Representación gráfica de la curva ROC en el tercer modelo . . . . . . . . 56 3.22 Representación gráfica de la curva ROC en el cuarto modelo . . . . . . . 57 4.1 Representación gráfica de la matriz de correlaciones . . . . . . . . . . . . 60 4.2 Representación gráfica de las variables price y rating . . . . . . . . . . . 61 8
Índice de figuras 9 4.3 Representación gráfica de las variables price y year . . . . . . . . . . . . 62 4.4 Representación gráfica de la matriz de correlaciones . . . . . . . . . . . . 68 4.5 Representación gráfica de las variables price y rating . . . . . . . . . . . 69
16 2.1. Fundamentos biológicos de las redes neuronales determina la fuerza y el tipo de relación entre ellas. Figura 2.1: Partes de una neurona biológica Una vez hemos visto cómo trabajan las redes de neuronas en el cerebro, podemos ver las similitudes con el procesamiento de información que realizan los computadores convencionales a través de las capas de entrada, ocultas y de salida.
Capítulo 2. Redes Neuronales Artificiales 17 2.2. Redes Neuronales Artificiales 2.2.1. Conceptos básicos Los principales conceptos a conocer de una RNA son los siguientes: Capa de entrada: Se llama capa de entrada a la que recibe directamente la información que viene de fuentes externas a la red. Capa oculta: Estas capas no tienen ningún contacto con el exterior y pueden contar con varios niveles. La forma en la que se conectan las neuronas de esta capa oculta define las distintas topologías de las redes neuronales. Capa de salida: Esta capa devuelve la información que buscábamos predecir tras aplicar la función de activación. Figura 2.2: Representacion gráfica de las 3 capas de una Red Neuronal Artificial Función de entrada o regla de propagación s: [4] Una RNA trata muchos valores de entrada, y debe enfrentarse al problema de cómo combinar estas diferentes entradas y cómo asignarles la importancia que debe tener cada una. Para ello contaremos con el concepto del peso sináptico, que al multiplicar cada valor de entrada con el correspondiente conseguiremos cambiar la influencia de cada valor en la capa de entrada. Tipos de funciones de entrada conocidos:
18 2.2. Redes Neuronales Artificiales 1. Sumatorio de las entradas ponderadas, que suma el producto de cada valor de entrada por su peso correspondiente. n X j=1 (nijwij),(2.2.1) 2. Producto de las entradas ponderadas, que es el producto de las multiplicaciones entre los valores de entrada y los pesos. n Y j=1 (nijwij)(2.2.2) 3. Máximo de las entradas ponderadas, que sólo elige el máximo del producto de los valores de entrada por el peso correspondiente. Maxj(nijwij), con j=1,2, ..., n(2.2.3) La notación de las funciones de entrada es la siguiente: nij hace referencia al valor de entrada número jen la neurona i; y wij es el peso correspondiente a la neurona i en la entrada j. Función de activación: Una neurona biológica tiene dos estados: estará activa o inactiva. Las neuronas artificiales pueden tener estos dos, o varios estados a la vez. Para saber en qué estado de la actividad se encuentra una neurona necesitaremos la función de activación. [1] Esta puede ser de los siguientes tipos: 1. Función lineal, que es la función de activación más simple, ya que devuelve como output el valor introducido. Esta función de activación se utiliza más en las capas de salida de las regresiones. f(x) = x(2.2.4) Figura 2.3: Representación gráfica de la función de activación lineal
Capítulo 2. Redes Neuronales Artificiales 19 2. Función paso, que es otra función de activación simple, donde se devuelve el valor 1 (o verdadero) cuando los datos recibidos superan un cierto umbral (normalmente 0 ó 0.5). f(x) = 1si x ≥0,5 0si x < 0,5 (2.2.5) Figura 2.4: Representación gráfica de la función de activación paso 3. Función sigmoidea, que la utilizamos para asegurarnos de que los valores se encontrarán en un rango relativamente pequeño. f(x) = 1 1 + e−x(2.2.6) Figura 2.5: Representación gráfica de la función de activación sigmoidea
20 2.2. Redes Neuronales Artificiales 4. Función tangente hiperbólica, muy útil para las RNAs que necesitan como output valores entre -1 y 1. f(x) = tanh(x)(2.2.7) Figura 2.6: Representación gráfica de la función de activación tangente hiperbólica 5. Función ReLU (Rectified Linear Unit), introducida en el año 2000 por Teh y Hinton, sustituyó en muchos lugares a la función tangente hiperbólica debido a que tenía mejores resultados en el conjunto de entrenamiento, sobre todo para trabajar en las capas ocultas. f(x) = max(0, x) = 0si x < 0 x si x ≥0 (2.2.8) Figura 2.7: Representación gráfica de la función de activación ReLU
Capítulo 2. Redes Neuronales Artificiales 21 6. Función Softmax, que la encontraremos principalmente como función de activación en la capa de salida para RNAs de clasificación. Con esta función de activación la salida es un conjunto de probabilidades asociadas a cada tipo de clasificación, eligiendo la mayor probabilidad como el grupo en que lo clasificamos. Si no utilizáramos el método Softmax, la salida serían un grupo de valores numéricos, y tendríamos que elegir el mayor. f(i) = exi Pn j=0 exj,(2.2.9) donde xrepresenta los valores de las neuronas (j) de la capa de salida. Figura 2.8: Representación gráfica de la función de activación Softmax
22 2.2. Redes Neuronales Artificiales 2.2.2. Mecanismos de aprendizaje [4]Una red neuronal debe conseguir sacar una salida lo más correcta posible para cada conjunto de datos recibido. Para ello se debe llevar a cabo un proceso de entrenamiento o acondicionamiento a través de lo que denominaremos conjunto de datos de entrenamien- to. Este aprendizaje consiste en ir modificando los pesos sinápticos según la información recibida. Diremos que este proceso de aprendizaje habrá terminado cuando los valores de los pesos se mantengan estables. Para determinar cuándo se debe acabar el proceso de aprendizaje, se necesita establecer una condición de detención, que por lo general será cuando la diferencia entre lo que la red ha proporcionado como salida y el resultado verdadero este por debajo de un umbral establecido o se haya alcanzado un número concreto de ciclos/pasos de entrenamiento. Para trabajar con la modificación de estos pesos podemos utilizar dos métodos: Aprendizaje supervisado Con el aprendizaje supervisado el proceso es vigilado por un agente externo, que determina la respuesta que debería generar la red al proporcionarle una entrada concreta. Si la red falla y no da la salida que proporciona el agente externo deberán modificarse los pesos hasta conseguir la salida correcta. Esta corrección de pesos se puede hacer ajustando los pesos en función de la diferencia entre los valores deseados y los obtenidos (aprendizaje por corrección de error), modificando los pesos si la red no acierta el resultado –que no habrá recibido previamente- (aprendizaje por refuerzo) o cambiando aleatoriamente los valores de los pesos hasta encontrar la combinación que nos dé el resultado más parecido al correcto (aprendizaje estocástico). Aprendizaje no supervisado Las redes con este aprendizaje no requieren de un agente externo que ayude a regular los pesos de las conexiones entre neuronas. Aquí las redes deben relacionar los datos que se reciben de entrada según características, regularidades o categorías. Cuando consiga generar la salida, no sabrá si es la correcta o no. Además, el aprendizaje no supervisado se puede dividir en aprendizaje hebbiano (permite medir la familiaridad o extraer las características de los datos recibidos), aprendizaje competitivo y comparativo (que permite realizar clasificaciones de los datos de entrada) y aprendizaje por refuerzo (similar al aprendizaje por corrección de errores, pero sin tener un conjunto completo de los datos exactos de salida).
Capítulo 2. Redes Neuronales Artificiales 23 2.2.3. Tipos de redes Según la topología de la red, podemos clasificar las Redes de Neuronas Artificiales en los siguientes grupos: Red Neuronal Monocapa o Perceptrón Simple, compuestas por un solo nivel de neuronas que se unen mediante conexiones laterales. Figura 2.9: Estructura de un perceptrón simple Red Neuronal Multicapa o Perceptrón Multicapa, donde las neuronas se disponen en dos o más capas. Figura 2.10: Estructura de un perceptrón multicapa Red Neuronal Convolucional (CNN), similar al Perceptrón Multicapa con la excepción de que cada neurona no se une con todas las capas que debería, sino con un subgrupo, con el fin de reducir la complejidad computacional. Este tipo de modelos son muy buenos para el procesado de imágenes, ya que están
24 2.2. Redes Neuronales Artificiales diseñados para imitar la estructura de la corteza visual, con sus neuronas organizadas para tratar con las tres dimensiones: altura, anchura y profundidad. Figura 2.11: Estructura de una Red Neuronal Convolucional Red Neuronal Recurrente (RNN), que no funciona por capas, sino que permiten conexiones arbitrarias con otras neuronas que a veces crean ciclos (así la red puede conseguir tener memoria). Estos modelos se utilizan principalmente en reconocimiento de voz y escritura. Figura 2.12: Estructura de una Red Neuronal Recurrente Redes de Base Radial (RBF), que calculan la salida en función de la distancia a un punto denominado centro. Esta salida es combinación lineal de las funciones de activación radiales utilizadas por cada neurona.
Capítulo 2. Redes Neuronales Artificiales 25 2.2.4. El perceptrón [5]El Perceptrón, que podría ser históricamente el primer modelo de Neurona Artificial propuesto (por el psicólogo F. Rosenblatt, en 1958), es la estructura básica de prácticamente todas las Redes de Neuronas Artificiales, por lo similar que es el modelo de neurona biológico. Rosenblatt defendió en 1961 el teorema del aprendizaje del Perceptrón, donde explica que un Perceptrón puede resolver todo lo que pueda simular o representar. Esto es cierto si tenemos en cuenta que los perceptrones se pueden agrupar formando capas, ya que no todos los tipos de modelos los podría resolver un solo perceptrón. 2.2.4.1. El perceptrón simple Un Perceptrón Simple o Mononivel es una Red de Neuronas Artificiales alimentada hacia delante que cuenta con dos capas que funciona de la siguiente forma: En la capa de entrada se reciben los valores correspondientes que se envían directamente a la capa de salida tras sumar la multiplicación de cada valor por su peso correspondiente y el bias. Esta suma pasará por la función de activación (función paso o signo) que definirá la salida. Si tomamos como vector de entrada x = (x1, x2, . . . , xp)′,la función de activación signo y definiendo x0= 1 tendríamos: y= 1si Pp i=0(wixi)≥0 −1si Pp i=0(wixi)≤0 (2.2.10) El objetivo del Perceptrón simple es la clasificación en dos conjuntos correctamente. Definimos además el error total de clasificación como el total de patrones de entrenamien- to que la red ha clasificado incorrectamente. 2.2.4.2. El perceptrón múltiple Definimos el Perceptrón Multinivel o Multicapas como la Red Neuronal Artificial alimentada hacia delante con 3 o más capas de neuronas. Dependiendo del número de conexiones de la red esta puede ser total o parcialmente conectada. Para una red total cada neurona de una misma capa estará conectada con todas las neuronas de la siguiente capa. Además, dependiendo de en qué sentido se envían y reciben las señales de cada neurona tendríamos dos tipos de Perceptrones Multicapa:
32 3.3. Resolución en RStudio 3.3. Resolución en RStudio Primero vamos a realizar un estudio de las variables en RStudio antes de empezar con las estructuras de las RNAs. Tras una primera lectura vemos que las transacciones separadas en fraudulentas y no fraudulentas tienen las siguientes proporciones: 0 (Tr. no fraudulenta) 1 (Tr. fraudulenta) 284315 492 A continuación veamos las relaciones entre las variables del conjunto de datos a través de la matriz de correlaciones y una representación gráfica que nos facilite su estudio: Figura 3.1: Representación gráfica de la matriz de correlaciones Vemos cómo no habría correlación entre variables que sea significativa, pero por si acaso vamos a estudiar algunos casos donde la casilla se marca más:
Capítulo 3. Ejemplo de clasificación 33 Entre las variables Amount yV2 El valor de la correlación entre estas dos variables es de -0.5314089, es decir, que tienen una relación no muy fuerte y negativa entre ellas: cuando una variable crece, la otra decrecerá pero no de forma significativa. Si lo vemos gráficamente tendríamos: Figura 3.2: Representación gráfica de las variables Amount y V2 Podríamos intuir que cuando baja el valor de la variable V2 aumentaría el dinero que se ha transferido. No queda claramente representada esta correlación, ya que en realidad no es un valor que nos debiera preocupar. Entre las variables Time yV3 El valor de la correlación entre estas dos variables es -0.4196182, también indicando una relación de mediana importancia y negativa, es decir, cuando creciera el valor de una variable, bajará el de la otra. Veámoslo gráficamente:
34 3.3. Resolución en RStudio Figura 3.3: Representación gráfica de las variables Time y V3 Aquí no podemos apreciar esta influencia que una variable ejercería sobre la otra, y podemos atribuirlo a que el valor de la correlación entre estas dos variables en realidad no es tan alto como para que pudiera tener un efecto, aunque en la matriz de correlaciones pareciera que alguno podía tener. El resto de valores de correlación están por debajo de 0.4, luego no merece la pena estudiarlos. Una vez visto que no tenemos problemas con la interacción de las variables, procedo a trabajar con el conjunto de datos para estudiar distintas estructuras de Redes Neuronales Artificiales: La partición en conjunto de datos test y entrenamiento la haremos con una proporción 70/30 y trabajaremos con la librería h2o.
Capítulo 3. Ejemplo de clasificación 35 Voy a estudiar varias estructuras que modifican el número de capas ocultas y los nodos correspondientes, ya que las capas de entrada y de salida tienen la siguiente estructura fija (en este conjunto de datos): La capa de entrada cuenta con tantas neuronas como variables de entrada requiere, en nuestro caso una por cada una de las 28 variables especiales de la transacción, la variable Time y la variable Amount. La capa de salida, al tratarse de un ejemplo de clasificación en 2 tipos diferentes (Transacción Fraudulenta o No Fraudulenta), contará con 2 neuronas en la capa de salida. Ahora, marcando unos parámetros concretos para todas las estructuras que cree a continuación, obtendremos diferentes modelos de los que estudiaremos la especificidad,la sensibilidad,la matriz de confusión, el área bajo la curva (AUC),la importancia de las variables, etc. 1. Modelo con dos capas ocultas y 25 nodos en cada una Contamos con un problema de clasificación de dos clases, que sigue distribución multinomial y con estructura 30-25-25-2. La función de activación es la mencionada anteriormente (ReLU, Rectifier Linear Unit), y la función Softmax para la capa de salida. Obtenemos en este caso la siguiente información: Raíz del error cuadrático medio: El valor del RMSE es 0.0277491, bastante apropiado ya que se acerca a 0. Área bajo la curva (AUC): El área obtenido es 0.964825, bastante bueno también, aunque podemos estar acostumbrados a AUC más altos. Matriz de confusión:
36 3.3. Resolución en RStudio 0 1 085268 15 139 120 Cuadro 3.1: Tabla de confusión para el primer modelo propuesto en RStudio La interpretación de esta tabla de confusión sobre los datos test es la siguiente: De las 85283 transacciones no fraudulentas, el modelo de RNA ha clasificado 85268 correctamente, mientras que ha clasificado de forma errónea como fraudulenta 15. Por otro lado, de las 159 transacciones que sí eran fraudulentas, el modelo ha clasificado correctamente 120 de ellas. Esto implicaría un porcentaje de fallo sobre las no fraudulentas de un 0.0176%, mientras que obtendríamos un porcentaje del 24.5283 % sobre las que sí son fraudulentas. De estos dos porcentajes obtenemos los valores de la sensibilidad y la especificidad: Sensibilidad: 1−0,000176 = 0,999824 (3.3.1) Esta nos está indicando la porporción de transacciones fraudulentas que el modelo ha clasificado correctamente como tales. Especificidad: 1−0,245283 = 0,754717 (3.3.2) Esta nos está indicando la porporción de transacciones no fraudulentas que el modelo ha clasificado correctamente como tales. Una vez hemos obtenido y comentado los resultados más relevantes del modelo, vamos a realizar la predicción sobre el conjunto test para comprobar si este modelo es adecuado o no. Una representación de la curva ROC y su correspondiente AUC es la siguiente:
Capítulo 3. Ejemplo de clasificación 37 Figura 3.4: Curva ROC y AUC correspondiente al primer modelo de clasificación Además contamos con otra representación de las curvas ROC para el conjunto de datos test y entrenamiento, que, como podemos apreciar y es lógico, es superior en el conjunto de datos de entrenamiento: Figura 3.5: Curvas ROC para los conjuntos entrenamiento y test Por último, hemos obtenido este gráfico que nos explica para este modelo cuales han sido las variables con mayor importancia. En el caso de este modelo, las variables más importantes han sido:
38 3.3. Resolución en RStudio Figura 3.6: Importancia de las variables del modelo
Capítulo 3. Ejemplo de clasificación 39 2. Modelo con dos capas ocultas y 10 nodos en cada una La estructura de esta red es la misma que la anterior, sólo cambiando el número de nodos en las capas ocultas. Obtenemos en este caso la siguiente información: Raíz del error cuadrático medio: Obtenemos un valor de 0.02563881, bastante bueno para lo que buscamos Área bajo la curva (AUC): El AUC que obtenemos con este modelo es 0.9466821, también bueno, aunque se podría mejorar más. Matriz de confusión: 0 1 085268 15 138 121 Cuadro 3.2: Tabla de confusión para el segundo modelo propuesto en RStudio La interpretación de esta tabla de confusión sobre los datos test es la siguiente: De las 85283 transacciones no fraudulentas, el modelo de RNA ha clasificado 85268 correctamente, mientras que ha clasificado de forma errónea como fraudulenta 15. Por otro lado, de las 159 transacciones que sí eran fraudulentas, el modelo ha clasificado correctamente 121 de ellas. Esto implicaría un porcentaje de fallo sobre las no fraudulentas de un 0.0176%, mientras que obtendríamos un porcentaje del 23.8994 % sobre las que sí son fraudulentas. Sensibilidad: 1−0,000176 = 0,999824 (3.3.3) La sensibilidad del modelo nos dice que de cada 100 transacciones que son fraudulentas, 99 habrán sido clasificadas correctamente como tal.
40 3.3. Resolución en RStudio Especificidad: 1−0,238994 = 0,761006 (3.3.4) La especificidad del modelo nos dice que de cada 100 transacciones que son fraudulentas, 76 habrán sido clasificadas correctamente como tal. Una vez hemos obtenido y comentado los resultados más relevantes del modelo, vamos a realizar la predicción sobre el conjunto test para comprobar si este modelo es adecuado o no. Una representación de la curva ROC y su correspondiente AUC es la siguiente: Figura 3.7: Curva ROC y AUC correspondiente al segundo modelo de clasificación Además contamos con otra representación de las curvas ROC para el conjunto de datos test y entrenamiento, que, como podemos apreciar y es lógico, es superior en el conjunto de datos de entrenamiento:
Capítulo 3. Ejemplo de clasificación 41 Figura 3.8: Curvas ROC para los conjuntos entrenamiento y test Por último, hemos obtenido este gráfico que nos explica para este modelo cuales han sido las variables con mayor importancia. En el caso de este modelo, las variables más importantes han sido: Figura 3.9: Importancia de las variables del modelo
48 3.3. Resolución en RStudio 3.3.1. Comentarios sobre los resultados obtenidos He de decir primero que los cuatro modelos propuestos ofrecen muy buenos resultados: RMSE muy cercano a 0, AUC muy alto y matrices de confusión similares. Es importante destacar que en este problema, el objetivo es identificar el mayor número de transacciones fraudulentas posibles. Por esto mismo, necesitamos priorizar el valor de la sensibilidad sobre el de la especificidad, ya que la sensibilidad indica el porcentaje de fraudulentas identificadas correctamente de las transacciones que realmente lo son. Entonces, para elegir el mejor modelo vamos a buscar la mejor sensibilidad: Los cuatro modelos cuentan con una sensibilidad magnífica (más de 0.999), así que vamos a elegir el mejor entonces en función del resto de valores que he obtenido del modelo. Viendo como la especificidad y el AUC del tercer modelo (Modelo con una capa oculta y 25 nodos) son las más altas, elijo ese modelo como el óptimo para resolver este problema.
Capítulo 3. Ejemplo de clasificación 49 3.4. Resolución en Python Vamos a seguir un proceso similar al hecho con RStudio. Primero vamos a estudiar las variables del conjunto de datos: La proporción de transacciones fraudulentas y no fraudulentas se puede apreciar en la siguiente gráfica: Figura 3.16: Proporcion de transacciones fraudulentas y no fraudulentas Podemos apreciar como es mucho menor el número de transacciones fraudulentas. Veamos ahora si existe una correlación significativa entre las variables del conjunto de datos a través de la información que nos ofrece la matriz de correlaciones. Como contamos con muchas variables para desarrollar la matriz entera, vamos a representar en una tabla las que tienen un mayor coeficiente: Variable 1 Variable 2 Coeficiente V.Abs Amount V2 -0.531409 0.531409 Amount V7 0.397311 0.397311 Amount V5 -0.386356 0.386356 Amount V20 0.339403 0.339403 No obtenemos ningún par de variables con un coeficiente de correlación extremadamente alto. Vamos a representar gráficamente los dos primeros para ver si, aun tomando
50 3.4. Resolución en Python valores medianos, hay alguna relación visible entre ellas: Entre las variables Amount y V2 El coeficiente de correlación es -0.531409, mayor a 0.5, que podría indicar un grado medio de relación inversa: cuando una variable crezca la otra decrecerá. Figura 3.17: Representación gráfica de las variables Amount y V2 Para las cantidades de dinero más bajas podemos ver cómo se concentran en torno a 0 y -20,y cuando crece la cantidad de dinero transferida parece que va disminuyendo el valor de la variable V2, pero no deberíamos decir que ocurre esto claramente. Entre las variables Amount y V7 El coeficiente de correlación en este caso es menor y positivo, 0.397311, lo que quiere decir que la relación será menor y que cuando una crezca, la otra también lo hará. Figura 3.18: Representación gráfica de las variables Amount y V7
Capítulo 3. Ejemplo de clasificación 51 En este caso, podríamos decir que se asemeja a lo que debería ocurrir si hubiera correlación fuerte, que al aumnetar la cantidad de dinero en la transferencia, aumenta el valor de la variable V7, pero no ocurre así exactamente. Una vez visto que no hay correlaciones que nos causen problemas en el estudio del conjunto de datos, vamos a realizar la partición Entrenamiento(70)/Test(30) para comenzar a crear las estructuras de Redes de Neuronas Artificiales. Vamos a crear estos modelos con la misma estructura y parámetros que como hemos hecho en RStudio para hacer la comparación más acertada. 1. Modelo con dos capas ocultas y 25 nodos en cada una Contamos en este caso con una RNA que tiene dos capas ocultas y 25 nodos en cada capa. Una vez este modelo está creado y lo hemos ajustado a nuestras matrices de datos con las variables predictoras y la variable a predecir, obtenemos los siguientes resultados: Matriz de confusión: 0 1 085293 14 148 88 Cuadro 3.5: Tabla de confusión para el primer modelo propuesto en Python Esta tabla nos quiere decir lo siguiente: de 85307 registros que toman la transacción como no fraudulenta, el modelo ha sido capaz de clasificar correctamente 85293 de ellos, equivocándose en 14. De forma similar, de los 136
52 3.4. Resolución en Python registros que teníamos como fraudulentos, la red ha clasificado bien 88 de ellos, equivocándose en 48. Sensibilidad: Tendremos que calcularla por definición: 85293 85293 + 48 = 0,999438 (3.4.1) Obtenemos una sensibilidad muy alta, casi perfecta. Esto nos conviene mucho ya que lo interesante de este ejercicio es saber identificar correctamente las transacciones que son fraudulentas. Especificidad: También la calculamos por definición: 88 88 + 14 = 0,862745 (3.4.2) En este caso la especificidad es más baja, sigue siendo un buen valor pero no tan fiable como la sensibilidad. Una explicación de lo que significa este número es la siguiente: por cada 100 pruebas que se hagan sobre una transacción que sabemos que no es fraudulenta, el modelo acertará en clasificarlas correctamente en 86 de ellas. Porcentaje de acierto total (Accuracy score): En este modelo hemos obtenido un porcentaje del 99.927437 %, un valor idóneo. Curva ROC y AUC: Para este primer modelo obtenemos un valor del Área Bajo la Curva de 0.95, valor bastante alto, nos indica que se podría tratar de un buen modelo. La representación de la curva ROC es la siguiente: Figura 3.19: Representación gráfica de la curva ROC en el primer modelo 2. Modelo con dos capas ocultas y 10 nodos en cada una Contamos en este caso con una RNA que tiene dos capas ocultas y 10 nodos en
Capítulo 3. Ejemplo de clasificación 53 cada capa. Una vez este modelo está creado y lo hemos ajustado a nuestras matrices de datos con las variables predictoras y la variable a predecir, obtenemos los siguientes resultados: Matriz de confusión: 0 1 085280 27 124 112 Cuadro 3.6: Tabla de confusión para el segundo modelo propuesto en Python Esta tabla nos quiere decir lo siguiente: de 85307 registros que toman la transacción como no fraudulenta, el modelo ha sido capaz de clasificar correctamente 85280 de ellos. Por otro lado, de los 136 registros que teníamos como fraudulentos, la red ha clasificado bien 112 de ellos, equivocándose en 24. Sensibilidad: Tendremos que calcularla por definición: 85280 85280 + 27 = 0,999683 (3.4.3) Obtenemos una sensibilidad muy alta, casi perfecta. Esto nos conviene mucho ya que lo interesante de este ejercicio es saber identificar correctamente las transacciones que son fraudulentas. Especificidad: También la calculamos por definición: 112 112 + 27 = 0,805755 (3.4.4) En este caso la especificidad también es más baja. Una explicación de lo que significa este número es la siguiente: por cada 100 pruebas que se hagan sobre una transacción que sabemos que no es fraudulenta, el modelo acertará en clasificarlas correctamente en 80 de ellas. Porcentaje de acierto total (Accuracy score): En este modelo hemos obtenido un porcentaje del 99.94031 %, un valor idóneo.
54 3.4. Resolución en Python Curva ROC y AUC: Obtenemos también el AUC con valor de 0.95, valor bastante alto, nos indica que se podría tratar de un buen modelo. La representación de la curva ROC es la siguiente: Figura 3.20: Representación gráfica de la curva ROC en el segundo modelo 3. Modelo con una capa oculta y 25 nodos Contamos en este caso con una RNA que tiene una capa oculta y 25 nodos en ella. Una vez este modelo está creado y lo hemos ajustado a nuestras matrices de datos con las variables predictoras y la variable a predecir, obtenemos los siguientes resultados: Matriz de confusión:
Capítulo 3. Ejemplo de clasificación 55 0 1 085279 28 120 116 Cuadro 3.7: Tabla de confusión para el tercer modelo propuesto en Python Esta tabla nos quiere decir lo siguiente: de 85307 registros que toman la transacción como no fraudulenta, el modelo ha sido capaz de clasificar correctamente 85279 de ellosequivocándose en 28. Por otro lado, de los 136 registros que teníamos como fraudulentos, la red ha clasificado bien 116 de ellos, equivocándose en 20. Sensibilidad: Tendremos que calcularla por definición: 85279 85279 + 28 = 0,999672 (3.4.5) Obtenemos una sensibilidad muy alta, casi perfecta. Esto nos conviene mucho ya que lo interesante de este ejercicio es saber identificar correctamente las transacciones que son fraudulentas. Especificidad: También la calculamos por definición: 116 116 + 20 = 0,852941 (3.4.6) La especificidad es otra vez más baja. Una explicación de lo que significa este número es la siguiente: por cada 100 pruebas que se hagan sobre una transacción que sabemos que no es fraudulenta, el modelo acertará en clasificarlas correctamente en 85 de ellas. Porcentaje de acierto total (Accuracy score): En este modelo hemos obtenido un porcentaje del 99.94382 %, un valor idóneo. Curva ROC y AUC: Para este modelo obtenemos también un valor del Área Bajo la Curva de 0.95, valor bastante alto, nos indica que se podría tratar de un buen modelo. La representación de la curva ROC es la siguiente:
56 3.4. Resolución en Python Figura 3.21: Representación gráfica de la curva ROC en el tercer modelo 4. Modelo con una capa oculta y 5 nodos Contamos en este caso con una RNA que tiene una capa oculta y 5 nodos en ella. Una vez este modelo está creado y lo hemos ajustado a nuestras matrices de datos con las variables predictoras y la variable a predecir, obtenemos los siguientes resultados: Matriz de confusión: 0 1 085271 36 122 114 Cuadro 3.8: Tabla de confusión para el cuarto modelo propuesto en Python Esta tabla nos quiere decir lo siguiente: de 85307 registros que toman la transacción como no fraudulenta, el modelo ha sido capaz de clasificar correctamente 85271 de ellosequivocándose en 36. Por otro lado, de los 136 registros que teníamos como fraudulentos, la red ha clasificado bien 114 de ellos, equivocándose en 22.
Capítulo 3. Ejemplo de clasificación 57 Sensibilidad: Tendremos que calcularla por definición: 85271 85271 + 36 = 0,999578 (3.4.7) Obtenemos una sensibilidad muy alta, casi perfecta. Esto nos conviene mucho ya que lo interesante de este ejercicio es saber identificar correctamente las transacciones que son fraudulentas. Especificidad: También la calculamos por definición: 114 114 + 22 = 0,838235 (3.4.8) La especificidad es otra vez más baja. Una explicación de lo que significa este número es la siguiente: por cada 100 pruebas que se hagan sobre una transacción que sabemos que no es fraudulenta, el modelo acertará en clasificarlas correctamente en 83 de ellas. Porcentaje de acierto total (Accuracy score): En este modelo hemos obtenido un porcentaje del 99.9321 %, un valor idóneo. Curva ROC y AUC: En este caso conseguimos un Área Bajo la Curva de 0.96, valor levemente mayor a los anteriores y obviamente nos indica que se podría tratar de un buen modelo. La representación de la curva ROC es la siguiente: Figura 3.22: Representación gráfica de la curva ROC en el cuarto modelo
64 4.3. Resolución en RStudio Veamos qué información hemos obtenido del modelo: Raíz del Error Cuadrático Medio (RMSE): El obtenido en este modelo es 77.71608, un valor considerablemente alto (pero menor que en el modelo anterior) teniendo en cuenta que el precio medio de la botella de vino es de 67.3977 euros. Mean Residual Deviance: toma un valor de 6039.789, un valor que sigue siendo bastante alto, ya que buscamos que sea lo más cercano a 0 posible. R2:El valor del coeficiente de determinación que hemos obtenido es 0.6573941, es decir, este modelo explica un 65.73941% de la variabilidad del modelo. Este valor del R2no nos da la confianza suficiente en el modelo, aunque es mejor que el anterior. 3. Modelo con una capa oculta y 60 nodos Ahora vamos a trabajar con una RNA con 968 neuronas en la primera capa, 60 en la capa oculta (como hemos querido establecer) y 1 neurona en la capa de salida, que nos dará el valor del precio de la botella de vino.
Capítulo 4. Ejemplo de regresión 65 Veamos qué información hemos obtenido del modelo: Raíz del Error Cuadrático Medio (RMSE): El obtenido en este modelo es 63.52925, un valor que sigue siendo considerablemente alto (teniendo en cuenta que el precio medio de la botella de vino es de 67.3977 euros). Mean Residual Deviance: toma un valor de 4035.965, un valor alto aún, ya que buscamos que sea lo más cercano a 0 posible. R2:El valor del coeficiente de determinación que hemos obtenido es 0.7239635, es decir, este modelo explica un 72.39635% de la variabilidad del modelo. Este valor de R2es mejor que los anteriores, no es perfecto pero nos puede llegar a servir. 4. Modelo con tres capas ocultas y 30 nodos en cada una Por último vamos a trabajar con una RNA con 968 neuronas en la primera capa, 3 capas ocultas con 30 nodos en cada una y 1 neurona en la capa de salida, que nos dará el valor del precio de la botella de vino. Veamos qué información hemos obtenido del modelo: Raíz del Error Cuadrático Medio (RMSE): El obtenido en este modelo es 66.12811, un valor que sigue siendo considerablemente alto (teniendo en cuenta que el precio medio de la botella de vino es de 67.3977 euros). Mean Residual Deviance: toma un valor de 4372.927, valor alto, ya que buscamos que sea lo más cercano a 0 posible. R2:El valor del coeficiente de determinación que hemos obtenido es 0.7131944, es decir, este modelo explica un 71.31944% de la variabilidad del modelo. Este valor de R2no es ideal, debería ser más alto aún. 5. Modelo con dos capas ocultas y 646 nodos en cada una Ahora vamos a trabajar con una RNA con 968 neuronas en la primera capa, 646 en cada capa oculta (como hemos querido establecer) y 1 neurona en la capa de salida, que nos dará el valor del precio de la botella de vino. Para elegir ese número
66 4.3. Resolución en RStudio concreto de neuronas en la capa oculta hemos seguido la regla de tomar 2/3 aproximadamente del total de neuronas que hay en las capas de entrada y salida.[2] Veamos qué información hemos obtenido del modelo: Raíz del Error Cuadrático Medio (RMSE): El obtenido en este modelo es 47.48021, un valor que sigue siendo considerablemente alto (teniendo en cuenta que el precio medio de la botella de vino es de 67.3977 euros), pero bastante menor en comparación a los anteriores. Mean Residual Deviance: toma un valor de 2254.371, un valor que es bastante alto, ya que buscamos que sea lo más cercano a 0 posible. R2:El valor del coeficiente de determinación que hemos obtenido es 0.8060004, es decir, este modelo explica un 80.60004% de la variabilidad del modelo. Este valor de R2es mejor que los anteriores, y aunque no es mayor que 0.95, que sería lo óptimo, es bastante más acertado que los anteriores. 6. Modelo con una capa oculta y 646 nodos Ahora vamos a trabajar con una RNA con 968 neuronas en la primera capa, 646 en la capa oculta (como hemos querido establecer) y 1 neurona en la capa de salida, que nos dará el valor del precio de la botella de vino. Para elegir ese número concreto de neuronas en la capa oculta hemos seguido la regla de tomar 2/3 aproximadamente del total de neuronas que hay en las capas de entrada y salida.[2]
Capítulo 4. Ejemplo de regresión 67 Veamos qué información hemos obtenido del modelo: Raíz del Error Cuadrático Medio (RMSE): El obtenido en este modelo es 57.49214, un valor que sigue siendo considerablemente alto (teniendo en cuenta que el precio medio de la botella de vino es de 67.3977 euros). Mean Residual Deviance: toma un valor de 3305.347. R2:El valor del coeficiente de determinación que hemos obtenido es 0.785514, es decir, este modelo explica un 78.5514% de la variabilidad del modelo. 4.3.1. Comentarios sobre los resultados obtenidos Aquí elegir el modelo para resolver este problema es más fácil, ya que el penúltimo destaca por ser el mejor de todos en todos los aspectos (Modelo con dos capas ocultas y 646 nodos en cada una). Cuenta con un R2de 0.8060004, que no es ideal pero se acerca mucho a esa perfección que buscamos. 4.4. Resolución en Python Vamos a resolver esta vez el mismo problema pero en Python. Buscamos ahora una Red Neuronal Artificial que nos ayude a predecir el precio del vino español según las diferentes variables que se han descrito inicialmente. Como contamos con muchas de ellas cualitativas, vamos a estudiarlas por separado antes de crear los modelos. Primero veamos la matriz de correlaciones entre las variables cuantitativas del conjunto de datos:
68 4.4. Resolución en Python rating num_reviews price body acidity rating 1 0.015229 0.544809 0.163033 -0.094553 num_reviews 0.015229 1 -0.030083 0.067106 0.040138 price 0.544809 -0.030083 1 0.153624 -0.032870 body 0.163033 0.067106 0.153624 1 -0.017950 acidity -0.094553 0.040138 -0.032870 -0.017950 1 Cuadro 4.2: Matriz de correlaciones del ejemplo de regresión en Python Figura 4.4: Representación gráfica de la matriz de correlaciones Solo obtendríamos un par de variables cuya correlación es interesante de estudiar: Entre las variables rating y price El coeficiente de correlación asociado es 0.551943, que indicaría una relación directa y no muy fuerte: cuando una variable crezca la otra también lo hará, pero no claramente. veámoslo gráficamente:
Capítulo 4. Ejemplo de regresión 69 Figura 4.5: Representación gráfica de las variables price y rating Lo lógico sería que al aumentar la calificación que una botella de vino reciba, el precio de ésta suba, pero en esta gráfica no podemos confirmar que esto ocurre así, ya que hay botellas de bajo precio que obtienen las mayores calificaciones. Ahora veamos qué ocurre con las variables cualitativas. En la siguente tabla podremos ver cómo se distribuyen dichas variables: winery wine year region type count 7500 7500 7498 7500 6955 unique 480 847 71 76 21 top Contino Reserva 2011 Rioja Rioja Red freq 457 467 1190 2440 2357 Cuadro 4.3: Breve estudio de las variables cualitativas del ejemplo de regresión De este recuento podemos comentar lo siguiente: hay 480 tipos de bodegas diferentes que ofrecen hasta 847 tipos diferentes de vino, siendo el más repetido es el Reserva, que se reptite entre los registros del conjunto de datos hasta 467 veces. El año al que pertenecen la mayoría de los vinos (1190 de 7498 veces) es el año 2011. La gran mayoria de vinos provienen de la región de La Rioja, entre las 76 regiones diferentes que hay. Una vez tenemos comentadas las variables y vemos que no hay problema para trabajar con ellas, pasamos a estudiar las diferentes estructuras de Redes de Neuronas Artificiales que se proponen:
70 4.4. Resolución en Python 1. Modelo con dos capas ocultas de 8 nodos en cada una Obtendríamos aquí una red neuronal con dos capas ocultas que tienen 8 neuronas cada una, con funciones de activación ReLU en las capas ocultas y función lineal en la capa de salida. Para medir la efectividad de estos modelos miraremos sobre todo el valor que obtenemos como R2: R2:El valor del coeficiente de determinación es muy bajo, 0.201510123, que no nos da ninguna confianza sobre el modelo que acabamos de crear. RMSE: Obtenemos una Raíz del Error Cuadrático Medio bastante alto teniendo en cuenta que la media de los datos se encuentra en torno a 67 euros: 173.925 euros es el RMSE obtenido. 2. Modelo con una capa oculta y 15 nodos Obtendríamos aquí una red neuronal con una capa oculta que cuenta con 15 neuronas, con función de activación ReLU en la capa oculta y función lineal en la capa de salida. Para medir la efectividad de estos modelos miraremos el valor que obtenemos de R2y RMSE: R2:El valor del coeficiente de determinación lo obtenemos tras hacer las predicciones sobre el conjunto test en el modelo que acabamos de crear, y lo que obtenemos no es un valor bueno: el valor de R2es 0.212967, ligeramente mejor que el anterior pero sigue sin ser de confianza.
Capítulo 4. Ejemplo de regresión 71 RMSE: Obtenemos un RMSE similar al anterior, 172.672826, y sigue siendo bastante alto para definir nuestro modelo como bueno. 3. Modelo con una capa oculta y 60 nodos Aquí aumentamos el número de nodos en la capa oculta, pasamos a tener 60, con función de activación ReLU en lesta capa y función lineal en la capa de salida. Para medir la efectividad de estos modelos miraremos el valor que obtenemos como R2: R2:El valor del coeficiente de determinación sigue siendo muy bajo, 0.2526115, que no nos da ninguna confianza sobre el modelo que acabamos de crear, pero es el mejor hasta ahora. RMSE: 168.26769 es el valor de la Raíz del Error Cuadrático Medio obtenido mediante este modelo, que sigue siendo demasiado alto, ya que lo ideal es que se acerque a 0. 4. Modelo con tres capas ocultas y 30 nodos en cada una Vamos a probar ahora un modelo que cuente con 3 capas ocultas y 30 nodos en cada una, con funciones de activación ReLU en la capa oculta y función lineal en la capa de salida. Para medir la efectividad de estos modelos miraremos el valor que obtenemos como R2:
72 4.4. Resolución en Python R2:Obtenemos el mejor coeficiente de determinación hasta ahora: 0.2740399. Sigue siendo un valor extremadamente bajo y así no nos interesa trabajar con este modelo. RMSE: Obtenemos un RMSE de 165.8379, valor que es mejor qur los anteriores pero sigue muy lejano a 0. 5. Modelo con dos capas ocultas y 646 nodos en cada una [2]El siguiente número de nodos en la capa oculta lo vamos a probar gracias a la regla que nos dice que el número ideal de nodos en la capa oculta es 2/3 de la suma del número total de nodos en la capa de entrada y la de salida, pero esta vez probamos en dos capas ocultas. Este modelo lo hemos probado antes en RStudio y nos ha dado buen resultado. Veamos que ocurre aquí con el coeficiente de determinación: R2:Hemos obtenido un coeficiente demasiado bajo, 0.2208621, luego parece que esta norma en este caso no sirve. RMSE: El valor que obtenemos aquí es 171.80457. 6. Modelo con una capa oculta y 646 nodos [2]El siguiente número de nodos en la capa oculta lo vamos a probar gracias a la regla que nos dice que el número ideal de nodos en la capa oculta es 2/3 de la suma del número total de nodos en la capa de entrada y la de salida. Este modelo lo hemos probado antes en RStudio y nos ha dado buen resultado. Veamos que ocurre aquí con el coeficiente de determinación:
Capítulo 4. Ejemplo de regresión 73 R2:Hemos obtenido un coeficiente demasiado bajo, 0.2123897, luego parece que esta norma en este caso no sirve. RMSE: En este modelo el valor del Error Cuadrático Medio es 172.73615, demasiado alto para que sea fiable. 4.4.1. Comentarios sobre los resultados obtenidos No hemos obtenido ningún modelo que resuelva bien nuestro problema, ya que ninguno de los coeficientes de determinación supera el 30 %. Si tuviera que elegir alguno me quedaría con el que tiene mayor coeficiente (Modelo con tres capas ocultas y 30 nodos en cada una), pero aún así no es un modelo que me guste. Este fallo en la determinación de un modelo adecuado a este problema que se presenta se puede deber a la necesidad de contar con más registros, ya que contamos en este conjunto de datos con muchas variables cualitativas que toman valores demasiado diferentes como para establecer una norma correctamente. 4.5. Comparación de eficiencia de ambos programas Hemos obtenido para RStudio que el mejor modelo es el quinto: Modelo con dos capas ocultas y 646 nodos en cada una. Según los modelos de Python, destaca el cuarto: Modelo con tres capas ocultas y 30 nodos en cada una. El modelo de RStudio cuenta con un RMSE de 47.48021 y un R2de 0.8060004, y el modelo de Python tiene un RMSE de 165.8379 y un valor de R2de 0.2740399. Claramente el modelo que resuelve nuestro problema en RStudio es el mejor de todos los propuestos en ambos programas.
80 5.4. Resolución en Python 0 1 2 3 4 5 6 7 8 9 0850 0 8 18 6 0 107 1 10 0 11 970 1 20 3 0 4 0 1 0 217 0 796 9 110 1 67 0 0 0 326 3 8 897 33 1 29 0 3 0 41 0 56 25 882 0 33 0 3 0 50 0 0 0 0 946 0 35 1 19 6124 1 76 18 74 0 697 0 10 0 70 0 0 0 0 6 0 969 0 25 8201653139790 90 0 0 0 0 7 1 39 0 953 Cuadro 5.4: Tabla de confusión del cuarto modelo propuesto Capacidad de acierto: Expresado en porcentaje, la capacidad de acierto de este modelo es de 89.39 % 5.3.1. Comentarios sobre los resultados obtenidos Los cuatro modelos han resultado similares en cuanto a la capacidad de acierto en las prendas, todas se encuentran entre un 87 y un 90 por ciento. Sí que es escierto que en este caso la correcta clasificación ha sido mejor en el cuarto modelo. Además este modelo cuenta con la menor Raíz del Error Cuadrático Medio, luego el Modelo con dos capas ocultas de 530 nodos cada una es el que mejor trabaja de todos, aunque no con una gran diferencia. 5.4. Resolución en Python Esta vez no vamos a trabajar con las bibliotecas de los anteriores ejemplos. Como para el tratamiento de imágenes lo óptimo es utilizar una red convolucional, vamos a trabajar con keras, tanto para descargar los datos como para trabajar en los modelos. Como ocurre en RStudio, lo primero que debemos hacer con los datos es redimensionarlos y ponerlos en escala de grises de 0 a 1 (en lugar de 0 a 255).
Capítulo 5. Ejemplo de clasificación de imágenes 81 Vamos a ver alguna de estas imágenes que contiene el conjunto de entrenamiento: Una vez sabemos la estructura de los conjuntos de datos (iguales a los de RStudio) y hemos visto gráficamente como pueden ser, pasamos a bscar algún modelo que lo explique correctamente.
82 5.4. Resolución en Python 1. Modelo con dos capas ocultas de 100 nodos cada una Para construir este modelo que tiene la estructura (784-100-100-10) debemos ir escribiendo una a una las capas ocultas y la de salida, y dejar indicado el tamaño de la capa de entrada: Una vez tenemos la estructura de la red tenemos que entrenarla. Utilizaremos el solver Adam, que es el que está programado por defecto y hemos utilizado anteriormente. Una vez tenemos ajustado el modelo con los conjuntos de entrenamiento y test, vamos a realizar las predicciones y ver la capacidad de acierto en cada prenda: Precisión f1-score Camiseta/top 0.8 0.83 Pantalón 0.98 0.98 Pullover 0.77 0.81 Vestido 0.91 0.90 Abrigo 0.84 0.82 Sandalia 0.97 0.97 Camisa 0.76 0.70 Zapatillas de deporte 0.94 0.96 Bolso 0.97 0.97 Botín 0.97 0.96 Accuracy 0.89 Cuadro 5.5: Informe de clasificación del primer modelo propuesto
Capítulo 5. Ejemplo de clasificación de imágenes 83 Aquí podemos apreciar como la prenda que mejor se clasifica es el pantalón, seguido del bolso y el botín, con casi un 100 % de acierto. Sin embargo, la prenda que peor se clasifica es la camisa. Por último, cabe destacar que el valor del coeficiente del test de acierto/precisión es de 0,8904. 2. Modelo con una capa oculta de 100 nodos Para construir este modelo que tiene la estructura (784-100-10) debemos ir escribiendo una a una las capas ocultas y la de salida, y dejar indicado el tamaño de la capa de entrada: Una vez tenemos la estructura de la red tenemos que entrenarla. Utilizaremos el solver Adam, que es el que está programado por defecto y hemos utilizado anteriormente. Una vez tenemos ajustado el modelo con los conjuntos de entrenamiento y test, vamos a realizar las predicciones y ver la capacidad de acierto en cada prenda:
84 5.4. Resolución en Python Precisión f1-score Camiseta/top 0.83 0.83 Pantalón 0.98 0.98 Pullover 0.78 0.79 Vestido 0.92 0.88 Abrigo 0.74 0.81 Sandalia 0.97 0.96 Camisa 0.77 0.70 Zapatillas de deporte 0.91 0.94 Bolso 0.98 0.97 Botín 0.96 0.95 Accuracy 0.88 Cuadro 5.6: Informe de clasificación del segundo modelo propuesto Aquí las prendas que mejor se clasifican son el pantalón y el bolso, seguido de la sandalia y el botín, con casi un 100 % de acierto. Sin embargo, las prendas que peor se clasifican son la camisa y el abrigo. Por último, cabe destacar que el valor del coeficiente del test de acierto/precisión es de 0,8823. 3. Modelo con una capa oculta de 530 nodos Para construir este modelo que tiene la estructura (784-530-10) debemos ir escribiendo una a una las capas ocultas y la de salida, y dejar indicado el tamaño de la capa de entrada. El tamaño de la capa oculta se ha decidido tomando como regla la de los 2/3 del total de neuronas en las capas de entrada y salida. Una vez tenemos la estructura de la red tenemos que entrenarla. Utilizaremos el solver Adam, que es el que está programado por defecto y hemos utilizado anteriormente.
Capítulo 5. Ejemplo de clasificación de imágenes 85 Una vez tenemos ajustado el modelo con los conjuntos de entrenamiento y test, vamos a realizar las predicciones y ver la capacidad de acierto en cada prenda: Precisión f1-score Camiseta/top 0.88 0.80 Pantalón 0.97 0.98 Pullover 0.81 0.80 Vestido 0.92 0.90 Abrigo 0.82 0.81 Sandalia 0.97 0.97 Camisa 0.63 0.70 Zapatillas de deporte 0.97 0.96 Bolso 0.98 0.97 Botín 0.96 0.96 Accuracy 0.88 Cuadro 5.7: Informe de clasificación del tercer modelo propuesto Aquí la prenda que mejor se clasifica es el bolso, seguido de las zapatillas de deporte, la sandalia y el pantalón, con casi un 100 % de acierto. Sin embargo, la prenda que peor se clasifica vuelve a ser la camisa. Por último, cabe destacar que el valor del coeficiente del test de acierto/precisión es de 0,8848. 4. Modelo con dos capas ocultas de 530 nodos cada una Para construir este modelo que tiene la estructura (784-530-530-10) debemos ir
86 5.4. Resolución en Python escribiendo una a una las capas ocultas y la de salida, y dejar indicado el tamaño de la capa de entrada. El tamaño de las capas ocultas se han decidido tomando como regla la de los 2/3 del total de neuronas en las capas de entrada y salida. Una vez tenemos la estructura de la red tenemos que entrenarla. Utilizaremos el solver Adam, que es el que está programado por defecto y hemos utilizado anteriormente. Una vez tenemos ajustado el modelo con los conjuntos de entrenamiento y test, vamos a realizar las predicciones y ver la capacidad de acierto en cada prenda: Precisión f1-score Camiseta/top 0.84 0.84 Pantalón 1 1 Pullover 0.80 0.83 Vestido 0.89 0.91 Abrigo 0.85 0.83 Sandalia 0.98 0.97 Camisa 0.74 0.72 Zapatillas de deporte 0.94 0.95 Bolso 0.99 0.98 Botín 0.96 0.95 Accuracy 0.90 Cuadro 5.8: Informe de clasificación del cuarto modelo propuesto Este modelo parece que clasifica las prendas mejor. Ha acertado todos los pantalones correctamente, y el 99% de los bolsos. por otro lado, la prenda en la que ha
Capítulo 5. Ejemplo de clasificación de imágenes 87 cometido más fallos ha sido en la camisa, igual que ocurre en los otros modelos. Eso sí, el porcentaje de fallo es mejor que otros modelos. Por último, cabe destacar que el valor del coeficiente del test de acierto/precisión es de 0,8982. 5.4.1. Comentarios sobre los resultados obtenidos Aunque los cuatro modelos tienen resultados similares, el que por lo general en todas las prendas tiene mejor resultado, y por ende mejor coeficiente del test de acierto es el cuarto modelo: Red con dos capas ocultas de 530 nodos cada una. 5.5. Comparación de eficiencia de ambos programas Tanto en RStudio como en Python hemos obtenido como mejor modelo el cuarto: Red con dos capas ocultas de 530 nodos cada una. Obtienen resultados muy similares (la capacidad de acierto del modelo en Python es levemente mayor). Si debemos decantarnos por uno de los dos, el mejor sería el de Python ya que los tiempos de trabajo en el programa son mucho menores.
Bibliografía [1] HEATON, J. (2015). Artificial Intelligence for Humans, Volume 3: Deep Learning and Neural Networks. [2] BEYSOLOW II (2017). Introduction to Deep Learning Using R, A Step-by-Step Guide to Learning and Implementing Deep Learning Models Using R. San Francisco, California. [3] GHATAK, A. (2019). Deep Learning with R. Singapore. [4] MATICH, D. (2001). Redes Neuronales: Conceptos Básicos y Aplicaciones. [5] GRAUPE, D. (2013). Principles of Artificial Neural Networks (3rd ed.). University of Illinois, Chicago, USA. [6] SILAPARASETTY, V. (2020). Deep Learning Projects Using TensorFlow 2, Neural Network Development with Python and Keras. Bangalore, India. [7] FLÓREZ LÓPEZ, R. & FERNÁNDEZ FERNÁNDEZ, J. (2008). Las Redes Neuronales Artificiales, Fundamentos teóricos y aplicaciones prácticas. Universidad de León. [8] CANDEL, A. & LEDELL, E. (2018) Deep Learning with H2O, Sexta Edición [9] PEDREGOSA, F., VAROQUAUX, G., GRAMFORT, A., MICHEL, V. & THIRION, B. (2011) Scikit-learn: Machine Learning in Python [10] BASOGAIN OLABE, X. (1998). Redes Neuronales Artificiales y sus aplicaciones. Escuela Superior de Ingeniería de Bilbao. [11] CALVO, D. (2022). Clasificación de redes neuronales artificiales Disponible en https://www.diegocalvo.es/clasificacion-de-redes-neuronales-artificiales/ [12] (2022). ¿Qué es el aprendizaje profundo? - Cómo funciona Disponible en https://www.netapp.com/es/artificial-intelligence/what-is-deep-learning/ [13] (2022). What is Artificial Intelligence (AI)? | Glossary. Disponible en https://www.hpe.com/es/es/what-is/artificial-intelligence.html 89
## RMSE: 0.02689905 ## LogLoss: 0.007986724 ## Mean Per-Class Error: 0.1250998 ## AUC: 0.9807311 ## AUCPR: 0.678522 ## Gini: 0.9614622 ## ## Confusion Matrix (vertical: actual; across: predicted) for F1-optimal threshold: ## 0 1 Error Rate ## 0 10019 2 0.000200 =2/10021 ## 1 4 12 0.250000 =4/16 ## Totals 10023 14 0.000598 =6/10037 ## ## Maximum Metrics: Maximum metrics at their respective thresholds ## metric threshold value idx ## 1 max f1 0.067138 0.800000 8 ## 2 max f2 0.000624 0.802469 11 ## 3 max f0point5 0.067138 0.833333 8 ## 4 max accuracy 0.067138 0.999402 8 ## 5 max precision 0.999995 0.857143 1 ## 6 max recall 0.000012 1.000000 298 ## 7 max specificity 1.000000 0.999900 0 ## 8 max absolute_mcc 0.067138 0.801490 8 ## 9 max min_per_class_accuracy 0.000017 0.917374 225 ## 10 max mean_per_class_accuracy 0.000065 0.934456 59 ## 11 max tns 1.000000 10020.000000 0 ## 12 max fns 1.000000 11.000000 0 ## 13 max fps 0.000008 10021.000000 399 ## 14 max tps 0.000012 16.000000 298 ## 15 max tnr 1.000000 0.999900 0 ## 16 max fnr 1.000000 0.687500 0 ## 17 max fpr 0.000008 1.000000 399 ## 18 max tpr 0.000012 1.000000 298 ## ## Gains/Lift Table: Extract with ‘h2o.gainsLift(<model>, <data>)‘ or ‘h2o.gainsLift(<model>, valid=<T/F>, xval=<T/F>)‘ ## H2OBinomialMetrics: deeplearning ## ** Reported on validation data. ** ## ** Metrics reported on full validation frame ** ## ## MSE: 0.0007700126 ## RMSE: 0.0277491 ## LogLoss: 0.006719206 ## Mean Per-Class Error: 0.1227295 ## AUC: 0.964825 ## AUCPR: 0.7210647 ## Gini: 0.9296499 ## ## Confusion Matrix (vertical: actual; across: predicted) for F1-optimal threshold: ## 0 1 Error Rate ## 0 85268 15 0.000176 =15/85283 ## 1 39 120 0.245283 =39/159 ## Totals 85307 135 0.000632 =54/85442 ## ## Maximum Metrics: Maximum metrics at their respective thresholds 6
## metric threshold value idx ## 1 max f1 0.055725 0.816327 84 ## 2 max f2 0.033383 0.780645 88 ## 3 max f0point5 0.055725 0.858369 84 ## 4 max accuracy 0.055725 0.999368 84 ## 5 max precision 0.999991 0.924528 2 ## 6 max recall 0.000009 1.000000 390 ## 7 max specificity 1.000000 0.999953 0 ## 8 max absolute_mcc 0.055725 0.818754 84 ## 9 max min_per_class_accuracy 0.000020 0.911950 295 ## 10 max mean_per_class_accuracy 0.000020 0.927212 295 ## 11 max tns 1.000000 85279.000000 0 ## 12 max fns 1.000000 116.000000 0 ## 13 max fps 0.000008 85283.000000 399 ## 14 max tps 0.000009 159.000000 390 ## 15 max tnr 1.000000 0.999953 0 ## 16 max fnr 1.000000 0.729560 0 ## 17 max fpr 0.000008 1.000000 399 ## 18 max tpr 0.000009 1.000000 390 ## ## Gains/Lift Table: Extract with ‘h2o.gainsLift(<model>, <data>)‘ or ‘h2o.gainsLift(<model>, valid=<T/F>, xval=<T/F>)‘ ## ## ## Scoring History: ## timestamp duration training_speed epochs iterations ## 1 2022-06-16 13:25:41 0.000 sec NA 0.00000 0 ## 2 2022-06-16 13:25:42 0.893 sec 179344 obs/sec 0.50196 1 ## 3 2022-06-16 13:25:47 5.948 sec 184298 obs/sec 5.01871 10 ## 4 2022-06-16 13:25:52 11.033 sec 183920 obs/sec 9.53528 19 ## 5 2022-06-16 13:25:57 16.412 sec 206065 obs/sec 16.06129 32 ## 6 2022-06-16 13:26:02 21.600 sec 219340 obs/sec 22.58263 45 ## 7 2022-06-16 13:26:07 26.649 sec 228546 obs/sec 29.10750 58 ## 8 2022-06-16 13:26:13 31.899 sec 236691 obs/sec 36.12843 72 ## 9 2022-06-16 13:26:18 37.304 sec 241475 obs/sec 43.15099 86 ## 10 2022-06-16 13:26:23 42.603 sec 243212 obs/sec 49.66977 99 ## 11 2022-06-16 13:26:24 43.144 sec 243418 obs/sec 50.17086 100 ## samples training_rmse training_logloss training_r2 training_auc ## 1 0.000000 NA NA NA NA ## 2 100074.000000 0.03993 0.02631 -0.00160 0.69475 ## 3 1000555.000000 0.02771 0.00705 0.51762 0.97633 ## 4 1901001.000000 0.02737 0.00764 0.52934 0.98905 ## 5 3202059.000000 0.02588 0.00882 0.57925 0.97973 ## 6 4502187.000000 0.02530 0.00914 0.59767 0.98427 ## 7 5803017.000000 0.02551 0.00899 0.59105 0.97913 ## 8 7202745.000000 0.02533 0.00961 0.59691 0.98568 ## 9 8602797.000000 0.02603 0.00827 0.57429 0.97961 ## 10 9902414.000000 0.02633 0.00848 0.56449 0.98516 ## 11 10002314.000000 0.02690 0.00799 0.54538 0.98073 ## training_pr_auc training_lift training_classification_error validation_rmse ## 1 NA NA NA NA ## 2 0.23191 37.26609 0.00120 0.04314 ## 3 0.71929 86.95421 0.00060 0.02926 ## 4 0.67108 86.95421 0.00060 0.02878 ## 5 0.67274 86.95421 0.00060 0.02611 7
## 6 0.65849 86.95421 0.00060 0.02554 ## 7 0.65210 86.95421 0.00060 0.02584 ## 8 0.66318 86.95421 0.00060 0.02550 ## 9 0.67788 86.95421 0.00060 0.02626 ## 10 0.67883 86.95421 0.00060 0.02683 ## 11 0.67852 86.95421 0.00060 0.02775 ## validation_logloss validation_r2 validation_auc validation_pr_auc ## 1 NA NA NA NA ## 2 0.03012 -0.00186 0.77101 0.37197 ## 3 0.00679 0.53899 0.96788 0.72696 ## 4 0.00687 0.55399 0.97052 0.72940 ## 5 0.00715 0.63310 0.95852 0.71536 ## 6 0.00713 0.64873 0.95515 0.71371 ## 7 0.00704 0.64066 0.97483 0.71412 ## 8 0.00755 0.65003 0.96996 0.71748 ## 9 0.00674 0.62866 0.96773 0.72716 ## 10 0.00699 0.61241 0.97041 0.72277 ## 11 0.00672 0.58545 0.96482 0.72106 ## validation_lift validation_classification_error ## 1 NA NA ## 2 54.05136 0.00144 ## 3 81.07704 0.00063 ## 4 81.07704 0.00064 ## 5 81.07704 0.00063 ## 6 81.07704 0.00064 ## 7 82.33405 0.00066 ## 8 81.70554 0.00063 ## 9 81.70554 0.00063 ## 10 81.70554 0.00063 ## 11 82.33405 0.00063 ## ## Variable Importances: (Extract with ‘h2o.varimp‘) ## ================================================= ## ## Variable Importances: ## variable relative_importance scaled_importance percentage ## 1 V12 1.000000 1.000000 0.106533 ## 2 Time 0.785539 0.785539 0.083686 ## 3 V14 0.736501 0.736501 0.078462 ## 4 V4 0.632106 0.632106 0.067340 ## 5 V10 0.631333 0.631333 0.067258 ## ## --- ## variable relative_importance scaled_importance percentage ## 25 V18 0.114896 0.114896 0.012240 ## 26 V28 0.110261 0.110261 0.011746 ## 27 V22 0.101107 0.101107 0.010771 ## 28 V8 0.100631 0.100631 0.010721 ## 29 V6 0.090120 0.090120 0.009601 ## 30 V13 0.083160 0.083160 0.008859 #Veamos la capacidad de prediccion del modelo predict_test =h2o.predict(modeloc1, newdata = test.hex) 8
## | | | 0% | |======================================================================| 100% pred =as.data.frame(predict_test) tabla =table(Obs = datos_test[,31], Pred = pred[,1]) aciertos=100*diag(prop.table(tabla,1)) acierto=100*sum(diag(tabla))/sum(tabla) acierto ## [1] 99.9368 #Curva ROC #ROC para los conjuntos de entrenamiento y test plot(modeloc1, metric="auc") Scoring History 0 10 20 30 40 50 0.70 0.80 0.90 1.00 epochs auc Training Validation #Curva ROC y AUC prediobj =prediction(pred[,3], ytest[,2]) plot(performance(prediobj, "tpr","fpr"),main="CURVA COR TEST", xlab="Tasa de falsos positivos", ylab="Tasa de verdaderos positivos",col="red") abline(a=0,b=1,col="sienna",lty=2) auc =as.numeric(performance(prediobj,"auc")@y.values) cat("Area bajo la curva COR Test= ",auc,"\n") ## Area bajo la curva COR Test= 0.9648469 9
text(0.8,0.2,paste("AUC=",round(auc,3)),col="sienna" ) CURVA COR TEST Tasa de falsos positivos Tasa de verdaderos positivos 0.0 0.2 0.4 0.6 0.8 1.0 0.0 0.2 0.4 0.6 0.8 1.0 AUC= 0.965 #Importancia de las variables h2o.varimp_plot(modeloc1) V3 V16 V7 V17 V11 V10 V4 V14 Time V12 Variable Importance: Deep Learning 0.0 0.2 0.4 0.6 0.8 1.0 10
Modelo 2: Red con dos capas ocultas de 10 nodos cada una modeloc2 =h2o.deeplearning( x=1:30,#variables predictoras y=31,#variable respuesta training_frame = train.hex, #datos de entrenamiento validation_frame = test.hex, #datos de validacion/test distribution="multinomial", activation = 'RectifierWithDropout', hidden = c(10,10), #tamaño de las capas ocultas hidden_dropout_ratio = c(0.5,0.5), input_dropout_ratio = 0.2, epochs = 50,#iteraciones l1 = 1e-5, l2 = 1e-5, rho = 0.99, epsilon = 1e-8) ## | | | 0% | |== | 3% | |====== | 8% | |======== | 12% | |============ | 17% | |=============== | 21% | |================== | 25% | |===================== | 30% | |========================= | 36% | |============================= | 42% | |================================ | 46% | |===================================== | 52% | |======================================== | 57% | |============================================ | 62% | |============================================== | 66% | |================================================== | 71% | |====================================================== | 77% | |========================================================== | 82% | |============================================================ | 86% | |=============================================================== | 90% | |=================================================================== | 95% | |======================================================================| 100% summary(modeloc2) ## Model Details: ## ============== ## ## H2OBinomialModel: deeplearning ## Model Key: DeepLearning_model_R_1655376581048_574 ## Status of Neuron Layers: predicting Class, 2-class classification, multinomial distribution, CrossEntropy loss, 442 weights/biases, 13,3 KB, 9.997.188 training samples, mini-batch size 1 ## layer units type dropout l1 l2 mean_rate rate_rms ## 1 1 30 Input 20.00 % NA NA NA NA ## 2 2 10 RectifierDropout 50.00 % 0.000010 0.000010 0.053851 0.175343 ## 3 3 10 RectifierDropout 50.00 % 0.000010 0.000010 0.057400 0.165545 ## 4 4 2 Softmax NA 0.000010 0.000010 0.015647 0.032247 ## momentum mean_weight weight_rms mean_bias bias_rms ## 1 NA NA NA NA NA ## 2 0.000000 -0.008410 0.051935 0.513355 0.520243 ## 3 0.000000 0.020206 0.267734 0.690256 0.440091 ## 4 0.000000 0.023101 1.088132 -0.601283 1.981450 ## ## H2OBinomialMetrics: deeplearning ## ** Reported on training data. ** ## ** Metrics reported on temporary training frame with 9965 samples ** ## ## MSE: 0.0004456277 ## RMSE: 0.0211099 ## LogLoss: 0.006295865 ## Mean Per-Class Error: 0.1001005 ## AUC: 0.9374586 ## AUCPR: 0.5798407 ## Gini: 0.8749171 ## ## Confusion Matrix (vertical: actual; across: predicted) for F1-optimal threshold: 11
## 0 1 Error Rate ## 0 9953 2 0.000201 =2/9955 ## 1 2 8 0.200000 =2/10 ## Totals 9955 10 0.000401 =4/9965 ## ## Maximum Metrics: Maximum metrics at their respective thresholds ## metric threshold value idx ## 1 max f1 0.972065 0.800000 6 ## 2 max f2 0.026740 0.833333 10 ## 3 max f0point5 0.972065 0.800000 6 ## 4 max accuracy 0.972065 0.999599 6 ## 5 max precision 0.972065 0.800000 6 ## 6 max recall 0.000138 1.000000 336 ## 7 max specificity 1.000000 0.999799 0 ## 8 max absolute_mcc 0.972065 0.799799 6 ## 9 max min_per_class_accuracy 0.026740 0.900000 10 ## 10 max mean_per_class_accuracy 0.026740 0.949749 10 ## 11 max tns 1.000000 9953.000000 0 ## 12 max fns 1.000000 8.000000 0 ## 13 max fps 0.000085 9955.000000 399 ## 14 max tps 0.000138 10.000000 336 ## 15 max tnr 1.000000 0.999799 0 ## 16 max fnr 1.000000 0.800000 0 ## 17 max fpr 0.000085 1.000000 399 ## 18 max tpr 0.000138 1.000000 336 ## ## Gains/Lift Table: Extract with ‘h2o.gainsLift(<model>, <data>)‘ or ‘h2o.gainsLift(<model>, valid=<T/F>, xval=<T/F>)‘ ## H2OBinomialMetrics: deeplearning ## ** Reported on validation data. ** ## ** Metrics reported on full validation frame ** ## ## MSE: 0.0006573484 ## RMSE: 0.02563881 ## LogLoss: 0.00557946 ## Mean Per-Class Error: 0.1195848 ## AUC: 0.9466821 ## AUCPR: 0.713189 ## Gini: 0.8933641 ## ## Confusion Matrix (vertical: actual; across: predicted) for F1-optimal threshold: ## 0 1 Error Rate ## 0 85268 15 0.000176 =15/85283 ## 1 38 121 0.238994 =38/159 ## Totals 85306 136 0.000620 =53/85442 ## ## Maximum Metrics: Maximum metrics at their respective thresholds ## metric threshold value idx ## 1 max f1 0.252883 0.820339 69 ## 2 max f2 0.252883 0.783679 69 ## 3 max f0point5 0.252883 0.860597 69 ## 4 max accuracy 0.252883 0.999380 69 ## 5 max precision 0.997954 0.920455 21 ## 6 max recall 0.000118 1.000000 385 ## 7 max specificity 0.999999 0.999930 0 12
## 8 max absolute_mcc 0.252883 0.822543 69 ## 9 max min_per_class_accuracy 0.000230 0.893082 285 ## 10 max mean_per_class_accuracy 0.000310 0.915328 254 ## 11 max tns 0.999999 85277.000000 0 ## 12 max fns 0.999999 109.000000 0 ## 13 max fps 0.000076 85283.000000 399 ## 14 max tps 0.000118 159.000000 385 ## 15 max tnr 0.999999 0.999930 0 ## 16 max fnr 0.999999 0.685535 0 ## 17 max fpr 0.000076 1.000000 399 ## 18 max tpr 0.000118 1.000000 385 ## ## Gains/Lift Table: Extract with ‘h2o.gainsLift(<model>, <data>)‘ or ‘h2o.gainsLift(<model>, valid=<T/F>, xval=<T/F>)‘ ## ## ## Scoring History: ## timestamp duration training_speed epochs iterations ## 1 2022-06-16 13:26:27 0.000 sec NA 0.00000 0 ## 2 2022-06-16 13:26:28 0.540 sec 352070 obs/sec 0.49977 1 ## 3 2022-06-16 13:26:33 5.600 sec 402726 obs/sec 10.52848 21 ## 4 2022-06-16 13:26:38 10.716 sec 421857 obs/sec 21.55577 43 ## 5 2022-06-16 13:26:43 15.901 sec 426769 obs/sec 32.59559 65 ## 6 2022-06-16 13:26:48 21.017 sec 430652 obs/sec 43.62801 87 ## 7 2022-06-16 13:26:51 24.010 sec 434094 obs/sec 50.14515 100 ## 8 2022-06-16 13:26:51 24.178 sec 433999 obs/sec 50.14515 100 ## samples training_rmse training_logloss training_r2 training_auc ## 1 0.000000 NA NA NA NA ## 2 99636.000000 0.03168 0.01138 -0.00097 0.95044 ## 3 2099011.000000 0.02111 0.00630 0.55549 0.93746 ## 4 4297466.000000 0.02036 0.00691 0.58643 0.92320 ## 5 6498419.000000 0.02010 0.00706 0.59706 0.97825 ## 6 8697898.000000 0.02015 0.00739 0.59489 0.98192 ## 7 9997188.000000 0.02006 0.00724 0.59859 0.98209 ## 8 9997188.000000 0.02111 0.00630 0.55549 0.93746 ## training_pr_auc training_lift training_classification_error validation_rmse ## 1 NA NA NA NA ## 2 0.28081 69.75500 0.00080 0.04314 ## 3 0.57984 89.68500 0.00040 0.02564 ## 4 0.57981 89.68500 0.00040 0.02592 ## 5 0.58517 89.68500 0.00040 0.02689 ## 6 0.58525 89.68500 0.00040 0.02622 ## 7 0.58526 89.68500 0.00040 0.02720 ## 8 0.57984 89.68500 0.00040 0.02564 ## validation_logloss validation_r2 validation_auc validation_pr_auc ## 1 NA NA NA NA ## 2 0.02230 -0.00184 0.86270 0.10441 ## 3 0.00558 0.64610 0.94668 0.71319 ## 4 0.00617 0.63831 0.94925 0.72222 ## 5 0.00675 0.61065 0.96664 0.72284 ## 6 0.00666 0.62988 0.96846 0.72470 ## 7 0.00705 0.60155 0.96794 0.72552 ## 8 0.00558 0.64610 0.94668 0.71319 ## validation_lift validation_classification_error ## 1 NA NA 13
## 2 44.62380 0.00393 ## 3 81.07704 0.00062 ## 4 81.07704 0.00063 ## 5 81.70554 0.00063 ## 6 81.70554 0.00064 ## 7 81.70554 0.00063 ## 8 81.07704 0.00062 ## ## Variable Importances: (Extract with ‘h2o.varimp‘) ## ================================================= ## ## Variable Importances: ## variable relative_importance scaled_importance percentage ## 1 Time 1.000000 1.000000 0.135420 ## 2 V12 0.575190 0.575190 0.077892 ## 3 V11 0.534217 0.534217 0.072344 ## 4 V3 0.424669 0.424669 0.057509 ## 5 V14 0.420427 0.420427 0.056934 ## ## --- ## variable relative_importance scaled_importance percentage ## 25 V28 0.090843 0.090843 0.012302 ## 26 V20 0.081206 0.081206 0.010997 ## 27 V8 0.080306 0.080306 0.010875 ## 28 V1 0.075630 0.075630 0.010242 ## 29 V19 0.069034 0.069034 0.009349 ## 30 V23 0.034290 0.034290 0.004644 #Veamos la capacidad de prediccion del modelo predict_test2 =h2o.predict(modeloc2, newdata = test.hex) ## | | | 0% | |======================================================================| 100% pred2 =as.data.frame(predict_test2) head(pred2) ## predict p0 p1 ## 1 0 0.9998953 0.0001046992 ## 2 0 0.9998932 0.0001067669 ## 3 0 0.9998977 0.0001022923 ## 4 0 0.9998963 0.0001037319 ## 5 0 0.9998911 0.0001089203 ## 6 0 0.9998685 0.0001314905 tabla2 =table(Obs = datos_test[,31], Pred = pred2[,1]) tabla2 ## Pred ## Obs 0 1 ## 0 85268 15 ## 1 38 121 14
aciertos2 =100*diag(prop.table(tabla2,1)) acierto2 =100*sum(diag(tabla2))/sum(tabla2) acierto2 ## [1] 99.93797 #Curva ROC #ROC para los conjuntos de entrenamiento y test plot(modeloc2, metric="auc") Scoring History 0 10 20 30 40 50 0.86 0.90 0.94 0.98 epochs auc Training Validation #Curva ROC y AUC prediobj2 =prediction(pred2[,3], ytest[,2]) plot(performance(prediobj2, "tpr","fpr"),main="CURVA COR TEST", xlab="Tasa de falsos positivos", ylab="Tasa de verdaderos positivos",col="red") abline(a=0,b=1,col="sienna",lty=2) auc2 =as.numeric(performance(prediobj2,"auc")@y.values) cat("Area bajo la curva COR Test= ",auc2,"\n") ## Area bajo la curva COR Test= 0.9466591 text(0.8,0.2,paste("AUC=",round(auc2,3)),col="sienna") 15
## Area bajo la curva COR Test= 0.9696655 text(0.8,0.2,paste("AUC=",round(auc3,3)),col="sienna" ) CURVA COR TEST Tasa de falsos positivos Tasa de verdaderos positivos 0.0 0.2 0.4 0.6 0.8 1.0 0.0 0.2 0.4 0.6 0.8 1.0 AUC= 0.97 #Importancia de las variables h2o.varimp_plot(modeloc3) V7 V3 V17 V10 V11 V16 V9 V4 V12 V14 Variable Importance: Deep Learning 0.0 0.2 0.4 0.6 0.8 1.0 22
Modelo 4: Red con una capa oculta de 5 nodos modeloc4 =h2o.deeplearning( x=1:30,#variables predictoras y=31,#variable respuesta training_frame = train.hex, #datos de entrenamiento validation_frame = test.hex, #datos de validacion/test distribution="multinomial", activation = 'RectifierWithDropout', hidden = 5,#tamaño de las capas ocultas hidden_dropout_ratio = 0.5, input_dropout_ratio = 0.2, epochs = 50,#iteraciones l1=1e-5, l2=1e-5, rho = 0.99, epsilon = 1e-8) ## | | | 0% | |======= | 10% | |===================== | 30% | |============================ | 40% | |================================== | 49% | |========================================== | 60% | |================================================== | 71% | |========================================================= | 81% | |============================================================== | 89% | |======================================================================| 99% | |======================================================================| 100% summary(modeloc4) ## Model Details: ## ============== ## ## H2OBinomialModel: deeplearning ## Model Key: DeepLearning_model_R_1655376581048_610 ## Status of Neuron Layers: predicting Class, 2-class classification, multinomial distribution, CrossEntropy loss, 167 weights/biases, 9,3 KB, 10.002.352 training samples, mini-batch size 1 ## layer units type dropout l1 l2 mean_rate rate_rms ## 1 1 30 Input 20.00 % NA NA NA NA ## 2 2 5 RectifierDropout 50.00 % 0.000010 0.000010 0.004299 0.011634 ## 3 3 2 Softmax NA 0.000010 0.000010 0.004902 0.005841 ## momentum mean_weight weight_rms mean_bias bias_rms ## 1 NA NA NA NA NA ## 2 0.000000 -0.021915 0.101813 0.350376 0.895083 ## 3 0.000000 0.629079 1.581670 0.019607 3.574263 ## ## H2OBinomialMetrics: deeplearning ## ** Reported on training data. ** ## ** Metrics reported on temporary training frame with 9910 samples ** ## ## MSE: 0.0004828754 ## RMSE: 0.02197442 ## LogLoss: 0.006334879 ## Mean Per-Class Error: 0.06260107 ## AUC: 0.9901898 ## AUCPR: 0.6994399 ## Gini: 0.9803795 ## ## Confusion Matrix (vertical: actual; across: predicted) for F1-optimal threshold: ## 0 1 Error Rate ## 0 9892 2 0.000202 =2/9894 23
## 1 2 14 0.125000 =2/16 ## Totals 9894 16 0.000404 =4/9910 ## ## Maximum Metrics: Maximum metrics at their respective thresholds ## metric threshold value idx ## 1 max f1 0.425582 0.875000 10 ## 2 max f2 0.000842 0.882353 15 ## 3 max f0point5 0.425582 0.875000 10 ## 4 max accuracy 0.425582 0.999596 10 ## 5 max precision 0.425582 0.875000 10 ## 6 max recall 0.000050 1.000000 306 ## 7 max specificity 1.000000 0.999798 0 ## 8 max absolute_mcc 0.425582 0.874798 10 ## 9 max min_per_class_accuracy 0.000842 0.937500 15 ## 10 max mean_per_class_accuracy 0.000842 0.968447 15 ## 11 max tns 1.000000 9892.000000 0 ## 12 max fns 1.000000 13.000000 0 ## 13 max fps 0.000039 9894.000000 399 ## 14 max tps 0.000050 16.000000 306 ## 15 max tnr 1.000000 0.999798 0 ## 16 max fnr 1.000000 0.812500 0 ## 17 max fpr 0.000039 1.000000 399 ## 18 max tpr 0.000050 1.000000 306 ## ## Gains/Lift Table: Extract with ‘h2o.gainsLift(<model>, <data>)‘ or ‘h2o.gainsLift(<model>, valid=<T/F>, xval=<T/F>)‘ ## H2OBinomialMetrics: deeplearning ## ** Reported on validation data. ** ## ** Metrics reported on full validation frame ** ## ## MSE: 0.0006627211 ## RMSE: 0.02574337 ## LogLoss: 0.006155784 ## Mean Per-Class Error: 0.1227353 ## AUC: 0.9643099 ## AUCPR: 0.7199693 ## Gini: 0.9286197 ## ## Confusion Matrix (vertical: actual; across: predicted) for F1-optimal threshold: ## 0 1 Error Rate ## 0 85267 16 0.000188 =16/85283 ## 1 39 120 0.245283 =39/159 ## Totals 85306 136 0.000644 =55/85442 ## ## Maximum Metrics: Maximum metrics at their respective thresholds ## metric threshold value idx ## 1 max f1 0.181633 0.813559 66 ## 2 max f2 0.109870 0.780645 69 ## 3 max f0point5 0.317426 0.853835 63 ## 4 max accuracy 0.181633 0.999356 66 ## 5 max precision 0.998469 0.922222 20 ## 6 max recall 0.000045 1.000000 383 ## 7 max specificity 1.000000 0.999930 0 ## 8 max absolute_mcc 0.181633 0.815731 66 ## 9 max min_per_class_accuracy 0.000057 0.907883 335 24
## 10 max mean_per_class_accuracy 0.000089 0.925964 289 ## 11 max tns 1.000000 85277.000000 0 ## 12 max fns 1.000000 109.000000 0 ## 13 max fps 0.000036 85283.000000 399 ## 14 max tps 0.000045 159.000000 383 ## 15 max tnr 1.000000 0.999930 0 ## 16 max fnr 1.000000 0.685535 0 ## 17 max fpr 0.000036 1.000000 399 ## 18 max tpr 0.000045 1.000000 383 ## ## Gains/Lift Table: Extract with ‘h2o.gainsLift(<model>, <data>)‘ or ‘h2o.gainsLift(<model>, valid=<T/F>, xval=<T/F>)‘ ## ## ## Scoring History: ## timestamp duration training_speed epochs iterations ## 1 2022-06-16 13:27:40 0.000 sec NA 0.00000 0 ## 2 2022-06-16 13:27:41 0.352 sec 925953 obs/sec 0.50161 1 ## 3 2022-06-16 13:27:46 5.395 sec 892401 obs/sec 22.57804 45 ## 4 2022-06-16 13:27:51 10.565 sec 875900 obs/sec 44.14980 88 ## 5 2022-06-16 13:27:52 12.092 sec 875709 obs/sec 50.17105 100 ## 6 2022-06-16 13:27:52 12.218 sec 875632 obs/sec 50.17105 100 ## samples training_rmse training_logloss training_r2 training_auc ## 1 0.000000 NA NA NA NA ## 2 100003.000000 0.04017 0.01750 -0.00100 0.71084 ## 3 4501271.000000 0.02631 0.00596 0.57057 0.98186 ## 4 8801925.000000 0.02197 0.00633 0.70044 0.99019 ## 5 10002352.000000 0.02197 0.00639 0.70069 0.99054 ## 6 10002352.000000 0.02197 0.00633 0.70044 0.99019 ## training_pr_auc training_lift training_classification_error validation_rmse ## 1 NA NA NA NA ## 2 0.02697 18.58125 0.00172 0.04314 ## 3 0.71677 92.90625 0.00040 0.02797 ## 4 0.69944 92.90625 0.00040 0.02574 ## 5 0.69946 92.90625 0.00040 0.02574 ## 6 0.69944 92.90625 0.00040 0.02574 ## validation_logloss validation_r2 validation_auc validation_pr_auc ## 1 NA NA NA NA ## 2 0.02174 -0.00204 0.60635 0.01892 ## 3 0.00636 0.57871 0.93501 0.72104 ## 4 0.00616 0.64321 0.96431 0.71997 ## 5 0.00620 0.64323 0.96316 0.72223 ## 6 0.00616 0.64321 0.96431 0.71997 ## validation_lift validation_classification_error ## 1 NA NA ## 2 14.45560 0.00238 ## 3 81.70554 0.00064 ## 4 81.70554 0.00064 ## 5 82.33405 0.00063 ## 6 81.70554 0.00064 ## ## Variable Importances: (Extract with ‘h2o.varimp‘) ## ================================================= ## ## Variable Importances: 25
## variable relative_importance scaled_importance percentage ## 1 V14 1.000000 1.000000 0.090280 ## 2 V12 0.935523 0.935523 0.084459 ## 3 V4 0.881529 0.881529 0.079584 ## 4 V10 0.838367 0.838367 0.075688 ## 5 V7 0.607980 0.607980 0.054888 ## ## --- ## variable relative_importance scaled_importance percentage ## 25 V28 0.130084 0.130084 0.011744 ## 26 V23 0.127169 0.127169 0.011481 ## 27 V24 0.110508 0.110508 0.009977 ## 28 V21 0.109412 0.109412 0.009878 ## 29 V22 0.096070 0.096070 0.008673 ## 30 V15 0.050515 0.050515 0.004561 #Veamos la capacidad de prediccion del modelo predict_test4 =h2o.predict(modeloc4, newdata = test.hex) ## | | | 0% | |======================================================================| 100% pred4 =as.data.frame(predict_test4) head(pred4) ## predict p0 p1 ## 1 0 0.9999546 4.535540e-05 ## 2 0 0.9999538 4.615003e-05 ## 3 0 0.9999537 4.626592e-05 ## 4 0 0.9999560 4.404832e-05 ## 5 0 0.9999559 4.409676e-05 ## 6 0 0.9999447 5.528241e-05 tabla4 =table(Obs = datos_test[,31], Pred = pred4[,1]) tabla4 ## Pred ## Obs 0 1 ## 0 85267 16 ## 1 39 120 aciertos4 =100*diag(prop.table(tabla4,1)) acierto4 =100*sum(diag(tabla4))/sum(tabla4) acierto4 ## [1] 99.93563 #Curva ROC #ROC para los conjuntos de entrenamiento y test plot(modeloc4, metric="auc",lwd=1.5) 26
Scoring History 0 10 20 30 40 50 0.6 0.7 0.8 0.9 1.0 epochs auc Training Validation #Curva ROC y AUC prediobj4 =prediction(pred4[,3], ytest[,2]) plot(performance(prediobj4, "tpr","fpr"),main="CURVA COR TEST", xlab="Tasa de falsos positivos", ylab="Tasa de verdaderos positivos",col="red") abline(a=0,b=1,col="sienna",lty=2) auc4 =as.numeric(performance(prediobj4,"auc")@y.values) cat("Area bajo la curva COR Test= ",auc4,"\n") ## Area bajo la curva COR Test= 0.964255 text(0.8,0.2,paste("AUC=",round(auc4,3)),col="sienna" ) 27
CURVA COR TEST Tasa de falsos positivos Tasa de verdaderos positivos 0.0 0.2 0.4 0.6 0.8 1.0 0.0 0.2 0.4 0.6 0.8 1.0 AUC= 0.964 #Importancia de las variables h2o.varimp_plot(modeloc4) V26 V11 V3 V17 V16 V7 V10 V4 V12 V14 Variable Importance: Deep Learning 0.0 0.2 0.4 0.6 0.8 1.0 28
Ejemplo de clasificación - Transacciones fraudulentas en Python Raquel Beltrán Barba DETECCIÓN DE TRANSACCIONES FRAUDULENTAS EN TARJETAS DE CRÉDITO Primero cargamos las librerías que vamos a necesitar: import numpy as np import pandas as pd import math import sklearn import sklearn.preprocessing import datetime import os import matplotlib.pyplot as plt import tensorflow as tf import csv import seaborn as sns from sklearn.metrics import roc_curve from sklearn.metrics import roc_auc_score Lectura y modificación del conjunto de datos datos=pd.read_csv('creditcard.csv', delimiter =",", index_col =0) Estudio de las variables datos.info() ## <class ’pandas.core.frame.DataFrame’> ## Float64Index: 284807 entries, 0.0 to 172792.0 ## Data columns (total 30 columns): ## # Column Non-Null Count Dtype ## --- ------ -------------- ----- ## 0 V1 284807 non-null float64 ## 1 V2 284807 non-null float64 ## 2 V3 284807 non-null float64 ## 3 V4 284807 non-null float64 ## 4 V5 284807 non-null float64 ## 5 V6 284807 non-null float64 ## 6 V7 284807 non-null float64 1
## 7 V8 284807 non-null float64 ## 8 V9 284807 non-null float64 ## 9 V10 284807 non-null float64 ## 10 V11 284807 non-null float64 ## 11 V12 284807 non-null float64 ## 12 V13 284807 non-null float64 ## 13 V14 284807 non-null float64 ## 14 V15 284807 non-null float64 ## 15 V16 284807 non-null float64 ## 16 V17 284807 non-null float64 ## 17 V18 284807 non-null float64 ## 18 V19 284807 non-null float64 ## 19 V20 284807 non-null float64 ## 20 V21 284807 non-null float64 ## 21 V22 284807 non-null float64 ## 22 V23 284807 non-null float64 ## 23 V24 284807 non-null float64 ## 24 V25 284807 non-null float64 ## 25 V26 284807 non-null float64 ## 26 V27 284807 non-null float64 ## 27 V28 284807 non-null float64 ## 28 Amount 284807 non-null float64 ## 29 Class 284807 non-null int64 ## dtypes: float64(29), int64(1) ## memory usage: 67.4 MB datos.shape ## (284807, 30) #Correlaciones entre las variables corr_matrix =datos.corr(method='pearson') #A traves de la funcion tidy_corr_matrix obtenemos las variables con mayor correlacion def tidy_corr_matrix(corr_mat): '''Función para convertir una matriz de correlación de pandas en formato tidy.''' corr_mat =corr_mat.stack().reset_index() corr_mat.columns =['variable_1','variable_2','r'] corr_mat =corr_mat.loc[corr_mat['variable_1']!= corr_mat['variable_2'], :] corr_mat['abs_r']=np.abs(corr_mat['r']) corr_mat =corr_mat.sort_values('abs_r', ascending=False) return(corr_mat) tidy_corr_matrix(corr_matrix).head(10) ## variable_1 variable_2 r abs_r ## 841 Amount V2 -0.531409 0.531409 ## 58 V2 Amount -0.531409 0.531409 ## 846 Amount V7 0.397311 0.397311 ## 208 V7 Amount 0.397311 0.397311 ## 844 Amount V5 -0.386356 0.386356 ## 148 V5 Amount -0.386356 0.386356 2
## 859 Amount V20 0.339403 0.339403 ## 598 V20 Amount 0.339403 0.339403 ## 509 V17 Class -0.326481 0.326481 ## 886 Class V17 -0.326481 0.326481 Partición Entrenamiento/Test X=datos.loc[:, datos.columns != 'Class'] y=datos["Class"] from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test =train_test_split(X, y, test_size=0.3, random_state=42) print('X_train.shape = ',X_train.shape) ## X_train.shape = (199364, 29) print('y_train.shape = ', y_train.shape) ## y_train.shape = (199364,) print('X_test.shape = ', X_test.shape) ## X_test.shape = (85443, 29) print('y_test.shape = ',y_test.shape) ## y_test.shape = (85443,) Comenzamos a trabajar con los modelos de Redes Neuronales from sklearn.neural_network import MLPClassifier from sklearn.metrics import accuracy_score def plot_roc_curve(fper, tper): plt.plot(fper, tper, color='red', label='ROC') plt.plot([0,1], [0,1], color='green', linestyle='--') plt.xlabel('False Positive Rate') plt.ylabel('True Positive Rate') plt.title('Receiver Operating Characteristic Curve') plt.legend() plt.show() Modelo 1: Red con dos capas ocultas de 25 nodos cada una 3
Estudio de las variables summary(datos) ## winery wine year rating ## Contino : 414 Reserva : 422 Min. :1910 Min. :4.20 ## Artadi : 239 Gran Reserva : 415 1st Qu.:2011 1st Qu.:4.20 ## La Rioja Alta : 228 Rioja Reserva : 218 Median :2015 Median :4.20 ## Sierra Cantabria: 215 Corimbo I : 202 Mean :2013 Mean :4.26 ## Vina Pedrosa : 207 El Viejo : 202 3rd Qu.:2017 3rd Qu.:4.30 ## Imperial : 206 Rioja Graciano: 202 Max. :2021 Max. :4.90 ## (Other) :4561 (Other) :4409 ## num_reviews region price ## Min. : 25.0 Rioja :2221 Min. : 6.26 ## 1st Qu.: 388.0 Ribera del Duero:1280 1st Qu.: 19.98 ## Median : 402.0 Priorato : 622 Median : 31.63 ## Mean : 440.1 Toro : 264 Mean : 67.40 ## 3rd Qu.: 417.0 Vino de Espana : 238 3rd Qu.: 61.94 ## Max. :16505.0 Rias Baixas : 224 Max. :3119.08 ## (Other) :1221 ## type body acidity ## Rioja Red :2143 Min. :2.000 Min. :1.000 ## Ribera Del Duero Red:1277 1st Qu.:4.000 1st Qu.:3.000 ## Red : 786 Median :4.000 Median :3.000 ## Priorat Red : 620 Mean :4.164 Mean :2.947 ## Tempranillo : 267 3rd Qu.:5.000 3rd Qu.:3.000 ## Toro Red : 261 Max. :5.000 Max. :3.000 ## (Other) : 716 #Correlacion entre las variables datos2 =datos[,-c(1,2,6,8)] corr =cor(datos2) correlaciones =round(corr,4) corrplot(correlaciones) 2
−1 −0.8 −0.6 −0.4 −0.2 0 0.2 0.4 0.6 0.8 1 year rating num_reviews price body acidity year rating num_reviews price body acidity plot(datos$price, datos$rating, xlab="Precio de la botella de vino", ylab = "Calificación del vino",col="sienna2", main="Representación de las variables price y rating") 0 500 1000 1500 2000 2500 3000 4.2 4.4 4.6 4.8 Representación de las variables price y rating Precio de la botella de vino Calificación del vino cor(datos$price, datos$rating) ## [1] 0.5519432 3
plot(datos$price, datos$year, xlab="Precio de la botella de vino", ylab = "Año del vino",col="sienna2", main="Representación de las variables price y year") 0 500 1000 1500 2000 2500 3000 1920 1960 2000 Representación de las variables price y year Precio de la botella de vino Año del vino cor(datos$price, datos$year) ## [1] -0.3843515 Partición Entrenamiento/Test n=nrow(datos) nent =ceiling(0.7*n) #n casos de entrenamiento ntest =n-nent #n casos de test indin =1:n indient =sort(sample(indin,nent)) inditest =setdiff(indin,indient) datos_ent =datos[indient,] datos_test =datos[inditest,] Comenzamos a trabajar con el modelo H2O #Inicializacion del servicio h2o localH2O =h2o.init(nthreads = -1) ## Connection successful! 4
## ## R is connected to the H2O cluster: ## H2O cluster uptime: 1 hours 20 minutes ## H2O cluster timezone: Europe/Madrid ## H2O data parsing timezone: UTC ## H2O cluster version: 3.36.0.4 ## H2O cluster version age: 2 months and 16 days ## H2O cluster name: H2O_started_from_R_raque_cki562 ## H2O cluster total nodes: 1 ## H2O cluster total memory: 3.10 GB ## H2O cluster total cores: 8 ## H2O cluster allowed cores: 8 ## H2O cluster healthy: TRUE ## H2O Connection ip: localhost ## H2O Connection port: 54321 ## H2O Connection proxy: NA ## H2O Internal Security: FALSE ## R Version: R version 4.2.0 (2022-04-22 ucrt) #Convertir los data.frames en objetos que puedan ser procesados train.hex =as.h2o(datos_ent) ## | | | 0% | |======================================================================| 100% test.hex =as.h2o(datos_test) ## | | | 0% | |======================================================================| 100% 5
A continuación creo y estudio los distintos modelos propuestos: Modelo 1: Red con dos capas ocultas de 8 nodos cada una modelo_r1 =h2o.deeplearning( x=c(1,2,3,4,5,6,8,9,10), #variables predictoras y=7,#variable respuesta training_frame = train.hex, #datos de entrenamiento validation_frame = test.hex, #datos de validacion/test activation = 'RectifierWithDropout', hidden = c(8,8), #tamaño de las capas ocultas hidden_dropout_ratio = c(0.5,0.5), input_dropout_ratio = 0.2, epochs = 50,#iteraciones l1 = 1e-5, l2 = 1e-5, rho = 0.99, epsilon = 1e-8) ## | | | 0% | |=============================================================== | 90% | |======================================================================| 100% summary(modelo_r1) ## Model Details: ## ============== ## ## H2ORegressionModel: deeplearning ## Model Key: DeepLearning_model_R_1655376581048_636 ## Status of Neuron Layers: predicting price, regression, gaussian distribution, Quadratic loss, 7.969 weights/biases, 120,2 KB, 212.450 training samples, mini-batch size 1 ## layer units type dropout l1 l2 mean_rate rate_rms ## 1 1 985 Input 20.00 % NA NA NA NA ## 2 2 8 RectifierDropout 50.00 % 0.000010 0.000010 0.130510 0.327977 ## 3 3 8 RectifierDropout 50.00 % 0.000010 0.000010 0.002446 0.007122 ## 4 4 1 Linear NA 0.000010 0.000010 0.001311 0.001460 ## momentum mean_weight weight_rms mean_bias bias_rms ## 1 NA NA NA NA NA ## 2 0.000000 -0.010822 0.071311 0.651801 0.841226 ## 3 0.000000 0.007556 0.450483 0.339081 0.415686 ## 4 0.000000 -0.267058 0.425221 0.032609 0.000000 ## ## H2ORegressionMetrics: deeplearning ## ** Reported on training data. ** ## ** Metrics reported on full training frame ** ## ## MSE: 20686.41 ## RMSE: 143.8277 ## MAE: 32.30078 ## RMSLE: NaN ## Mean Residual Deviance : 20686.41 ## ## 6
## H2ORegressionMetrics: deeplearning ## ** Reported on validation data. ** ## ** Metrics reported on full validation frame ** ## ## MSE: 10689.4 ## RMSE: 103.3896 ## MAE: 27.25684 ## RMSLE: NaN ## Mean Residual Deviance : 10689.4 ## ## ## ## ## Scoring History: ## timestamp duration training_speed epochs iterations ## 1 2022-06-16 14:10:14 0.000 sec NA 0.00000 0 ## 2 2022-06-16 14:10:14 0.179 sec 174139 obs/sec 5.00000 1 ## 3 2022-06-16 14:10:15 1.361 sec 168477 obs/sec 50.00000 10 ## samples training_rmse training_deviance training_mae training_r2 ## 1 0.000000 NA NA NA NA ## 2 21245.000000 174.20626 30347.82061 42.48765 0.04018 ## 3 212450.000000 143.82770 20686.40687 32.30078 0.34574 ## validation_rmse validation_deviance validation_mae validation_r2 ## 1 NA NA NA NA ## 2 128.12518 16416.06189 34.65397 0.06037 ## 3 103.38956 10689.40143 27.25684 0.38816 ## ## Variable Importances: (Extract with ‘h2o.varimp‘) ## ================================================= ## ## Variable Importances: ## variable relative_importance scaled_importance percentage ## 1 winery.Vega Sicilia 1.000000 1.000000 0.008638 ## 2 rating 0.700464 0.700464 0.006051 ## 3 year 0.640521 0.640521 0.005533 ## 4 wine.Unico 0.511693 0.511693 0.004420 ## 5 winery.Carmelo Rodero 0.485138 0.485138 0.004191 ## ## --- ## variable relative_importance scaled_importance percentage ## 980 wine.Cyclo 0.038349 0.038349 0.000331 ## 981 wine.Monada 0.037606 0.037606 0.000325 ## 982 wine.missing(NA) 0.000000 0.000000 0.000000 ## 983 winery.missing(NA) 0.000000 0.000000 0.000000 ## 984 region.missing(NA) 0.000000 0.000000 0.000000 ## 985 type.missing(NA) 0.000000 0.000000 0.000000 #Coeficiente Rˆ2 h2o.r2(modelo_r1) ## [1] 0.3457417 7
#Capacidad de predicción predict_test =h2o.predict(modelo_r1, newdata = test.hex) ## | | | 0% | |======================================================================| 100% pred =as.data.frame(predict_test) head(pred) ## predict ## 1 317.0526 ## 2 353.6677 ## 3 366.3926 ## 4 324.5679 ## 5 298.3987 ## 6 295.0417 Modelo 2: Red con una capa oculta y 15 nodos modelo_r6 =h2o.deeplearning( x=c(1,2,3,4,5,6,8,9,10), #variables predictoras y=7,#variable respuesta training_frame = train.hex, #datos de entrenamiento validation_frame = test.hex, #datos de validacion/test activation = 'RectifierWithDropout', hidden = 15,#tamaño de las capas ocultas hidden_dropout_ratio = 0.5, input_dropout_ratio = 0.2, epochs = 50,#iteraciones l1 = 1e-5, l2 = 1e-5, rho = 0.99, epsilon = 1e-8) ## | | | 0% | |================================================= | 70% | |======================================================================| 100% summary(modelo_r6) ## Model Details: ## ============== ## ## H2ORegressionModel: deeplearning ## Model Key: DeepLearning_model_R_1655376581048_637 ## Status of Neuron Layers: predicting price, regression, gaussian distribution, Quadratic loss, 14.806 weights/biases, 199,7 KB, 212.450 training samples, mini-batch size 1 ## layer units type dropout l1 l2 mean_rate rate_rms ## 1 1 985 Input 20.00 % NA NA NA NA ## 2 2 15 RectifierDropout 50.00 % 0.000010 0.000010 0.028270 0.140231 ## 3 3 1 Linear NA 0.000010 0.000010 0.000692 0.000697 ## momentum mean_weight weight_rms mean_bias bias_rms ## 1 NA NA NA NA NA 8
## 2 0.000000 -0.007734 0.066690 0.013158 0.125649 ## 3 0.000000 0.048538 0.562107 0.045499 0.000000 ## ## H2ORegressionMetrics: deeplearning ## ** Reported on training data. ** ## ** Metrics reported on full training frame ** ## ## MSE: 10832.55 ## RMSE: 104.0795 ## MAE: 31.70916 ## RMSLE: NaN ## Mean Residual Deviance : 10832.55 ## ## ## H2ORegressionMetrics: deeplearning ## ** Reported on validation data. ** ## ** Metrics reported on full validation frame ** ## ## MSE: 6039.789 ## RMSE: 77.71608 ## MAE: 31.8142 ## RMSLE: NaN ## Mean Residual Deviance : 6039.789 ## ## ## ## ## Scoring History: ## timestamp duration training_speed epochs iterations ## 1 2022-06-16 14:10:18 0.000 sec NA 0.00000 0 ## 2 2022-06-16 14:10:18 0.232 sec 147534 obs/sec 5.00000 1 ## 3 2022-06-16 14:10:19 1.608 sec 146114 obs/sec 50.00000 10 ## samples training_rmse training_deviance training_mae training_r2 ## 1 0.000000 NA NA NA NA ## 2 21245.000000 138.48764 19178.82519 44.43237 0.39342 ## 3 212450.000000 104.07953 10832.54840 31.70916 0.65739 ## validation_rmse validation_deviance validation_mae validation_r2 ## 1 NA NA NA NA ## 2 104.65263 10952.17383 40.70121 0.37312 ## 3 77.71608 6039.78949 31.81420 0.65429 ## ## Variable Importances: (Extract with ‘h2o.varimp‘) ## ================================================= ## ## Variable Importances: ## variable relative_importance scaled_importance percentage ## 1 winery.Dominio de Pingus 1.000000 1.000000 0.007099 ## 2 wine.Valbuena 5o 0.916805 0.916805 0.006508 ## 3 wine.Gran Reserva 0.755750 0.755750 0.005365 ## 4 winery.Alvaro Palacios 0.738480 0.738480 0.005242 ## 5 winery.Vega Sicilia 0.690146 0.690146 0.004899 ## ## --- ## variable relative_importance scaled_importance 9
## 980 wine.Vatan Tinta de Toro 0.060717 0.060717 ## 981 winery.Bodega Juan Carlos Sancha 0.057424 0.057424 ## 982 wine.missing(NA) 0.000000 0.000000 ## 983 winery.missing(NA) 0.000000 0.000000 ## 984 region.missing(NA) 0.000000 0.000000 ## 985 type.missing(NA) 0.000000 0.000000 ## percentage ## 980 0.000431 ## 981 0.000408 ## 982 0.000000 ## 983 0.000000 ## 984 0.000000 ## 985 0.000000 #Coeficiente Rˆ2 h2o.r2(modelo_r6) ## [1] 0.6573941 #Capacidad de predicción predict_test6 =h2o.predict(modelo_r6, newdata = test.hex) ## | | | 0% | |======================================================================| 100% pred6 =as.data.frame(predict_test6) head(pred6) ## predict ## 1 624.4466 ## 2 721.6425 ## 3 779.8993 ## 4 673.9582 ## 5 665.1923 ## 6 659.3607 Modelo 3: Red con una capa oculta y 60 nodos modelo_r7 =h2o.deeplearning( x=c(1,2,3,4,5,6,8,9,10), #variables predictoras y=7,#variable respuesta training_frame = train.hex, #datos de entrenamiento validation_frame = test.hex, #datos de validacion/test activation = 'RectifierWithDropout', hidden = 60,#tamaño de las capas ocultas hidden_dropout_ratio = 0.5, input_dropout_ratio = 0.2, epochs = 50,#iteraciones l1 = 1e-5, l2 = 1e-5, rho = 0.99, epsilon = 1e-8) 10
## | | | 0% | |===================== | 30% | |================================================= | 70% | |======================================================================| 100% summary(modelo_r7) ## Model Details: ## ============== ## ## H2ORegressionModel: deeplearning ## Model Key: DeepLearning_model_R_1655376581048_638 ## Status of Neuron Layers: predicting price, regression, gaussian distribution, Quadratic loss, 59.221 weights/biases, 720,7 KB, 212.450 training samples, mini-batch size 1 ## layer units type dropout l1 l2 mean_rate rate_rms ## 1 1 985 Input 20.00 % NA NA NA NA ## 2 2 60 RectifierDropout 50.00 % 0.000010 0.000010 0.067521 0.219405 ## 3 3 1 Linear NA 0.000010 0.000010 0.001444 0.001616 ## momentum mean_weight weight_rms mean_bias bias_rms ## 1 NA NA NA NA NA ## 2 0.000000 -0.003965 0.059617 -0.056053 0.117727 ## 3 0.000000 -0.078516 0.347052 -0.060683 0.000000 ## ## H2ORegressionMetrics: deeplearning ## ** Reported on training data. ** ## ** Metrics reported on full training frame ** ## ## MSE: 8727.75 ## RMSE: 93.42243 ## MAE: 23.52113 ## RMSLE: NaN ## Mean Residual Deviance : 8727.75 ## ## ## H2ORegressionMetrics: deeplearning ## ** Reported on validation data. ** ## ** Metrics reported on full validation frame ** ## ## MSE: 4035.965 ## RMSE: 63.52925 ## MAE: 23.59744 ## RMSLE: NaN ## Mean Residual Deviance : 4035.965 ## ## ## ## ## Scoring History: ## timestamp duration training_speed epochs iterations ## 1 2022-06-16 14:10:21 0.000 sec NA 0.00000 0 ## 2 2022-06-16 14:10:22 0.746 sec 44632 obs/sec 5.00000 1 ## 3 2022-06-16 14:10:25 4.090 sec 58109 obs/sec 50.00000 10 ## samples training_rmse training_deviance training_mae training_r2 ## 1 0.000000 NA NA NA NA ## 2 21245.000000 134.70202 18144.63423 62.28928 0.42613 ## 3 212450.000000 93.42243 8727.75019 23.52113 0.72396 ## validation_rmse validation_deviance validation_mae validation_r2 ## 1 NA NA NA NA 11
hidden_dropout_ratio = 0.5, input_dropout_ratio = 0.2, epochs = 50,#iteraciones l1=1e-5, l2=1e-5, rho = 0.99, epsilon = 1e-8) ## | | | 0% | |======= | 10% | |============== | 20% | |===================== | 30% | |============================ | 40% | |=================================== | 50% | |========================================== | 60% | |================================================= | 70% | |======================================================== | 80% | |=============================================================== | 90% | |======================================================================| 100% summary(modelo_r10) ## Model Details: ## ============== ## ## H2ORegressionModel: deeplearning ## Model Key: DeepLearning_model_R_1655376581048_641 ## Status of Neuron Layers: predicting price, regression, gaussian distribution, Quadratic loss, 637.603 weights/biases, 7,3 MB, 212.450 training samples, mini-batch size 1 ## layer units type dropout l1 l2 mean_rate rate_rms ## 1 1 985 Input 20.00 % NA NA NA NA ## 2 2 646 RectifierDropout 50.00 % 0.000010 0.000010 0.128543 0.250927 ## 3 3 1 Linear NA 0.000010 0.000010 0.000886 0.001382 ## momentum mean_weight weight_rms mean_bias bias_rms ## 1 NA NA NA NA NA ## 2 0.000000 -0.001946 0.040877 -0.049348 0.121334 ## 3 0.000000 0.003879 0.103668 -0.073644 0.000000 ## ## H2ORegressionMetrics: deeplearning ## ** Reported on training data. ** ## ** Metrics reported on full training frame ** ## ## MSE: 6781.641 ## RMSE: 82.35072 ## MAE: 23.8623 ## RMSLE: NaN ## Mean Residual Deviance : 6781.641 ## ## ## H2ORegressionMetrics: deeplearning ## ** Reported on validation data. ** ## ** Metrics reported on full validation frame ** ## ## MSE: 3305.347 ## RMSE: 57.49214 ## MAE: 24.29633 ## RMSLE: NaN ## Mean Residual Deviance : 3305.347 ## ## ## ## ## Scoring History: 18
## timestamp duration training_speed epochs iterations ## 1 2022-06-16 14:12:40 0.000 sec NA 0.00000 0 ## 2 2022-06-16 14:12:45 6.778 sec 4282 obs/sec 5.00000 1 ## 3 2022-06-16 14:13:05 26.817 sec 6325 obs/sec 35.00000 7 ## 4 2022-06-16 14:13:14 36.249 sec 6793 obs/sec 50.00000 10 ## 5 2022-06-16 14:13:16 37.762 sec 6785 obs/sec 50.00000 10 ## samples training_rmse training_deviance training_mae training_r2 ## 1 0.000000 NA NA NA NA ## 2 21245.000000 120.96864 14633.41070 29.97495 0.53718 ## 3 148715.000000 82.35072 6781.64108 23.86230 0.78551 ## 4 212450.000000 81.11868 6580.24046 30.37342 0.79188 ## 5 212450.000000 82.35072 6781.64108 23.86230 0.78551 ## validation_rmse validation_deviance validation_mae validation_r2 ## 1 NA NA NA NA ## 2 87.40656 7639.90702 27.43820 0.56270 ## 3 57.49214 3305.34652 24.29633 0.81081 ## 4 60.03133 3603.76114 31.31636 0.79373 ## 5 57.49214 3305.34652 24.29633 0.81081 ## ## Variable Importances: (Extract with ‘h2o.varimp‘) ## ================================================= ## ## Variable Importances: ## variable relative_importance scaled_importance ## 1 wine.Pingus 1.000000 1.000000 ## 2 winery.Dominio de Pingus 0.958878 0.958878 ## 3 wine.L’Ermita Velles Vinyes Priorat 0.867255 0.867255 ## 4 winery.Alvaro Palacios 0.780745 0.780745 ## 5 wine.Valbuena 5o 0.778824 0.778824 ## percentage ## 1 0.004150 ## 2 0.003980 ## 3 0.003599 ## 4 0.003240 ## 5 0.003232 ## ## --- ## variable relative_importance scaled_importance ## 980 wine.Belondrade y Lurton 0.208563 0.208563 ## 981 wine.Seleccion Especial Verdejo 0.207591 0.207591 ## 982 wine.missing(NA) 0.000000 0.000000 ## 983 winery.missing(NA) 0.000000 0.000000 ## 984 region.missing(NA) 0.000000 0.000000 ## 985 type.missing(NA) 0.000000 0.000000 ## percentage ## 980 0.000866 ## 981 0.000862 ## 982 0.000000 ## 983 0.000000 ## 984 0.000000 ## 985 0.000000 #Coeficiente Rˆ2 h2o.r2(modelo_r10) 19
## [1] 0.785514 #Capacidad de predicción predict_test10 =h2o.predict(modelo_r10, newdata = test.hex) ## | | | 0% | |======================================================================| 100% pred10 =as.data.frame(predict_test10) head(pred10) ## predict ## 1 586.0657 ## 2 713.1365 ## 3 814.7280 ## 4 670.7010 ## 5 574.9026 ## 6 565.6825 20
Ejemplo de regresión - Precio del vino español en Python Raquel Beltrán Barba PREDICCIÓN DEL PRECIO DEL VINO ESPAÑOL Primero cargamos las librerías que vamos a necesitar: import numpy as np import pandas as pd import math import sklearn import sklearn.preprocessing import datetime import os import matplotlib.pyplot as plt import tensorflow as tf import csv import seaborn as sns from sklearn.preprocessing import OneHotEncoder from sklearn.preprocessing import LabelEncoder Lectura y modificación del conjunto de datos #os.chdir("C:\\Users\\raque\\OneDrive\\Escritorio\\TFG\\Bases.de.datos\\vino2") datos =pd.read_csv('wines_SPA.csv', delimiter =",") #Eliminamos la variable country, ya que toma el valor España siempre del(datos['country']) datos['year']=datos['year'].replace('N.V.', np.NaN) datos =datos.dropna() datos['year']=datos['year'].astype(np.int64) for col in datos.columns: if datos[col].dtype == 'object': #print(str(col)) label =LabelEncoder() label =label.fit(datos[col]) datos[col] =label.transform(datos[col].astype(str)) datos.head() ## winery wine year rating num_reviews region price type body acidity ## 0 344 607 2013 4.9 58 58 995.00 19 5.0 3.0 ## 1 28 653 2018 4.9 31 61 313.50 18 4.0 2.0 ## 2 366 622 2009 4.8 1793 46 324.95 11 5.0 3.0 ## 3 366 622 1999 4.8 1705 46 692.96 11 5.0 3.0 ## 4 366 622 1996 4.8 1309 46 778.06 11 5.0 3.0 1
Estudio de las variables datos.info() ## <class ’pandas.core.frame.DataFrame’> ## Int64Index: 6070 entries, 0 to 7499 ## Data columns (total 10 columns): ## # Column Non-Null Count Dtype ## --- ------ -------------- ----- ## 0 winery 6070 non-null int32 ## 1 wine 6070 non-null int32 ## 2 year 6070 non-null int64 ## 3 rating 6070 non-null float64 ## 4 num_reviews 6070 non-null int64 ## 5 region 6070 non-null int32 ## 6 price 6070 non-null float64 ## 7 type 6070 non-null int32 ## 8 body 6070 non-null float64 ## 9 acidity 6070 non-null float64 ## dtypes: float64(4), int32(4), int64(2) ## memory usage: 426.8 KB datos.shape ## (6070, 10) #Estudio de las variables categóricas cat_feat =datos[['winery','wine','year','region','type']] cat_feat.describe() ## winery wine year region type ## count 6070.000000 6070.000000 6070.000000 6070.000000 6070.000000 ## mean 211.177430 373.687479 2012.955189 41.828995 10.988303 ## std 103.685401 180.621140 7.145244 14.142791 3.627947 ## min 0.000000 0.000000 1910.000000 0.000000 0.000000 ## 25% 130.000000 208.000000 2011.000000 43.000000 10.000000 ## 50% 214.000000 395.000000 2015.000000 46.000000 11.000000 ## 75% 304.000000 531.000000 2017.000000 48.000000 12.000000 ## max 394.000000 676.000000 2021.000000 62.000000 20.000000 2
#Correlaciones entre las variables corr_matrix =datos.corr(method='pearson') corr_matrix ## winery wine year ... type body acidity ## winery 1.000000 -0.205883 -0.166178 ... -0.089298 0.104001 0.255655 ## wine -0.205883 1.000000 -0.036589 ... 0.141347 -0.039152 -0.182456 ## year -0.166178 -0.036589 1.000000 ... -0.010680 -0.100687 0.155387 ## rating -0.017197 0.039051 -0.299519 ... 0.022493 0.161058 -0.085140 ## num_reviews -0.005016 0.099387 0.042120 ... 0.020928 0.079627 0.050742 ## region 0.025006 0.117132 -0.112547 ... 0.463734 0.327776 -0.176325 ## price 0.018154 0.060671 -0.384351 ... 0.036404 0.150861 -0.030566 ## type -0.089298 0.141347 -0.010680 ... 1.000000 0.421510 -0.319898 ## body 0.104001 -0.039152 -0.100687 ... 0.421510 1.000000 -0.001638 ## acidity 0.255655 -0.182456 0.155387 ... -0.319898 -0.001638 1.000000 ## ## [10 rows x 10 columns] sns.heatmap(corr_matrix, annot=True) plt.show() winery wine year rating num_reviews region price type body acidity winery wine year rating num_reviews region price type body acidity 1-0.21 -0.17-0.017-0.0050.0250.018-0.089 0.1 0.26 -0.21 1-0.0370.0390.099 0.12 0.061 0.14-0.039-0.18 -0.17-0.037 1-0.3 0.042 -0.11 -0.38-0.011 -0.1 0.16 -0.0170.039 -0.3 1-0.00310.04 0.55 0.022 0.16 -0.085 -0.0050.0990.042-0.0031 10.034-0.0460.021 0.08 0.051 0.025 0.12 -0.11 0.04 0.034 10.067 0.46 0.33 -0.18 0.0180.061 -0.38 0.55 -0.0460.067 10.036 0.15 -0.031 -0.089 0.14 -0.0110.0220.021 0.46 0.036 10.42 -0.32 0.1 -0.039 -0.1 0.16 0.08 0.33 0.15 0.42 1-0.0016 0.26 -0.18 0.16 -0.0850.051 -0.18-0.031-0.32-0.0016 1 0.2 0.0 0.2 0.4 0.6 0.8 1.0 3
#A traves de la funcion tidy_corr_matrix obtenemos las variables con mayor correlacion def tidy_corr_matrix(corr_mat): '''Función para convertir una matriz de correlación de pandas en formato tidy.''' corr_mat =corr_mat.stack().reset_index() corr_mat.columns =['variable_1','variable_2','r'] corr_mat =corr_mat.loc[corr_mat['variable_1']!= corr_mat['variable_2'], :] corr_mat['abs_r']=np.abs(corr_mat['r']) corr_mat =corr_mat.sort_values('abs_r', ascending=False) return(corr_mat) tidy_corr_matrix(corr_matrix).head(10) ## variable_1 variable_2 r abs_r ## 63 price rating 0.551943 0.551943 ## 36 rating price 0.551943 0.551943 ## 75 type region 0.463734 0.463734 ## 57 region type 0.463734 0.463734 ## 87 body type 0.421510 0.421510 ## 78 type body 0.421510 0.421510 ## 26 year price -0.384351 0.384351 ## 62 price year -0.384351 0.384351 ## 58 region body 0.327776 0.327776 ## 85 body region 0.327776 0.327776 #Representación de las variables price y rating fig, ax =plt.subplots(1,1, figsize=(6,4)) ax.scatter(x=datos.price, y=datos.rating, alpha=0.8) ax.set_xlabel('Precio de la botella de vino') ax.set_ylabel('Valoración del vino'); # Representacion de la variable Amount PRECIO =datos["price"] x=range(0,PRECIO.shape[0]) plt.style.use('seaborn-whitegrid') plt.rcParams["figure.figsize"]=(20,8) fig =plt.figure() ax =plt.axes() ax.plot(x,PRECIO,color='#0099CC') #plt.xlabel("") plt.ylabel("Precio") ax.set_title("VARIABLE PRICE") 4
Partición Entrenamiento/Test X=datos.loc[:, datos.columns != 'price'] y=datos["price"] from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test =train_test_split(X, y, test_size=0.3, random_state=42) print('X_train.shape = ',X_train.shape) ## X_train.shape = (4249, 9) print('y_train.shape = ', y_train.shape) ## y_train.shape = (4249,) print('X_test.shape = ', X_test.shape) ## X_test.shape = (1821, 9) print('y_test.shape = ',y_test.shape) ## y_test.shape = (1821,) 5
Comenzamos a trabajar con los modelos de Redes Neuronales from sklearn.neural_network import MLPRegressor from sklearn.metrics import mean_squared_error from sklearn.metrics import r2_score Modelo 1: Red con dos capas ocultas de 8 nodos cada una modelor1 =MLPRegressor(hidden_layer_sizes=(8,8), learning_rate_init=0.01, solver ='adam', max_iter =1000, random_state =7978) modelor1.fit(X=X_train, y=y_train) ## MLPRegressor(hidden_layer_sizes=(8, 8), learning_rate_init=0.01, max_iter=1000, ## random_state=7978) #Capacidad de predicción predictions =modelor1.predict(X_test) rmse1 =mean_squared_error( y_true =y_test, y_pred =predictions, squared =False ) rmse1 ## 173.92509404735327 #Calculo del coeficiente de determinación r2 =r2_score(y_test, predictions) print(r2) ## 0.20151012395131318 Modelo 2: Red con una capa oculta y 15 nodos modelor6 =MLPRegressor(hidden_layer_sizes=(15), learning_rate_init=0.01, solver ='adam', max_iter =1000, random_state =7978) modelor6.fit(X=X_train, y=y_train) 6
## MLPRegressor(hidden_layer_sizes=15, learning_rate_init=0.01, max_iter=1000, ## random_state=7978) #Capacidad de predicción predictions6 =modelor6.predict(X_test) rmse6 =mean_squared_error( y_true =y_test, y_pred =predictions6, squared =False) rmse6 ## 172.67282617709498 #Calculo del coeficiente de determinación r2_6 =r2_score(y_test, predictions6) print(r2_6) ## 0.2129670500228832 Modelo 3: Red con una capa oculta y 60 nodos modelor7 =MLPRegressor(hidden_layer_sizes=(60), learning_rate_init=0.01, solver ='adam', max_iter =1000, random_state =7978) modelor7.fit(X=X_train, y=y_train) ## MLPRegressor(hidden_layer_sizes=60, learning_rate_init=0.01, max_iter=1000, ## random_state=7978) #Capacidad de predicción predictions7 =modelor7.predict(X_test) rmse7 =mean_squared_error( y_true =y_test, y_pred =predictions7, squared =False) rmse7 ## 168.26769170429267 #Calculo del coeficiente de determinación r2_7 =r2_score(y_test, predictions7) print(r2_7) ## 0.2526115283371466 7