Visi贸n general de los m茅todos de clasificaci贸n en Python con Scikit-Learn

    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 鈥嬧媏n 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.

     

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *