Machines à vecteurs de support (SVM) en Machine Learning

Temps de lecture : 6 minutes

Avant toute chose, félicitations si tu as eu le courage d’ouvrir un article avec un titre aussi tarabiscoté 😅. Je te l’accorde, le nom n’est pas très friendly mais tu vas voir, le principe de cette n-ième méthode en Machine Learning est plutôt intuitif. Pour faire simple, le SVM (Support Vector Machine en anglais) permet de trouver des hyperplans (frontières) optimaux pour séparer un nuage de données en différentes classes. Et l’objectif principal est de maximiser les distances entre ces frontières. Mais partons sur un petit exemple pratique pour mieux illustrer tout ça !

Le cas d’étude … loufoque

C’est bientôt l’été 🌞 ! Je veux donc avoir des abdos à la Zac Efron pour les sorties plage (ne me juge pas, je ne fais que suivre la tendance !). Pour ce faire, je joue sur deux facteurs principaux : le nombre de calories journalier que je consomme (X_1) et le nombre d’heures de sport journalier que j’effectue (X_2). Chaque jour, j’évalue si je perds du poids (Y=1) ou pas (Y=0) en fonction de ces deux facteurs. Et comme je suis très sérieux dans ma volonté de perte de poids, je recense tous les points sur un joli graphe. Disons qu’après plusieurs jours, j’obtiens ceci :

Observation principale ? Plus je mange, plus j’ai besoin de me dépenser au sport pour perdre du poids, logique jusque là ! Mais surtout, tu peux remarquer qu’il existe deux grandes classes sur mon graphe. Soit j’ai perdu du poids, soit je n’en ai pas perdu. Il semble donc qu’il y a des combinaisons précises de X_1 et X_2 qui permettent de réaliser mon objectif de perte de poids. Je veux donc, sur la base de ces données recueillies, élaborer un modèle qui à partir d’une entrée (X_1,X_2) m’indique si je perds du poids ou pas. De la sorte, même le jour ou ma balance est en panne, je peux prédire facilement l’évolution de mon objectif « Abdos à la Zac Efron » 😉. Et bien, c’est là où entre en jeu la machine à vecteurs de support(SVM).

Principe du SVM

Dans le cas particulier de ce problème à deux variables, le principe du SVM consiste à trouver la droite « la plus optimale » qui sépare le nuage de points en deux parties (points verts vs points rouges). Mais si je te présente les 3 droites suivantes, la question essentielle reste laquelle choisir ?

C’est naturellement la ligne 2, celle au centre. Elle permet (en tout cas visuellement) de maximiser l’espacement entre les deux populations antagonistes. Tu vois, je t’avais dit que c’était intuitif 🙂. Dans le jargon, une telle ligne s’appelle la frontière de décision (« decision boundary » en anglais). L’espacement qu’elle crée s’appelle elle la marge (« margin » en anglais). Et tu peux remarquer que finalement, cette marge dépend fondamentalement des points les plus extrêmes de chaque population. Ce sont les points surlignés en jaune : ils portent le nom de « vecteurs de support ». Et oui, c’est de là que vient le nom de la méthode ! (tout ça pour ça, je te comprends tellement 😅).

« Maximal margin classifier »

Cette façon de déterminer la frontière de décision qui maximise la marge n’est de fait qu’un cas particulier du SVM : la classification à marge maximale (« maximal margin classification »). C’est une méthode qui a l’avantage d’être rapide mais qui, comme tu as pu peut-être l’intuiter, ne marche que dans des cas parfaits (aucun point ne tombe dans la marge ici). Dans la vie réelle, on n’a évidemment pas une séparation nette et claire entre nos deux populations. Des données réalistes pourraient ressembler plutôt à ceci :

Si on appliquait aveuglément la méthode de la marge maximale, on aurait une frontière de décision irréaliste. Le point rouge proche de la population verte est vraisemblablement un point aberrant qui n’aurait pas dû être utilisé pour déterminer la frontière. C’est de l’overfitting. Une telle frontière fera par conséquent des prédictions erronées à l’avenir. Heureusement, on peut pallier à cette extrême sensibilité du « maximal margin classifier » en lui préférant une méthode cousine plus flexible : le « soft margin classifier ».

« Soft margin classifier »

Tout le problème du « maximum margin classifier » résidait dans le fait qu’on autorise aucun point dans la marge. Le « soft margin classifier » relâche cette contrainte. On permet donc au modèle de faire des erreurs sur les données d’entrainement afin de permettre une meilleure généralisation sur les données futures. Sur des données encore plus réalistes, on aurait une frontière de décision et une marge qui ressembleraient à ceci par exemple :

Certains points rentrent dans la marge et d’autres sont mal classifiés mais ceci est bien l’objectif recherché ( augmentation du biais). Les prédictions futures seront en contrepartie meilleures (diminution de la variance). Le nombre de mauvaises classifications autorisé est à préciser en fonction du niveau de généralisation qu’on désire. On peut déterminer un nombre optimal en utilisant de la corrélation croisée.

Utilisation de fonctions noyaux pour le SVM

Dans le cas d’étude précédent, une séparation linéaire est possible entre les points. Quid si ce n’est plus cas ? Par exemple si on a des données fictives en une dimension qui ressemblent à ceci :

X

Dans ce cas précis, on est d’accord, une seule droite ne peut pas séparer les points en deux classes 😥. Dans un tel cas de figure, il est coutume de projeter les données dans une dimension supérieure (dimension 2 ici) en se servant d’une fonction noyau (« kernel » en anglais). Si on passe de X à X^2 par exemple, la nouvelle allure du nuage de points permet d’utiliser le « soft margin classifier » pour établir la ligne de séparation (frontière de séparation). Un peu comme ceci :

X^2

La recherche de la fonction noyau optimale peut aussi se faire par validation croisée et elle dépend assez logiquement des données en entrée. Sur Python , 4 types de noyaux sont proposés : les noyaux linéaires, polynomiaux, exponentiels (rbf) et sigmoïdes.

Implémentation sur Python

Pour faire de la classification avec un SVM sur Python, il faut simplement aller chercher la fonction SVC dans la librairie sklearn.svm de sklearn. Le noyau par défaut est le noyau exponentiel (rbf) mais on peut bien sûr spécifier notre propre noyau. Dans son utilisation le plus simple, c’est plutôt direct comme ceci :

from sklearn.svm import SVC

#Définition du modèle avec un noyau linéaire
modele = SVC(kernel = 'linear')

#Entrainement du modèle sur les données d'entrainement
modele.fit(X_train,y_train)

#Le modèle est prêt à être utilisé
modele.predict(X_test)

On peut bien évidemment spécifier le degré de pénalité dans le cas d’un « soft margin classifier » ou le degré du polynôme si on utilise un noyau polynomial… etc. Je t’encourage à lire la documentation pour te familiariser avec toutes les options disponibles (maintenant que tu as les bases 😉).

Dans cet article je me suis surtout focalisé sur le concept en dimension 2. Et on a vu que l’hyperplan de décision était une droite. Mais évidemment, le principe reste le même en 1D (l’hyperplan est un point), en 3D (l’hyperplan est un plan) et en 3D+…. euh, l’hyperplan est un hyperplan 😅 (au delà de 3D, il n’y a pas de nom particulier en effet). De plus, ici nous avons étudié un problème de classification bi-classes mais le SVM est aussi applicable pour des problèmes mutliclasses et même pour des problèmes de régression.

J’avais prévu de parler un peu des bases mathématiques du SVM mais cet article est déjà suffisamment long. J’y reviendrai dans un autre article. En attendant, si tu es curieux, tu peux regarder cette vidéo en anglais pour le côté maths. Sinon, tu peux toujours lire mes autres articles de la rubrique data science. Parait-il qu’ils sont plutôt cool 🙂.

Partager

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *