Full text
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA INFORMÁTICA GRADUADO EN INGENIERÍA DE COMPUTADORES Comparación y análisis de métodos de clasificación con las bibliotecas scikit-learn y TensorFlow en Python Comparison and analysis of classification methods with scikit-learn and TensorFlow libraries in Python Realizado por Juan Zamorano Ruiz Tutorizado por Daniel Garrido Márquez Departamento Lenguajes y Ciencias de la Computación UNIVERSIDAD DE MÁLAGA MÁLAGA, SEPTIEMBRE DE 2019 Fecha defensa: Fdo. El/la Secretario/a del Tribunal
Resumen Hoy en día no podemos negar que vivimos rodeados de la generación de una gran cantidad de datos, más ahora que estamos en plena era digital y la mayoría de esta información se puede almacenar y procesar. Numerosas empresas buscan enfocar el uso de dicha información para sacar un beneficio a favor de los objetivos de su negocio y se ayudan de las herramientas adecuadas para llevar a cabo esta tarea. La rama de la Inteligencia Artificial denominada “Machine Learning” o, también conocido como aprendizaje automático, es aquella que permite a las máquinas aprender a través de los datos detectando patrones y ayudando a la toma de decisiones. Con esta rama de la inteligencia artificial lo que se pretende es dar uso al conocimiento de los datos históricos para poder llevar a cabo decisiones concretas en el futuro. Dentro del aprendizaje automático existen distintos tipos de problemas, dependiendo de su naturaleza y del objetivo buscado, así en este caso nos centraremos en aprendizaje supervisado para clasificación. Existen distintos algoritmos y técnicas matemáticas para poder llevar a cabo un problema de clasificación, donde una de las más usadas y conocidas es el de las redes neuronales. En este proyecto vamos a hacer uso de dos bibliotecas para aprendizaje automático, profundizando en redes neuronales , ambas diseñadas para su uso en Python: una de ellas es la biblioteca Scikit-learn para Machine Learning, y otra parte la biblioteca de código abierto TensorFlow. Se realizará una comparación y análisis del comportamiento de cada algoritmo y librería con distintas métricas en la predicción de 7 tipos de cubiertas forestales con el uso de variables cartográficas a través de distintos valores tomados en 4 áreas distintas del parque nacional de Roosevelt, en el norte del estado de Colorado. Palabras clave: Scikit-learn, TensorFlow, Aprendizaje automático, Big Data, Python, Inteligencia Artificial, Keras, Análisis
Abstract Today we can´t deny that we live surrounded by the generation of a large amount of data, indeed today that we are in the digital age and most of this information is possible to store and process. Numerous companies seek to focus on the use of such information to make a profit in favor of the objectives of their business and we help ourselves with the appropriate tools to carry out this task. The branch of Artificial Intelligence called "Machine Learning" is one that allows machines to learn through data by detecting patterns and helping to make decisions. With this branch of artificial intelligence what we intend is to use the knowledge of historical data to be able to carry out concrete decisions in the future. Within the automatic learning there are different types of problems, depending on their nature and the target, so in this case we will focus on supervised learning for classification. There are different algorithms and mathematical techniques to carry out a classification problem, one of the most used and known is neural networks. In this project we will make use of two libraries for machine learning to implement a neural network, both designed for use in Python language: one of them is the Scikit-learn library for Machine Learning, and on the other hand the use of the open source library TensorFlow. A comparison and analysis of the behavior of each algorithm and library will be made with different metrics in the prediction of 7 forest cover types with the use of cartographic variables different values taken in 4 different areas of the Roosevelt National Park, in the north of the state of Colorado. Keywords: Scikit-learn, TensorFlow, Machine Learning, Big Data, Python, Artificial Intelligence, Keras, Analysis.
9 datos se desarrollarán distintos programas en Python para automatizar, en la medida de lo posible, el procesamiento de los datos, el entrenamiento de los algoritmos y extracción de las métricas que nos darán la posibilidad de realizar la comparativa. 1.3 Estructura de la memoria La estructura de la memoria de este trabajo va a consistir en varias partes que permitirán dar a conocer el uso del aprendizaje automático así como los distintos algoritmos que se pueden usar para realizar la clasificación de unos datos seleccionados, así como las respectivas gráficas y comparativas en las que el trabajo se centra. De esta forma, la memoria consta de: Una introducción para contextualizar el trabajo a realizar y por qué se ha propuesto su desarrollo. Un estudio del caso de uso a tratar y el trabajo que se pretende realizar sobre el mismo para aplicar los algoritmos de aprendizaje automático dando uso de las librerías disponibles para el objetivo buscado. Un capítulo donde se explica en qué consiste el aprendizaje automático y donde se analizan los algoritmos basados en redes neuronales y el porqué de su uso en nuestros días. Un capítulo donde se analizan y explican los pasos dados para analizar los datos, su procesamiento y entrenamiento de los algoritmos. Explicación del uso de programas para conseguir automatizar las distintas tareas que un trabajo de aprendizaje automático conlleva usando las librerías disponibles y los entornos de programación que facilitan su uso. Además se explican las métricas que se pretenden extraer. Un último capítulo donde se examinan las métricas obtenidas de los algoritmos seleccionados y se realiza una comparación atendiendo a cada una de ellas para posteriormente llegar a unas conclusiones atendiendo a los valores obtenidos.
10 2 Caso de uso y trabajo a realizar 2.2. ¿De dónde procede el conjunto de datos? El conjunto de datos seleccionado, de tipo de cobertura forestal procede (Blackard Jock, Dean Denis, & Anderson, 1998) del depósito de Aprendizaje Automático de la UC Irvine, lugar donde mantienen aproximadamente cerca de 500 conjuntos de datos al servicio de la comunidad del aprendizaje automático. Se necesitaba encontrar un conjunto de datos que permitiera llevar a cabo el problema de una clasificación y donde tuviera un conjunto lo suficientemente grande para entrenar los algoritmos, además de ser una fuente fiable que nos pueda asegurar que los datos son correctos y que no existe información perdida, algo que se observará en el Capítulo 2.2. Para la elección de los datos es adecuado tener en consideración cuál será el objetivo del trabajo y qué elementos se quieren tener en cuenta para el análisis a llevar a cabo. Para poder realizar este análisis se debe tener en cuenta un conjunto de datos con un número de ejemplos significativo, que nos sirva para modelar nuestros algoritmos. Así, las características que buscamos son: ● Uso de almacenamiento moderado. No podemos considerar aquellos que ocupen del orden de Terabytes. ● Tiempo de cómputo moderado. Esto es interesante para la extracción de modelos a través del uso de los distintos algoritmos previamente
11 estudiados y de donde podremos realizar el estudio y análisis de los mismos atendiendo a su comportamiento con las métricas seleccionadas. ● Tipo de clasificación. Podemos tener un tipo de clasificación binaria, elección entre cierto o falso, o multiclase donde tenemos 3 o más clases a clasificar. En esta ocasión es necesario que esté enfocada a multiclase para observar cómo los algoritmos hacen uso de la técnica One-vs-Rest (Rifkin, Klautau, & Org, 2004) . Tras un análisis de distintos conjuntos de datos, su naturaleza, su distribución y atendiendo a que sea un problema tipo clasificación, se ha decidido finalmente la elección de un problema que se adecua y que resulta interesante para nuestro estudio, este es el de la predicción del tipo de cubierta arbórea usando solo variables cartográficas (Blackard Jock et al., 1998) Según se puede ver en la información del repositorio, se observan las siguientes características: Ilustración 1. Metadatos del conjunto de datos seleccionado Se observa un conjunto de 581012 instancias, es un problema de tipo clasificación, con 54 atributos y que no existen valores perdidos, algo que indica la fiabilidad de los datos para así proceder con confianza en el estudio, sin afectar al comportamiento de los algoritmos. La idea de este tipo de clasificación se basa en la predicción del tipo de cobertura forestal, es decir, cual es el tipo de árbol más predominante en un área, teniendo como información variables estrictamente cartográficas. Este tipo de clasificación de cobertura forestal la determinó el área del Servicio Forestal de Estados Unidos (USFS) para cuadrículas de 30 x 30 metros. Estos datos fueron guardados tal y como se tomaron, por lo que no han sido transformados en una escala en el que todos formen parte de un mismo rango, además contienen atributos en forma binaria para variables cualitativas independientes como áreas silvestres o tipo de suelo, variables que derivaron a partir de los datos obtenidos del US Geological Survey y USFS. Estos datos
12 son importantes tenerlos en cuenta, pues influyen en los algoritmos en el momento de entrenarlos. Los datos provienen de 4 áreas silvestres en el Bosque Nacional de Roosevelt en el norte del estado de Colorado. Estas áreas representan bosques con un mínimo de cambios provocados por el hombre por lo que los tipos de estas cubiertas forestales son representativos de procesos ecológicos naturales en lugar de repoblaciones o cambios realizados por el hombre. Las 4 áreas silvestres se encuentran representadas en el siguiente mapa y donde se pueden encontrar los siguientes tipos de cubierta arbórea, imágenes obtenidas del enlace 2 : Ilustración 2. Mapa distribución de las zonas del parque zona Cache La Poudre: Ilustración 3. Zona Cache La Poudre 2 tourbuilder
13 zona comanche peak Ilustración 4. Zona Comanche Peak zona Neota Ilustración 5. Zona Neota zona Rawah Ilustración 6. Zona Rawah
14 2.2. ¿Qué atributos tiene el conjunto de datos? Las características que tiene el conjunto de datos seleccionado son: ● Altitud: cuantitativo, expresado en metros representando la elevación en metros de cada instancia recogida. ● Aspecto: cuantitativo, expresa el aspecto en grados acimut que muestra la instancia recogida. Este es un dato usado para cartografiar. ● Sombra: cuantitativo, expresa los grados de sombra que proyecta el ejemplo donde se ha tomado. ● Distancia horizontal hasta hidrología: cuantitativo, expresa en metros la distancia horizontal hasta el recurso hidrológico más cercano. ● Distancia vertical hasta hidrología: cuantitativo, al igual que el anterior, pero en esta ocasión expresa en metros la distancia vertical. ● Distancia horizontal hasta carreteras: cuantitativo, refleja la distancia horizontal en metros hasta la carretera más próxima. ● Sombra a las 9 de la mañana: cuantitativo, indica el índice de sombra en el solsticio de verano a las 9 de la mañana, un índice que va en el rango de 0 hasta 255. ● Sombra al mediodía: al igual que el anterior, pero al mediodía. ● Sombra a las 3 de la tarde: similar que el anterior, pero en esta ocasión valor tomado a las 3 de la tarde. ● Distancia horizontal al punto de fuego más cercano: cuantitativo, muestra la distancia horizontal en metros a un posible punto de fuego. ● Área silvestre: 4 columnas binarias de tipo cualitativo para cada una de las áreas silvestres que se tratan en este problema. 1 indica presencia y 0 ausencia. ● Tipo de suelo: 40 columnas binarias de tipo cualitativo para indicar el tipo de suelo. 1 indica presencia y 0 ausencia dentro de 40 tipos de suelos posibles. ● Tipo de cobertura : 7 tipos de cobertura arbórea posibles para este estudio. Es de tipo entero donde podemos tener valores del 1 al 7. Estos son los distintos valores que se quieren predecir y en los que se centra el trabajo para la extracción de métricas. Estos 7 valores serían los distintos tipos de cobertura arbórea predominante en el área del que se han cogido los datos. Estos tipos son:
15 1. Spruce/Fir 2. Lodgepole Pine 3. Ponderosa Pine 4. Cottonwood/Willow 5. Aspen 6. Douglas-fir 7. Krummholz Las siguientes imágenes representan cada uno de los tipos de cubierta arbórea que podemos encontrar en las 4 áreas y que queremos predecir con la información que tenemos del conjunto de datos. Ilustración 7. 7 tipos de cobertura arbórea 2.2. ¿En qué va a consistir nuestro trabajo? El objetivo de este trabajo es el de llevar a cabo el procesamiento de un problema de aprendizaje automático para clasificación, el cual involucra procesar los datos, entrenar los algoritmos de clasificación elegidos, obtener información relevante para almacenarla y, posteriormente, analizarla y compararla. Esta información es recopilada a través de los correspondientes módulos que se van a usar en las librerías del lenguaje de programación escogido, en este caso Python, y que se podrá saber a partir de ellas cómo cada algoritmo de los que se ha analizado realiza la clasificación para el conjunto de datos que se ha escogido. De esta forma, se pueden identificar los siguientes pasos una vez escogido el conjunto de datos a tratar, teniendo en cuenta que se quiere observar un problema de clasificación, y que se describe a continuación: 2.2.1. Descarga de los datos del repositorio Los datos están disponibles en el repositorio online que UCI tiene disponible para descargarlos. El que se quiere tratar (predicción del tipo de
16 cubierta arbórea forestal) se puede encontrar en el siguiente enlace: https://archive.ics.uci.edu/ml/machine-learning-databases/covtype/. Una vez descargados y descomprimidos se puede examinar y comprobar que es un archivo con extensión sin formato, pero que se puede abrir con un editor de texto y poder comprobar el aspecto que tiene la información. Así se observa lo siguiente: Ilustración 8. Ejemplo de distribución de los datos Se comprueba que la información está tal y como se describe, donde cada fila corresponde a cada ejemplo observado y sus respectivas columnas corresponden a los atributos que deben tener para cada ejemplo. El último valor corresponde al tipo de cobertura forestal al que pertenece cada ejemplo. Para un mejor manejo de estos mismos e importación en el código para su tratamiento en scikit-learn, se ha optado por tenerlo en formato con valores separados por compa (CSV) y donde se ha incluido la cabecera con los títulos de cada atributo, algo que servirá para la descripción de los datos a continuación. A partir de ahora el manejo y ejecución de comandos para el tratamiento de los datos y observación del estado en el que se encuentran se realizará a través de la aplicación Spyder 3 , un entorno desarrollado para Python y que facilita el acceso a la información así como la ejecución y depuración del programa desarrollado. 2.2.2. Estadísticas de los datos Una vez importados los datos se realiza una observación del estado de los mismos y detalle de sus estadísticas. Así, tras importar en la variable train el conjunto de datos, se pueden listar sus columnas con el comando list(train.columns.values) y obtenemos los siguientes valores: 3 https://www.spyder-ide.org/
17 Ilustración 9. Descripción de las columnas de los datos Con el comando train.describe() se podrá extraer información de cada columna, así como la suma total, la media, la desviación estándar, el valor mínimo y el máximo entre otros datos. Por ejemplo, si la desviación estándar de una columna (atributo) es 0, quiere decir que no existen variaciones, y por lo tanto esa columna o atributo se puede eliminar del conjunto de datos, ya que es irrelevante, no influye en la clasificación. Se observa que todas las columnas tienen 581012 ejemplos, por lo que no existe información perdida. La siguiente imagen sirve de ejemplo de la salida del comando para los atributos Elevation, Aspect y Slope. Elevation Aspect Slope count 581012.00000 581012.00000 581012.00000 mean 2959.365301 155.656807 14.103704 std 279.984734 111.913721 7.488242 min 1859.000000 0.000 0.000 25% 2809.000000 58 9 50% 2996 127 13 75% 3858 360 66 max 3858 360 66
18 2.2.3. Interacción de los datos La interacción con los datos está relacionado con llevar a cabo una serie de acciones sobre los datos para así saber plantear el problema en sí y tenerla para diseñar adecuadamente el entrenamiento de los algoritmos. Un ejemplo de esto es comprobar la distribución de los datos proporcionados y saber cuántos ejemplos se tiene de cada clase. Con la librería Seaborn 4 , la cual se utilizará para visualización estadística de datos posteriormente, se puede comprobar esto. Así se importa en la variable sns dicha librería y se ejecuta el siguiente comando : sns.countplot(data=train,x=train['Cover_Type']), la cual muestra la siguiente imagen: Ilustración 10. Distribución de los datos según clases Se puede ver que existe una mayor representación del tipo 2 mientras del tipo 4 es del que menos muestras se tienen. Esto se debe tener en cuenta, pues en el conjunto de datos que se usará para entrenar los algoritmos debe haber una representación de cada clase de la forma más equitativa posible, algo que se solventará usando técnicas de validación cruzada que se explicará en el Capítulo 4. 2.2.4. Preparación de los datos El conjunto de datos seleccionado se obtiene con una serie de atributos o características numéricas disponibles tal y como se tomaron en su momento, es lo que se puede definir como los “datos en crudo”. Por ello es necesario llevar a cabo una visualización de los mismos y adaptarlos, para así poder 4 https://seaborn.pydata.org/
25 basar la explicación del Perceptrón Simple que el psicólogo Rosenblat desarrolló basándose en otros conceptos. 3.3.1.1. Perceptrón Simple Se puede decir que el Perceptrón es un modelo de neurona simple. En el año 1958 el psicólogo Frank Rosenblat (Rosenblatt, 1958) desarrolló este modelo de neurona basándose en el presentado por McCulloch y Pitts (McCulloch & Pitts, 1943) y en una regla del aprendizaje que se basaba en la corrección del error. A los científicos de aquella época les llamó la atención la capacidad que tenía este modelo para aprender patrones y, por lo tanto, usarlo para clasificación atendiendo a esos patrones. Este tipo de neurona, el perceptrón, está basado en una cantidad de sensores, o también se pueden llamar entradas, desde donde recibe los datos a reconocer. También se encuentra una neurona de salida que, dependiendo del valor obtenido, indica si el dato con las características introducidas pertenece a una clase u otra. Para poder entender en que consiste el algoritmo del Perceptrón simple, es necesario también entender las funciones en las que se basa para poder llevar a cabo esa clasificación de datos, basadas en el concepto de Perceptrón simple. Se supone que tenemos la función f de Rn en {-1, 1}, a la que le podemos aplicar un patrón de entrada x =(x1,x2,...,xn)T ∈ Rn y donde tendremos una salida deseada z ∈ {-1, 1}, o lo que es lo mismo, f(x)= z. Dicho patrón de entrada, es lo que se va a considerar como los atributos que cada dato del conjunto de datos tiene y que se le pasa a la función previamente mencionada. Al tener un número de patrones de entrada al cual queremos llevar acabo la clasificación, tendríamos la siguiente relación {x1, z1}, {x2, z2}....{xp, zp}, donde xi es el patrón de entrada i ∈ Rn y z = f(xi). Esta función lo que hace es una partición del conjunto de entrada en dos espacios, lo que se dice una clasificación binaria. Por una parte se tendrían aquellos patrones cuya salida da +1 y por otro lado aquellos que da como salida -1. Esto indica que la función previamente comentada es capaz de distinguir entre dos clases.
26 El siguiente paso sería el de construir un modelo que cumpla con la función previamente mencionada. Para ello vamos a partir de una unidad de proceso bipolar la cual cumple la siguiente función: { } Aquí se tiene que los parámetros wi son los llamados pesos sinápticos. Estos pesos suponen la importancia que le vamos a dar a cada característica o valor de entrada. Por otro lado, se encuentra la suma ponderada que se llamará potencial sináptico y finalmente encontramos el umbral que es el símbolo . Si la salida de dicha función es 1 entonces se dice que está activa y en caso contrario será -1, o que está inactiva. En la siguiente ilustración se muestra cómo funciona este modelo explicado: Ilustración 11. Ejemplo de Perceptrón https://es.wikipedia.org/wiki/Perceptr%C3%B3n#/media/File:Perceptr%C3%B3n_5_unidades.svg Pero, ¿cuál es el valor inicial de los pesos sinápticos y el umbral?. Esto es algo que se realiza a través de un proceso adaptativo con unos valores iniciales aleatorios y que se irán modificando según obtenga o no la salida deseada en el entrenamiento. Dicha modificación es la que se conoce como Regla de aprendizaje del Perceptrón Simple (Chakraverty, Sahoo, & Mahato, 2019). 3.3.1.2. Perceptrón Multicapa Se puede decir que el Perceptrón multicapa es una generalización del Perceptrón simple y el cual surgió como consecuencia de las limitaciones que
27 tenía a la hora de clasificar conjuntos de datos que no son linealmente separables. En su momento, Minsky y Papert (Multicapa, 1969) fueron capaces de demostrar en el año 1969 que con la combinación de varios Perceptrones simples, usándolos en capas ocultas, podrían solucionar el problema de clasificación para aquellos conjuntos que no son linealmente separables. Sin embargo, se encontraron con el problema de que la regla del perceptrón simple no es posible aplicarla a este problema, al existir dichas capas ocultas que se han comentado. A pesar de esto, la idea de combinar varios Perceptrones simples sirvió de ayuda para los estudios realizados por Rummelhart, Hinton y Williams cuando en 1986 (Rumelhart, Hinton, & Williams, 1986) presentaron una forma de retro-propagación del error que ha cometido la red y de cómo adaptar los pesos sinápticos a través de una regla. Esta regla es la conocida como regla delta o de retro-propagación. La arquitectura de un Perceptrón multicapa (Multicapa, 1969), como su nombre indica, se basa en una disposición de sus neuronas en varios niveles o capas. Esta arquitectura es una de red de alimentación hacia adelante (feedforward) y en la cual se encontrará una capa de entrada con un número, dependiendo de la cantidad de características de nuestro conjunto de datos, otra capa de salida, que serán los distintos tipos a clasificar, y un número determinado de capas intermedias de proceso, que se pueden llamar ocultas, ya que no existe conexión con el exterior. El papel que desempeña la capa oculta o intermedia es la de una proyección de los patrones de entrada en un cubo cuya dimensión viene dada por el número de unidades de la capa oculta. Las unidades de salidas están conectadas sólo con la última capa oculta. Con este tipo de red lo que se pretende es establecer una relación entre un conjunto de entrada y otro de salida, así tenemos la siguiente relación: (x1,x2,x3...xn)∈ Rn ⇢ (y1,y2,y3….ym)∈ Rm. De esta forma se parte de un conjunto p de patrones de entrenamiento donde sabemos que para el patrón de entrada (xk1,xk2,...xkn) le corresponde la salida (yk1, yk2,..ykm) con k =1,2,..p. En la siguiente figura se muestra cómo sería una representación de este tipo de red neuronal:
28 Ilustración 12. Estructura de una red neuronal https://www.aprendemachinelearning.com/aprendizaje-profundo-una-guia-rapida/ Función de red neuronal multicapa El procesamiento que realiza este tipo de red neuronal para poder extraer la salida yi suponiendo una red con una sola capa oculta se encuentra de la siguiente manera: yi= g1(∑ )= g1(∑ ∑ Aquí se tiene que wij es el peso sináptico de la conexión entre la unidad de salida i y la unidad de proceso oculta j. L sería el número de unidades de proceso en la capa oculta; g1 sería la función de transferencia para las unidades de proceso de la capa de salida, las cuales pueden ser la función identidad, la tangente hiperbólica o una función logística; tjr es el peso sináptico que conecta la unidad de proceso j de la capa oculta con la entrada r. Por último, tenemos la función g2 que es la función de transferencia de las unidades de proceso de la capa oculta, las cuales también pueden ser del tipo mencionado previamente para las unidades de proceso de la capa de salida, identidad, tangente hiperbólica y logística. Los pesos sinápticos asociados a cada entrada son también necesarios identificar para el inicio de la red neuronal. 3.4. Aprendizaje automático con scikit-learn Existen numerosos lenguajes de programación que se pueden utilizar en la rama del aprendizaje automático. Entre ellos podemos encontrar Python, el más usado y conocido dentro de la comunidad de las ciencias de los datos. En
29 él existen bibliotecas de fácil uso e intuitivas que pueden ayudar al procesamiento, visualización y manejo de conjuntos de datos, los protagonistas en los algoritmos de aprendizaje automático. Como ejemplo son las librerías NumPy y SciPy, que están disponibles sobre otras capas como Fortran o C, para realizar operaciones vectorizadas de gran rendimiento en arrays multidimensionales, el tipo de estructura de datos en el que se centra este trabajo. Una ventaja que permite el desarrollo en Python es el de poder modularizar el código y por lo tanto puede ser reusado en futuros desarrollos. Existen gran cantidad de bibliotecas disponibles para usar en Python. En el trabajo que concierne se va a basar en aquellas que sirvan de uso para aprendizaje automático. De entre ellas se tomará de referencia a la de Scikitlearn (Pedregosa et al., 2012), una de las bibliotecas de libre uso de aprendizaje automático más utilizadas y populares en el día de hoy para aprendizaje automático. Se podría decir que scikit-learn es como una caja de herramientas orientada a su uso en Python y pensada para ser utilizada para la minería de datos y, lo que comúnmente se conoce como ciencias de los datos, enfocada al aprendizaje automático. La misma librería dispone de una API de la cual se pueden usar los módulos necesarios para importar en el proyecto y realizar las llamadas a los métodos requeridos. En el trabajo que concierne se hará uso de los distintos módulos que dan acceso a los algoritmos que se usarán para aprendizaje automático enfocados en clasificación, además de aquellos que se usarán para la extracción de métricas. La API posee muchas características interesantes, las cuales se usarán para llevar a cabo el proceso de aprendizaje automático y extraer la información necesaria (Buitinck et al., 2013). 3.4.2. Establecer un protocolo de evaluación Una vez conocido el objetivo a perseguir, hay que decidir cómo se va a medir el progreso para perseguir ese objetivo. Es aquí donde entra en juego el término de validación cruzada o también conocido como cross-validation (Arlot
30 & Celisse, 2009; Kohavi, 1995). Es una técnica para evaluar los resultados de un análisis estadístico y poder garantizar que son independientes de la partición entre el conjunto de datos que se utiliza para entrenamiento y el conjunto de prueba. Es utilizado en entornos donde el objetivo es la predicción y se quiere estimar cómo de preciso es el modelo generado. Esta técnica surgió para resolver el problema del método de retención que consiste en dividir en dos subconjuntos los datos con los que contamos, realizar el entrenamiento con uno de ellos que se llama “Conjunto de entrenamiento” y validar el análisis con el otro, llamado “Conjunto de prueba”. Lo normal es dividir el conjunto de datos en un 70% para entrenamiento y un 30% para prueba o también un 80/20, aunque este ratio debe ser considerado dependiendo del tamaño de nuestro conjunto de datos. Ilustración 13. Validación cruzada El problema de esta técnica es que el modelo que se genera solo se ajusta al conjunto de datos de entrenamiento y a partir de esto calcula los valores de salida para el conjunto de datos de prueba. Suele ser muy rápido pero no es del todo fiable porque es algo que depende cómo estén posicionados los datos. Si los datos están ordenados y en ese conjunto de entrenamiento que se ha creado solo hay información 4 clases de 7 posibles, el modelo que va a generar será muy preciso para esas 4, pero para las 3 restantes no tiene información y por lo tanto no sabrá como clasificarlos. Es adecuado que exista una distribución equitativa de cada clase en cada conjunto, para que así pueda entrenar todos los patrones para cada tipo y pueda encontrar un modelo general para todo el conjunto de datos. Es aquí donde la validación cruzada entra en juego.
31 El módulo model_selection del paquete scikit-learn provee de distintos tipos de validación cruzada. Permitirán llevar a cabo esta división del conjunto de datos para proceder a su entrenamiento y posterior testeo para la extracción de las métricas y evaluar el comportamiento que ha tenido cada algoritmo o técnica. En scikit-learn se usará el tipo StratiffiedShuffleSplit que se encarga de conservar el porcentaje de muestras de cada clase para cada uno de los pliegues en los que se divide el conjunto de entrenamiento. 3.5. Aprendizaje automático con TensorFlow 3.5.1. ¿Qué es? TensorFlow (Abadi et al., 2016) es un sistema de aprendizaje automático que funciona en entornos a gran escala y de forma heterogénea. Es una librería de código abierto para cálculo numérico y que usa como forma de programación grafos de flujo de datos. Nace del trabajo de Google Brain, que es un grupo de investigadores e ingenieros dedicados a la Inteligencia Artificial y que en 2011 desarrollaron DistBelief, llamado el predecesor de TensorFlow. En 2017 Google liberó la primera versión de este código con mejoras, como el rendimiento con el uso de GPU´s. El código que Google liberó es como software libre bajo licencia Apache 2 y por lo tanto una comunidad muy extensa está colaborando para mejorarlo e implementar nuevas características. Este sistema de aprendizaje automático es hoy en día más usado de lo que creemos, así por ejemplo se encuentra en las respuestas automáticas que GMAIL ofrece para los correos o por ejemplo la famosa aplicación para traducir Google Translate. El motivo de usar la palabra TensorFlow viene de la principal estructura de datos que conforma esta librería, y que son los “tensores”, y deriva de las operaciones que las redes neuronales realizan sobre arrays multidimensionales de datos. Al estar basado en grafos, los nodos en el grafo representan operaciones matemáticas, y por otro lado, las conexiones del grafo representan los conjuntos de datos multidimensionales, llamados tensores. Un tensor es un conjunto de datos primitivos, suponiendo números flotantes o números enteros,
32 organizados en un array de 1 o N dimensiones, el rango del tensor sería el número de dimensiones en las que se compone la estructura. Estas estructuras de datos son las que se van a usar para hacer que fluyan los datos entre las distintas capas de una red neuronal. Así se realizarán las operaciones necesarias para llevar a cabo el ajuste necesario y entrenar la red para clasificación. 3.5.2. ¿Cómo funciona? TensorFlow usa grafos de flujo de datos para representar la computación, en un estado compartido, y las operaciones que cambian dicho estado. De lo que se encarga es de mapear los nodos de un flujo de datos a través de muchos equipos que están en clúster y dentro de muchos dispositivos para realizar computación, aquí se pueden incluir CPU con multicores, unidades dedicadas exclusivamente a GPU para procesamiento gráfico e incluso dispositivos modificados exclusivamente para funcionar con TensorFlow conocidos como Tensor Processing Units o TPU´s. TensorFlow se encarga de proporcionar esto al programador a través del lenguaje de programación Python. Al fin y al cabo los nodos y los tensores son objetos de Python, y por otro lado, las aplicaciones de TensorFlow son en sí las mismas aplicaciones de Python. Sin embargo, las operaciones matemáticas que requieren estos procesamientos no se realizan en Python. Las bibliotecas a las que se referencian para realizar dichas operaciones matemáticas están escritas en lenguaje C++ de alto rendimiento. Python solo se encarga de dirigir el tráfico entre las distintas piezas y lo que hace es proporcionar la abstracción de programación de alto nivel necesaria para conectarlas. TensorFlow se encarga de usar eficientemente gran cantidad de servidores con habilitación para usar GPU´s para un entrenamiento rápido, y se encarga de ejecutar modelos ya entrenados y ajustados para que se ejecuten en gran cantidad de servidores. Los nodos en el grafo los llama “ops”, el cual puede tomar cero o más tensores y que desempeña una operación computacional que da lugar a cero o más tensores.
33 Las aplicaciones que TensorFlow permite son varias y es que se puede ejecutar en la mayoría de destinos que necesitemos conveniente, ya sea una máquina local, un clúster en la nube, un dispositivo con iOS o Android e incluso cualquier CPU o GPU. Los modelos resultantes que creemos podremos guardarlos y ser importados en cualquier dispositivo donde se usarán para realizar predicciones. El beneficio que ofrece para el aprendizaje automático es la posibilidad de abstracción. En vez de tener que llevar a cabo la implementación de los algoritmos o saber cómo debe conectar el flujo de los datos de una función en otra, simplemente tiene que centrarse en la lógica de la aplicación. 3.5.3. Uso de la librería Keras Para implementar una red neuronal en TensorFlow se va a utilizar la librería para aprendizaje profundo (deep learning) Keras 5 . Esta librería es una API para redes neuronales y que permite ejecutarse en varias herramientas de aprendizaje automático, una de ellas es TensorFlow, que es nuestro objetivo. Como principales características podemos destacar: Facilidad de uso: está pensado para que su uso sea lo más sencillo posible, con el mínimo de acciones requeridas por el usuario y con una API simple y consistente. Fácilmente extensible: se pueden añadir nuevos módulos como funciones y clases que nos permite acceder a más ejemplos de modelos. Funciona con Python: ésta es una característica principal ya que el trabajo se centra en el uso de las distintas librerías basadas en este lenguaje de programación. 3.5.5. Uso de Google Colaboratory Colaboratory es una herramienta de investigación para la educación y la exploración del aprendizaje automático, en un entorno de bloc de notas de Jupyter Notebook y sin necesidad de configuración, gratuito debido a que está 5 https://keras.io/
34 pensado como proyecto de investigación. Permite escribir nuestro código, guardarlo y compartirlo como si fuera un documento de Google Drive. El motivo de usar este entorno es por el uso de la potencia de cómputo que puede dar un entorno con capacidad de uso de GPU (nVidia Tesla K80 6 ). El código se ejecuta en una máquina virtual exclusiva para nuestra cuenta y que se recicla cuando se ha dejado de usar durante un tiempo prolongado, además de una vida útil máxima que determina el sistema, 12 horas en uso y 90 minutos si está ocioso. Este entorno en la nube permite usar estas máquinas de forma totalmente gratuita y nos ayudará a sacar mejor partido del procesamiento para TensorFlow para la multiplicación de matrices en redes neuronales. Al no necesitar de configuración tendremos un entorno listo y con las librerías necesarias sin tener que perder tiempo en hacerlo nosotros mismos en nuestra máquina, con los problemas de configuración e incompatibilidades que podamos encontrarnos. 3.6. Métricas a extraer Es necesario saber controlar algo, que debe ser observable, y para conseguir éxito necesitamos también saber qué es lo que consideramos éxito. De los algoritmos de clasificación se pueden extraer métricas que nos ayudarán a saber en qué cantidad ese porcentaje lo hemos alcanzado, para ello se usan métricas de evaluación como precisión, exactitud o recuperación, aquellas que nos dicen como de buenas son las predicciones del algoritmo entrenado. Las métricas son una parte fundamental de este trabajo, tanto para la librería de scikit-learn como para TensoFlow se podrán hacer uso de las mismas y se invocarán desde el mismo módulo (sklearn.metrics) que el paquete scikit-learn permite para ello. Para entender las distintas métricas que se van a plantear a continuación es necesario entender previamente de donde se extraen las mismas. Para ello se procede a explicar lo que es la matriz de confusión 6 https://www.nvidia.com/es-es/data-center/tesla-k80/
41 datos con el correspondiente método pd.read_csv. Posteriormente se divide el conjunto en dos subconjuntos, uno con todos los atributos y otro con las etiquetas que le corresponde a cada uno. Así está definido el siguiente método: def preprocess(dataset): labels = dataset.Cover_Type.values dataset= dataset.drop(['Cover_Type'], axis=1) return dataset, labels Asi, la llamada a este método desde el programa principal quedaría de la siguiente forma: train = pd.read_csv('trees.csv') 4. Validación cruzada para poder evaluar: Como se indicó en el Capítulo 4, es necesario poder medir el progreso de cómo se consigue el objetivo con las métricas que se quieren extraer, algo que la validación cruzada ayuda a ello. Así se realiza en los siguientes pasos en el programa principal: o Se define el tipo de cross validation que se quiere hacer donde se indica el número de pliegues (10) y cuanta cantidad de datos se va a usar para el testeo, en este caso un 30% (test_size=0.3), y por lo tanto el 70% se usará para entrenamiento: sss = StratifiedShuffleSplit(10, test_size=0.3,random_state=0) ○ Se divide el conjunto de datos en el siguiente código: for train_index, test_index in sss.split(X, y): X_train, X_test=X.values[train_index], X.values[test_index] y_train, y_test = y[train_index], y[test_index] Donde se tiene en X_train el conjunto de entrenamiento con los atributos, X_test el conjunto de testeo con sus atributos, y_train las etiquetas correspondientes al conjunto de entrenamiento y por último en la variable y_test están las etiquetas correspondientes al conjunto de testeo. Todas estas variables y sus datos se utilizarán a posteriori para, por un lado entrenar y por otro evaluar con el conjunto de test. Debido a que los datos no están en la misma escala, se ha definido un método para estandarizar los 10 primeros atributos, ya
42 que los restantes solo toman valores binarios, 0 ó 1. Así se realiza un entrenamiento sin estandarizarlos y posteriormente estandarizados, para ver cómo afecta al rendimiento de los algoritmos seleccionados. Esto se realiza en el método standardize (train) 5. Evaluación y predicción: Esta es otra de las fases que se estudió en el Capítulo 2, y fundamental para poder realizar la evaluación de cada algoritmo, pues previamente hay que entrenarlos, y así consigan tener un modelo de como los datos siguen un patrón. Para esto se ha definido una función que se invocará desde el programa principal y facilitar el procesamiento de los datos. Desde la misma se entrenan los algoritmos que se pasan por argumento (lista de algoritmos que queremos entrenar), se extraen las métricas, además del tiempo empleado para entrenar, y se almacena todo en una estructura de datos tipo tabla, que se utilizará para guardar en formato CSV, la cual servirá para posteriormente mostrar las gráficas que ayudarán a visualizar las métricas obtenidas. El método para el entrenamiento de los algoritmos es el siguiente: def compare_classifiers(classifiers, X_train, y_train, X_test, y_test, conf_matrix=False): Donde se pasa en el argumento classifiers una lista con los clasificadores que se quieren entrenar y evaluar. Se irá iterando para entrenar y evaluar con el conjunto de prueba para extraer las métricas. Para ello, primero se ha importado: from sklearn.neural_network import MLPClassifier Y se ha instanciado definiendo además sus hiper-parámetros en las siguientes líneas: MLPClassifier(warm_start=False, shuffle=True, nesterovs_momentum=True, hidden_layer_sizes=(1024, 512, 256, 128), validation_fraction=0.333, solver = 'adam', learning_rate='constant', max_iter=162, batch_size=200, random_state=1, momentum=0.11593, tol=0.081977,
43 alpha=0.01, activation='relu', early_stopping=False) En el script existen instanciaciones de otras técnicas y algoritmos que también se entrenarán y que se usarán para tomar referencias en las gráficas comparativas. 6. Visualización y análisis de los datos: Para la última fase, la de visualización de los datos y análisis de los mismos, se ha desarrollado un método que permite mostrar los datos en las gráficas que se han seleccionado desde el paquete Seaborn. Así, desde el programa principal, se importa primero la tabla con las métricas que se guardaron en formato CSV en el paso previo, para pasarla como argumento al método de visualización de gráficas. Este método es el siguiente: def show_graphs(table) El cual se llamará desde el programa principal de la siguiente forma: graph = pd.read_csv('multilayer.csv') show_graphs(graph) En el archivo „multilayer.csv‟ se tiene la información de cada algoritmo que hemos entrenado y del que se han sacado sus métricas. Los otros algoritmos seleccionados para usar de la librería scikit-learn y que servirán para análisis y comparación son: Perceptrón Simple: es el tipo en el que se basa el perceptrón multicapa para simular una red neuronal. (Rosenblatt, 1958) K Vecinos Cercanos (KNN) : es uno de los más conocidos para el reconocimiento de patrones y uno de los más fáciles de implementar. Apenas usa datos para entrenamiento ya que la clasificación se basa en la búsqueda de características similares. (O. Sutton, 2012) Arboles de decisión: sus reglas para clasificación son fácilmente comprensibles para el ser humano y también son bastante eficientes. Se podrá comprobar una vez obtengamos las métricas. (Cha & Tappert, 2009)
44 Conjunto: uso de la combinación de varios clasificadores para construir uno más robusto y preciso. (Geurts, Ernst, & Wehenkel, 2006) TensorFlow El código está disponible para su descarga en el repositorio público en Github. El enlace para acceder a él es el siguiente: https://github.com/juzaru18/forest_cover_TensorFlow Para TensorFlow se ha realizado un proceso parecido para el procesamiento de los datos y entrenamiento de los modelos que vamos a usar con esta herramienta, en este caso es el de dar uso a la librería Keras para crear un modelo de red neuronal, y posteriormente se ajuste al conjunto de datos que hemos seleccionado. Los pasos tomados en el código realizado en Google Colaboratory haciendo uso de estas librerías refleja lo siguiente: 1. Importación de las librerías correspondientes: Importamos las librerías que vamos a usar en el programa, pandas, scicikt-learn, numpy…etc, para poder utilizarlas en nuestro programa. 2. Importación de los datos: Importamos los datos directamente desde el repositorio. Esto se realiza en la siguiente línea: !wget https://archive.ics.uci.edu/ml/machine-learningdatabases/covtype/covtype.data.gz !gzip -d "covtype.data.gz" 3. Preparación de los datos: En esta parte se realiza el proceso para la creación del conjunto de datos que se va a utilizar. o Para ello se importa la información en una estructura de datos pandas: df = pd.read_csv("covtype.data", header=None) o Se definen las constantes necesarias, con el número de clases que vamos a clasificar, el tamaño del conjunto de entrenamiento, el de testeo y por último el de validación, que forman parte de la
45 validación cruzada que se explicó en el Capítulo 3 : N_CLASSES = 7 TRAIN_SIZE = int(0.7 * df.shape[0]) TEST_SIZE = int(0.15 * df.shape[0]) VALIDATION_SIZE = int(0.15 * df.shape[0]) o Se estandarizan los valores numéricos de los primeros 10 atributos, ya que los siguientes son todos de tipo 0 ó 1 y no es necesario estandarizarlos. Se la función que hemos definido standardize y que hemos usado también en la parte de scikitlearn: features = standardize(df.iloc[:, 0:54]) labels = df.iloc[:, 54:].values 4. Validación cruzada para poder evaluar: Debido a que TensorFlow no posee métodos para la validación cruzada, es algo que se programará en el código que se está realizando para esta parte. Así se tiene: o Se definen los distintos conjuntos que se usarán para validación cruzada: X_train, Y_train = features[:TRAIN_SIZE], y_one_hot[:TRAIN_SIZE] X_test, Y_test = features[TRAIN_SIZE: TRAIN_SIZE + TEST_SIZE], y_one_hot[TRAIN_SIZE: TRAIN_SIZE + TEST_SIZE] X_validation, Y_validation = features[TRAIN_SIZE + TEST_SIZE : ], y_one_hot[TRAIN_SIZE + TEST_SIZE : ] o Se crean los tensores necesarios para su entrenamiento en TensorFlow: dataset_train = tf.data.Dataset.from_tensor_slices((X_train, Y_train)).batch(256).shuffle(buffer_size=1000) dataset_test = tf.data.Dataset.from_tensor_slices((X_test, Y_test)).batch(256) dataset_validation = tf.data.Dataset.from_tensor_slices((X_validation, Y_validation)).batch(256) 5. Evaluación y predicción: Se selecciona el algoritmo, en este caso será el uso de keras para TensorFlow y que nos encargamos de definir en las siguientes líneas: Se define el modelo, con : model = tf.keras.Sequential([ layers.Dense(1024, activation = 'relu'),
46 layers.Dense(512, activation = 'relu'), layers.Dense(256, activation = 'relu'), layers.Dense(128, activation = 'relu'), layers.Dense(N_CLASSES, activation = 'softmax'), ]) Se compila: model.compile(optimizer=tf.train.AdamOptimizer(0.001), loss='categorical_crossentropy', metrics=['accuracy']) Se entrena el modelo: model.fit(dataset_train, epochs = 10, validation_data = dataset_validation) Una vez se tiene el modelo, se predicen los datos para el conjunto de prueba con el método predict, y así extraer las métricas, tal y como se hizo para la librería scikit-learn, y a partir de esas predicciones se pueden extraer las métricas que hemos comentado en el Capítulo 3, como por ejemplo la recuperación: y_pred = model.predict(dataset_test) rec = recall_score(Y_test, y_pred_one_hot) 6. Visualización y análisis: Para esto, una vez extraído los mismos datos que para scikit-learn, se guardarán todos juntos en un mismo archivo CSV para importarlos y proceder a la visualización de los mismos. Esto es algo que se hace conjuntamente con los datos recopilados de scikitlearn, con todos los datos recopilados en un mismo archivo.
47 5 Métricas, comparativa y análisis En este capítulo se mostrarán las métricas que se han obtenido de cada algoritmo y donde se procederá a una evaluación de los mismos indicando, según dichas métricas, cuál de ellos ha tenido mejor rendimiento para el conjunto de datos seleccionado. Se mostrará una gráfica de cada una de las métricas que se ha elegido y que se van a comparar, estas son: exactitud, recuperación, precisión, valor F, log loss y tiempo para entrenamiento. Los valores se ordenarán según el objetivo buscado, así por ejemplo, para la exactitud es mejor cuanto más cerca del 100% esté, mientras que para log loss lo mejor es que esté más cerca del 0. Se mostrará en primer resultado aquel algoritmo que ha conseguido mejor resultado en cada una de las métricas. Como ya se indicó en el Capítulo 2, los datos se obtienen tal y como fueron recogidos, en bruto y donde cada atributo está en una escala distinta. Por ello se va a tener en cuenta la estandarización de los 10 primeros atributos para así conseguir que estén en el rango [-1,1], los restantes atributos toman valores 0 ó 1, por lo que no son necesarios transformarlos. Esto es algo importante a tener en cuenta para muchos algoritmos ya que se consigue darle la misma importancia a todos los atributos y se evita que el algoritmo desvíe en la búsqueda del modelo hacia atributos que tienen más peso por rangos de
48 valores más dispares. Se comprobará que ésta estandarización afecta, tanto para mejor como para peor, a los algoritmos que se estudian, y es algo que se verá en las gráficas que se muestran a continuación. Previamente, se mostrará en una tabla los datos obtenidos de cada algoritmo y donde se encontrarán las siguientes columnas, tal y como se guardaron los datos en formato CSV, para su posterior tratamiento con la librería Seaborn, y que representan las distintas métricas que hemos extraído para evaluar cada uno de los algoritmos: Clasificador, Ex (Exactitud), Prec (Precisión), Rec (Recuperación), F1 (Valor F), LL (Log Loss), Te(Tiempo entrenamiento). A la hora de saber qué clasificador ha rendido mejor es necesario tener en cuenta varias cosas, por ejemplo, si los datos con los que entrenamos no están balanceados con una representación de todas las clases, no tendremos un valor real de exactitud. Es por ello que la validación cruzada nos va a ayudar a tener dicha representación en la mejor medida posible. Otra métrica a tener en cuenta es la de Log Loss que se encarga de penalizar aquellos fallos que el algoritmo ha cometido para un conjunto de prueba, lo que buscamos es un valor lo más cercano al 0, que indica un menor número de errores. La matriz de confusión es otra métrica que ayuda a saber cómo ha clasificado el algoritmo para un conjunto de prueba y nos da una información relevante para así saber en cuales clases se equivoca más, algo que servirá para ver a nivel gráfico en una matriz el número de ejemplos que ha clasificado para cada clase. Estas matrices se mostrarán para algunos algoritmos y así se pueda hacer una comparación entre el mejor y el peor. El tiempo que tarda el algoritmo en entrenar para el conjunto de entrenamiento es algo que también se verá a continuación, donde se comprobará como el uso de TensorFlow con aceleración por GPU consigue mejorar para entrenar y conseguir el modelo.
49 5.1. Valores obtenidos Tras realizar el entrenamiento de los algoritmos y su evaluación con el conjunto de prueba se han obtenido los siguientes valores: Clasificador Ex(%) Prec(%) Rec(%) Valor F(%) LL Te KNN 96,72 96,71 96,72 96,71 0,13 5,87 ExtraT(std) 93,96 93,96 93,96 93,96 0,26 15,79 TF(delta) 93,44 93,43 93,44 93,73 2,27 67,95 ExtraT 93,63 93,62 93,63 93,60 0,27 16,15 TF(ada) 93,10 93,08 93,10 93,35 2,38 66,67 DecisionT(std) 93,19 93,19 93,19 93,19 2,35 5,65 DecisionT 93,14 93,15 93,14 93,15 2,37 7,47 TF(rms) 92,90 92,88 92,90 93,11 2,45 68,52 KNN(std) 93,00 92,98 93,00 92,98 0,43 6,09 TF(sgd) 92,17 92,19 92,17 92,59 2,70 66,40 MLP(std) 91,23 91,20 91,23 91,20 0,22 1052,17 TF(adam) 89,36 89,36 89,36 89,55 3,67 69,84 MLP 75,67 77,70 75,67 74,26 0,55 1270,74 Perceptron(std) 57,45 58,32 57,45 54,74 8,81 8,37 Perceptron 49,26 50,58 49,26 33,34 14,40 11,48 TF(adamax) 36,57 13,38 36,57 19,44 21,91 69,63 TF(nadam) 36,57 13,38 36,57 19,44 21,91 85,44 En la anterior tabla se muestran los datos obtenidos de las métricas que se han comentado previamente en el Capítulo 3. En ella se han incluido todos aquellos que han sido objeto de observación para este trabajo. Así aquellos que son precedidos con “TF” es para indicar donde se ha usado la librería de TensorFlow y con cada uno de los optimizadores que se han utilizado para comparar, con los parámetros por defecto. Estos optimizadores: Optimizador SGD : optimizador Stochastic Gradient Descent (R. S. Sutton & Barto, 2015). Optimizador RMS: optimizador RMSprop, el cual divide el gradiente a través de una media de su magnitud reciente. Optimizador Adagrad Optimizador Adadelta: una extensión más robusta de Adagrad Optimizador Adam Optimizador Adamax Optimizador Nadam(Dozat, n.d.)
50 El resto de algoritmos que se encuentran son los que se han instanciado usando la librería de scikit-learn. Se indican los valores obtenidos con los datos sin estandarizar y estandarizados, aquellos que tienen añadido “std”, para comprobar cómo afecta. La tabla ha sido ordenada tomando como referencia el valor F(%) ya que se basa en la media ponderada entre la precisión y la recuperación, dos valores que también se tienen en cuenta. Se puede comprobar como el algoritmo KNN es el que ha obtenido mejor resultado con casi un 97% en valor F en el conjunto de datos de testeo, algo bastante bueno y que da bastante fiabilidad a la hora de clasificar. Si atendemos a la estandarización de los datos, se puede observar cómo hay algunos algoritmos que mejoran y otros no. Así por ejemplo para KNN con los datos sin estandarizar se obtiene una Exactitud de un 96,72% mientras que si se estandarizan baja al 93%. Sin embargo, si se toma de referencia el Perceptrón multicapa (MLP) se puede observar como con los datos estandarizados mejora un 15% en dicha exactitud, algo a tener en cuenta si tomamos un conjunto de datos mucho más grande.
57 Preparación de los datos. Se realizó un estudio para saber cuál es la distribución de los datos, y cuál debían tener, algo que se implementó en los programas desarrollados tanto para scikit-learn como para TensorFlow con la correspondiente normalización de los mismos para que estuvieran en la misma escala. Además se estudió la forma de distribuir adecuadamente los datos de entrenamiento y de testeo para que la distribución de todas las clases fuera la más equitativa posible, y de esta forma los algoritmos aprendieran un modelo general para todo el conjunto de datos, algo que se consiguió con el uso de cross-validation y que en TensorFlow se solucionó con una mezcla de los mismos antes de proceder al particionado. Estudio y evaluación de los algoritmos en scikit-learn. Se desarrolló un programa para llevar a cabo el proceso de tratamiento de los datos, uso de cross-validation, entrenamiento de varios algoritmos (con estudio especial para redes neuronales), extracción de métricas y guardado de las mismas en formato CSV para su posterior importación y visualización en gráficas. Estudio y evaluación de TensorFlow, su uso con keras y optimizadores. Se desarrolló un programa para entrenar y clasificar el mismo conjunto de datos. En esta ocasión haciendo uso de la librería TensorFlow, donde se hizo uso exclusivo de rendimiento gráfico GPU con el entorno de desarrollo Google Colaboratory. Éste permitió extraer métricas para distintos optimizadores que iteran y ajustan los pesos para una red neuronal creada para clasificar con la librería keras. Se observó que el tiempo de cómputo es mucho menor que el uso de redes neuronales en sciki-learn, donde solo se usa computación CPU, de propósito más general y sin optimización para el cálculo matricial en el que se basan las redes neuronales. Extracción de métricas y visualización de gráficas. Una vez realizado el entrenamiento de los algoritmos tanto en scikit-learn como TensorFlow, se realizó una importación de los datos desde el archivo CSV correspondiente para así mostrar las métricas que se comentaron en el Capítulo 3. Se mostraron las gráficas correspondientes y se analizaron los resultados obtenidos en cada una de ellas.
58 Valoración personal Durante el desarrollo de este trabajo se ha podido comprobar el funcionamiento del aprendizaje automático en dos librerías que hacen uso de esta rama de la inteligencia artificial y cómo se extraen distintas métricas dependiendo de la técnica que se use. Dependiendo de cómo se “alimente” al algoritmo a la hora de entrenarlo, por ejemplo si los datos están normalizados en escala o no, se ha podido comprobar que el rendimiento cambia. Se ha podido comprobar como la elección de un algoritmo u otro puede dar lugar a diferente rendimiento. Se ha observado que las redes neuronales tienen un potencial importante y que, adecuadamente implementadas, pueden usarse para clasificar conjuntos de datos grandes. Así se pueden tomar como referencia a la hora de tomar decisiones o de predecir datos, así encontramos por ejemplo su uso para la predicción de la quiebra bancaria a través del uso de redes neuronales (Serrano Cinca, 1993), o por ejemplo para la predicción del tráfico (Torres Alvarez, Hernández, & Pedraza, 2011). Si contamos con conjuntos de datos muy grandes, el tiempo de computo necesario para que la red clasifique es importante, y por ello la opción de su implementación usando TensorFlow ayudará a conseguir el modelo 10 veces más rápido que si se implementa la misma red neuronal con la librería scikit-learn pero con cómputo en CPU, algo considerable a tener en cuenta. El aprendizaje automático está muy presente en nuestros días y se usa en muchos campos. En la era digital en la que vivimos estamos siendo clasificados continuamente. Un ejemplo podemos encontrarlo en la clasificación que los bancos hacen del perfil de cada cliente para así saber cómo enfocar las campañas de marketing que les ayudarán a mejor éxito en ellas, así vemos un ejemplo en la competición que el grupo Banco Santander lanzó en el año 2018 en el portal Kaggle 7 . Este ejemplo también se ha podido ver con el escándalo de Cambridge Analytica 8 donde hace uso de aprendizaje 7 https://www.kaggle.com/c/santander-value-prediction-challenge/overview 8 http://theconversation.com/how-cambridge-analyticas-facebook-targeting-model-reallyworked-according-to-the-person-who-built-it-94078
59 automático para clasificar la información recopilada a través de encuestas en distintas redes sociales y que ayudan a direccionar una campaña política. Como resumen, no podemos dar de lado este tipo de inteligencia artificial pues está más presente de lo que pensamos y que forma parte de nuestras vidas. Adecuadamente usada y adaptada a nuestras necesidades el aprendizaje automático será capaz de facilitar ciertas tareas que ayuden a mejorar nuestro día a día. Futuras mejoras Las posibilidades que ofrece el aprendizaje automático son inmensas. Siguiendo la línea de este trabajo, enfocado en redes neuronales, a continuación se describen algunas posibilidades que su continuación nos ofrece. En primer lugar, una de las posibilidades es la de comparar el comportamiento y rendimiento con los competidores de TensorFlow, como pueden ser Pytorch 9 , CNTK (Microsoft Cognitive Toolkit) 10 o Apache MxNET 11 . Otra opción sería la de comprobar el funcionamiento y rendimiento de las posibilidades que ofrecen las grandes compañías en computación para aprendizaje automático, como pueden ser Amazon AWS o Microsoft Azure. Debido a que TensorFlow está pensado en procesamiento gráfico, otra de las posibilidades de mejora sería el uso de la librería para saber el comportamiento que tiene para clasificación de imágenes, algo muy demandado hoy en día por ejemplo para la investigación e implantación del coche autónomo (Bojarski et al., 2017). Otra posibilidad sería la de realizar una búsqueda exhaustiva de los hiperparámetros de los optimizadores en TensorFlow, así conseguir un mejor ajuste y mayor confianza en el clasificador, algo que se puede extrapolar a otro tipo de problemas de clasificación y conjuntos de datos disponibles. 9 https://pytorch.org/ 10 https://github.com/microsoft/CNTK 11 https://mxnet.apache.org/
60 Bibliografía Abadi, M., Barham, P., Chen, J., Chen, Z., Davis, A., Dean, J., … Zheng, X. (2016). TensorFlow : A System for Large-Scale Machine Learning This paper is included in the Proceedings of the TensorFlow : A system for large-scale machine learning. Anuradha, B., & Reddy, V. C. V. (2008). ANN FOR CLASSIFICATION OF CARDIAC ARRHYTHMIAS, 3(3), 1–6. Arlot, S., & Celisse, A. (2009). A survey of cross-validation procedures for model selection, 4, 40–79. https://doi.org/10.1214/09-SS054 Awad, W. A., & ELseuofi, S. M. (2011). Machine Learning Methods for Spam EMail. International Journal of Computer Science & Information Technology, 3(1), 173–184. Balakrishnan, D., & Puthusserypady, S. (2016). Multilayer perceptrons for the classification of brain computer interface data. Proceedings of the IEEE 31st Annual Northeast Bioengineering Conference, 2005., (November), 118–119. https://doi.org/10.1109/NEBC.2005.1431953 Blackard Jock, A., Dean Denis, J., & Anderson, C. (1998). Cover Type repository. Retrieved October 20, 2017, from https://archive.ics.uci.edu/ml/datasets/covertype Bojarski, M., York, N., Yeres, P., Firner, B., Muller, U., Choromanaska, A., & Jackel, L. (2017). Explaining How a Deep Neural Network Trained with End-to-End Learning Steers a Car, 1–8. Buitinck, L., Louppe, G., Blondel, M., Pedregosa, F., Mueller, A., Grisel, O., … Varoquaux, G. (2013). API design for machine learning software: experiences from the scikit-learn project, 1–15. Retrieved from http://arxiv.org/abs/1309.0238 Cha, S., & Tappert, C. (2009). A Genetic Algorithm for Constructing Compact Binary Decision Trees, 1, 1–13. Chakraverty, S., Sahoo, D. M., & Mahato, N. R. (2019). Perceptron Learning Rule. In: Concepts of Soft Computing. Singapore. Chen, W. Y., Chen, S. H., & Lin, C. J. (1996). A speech recognition method based on the sequential multi-layer perceptrons. Neural Networks, 9(4), 655–669. https://doi.org/10.1016/0893-6080(95)00140-9 Cruz, J. A., & Wishart, D. S. (2006). Applications of machine learning in cancer prediction and prognosis. Cancer Informatics, 2, 59–77. https://doi.org/10.1177/117693510600200030 Cuenca, D. (2017). Filtrado de SPAM en SMS mediante algoritmos de aprendizaje automático, 109–117. Daniel Smilkov, Shan Carter, A. K. (2017). Simulation of Neural Network using Tensorflow library. Dayan, P. (2009). Unsupervised learning. The MIT Encyclopedia of the Cognitive Sciences, 1–7. https://doi.org/10.1007/BF00993379 Dozat, T. (n.d.). Incorporating Nesterov Momentum into Adam. Figini, S., Pavia, U., Felice, V. S., Pavia, I.-, & Maggi, M. (2014). Performance of credit risk prediction models via proper loss functions, 64(January). Geurts, P., Ernst, D., & Wehenkel, L. (2006). Extremely randomized trees, (June 2005). https://doi.org/10.1007/s10994-006-6226-1 Ghahramani, Z. (2004). Unsupervised Learning BT - Advanced Lectures on Machine Learning. Advanced Lectures on Machine Learning, 3176(Chapter
61 5), 72–112. https://doi.org/10.1007/978-3-540-28650-9_5 Hormozi, H., Hormozi, E., & Nohooji, H. R. (2012). The Classification of the Applicable Machine Learning Methods in Robot Manipulators. International Journal of Machine Learning and Computing, 2(5), 560–563. https://doi.org/10.7763/IJMLC.2012.V2.189 Kohavi, R. (1995). A Study of Cross-Validation and Bootstrap for Accuracy Estimation and Model Selection. Appears in the International Joint Conference on Articial Intelligence (IJCAI), 5, 1–7. https://doi.org/10.1067/mod.2000.109031 Kotsiantis, S. B. (2007). Supervised Machine Learning: A Review of Classification Techniques. Informatica, 31, 249–268. https://doi.org/10.1115/1.1559160 Kumar, S. S., & Duraipandian, N. (2013). Artificial Neural Network Based Method for Classification of Gene Expression Data of Human Diseases along with Privacy Preserving Email : [email protected], 4(2), 722– 730. McCulloch, W. S., & Pitts, W. (1943). A Logical Calculus of the Idea Immanent in Nervous Activity. Bulletin of Mathematical Biophysics, 5, 115–133. https://doi.org/10.1007/BF02478259 Multicapa, P. (1969). Perceptron Multicapa, 1–49. Retrieved from http://bibing.us.es/proyectos/abreproy/12166/fichero/Volumen+1+- +Memoria+descriptiva+del+proyecto%252F3+-+Perceptron+multicapa.pdf Payá, Y. J., & Villalón, A. (2015). Grado en Matemática Computacional Redes neuronales . Un modelo de clasificación para la detección de dominios DNS maliciosos . Pedregosa, F., Varoquaux, G., Gramfort, A., Michel, V., Thirion, B., Grisel, O., … Duchesnay, É. (2012). Scikit-learn: Machine Learning in Python. Journal of Machine Learning Research, 12, 2825–2830. https://doi.org/10.1007/s13398-014-0173-7.2 PortalTic. (2017). Cada día se generan 2.500 millones de GB de datos: IBM crea una plataforma para que las empresas los aprovechen. EuropaPress. Retrieved from https://www.europapress.es/portaltic/internet/noticia-cadadia-generan-2500-millones-gb-datos-ibm-crea-plataforma-empresasaprovechen-20170323162319.html Raschka, S. (2015). Python Machine Learning. Bangladesh Journal of Plant Taxonomy (Vol. 22). https://doi.org/10.1007/s13398-014-0173-7.2 Rifkin, R., Klautau, A., & Org, K. (2004). In Defense of One-Vs-All Classification. Journal of Machine Learning Research, 5, 101–141. https://doi.org/10.1007/BF00718004 Rosenblatt, F. (1958). The perceptron: A probabilistic model for information storage and organization in …. Psychological Review, 65(6), 386–408. https://doi.org/10.1037/h0042519 Rumelhart, D. E., Hinton, G. E., & Williams, R. J. (1986). Learning representations by back-propagating errors. Nature, 323, 533. Retrieved from http://dx.doi.org/10.1038/323533a0 Santra, a. K., & Christy, C. J. (2012). Genetic Algorithm and Confusion Matrix for Document Clustering. International Journal of Computer Science, 9(1), 322–328. Retrieved from http://ijcsi.org/papers/IJCSI-9-1-2-322-328.pdf Schapire, R. (2008). Machine Learning Algorithms for Classification, 6. https://doi.org/10.13140/RG.2.1.2044.4003 Serrano Cinca, C. (1993). Predicción de la quiebra bancaria a través del uso de
62 redes neuronales, XXIII, 153–176. Sutton, O. (2012). Introduction to k Nearest Neighbour Classification and Condensed Nearest Neighbour Data Reduction. Introduction to k Nearest Neighbour Classification, 1–10. Sutton, R. S., & Barto, A. G. (2015). Reinforcement Learning : An Introduction. Torres Alvarez, N. S., Hernández, C., & Pedraza, L. F. (2011). Redes neuronales y predicción de tráfico, V(29), 90–97.