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
Contenido
- 1 SVM simple
- 2 Implementaci贸n de SVM con Scikit-Learn
- 3 SVM de kernel
- 4 Implementaci贸n de Kernel SVM con Scikit-Learn
- 4.0.1 Importaci贸n de bibliotecas
- 4.0.2 Importar el conjunto de datos
- 4.0.3 Preprocesamiento
- 4.0.4 Prueba de tren dividida
- 4.0.5 Entrenando el algoritmo
- 4.0.6 1. N煤cleo polinomial
- 4.0.7 Haciendo predicciones
- 4.0.8 Evaluar el algoritmo
- 4.0.9 2. Kernel gaussiano
- 4.0.10 Predicci贸n y evaluaci贸n
- 4.0.11 3. N煤cleo sigmoideo
- 4.0.12 Predicci贸n y evaluaci贸n
- 4.0.13 Comparaci贸n del rendimiento del kernel
- 5 Recursos
- 6 Conclusi贸n
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
0 | 3.62160 | 8.6661 | -2,8073 | -0,44699 | 0 |
1 | 4.54590 | 8.1674 | -2,4586 | -1.46210 | 0 |
2 | 3.86600 | -2,6383 | 1.9242 | 0.10645 | 0 |
3 | 3.45660 | 9.5228 | -4.0112 | -3.59440 | 0 |
4 | 0.32924 | -4.4552 | 4.5718 | -0,98880 | 0 |
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:
- Aprendizaje con kernels: m谩quinas de vectores de soporte, regularizaci贸n, optimizaci贸n y m谩s
- Manual de ciencia de datos de Python: herramientas esenciales para trabajar con datos
- Ciencia de datos desde cero: primeros principios con Python
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.