Implementaci贸n de SVM y Kernel SVM con Scikit-Learn de Python

    UN m谩quinas de vectores soporte (SVM) es un tipo de algoritmo de clasificaci贸n de Machine Learning supervisado. Las SVM se introdujeron inicialmente en la d茅cada de 1960 y luego se perfeccionaron en la d茅cada de 1990. Sin embargo, es solo ahora que se est谩n volviendo extremadamente populares, debido a su capacidad para lograr resultados brillantes. Las SVM se implementan de una manera 煤nica en comparaci贸n con otros algoritmos de Machine Learning.

    En este art铆culo veremos qu茅 son los algoritmos de m谩quinas de vectores de soporte, la breve teor铆a detr谩s de la m谩quina de vectores de soporte y su implementaci贸n en la biblioteca Scikit-Learn de Python. Luego avanzaremos hacia un concepto avanzado de SVM, conocido como Kernel SVM, y tambi茅n lo implementaremos con la ayuda de Scikit-Learn.

    SVM simple

    En el caso de datos separables linealmente en dos dimensiones, como se muestra en la Figura 1, un algoritmo de Machine Learning t铆pico intenta encontrar un l铆mite que divida los datos de tal manera que se pueda minimizar el error de clasificaci贸n err贸nea. Si observa de cerca la Fig. 1, puede haber varios l铆mites que dividan correctamente los puntos de datos. Las dos l铆neas discontinuas y una l铆nea continua clasifican los datos correctamente.

    Fig 1: L铆mites de decisi贸n m煤ltiple

    SVM se diferencia de los otros algoritmos de clasificaci贸n en la forma en que elige el l铆mite de decisi贸n que maximiza la distancia desde los puntos de datos m谩s cercanos de todas las clases. Una SVM no solo encuentra un l铆mite de decisi贸n; encuentra el l铆mite de decisi贸n m谩s 贸ptimo.

    El l铆mite de decisi贸n m谩s 贸ptimo es el que tiene un margen m谩ximo desde los puntos m谩s cercanos de todas las clases. Los puntos m谩s cercanos al l铆mite de decisi贸n que maximizan la distancia entre el l铆mite de decisi贸n y los puntos se denominan vectores de apoyo, como se ve en la figura 2. El l铆mite de decisi贸n en el caso de m谩quinas de vectores de apoyo se denomina clasificador de margen m谩ximo, o hiperplano de margen m谩ximo. .

    Fig 2: L铆mite de decisi贸n con vectores de soporte

    Hay matem谩ticas complejas involucradas detr谩s de encontrar los vectores de soporte, calcular el margen entre el l铆mite de decisi贸n y los vectores de soporte y maximizar este margen. En este tutorial no entraremos en detalles de las matem谩ticas, m谩s bien veremos c贸mo se implementan SVM y Kernel SVM a trav茅s de la biblioteca Python Scikit-Learn.

    Implementaci贸n de SVM con Scikit-Learn

    El conjunto de datos que vamos a usar en esta secci贸n es el mismo que usamos en la secci贸n de clasificaci贸n del tutorial del 谩rbol de decisiones.

    Nuestra tarea es predecir si un billete de moneda bancaria es aut茅ntico o no bas谩ndonos en cuatro atributos del billete, es decir, la asimetr铆a de la imagen transformada wavelet, la variaci贸n de la imagen, la entrop铆a de la imagen y la curtosis de la imagen. Este es un problema de clasificaci贸n binaria y usaremos el algoritmo SVM para resolver este problema. El resto de la secci贸n consta de pasos est谩ndar de Machine Learning.

    Importaci贸n de bibliotecas

    El siguiente script importa las bibliotecas necesarias:

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    %matplotlib inline
    

    Importar el conjunto de datos

    Los datos est谩n disponibles para su descarga en el siguiente enlace:

    https://drive.google.com/file/d/13nw-uRXPY8XIZQxKRNZ3yYlho-CYm_Qt/view

    La informaci贸n detallada sobre los datos est谩 disponible en el siguiente enlace:

    https://archive.ics.uci.edu/ml/datasets/banknote+authentication

    Descargue el conjunto de datos del enlace de Google Drive y gu谩rdelo localmente en su m谩quina. Para este ejemplo, el archivo CSV para el conjunto de datos se almacena en la carpeta “Conjuntos de datos” de la unidad D en mi computadora con Windows. El script lee el archivo de esta ruta. Puede cambiar la ruta del archivo de su computadora en consecuencia.

    Para leer datos de un archivo CSV, la forma m谩s sencilla es utilizar read_csv m茅todo de la biblioteca de pandas. El siguiente c贸digo lee datos de billetes de moneda bancaria en el marco de datos de pandas:

    bankdata = pd.read_csv("D:/Datasets/bill_authentication.csv")
    

    An谩lisis exploratorio de datos

    Hay formas pr谩cticamente ilimitadas de analizar conjuntos de datos con una variedad de bibliotecas de Python. En aras de la simplicidad, solo verificaremos las dimensiones de los datos y veremos los primeros registros. Para ver las filas y columnas y de los datos, ejecute el siguiente comando:

    bankdata.shape
    

    En la salida ver谩 (1372,5). Esto significa que el conjunto de datos de billetes de banco tiene 1372 filas y 5 columnas.

    Para tener una idea de c贸mo se ve realmente nuestro conjunto de datos, ejecute el siguiente comando:

    bankdata.head()
    

    La salida se ver谩 as铆:

    Clase de entrop铆a de curtosis de asimetr铆a de varianza

    03.621608.6661-2,8073-0,446990
    14.545908.1674-2,4586-1.462100
    23.86600-2,63831.92420.106450
    33.456609.5228-4.0112-3.594400
    40.32924-4.45524.5718-0,988800

    Puede ver que todos los atributos del conjunto de datos son num茅ricos. La etiqueta tambi茅n es num茅rica, es decir, 0 y 1.

    Preprocesamiento de datos

    El preprocesamiento de datos implica (1) dividir los datos en atributos y etiquetas y (2) dividir los datos en conjuntos de entrenamiento y prueba.

    Para dividir los datos en atributos y etiquetas, ejecute el siguiente c贸digo:

    X = bankdata.drop('Class', axis=1)
    y = bankdata['Class']
    

    En la primera l铆nea del script anterior, todas las columnas del bankdata el marco de datos se almacena en el X variable excepto la columna “Clase”, que es la columna de la etiqueta. los drop() m茅todo elimina esta columna.

    En la segunda l铆nea, solo la columna de clase se almacena en el y variable. En este momento X variable contiene atributos mientras y variable contiene las etiquetas correspondientes.

    Una vez que los datos se dividen en atributos y etiquetas, el 煤ltimo paso previo al procesamiento es dividir los datos en conjuntos de entrenamiento y prueba. Afortunadamente, el model_selection biblioteca de la biblioteca Scikit-Learn contiene la train_test_split m茅todo que nos permite dividir sin problemas los datos en conjuntos de prueba y entrenamiento.

    Ejecute el siguiente script para hacerlo:

    from sklearn.model_selection import train_test_split
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.20)
    

    Entrenando el algoritmo

    Hemos dividido los datos en conjuntos de entrenamiento y prueba. Ahora es el momento de entrenar a nuestro SVM en los datos de entrenamiento. Scikit-Learn contiene el svm biblioteca, que contiene clases integradas para diferentes algoritmos SVM. Dado que vamos a realizar una tarea de clasificaci贸n, usaremos la clase de clasificador de vectores de soporte, que se escribe como SVC en el Scikit-Learn’s svm biblioteca. Esta clase toma un par谩metro, que es el tipo de kernel. Esto es muy importante. En el caso de una SVM simple, simplemente establecemos este par谩metro como “lineal”, ya que las SVM simples solo pueden clasificar datos separables linealmente. Veremos n煤cleos no lineales en la siguiente secci贸n.

    los fit Se llama al m茅todo de la clase SVC para entrenar el algoritmo en los datos de entrenamiento, que se pasan como un par谩metro al fit m茅todo. Ejecute el siguiente c贸digo para entrenar el algoritmo:

    from sklearn.svm import SVC
    svclassifier = SVC(kernel="linear")
    svclassifier.fit(X_train, y_train)
    

    Haciendo predicciones

    Para hacer predicciones, el predict m茅todo del SVC se utiliza la clase. Eche un vistazo al siguiente c贸digo:

    y_pred = svclassifier.predict(X_test)
    

    Evaluar el algoritmo

    La matriz de confusi贸n, la precisi贸n, la recuperaci贸n y las medidas F1 son las m茅tricas m谩s utilizadas para las tareas de clasificaci贸n. Scikit-Learn’s metrics biblioteca contiene el classification_report y confusion_matrix m茅todos, que se pueden utilizar f谩cilmente para averiguar los valores de estas m茅tricas importantes.

    Aqu铆 est谩 el c贸digo para encontrar estas m茅tricas:

    from sklearn.metrics import classification_report, confusion_matrix
    print(confusion_matrix(y_test,y_pred))
    print(classification_report(y_test,y_pred))
    

    Resultados

    Los resultados de la evaluaci贸n son los siguientes:

    [[152    0]
     [  1  122]]
                  precision   recall   f1-score   support
    
               0       0.99     1.00       1.00       152
               1       1.00     0.99       1.00       123
    
    avg / total        1.00     1.00       1.00       275
    

    De los resultados se puede observar que SVM super贸 ligeramente el algoritmo del 谩rbol de decisi贸n. Solo hay una clasificaci贸n err贸nea en el caso del algoritmo SVM en comparaci贸n con cuatro clasificaciones err贸neas en el caso del algoritmo del 谩rbol de decisi贸n.

    SVM de kernel

    En la secci贸n anterior vimos c贸mo se puede utilizar el algoritmo SVM simple para encontrar el l铆mite de decisi贸n para datos separables linealmente. Sin embargo, en el caso de datos separables de forma no lineal, como el que se muestra en la Fig. 3, no se puede utilizar una l铆nea recta como l铆mite de decisi贸n.

    Fig 3: Datos separables de forma no lineal

    En el caso de datos separables de forma no lineal, no se puede utilizar el algoritmo SVM simple. M谩s bien, se utiliza una versi贸n modificada de SVM, llamada Kernel SVM.

    B谩sicamente, el kernel SVM proyecta las dimensiones inferiores de los datos separables no linealmente a datos separables linealmente en dimensiones superiores de tal manera que los puntos de datos que pertenecen a clases diferentes se asignan a dimensiones diferentes. Nuevamente, hay matem谩ticas complejas involucradas en esto, pero no tiene que preocuparse por eso para usar SVM. M谩s bien, podemos simplemente usar la biblioteca Scikit-Learn de Python para implementar y usar el kernel SVM.

    Implementaci贸n de Kernel SVM con Scikit-Learn

    La implementaci贸n de Kernel SVM con Scikit-Learn es similar a la simple SVM. En esta secci贸n, usaremos los famosos conjunto de datos de iris para predecir la categor铆a a la que pertenece una planta bas谩ndose en cuatro atributos: ancho del s茅palo, largo del s茅palo, ancho del p茅talo y largo del p茅talo.

    El conjunto de datos se puede descargar desde el siguiente enlace:

    https://archive.ics.uci.edu/ml/datasets/iris4

    El resto de los pasos son pasos t铆picos de Machine Learning y necesitan muy poca explicaci贸n hasta que llegamos a la parte donde entrenamos nuestro Kernel SVM.

    Importaci贸n de bibliotecas

    import numpy as np
    import matplotlib.pyplot as plt
    import pandas as pd
    

    Importar el conjunto de datos

    url = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"
    
    # Assign colum names to the dataset
    colnames = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'Class']
    
    # Read dataset to pandas dataframe
    irisdata = pd.read_csv(url, names=colnames)
    

    Preprocesamiento

    X = irisdata.drop('Class', axis=1)
    y = irisdata['Class']
    

    Prueba de tren dividida

    from sklearn.model_selection import train_test_split
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.20)
    

    Entrenando el algoritmo

    Para entrenar el kernel SVM, usamos el mismo SVC clase de Scikit-Learn’s svm biblioteca. La diferencia radica en el valor del par谩metro kernel de la SVC clase. En el caso de la SVM simple, usamos “lineal” como valor para el par谩metro del kernel. Sin embargo, para el kernel SVM puede usar kernel gaussiano, polinomial, sigmoide o computable. Implementaremos n煤cleos polinomiales, gaussianos y sigmoides para ver cu谩l funciona mejor para nuestro problema.

    1. N煤cleo polinomial

    En el caso de n煤cleo polinomial, tambi茅n debe pasar un valor para el degree par谩metro de la SVC clase. Este es b谩sicamente el grado del polinomio. Eche un vistazo a c贸mo podemos usar un n煤cleo polinomial para implementar SVM del n煤cleo:

    from sklearn.svm import SVC
    svclassifier = SVC(kernel="poly", degree=8)
    svclassifier.fit(X_train, y_train)
    

    Haciendo predicciones

    Una vez que hemos entrenado el algoritmo, el siguiente paso es hacer predicciones sobre los datos de prueba.

    Ejecute el siguiente script para hacerlo:

    y_pred = svclassifier.predict(X_test)
    

    Evaluar el algoritmo

    Como de costumbre, el paso final de cualquier algoritmo de Machine Learning es realizar evaluaciones para el n煤cleo polinomial. Ejecute el siguiente script:

    from sklearn.metrics import classification_report, confusion_matrix
    print(confusion_matrix(y_test, y_pred))
    print(classification_report(y_test, y_pred))
    

    La salida para el kernel SVM usando kernel polinomial se ve as铆:

    [[11  0  0]
     [ 0 12  1]
     [ 0  0  6]]
                     precision   recall   f1-score   support
    
        Iris-setosa       1.00     1.00       1.00        11
    Iris-versicolor       1.00     0.92       0.96        13
     Iris-virginica       0.86     1.00       0.92         6
    
        avg / total       0.97     0.97       0.97        30
    

    Ahora repitamos los mismos pasos para los n煤cleos gaussiano y sigmoide.

    2. Kernel gaussiano

    Eche un vistazo a c贸mo podemos usar el kernel polinomial para implementar el SVM del kernel:

    from sklearn.svm import SVC
    svclassifier = SVC(kernel="rbf")
    svclassifier.fit(X_train, y_train)
    

    Para usar el kernel gaussiano, debe especificar ‘rbf’ como valor para el par谩metro Kernel de la clase SVC.

    Predicci贸n y evaluaci贸n

    y_pred = svclassifier.predict(X_test)
    
    from sklearn.metrics import classification_report, confusion_matrix
    print(confusion_matrix(y_test, y_pred))
    print(classification_report(y_test, y_pred))
    

    La salida del Kernel SVM con el kernel gaussiano se ve as铆:

    [[11  0  0]
     [ 0 13  0]
     [ 0  0  6]]
                     precision   recall   f1-score   support
    
        Iris-setosa       1.00     1.00       1.00        11
    Iris-versicolor       1.00     1.00       1.00        13
     Iris-virginica       1.00     1.00       1.00         6
    
        avg / total       1.00     1.00       1.00        30
    

    3. N煤cleo sigmoideo

    Finalmente, usemos un kernel sigmoide para implementar Kernel SVM. Eche un vistazo al siguiente gui贸n:

    from sklearn.svm import SVC
    svclassifier = SVC(kernel="sigmoid")
    svclassifier.fit(X_train, y_train)
    

    Para usar el kernel sigmoide, debe especificar ‘sigmoide’ como valor para el kernel par谩metro de la SVC clase.

    Predicci贸n y evaluaci贸n

    y_pred = svclassifier.predict(X_test)
    
    from sklearn.metrics import classification_report, confusion_matrix
    print(confusion_matrix(y_test, y_pred))
    print(classification_report(y_test, y_pred))
    

    La salida del Kernel SVM con el kernel Sigmoid se ve as铆:

    [[ 0  0 11]
     [ 0  0 13]
     [ 0  0  6]]
                     precision   recall   f1-score   support
    
        Iris-setosa       0.00     0.00       0.00        11
    Iris-versicolor       0.00     0.00       0.00        13
     Iris-virginica       0.20     1.00       0.33         6
    
        avg / total       0.04     0.20       0.07        30
    

    Comparaci贸n del rendimiento del kernel

    Si comparamos el rendimiento de los diferentes tipos de n煤cleos, podemos ver claramente que el n煤cleo sigmoide es el peor. Esto se debe a que la funci贸n sigmoidea devuelve dos valores, 0 y 1, por lo que es m谩s adecuada para problemas de clasificaci贸n binaria. Sin embargo, en nuestro caso ten铆amos tres clases de salida.

    Entre el kernel gaussiano y el kernel polinomial, podemos ver que el kernel gaussiano logr贸 una tasa de predicci贸n perfecta del 100%, mientras que el kernel polinomial clasific贸 err贸neamente una instancia. Por lo tanto, el kernel gaussiano se desempe帽贸 ligeramente mejor. Sin embargo, no existe una regla estricta y r谩pida sobre qu茅 kernel se desempe帽a mejor en cada escenario. Se trata de probar todos los n煤cleos y seleccionar el que tenga los mejores resultados en su conjunto de datos de prueba.

    Recursos

    驴Quiere obtener m谩s informaci贸n sobre SVM, Scikit-Learn y otros algoritmos 煤tiles de Machine Learning? Recomiendo consultar algunos recursos m谩s detallados, como uno de estos libros:

    Conclusi贸n

    En este art铆culo estudiamos SVMs simples y de kernel. Estudiamos la intuici贸n detr谩s del algoritmo SVM y c贸mo se puede implementar con la biblioteca Scikit-Learn de Python. Tambi茅n estudiamos diferentes tipos de kernels que se pueden usar para implementar kernel SVM. Le sugiero que intente implementar estos algoritmos en conjuntos de datos del mundo real disponibles en lugares como kaggle.com.

    Tambi茅n le sugiero que explore las matem谩ticas reales detr谩s de la SVM. Aunque no necesariamente lo necesitar谩 para utilizar el algoritmo SVM, sigue siendo muy 煤til saber qu茅 est谩 sucediendo realmente detr谩s de la escena mientras su algoritmo encuentra l铆mites de decisi贸n.

     

    Etiquetas:

    Deja una respuesta

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