Técnicas de IA tema2.pdf
Document Details
Uploaded by Itan
Universidad Internacional de La Rioja
Tags
Full Transcript
Tema 2 Técnicas de Inteligencia Artificial Python para la implementación de técnicas de inteligencia artificial Índice Esquema...
Tema 2 Técnicas de Inteligencia Artificial Python para la implementación de técnicas de inteligencia artificial Índice Esquema 3 Ideas clave 4 2.1. ¿Cómo estudiar este tema? 4 2.2. Introducción 6 2.3. El lenguaje Python: conceptos básicos e instalación 8 2.4. La sintaxis de Python 11 2.5. Listas, tuplas, conjuntos y diccionarios 23 2.6. Librerías útiles para el análisis de datos 29 2.7. La librería NumPy para el manejo de datos 47 © Universidad Internacional de La Rioja (UNIR) 2.8. Importación de datos 56 2.9. Introducción a Machine Learning con librerías en Python 62 2.10. Referencias bibliográficas 69 A fondo 71 Test 75 Esquema © Universidad Internacional de La Rioja (UNIR) Técnicas de Inteligencia Artificial 3 Tema 2. Esquema Ideas clave 2.1. ¿Cómo estudiar este tema? Para estudiar este tema deberás leer las Ideas clave que se presentan a continuación. Puedes completar el estudio visualizando la lección magistral, revisando referencias y bibliografía, así como accediendo a los recursos adicionales que se facilitan. Al inicio de este tema se hace una pequeña introducción en relación con los diferentes lenguajes empleados en el ámbito de la inteligencia artificial y el aprendizaje automatizado (machine learning) y el aprendizaje profundo (deep learning) y por qué se elige Python como lenguaje de trabajo en esta asignatura. A continuación, se describen los conceptos básicos del lenguaje Python, cómo se clasifica como lenguaje de programación, cómo instalar el intérprete y el gestor de paquetes en una computadora y cómo comenzar a trabajar en código en Python. Tras ello, se describe la sintaxis del lenguaje Python en cuanto a los componentes del lenguaje imprescindibles para trabajar en aplicaciones de inteligencia artificial y machine learning. Esto incluye una descripción de su sintaxis, variables, tipos de datos, números, cadenas y operadores. A continuación, se describe con mayor detalle las colecciones de datos existentes en Python de forma incorporada y que nos permiten trabajar con conjuntos de datos (datasets) a la hora de aplicar métodos inteligentes. Esta sección incluye, por tanto, © Universidad Internacional de La Rioja (UNIR) una descripción de las listas, las tuplas, los conjuntos y los diccionarios. En este sentido, quedan fuera por motivos de planificación del estudio de este tema conceptos intermedios y avanzados del lenguaje Python como el control de flujo, las funciones, los objetos y las excepciones, entre otras cuestiones, y que pueden ser Técnicas de Inteligencia Artificial 4 Tema 2. Ideas clave consultados por el alumno recurriendo a los materiales adicionales referidos al final del tema. Si bien su conocimiento es recomendado, no es imprescindible a la hora de aplicar técnicas de machine learning, cuya programación sigue un proceso lineal. En este tema se tratan las principales librerías para el tratamiento de datos en Python, bien sea para el tratamiento básico de los datos (NumPy, Pandas, Theano), bien sea para aplicar técnicas de aprendizaje automatizado clásico (SciPy, Scikit- learn), bien para aplicar redes neuronales y técnicas deep learning (Keras, TensorFlow, Pytorch) o bien para la representación de los datos (Matplotlib). Tras dicha introducción, se describen las funcionalidades básicas de la librería NumPy, como librería auxiliar para trabajar con arrays. Además, se describen las distintas formas de importar datasets empleando Python y sus librerías (NumPy, Pandas) y se finalizan con unos conceptos básicos de machine learning clásico (regresión) empleando NumPy, SciPy, Scikit-learn y Matplotlib. Al finalizar el estudio de este tema serás capaz de: Manejar la sintaxis básica de Python para emplearlo como lenguaje de análisis de datos y como base para aplicar y probar técnicas de machine learning en el resto de la asignatura. Conocer y manejar las colecciones de datos incorporadas en Python para su uso en la aplicación de técnicas de inteligencia artificial. Conocer y recurrir a las librerías más importantes sobre Python para el manejo de datos, el machine learning clásico, las redes neuronales y el deep learning, así como la representación de datos. Importar datasets desde fuentes locales, o fuentes externas open data, © Universidad Internacional de La Rioja (UNIR) empleando librerías sobre Python apropiadas para ello. Aplicar algoritmos básicos de regresión empleando Python y las librerías apropiadas. Técnicas de Inteligencia Artificial 5 Tema 2. Ideas clave Asimismo, a lo largo de todos y cada uno de los siguientes temas, se hará uso de las librerías descritas para aplicar y probar los diferentes métodos de inteligencia artificial, aprendidos en cada uno de dichos temas. Para ello, se introducirá en cada caso al alumno a los conceptos básicos de cada librería según se vaya requiriendo. 2.2. Introducción Python es un lenguaje de programación creado por Guido van Rossum y lanzado en 1991 (y sí, el nombre viene del célebre grupo humorístico británico Monty Python). Es el lenguaje más empleado en el ámbito de la inteligencia artificial y el machine learning (Bansal, 2019), además de ser utilizado también para el desarrollo de aplicaciones web del lado del servidor, el desarrollo de software en general, aplicaciones matemáticas o scripting en la gestión de sistemas operativos. Figura 1. Logo de Python. Tras Python, los lenguajes más empleados en el ámbito de la inteligencia artificial incluyen Java, que ofrece ciertas ventajas como su seguridad, debido a su uso de bytecode y sandboxes; R, lenguaje basado en gráficos ampliamente empleado en aplicaciones estadísticas, análisis y visualización en machine learning; JavaScript © Universidad Internacional de La Rioja (UNIR) (formalmente conocido como ECMAScript) especialmente desde la implementación de Node.js (el equivalente de JavaScript en el lado servidor, a pesar de que JavaScript fue concebido inicialmente para aportar comportamiento dinámico a las aplicaciones web del lado del cliente) y, por supuesto, impulsado por el lanzamiento de TensorFlow.js en 2018; y Scala, uno de los lenguajes que forman parte del core de Técnicas de Inteligencia Artificial 6 Tema 2. Ideas clave Apache Spark. La Figura 2 muestra las tendencias en las ofertas de trabajo en el portal Indeed en las que se buscan ingenieros en machine learning y científicos de datos en función del lenguaje de programación, elaborada por J.F. Puget, ingeniero distinguido en IBM en ese momento (desde 2020 en NVIDIA). C/C++ es también un lenguaje a tener en cuenta como lenguaje soportado por diferentes API, dada su popularidad como lenguaje de propósito general durante muchos años; así como Matlab, por su implantación como herramienta y lenguaje de tratamiento matemático de datos y su versatilidad manejando arrays. Según otras fuentes (Bansal, 2019), Python es el líder, con el 57 % de los científicos de datos y desarrolladores de aprendizaje automático que lo usan y el 33 % lo prefiere sobre otros lenguajes para los desarrollos. No solo Python es un lenguaje ampliamente utilizado, sino que es la principal elección para la mayoría de sus usuarios, debido al lanzamiento de TensorFlow al público general por Google en 2015 © Universidad Internacional de La Rioja (UNIR) (si bien posteriormente TensorFlow fue lanzado para otros lenguajes, como veremos más adelante) y una amplia selección de otras librerías. Python es una opción idónea para los principiantes en este campo. Hay muchas bibliotecas de Python como Teano, Keras y scikit-learn que están disponibles para Técnicas de Inteligencia Artificial 7 Tema 2. Ideas clave aplicar algoritmos de inteligencia artificial, incluyendo machine learning, deep learning, procesamiento del lenguaje natural (NLP – Natural Language Processing), etc. Numpy es una librería que permite resolver muchos cálculos diferentes y Pybrain sirve también para aplicar técnicas machine learning en Python. Otra razón de su popularidad es que su sintaxis es muy simple y pueden ser aprendidas fácilmente, lo que hace que los algoritmos sean fáciles de implementar. Ofrece así, un acceso directo a los usuarios noveles para aplicar técnicas de análisis predictivo. Es uno de los lenguajes preferidos por los desarrolladores que buscan enmarcar mejor las preguntas en las investigaciones y ampliar las capacidades de los sistemas machine learning existentes. 2.3. El lenguaje Python: conceptos básicos e instalación Conceptos básicos Python trabaja en diferentes plataformas (Windows, Mac, Linux, Raspberry Pi, etc.), tiene una licencia de código abierto (Python Software Foundation License, compatible con la licencia GNU) y tiene una sintaxis muy similar al idioma inglés. Su sintaxis permite escribir programas con pocas líneas de código en comparación con otros lenguajes. Python es un lenguaje interpretado, como JavaScript, PHP o Ruby (es decir, no es © Universidad Internacional de La Rioja (UNIR) compilado como C/C++ o Pascal). Esto nos permite ejecutar líneas de programa (sentencias) una a uno en un intérprete en línea de comando o bien que el código completo se ejecute mediante un intérprete apropiado. Sin embargo, por defecto el intérprete comprueba que el código completo no contiene errores de sintaxis antes Técnicas de Inteligencia Artificial 8 Tema 2. Ideas clave de iniciar su ejecución (otros intérpretes como el motor V8 de JavaScript no lo comprueban de antemano por defecto). Es un lenguaje multiparadigma, puesto que soporta: Programación orientada a objetos, como C++, Java, C#, R, entre otros. Programación imperativa: es decir, las sentencias modifican el estado del programa, como en C/C++, C#, Java, R; la contraposición sería un lenguaje de programación declarativa, que no describe el flujo de un programa (ejemplos de lenguajes declarativos serían SQL, HTML o XML). En concreto es de programación procedural, es decir, basado en subrutinas. Programación funcional, basado en el cálculo lambda y en el que existen subrutinas inspiradas en funciones matemáticas cuya invocación no modifica el estado del programa. No obstante, la clasificación de los lenguajes de programación en un tipo u otro no siempre es tarea fácil y es habitual que, como en Python, se puedan encajar en diferentes paradigmas al mismo tiempo. Respecto a su tipado, se puede decir que Python es: Fuertemente tipado: es decir, no se permiten violaciones en los tipos de datos de las variables; de modo que el programador ha de cambiar entre uno y otro tipo de datos mediante conversión de tipos explícita (casting); ejemplos de lenguajes fuertemente tipados son C/C++, Java, C#, Go o TypeScript (evolución de JavaScript), mientras que ejemplos de lenguajes no tipados serían JavaScript, PHP, Perl, Ruby o Basic. © Universidad Internacional de La Rioja (UNIR) De tipado dinámico: habitual en lenguajes interpretados, lo que permite a una variable tomar valores de un tipo u otro, por supuesto, mediante la conversión apropiada; no se debe confundir esto con que sea débilmente tipado, que no lo es; un ejemplo de lenguaje de tipado estático sería C/C++, donde una variable no Técnicas de Inteligencia Artificial 9 Tema 2. Ideas clave puede cambiar de tipo en el tiempo; otro ejemplo de lenguaje de tipado dinámico sería JavaScript. Instalación y primeras pruebas Podemos comprobar si tenemos ya instalado Python en nuestro ordenador ejecutando la siguiente orden en una consola apropiada (Windows, Linux o Mac): PS C:\Users\xxx> python --version Python 3.8.0 Lo habitual es que trabajemos ya con una versión 3.8, lanzada en 2019. En caso contrario, lo descargaremos de la siguiente URL, seleccionando el sistema operativo y arquitectura adecuada: https://www.python.org/ La instalación de Python por defecto ya incluye el gestor de paquetes de Python (PIP), desde la versión 3.4. En caso de que trabajemos con sistemas Linux, podemos buscar el paquete apropiado en nuestro gestor de paquetes, por ejemplo, en el caso de Ubuntu u otras distribuciones basadas en Debian: sudo apt-get update sudo apt-get install python sudo apt-get install pip Otra opción es utilizar en Windows o Linux gestores de paquetes como Conda o © Universidad Internacional de La Rioja (UNIR) Miniconda que ya incluyen entornos, intérpretes y gestión de paquetes de librerías a emplear. Disponible en https://docs.conda.io/ Es interesante también contar con un IDE (entorno de desarrollo integrado) apropiado, algunas opciones gratuitas son Atom o Visual Studio Code, ambas basadas Técnicas de Inteligencia Artificial 10 Tema 2. Ideas clave en el framework Electron, y ambas con su propio sistema de extensiones con resaltado de código y linters (nos permiten detectar errores de sintaxis mientras escribimos) para diferentes lenguajes, incluido Python. Disponibles en https://atom.io/ https://code.visualstudio.com/ Los archivos de nuestro código Python tendrán extensión.py (habitualmente, hay variantes) y podremos ejecutar nuestro código tanto de forma interactiva en un terminal mediante el intérprete en línea de Python: PS C:\Users\xxx > python Python 3.8.0 (tags/v3.8.0:fa919fd, Oct 14 2019, 19:37:50) [MSC v.1916 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> print("¡Bienvenidos al tema 2 de la asignatura!") ¡Bienvenidos al tema 2 de la asignatura! >>> O bien creando un archivo con nuestro código: que luego ejecutaremos con el intérprete: PS C:\Users\ralorin> python.\test.py Hola a todos 2.4. La sintaxis de Python © Universidad Internacional de La Rioja (UNIR) En este apartado veremos las reglas esenciales del lenguaje Python que son necesarias para realizar técnicas de análisis de datos y machine learning, así como utilizar las librerías específicas para ello. Evidentemente el lenguaje Python es mucho Técnicas de Inteligencia Artificial 11 Tema 2. Ideas clave más amplio que la descripción incluida en este apartado, pero el alumno puede ampliar su conocimiento del lenguaje utilizando para ello los medios aportados al final del tema si así lo requiere, tanto para el uso de Python en otras aplicaciones, como para ampliar sus conocimientos en cuanto a la aplicación de técnicas de inteligencia artificial. Indentación y comentarios A diferencia de otros lenguajes, en los cuales no es importante y solo se hace por legibilidad del código, en Python es importante el sangrado (indentación) a la hora de definir los distintos bloques de ejecución. Hemos de usar siempre el mismo nivel de sangrado para cada bloque y el deshacerlo hace que se cierre dicho bloque. Además, a diferencia de otros lenguajes de programación como C/C++, Java, C# o JavaScript, no se finaliza cada sentencia con un punto y coma, sino con una nueva línea. Podemos incluir comentarios en el programa de las siguientes formas, que no se ejecutarían, y podemos hacer uso de la palabra clave pass en los casos en que necesitemos que no se realice ninguna operación, pero no romper la lógica del programa (quizás más adelante en nuestro desarrollo este pass pase a ser nuevo código que actualmente dejamos para más adelante). © Universidad Internacional de La Rioja (UNIR) Técnicas de Inteligencia Artificial 12 Tema 2. Ideas clave Variables, tipos de datos y casting En Python no es necesario declarar una variable (a diferencia de lenguajes de tipado estático como C/C++), esta se crea en el momento de utilizarla por primera vez, momento en el cual se define su tipo, que además puede cambiar con el tiempo con una nueva asignación de la variable a un tipo nuevo: Los nombres de las variables (y del resto de palabras clave u otros elementos como operadores) empleados en Python son case-sensitive (debemos respetar uso de mayúsculas y minúsculas) y pueden contener letras, números y el carácter de subrayado, pero no pueden comenzar por un número. Ejemplos válidos: miVariable, mi_variable, variable1, _variable2 Podemos asignar el mismo o distinto valor a varias variables en una única sentencia, pero esto no las asocia entre sí de ninguna forma. Podemos usar la función print() para imprimir por consola literales y variables, pero no podemos concatenar cadenas y números como se hace en otros lenguajes © Universidad Internacional de La Rioja (UNIR) (como JavaScript): Técnicas de Inteligencia Artificial 13 Tema 2. Ideas clave Por defecto, una variable definida fuera de una función es global, y cuando es definida dentro de una función es local, a no ser que utilicemos la palabra clave global para modificar este comportamiento. Una variable global puede ser empleada desde cualquier punto del programa, pero una variable local solo puede ser empleada dentro de la función que la define. © Universidad Internacional de La Rioja (UNIR) Técnicas de Inteligencia Artificial 14 Tema 2. Ideas clave La Tabla 1 muestra los diferentes tipos de datos built-in (incorporados per se) en Python, aunque el desarrollador puede crear sus propios tipos de datos (clases). Tabla 1. Tipos de datos en Python. Como se puede ver, existen cuatro tipos de colecciones o arrays en Python, mucho más rico en este sentido que otros lenguajes de programación donde no existen estos tipos de forma incorporada en el lenguaje. Como se puede ver, se pueden mezclar los tipos de los elementos que componen una colección. © Universidad Internacional de La Rioja (UNIR) Tabla 2. Tipos de colecciones en Python. Técnicas de Inteligencia Artificial 15 Tema 2. Ideas clave El tipo del dato se asigna automáticamente en el momento de asignar un valor a una variable: Para las cadenas podemos usar comillas simples o dobles, según nos convenga. O se puede especificar explícitamente utilizando el método constructor de cada tipo. Nótese que en este caso el argumento de las colecciones es siempre una tupla dentro del operador paréntesis de la función constructor. En el caso de los diccionarios, se emplea la notación de invocación a la función especificando el valor de cada parámetro específico. © Universidad Internacional de La Rioja (UNIR) Cuando trabajemos con números podemos hacerlo con enteros, flotantes o complejos, y la conversión (casting) entre unos y otros puede hacerse de forma explícita mediante el uso de métodos constructor: Técnicas de Inteligencia Artificial 16 Tema 2. Ideas clave También se puede castear entre números y cadenas: Podemos averiguar si un objeto es de un tipo determinado con la siguiente función: Cadenas Las cadenas funcionan como el resto de los arrays en cuanto a que son iterables y cada elemento es accesible mediante el uso de corchetes. Cada elemento es un carácter Unicode, pero no existe un tipo char como en otros lenguajes. Un carácter es una cadena de tamaño 1. Podemos acceder a los elementos de la cadena de forma selectiva utilizando las siguientes posibilidades (similares al resto de colecciones, como veremos más adelante). © Universidad Internacional de La Rioja (UNIR) Técnicas de Inteligencia Artificial 17 Tema 2. Ideas clave Existen, asimismo, algunos métodos para manipular cadenas que en algunos casos son similares en otras colecciones: Es interesante aprender a formatear la salida de las cadenas para su uso en programas interactivos que creemos y ver los resultados de nuestro análisis de datos: © Universidad Internacional de La Rioja (UNIR) Técnicas de Inteligencia Artificial 18 Tema 2. Ideas clave Expresiones booleanas Los bool pueden tomar valores True o False y nos sirven para evaluar expresiones lógicas en el programa con el fin de controlar el flujo del programa, entre otras posibilidades. Cualquier elemento diferente de cero y colecciones no vacías castearán a True, mientras que números igual a cero o colecciones vacías castearán a False: © Universidad Internacional de La Rioja (UNIR) Operadores Técnicas de Inteligencia Artificial 19 Tema 2. Ideas clave En Python existen los siguientes tipos de operadores (que nos interesen): Aritméticos. Asignación. Comparación. Lógicos. Identidad. Membresía. Tabla 3. Operadores aritméticos en Python. © Universidad Internacional de La Rioja (UNIR) Técnicas de Inteligencia Artificial 20 Tema 2. Ideas clave Tabla 4. Operadores asignación en Python. Tabla 5. Operadores comparación en Python. © Universidad Internacional de La Rioja (UNIR) Tabla 6. Operadores lógicos en Python. Técnicas de Inteligencia Artificial 21 Tema 2. Ideas clave Tabla 7. Operadores identidad en Python. Los operadores identidad merecen una explicación y no hay que confundirlos con el operador igualdad, que compara los valores de dos variables. En Python al asignar una variable a otra, en realidad lo que estamos haciendo es asignar por referencia, no por valor. Es decir, no se duplica la memoria si no utilizamos un método que la clone o duplique explícitamente. Esto hace que modificar cualquier de las referencias que apunte a la misma memoria modificará la memoria y se verá alterada si la visualizamos desde cualquier otra variable que apunte a dicha dirección de memoria: © Universidad Internacional de La Rioja (UNIR) Técnicas de Inteligencia Artificial 22 Tema 2. Ideas clave Tabla 8. Operadores membresía en Python. 2.5. Listas, tuplas, conjuntos y diccionarios Tal y como vimos con anterioridad, existen cuatro tipos básicos (no son los únicos) de colecciones o arrays incluidos en el propio Python. Estos nos permitirán manejar los datos sobre los cuales realizar clasificaciones o regresiones, aunque, como veremos, las diferentes librerías machine learning pueden tener sus propios tipos de datos para manejar los datos. Tabla 9. Tipos de colecciones en Python. Listas Las listas son colecciones de objetos ordenadas y modificables. Se escriben utilizando corchetes con los elementos separados por comas. Podemos acceder a los diferentes © Universidad Internacional de La Rioja (UNIR) elementos empleando el operador corchete y acceder a un rango de elementos, al igual que hacíamos con las cadenas. Asimismo, podemos utilizar la función len() y el método append() para añadir nuevos elementos. Técnicas de Inteligencia Artificial 23 Tema 2. Ideas clave Podemos utilizar el operador in para iterar sobre los elementos de una lista o para comprobar si un elemento existe: Existen diferentes métodos para añadir o quitar elementos de la lista: © Universidad Internacional de La Rioja (UNIR) Técnicas de Inteligencia Artificial 24 Tema 2. Ideas clave Es importante recordar que el operador asignación no duplica objetos, de modo que tenemos que clonar su contenido (duplicar los datos en otro espacio de la memoria) si no queremos alterar los datos originales al realizar operaciones. Esto sirve para cualquier colección de datos. También podemos concatenar dos listas: Tuplas Las tuplas son colecciones ordenadas pero inmutables, es decir, no podemos alterar su valor. Las tuplas funcionan de forma muy similar a las listas a la hora de acceder a sus elementos, iterarlas, comprobar si un elemento se encuentra en ellas, etc. Sin embargo, no podemos añadir o eliminar elementos o modificar el valor de uno de sus elementos. Para hacer esto, tendríamos que copiar su valore en una lista, realizar las modificaciones y asignar su contenido completo a la tupla original. Como comentario particular, si queremos crear una tupla de un único elemento, hemos de añadir una coma al final de dicho elemento, para que no sea confundido con una cadena: © Universidad Internacional de La Rioja (UNIR) Conjuntos Los conjuntos (set) son colecciones de datos no ordenadas y que no permiten elementos duplicados. Es decir, no podemos predecir en qué orden se mostrarán Técnicas de Inteligencia Artificial 25 Tema 2. Ideas clave (print) o iterarán sus elementos (for … in). De hecho, cada vez que realicemos una ejecución de este tipo el orden puede ser distinto. Tampoco podemos utilizar el operador corchete para acceder a un elemento determinado, puesto que no tienen orden alguno. No pueden contener dos elementos con el mismo valor. Una vez que creamos un conjunto, no podemos alterar el valor de uno de sus elementos. Lo que sí podemos hacer es añadir nuevos elementos o eliminar los existentes: Diccionarios Los diccionarios son el equivalente a mapas o hashes en otros lenguajes de programación. Son un conjunto de elementos clave-valor sin orden y en los cuales se puede modificar el contenido de los elementos. Son también similares a los objetos © Universidad Internacional de La Rioja (UNIR) nativos de JavaScript que pueden ser convertidos a y desde JSON. Sin embargo, son mucho más flexibles y una clave no tiene por qué ser sólo de tipo cadena, sino que puede ser cualquier objeto, incluso un entero, un flotante o un complejo, por ejemplo. Técnicas de Inteligencia Artificial 26 Tema 2. Ideas clave Se puede acceder a cada uno de sus elementos mediante el operador indicando la clave determinada, así como el método get(): Tenemos varias formas de iterar por un diccionario: © Universidad Internacional de La Rioja (UNIR) Si utilizamos el operador de membresía estaremos comprobando si una clave está en el diccionario (no un valor). Podemos usar también la función len() como con cualquier otra colección: Técnicas de Inteligencia Artificial 27 Tema 2. Ideas clave Podemos añadir nuevos elementos clave-valor al diccionario o eliminarlos: Además, como cabría esperar, se pueden anidar diccionarios unos dentro de otros. En realidad, Python nos deja realizar casi cualquier combinación de anidamientos, mezcla o combinaciones de tipos entre sí: © Universidad Internacional de La Rioja (UNIR) Técnicas de Inteligencia Artificial 28 Tema 2. Ideas clave 2.6. Librerías útiles para el análisis de datos Aunque en este tema nos iniciaremos en el uso de Python para el machine learning usando las librerías NumPy, SciPy, Scikit-learn, Pandas y Matplotlib en las siguientes subsecciones como punto de partida, a lo largo del resto de temas de la asignatura veremos al final de cada tema ejemplos de uso de las librerías más importantes aplicadas a la solución de problemas mediante técnicas de inteligencia artificial, machine learning y deep learning. Veamos, por tanto, una breve descripción de las librerías más importantes disponibles para Python. Es importante señalar que no son las únicas y que existen, por supuesto, otras muchas y en ocasiones especializadas en un tipo de problemas concreto (por ejemplo, OpenCV es una conocida librería de visión artificial disponible para C y Python). El alumno, como cualquier científico de datos o ingeniero de machine learning, ha de estar siempre abierto a la búsqueda de nuevos recursos para solucionar cada problema específico. © Universidad Internacional de La Rioja (UNIR) Las librerías más interesantes y que analizaremos brevemente son las siguientes, tomando ejemplos de uso de (GeeksforGeeks, 2019): Técnicas de Inteligencia Artificial 29 Tema 2. Ideas clave NumPy. SciPy. Scikit-learn. Theano. Keras. TensorFlow. PyTorch. Pandas. Matplotlib. Antes de nada, vamos a mencionar brevemente cómo instalar y emplear estas librerías llegado el momento. Instalación de paquetes en Python Para instalar una librería usaremos generalmente el gestor de paquetes que estemos empleando (PIP o Conda, por ejemplo). En el caso de que estemos usando PIP, podemos buscar la lista de paquetes, disponibles en: https://pypi.org/ La instalación de un paquete o librería concreto se realizaría desde línea de comandos como (en el caso de NumPy bajo Windows, por ejemplo): PS C:\Users\xxx> pip install numpy O si no tenemos permiso para modificar de forma global el sistema: PS C:\Users\xxx> pip install numpy --user © Universidad Internacional de La Rioja (UNIR) Podemos eliminar posteriormente un paquete mediante: PS C:\Users\xxx> pip uninstall numpy Técnicas de Inteligencia Artificial 30 Tema 2. Ideas clave Así como ver la lista disponible de paquetes mediante: PS C:\Users\xxx> pip list Para utilizar un paquete en nuestro programa será tan sencillo como: PS C:\Users\xxx> pip uninstall numpy NumPy Figura 3. Fuente: https://numpy.org/ NumPy es una librería muy popular para el procesamiento de grandes matrices y matrices multidimensionales, con la ayuda de una gran colección de funciones matemáticas de alto nivel. Es muy útil para los cálculos científicos fundamentales en machine learning. Es particularmente útil para el álgebra lineal, la transformación de Fourier y las capacidades de números aleatorios. Otras librerías de alto nivel como TensorFlow utilizan NumPy internamente para la manipulación de tensores. © Universidad Internacional de La Rioja (UNIR) Nota: para que el siguiente ejemplo funcione es necesario instalar numpy, como se ha indicado antes. Técnicas de Inteligencia Artificial 31 Tema 2. Ideas clave SciPy Figura 4. Fuente: https://www.scipy.org/ SciPy es una biblioteca muy popular entre los ingenieros de machine learning, ya que contiene diferentes módulos para la optimización, el álgebra lineal, la integración y © Universidad Internacional de La Rioja (UNIR) la estadística. Hay una diferencia entre la biblioteca de SciPy y la pila de SciPy (SciPy stack). La librería SciPy es uno de los paquetes centrales que componen la pila de SciPy. SciPy también es muy útil para la manipulación de imágenes. Técnicas de Inteligencia Artificial 32 Tema 2. Ideas clave En el siguiente ejemplo podemos ver cómo manipular una imagen utilizando diferentes librerías con SciPy. Podemos elegir una imagen cualquiera en JPEG en nuestro ordenador y ver el resultado de las operaciones descritas. Nota: para que el siguiente ejemplo funcione es necesario instalar numpy, como se ha indicado antes, así como las librerías scipy, imageio, Pillow, scikit-image. Scikit-learn © Universidad Internacional de La Rioja (UNIR) Figura 5. Fuente: https://scikit-learn.org/ Técnicas de Inteligencia Artificial 33 Tema 2. Ideas clave Skikit-learn es una de las librerías de machine learning más populares para los algoritmos de machine learning clásico. Está construida sobre dos bibliotecas básicas de Python, NumPy y SciPy. Scikit-learn soporta la mayoría de los algoritmos de aprendizaje supervisado y no supervisado. Scikit-learn también puede ser usado para la minería de datos y el análisis de datos, lo que lo convierte en una gran herramienta para los que empiezan con el machine learning. En el siguiente ejemplo se importa uno de los dataset más conocidos en el aprendizaje de machine learning (el dataset «iris», con dimensiones de pétalos y sépalos de flores) y se utiliza un clasificador de árbol de decisión (algoritmo CART, que veremos en el Tema 3). Este es un buen ejemplo, además, de importación tanto de datos como de modelos. Nota: es necesario instalar el paquete skilearn (o scikit-learn) para su funcionamiento. © Universidad Internacional de La Rioja (UNIR) Técnicas de Inteligencia Artificial 34 Tema 2. Ideas clave Obteniendo como resultado: DecisionTreeClassifier( ccp_alpha=0.0, class_weight=None, criterion='gini', max_depth=None, max_features=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, presort='deprecated', random_state=None, splitter='best') precision recall f1-score support 0 1.00 1.00 1.00 50 1 1.00 1.00 1.00 50 2 1.00 1.00 1.00 50 accuracy 1.00 150 macro avg 1.00 1.00 1.00 150 weighted avg 1.00 1.00 1.00 150 [[50 0 0] [ 0 50 0] [ 0 0 50]] Theano © Universidad Internacional de La Rioja (UNIR) Figura 6. Fuente: http://deeplearning.net/software/theano/ Técnicas de Inteligencia Artificial 35 Tema 2. Ideas clave El machine learning es básicamente matemáticas y estadística. Theano es una popular librería que se utiliza para definir, evaluar y optimizar las expresiones matemáticas que implican conjuntos multidimensionales de manera eficiente. Se consigue optimizando la utilización de la CPU y la GPU. Se utiliza ampliamente para pruebas unitarias y autoverificación para detectar y diagnosticar diferentes tipos de errores. Theano es una biblioteca muy potente que se ha utilizado en proyectos científicos de gran escala e intensivos en computación durante mucho tiempo, pero es lo suficientemente sencilla y accesible para que pequeños desarrolladores la utilicen en sus propios proyectos. Nota: es necesario instalar el paquete theano para el funcionamiento del siguiente ejemplo. Obteniendo como resultado: [[0.5 0.73105858] [0.26894142 0.11920292]] Keras © Universidad Internacional de La Rioja (UNIR) Figura 7. Fuente: https://keras.io/ Técnicas de Inteligencia Artificial 36 Tema 2. Ideas clave Keras es una de las librerías de Machine Learning más populares para Python. Es una API de redes neuronales de alto nivel capaz de funcionar sobre TensorFlow, CNTK, o Theano. Puede funcionar sin problemas en la CPU y la GPU. Keras permite que sea realmente sencillo construir y diseñar redes neuronales para los principiantes en el machine learning. Una de las mejores características de Keras es que permite la creación de prototipos de forma fácil y rápida. Veremos ejemplos de su uso en el Tema 5 de redes neuronales artificiales y en el Tema 6 de deep learning. TensorFlow Figura 8. Fuente: https://www.tensorflow.org/ TensorFlow es una biblioteca de código abierto muy popular para el cálculo numérico de alto rendimiento, desarrollada por el equipo de Google Brain en Google. Como su nombre lo sugiere, TensorFlow es un marco de trabajo que implica la definición y ejecución de cálculos que implican tensores. Un tensor es cierta clase de entidad algebraica que generaliza los conceptos de escalar, vector y matriz de una forma que sea independiente de cualquier sistema de coordenadas elegido. © Universidad Internacional de La Rioja (UNIR) TensorFlow puede entrenar y ejecutar redes neuronales profundas que pueden ser usadas para desarrollar varias aplicaciones de IA. TensorFlow es ampliamente utilizado en el campo de la investigación y aplicación del machine learning. Técnicas de Inteligencia Artificial 37 Tema 2. Ideas clave Veremos más ejemplos de su uso en el Tema 5 de redes neuronales artificiales y en el Tema 6 de deep learning. TensorFlow fue lanzado en 2015 como una herramienta de código abierto por Google. Inicialmente estaba disponible en Python. Posteriormente se lanzó TensorFlow.js para su uso mediante JavaScript, bien sea en el mismo navegador o bien del lado del servidor mediante Node.js o incluso en una Raspberry Pi. Más tarde se lanzó TensorFlow 2.0, disponible para C++, Haswell, Java, Go y Rust. También hay bibliotecas de terceros para C#, R y Scala. Existen versiones de TensorFlow para Windows, Linux y Mac. Además, TensorFlow Lite es la versión de TensorFlow para su uso en terminales móviles o en dispositivos en el borde la red (Edge Computing), incluyendo escenarios Internet of Things. Más aún, Google lanzó en 2016 su unidad de procesamiento tensorial (TPU), un circuito ASIC (Circuito Integrado de Aplicación Específicas) personalizada específicamente para machine learning y adaptada para TensorFlow. El TPU es un acelerador de IA programable diseñado para proporcionar alto throughput de aritmética de precisión baja (p. ej., 8 bits) y orientado para utilizar o correr modelos más que para entrenarlos. Este tipo de unidades tienen un rendimiento de machine learning por vatio consumido de un orden mayor de magnitud que los sistemas tradicionales. Google Cloud ofrece el uso de TPU en la nube que pueden ser empleados por el público general. Asimismo, Google lanzó los Edge TPU, dispositivos que incluyen una CPU, una GPU y una TPU para aplicar TensorFlow en el Edge. Se pueden considerar una especie de Raspberry Pi con TPU incluida para ejecutar machine learning en el extremo de la red. © Universidad Internacional de La Rioja (UNIR) Nota: es necesario instalar el paquete tensorflow o tensorflow-gpu para el funcionamiento del siguiente ejemplo (instalará más de 400MB en el ordenador, Técnicas de Inteligencia Artificial 38 Tema 2. Ideas clave incluyendo dependencias, como parte de Keras). Además, bajo Windows es necesario contar con la última versión de Visual C++ Redistributable para su funcionamiento: https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c- downloads © Universidad Internacional de La Rioja (UNIR) Técnicas de Inteligencia Artificial 39 Tema 2. Ideas clave Veremos una salida similar a la siguiente en el momento en que se descarga el dataset MINIST (MNIST es una gran base de datos de dígitos escritos a mano que se usa comúnmente para entrenar varios sistemas de procesamiento de imágenes) de la web de Lecun (Yann Lecun, h=122, es, junto a Geoffrey Hinton y Yoshua Bengio, uno de los conocidos como los tres Padrinos de la Inteligencia Artificial o Padrinos del Machine Learning). Downloading data from https://storage.googleapis.com/tensorflow/tf-keras- datasets/mnist.npz 11493376/11490434 [==============================] - 1s 0us/step Y una salida similar a la siguiente durante el entrenamiento y la evaluación del modelo: Train on 60000 samples Epoch 1/5 60000/60000 [==============================] - 4s 65us/sample - loss: 0.2982 - accuracy: 0.9128 Epoch 2/5 60000/60000 [==============================] - 3s 56us/sample - loss: 0.1424 - accuracy: 0.9571 Epoch 3/5 60000/60000 [==============================] - 3s 57us/sample - loss: 0.1073 - accuracy: 0.9677 Epoch 4/5 60000/60000 [==============================] - 3s 57us/sample - loss: 0.0891 - accuracy: 0.9714 Epoch 5/5 60000/60000 [==============================] - 4s 59us/sample - loss: 0.0745 - accuracy: 0.9768 10000/10000 - 1s - loss: 0.0760 - accuracy: 0.9781 © Universidad Internacional de La Rioja (UNIR) [0.0760388328890549, 0.9781] Técnicas de Inteligencia Artificial 40 Tema 2. Ideas clave PyTorch Figura 9. Fuente: https://pytorch.org/ PyTorch es otra de las librerías más populares de machine learning de código abierto para Python basada en Torch, que es una biblioteca de machine learning de código abierto que se implementa en C con un wrapper en Lua. Tiene una extensa selección de herramientas y librerías que incluye visión artificial (Computer Vision) o Procesamiento de Lenguaje Natural (NLP), entre otros. Permite a los desarrolladores realizar cálculos tensoriales con aceleración en la GPU y también es de ayuda en la creación de gráficos computacionales. Nota: es necesario instalar el paquete torch para el funcionamiento del siguiente ejemplo. Sin embargo, conviene hacerlo de la siguiente forma explicada en la web incluso aunque se emplee PIP o Conda. De esta forma se utilizará PIP o Conda, pero descargando el paquete desde la web: https://pytorch.org/get-started/locally/ Por ejemplo, para el uso de PIP en Windows y sin un sistema que soporte CUDA (Compute Unified Device Architecture – Arquitectura Unificada de Dispositivos de Cómputo) de NVIDIA, seleccionaríamos: © Universidad Internacional de La Rioja (UNIR) Técnicas de Inteligencia Artificial 41 Tema 2. Ideas clave Resultando el siguiente comando a ejecutar en nuestra consola: pip install torch==1.4.0+cpu torchvision==0.5.0+cpu -f https://download.pytorch.org/whl/torch_stable.html © Universidad Internacional de La Rioja (UNIR) Técnicas de Inteligencia Artificial 42 Tema 2. Ideas clave Veremos la siguiente salida con las 500 iteraciones. 0 31596260.0 1 29391412.0 2 31699210.0... 498 4.088189234607853e-05 499 4.0442959289066494e-05 Pandas © Universidad Internacional de La Rioja (UNIR) Técnicas de Inteligencia Artificial 43 Tema 2. Ideas clave Figura 10. Fuente: https://pandas.pydata.org/ Pandas es una popular librería de Python para el análisis de datos. No está directamente relacionada con el machine learning. Como sabemos, los dataset han ser preparados antes del entrenamiento. En este caso, Pandas es muy útil, ya que fue desarrollada específicamente para la extracción y preparación de datos. Proporciona estructuras de datos de alto nivel y una amplia variedad de herramientas para el análisis de datos. Asimismo, proporciona muchos métodos incorporados para tantear, combinar y filtrar datos. Nota: es necesario instalar el paquete pandas para el funcionamiento del siguiente ejemplo. © Universidad Internacional de La Rioja (UNIR) Técnicas de Inteligencia Artificial 44 Tema 2. Ideas clave country capital area population 0 Brazil Brasilia 8.516 200.40 1 Russia Moscow 17.100 143.50 2 India New Dehli 3.286 1252.00 3 China Beijing 9.597 1357.00 4 South Africa Pretoria 1.221 52.98 Matplotlib Figura 11. Fuente: https://matplotlib.org/ Matpoltlib es una biblioteca de Python muy popular para la visualización de datos. Al igual que Pandas, no está directamente relacionada con el machine learning. Es particularmente útil cuando un programador quiere visualizar los patrones de los datos. Es una librería de ploteo en 2D usada para crear gráficos y diagramas en 2D. Un módulo llamado pyplot facilita a los programadores el trazado, ya que proporciona características para controlar los estilos de línea, las propiedades de las fuentes, los ejes de formato, etc. Proporciona varios tipos de gráficos y diagramas para la visualización de datos, es decir, histogramas, tablas de error, chats de barras, etc. Nota: es necesario instalar el paquete matplotlib para el funcionamiento del siguiente ejemplo. © Universidad Internacional de La Rioja (UNIR) Técnicas de Inteligencia Artificial 45 Tema 2. Ideas clave La salida se mostrará en una ventana que nos permitirá guardar la imagen en un archivo PNG como el siguiente. © Universidad Internacional de La Rioja (UNIR) Técnicas de Inteligencia Artificial 46 Tema 2. Ideas clave 2.7. La librería NumPy para el manejo de datos Conceptos básicos y arrays en NumPy Tal y como hemos visto, la librería NumPy nos permite trabajar con arrays de forma muy eficiente, así como álgebra lineal, transformadas de Fourier y matrices. Aunque Python dispone de listas que permiten trabajar con arrays, estas son muy lentas. NumPy proporciona arrays 50 veces más rápidos, en parte porque los elementos están todos almacenados en posiciones contiguas de memoria y en parte porque parte de NumPy está escrita en C/C++. Una vez hemos instalado NumPy siguiendo las explicaciones de las secciones anteriores, podemos usar los arrays de NumPy (objetos de clase darray), de la siguiente forma: Podemos trabajar con escalares, vectores, matrices, arrays tridimensionales o cualquier otra dimensión diferente. El método ndim nos permite obtener la dimensión del array, mientras que con el operador corchete podemos acceder a los diferentes elementos según los índices en cada dimensión. Los índices negativos son válidos para acceder desde el elemento final en una dimensión (-1 sería el último © Universidad Internacional de La Rioja (UNIR) elemento). Técnicas de Inteligencia Artificial 47 Tema 2. Ideas clave Array Slicing Al igual que con los tipos built-in datos (cadenas, listas, etc.), en los arrays NumPy se puede hacer un slicing de los arrays utilizando notación de corchetes y dos puntos, pero, con mucha mayor flexibilidad: array[start:end] array[start:end:step] Si no pasamos un comienzo se considera 0. Si no pasamos un final se considera la longitud del array en esa dimensión. Si no pasamos un step se considera 1. Siempre se incluye el elemento en la posición start, pero se excluye el elemento en la posición end. © Universidad Internacional de La Rioja (UNIR) Técnicas de Inteligencia Artificial 48 Tema 2. Ideas clave Tipos de datos en NumPy NumPy nos permite especificar con mucho mayor detalle los tipos de datos de los elementos en nuestros arrays: i – integer b – boolean u - unsigned integer f – float c - complex float m – timedelta M – datetime O – object S – string U - unicode string © Universidad Internacional de La Rioja (UNIR) V - chunk o trozo de memoria para otro tipo de dato ( void ) En los tipos de datos i, u, f, S, U podemos especificar el tamaño en bytes, además. Esto se especifica con la propiedad dtype: Técnicas de Inteligencia Artificial 49 Tema 2. Ideas clave Si un valor no puede ser convertido, se lanzará una excepción de tipo ValueError. Si queremos convertir el tipo de datos de un array existente, usaremos el método astype(). Copy y view La principal diferencia entre una copia (obtenida con el método copy()) y una vista (obtenida con el método view()) de un array NumPy es que la copia es un nuevo array, mientras que la vista es una vista, valga la redundancia, del array original. Es © Universidad Internacional de La Rioja (UNIR) similar al concepto de asignación por referencia o de clonado de los datos en Python. Si modificamos los datos en una copia, esto no afectará al original, y viceversa. Por el contrario, si modificamos los datos en una vista, esto afectará al original, y viceversa. Podemos comprobar si un array es propietario de sus propios datos mediante el Técnicas de Inteligencia Artificial 50 Tema 2. Ideas clave atributo base. Este devuelve el array original si el array es una vista. En caso de que el array sea una copia, este atributo devuelve None. La forma (shape) de un array Con el atributo shape podemos obtener una tupla indicando en cada índica el número de elementos en cada dimensión. Si hemos definido una dimensión mínima con ndmin © Universidad Internacional de La Rioja (UNIR) en la creación del array, esta será una forma de visualizarlo. El método reshape() nos permite redimensionar un array (cambios entre 1-D y 2-D o 3D). Dicho método devuelve una vista, no una copia. Con reshape(-1) podemos aplanar un array multidimensional en un array unidimensional. Técnicas de Inteligencia Artificial 51 Tema 2. Ideas clave Iterando por los arrays Podemos usar bucles for-in para iterar por los arrays, pero necesitamos uno por cada dimensión: © Universidad Internacional de La Rioja (UNIR) Técnicas de Inteligencia Artificial 52