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

V

Introducción

¿Es usted un programador de Python que busca ingresar al Machine Learning? Un excelente lugar para comenzar su viaje es familiarizarse con Scikit-Learn.

Hacer alguna clasificación con Scikit-Learn es una forma sencilla y directa de comenzar a aplicar lo que ha aprendido, para concretar conceptos de Machine Learning implementándolos con una biblioteca robusta, bien documentada y fácil de usar.

¿Qué es Scikit-Learn?

Scikit-Learn es una biblioteca para Python que fue desarrollada por primera vez por David Cournapeau en 2007. Contiene una variedad de algoritmos útiles que pueden implementarse y ajustarse fácilmente con fines de clasificación y otras tareas de Machine Learning.

Scikit-Learn utiliza SciPy como base, por lo que esta pila base de bibliotecas debe instalarse antes de que se pueda 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 Machine Learning toma entradas y salidas. Las entradas en el marco de Machine Learning a menudo se denominan “características” .

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 pueden cuantificarse o medirse de alguna manera.

Cuando estas características se introducen en un marco de Machine Learning, la red intenta discernir patrones relevantes entre las características. 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 da la red, alguna suposición sobre en qué categoría cae la salida.

Crédito: Educación Siyavula

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

Esto significa que la red sabe qué partes de la entrada son importantes y también hay un objetivo o una verdad de tierra con la que la red se puede verificar. 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 decisiones, un tipo de clasificador en Scikit-Learn.

Por el contrario, el aprendizaje no supervisado es donde los datos que ingresan a la red no están etiquetados y la red debe intentar aprender por sí misma qué características son 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 supervisados ​​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, a la red se le pasan 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 le 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 se entrena el clasificador y un conjunto que el clasificador nunca ha visto antes.

Diferentes tipos de clasificadores

Crédito: CreativeMagic

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

  • K-vecinos más cercanos
  • Máquinas de vectores de soporte
  • Clasificadores de árboles de decisión / bosques aleatorios
  • Bayes ingenuo
  • Análisis discriminante lineal
  • Regresión logística

Existe mucha literatura sobre cómo funcionan estos diversos clasificadores, y se pueden encontrar breves explicaciones de ellos en el sitio web de Scikit-Learn .

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

Crédito: Antti Ajanki AnAj

K-Neighbors más cercano funciona comprobando la distancia entre algún ejemplo de prueba y los valores conocidos de algún ejemplo de entrenamiento. El grupo de puntos / clase de datos 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 árbol de decisión funciona dividiendo un conjunto de datos en subconjuntos cada vez más pequeños según diferentes criterios. Se utilizarán diferentes criterios de clasificación para dividir el conjunto de datos, y el número de ejemplos se reducirá con cada división.

Una vez que la red ha dividido los datos en un ejemplo, el ejemplo se colocará en una clase que corresponda a una clave. Cuando se vinculan varios clasificadores de bosque aleatorios, se denominan clasificadores de bosque aleatorios.

Bayes ingenuo

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 asume que todos los predictores de una clase tienen el mismo efecto en el resultado, que los predictores son independientes.

Análisis discriminante lineal

El 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 en función de 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

Crédito: Qluong2016

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

El clasificador intentará maximizar la distancia entre la línea que dibuja y los puntos a cada lado 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 colocan.

Regresión logística

La 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 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 cualquier tarea que le pida poner 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 cuál es 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á utilizar diferentes clasificadores. Por ejemplo, un modelo de regresión logística es más adecuado para tareas de clasificación binaria, aunque existen modelos de regresión logística de múltiples 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 desempeño entre sí, luego seleccionar el clasificador que funcione mejor.

Implementando un clasificador

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

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

from sklearn.linear_model import LogisticRegression

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

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, se debe crear una instancia del clasificador. La instanciación es el proceso de hacer que el clasificador exista dentro de su programa Python, para crear una instancia del clasificador / objeto.

Normalmente, esto se hace simplemente creando una variable y llamando a la función asociada con el clasificador:

logreg_clf = LogisticRegression()

Ahora es necesario entrenar al clasificador. 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 fitcomando:

logreg_clf.fit(features, labels)

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

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

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 clasificadores es solo una parte de la clasificación con Scikit-Learn. La otra mitad de la clasificación en Scikit-Learn es el manejo de datos.

Para comprender cómo el manejo del clasificador y el manejo de datos se combinan como una tarea de clasificación completa, tomemos un momento para comprender la canalización del Machine Learning.

La canalización del Machine Learning

La canalización de Machine Learning tiene los siguientes pasos: preparar datos, crear conjuntos de entrenamiento / prueba, instanciar el clasificador, entrenar al clasificador, hacer predicciones, evaluar el rendimiento, ajustar 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 hay valores faltantes 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 discutimos el fundamento para crear conjuntos de entrenamiento y prueba, y esto se puede hacer fácilmente en Scikit-Learn con una función útil llamada train_test_split .

Como se discutió anteriormente, el clasificador debe 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 la precisión del clasificador.

Hay varios métodos que comparan las etiquetas hipotéticas con las etiquetas reales y evalúan el clasificador. Repasaremos 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 retrocederá y ajustará los parámetros de su modelo hasta que haya alcanzado una precisión con la que esté satisfecho (ya que es poco probable que su clasificador cumpla con sus expectativas en el primer momento). correr).

Veamos un ejemplo de la canalización del Machine Learning, desde el manejo de datos hasta la evaluación.

Implementación de clasificación de muestra

# 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 de iris es tan común, Scikit-Learn ya lo tiene, disponible para cargar con el siguiente comando:

sklearn.datasets.load_iris

Sin embargo, cargaremos el archivo CSV aquí, para que pueda ver cómo cargar y preprocesar los datos. Puede descargar el archivo csv aquí .

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

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. Es posible que queramos hacer una cosa aunque elimine 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, podríamos eliminarlo del conjunto de datos usando la drop()función:

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

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

# 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 utilizando la notación entre corchetes y pasando los encabezados de columna:

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

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

# 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 estén analizando como espera:

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 K-vecinos más cercanos:

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:

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:

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

Ahora deberíamos evaluar cómo se comportó el clasificador. Existen 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:

# 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 sobre las métricas:

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:

[[ 7  0  0]
 [ 0 10  1]
 [ 0  1 11]]

Esto puede ser un poco difícil de interpretar, pero el número 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 de KNN:

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

Evaluar el clasificador

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

Precisión de clasificación

La precisión de la 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 la 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 darle una idea rápida de cómo se está desempeñando su clasificador, es mejor usarlo cuando el número de observaciones / ejemplos en cada clase es aproximadamente equivalente. Debido a que esto no sucede muy a menudo, probablemente sea mejor que use otra métrica.

Pérdida logarítmica

Logarithmic Loss , o LogLoss, esencialmente evalúa la confianza que tiene el clasificador en sus predicciones. LogLoss devuelve probabilidades de pertenencia a un ejemplo en una clase determinada, sumándolos 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 con 0 representando un clasificador perfecto, por lo que los valores más pequeños son mejores.

Área bajo curva ROC (AUC)

Esta es una métrica que se usa solo para problemas de clasificación binaria. El área debajo de 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 debajo de 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 / recuerdo de verdaderos positivos) y especificidad (tasa de verdaderos negativos). Puede 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 / precisión se ubicarán en el eje Y.

Las celdas se llenan con la cantidad 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 darle una idea rápida de cómo se está desempeñando su modelo. Recordar 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 predicción y puntuación f1. La precisión es el porcentaje de ejemplos que su modelo etiquetó como Clase A que realmente pertenecían a la Clase A (verdaderos positivos contra falsos positivos), y la puntuación f1 es un promedio de precisión y recuperación.

Conclusión

Para ampliar 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.

 

About the author

Ramiro de la Vega

Bienvenido a Pharos.sh

Soy Ramiro de la Vega, Estadounidense con raíces Españolas. Empecé a programar hace casi 20 años cuando era muy jovencito.

Espero que en mi web encuentres la inspiración y ayuda que necesitas para adentrarte en el fantástico mundo de la programación y conseguir tus objetivos por difíciles que sean.

Add comment

Sobre mi

Últimos Post

Etiquetas

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con tus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, aceptas el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad