Machine Learning con Python: Ejemplos prácticos

En un artículo anterior de nuestro blog, analizamos desde el punto de vista teórico cuáles son las principales librerías para ciencia de datos y machine learning que utilizan los data scientists para tratar los datos de una forma eficiente y extraer todo su potencial. 

En este post, lo llevaremos a la práctica a través de ejemplos sencillos que muestren cómo se trabaja con estas librerías haciendo especial hincapié en aquello que ofrecen al usuario interesado en el mundo del machine learning.

Machine Learning con Python

Python es uno de los lenguajes de programación más utilizados y extendidos en la actualidad, contando con una tendencia alcista en su uso durante los últimos años. Esta afirmación puede verse reflejada de forma clara en el ranking anual usado como referencia para conocer los lenguajes de programación más utilizados, el índice TIOBE.

Este índice es un indicador de la popularidad de estos lenguajes basado en elementos como el número de ingenieros a lo largo del mundo, cursos o cantidad de proveedores externos. Toda la información recopilada para el cálculo de este índice proviene de los motores de búsqueda más conocidos (Google, Bing, Yahoo, Baidu…), lo que hace que este índice no indique qué lenguaje de programación es mejor o cuál es aquel en el que se han escrito más líneas de código, sino su popularidad general.

La popularidad de Python se debe a la gran cantidad de ventajas y opciones con las que cuenta con respecto a sus competidores, empezando por el hecho de que es un lenguaje de programación de código abierto, haciendo que no existan prácticamente limitaciones para su uso por cualquier persona y dando la posibilidad de colaborar para su mejora formando parte de su amplia comunidad. 

Además de esto, Python cuenta con una sintaxis sencilla, legible y fácil de entender, lo que lo hace a la misma vez adecuado para aquellos usuarios que están comenzando a programar como para los usuarios que buscan ahorrar tiempo y recursos a la hora de desarrollar software de forma eficiente. Todo esto, sumado a la gran cantidad de librerías, frameworks y paradigmas que ofrece Python, lo convierten en uno de los lenguajes de programación más polivalentes y versátiles que existen, siendo un lenguaje de propósito general apto para la gran mayoría de usuarios a pesar de sus especialidades o de sus intereses. 

Por último, el hecho de que sea de código abierto y de que sea tan popular en la actualidad, hacen que Python posea una gran comunidad sólida, dispuesta a ayudar a los demás usuarios con sus dudas y a que el ecosistema Python siga creciendo y mejorando para todo el mundo.

Estas ventajas enumeradas junto con la existencia de un gran número de librerías, herramientas y frameworks adecuados para el procesamiento de datos, hacen que Python sea el lenguaje de programación idóneo para llevar a cabo tareas relacionadas con el campo del aprendizaje automático, y en general del campo de la inteligencia artificial y la ciencia de datos.

Librerías más usadas para Machine Learning en Python

Pandas

Pandas es la librería de referencia en Python en lo que a manipulación y análisis de datos se refiere. Se trata de una librería de código abierto que apuesta por un análisis y manejo flexible, eficiente y disponible para todos de uno de los recursos más valiosos para la empresa, el dato. 

Para poder llevar a cabo esta tarea, Pandas ofrece principalmente dos estructuras de datos clave, la serie como estructura unidimensional, y el DataFrame como estructura bidimensional representada en forma de tabla, las cuales de forma conjunta permiten el manejo de la mayoría de conjuntos de datos de una forma intuitiva y sencilla.

Algunas de las utilidades más comunes y relevantes de esta librería son las siguientes:

  • Gracias al uso del DataFrame como estructura de datos principal, permite operaciones como la agrupación, integración, iteración o indexado de datos de forma rápida.
  • Posee herramientas para realizar operaciones de lectura y escritura de datos manejando diferentes estructuras y formatos de datos.
  • Permite el tratamiento de valores perdidos.
  • Permite la ejecución de cadenas de operaciones sobre los datos de forma vectorizada.
  • Contiene herramientas para el tratamiento y la transformación de series temporales.
  • Ofrece una representación unificada de los datos que permite la integración de estos con otras librerías de Python de forma sencilla.

A continuación, se muestran unas celdas de código con un ejemplo de uso sencillo de la librería Pandas. En este ejemplo, primero se lee un conjunto de datos en formato CSV para poder visualizarlo, posteriormente se obtiene y muestra un subconjunto de estos datos que se corresponde con los pasajeros del Titanic que sobrevivieron y cumplen ciertas condiciones.

Celda de código con un caso de uso sencillo de la librería Pandas para visualizar 
un conjunto de datos.
Celda de código en la que se filtra un conjunto de datos según varias condiciones para obtener un subconjunto nuevo.

Numpy

NumPy (Numeric Python) es otra de esas librerías que no pueden faltar en tu arsenal si pretendes afrontar problemas del ámbito de la ciencia de datos, ya que ofrece diferentes herramientas esenciales para la computación científica y el cálculo numérico orientado a matrices.

Esta librería introduce una nueva clase de objeto denominado Array, el cual no es más que una estructura de datos propia de matrices N-dimensionales para un manejo eficiente. La necesidad de esta nueva representación surge debido a que la manipulación de listas nativas de Python de gran tamaño es muy poco eficiente, en gran parte a causa de la flexibilidad que éstas aportan como estructuras de datos, permitiendo modificar su tamaño de forma dinámica o albergar datos de diferentes tipos en una misma estructura.

Los Arrays de NumPy, por otro lado, nos permiten un almacenamiento interno en memoria y un manejo eficaz gracias a una representación interna binaria en la que el número de bytes asociados a cada elemento de una matriz es fijo (los datos que conforman dicha matriz son todos del mismo tipo) y se representa únicamente el valor del dato, dejando de lado información añadida o metadatos.

Otro aporte de NumPy con respecto a Python es el soporte que ofrece para invocar funciones de forma vectorizada, permitiendo cálculos de forma optimizada eliminando bucles y evitando tener que acceder de forma secuencial a cada uno de los elementos que forman la matriz.

Además de todo esto, NumPy ofrece herramientas y utilidades como las siguientes:

  • Indexado y filtrado de los Arrays de forma sencilla y eficiente, permitiendo obtener nuevos Arrays que sean un subarray del original y cumplan una determinada condición.
  • Operaciones matemáticas sencillas entre Arrays de forma intuitiva y vectorizada, utilizando operadores clásicos como +, -, *, /, …
  • Operaciones algebraicas con vectores y matrices como el producto escalar de dos vectores, el producto de dos matrices, la transposición de una matriz, cálculo del determinante de una matriz, autovectores de una matriz…
  • Métodos integrados para la generación de matrices de datos aleatorios según diferentes distribuciones de probabilidad.

Al igual que se realizó con la librería Pandas, a continuación se pueden observar dos celdas de código que muestran con un ejemplo simple algunas de las funcionalidades que nos aporta la librería NumPy, desde la definición de Arrays hasta el uso de estos para realizar distintas operaciones matemáticas y algebraicas.

Celda de código en la que se define un Array y se muestran algunos de sus atributos.
Celda de código en la que se realizan varias operaciones utilizando dos Arrays sencillos definidos como ejemplo.

Scikit-learn

La tercera librería que vamos a revisar en este post es Scikit-learn, una de las librerías de software libre más ampliamente utilizadas para llevar a cabo tareas relativas al campo del machine learning. Esto, en gran parte, se debe a la cantidad de algoritmos de clasificación, regresión y agrupación de datos a los que da soporte de forma unificada, permitiendo su entrenamiento y su evaluación de forma sencilla, con una sintaxis muy simple y abstraída de los detalles de la implementación de dichos algoritmos. 

Además de esto, también aporta métodos para el preprocesado y la transformación de los datos previo al entrenamiento de los algoritmos, lo cual sumado a la variedad de modelos permite una experimentación rápida y eficaz

Algunos de los algoritmos y métodos que ofrece Scikit-Learn son los siguientes:

  • Aprendizaje supervisado: árboles de decisión, support vector machines (SVM), redes neuronales, K-nearest neighbor, naive bayes, regresión lineal, regresión logística, random forest, gradient boosting…
  • Aprendizaje no supervisado: K-means, DBSCAN, BIRCH, clustering aglomerativo, OPTICS…
  • Preprocesado y transformación: selección de características, imputación de valores perdidos, label encoder, one hot encoder, normalizado, reducción de la dimensionalidad…

Además de todo esto, esta librería da soporte a la definición de pipelines para concatenar y gestionar en grupo conjuntos de elementos, manteniendo de esta forma la coherencia y la consistencia del proceso de desarrollo de principio a fin. Por último, en cuanto a la evaluación de los modelos, Scikit-learn cuenta con implementaciones de las métricas más utilizadas para la mayoría de las tareas de machine learning, las cuales están integradas de una forma simple para la selección de modelos mediante búsqueda de hiperparámetros.

Un ejemplo de cómo instanciar, entrenar y evaluar un modelo de aprendizaje automático usando sólo Scikit-learn puede ser visualizado en la siguiente celda de código. En ella, se importa un conjunto de datos de ejemplo el cual es dividido en entrenamiento y evaluación, se normalizan los datos usando un escalado estándar, se entrena un random forest usando sólo el conjunto de entrenamiento y, por último, se evalúa dicho modelo utilizando como métrica el error cuadrático medio sobre el conjunto de evaluación.

Celda de código con un ejemplo completo de entrenamiento y evaluación de un modelo de machine learning usando la librería Scikit-learn.

Matplotlib

Matplotlib, a diferencia de lo anteriormente mencionado, es una librería especializada en la creación de gráficos en dos dimensiones para la visualización de datos, la cual está construida sobre los Arrays de NumPy y permite una integración sencilla con un gran número de librerías en Python como por ejemplo Pandas. 

Algunos de los tipos de gráficos para los que Matplotlib da soporte son los siguientes:

  • Histograma
  • Diagrama de barras
  • Diagrama de sectores
  • Diagrama de caja y bigotes
  • Diagrama de violín
  • Diagrama de dispersión
  • Diagrama de áreas
  • Gráfico de líneas
  • Mapa de calor

En la galería de la página web oficial de Matplotlib se pueden ver muchos ejemplos de todos estos gráficos y algunos más junto con el código asociado en Python para poder generarlos. Además de estos ejemplos, en este post hemos incluido una celda de código con la creación de un diagrama de dispersión sencillo mediante Matplotlib, en el que se ha utilizado el mismo conjunto de datos de ejemplo que se usó previamente en el apartado anterior.

Por último, cabe señalar que existen otras librerías orientadas a la creación de gráficos que utilizan Matplotlib como base, facilitando su uso y extendiendo esta para crear visualizaciones de buena calidad con la menor intervención posible, como es el caso de la librería Seaborn.

Celda de código con un diagrama de dispersión sencillo entre dos variables de un conjunto de datos de ejemplo usando Matplotlib.

TensorFlow / Keras

Podemos definir TensorFlow como una librería open-source de alto rendimiento orientada al cálculo numérico, la cual hace uso por debajo de grafos acíclicos dirigidos (DAG) para representar dichas operaciones y cómo estas se suceden unas a otras a la hora de realizar procesos complejos. 

Los tensores son objetos matemáticos que actúan como una generalización de números escalares, vectores y matrices de diferentes dimensiones y son la pieza fundamental para representar los datos en esta librería, concepto del cual TensorFlow adquiere parte de su nombre. Esta librería fue desarrollada por Google y posteriormente liberada como código abierto en 2015, momento desde el que fue ampliamente adoptada por la industria y la comunidad de investigación debido a la amplia gama de ventajas que ofrece a la hora de afrontar problemas de aprendizaje automático.

El uso de grafos para representar los cómputos a realizar hace que dichas operaciones sean totalmente independientes del código subyacente, haciendo que estas sean portables entre diferentes dispositivos y entornos, permitiendo por ejemplo desarrollar un modelo en Python, almacenarlo en algún formato intermedio, y posteriormente cargarlo en un programa de C++ de otro dispositivo para ejecutarlo de una forma más optimizada. De esta forma, puedes usar prácticamente el mismo código para ejecutar un conjunto de operaciones usando únicamente la CPU del ordenador, la tarjeta gráfica (GPU) para acelerar los cálculos, o incluso varias tarjetas gráficas de forma conjunta.

Todas estas ventajas hacen de TensorFlow una plataforma perfecta para el desarrollo de modelos de aprendizaje automático, especialmente para la construcción y el entrenamiento de redes neuronales. Es en este punto donde aparece Keras, una API diseñada para trabajar con TensorFlow que ofrece abstracciones intuitivas de alto nivel que pretenden simplificar en gran medida el desarrollo de este tipo de algoritmos, minimizando el número de acciones del usuario requeridas para la mayoría de casos de uso más comunes. Keras no sólo es capaz de trabajar y ejecutarse sobre TensorFlow, sino que también puede hacer uso de otras librerías de bajo nivel como Theano o Microsoft Cognitive Toolkit.

El uso de TensorFlow no se limita al desarrollo de modelos de aprendizaje automático, sino que también permite realizar todo tipo de tareas en relación a dicho desarrollo como las siguientes:

  • Preparación de los datos, desde la carga de estos hasta su preprocesamiento previo a la entrada de los modelos.
  • Evaluación y monitorización de la salida de los modelos de forma precisa y sencilla.
  • Ejecución de modelos en dispositivos móviles y sistemas embebidos con TensorFlow Lite.
  • Despliegue de los modelos en entornos de producción, ayudando a implementar las mejores prácticas para aplicar una metodología MLOps.
  • Exploración y uso de modelos previamente entrenados por la comunidad mediante TensorFlow Hub.

En el siguiente ejemplo se puede observar un caso de uso en el que se utiliza Keras con TensorFlow como backend para definir una red neuronal que sea capaz de resolver el mismo problema abordado previamente utilizando Scikit-learn. Para esto, primero se define una red neuronal multicapa sencilla, la cual es entrenada utilizando el conjunto de datos ya usado durante 10 épocas, para posteriormente evaluarla utilizando un método propio que nos aporta Keras.

Celda de código en la que se importa el conjunto de datos, se preprocesa y se define la red neuronal multicapa que será utilizada como modelo de regresión posteriormente.
Celda de código en la que se compila y se entrena el modelo durante 10 eṕocas utilizando el conjunto de datos de entrenamiento.
Celda de código en la que se realiza una evaluación del modelo previamente entrenado sobre el conjunto de datos de evaluación.

Scipy

La última librería que vamos a comentar en este post es Scipy, librería de código abierto que ofrece un gran número de herramientas y algoritmos matemáticos para resolver problemas de optimización, interpolación, ecuaciones algebraicas, ecuaciones diferenciales o estadística entre otros. Esta librería está construida para trabajar con Arrays de NumPy, ofreciendo una interfaz sencilla para afrontar problemas matemáticos gratuita, potente, fácil de instalar, y que puede ser utilizada en los sistemas operativos más comunes.

Una de las grandes ventajas que aporta Scipy es su gran velocidad, ya que hace uso de implementaciones altamente optimizadas escritas en lenguajes de bajo nivel como Fortran, C o C++. Esto, permite beneficiarse por un lado de la gran flexibilidad que aporta Python como lenguaje de programación sin dar de lado la velocidad de ejecución del código compilado necesaria para realizar este tipo de tareas. Además de esto, Scipy ofrece una sintaxis de alto nivel fácil de utilizar e interpretar, la cual la hace accesible y productiva tanto para programadores con poca experiencia como para profesionales.

La siguiente celda de código pretende representar un caso de uso sencillo de la librería Scipy, en el cual se pretende buscar las raíces para una ecuación matemática de segundo grado. Para esto, se hace uso del método root que proporciona Scipy, con el cual se pueden obtener las raíces para ecuaciones lineales y no lineales.

Celda de código en la que se obtiene la raíz de la ecuación definida mediante el método root de la librería Scipy.
Conclusión

Python es uno de los lenguajes de programación del momento, destacando entre otros motivos por la gran cantidad de librerías, frameworks y paradigmas que ofrece. En este post, se han revisado en detalle las funcionalidades que aportan algunas de las librerías de Python más utilizadas en el ámbito del procesamiento de datos, incidiendo en su aplicabilidad práctica y mostrando algunos ejemplos sencillos de código para familiarizar al lector con estas herramientas.

Si te ha gustado el post, te animamos a que visites la categoría Data Science para ver otros artículos similares a este y a que lo compartas en las redes sociales. ¡Hasta pronto!
Agustín Mora
Agustín Mora
Artículos: 12