Machines à vecteurs de support
Introduction
Les machines à vecteurs de support (SVM) sont des méthodes d'apprentissage supervisé puissantes et flexibles utilisées pour la classification, la régression et la détection des valeurs aberrantes. Les SVM sont très efficaces dans les espaces de grande dimension et sont généralement utilisés dans les problèmes de classification. Les SVM sont populaires et économes en mémoire car ils utilisent un sous-ensemble de points d'apprentissage dans la fonction de décision.
L'objectif principal des SVM est de diviser les ensembles de données en un certain nombre de classes afin de trouver un hyperplan marginal maximal (MMH), ce qui peut être fait en deux étapes : 1.
- Les machines à vecteurs de support génèrent d'abord itérativement des hyperplans qui séparent les classes de la meilleure façon.
- Ensuite, il choisira l'hyperplan qui sépare correctement les classes.
Quelques concepts importants dans le SVM sont les suivants .
- Support Vectors − Ils peuvent être définis comme les points de données les plus proches de l'hyperplan. Les vecteurs de support aident à décider de la ligne de séparation.
- Hyperplane − Le plan ou l'espace de décision qui divise un ensemble d'objets ayant des classes différentes.
- Margin − L'écart entre deux lignes sur les points de données rapprochés de classes différentes est appelé marge.
Le SVM de Scikit-learn prend en charge les vecteurs d'échantillons épars et denses comme entrée.
Classification of SVM
Scikit-learn fournit trois classes, à savoir SVC, NuSVC et LinearSVC, qui peuvent effectuer une classification multi-classes.
SVC
Il s'agit d'une classification vectorielle de support en C dont l'implémentation est basée sur libsvm. Le module utilisé par scikit-learn est sklearn.svm.SVC
. Cette classe gère le support multi classe selon le schéma one-vs-one.
Paramètres
La liste suivante présente les paramètres utilisés par la classe sklearn.svm.SVC
.
Paramètre et description
- C − float, optional, default = 1.0 - C'est le paramètre de pénalité du terme d'erreur.
- kernel − string, optional, default = ‘rbf’ - Ce paramètre spécifie le type de noyau à utiliser dans l'algorithme. Nous pouvons choisir n'importe lequel parmi 'linear', 'poly', 'rbf', 'sigmoïde', 'precomputed'. La valeur par défaut du noyau est "rbf".
- degree − int, optional, default = 3 - Il représente le degré de la fonction noyau 'poly' et sera ignoré par tous les autres noyaux.
- gamma − {‘scale’, ‘auto’} or float, - Il s'agit du coefficient du noyau pour les noyaux 'rbf', 'poly' et 'sigmoïde'.
- optinal default − = ‘scale’ - Si vous choisissez la valeur par défaut, c'est-à-dire gamma = 'scale', la valeur du gamma à utiliser par le SVC est 1/(𝑛𝑓𝑒𝑎𝑡𝑢𝑟𝑒𝑠∗𝑋.𝑣𝑎𝑟()). En revanche, si gamma= 'auto', il utilise 1/𝑛𝑓𝑒𝑎𝑡𝑢𝑟𝑒𝑠.
- coef0 − float, optional, Default=0.0 - Un terme indépendant dans la fonction noyau qui n'est significatif que dans 'poly' et 'sigmoïde'.
- tol − float, optional, default = 1.e-3 - Ce paramètre représente le critère d'arrêt des itérations.
- shrinking − Boolean, optional, default = True - Ce paramètre indique si nous voulons utiliser l'heuristique de réduction ou non.
- verbose − Boolean, default: false - Il active ou désactive la sortie verbeuse. Sa valeur par défaut est false.
- probability − boolean, optional, default = true - Ce paramètre active ou désactive les estimations de probabilité. La valeur par défaut est false, mais il doit être activé avant d'appeler fit.
- max_iter − int, optional, default = -1 - Comme son nom l'indique, elle représente le nombre maximum d'itérations dans le solveur. La valeur -1 signifie qu'il n'y a pas de limite au nombre d'itérations.
- cache_size − float, optional - Ce paramètre spécifie la taille du cache du noyau. La valeur sera en MB (MegaBytes).
- random_state − int, RandomState instance or None, optional, default = none - Ce paramètre représente la graine du nombre pseudo-aléatoire généré qui est utilisé lors du brassage des données. Les options suivantes sont disponibles
- int − Dans ce cas, random_state est la graine utilisée par le générateur de nombres aléatoires.
- RandomState instance − Dans ce cas, random_state est le générateur de nombres aléatoires.
- None − Dans ce cas, le générateur de nombres aléatoires est l'instance RandonState utilisée par np.random.
- class_weight − {dict, ‘balanced’}, optional - Ce paramètre va fixer le paramètre C de la classe j à 𝑐𝑙𝑎𝑠𝑠_𝑤𝑒𝑖𝑔ℎ𝑡[𝑗]∗𝐶 pour le SVC. Si nous utilisons l'option par défaut, cela signifie que toutes les classes sont censées avoir le poids un. En revanche, si vous choisissez class_weight:balanced, il utilisera les valeurs de y pour ajuster automatiquement les poids.
- decision_function_shape − ovo’, ‘ovr’, default = ‘ovr’ - Ce paramètre décidera si l'algorithme retournera la fonction de décision 'ovr' (one-vs-rest) de la forme comme tous les autres classificateurs, ou la fonction de décision originale ovo(one-vs-one) de libsvm.
- break_ties − boolean, optional, default = false -
- Véritable − La prédiction départagera les ex-aequo en fonction des valeurs de confiance de la fonction décisionnelle.
- Faux − Le prédicteur renverra la première classe parmi les classes ex aequo.
Attributs
Followings table consist the attributes used by sklearn.svm.SVC class −
Attributs et description
- support_ − array-like, shape = [n_SV] - Elle renvoie les indices des vecteurs de support.
- support_vectors_ − array-like, shape = [n_SV, n_features] - Elle renvoie les vecteurs de support.
- n_support_ − array-like, dtype=int32, shape = [n_class] - Il représente le nombre de vecteurs de support pour chaque classe.
- dual_coef_ − array, shape = [n_class-1,n_SV] - Ce sont les coefficients des vecteurs de support dans la fonction de décision.
- coef_ − array, shape = [n_class * (n_class-1)/2, n_features] - Cet attribut, disponible uniquement en cas de noyau linéaire, fournit le poids attribué aux caractéristiques.
- intercept_ − array, shape = [n_class * (n_class-1)/2] - Il représente le terme indépendant (constante) dans la fonction de décision.
- fit_status_ − int - La sortie serait 0 si elle est correctement installée. La sortie sera de 1 si elle est incorrectement installée.
- classes_ − array of shape = [n_classes] - Il donne les étiquettes des classes.
Exemple de mise en œuvre
Comme d'autres classificateurs, le SVC doit également être équipé des deux tableaux suivants -
- Un tableau X contenant les échantillons d'apprentissage. Il est de taille [n_samples, n_features].
- Un tableau Y contenant les valeurs cibles, c'est-à-dire les étiquettes de classe pour les échantillons d'apprentissage. Il est de taille [n_échantillons].
Le script Python suivant utilise la classe sklearn.svm.SVC.
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)
Sortie
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)
Exemple
Maintenant, une fois ajusté, nous pouvons obtenir le vecteur de poids à l'aide du script python suivant -.
SVCClf.coef_
Sortie
array([[0.5, 0.5]])
Exemple
De la même manière, nous pouvons obtenir la valeur des autres attributs comme suit -
SVCClf.predict([[-0.5,-0.8]])
Sortie
array([1])
Exemple
SVCClf.n_support_
Sortie
array([1, 1])
Exemple
SVCClf.support_vectors_
Sortie
array(
[
[-1., -1.],
[ 1., 1.]
]
)
Exemple
SVCClf.support_
Sortie
array([0, 2])
Exemple
SVCClf.intercept_
Sortie
array([-0.])
Exemple
SVCClf.fit_status_
Sortie
0
NuSVC
NuSVC est Nu Support Vector Classification. C'est une autre classe fournie par scikit-learn qui peut effectuer une classification multi-classes. C'est comme la SVC mais NuSVC accepte des jeux de paramètres légèrement différents. Le paramètre qui est différent de SVC est le suivant : nu - flotteur, facultatif, par défaut = 0,5
Il représente une limite supérieure de la fraction des erreurs de formation et une limite inférieure de la fraction des vecteurs de support. Sa valeur doit être comprise dans l'intervalle (o,1). Les autres paramètres et attributs sont les mêmes que ceux du SVC.
Exemple de mise en œuvre
Nous pouvons également mettre en œuvre le même exemple en utilisant la classe sklearn.svm.NuSVC
.
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)
Sortie
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)
Nous pouvons obtenir les sorties du reste des attributs comme dans le cas du SVC.
LinearSVC
Il s'agit de la classification linéaire par vecteurs de support. Elle est similaire à la SVC avec un noyau = 'linear'. La différence entre eux est que LinearSVC est implémenté en termes de liblinear alors que SVC est implémenté en libsvm. C'est la raison pour laquelle LinearSVC a plus de flexibilité dans le choix des pénalités et des fonctions de perte. Il s'adapte également mieux à un grand nombre d'échantillons.
Si nous parlons de ses paramètres et attributs, il ne prend pas en charge le "noyau" car il est supposé être linéaire et il lui manque également certains attributs comme support_, support_vectors_, n_support_, fit_status_ et dual_coef_.
Cependant, il prend en charge les paramètres de pénalité et de perte comme suit -
- penalty - chaîne de caractères, L1 ou L2(default = 'L2') - Ce paramètre est utilisé pour spécifier la norme (L1 ou L2) utilisée dans la pénalisation (régularisation).
- loss - string, hinge, squared_hinge (default = squared_hinge) - Il représente la fonction de perte où 'hinge' est la perte SVM standard et 'squared_hinge' est le carré de la perte hinge.
Exemple de mise en œuvre
Le script Python suivant utilise la classe sklearn.svm.LinearSVC.
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)
Sortie
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)
Exemple
Maintenant, une fois ajusté, le modèle peut prédire de nouvelles valeurs comme suit -
LSVCClf.predict([[0,0,0,0]])
Sortie
[1]
Exemple
Pour l'exemple ci-dessus, nous pouvons obtenir le vecteur poids à l'aide du script python suivant -
LSVCClf.coef_
Sortie
[[0. 0. 0.91214955 0.22630686]]
Exemple
De même, nous pouvons obtenir la valeur d'intercept à l'aide du script python suivant -
LSVCClf.intercept_
Sortie
[0.26860518]
Regression with SVM
Comme nous l'avons vu précédemment, le SVM est utilisé pour les problèmes de classification et de régression. La méthode de classification par vecteurs de support (SVC) de Scikit-learn peut être étendue pour résoudre également les problèmes de régression. Cette méthode étendue est appelée Régression par vecteur de support (SVR).
Similitude de base entre SVM et SVR
Le modèle créé par le SVC ne dépend que d'un sous-ensemble de données d'entraînement. Pourquoi ? Parce que la fonction de coût pour la construction du modèle ne se soucie pas des points de données d'apprentissage qui se trouvent en dehors de la marge.
Le modèle produit par le SVR (Support Vector Regression) ne dépend lui aussi que d'un sous-ensemble de données d'apprentissage. Pourquoi ? Parce que la fonction de coût pour construire le modèle ignore tous les points de données d'apprentissage proches de la prédiction du modèle.
Scikit-learn fournit trois classes, à savoir SVR, NuSVR et LinearSVR, qui sont trois implémentations différentes de SVR.
SVR
Il s'agit d'une régression par vecteur support Epsilon dont l'implémentation est basée sur libsvm. Contrairement à SVC, il y a deux paramètres libres dans le modèle, à savoir 'C' et 'epsilon'.
- epsilon - float, optionnel, par défaut = 0.1
Il représente l'epsilon dans le modèle epsilon-SVR, et spécifie le tube epsilon à l'intérieur duquel aucune pénalité n'est associée dans la fonction de perte d'apprentissage aux points prédits à une distance epsilon de la valeur réelle.
Le reste des paramètres et attributs sont similaires à ceux que nous avons utilisés dans le SVC.
Exemple de mise en œuvre
Le script Python suivant utilise la classe sklearn.svm.SVR.
from sklearn import svm
X = [[1, 1], [2, 2]]
y = [1, 2]
SVRReg = svm.SVR(kernel = 'linear', gamma = 'auto')
SVRReg.fit(X, y)
Sortie
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)
Exemple
Maintenant, une fois ajusté, nous pouvons obtenir le vecteur de poids à l'aide du script python suivant -.
SVRReg.coef_
Sortie
array([[0.4, 0.4]])
Exemple
De la même manière, nous pouvons obtenir la valeur des autres attributs comme suit -
SVRReg.predict([[1,1]])
Sortie
array([1.1])
De même, nous pouvons obtenir les valeurs d'autres attributs.
NuSVR
NuSVR est Nu Support Vector Regression. C'est comme NuSVC, mais NuSVR utilise un paramètre nu pour contrôler le nombre de vecteurs de support. Et de plus, contrairement à NuSVC où nu remplace le paramètre C, ici il remplace epsilon.
Exemple de mise en œuvre
Le script Python suivant utilise la classe sklearn.svm.SVR.
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)
Sortie
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)
Exemple
Maintenant, une fois ajusté, nous pouvons obtenir le vecteur de poids à l'aide du script python suivant -.
NuSVRReg.coef_
Sortie
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 même, nous pouvons obtenir la valeur d'autres attributs.
LinearSVR
Il s'agit de la régression linéaire par vecteur de support. Elle est similaire à la SVR avec un noyau = 'linéaire'. La différence entre eux est que LinearSVR est implémenté en termes de liblinear, alors que SVC est implémenté en libsvm. C'est la raison pour laquelle LinearSVR a plus de flexibilité dans le choix des pénalités et des fonctions de perte. Il s'adapte également mieux à un grand nombre d'échantillons.
Si nous parlons de ses paramètres et attributs, il ne prend pas en charge le "noyau" car il est supposé être linéaire et il lui manque également certains attributs comme support_, support_vectors_, n_support_, fit_status_ et dual_coef_.
Toutefois, il prend en charge les paramètres de "perte" comme suit
- loss - chaîne de caractères, facultatif, par défaut = 'epsilon_insensitive'.
Il représente la fonction de perte où la perte epsilon_insensible est la perte L1 et la perte epsilon-insensible au carré est la perte L2.
Exemple de mise en œuvre
Le script Python suivant utilise la classe sklearn.svm.LinearSVR.
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)
Sortie
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
)
Exemple
Maintenant, une fois ajusté, le modèle peut prédire de nouvelles valeurs comme suit -
LSRReg.predict([[0,0,0,0]])
Sortie
array([-0.01041416])
Exemple
Pour l'exemple ci-dessus, nous pouvons obtenir le vecteur poids à l'aide du script python suivant -
LSRReg.coef_
Sortie
array([20.47354746, 34.08619401, 67.23189022, 87.47017787])
Exemple
De même, nous pouvons obtenir la valeur d'intercept à l'aide du script python suivant -
LSRReg.intercept_
Sortie
array([-0.01041416])
Besoin d'aide ?
Rejoignez notre communauté officielle et ne restez plus seul à bloquer sur un problème !