Scikit Learn - Machines vectorielles de soutien

Ce chapitre traite d'une méthode d'apprentissage automatique appelée Support Vector Machines (SVM).

introduction

Les machines vectorielles de support (SVM) sont des méthodes d'apprentissage automatique supervisé puissantes mais 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 grandes dimensions 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 nombre de classes afin de trouver un maximum marginal hyperplane (MMH) ce qui peut être fait dans les deux étapes suivantes -

  • Les machines vectorielles de support généreront d'abord des hyperplans de manière itérative qui séparent les classes de la meilleure façon.

  • Après cela, il choisira l'hyperplan qui sépare correctement les classes.

Voici quelques concepts importants de SVM:

  • 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 espace de décision qui divise un ensemble d'objets ayant différentes classes.

  • Margin - L'écart entre deux lignes sur les points de données de placard de différentes classes est appelé marge.

Les diagrammes suivants vous donneront un aperçu de ces concepts SVM -

SVM dans Scikit-learn prend en charge les vecteurs d'échantillons clairsemés et denses en entrée.

Classification des SVM

Scikit-learn propose trois classes à savoir SVC, NuSVC et LinearSVC qui peut effectuer une classification de classes multiclasses.

SVC

Il s'agit d'une classification vectorielle de support C dont l'implémentation est basée sur libsvm. Le module utilisé par scikit-learn estsklearn.svm.SVC. Cette classe gère la prise en charge multiclasse selon un schéma un contre un.

Paramètres

Le tableau suivant comprend les paramètres utilisés par sklearn.svm.SVC classe -

Sr. Non Paramètre et description
1

C - float, facultatif, par défaut = 1.0

C'est le paramètre de pénalité du terme d'erreur.

2

kernel - chaîne, facultatif, par défaut = 'rbf'

Ce paramètre spécifie le type de noyau à utiliser dans l'algorithme. nous pouvons choisir n'importe lequel parmi,‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’. La valeur par défaut du noyau serait‘rbf’.

3

degree - int, facultatif, par défaut = 3

Il représente le degré de la fonction noyau 'poly' et sera ignoré par tous les autres noyaux.

4

gamma - {'scale', 'auto'} ou float,

C'est le coefficient de noyau pour les noyaux «rbf», «poly» et «sigmoïde».

5

optinal default - = 'échelle'

Si vous choisissez default ie gamma = 'scale' alors la valeur de gamma à utiliser par SVC est 1 / (_ ∗. ()).

Par contre, si gamma = 'auto', il utilise 1 / _.

6

coef0 - float, facultatif, par défaut = 0,0

Un terme indépendant dans la fonction du noyau qui n'est significatif que dans «poly» et «sigmoïde».

sept

tol - float, optionnel, par défaut = 1.e-3

Ce paramètre représente le critère d'arrêt des itérations.

8

shrinking - Booléen, facultatif, par défaut = True

Ce paramètre représente cela, que nous souhaitons utiliser une heuristique de réduction ou non.

9

verbose - Booléen, par défaut: false

Il active ou désactive la sortie verbeuse. Sa valeur par défaut est false.

dix

probability - booléen, facultatif, par défaut = true

Ce paramètre active ou désactive les estimations de probabilité. La valeur par défaut est false, mais elle doit être activée avant d'appeler fit.

11

max_iter - int, facultatif, par défaut = -1

Comme son nom l'indique, il représente le nombre maximum d'itérations dans le solveur. La valeur -1 signifie qu'il n'y a pas de limite sur le nombre d'itérations.

12

cache_size - flotteur, en option

Ce paramètre spécifiera la taille du cache du noyau. La valeur sera en Mo (MegaBytes).

13

random_state - int, instance RandomState ou None, facultatif, par défaut = aucun

Ce paramètre représente la graine du nombre pseudo aléatoire généré qui est utilisé lors du brassage des données. Voici les options -

  • 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.

14

class_weight - {dict, 'balancé'}, facultatif

Ce paramètre définira le paramètre C de la classe j sur _ℎ [] ∗ pour SVC. Si nous utilisons l'option par défaut, cela signifie que toutes les classes sont supposées avoir un poids un. D'autre part, si vous choisissezclass_weight:balanced, il utilisera les valeurs de y pour ajuster automatiquement les poids.

15

decision_function_shape - ovo ',' ovr ', default =' ovr '

Ce paramètre décidera si l'algorithme retournera ‘ovr’ (one-vs-rest) fonction de décision de la forme comme tous les autres classificateurs, ou l'original ovo(un contre un) fonction de décision de libsvm.

16

break_ties - booléen, facultatif, par défaut = faux

True - Le prédicteur rompra les égalités selon les valeurs de confiance de la fonction decision_function

False - Le prédicteur renverra la première classe parmi les classes à égalité.

Les attributs

Le tableau suivant comprend les attributs utilisés par sklearn.svm.SVC classe -

Sr. Non Attributs et description
1

support_ - en forme de tableau, forme = [n_SV]

Il renvoie les indices des vecteurs de support.

2

support_vectors_ - en forme de tableau, forme = [n_SV, n_features]

Il renvoie les vecteurs de support.

3

n_support_ - de type tableau, dtype = int32, shape = [n_class]

Il représente le nombre de vecteurs de support pour chaque classe.

4

dual_coef_ - tableau, forme = [n_class-1, n_SV]

Ce sont les coefficients des vecteurs de support dans la fonction de décision.

5

coef_ - tableau, forme = [n_class * (n_class-1) / 2, n_features]

Cet attribut, disponible uniquement en cas de noyau linéaire, fournit le poids attribué aux entités.

6

intercept_ - tableau, forme = [n_class * (n_class-1) / 2]

Il représente le terme indépendant (constante) dans la fonction de décision.

sept

fit_status_ - int

La sortie serait 0 si elle est correctement installée. La sortie serait 1 si elle est mal installée.

8

classes_ - tableau de forme = [n_classes]

Il donne les étiquettes des classes.

Implementation Example

Comme les autres classificateurs, SVC doit également être équipé des deux tableaux suivants -

  • Un tableau Xtenant les échantillons de formation. Il est de taille [n_samples, n_features].

  • Un tableau Ycontenant les valeurs cibles, c'est-à-dire les étiquettes de classe pour les échantillons d'apprentissage. Il est de taille [n_samples].

Suivre les utilisations de script Python sklearn.svm.SVC classe -

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

Maintenant, une fois ajusté, nous pouvons obtenir le vecteur de poids à l'aide du script python suivant -

SVCClf.coef_

Output

array([[0.5, 0.5]])

Example

De même, nous pouvons obtenir la valeur d'autres attributs comme suit -

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 est la classification vectorielle de support Nu. C'est une autre classe fournie par scikit-learn qui peut effectuer une classification multi-classe. C'est comme SVC mais NuSVC accepte des ensembles de paramètres légèrement différents. Le paramètre qui est différent de SVC est le suivant -

  • nu - float, facultatif, par défaut = 0,5

Il représente une limite supérieure de la fraction des erreurs d'apprentissage et une limite inférieure de la fraction des vecteurs de support. Sa valeur doit être dans l'intervalle de (o, 1].

Les autres paramètres et attributs sont identiques à ceux de SVC.

Exemple d'implémentation

Nous pouvons implémenter le même exemple en utilisant sklearn.svm.NuSVC classe aussi.

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)

Production

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 de SVC.

LinéaireSVC

Il s'agit de la classification des vecteurs de support linéaire. C'est similaire à SVC ayant kernel = 'linear'. La différence entre eux est queLinearSVC implémenté en termes de liblinear tandis que SVC est implémenté en libsvm. C'est la raisonLinearSVCa 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 ‘kernel’ car il est supposé linéaire et il lui manque également certains des attributs tels que support_, support_vectors_, n_support_, fit_status_ et, dual_coef_.

Cependant, il prend en charge penalty et loss paramètres comme suit -

  • penalty − string, L1 or L2(default = ‘L2’)

    Ce paramètre permet de spécifier la norme (L1 ou L2) utilisée en 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 charnière.

Exemple d'implémentation

Suivre les utilisations de script Python sklearn.svm.LinearSVC classe -

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)

Production

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]])

Production

[1]

Exemple

Pour l'exemple ci-dessus, nous pouvons obtenir le vecteur de poids à l'aide du script python suivant -

LSVCClf.coef_

Production

[[0. 0. 0.91214955 0.22630686]]

Exemple

De même, nous pouvons obtenir la valeur de l'interception à l'aide du script python suivant -

LSVCClf.intercept_

Production

[0.26860518]

Régression avec SVM

Comme indiqué précédemment, SVM est utilisé pour les problèmes de classification et de régression. La méthode de classification des vecteurs de support (SVC) de Scikit-learn peut également être étendue pour résoudre les problèmes de régression. Cette méthode étendue est appelée régression vectorielle de support (SVR).

Similitude de base entre SVM et SVR

Le modèle créé par SVC dépend uniquement d'un sous-ensemble de données d'entraînement. Pourquoi? Parce que la fonction de coût de création du modèle ne se soucie pas des points de données d'entraînement qui se trouvent en dehors de la marge.

Alors que le modèle produit par SVR (Support Vector Regression) ne dépend également que d'un sous-ensemble des données d'apprentissage. Pourquoi? Parce que la fonction de coût de création du modèle ignore tous les points de données d'entraînement proches de la prédiction du modèle.

Scikit-learn propose trois classes à savoir SVR, NuSVR and LinearSVR comme trois implémentations différentes de SVR.

SVR

C'est la régression vectorielle support Epsilon dont la mise en œuvre est basée sur libsvm. À l'opposé deSVC Il y a deux paramètres libres dans le modèle à savoir ‘C’ et ‘epsilon’.

  • epsilon - float, facultatif, par défaut = 0,1

Il représente l'epsilon dans le modèle epsilon-SVR, et spécifie le tube epsilon dans lequel aucune pénalité n'est associée dans la fonction de perte d'apprentissage avec des points prédits à une distance epsilon de la valeur réelle.

Les autres paramètres et attributs sont similaires à ceux que nous avons utilisés dans SVC.

Exemple d'implémentation

Suivre les utilisations de script Python sklearn.svm.SVR classe -

from sklearn import svm
X = [[1, 1], [2, 2]]
y = [1, 2]
SVRReg = svm.SVR(kernel = ’linear’, gamma = ’auto’)
SVRReg.fit(X, y)

Production

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_

Production

array([[0.4, 0.4]])

Exemple

De même, nous pouvons obtenir la valeur d'autres attributs comme suit -

SVRReg.predict([[1,1]])

Production

array([1.1])

De même, nous pouvons également obtenir les valeurs d'autres attributs.

NuSVR

NuSVR est Nu Support Vector Regression. C'est comme NuSVC, mais NuSVR utilise un paramètrenupour contrôler le nombre de vecteurs de support. Et de plus, contrairement à NuSVC oùnu a remplacé le paramètre C, ici il remplace epsilon.

Exemple d'implémentation

Suivre les utilisations de script Python sklearn.svm.SVR classe -

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)

Production

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_

Production

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 également obtenir la valeur d'autres attributs.

LinéaireSVR

C'est la régression vectorielle de support linéaire. Il est similaire à SVR ayant kernel = 'linear'. La différence entre eux est queLinearSVR mis en œuvre en termes de liblinear, tandis que SVC implémenté dans libsvm. C'est la raisonLinearSVRa 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 ‘kernel’ car il est supposé linéaire et il lui manque également certains des attributs tels que support_, support_vectors_, n_support_, fit_status_ et, dual_coef_.

Cependant, il prend en charge les paramètres de `` perte '' comme suit -

  • loss - chaîne, facultative, par défaut = 'epsilon_insensitive'

Il représente la fonction de perte où la perte epsilon_insensible est la perte L1 et la perte au carré insensible epsilon est la perte L2.

Exemple d'implémentation

Suivre les utilisations de script Python sklearn.svm.LinearSVR classe -

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)

Production

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]])

Production

array([-0.01041416])

Exemple

Pour l'exemple ci-dessus, nous pouvons obtenir le vecteur de poids à l'aide du script python suivant -

LSRReg.coef_

Production

array([20.47354746, 34.08619401, 67.23189022, 87.47017787])

Exemple

De même, nous pouvons obtenir la valeur de l'interception à l'aide du script python suivant -

LSRReg.intercept_

Production

array([-0.01041416])