Descripción general de los métodos de clasificación en Python con Scikit-Learn

¿Eres un programador de Python que busca ingresar al aprendizaje automático? Un excelente lugar para comenzar su viaje es familiarizarse con Scikit-Learn. Haciendo...

Introducción

¿Eres un programador de Python que busca ingresar al aprendizaje automático? Un excelente lugar para comenzar su viaje es familiarizarse con Scikit-Learn.

Hacer algo de clasificación con Scikit-Learn es una forma directa y sencilla de comenzar a aplicar lo que ha aprendido, para hacer que los conceptos de aprendizaje automático sean concretos al implementarlos con una biblioteca robusta, bien documentada y fácil de usar.

¿Qué es Scikit-Learn?

{.img-responsive}

Scikit-Aprender es una biblioteca para Python que fue desarrollada por primera vez por David Cournapeau en 2007. Contiene una gama de algoritmos útiles que se pueden implementar y modificar fácilmente para el fines de clasificación y otras tareas de aprendizaje automático.

Scikit-Learn usa SciPy como base, por lo que esta pila básica de bibliotecas debe instalarse antes de poder utilizar Scikit-Learn.

Definición de nuestros términos

Antes de continuar con nuestra exploración de Scikit-Learn, tomemos un minuto para definir nuestros términos. Es importante comprender el vocabulario que se utilizará al describir las funciones de Scikit-Learn.

Para empezar, un sistema o red de aprendizaje automático toma entradas y salidas. Las entradas en el marco de aprendizaje automático a menudo se denominan "caracteristicas" .

Las características son esencialmente las mismas que las variables en un experimento científico, son características del fenómeno bajo observación que se pueden cuantificar o medir de alguna manera.

Cuando estas funciones se introducen en un marco de aprendizaje automático, la red intenta discernir patrones relevantes entre las funciones. Estos patrones se utilizan luego para generar los resultados del marco/red.

Las salidas del marco a menudo se denominan "etiquetas", ya que las características de salida tienen alguna etiqueta que les asigna la red, alguna suposición sobre en qué categoría cae la salida.

{.img-responsive}

[Credit: Educación Siyavula]{.small}

En un contexto de aprendizaje automático, la clasificación es un tipo de aprendizaje supervisado. El aprendizaje supervisado significa que los datos alimentados a la red ya están etiquetados, con las características/atributos importantes ya separados en distintas categorías de antemano.

Esto significa que la red sabe qué partes de la entrada son importantes, y también hay un objetivo o una verdad básica con la que la red puede verificarse. Un ejemplo de clasificación es clasificar un montón de plantas diferentes en diferentes categorías como helechos o angiospermas. Esa tarea podría lograrse con un Árbol de decisión, un tipo de clasificador en Scikit-Learn.

Por el contrario, el aprendizaje no supervisado es donde los datos que se envían a la red no están etiquetados y la red debe tratar de aprender por sí misma qué características son las más importantes. Como se mencionó, la clasificación es un tipo de aprendizaje supervisado y, por lo tanto, no cubriremos los métodos de aprendizaje no supervisado en este artículo.

El proceso de entrenamiento de un modelo es el proceso de introducir datos en una red neuronal y dejar que aprenda los patrones de los datos. El proceso de entrenamiento toma los datos y extrae las características del conjunto de datos. Durante el proceso de entrenamiento para una tarea de clasificación supervisada, la red pasa tanto las características como las etiquetas de los datos de entrenamiento. Sin embargo, durante las pruebas, la red solo recibe funciones.

El proceso de prueba es donde se prueban los patrones que la red ha aprendido. Las características se dan a la red, y la red debe predecir las etiquetas. Los datos de la red se dividen en conjuntos de entrenamiento y prueba, dos conjuntos diferentes de entradas. No prueba el clasificador en el mismo conjunto de datos en el que lo entrena, ya que el modelo ya ha aprendido los patrones de este conjunto de datos y sería un sesgo extremo.

En cambio, el conjunto de datos se divide en conjuntos de entrenamiento y prueba, un conjunto en el que el clasificador entrena y un conjunto que el clasificador nunca ha visto antes.

Diferentes tipos de clasificadores {# differenttypesofclassifiers}

{.img-responsive}

[Crédito: CreativeMagic]{.pequeño}

Scikit-Learn proporciona fácil acceso a numerosos algoritmos de clasificación diferentes. Entre estos clasificadores se encuentran:

Hay mucha literatura sobre cómo funcionan estos diversos clasificadores, y se pueden encontrar breves explicaciones de ellos en [Sitio web de Scikit-Learn] (https://scikit-learn.org/stable/user_guide.html).

Por esta razón, no profundizaremos demasiado en cómo funcionan aquí, pero habrá una breve explicación de cómo funciona el clasificador.

K-Vecinos más cercanos

{.img-responsive}

[Crédito: Acción anterior An Aj]{.small}

K-vecinos más cercanos opera comprobando la distancia de algún ejemplo de prueba a los valores conocidos de algún ejemplo de entrenamiento. El grupo de puntos de datos/clase que daría la distancia más pequeña entre los puntos de entrenamiento y el punto de prueba es la clase que se selecciona.

Árboles de decisión

Un Clasificador de árboles de decisión funciona dividiendo un conjunto de datos en subconjuntos cada vez más pequeños en función de diferentes criterios. Se utilizarán diferentes criterios de clasificación para dividir el conjunto de datos, y la cantidad de ejemplos se reducirá con cada división.

Una vez que la red haya dividido los datos en un ejemplo, el ejemplo se colocará en una clase que corresponde a una clave. Cuando varios clasificadores de bosques aleatorios están vinculados entre sí, se denominan Clasificadores de bosques aleatorios.

Bayes ingenuo {#bayes ingenuos}

Un Clasificador Naive Bayes determina la probabilidad de que un ejemplo pertenezca a alguna clase, calculando la probabilidad de que ocurra un evento dado que ha ocurrido algún evento de entrada.

Cuando hace este cálculo se supone que todos los predictores de una clase tienen el mismo efecto sobre el resultado, que los predictores son independientes.

Análisis Discriminante Lineal

Análisis Discriminante Lineal funciona reduciendo la dimensionalidad del conjunto de datos, proyectando todos los puntos de datos en una línea. Luego combina estos puntos en clases según su distancia desde un punto o centroide elegido.

El análisis discriminante lineal, como puede adivinar, es un algoritmo de clasificación lineal y se utiliza mejor cuando los datos tienen una relación lineal.

Máquinas de vectores de soporte

{.img-responsive}

[Crédito: Qluong2016]{.pequeño}

Las máquinas de vectores de soporte funcionan dibujando una línea entre los diferentes grupos de puntos de datos para agruparlos en clases. Los puntos de un lado de la línea serán de una clase y los puntos del otro lado pertenecerán a otra clase.

El clasificador intentará maximizar la distancia entre la línea que dibuja y los puntos a ambos lados de ella, para aumentar su confianza en qué puntos pertenecen a qué clase. Cuando se trazan los puntos de prueba, el lado de la línea en el que caen es la clase en la que se ubican.

Regresión logística

Regresión logística genera predicciones sobre puntos de datos de prueba en una escala binaria, cero o uno. Si el valor de algo es 0,5 o superior, se clasifica como perteneciente a la clase 1, mientras que por debajo de 0,5 si se clasifica como perteneciente a la clase 0.

Cada una de las características también tiene una etiqueta de solo 0 o 1. La regresión logística es un clasificador lineal y, por lo tanto, se usa cuando existe algún tipo de relación lineal entre los datos.

Ejemplos de tareas de clasificación

Las tareas de clasificación son aquellas tareas en las que pones ejemplos en dos o más clases. Determinar si una imagen es un gato o un perro es una tarea de clasificación, al igual que determinar la calidad de una botella de vino en función de características como la acidez y el contenido de alcohol.

Dependiendo de la tarea de clasificación en cuestión, querrá usar diferentes clasificadores. Por ejemplo, un modelo de regresión logística es más adecuado para tareas de clasificación binaria, aunque existen varios modelos de regresión logística de variables.

A medida que adquiera más experiencia con los clasificadores, desarrollará un mejor sentido de cuándo usar qué clasificador. Sin embargo, una práctica común es crear instancias de múltiples clasificadores y comparar su rendimiento entre sí, luego seleccionar el clasificador que funciona mejor.

Implementación de un clasificador

Ahora que hemos discutido los diversos clasificadores a los que Scikit-Learn brinda acceso, veamos cómo implementar un clasificador.

El primer paso para implementar un clasificador es importar el clasificador que necesita a Python. Veamos la declaración de importación para la regresión logística:

1
from sklearn.linear_model import LogisticRegression

Aquí están las declaraciones de importación para los otros clasificadores discutidos en este artículo:

1
2
3
4
5
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC

Scikit-Learn también tiene otros clasificadores, y sus respectivas páginas de documentación mostrarán cómo importarlos.

Después de esto, el clasificador debe ser instanciado. La creación de instancias es el proceso de hacer que el clasificador exista dentro de su programa Python, para crear una instancia del clasificador/objeto.

Esto generalmente se hace simplemente creando una variable y llamando a la función asociada con el clasificador:

1
logreg_clf = LogisticRegression()

Ahora el clasificador necesita ser entrenado. Para lograr esto, el clasificador debe ajustarse a los datos de entrenamiento.

Las funciones de entrenamiento y las etiquetas de entrenamiento se pasan al clasificador con el comando fit:

1
logreg_clf.fit(features, labels)

Una vez que el modelo clasificador se ha entrenado con los datos de entrenamiento, puede hacer predicciones con los datos de prueba.

Esto se hace fácilmente llamando al comando de predicción en el clasificador y proporcionándole los parámetros que necesita para hacer predicciones, cuáles son las características en su conjunto de datos de prueba:

1
logreg_clf.predict(test_features)

Estos pasos: creación de instancias, ajuste/entrenamiento y predicción son el flujo de trabajo básico para los clasificadores en Scikit-Learn.

Sin embargo, el manejo de los clasificadores es solo una parte de clasificar con Scikit-Learn. La otra mitad de la clasificación en Scikit-Learn es el manejo de datos.

Para entender cómo el manejo del clasificador y el manejo de datos se unen como una tarea de clasificación completa, tomemos un momento para comprender la tubería de aprendizaje automático.

La tubería de aprendizaje automático {#la tubería de aprendizaje automático}

La canalización de aprendizaje automático tiene los siguientes pasos: preparación de datos, creación de conjuntos de entrenamiento/prueba, creación de instancias del clasificador, entrenamiento del clasificador, realización de predicciones, evaluación del rendimiento, ajuste de parámetros.

El primer paso para entrenar un clasificador en un conjunto de datos es preparar el conjunto de datos, para obtener los datos en la forma correcta para el clasificador y manejar cualquier anomalía en los datos. Si faltan valores en los datos, valores atípicos en los datos o cualquier otra anomalía, estos puntos de datos deben manejarse, ya que pueden afectar negativamente el rendimiento del clasificador. Este paso se conoce como preprocesamiento de datos.

Una vez que los datos han sido preprocesados, los datos deben dividirse en conjuntos de entrenamiento y prueba. Anteriormente hemos discutido la justificación para crear conjuntos de entrenamiento y prueba, y esto se puede hacer fácilmente en Scikit-Learn con una función útil llamada [tren_prueba_dividir](https://scikit-learn.org/stable/modules/generated/sklearn. model_selection.train_test_split.html).

Como se discutió anteriormente, el clasificador tiene que ser instanciado y entrenado en los datos de entrenamiento. Después de esto, se pueden hacer predicciones con el clasificador. Al comparar las predicciones hechas por el clasificador con los valores reales conocidos de las etiquetas en sus datos de prueba, puede obtener una medida de qué tan preciso es el clasificador.

Existen varios métodos que comparan las etiquetas hipotéticas con las etiquetas reales y evalúan el clasificador. Revisaremos estas diferentes métricas de evaluación más adelante. Por ahora, sepa que después de haber medido la precisión del clasificador, probablemente volverá atrás y modificará los parámetros de su modelo hasta que alcance una precisión con la que esté satisfecho (ya que es poco probable que su clasificador cumpla con sus requisitos). expectativas en la primera carrera).

Veamos un ejemplo de la tubería de aprendizaje automático, que va desde el manejo de datos hasta la evaluación.

Implementación de clasificación de muestra {#implementación de clasificación de muestra}

1
2
3
4
5
6
7
# Begin by importing all necessary libraries
import pandas as pd
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix
from sklearn.metrics import accuracy_score
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC

Debido a que el conjunto de datos del iris es tan común, Scikit-Learn ya lo tiene disponible para cargarlo con el siguiente comando:

1
sklearn.datasets.load_iris

Sin embargo, estaremos cargando el CSV archivo aquí, para que pueda ver cómo cargar y preprocesar datos. Puedes descargar el archivo csv aquí.

Simplemente coloque el archivo de datos en el mismo directorio que su archivo de Python. La biblioteca pandas tiene una manera fácil de cargar datos, read_csv():

1
2
3
4
5
data = pd.read_csv('iris.csv')
    
# It is a good idea to check and make sure the data is loaded as expected.
    
print(data.head(5))

Debido a que el conjunto de datos se ha preparado tan bien, no necesitamos hacer mucho procesamiento previo. Una cosa que podemos querer hacer es dejar caer la columna "ID", ya que es solo una representación de la fila en la que se encuentra el ejemplo.

Como esto no es útil, podemos eliminarlo del conjunto de datos usando la función drop():

1
data.drop('Id', axis=1, inplace=True)

Ahora necesitamos definir las características y las etiquetas. Podemos hacer esto fácilmente con Pandas cortando la tabla de datos y eligiendo ciertas filas/columnas con iloc():

1
2
3
4
# Pandas ".iloc" expects row_indexer, column_indexer  
X = data.iloc[:,:-1].values
# Now let's tell the dataframe which column we want for the target/labels.  
y = data['Species']

La notación de corte anterior selecciona cada fila y cada columna excepto la última columna (que es nuestra etiqueta, la especie).

Alternativamente, puede seleccionar ciertas características del conjunto de datos que le interesan usando la notación de paréntesis y pasando encabezados de columna:

1
2
# Alternate way of selecting columns:
X = data.iloc['SepalLengthCm', 'SepalWidthCm', 'PetalLengthCm']

Ahora que tenemos las funciones y etiquetas que queremos, podemos dividir los datos en conjuntos de entrenamiento y prueba usando la práctica función train_test_split() de sklearn:

1
2
3
4
# Test size specifies how much of the data you want to set aside for the testing set. 
# Random_state parameter is just a random seed we can use.
# You can use it if you'd like to reproduce these specific results.
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=27)

Es posible que desee imprimir los resultados para asegurarse de que sus datos se analicen como espera:

1
2
print(X_train)  
print(y_train)

Ahora podemos instanciar los modelos. Intentemos usar dos clasificadores, un clasificador de vectores de soporte y un clasificador de vecinos más cercanos:

1
2
3
4
SVC_model = svm.SVC()
# KNN model requires you to specify n_neighbors,
# the number of points the classifier will look at to determine what class a new point belongs to
KNN_model = KNeighborsClassifier(n_neighbors=5)

Ahora ajustemos los clasificadores:

1
2
SVC_model.fit(X_train, y_train)
KNN_model.fit(X_train, y_train)

La llamada ha entrenado el modelo, por lo que ahora podemos predecir y almacenar la predicción en una variable:

1
2
SVC_prediction = SVC_model.predict(X_test)
KNN_prediction = KNN_model.predict(X_test)

Ahora deberíamos evaluar cómo se desempeñó el clasificador. Hay varios métodos para evaluar el rendimiento de un clasificador, y puede leer más sobre los diferentes métodos a continuación.

En Scikit-Learn, simplemente pasa las predicciones contra las etiquetas de verdad del terreno que se almacenaron en sus etiquetas de prueba:

1
2
3
4
5
6
# Accuracy score is the simplest way to evaluate
print(accuracy_score(SVC_prediction, y_test))
print(accuracy_score(KNN_prediction, y_test))
# But Confusion Matrix and Classification Report give more details about performance
print(confusion_matrix(SVC_prediction, y_test))
print(classification_report(KNN_prediction, y_test))

Como referencia, aquí está el resultado que obtuvimos en las métricas:

1
2
SVC accuracy: 0.9333333333333333
KNN accuracy: 0.9666666666666667

A primera vista, parece que KNN se desempeñó mejor. Aquí está la matriz de confusión para SVC:

1
2
3
[[ 7  0  0]
 [ 0 10  1]
 [ 0  1 11]]

Esto puede ser un poco difícil de interpretar, pero la cantidad de predicciones correctas para cada clase se ejecuta en la diagonal de arriba a la izquierda a abajo a la derecha. Consulte a continuación para obtener más información sobre esto.

Finalmente, aquí está el resultado del informe de clasificación para KNN:

1
2
3
4
5
6
7
8
9
precision    recall  f1-score   support
    
Iris-setosa       1.00      1.00      1.00         7
Iris-versicolor       0.91      0.91      0.91        11
Iris-virginica       0.92      0.92      0.92        12
    
micro avg       0.93      0.93      0.93        30
macro avg       0.94      0.94      0.94        30
weighted avg       0.93      0.93      0.93        30

Evaluación del clasificador

Cuando se trata de la evaluación de su clasificador, hay varias formas diferentes de medir su rendimiento.

Precisión de clasificación

Precisión de clasificación es el más simple de todos los métodos para evaluar la precisión y el más utilizado. La precisión de clasificación es simplemente el número de predicciones correctas dividido por todas las predicciones o una proporción de predicciones correctas a predicciones totales.

Si bien puede brindarle una idea rápida del rendimiento de su clasificador, se utiliza mejor cuando la cantidad de observaciones/ejemplos en cada clase es aproximadamente equivalente. Debido a que esto no sucede muy a menudo, probablemente sea mejor que utilice otra métrica.

Pérdida logarítmica

Pérdida logarítmica, o LogLoss, evalúa esencialmente la confianza del clasificador en sus predicciones. LogLoss devuelve las probabilidades de pertenencia de un ejemplo a una clase dada, sumándolas para dar una representación de la confianza general del clasificador.

El valor de las predicciones va de 1 a 0, siendo 1 completamente seguro y 0 sin confianza. La pérdida, o falta de confianza general, se devuelve como un número negativo, donde 0 representa un clasificador perfecto, por lo que los valores más pequeños son mejores.

Área bajo la curva ROC (AUC)

Esta es una métrica utilizada solo para problemas de clasificación binaria. El área bajo la curva representa la capacidad del modelo para discriminar adecuadamente entre ejemplos negativos y positivos, entre una clase u otra.

Un 1,0, toda el área que cae bajo la curva, representa un clasificador perfecto. Esto significa que un AUC de 0,5 es básicamente tan bueno como adivinar al azar. La curva ROC se calcula con respecto a la sensibilidad (tasa/recordatorio de verdaderos positivos) y la especificidad (tasa de verdaderos negativos). Puedes leer más sobre estos cálculos en este artículo sobre la curva ROC.

Matriz de confusión

Una matriz de confusión es una tabla o gráfico que representa la precisión de un modelo con respecto a dos o más clases. Las predicciones del modelo estarán en el eje X, mientras que los resultados/la precisión se ubicarán en el eje Y.

Las celdas se llenan con el número de predicciones que hace el modelo. Las predicciones correctas se pueden encontrar en una línea diagonal que se mueve desde la parte superior izquierda hacia la parte inferior derecha. Puede leer más sobre la interpretación de una matriz de confusión aquí.

Informe de clasificación

El informe de clasificación es una métrica integrada de Scikit-Learn creada especialmente para problemas de clasificación. El uso del informe de clasificación puede brindarle una rápida intuición del rendimiento de su modelo. Recall compara la cantidad de ejemplos que su modelo etiquetó como Clase A (alguna clase determinada) con la cantidad total de ejemplos de Clase A, y esto se representa en el informe.

El informe también devuelve la predicción y la puntuación f1. La precisión es el porcentaje de ejemplos que su modelo etiquetó como Clase A que en realidad pertenecían a la Clase A (positivos verdaderos frente a falsos positivos), y la puntuación f1 es un promedio de precisión y recuperación.

Yendo más lejos: proyecto de extremo a extremo portátil

¿Tu naturaleza inquisitiva te hace querer ir más allá? Recomendamos consultar nuestro Proyecto guiado: ["Predicción práctica del precio de la vivienda: aprendizaje automático en Python"](https://wikihtp.com/courses/hands-on-house- precio-predicción-aprendizaje-máquina-en-python/#cta){target="_blank"}.

[](https://wikihtp.com/ cursos/predicción-de-precio-de-la-casa-práctica-aprendizaje-de-máquina-en-python/#cta)

En este proyecto guiado, aprenderá a crear potentes modelos tradicionales de aprendizaje automático, así como modelos de aprendizaje profundo, utilizar Ensemble Learning y capacitar a los meta-aprendices para predecir los precios de la vivienda a partir de una bolsa de modelos Scikit-Learn y Keras.

Con Keras, la API de aprendizaje profundo creada sobre Tensorflow, experimentaremos con arquitecturas, crearemos un conjunto de modelos apilados y entrenaremos una red neuronal meta-aprendizaje (modelo de nivel 1) para calcular el precio de un casa.

El aprendizaje profundo es sorprendente, pero antes de recurrir a él, se recomienda intentar resolver el problema con técnicas más simples, como los algoritmos de aprendizaje superficial. Nuestro rendimiento de referencia se basará en un algoritmo de Regresión de bosque aleatorio. Además, exploraremos la creación de conjuntos de modelos a través de Scikit-Learn a través de técnicas como embalaje y votación.

Este es un proyecto integral y, como todos los proyectos de aprendizaje automático, comenzaremos con Análisis exploratorio de datos, seguido de Preprocesamiento de datos y, finalmente, Creación de modelos superficiales y Aprendizaje profundo para ajustarse a los datos que hemos explorado y limpiado previamente.

Conclusión

Para profundizar en su comprensión de Scikit-Learn, sería una buena idea aprender más sobre los diferentes algoritmos de clasificación disponibles. Una vez que comprenda estos algoritmos, lea más sobre cómo evaluar clasificadores.

Muchos de los matices de la clasificación solo se obtienen con el tiempo y la práctica, pero si sigue los pasos de esta guía, estará bien encaminado para convertirse en un experto en tareas de clasificación con Scikit-Learn.