Scikit Learn - Máquinas vectoriales de soporte
Este capítulo trata sobre un método de aprendizaje automático denominado Support Vector Machines (SVM).
Introducción
Las máquinas de vectores de soporte (SVM) son métodos de aprendizaje automático supervisados potentes pero flexibles que se utilizan para la clasificación, la regresión y la detección de valores atípicos. Las SVM son muy eficientes en espacios de gran dimensión y generalmente se utilizan en problemas de clasificación. Las SVM son populares y eficientes en la memoria porque utilizan un subconjunto de puntos de entrenamiento en la función de decisión.
El objetivo principal de las SVM es dividir los conjuntos de datos en un número de clases para encontrar un maximum marginal hyperplane (MMH) que se puede hacer en los siguientes dos pasos:
Support Vector Machines primero generará hiperplanos de forma iterativa que separa las clases de la mejor manera.
Después de eso, elegirá el hiperplano que segregue las clases correctamente.
Algunos conceptos importantes en SVM son los siguientes:
Support Vectors- Pueden definirse como los puntos de datos más cercanos al hiperplano. Los vectores de soporte ayudan a decidir la línea de separación.
Hyperplane - El plano o espacio de decisión que divide el conjunto de objetos que tienen diferentes clases.
Margin - El espacio entre dos líneas en los puntos de datos del armario de diferentes clases se llama margen.
Los siguientes diagramas le darán una idea de estos conceptos de SVM:
SVM en Scikit-learn admite vectores de muestra densos y dispersos como entrada.
Clasificación de SVM
Scikit-learn ofrece tres clases a saber SVC, NuSVC y LinearSVC que puede realizar una clasificación de clase multiclase.
SVC
Es una clasificación de vectores de soporte C cuya implementación se basa en libsvm. El módulo utilizado por scikit-learn essklearn.svm.SVC. Esta clase maneja el soporte multiclase según el esquema de uno contra uno.
Parámetros
La siguiente tabla consta de los parámetros utilizados por sklearn.svm.SVC clase -
No Señor | Descripción de parámetros |
---|---|
1 | C - flotante, opcional, predeterminado = 1.0 Es el parámetro de penalización del término de error. |
2 | kernel - cadena, opcional, predeterminado = 'rbf' Este parámetro especifica el tipo de kernel que se utilizará en el algoritmo. podemos elegir cualquiera entre,‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’. El valor predeterminado del kernel sería‘rbf’. |
3 | degree - int, opcional, predeterminado = 3 Representa el grado de la función del núcleo 'poli' y será ignorado por todos los demás núcleos. |
4 | gamma - {'escala', 'auto'} o flotante, Es el coeficiente de kernel para los kernels 'rbf', 'poly' y 'sigmoid'. |
5 | optinal default - = 'escala' Si elige el valor predeterminado, es decir, gamma = 'escala', entonces el valor de gamma que utilizará SVC es 1 / (_ ∗. ()). Por otro lado, si gamma = 'auto', usa 1 / _. |
6 | coef0 - flotante, opcional, predeterminado = 0.0 Un término independiente en la función del kernel que solo es significativo en 'poli' y 'sigmoide'. |
7 | tol - flotante, opcional, predeterminado = 1.e-3 Este parámetro representa el criterio de detención para las iteraciones. |
8 | shrinking - Booleano, opcional, predeterminado = Verdadero Este parámetro representa si queremos usar heurística de reducción o no. |
9 | verbose - Booleano, predeterminado: falso Activa o desactiva la salida detallada. Su valor predeterminado es falso. |
10 | probability - booleano, opcional, predeterminado = verdadero Este parámetro habilita o deshabilita las estimaciones de probabilidad. El valor predeterminado es falso, pero debe habilitarse antes de llamar a fit. |
11 | max_iter - int, opcional, predeterminado = -1 Como sugiere el nombre, representa el número máximo de iteraciones dentro del solucionador. El valor -1 significa que no hay límite en el número de iteraciones. |
12 | cache_size - flotador, opcional Este parámetro especificará el tamaño de la caché del kernel. El valor estará en MB (MegaBytes). |
13 | random_state - int, instancia de RandomState o None, opcional, predeterminado = ninguno Este parámetro representa la semilla del número pseudoaleatorio generado que se usa mientras se barajan los datos. Las siguientes son las opciones:
|
14 | class_weight - {dict, 'balanceado'}, opcional Este parámetro establecerá el parámetro C de clase j en _ℎ [] ∗ para SVC. Si usamos la opción predeterminada, significa que se supone que todas las clases tienen el peso uno. Por otro lado, si eligesclass_weight:balanced, utilizará los valores de y para ajustar automáticamente los pesos. |
15 | decision_function_shape - ovo ',' ovr ', predeterminado =' ovr ' Este parámetro decidirá si el algoritmo regresará ‘ovr’ (uno vs resto) función de decisión de la forma como todos los demás clasificadores, o el original ovo(uno contra uno) función de decisión de libsvm. |
dieciséis | break_ties - booleano, opcional, predeterminado = falso True - La predicción romperá empates de acuerdo con los valores de confianza de decision_function False - El pronóstico devolverá la primera clase entre las clases empatadas. |
Atributos
La siguiente tabla consta de los atributos utilizados por sklearn.svm.SVC clase -
No Señor | Atributos y descripción |
---|---|
1 | support_ - en forma de matriz, forma = [n_SV] Devuelve los índices de los vectores de soporte. |
2 | support_vectors_ - en forma de matriz, forma = [n_SV, n_features] Devuelve los vectores de soporte. |
3 | n_support_ - tipo matriz, dtype = int32, shape = [n_class] Representa el número de vectores de soporte para cada clase. |
4 | dual_coef_ - matriz, forma = [n_clase-1, n_SV] Estos son el coeficiente de los vectores de soporte en la función de decisión. |
5 | coef_ - matriz, forma = [n_class * (n_class-1) / 2, n_features] Este atributo, solo disponible en caso de kernel lineal, proporciona el peso asignado a las características. |
6 | intercept_ - matriz, forma = [n_clase * (n_clase-1) / 2] Representa el término independiente (constante) en la función de decisión. |
7 | fit_status_ - int La salida sería 0 si se ajusta correctamente. La salida sería 1 si no se ajusta correctamente. |
8 | classes_ - matriz de forma = [n_classes] Da las etiquetas de las clases. |
Implementation Example
Al igual que otros clasificadores, SVC también debe estar equipado con los siguientes dos arreglos:
Una matriz Xsosteniendo las muestras de entrenamiento. Es de tamaño [n_samples, n_features].
Una matriz Ymantener los valores objetivo, es decir, etiquetas de clase para las muestras de entrenamiento. Es de tamaño [n_samples].
Siguiendo los usos del script de Python sklearn.svm.SVC clase -
import numpy as np
X = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]])
y = np.array([1, 1, 2, 2])
from sklearn.svm import SVC
SVCClf = SVC(kernel = 'linear',gamma = 'scale', shrinking = False,)
SVCClf.fit(X, y)
Output
SVC(C = 1.0, cache_size = 200, class_weight = None, coef0 = 0.0,
decision_function_shape = 'ovr', degree = 3, gamma = 'scale', kernel = 'linear',
max_iter = -1, probability = False, random_state = None, shrinking = False,
tol = 0.001, verbose = False)
Example
Ahora, una vez instalado, podemos obtener el vector de peso con la ayuda del siguiente script de Python:
SVCClf.coef_
Output
array([[0.5, 0.5]])
Example
De manera similar, podemos obtener el valor de otros atributos de la siguiente manera:
SVCClf.predict([[-0.5,-0.8]])
Output
array([1])
Example
SVCClf.n_support_
Output
array([1, 1])
Example
SVCClf.support_vectors_
Output
array(
[
[-1., -1.],
[ 1., 1.]
]
)
Example
SVCClf.support_
Output
array([0, 2])
Example
SVCClf.intercept_
Output
array([-0.])
Example
SVCClf.fit_status_
Output
0
NuSVC
NuSVC es la clasificación de vectores de soporte de Nu. Es otra clase proporcionada por scikit-learn que puede realizar una clasificación de varias clases. Es como SVC pero NuSVC acepta conjuntos de parámetros ligeramente diferentes. El parámetro que es diferente de SVC es el siguiente:
nu - flotante, opcional, predeterminado = 0.5
Representa un límite superior en la fracción de errores de entrenamiento y un límite inferior de la fracción de vectores de soporte. Su valor debe estar en el intervalo de (o, 1].
El resto de parámetros y atributos son los mismos que los de SVC.
Ejemplo de implementación
Podemos implementar el mismo ejemplo usando sklearn.svm.NuSVC clase también.
import numpy as np
X = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]])
y = np.array([1, 1, 2, 2])
from sklearn.svm import NuSVC
NuSVCClf = NuSVC(kernel = 'linear',gamma = 'scale', shrinking = False,)
NuSVCClf.fit(X, y)
Salida
NuSVC(cache_size = 200, class_weight = None, coef0 = 0.0,
decision_function_shape = 'ovr', degree = 3, gamma = 'scale', kernel = 'linear',
max_iter = -1, nu = 0.5, probability = False, random_state = None,
shrinking = False, tol = 0.001, verbose = False)
Podemos obtener las salidas del resto de los atributos como se hizo en el caso de SVC.
LinearSVC
Es la clasificación de vectores de soporte lineal. Es similar a SVC que tiene kernel = 'linear'. La diferencia entre ellos es queLinearSVC implementado en términos de liblinear mientras que SVC se implementa en libsvm. Esa es la razónLinearSVCtiene más flexibilidad en la elección de sanciones y funciones de pérdida. También se adapta mejor a una gran cantidad de muestras.
Si hablamos de sus parámetros y atributos entonces no es compatible ‘kernel’ porque se supone que es lineal y también carece de algunos de los atributos como support_, support_vectors_, n_support_, fit_status_ y, dual_coef_.
Sin embargo, es compatible penalty y loss parámetros de la siguiente manera:
penalty − string, L1 or L2(default = ‘L2’)
Este parámetro se utiliza para especificar la norma (L1 o L2) utilizada en la penalización (regularización).
loss − string, hinge, squared_hinge (default = squared_hinge)
Representa la función de pérdida donde 'bisagra' es la pérdida estándar de SVM y 'bisagra_cuadrada' es el cuadrado de la pérdida de bisagra.
Ejemplo de implementación
Siguiendo los usos del script de Python sklearn.svm.LinearSVC clase -
from sklearn.svm import LinearSVC
from sklearn.datasets import make_classification
X, y = make_classification(n_features = 4, random_state = 0)
LSVCClf = LinearSVC(dual = False, random_state = 0, penalty = 'l1',tol = 1e-5)
LSVCClf.fit(X, y)
Salida
LinearSVC(C = 1.0, class_weight = None, dual = False, fit_intercept = True,
intercept_scaling = 1, loss = 'squared_hinge', max_iter = 1000,
multi_class = 'ovr', penalty = 'l1', random_state = 0, tol = 1e-05, verbose = 0)
Ejemplo
Ahora, una vez ajustado, el modelo puede predecir nuevos valores de la siguiente manera:
LSVCClf.predict([[0,0,0,0]])
Salida
[1]
Ejemplo
Para el ejemplo anterior, podemos obtener el vector de peso con la ayuda del siguiente script de Python:
LSVCClf.coef_
Salida
[[0. 0. 0.91214955 0.22630686]]
Ejemplo
Del mismo modo, podemos obtener el valor de la intercepción con la ayuda de la siguiente secuencia de comandos de Python:
LSVCClf.intercept_
Salida
[0.26860518]
Regresión con SVM
Como se discutió anteriormente, SVM se usa para problemas de clasificación y regresión. El método de clasificación de vectores de soporte (SVC) de Scikit-learn también se puede ampliar para resolver problemas de regresión. Ese método extendido se llama Regresión de vectores de soporte (SVR).
Similitud básica entre SVM y SVR
El modelo creado por SVC depende solo de un subconjunto de datos de entrenamiento. ¿Por qué? Porque la función de costo para construir el modelo no se preocupa por los puntos de datos de entrenamiento que se encuentran fuera del margen.
Considerando que, el modelo producido por SVR (Support Vector Regression) también solo depende de un subconjunto de los datos de entrenamiento. ¿Por qué? Porque la función de costo para construir el modelo ignora cualquier punto de datos de entrenamiento cercano a la predicción del modelo.
Scikit-learn ofrece tres clases a saber SVR, NuSVR and LinearSVR como tres implementaciones diferentes de SVR.
SVR
Es la regresión vectorial con soporte de Epsilon cuya implementación se basa en libsvm. Como opuesto aSVC Hay dos parámetros libres en el modelo a saber ‘C’ y ‘epsilon’.
epsilon - flotante, opcional, predeterminado = 0.1
Representa la épsilon en el modelo épsilon-SVR y especifica el tubo épsilon dentro del cual no se asocia ninguna penalización en la función de pérdida de entrenamiento con puntos pronosticados dentro de una distancia épsilon del valor real.
El resto de los parámetros y atributos son similares a los que usamos en SVC.
Ejemplo de implementación
Siguiendo los usos del script de Python sklearn.svm.SVR clase -
from sklearn import svm
X = [[1, 1], [2, 2]]
y = [1, 2]
SVRReg = svm.SVR(kernel = ’linear’, gamma = ’auto’)
SVRReg.fit(X, y)
Salida
SVR(C = 1.0, cache_size = 200, coef0 = 0.0, degree = 3, epsilon = 0.1, gamma = 'auto',
kernel = 'linear', max_iter = -1, shrinking = True, tol = 0.001, verbose = False)
Ejemplo
Ahora, una vez instalado, podemos obtener el vector de peso con la ayuda del siguiente script de Python:
SVRReg.coef_
Salida
array([[0.4, 0.4]])
Ejemplo
De manera similar, podemos obtener el valor de otros atributos de la siguiente manera:
SVRReg.predict([[1,1]])
Salida
array([1.1])
De manera similar, también podemos obtener los valores de otros atributos.
NuSVR
NuSVR es la regresión de vectores de soporte de Nu. Es como NuSVC, pero NuSVR usa un parámetronupara controlar el número de vectores de soporte. Y además, a diferencia de NuSVC dondenu parámetro C reemplazado, aquí reemplaza epsilon.
Ejemplo de implementación
Siguiendo los usos del script de Python sklearn.svm.SVR clase -
from sklearn.svm import NuSVR
import numpy as np
n_samples, n_features = 20, 15
np.random.seed(0)
y = np.random.randn(n_samples)
X = np.random.randn(n_samples, n_features)
NuSVRReg = NuSVR(kernel = 'linear', gamma = 'auto',C = 1.0, nu = 0.1)^M
NuSVRReg.fit(X, y)
Salida
NuSVR(C = 1.0, cache_size = 200, coef0 = 0.0, degree = 3, gamma = 'auto',
kernel = 'linear', max_iter = -1, nu = 0.1, shrinking = True, tol = 0.001,
verbose = False)
Ejemplo
Ahora, una vez instalado, podemos obtener el vector de peso con la ayuda del siguiente script de Python:
NuSVRReg.coef_
Salida
array(
[
[-0.14904483, 0.04596145, 0.22605216, -0.08125403, 0.06564533,
0.01104285, 0.04068767, 0.2918337 , -0.13473211, 0.36006765,
-0.2185713 , -0.31836476, -0.03048429, 0.16102126, -0.29317051]
]
)
De manera similar, también podemos obtener el valor de otros atributos.
LinearSVR
Es la regresión de vectores de soporte lineal. Es similar a SVR que tiene kernel = 'linear'. La diferencia entre ellos es queLinearSVR implementado en términos de liblinear, mientras que SVC implementado en libsvm. Esa es la razónLinearSVRtiene más flexibilidad en la elección de sanciones y funciones de pérdida. También se adapta mejor a una gran cantidad de muestras.
Si hablamos de sus parámetros y atributos entonces no es compatible ‘kernel’ porque se supone que es lineal y también carece de algunos de los atributos como support_, support_vectors_, n_support_, fit_status_ y, dual_coef_.
Sin embargo, admite parámetros de 'pérdida' de la siguiente manera:
loss - cadena, opcional, predeterminado = 'epsilon_insensitive'
Representa la función de pérdida donde la pérdida insensible a épsilon es la pérdida L1 y la pérdida insensible a la épsilon al cuadrado es la pérdida L2.
Ejemplo de implementación
Siguiendo los usos del script de Python sklearn.svm.LinearSVR clase -
from sklearn.svm import LinearSVR
from sklearn.datasets import make_regression
X, y = make_regression(n_features = 4, random_state = 0)
LSVRReg = LinearSVR(dual = False, random_state = 0,
loss = 'squared_epsilon_insensitive',tol = 1e-5)
LSVRReg.fit(X, y)
Salida
LinearSVR(
C=1.0, dual=False, epsilon=0.0, fit_intercept=True,
intercept_scaling=1.0, loss='squared_epsilon_insensitive',
max_iter=1000, random_state=0, tol=1e-05, verbose=0
)
Ejemplo
Ahora, una vez ajustado, el modelo puede predecir nuevos valores de la siguiente manera:
LSRReg.predict([[0,0,0,0]])
Salida
array([-0.01041416])
Ejemplo
Para el ejemplo anterior, podemos obtener el vector de peso con la ayuda del siguiente script de Python:
LSRReg.coef_
Salida
array([20.47354746, 34.08619401, 67.23189022, 87.47017787])
Ejemplo
Del mismo modo, podemos obtener el valor de la intercepción con la ayuda de la siguiente secuencia de comandos de Python:
LSRReg.intercept_
Salida
array([-0.01041416])