Un recorrido por los clasificadores de aprendizaje automático con scikit-learn
En este capítulo, realizaremos un recorrido por una selección de algoritmos de aprendizaje automático potentes y conocidos que se utilizan habitualmente tanto en formación como en la industria. Al tiempo que aprendemos las diferencias entre varios algoritmos de aprendizaje automático para clasificación, también desarrollaremos una apreciación intuitiva de las fortalezas y debilidades de cada uno de ellos. Además, llevaremos a cabo nuestro primer paso con la librería scikit-learn, que proporciona una interfaz intuitiva para utilizar estos algoritmos de forma eficiente y productiva.
Los temas que aprenderemos en este capítulo son los siguientes:
•Introducción a algoritmos populares y robustos para clasificación, como regresión lógica, máquinas de vectores de soporte y árboles de decisión.
•Ejemplos y explicaciones mediante la librería de aprendizaje automático scikit-learn, que proporciona una amplia variedad de algoritmos de aprendizaje automático mediante una API de Python intuitiva.
•Discusiones acerca de las fortalezas y las debilidades de los clasificadores con límites de decisión lineales y no lineales.
Elegir un algoritmo de clasificación
La elección de un algoritmo de clasificación apropiado para una tarea problemática concreta requiere práctica; cada algoritmo posee sus propias peculiaridades y está basado en determinadas suposiciones. Volviendo a plantear el teorema de No hay almuerzo gratis de David H. Wolpert, ningún clasificador único funciona mejor en todos los escenarios (The Lack of A Priori Distinctions Between Learning Algorithms, Wolpert y David H, Neural Computation 8.7 (1996): 1341-1390). A la práctica, siempre se recomienda comparar el rendimiento de, como mínimo, un puñado de algoritmos de aprendizaje distintos para seleccionar el mejor modelo para un problema concreto. Estos deben ser distintos en cuanto al número de características o muestras, la cantidad de ruido en el conjunto de datos y las propiedades de las clases (si son linealmente separables o no).
Eventualmente, el rendimiento de un clasificador, tanto de rendimiento computacional como de poder predictivo, depende sobre todo de los datos subyacentes disponibles para el aprendizaje. Los cinco pasos principales que se dan en el entrenamiento de un algoritmo de aprendizaje automático se pueden resumir en los siguientes:
1.Seleccionar características y recopilar muestras de entrenamiento.
2.Elegir una medición del rendimiento.
3.Elegir un algoritmo clasificador y de optimización.
4.Evaluar el rendimiento del modelo.
5.Afinar el algoritmo.
Como el objetivo de este libro es generar un conocimiento del aprendizaje automático paso a paso, nos centraremos sobre todo en los conceptos principales de los distintos algoritmos que aparecen en este capítulo y revisaremos temas como la selección de características y el preprocesamiento, la medición del rendimiento y el ajuste de hiperparámetros para que podamos tratarlos con mayor detalle más adelante.
Primeros pasos con scikit-learn: entrenar un perceptrón
En el Capítulo 2, Entrenar algoritmos simples de aprendizaje automático para clasificación, has conocido dos algoritmos de aprendizaje para la clasificación relacionados, la regla del perceptrón y Adaline, que hemos implementado en Python por separado. Ahora, echaremos un vistazo a la API scikit-learn, que combina una interfaz intuitiva con una implementación altamente optimizada de varios algoritmos de clasificación. La librería scikit-learn ofrece no solo una amplia variedad de algoritmos de aprendizaje, sino también diferentes funciones sencillas para preprocesar datos y ajustar con precisión y evaluar nuestros modelos. Hablaremos de ello con más detalle, junto a los conceptos subyacentes, en el Capítulo 4, Generar buenos modelos de entrenamiento - Preprocesamiento de datos y en el Capítulo 5, Comprimir datos mediante la reducción de dimensionalidad.
Para empezar con la librería scikit-learn, vamos a entrenar un modelo de perceptrón parecido al que implementamos en el Capítulo 2, Entrenar algoritmos simples de aprendizaje automático para clasificación. Para simplificar las cosas, en las siguientes secciones utilizaremos el ya conocido conjunto de datos Iris. El conjunto de datos Iris ya está disponible en scikit-learn, puesto que es un conjunto de datos popular y sencillo que se utiliza con frecuencia para probar y experimentar con algoritmos. Nosotros solo utilizaremos dos características del conjunto de datos Iris para finalidades de visualización.
Vamos a asignar la longitud del pétalo y la anchura del pétalo de 150 muestras de flores a la matriz de características X y las correspondientes etiquetas de clase de las especies de flor al vector y:
>>> from sklearn import datasets
>>> import numpy as np
>>> iris = datasets.load_iris()
>>> X = iris.data[:, [2, 3]]
>>> y = iris.target
>>> print('Class labels:', np.unique(y))
Class labels: [0 1 2]
La función np.unique(y) devuelve las tres únicas etiquetas de clase almacenadas en iris.target y, como podemos ver, los nombres de clase de la flor Iris Iris-setosa, Iris-versicolor e Iris-virginica ya se encuentran almacenados como enteros (aquí: 0, 1, 2). Aunque la mayoría de las funciones y métodos de clase de scikit-learn también funcionan con etiquetas de clase en formato de cadena, es recomendable utilizar etiquetas enteras para evitar fallos técnicos y mejorar el rendimiento computacional debido a un uso más pequeño de memoria. Además, codificar las etiquetas de clase como enteras es una convención común entre la mayoría de librerías de aprendizaje automático.
Para evaluar el buen funcionamiento de un modelo entrenado sobre datos no vistos, vamos a dividir el conjunto de datos en conjuntos de datos de prueba y entrenamiento independientes. Más adelante, en el Capítulo 6, Aprender las mejores prácticas para la evaluación de modelos y el ajuste de hiperparámetros, trataremos con más detalle las mejores prácticas en torno a la evaluación de modelos:
>>> from sklearn.model_selection import train_test_split
>>> X_train, X_test, y_train, y_test = train_test_split(
... X, y, test_size=0.3, random_state=1, stratify=y)
Mediante la función train_test_split del módulo model_selection de scikit-learn, dividimos de forma aleatoria las matrices X e y en un 30 % de datos de prueba (45 muestras) y un 70 % de datos de entrenamiento (105 muestras).
Observa que la función train_test_split ya mezcla los conjuntos de entrenamiento internamente antes de realizar la división; de no ser así, todas las muestras de clase 0 y clase 1 habrían terminado en el conjunto de entrenamiento, y el conjunto de prueba estaría compuesto por 45 muestras de la clase 2. Mediante el parámetro random_state, hemos proporcionado una semilla aleatoria fija (random_state=1) para el generador de números pseudoaleatorio interno que se utiliza para mezclar los conjuntos de datos antes de su división. Utilizar un random_state fijo como este garantiza que nuestros resultados sean reproducibles.
Por último, aprovechamos el soporte integrado para la estratificación mediante stratify=y. En este contexto, «estratificación» significa que el método train_test_split devuelve subconjuntos de prueba y de entrenamiento con las mismas proporciones que las etiquetas de clase de el conjunto de datos de entrada. Podemos utilizar la función bincount de NumPy, que cuenta los números de coincidencias de cada valor en una matriz, para verificar que este es realmente el caso:
Читать дальше