Machine learning appliqué à la finance · Essentiel · 8 min

KNN et SVM/SVR

Objectif: Utiliser la proximité (KNN, normalisation, dimension) et les marges/noyaux (SVM/SVR) pour classer ou régresser.

Avant de continuer

Il faut connaître les arbres de décision, pour comparer différentes façons de capturer des non-linéarités.

Vocabulaire

Apprentissage paresseux (lazy learning)
Une approche (comme KNN) qui ne construit aucun modèle à l'entraînement : toute la mémorisation des données et le calcul ont lieu au moment de la prédiction.
Astuce du noyau (kernel trick)
Une technique qui permet à un SVM de séparer des classes non-linéairement séparables, en calculant implicitement une similarité dans un espace de dimension supérieure sans jamais y transformer explicitement les données.

Intuition

KNN et SVM abordent la classification depuis deux angles très différents : KNN classe une observation selon ses voisins les plus proches dans l'espace des variables, sans jamais vraiment "apprendre" de modèle ; SVM cherche au contraire la frontière de décision qui sépare les classes avec la marge la plus large possible, un objectif géométrique explicite.

Définition

Quel problème ? Classer (ou prédire une valeur continue pour SVR) en se basant sur la proximité entre observations (KNN) ou sur une séparation géométrique optimale (SVM). Quand utiliser KNN ? Sur des données de dimension modérée avec une notion de distance significative. Quand l'éviter ? En haute dimension (la notion de "proximité" perd son sens, le fléau de la dimension) ou sur de très grands jeux de données (chaque prédiction nécessite de comparer à toutes les observations d'entraînement). Quand utiliser SVM ? Sur des données de dimension modérée à élevée, en particulier si les classes ne sont pas linéairement séparables (via l'astuce du noyau, qui projette implicitement les données dans un espace où elles le deviennent). Quand l'éviter ? Sur de très grands jeux de données (SVM devient coûteux à entraîner) ou quand une interprétabilité directe est requise.

Utilité

Quelles données/sortie ? Des variables numériques impérativement normalisées (même échelle) en entrée, une classe (ou une valeur continue pour KNN-régression/SVR) en sortie. Comment l'entraîner/évaluer ? KNN n'a pas de phase d'entraînement à proprement parler (juste stocker les données) mais nécessite de choisir K par validation croisée ; SVM s'entraîne en résolvant un problème d'optimisation (maximiser la marge), avec deux hyperparamètres clés à régler par validation croisée : C (tolérance aux erreurs de classification) et le choix/paramètre du noyau. Pourquoi ces modèles ? Ils offrent des frontières de décision non-linéaires sans passer par la structure arborescente des forêts aléatoires, une alternative utile quand la géométrie du problème s'y prête mieux.

Exemple concret

Classer un nouvel émetteur (levier=2,2 ; rentabilité=14%, ratios déjà normalisés) par KNN avec K=3, à partir de 4 émetteurs déjà classés : Émetteur 1 (2,0 ; 15%, "risque faible"), Émetteur 2 (2,5 ; 12%, "risque faible"), Émetteur 3 (6,0 ; 3%, "risque élevé"), Émetteur 4 (7,0 ; 2%, "risque élevé"). Distances euclidiennes au nouvel émetteur : d1=√(0,2²+1²)≈1,02 ; d2=√(0,3²+2²)≈2,02 ; d3=√(3,8²+11²)≈11,64 ; d4=√(4,8²+12²)≈12,92. Les 3 plus proches voisins sont 1, 2 puis 3 : majorité "risque faible" (2 voix contre 1) → le nouvel émetteur est classé "risque faible".

Toujours bloqué ? Une autre façon de voir les choses

KNN, c'est comme deviner le quartier d'une maison inconnue en regardant simplement les quartiers de ses voisines les plus proches sur une carte — aucune règle générale n'est apprise, juste une comparaison directe. SVM, c'est comme tracer la route la plus large possible entre deux quartiers rivaux sur cette même carte, en s'assurant qu'elle reste équidistante des maisons les plus proches de chaque côté — une frontière explicite et optimisée, pas une simple comparaison locale.

Formule indispensable

Variables, unités et hypothèses

  • — Vecteur normal et biais définissant l'hyperplan séparateur
  • — La marge géométrique entre les deux classes, que le SVM cherche à maximiser (équivalent à minimiser ‖w‖)

Hypothèses: SVM à marge dure (séparation parfaite) ; en pratique, une version à marge souple avec le paramètre C tolère des erreurs de classification pour rester robuste au bruit.

Unités: Sans dimension.

Exemple concret: Avec w=(0,5 ; 0,5), ‖w‖=√0,5≈0,707, marge=2/0,707≈2,83. Avec un autre séparateur w=(1 ; 1), ‖w‖=√2≈1,414, marge=2/1,414≈1,41 : le premier séparateur offre une marge deux fois plus large, donc le SVM le préfère strictement.

Calcul détaillé

1) Normaliser impérativement toutes les variables (moyenne 0, écart-type 1) avant KNN ou SVM, sous peine que les variables à grande échelle dominent artificiellement la distance ou la marge. 2) Pour KNN : choisir K par validation croisée (K trop petit = surapprentissage au bruit, K trop grand = frontière trop lisse) — avec K=3 dans notre exemple, les 3 plus proches voisins votent "risque faible" à 2 contre 1. 3) Pour SVM : choisir le noyau (linéaire, RBF, polynomial) et régler C et les paramètres du noyau par validation croisée (recherche en grille) — le séparateur à ‖w‖=0,707 (marge 2,83) est préféré à celui à ‖w‖=1,414 (marge 1,41). 4) Évaluer sur un jeu de test avec les métriques adaptées (AUC, précision/rappel).

Levier normaliséRentabilité normalisée (%)

Exemple de code Python

from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV

# La normalisation (StandardScaler) est indispensable avant KNN/SVM
pipeline = make_pipeline(StandardScaler(), SVC(kernel="rbf", probability=True))

grille = {"svc__C": [0.1, 1, 10], "svc__gamma": ["scale", 0.01, 0.1]}
recherche = GridSearchCV(pipeline, grille, cv=5, scoring="roc_auc")
recherche.fit(X_train, y_train)

print("Meilleurs paramètres :", recherche.best_params_)
print("AUC (validation croisée) :", recherche.best_score_)

Interprétation

Pour KNN, un K faible donne une frontière de décision très irrégulière (sensible au bruit local), un K élevé donne une frontière plus lisse mais potentiellement trop simpliste. Pour SVM, un C élevé pénalise fortement les erreurs de classification (marge plus étroite, risque de surapprentissage), un C faible tolère plus d'erreurs (marge plus large, risque de sous-apprentissage) — les deux hyperparamètres contrôlent le même compromis biais-variance sous des formes différentes.

Pièges

Oublier de normaliser les variables avant KNN ou SVM : une variable à grande échelle (par exemple un chiffre d'affaires en millions à côté d'un ratio entre 0 et 1) dominerait artificiellement toute mesure de distance ou de marge. Autre piège spécifique à KNN : l'appliquer naïvement en haute dimension (beaucoup de variables), où la notion de "proximité" devient statistiquement peu significative (fléau de la dimension) — presque toutes les observations finissent à une distance similaire les unes des autres.

Application métier

Un analyste crédit utilise KNN pour trouver rapidement les "comparables" les plus proches d'un nouvel émetteur non noté, en s'appuyant sur ses ratios financiers, afin de proposer une fourchette de notation ou de spread cohérente avec le marché ; un desk de trading algorithmique peut utiliser un SVM pour classer en temps réel un régime de marché (tendanciel vs. agité) à partir de plusieurs indicateurs, afin d'activer automatiquement la stratégie adaptée.

Question d'entretien (en anglais)

Q.When would you reach for KNN versus an SVM for a classification problem, and what's the one preprocessing step you must never skip for either?

Voir une réponse modèle

A.KNN is my go-to when I want something simple and interpretable, on moderate-dimensional data with a meaningful distance, and I don't mind the cost of comparing against the full training set at prediction time. SVM is better when I suspect the true decision boundary isn't linear but the data isn't huge, since the kernel trick lets me capture non-linear boundaries without exploding computation. The one step I'd never skip for either: normalizing every variable to the same scale first. If one feature is measured in millions and another is a ratio between 0 and 1, it will dominate the distance calculation in KNN or the margin in SVM, making the model's decisions driven by units rather than by actual signal — I'd standardize everything to mean 0, standard deviation 1 before fitting either model.

Trois points à retenir

  1. 1KNN classe par proximité aux voisins les plus proches, sans modèle appris explicitement (apprentissage paresseux).
  2. 2SVM cherche la frontière de séparation à marge maximale, avec l'astuce du noyau pour des frontières non-linéaires.
  3. 3Normaliser les variables est indispensable pour les deux modèles, sous peine de fausser distance et marge.
Approfondir / démonstration

L'astuce du noyau repose sur un résultat mathématique élégant : plutôt que de transformer explicitement chaque observation x dans un espace de dimension beaucoup plus grande φ(x) (coûteux, voire de dimension infinie pour le noyau RBF), il suffit de calculer directement le produit scalaire dans cet espace via une fonction noyau K(x_i, x_j) = φ(x_i)·φ(x_j), sans jamais calculer φ(x) explicitement — car la solution du SVM ne dépend des données que via ces produits scalaires. Le fléau de la dimension affectant KNN a une origine quantitative précise : dans un espace à d dimensions, le volume d'une coquille proche de la frontière d'un hypercube croît relativement au volume total à mesure que d augmente, si bien que presque tous les points finissent "proches du bord" et les distances entre points deviennent presque toutes similaires, rendant le concept même de "plus proche voisin" peu discriminant.

Mini-quiz de cette notion

…