{"id":616,"date":"2026-10-09T12:22:31","date_gmt":"2026-10-09T10:22:31","guid":{"rendered":"https:\/\/www.ranksignal.fr\/blog\/?p=616"},"modified":"2026-10-14T17:06:31","modified_gmt":"2026-10-14T15:06:31","slug":"la-methode-des-machines-a-vecteurs-de-support-svm","status":"publish","type":"post","link":"https:\/\/www.ranksignal.fr\/blog\/machine-learning\/la-methode-des-machines-a-vecteurs-de-support-svm\/","title":{"rendered":"SVM : tracer la fronti\u00e8re la plus large entre deux classes"},"content":{"rendered":"<p><\/p>\n<p>Imagine deux villages pos\u00e9s sur une carte, et une route \u00e0 construire entre eux. Il existe une infinit\u00e9 de trac\u00e9s possibles, mais un seul ne fr\u00f4le aucune maison. Cette route la plus d\u00e9gag\u00e9e possible, c&rsquo;est exactement ce que cherche une machine \u00e0 vecteurs de support. \u00c0 la fin de cet article, tu sauras ce qu&rsquo;est sa marge, pourquoi seuls quelques points d\u00e9cident de tout, et comment un simple noyau lui permet de courber sa fronti\u00e8re.<\/p>\n<p><strong>Sommaire<\/strong><\/p>\n<ul>\n<li><a href=\"#l-essentiel-en-30-secondes\">L&rsquo;essentiel en 30 secondes<\/a><\/li>\n<li><a href=\"#une-frontiere-entre-deux-camps-laquelle-choisir\">Une fronti\u00e8re entre deux camps : laquelle choisir ?<\/a><\/li>\n<li><a href=\"#les-seuls-points-qui-comptent-les-vecteurs-de-support\">Les seuls points qui comptent : les vecteurs de support<\/a><\/li>\n<li><a href=\"#quand-les-camps-se-chevauchent-la-marge-souple\">Quand les camps se chevauchent : la marge souple<\/a><\/li>\n<li><a href=\"#courber-la-frontiere-sans-changer-de-methode-le-noyau\">Courber la fronti\u00e8re sans changer de m\u00e9thode : le noyau<\/a><\/li>\n<li><a href=\"#un-svm-en-quelques-lignes-de-python\">Un SVM en quelques lignes de Python<\/a><\/li>\n<li><a href=\"#un-cousin-de-la-regression-logistique-pas-un-etranger\">Un cousin de la r\u00e9gression logistique, pas un \u00e9tranger<\/a><\/li>\n<\/ul>\n<h2 id=\"l-essentiel-en-30-secondes\">L&rsquo;essentiel en 30 secondes<\/h2>\n<ul>\n<li>Un SVM est une <strong>m\u00e9thode de classification<\/strong> qui s\u00e9pare deux classes par un hyperplan.<\/li>\n<li>Parmi tous les s\u00e9parateurs possibles, il retient celui qui <strong>maximise la marge<\/strong>, la distance minimale aux points les plus proches.<\/li>\n<li>Seuls <strong>les vecteurs de support<\/strong> (les points sur le bord de la marge) fixent la position de la fronti\u00e8re.<\/li>\n<li>Une marge souple r\u00e9gl\u00e9e par C tol\u00e8re quelques erreurs, et <strong>un noyau<\/strong> donne des fronti\u00e8res non lin\u00e9aires.<\/li>\n<li>C et \u03b3 se choisissent par <strong>validation crois\u00e9e<\/strong>, en une ligne de scikit-learn.<\/li>\n<\/ul>\n<h2 id=\"une-frontiere-entre-deux-camps-laquelle-choisir\">Une fronti\u00e8re entre deux camps : laquelle choisir ?<\/h2>\n<p>Les machines \u00e0 vecteurs de support (SVM) forment une famille de m\u00e9thodes de classification, longtemps compt\u00e9e parmi les meilleurs classifieurs \u00ab pr\u00eats \u00e0 l&#8217;emploi \u00bb. Elles se construisent par couches successives, en partant d&rsquo;une id\u00e9e purement g\u00e9om\u00e9trique.<\/p>\n<p>Commen\u00e7ons par le mot <strong>hyperplan<\/strong>. En dimension 2, c&rsquo;est une droite ; en dimension 3, un plan ordinaire ; avec <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-3bf85f1087e9fbed3a319341134ac1a2_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#112;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"10\" style=\"vertical-align: -4px;\"\/> variables, un sous-espace de dimension <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-7758c8dad8f016ae4950f6927bbaff12_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#112;&#45;&#49;\" title=\"Rendered by QuickLaTeX.com\" height=\"16\" width=\"40\" style=\"vertical-align: -4px;\"\/>. Son \u00e9quation est :<\/p>\n<p><p class=\"ql-center-displayed-equation\" style=\"line-height: 18px;\"><span class=\"ql-right-eqno\"> &nbsp; <\/span><span class=\"ql-left-eqno\"> &nbsp; <\/span><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-38fc157ba7dad055eb9f1a6ff2fca048_l3.png\" height=\"18\" width=\"216\" class=\"ql-img-displayed-equation quicklatex-auto-format\" alt=\"&#92;&#91;&#92;&#98;&#101;&#116;&#97;&#95;&#48;&#32;&#43;&#32;&#92;&#98;&#101;&#116;&#97;&#95;&#49;&#32;&#88;&#95;&#49;&#32;&#43;&#32;&#92;&#99;&#100;&#111;&#116;&#115;&#32;&#43;&#32;&#92;&#98;&#101;&#116;&#97;&#95;&#112;&#32;&#88;&#95;&#112;&#32;&#61;&#32;&#48;&#92;&#93;\" title=\"Rendered by QuickLaTeX.com\"\/><\/p><\/p>\n<p>Les <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-b6a7605b1bcca8f1b416eaf733f34e08_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#92;&#98;&#101;&#116;&#97;\" title=\"Rendered by QuickLaTeX.com\" height=\"17\" width=\"11\" style=\"vertical-align: -4px;\"\/> sont les coefficients qui orientent et placent l&rsquo;hyperplan, et les <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-d4ee28752517d6062a3ca0314890342d_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#88;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"16\" style=\"vertical-align: 0px;\"\/> les variables. Le signe de cette expression te dit de quel c\u00f4t\u00e9 de l&rsquo;hyperplan se trouve un point : c&rsquo;est ce qui sert \u00e0 ranger une observation dans la classe <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-7b34c01098c83fa602de54e9d74d63a9_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#45;&#49;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"21\" style=\"vertical-align: 0px;\"\/> ou <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-d4932b1a489a055f2908670bac049524_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#43;&#49;\" title=\"Rendered by QuickLaTeX.com\" height=\"14\" width=\"22\" style=\"vertical-align: -2px;\"\/>.<\/p>\n<p>Si les deux classes se s\u00e9parent parfaitement, une infinit\u00e9 d&rsquo;hyperplans conviennent : tu peux toujours en d\u00e9caler un peu un sans qu&rsquo;il se trompe. Le SVM d\u00e9partage en choisissant l&rsquo;hyperplan dont la <strong>distance minimale aux observations d&rsquo;entra\u00eenement<\/strong> est la plus grande. Cette distance s&rsquo;appelle la marge.<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef46d10ab6&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef46d10ab6\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"1950\" height=\"1650\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch08_classificateur_marge_maximale.png\" alt=\"Deux nuages de points, bleu en haut \u00e0 gauche et orange en bas \u00e0 droite, s\u00e9par\u00e9s par une droite grise encadr\u00e9e d'une bande gris\u00e9e limit\u00e9e par deux lignes pointill\u00e9es\" class=\"wp-image-614\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch08_classificateur_marge_maximale.png 1950w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch08_classificateur_marge_maximale-300x254.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch08_classificateur_marge_maximale-1024x866.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch08_classificateur_marge_maximale-768x650.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch08_classificateur_marge_maximale-1536x1300.png 1536w\" sizes=\"auto, (max-width: 1950px) 100vw, 1950px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Regarde la bande gris\u00e9e : sa droite centrale est la fronti\u00e8re retenue, et les deux lignes pointill\u00e9es touchent chacune les points les plus proches de leur camp. Aucun point ne peut entrer dans la bande.<\/figcaption><\/figure>\n\n\n<blockquote>\n<p><strong>\ud83d\udca1 Intuition<\/strong> Ta route entre les deux villages passe par la ligne m\u00e9diane de la plus large bande qu&rsquo;on puisse tracer sans toucher une seule maison.<\/p>\n<\/blockquote>\n<h2 id=\"les-seuls-points-qui-comptent-les-vecteurs-de-support\">Les seuls points qui comptent : les vecteurs de support<\/h2>\n<p>Voici le fait le plus \u00e9tonnant de la m\u00e9thode. La position de l&rsquo;hyperplan ne d\u00e9pend que d&rsquo;un <strong>tout petit nombre d&rsquo;observations<\/strong>, celles pos\u00e9es exactement sur le bord de la marge. On les appelle les vecteurs de support.<\/p>\n<p>D\u00e9place n&rsquo;importe quel autre point, \u00e0 condition qu&rsquo;il reste en dehors de la marge : rien ne bouge. L&rsquo;hyperplan est \u00ab soutenu \u00bb par ces quelques points seulement, d&rsquo;o\u00f9 le nom de la m\u00e9thode.<\/p>\n<p>C&rsquo;est aussi une bonne nouvelle pour la lecture du mod\u00e8le : au lieu de retenir des milliers de lignes, il suffit de savoir quels points tiennent la bande.<\/p>\n<h2 id=\"quand-les-camps-se-chevauchent-la-marge-souple\">Quand les camps se chevauchent : la marge souple<\/h2>\n<p>Reste un probl\u00e8me de taille. Cette construction exige que les classes soient <strong>parfaitement s\u00e9parables<\/strong> par un hyperplan, une condition rarement remplie en pratique.<\/p>\n<p>Et m\u00eame quand elle l&rsquo;est, le s\u00e9parateur parfait est fragile : <strong>ajouter un seul point peut d\u00e9placer radicalement<\/strong> la marge et l&rsquo;hyperplan. C&rsquo;est un sympt\u00f4me classique de surajustement.<\/p>\n<p>La parade s&rsquo;appelle le classifieur \u00e0 vecteurs de support : il accepte une <strong>marge souple<\/strong>. On tol\u00e8re qu&rsquo;un certain nombre de points passent du mauvais c\u00f4t\u00e9 de la marge, voire du mauvais c\u00f4t\u00e9 de l&rsquo;hyperplan. Cette tol\u00e9rance se r\u00e8gle avec un param\u00e8tre de budget, not\u00e9 <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-f34f74d98915e33f37a086f8cbfb996a_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#67;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"14\" style=\"vertical-align: 0px;\"\/>.<\/p>\n<p>Le r\u00e9glage est un curseur biais-variance. Une marge \u00e9troite, cal\u00e9e sur peu de vecteurs de support, donne un mod\u00e8le <strong>\u00e0 faible biais mais forte variance<\/strong>, tr\u00e8s sensible aux points isol\u00e9s. Une marge large, appuy\u00e9e sur de nombreux vecteurs de support, rend le mod\u00e8le plus rigide : variance plus faible, biais potentiellement plus \u00e9lev\u00e9. Comme toujours, <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-f34f74d98915e33f37a086f8cbfb996a_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#67;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"14\" style=\"vertical-align: 0px;\"\/> se choisit par validation crois\u00e9e.<\/p>\n<blockquote>\n<p><strong>\u26a0\ufe0f Pi\u00e8ge<\/strong> Le sens de <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-f34f74d98915e33f37a086f8cbfb996a_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#67;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"14\" style=\"vertical-align: 0px;\"\/> d\u00e9pend de la formulation. Dans la description par budget, un <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-f34f74d98915e33f37a086f8cbfb996a_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#67;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"14\" style=\"vertical-align: 0px;\"\/> plus grand \u00e9largit la marge ; dans le code ci-dessous, <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-d539eb7b8974c5c3ab42320ac46bba4d_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#67;&#61;&#48;&#46;&#49;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"60\" style=\"vertical-align: 0px;\"\/> donne une marge plus large que <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-3393da21a77c7e9d480892d35e5214be_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#67;&#61;&#49;&#48;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"56\" style=\"vertical-align: 0px;\"\/>. Ne te fie pas au nombre : regarde la largeur de la marge obtenue.<\/p>\n<\/blockquote>\n<h2 id=\"courber-la-frontiere-sans-changer-de-methode-le-noyau\">Courber la fronti\u00e8re sans changer de m\u00e9thode : le noyau<\/h2>\n<p>Le classifieur \u00e0 vecteurs de support reste, par construction, <strong>lin\u00e9aire<\/strong> : sa fronti\u00e8re est toujours un hyperplan. Or beaucoup de probl\u00e8mes ont une fronti\u00e8re manifestement courbe, que m\u00eame une marge souple g\u00e9n\u00e9reuse ne rattrape pas.<\/p>\n<p>L&rsquo;astuce consiste \u00e0 travailler comme si l&rsquo;on avait enrichi les variables de carr\u00e9s et de produits crois\u00e9s, puis \u00e0 tracer la droite dans cet espace enrichi. Revenue dans l&rsquo;espace d&rsquo;origine, elle devient une courbe. Le tour de force est de ne <strong>jamais calculer ces nouvelles coordonn\u00e9es<\/strong>, qui peuvent \u00eatre en nombre immense, voire infini.<\/p>\n<p>Comment ? La solution du probl\u00e8me d&rsquo;optimisation ne d\u00e9pend des observations que par leurs <strong>produits scalaires deux \u00e0 deux<\/strong>. On remplace donc chaque produit scalaire par une fonction <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-ace3e5b931dfde5566e17ae5a931d37a_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#75;&#40;&#120;&#95;&#105;&#44;&#32;&#120;&#95;&#123;&#105;&#39;&#125;&#41;\" title=\"Rendered by QuickLaTeX.com\" height=\"19\" width=\"73\" style=\"vertical-align: -5px;\"\/> qui mesure la similarit\u00e9 entre deux points : c&rsquo;est l&rsquo;astuce du noyau (kernel trick).<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef46d11100&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef46d11100\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"1280\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch08_noyau_svm_frontiere_non_lineaire-scaled.png\" alt=\"Sch\u00e9ma en deux volets : \u00e0 gauche, des points bleus formant un cercle central entour\u00e9s de points orange que nulle droite ne s\u00e9pare ; \u00e0 droite, apr\u00e8s transformation par noyau, une fronti\u00e8re verticale en pointill\u00e9s s\u00e9pare les deux classes\" class=\"wp-image-253\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch08_noyau_svm_frontiere_non_lineaire-scaled.png 2560w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch08_noyau_svm_frontiere_non_lineaire-300x150.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch08_noyau_svm_frontiere_non_lineaire-1024x512.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch08_noyau_svm_frontiere_non_lineaire-768x384.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch08_noyau_svm_frontiere_non_lineaire-1536x768.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch08_noyau_svm_frontiere_non_lineaire-2048x1024.png 2048w\" sizes=\"auto, (max-width: 2560px) 100vw, 2560px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Le volet de droite est le m\u00eame probl\u00e8me vu \u00e0 travers le noyau : la s\u00e9paration redevient une simple droite, et c&rsquo;est elle qui, ramen\u00e9e \u00e0 gauche, dessine la fronti\u00e8re courbe.<\/figcaption><\/figure>\n\n\n<p>Deux noyaux courants. Le noyau polynomial de degr\u00e9 <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-4e8716946f6a868f015e0d62f28bc540_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#100;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"10\" style=\"vertical-align: 0px;\"\/> donne une fronti\u00e8re polynomiale :<\/p>\n<p><p class=\"ql-center-displayed-equation\" style=\"line-height: 68px;\"><span class=\"ql-right-eqno\"> &nbsp; <\/span><span class=\"ql-left-eqno\"> &nbsp; <\/span><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-01df6600751442e1051976371729c5b1_l3.png\" height=\"68\" width=\"246\" class=\"ql-img-displayed-equation quicklatex-auto-format\" alt=\"&#92;&#91;&#75;&#40;&#120;&#95;&#105;&#44;&#32;&#120;&#95;&#123;&#105;&#39;&#125;&#41;&#32;&#61;&#32;&#92;&#108;&#101;&#102;&#116;&#40;&#49;&#32;&#43;&#32;&#92;&#115;&#117;&#109;&#95;&#123;&#106;&#61;&#49;&#125;&#94;&#123;&#112;&#125;&#32;&#120;&#95;&#123;&#105;&#106;&#125;&#92;&#44;&#32;&#120;&#95;&#123;&#105;&#39;&#106;&#125;&#92;&#114;&#105;&#103;&#104;&#116;&#41;&#94;&#100;&#92;&#93;\" title=\"Rendered by QuickLaTeX.com\"\/><\/p><\/p>\n<p>Le noyau radial, lui, produit une fronti\u00e8re plus flexible et <strong>fortement locale<\/strong> :<\/p>\n<p><p class=\"ql-center-displayed-equation\" style=\"line-height: 64px;\"><span class=\"ql-right-eqno\"> &nbsp; <\/span><span class=\"ql-left-eqno\"> &nbsp; <\/span><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-20173c7978d1980d2ecd945e1810ecfa_l3.png\" height=\"64\" width=\"297\" class=\"ql-img-displayed-equation quicklatex-auto-format\" alt=\"&#92;&#91;&#75;&#40;&#120;&#95;&#105;&#44;&#32;&#120;&#95;&#123;&#105;&#39;&#125;&#41;&#32;&#61;&#32;&#92;&#101;&#120;&#112;&#92;&#108;&#101;&#102;&#116;&#40;&#45;&#92;&#103;&#97;&#109;&#109;&#97;&#32;&#92;&#115;&#117;&#109;&#95;&#123;&#106;&#61;&#49;&#125;&#94;&#123;&#112;&#125;&#32;&#40;&#120;&#95;&#123;&#105;&#106;&#125;&#32;&#45;&#32;&#120;&#95;&#123;&#105;&#39;&#106;&#125;&#41;&#94;&#50;&#92;&#114;&#105;&#103;&#104;&#116;&#41;&#92;&#93;\" title=\"Rendered by QuickLaTeX.com\"\/><\/p><\/p>\n<p>Ici <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-51e73a1b6bcca0408b029811f92bb96a_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#120;&#95;&#123;&#105;&#106;&#125;\" title=\"Rendered by QuickLaTeX.com\" height=\"14\" width=\"21\" style=\"vertical-align: -6px;\"\/> est la valeur de la variable <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-43c82d5bb00a7568d935a12e3bd969dd_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#106;\" title=\"Rendered by QuickLaTeX.com\" height=\"16\" width=\"9\" style=\"vertical-align: -4px;\"\/> pour l&rsquo;observation <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-695d9d59bd04859c6c99e7feb11daab6_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#105;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"6\" style=\"vertical-align: 0px;\"\/>, et la somme sous l&rsquo;exponentielle est le carr\u00e9 de la distance entre deux points. Un point de test \u00e9loign\u00e9 d&rsquo;un point d&rsquo;entra\u00eenement n&rsquo;en re\u00e7oit presque aucune influence : seul le voisinage imm\u00e9diat compte, un peu comme pour les K plus proches voisins.<\/p>\n<p>Le param\u00e8tre <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-4de02fc502ed5dbd15f371728ea270a3_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#92;&#103;&#97;&#109;&#109;&#97;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"10\" style=\"vertical-align: -4px;\"\/> joue le r\u00f4le de curseur de flexibilit\u00e9, comme <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-f34f74d98915e33f37a086f8cbfb996a_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#67;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"14\" style=\"vertical-align: 0px;\"\/> : un <strong><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-4de02fc502ed5dbd15f371728ea270a3_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#92;&#103;&#97;&#109;&#109;&#97;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"10\" style=\"vertical-align: -4px;\"\/> grand<\/strong> donne une fronti\u00e8re tr\u00e8s irr\u00e9guli\u00e8re qui \u00e9pouse chaque groupe local, un <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-4de02fc502ed5dbd15f371728ea270a3_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#92;&#103;&#97;&#109;&#109;&#97;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"10\" style=\"vertical-align: -4px;\"\/> petit une fronti\u00e8re plus lisse.<\/p>\n<blockquote>\n<p><strong>\ud83d\udccc \u00c0 retenir<\/strong> Le noyau radial correspond implicitement \u00e0 un espace de dimension infinie. Calculer dedans serait impossible, alors que le noyau n&rsquo;a besoin que de produits scalaires entre paires de points.<\/p>\n<\/blockquote>\n<h2 id=\"un-svm-en-quelques-lignes-de-python\">Un SVM en quelques lignes de Python<\/h2>\n<p>Passons \u00e0 la pratique. Tu as des variables dans <code>X<\/code>, des classes dans <code>y<\/code>, et tu veux voir l&rsquo;effet de la souplesse sur la marge. La classe <code>SVC<\/code> de scikit-learn ajuste aussi bien un classifieur lin\u00e9aire qu&rsquo;un SVM \u00e0 noyau, selon l&rsquo;argument <code>kernel<\/code>.<\/p>\n<p>Une pr\u00e9cision de lecture : les marqueurs <code>In [n]:<\/code> d\u00e9signent les cellules qu&rsquo;on a saisies dans un notebook, et leur num\u00e9ro n&rsquo;a pas de signification particuli\u00e8re.<\/p>\n<pre><code>In [5]: svm_linear = SVC(C=10, kernel='linear')\n        svm_linear.fit(X, y)\n\nIn [7]: svm_linear_small = SVC(C=0.1, kernel='linear')\n        svm_linear_small.fit(X, y)\n<\/code><\/pre>\n<p>Avec la plus petite valeur de <code>C<\/code>, on observe une <strong>marge plus large<\/strong> et donc davantage de vecteurs de support. C&rsquo;est bien le compromis d\u00e9crit plus haut.<\/p>\n<p>Passer \u00e0 une fronti\u00e8re courbe ne demande de changer qu&rsquo;un argument :<\/p>\n<pre><code>In [22]: svm_rbf = SVC(kernel=&quot;rbf&quot;, gamma=1, C=1)\n         svm_rbf.fit(X_train, y_train)\n<\/code><\/pre>\n<p><code>gamma<\/code> est le <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-4de02fc502ed5dbd15f371728ea270a3_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#92;&#103;&#97;&#109;&#109;&#97;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"10\" style=\"vertical-align: -4px;\"\/> du noyau radial. Reste \u00e0 trouver le bon couple <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-06a2cc2e774afe21e5d9cc902ca4692b_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#40;&#67;&#44;&#32;&#92;&#103;&#97;&#109;&#109;&#97;&#41;\" title=\"Rendered by QuickLaTeX.com\" height=\"19\" width=\"43\" style=\"vertical-align: -5px;\"\/>. On le cherche par validation crois\u00e9e \u00e0 5 blocs, avec une grille qui croise chaque valeur de <code>C<\/code> avec chaque valeur de <code>gamma<\/code> :<\/p>\n<pre><code>In [24]: kfold = skm.KFold(5,\n                             random_state=1,\n                             shuffle=True)\n         grid = skm.GridSearchCV(svm_rbf,\n                                   {'C':[0.1,1,10,100,1000],\n                                    'gamma':[0.5,1,2,3,4]},\n                                   refit=True,\n                                   cv=kfold,\n                                   scoring='accuracy')\n         grid.fit(X_train, y_train)\n         grid.best_params_\n<\/code><\/pre>\n<p>Chaque combinaison est \u00e9valu\u00e9e, et <code>best_params_<\/code> renvoie celle qui maximise l&rsquo;exactitude (accuracy).<\/p>\n<h2 id=\"un-cousin-de-la-regression-logistique-pas-un-etranger\">Un cousin de la r\u00e9gression logistique, pas un \u00e9tranger<\/h2>\n<p>On pr\u00e9sente parfois le SVM comme une bo\u00eete \u00e0 part. C&rsquo;est une fausse piste : le probl\u00e8me d&rsquo;optimisation du classifieur \u00e0 vecteurs de support se r\u00e9\u00e9crit comme la minimisation d&rsquo;une fonction de perte particuli\u00e8re, la <strong>hinge loss<\/strong>, assortie d&rsquo;une p\u00e9nalit\u00e9 de type ridge sur les coefficients. La structure rappelle directement la <a href=\"\/blog\/machine-learning\/qu-est-ce-qu-une-regression-logistique\/\" title=\"r\u00e9gression logistique\">r\u00e9gression logistique<\/a> p\u00e9nalis\u00e9e.<\/p>\n<p>Les deux m\u00e9thodes donnent des r\u00e9sultats tr\u00e8s proches quand les classes sont proches d&rsquo;\u00eatre s\u00e9parables. La diff\u00e9rence tient surtout \u00e0 la fonction de perte et au comportement quand les classes sont bien s\u00e9par\u00e9es.<\/p>\n<p>Deux nuances pratiques. La r\u00e9gression logistique fournit directement des <strong>probabilit\u00e9s de classe interpr\u00e9tables<\/strong>, tandis que les SVM s&rsquo;en sortent plut\u00f4t mieux lorsque les deux camps sont nettement distincts.<\/p>\n<p>Autre id\u00e9e re\u00e7ue \u00e0 l\u00e2cher : l&rsquo;astuce du noyau n&rsquo;est pas propre aux SVM. Elle peut s&rsquo;appliquer, avec des pr\u00e9cautions de calcul, \u00e0 la r\u00e9gression logistique ou \u00e0 d&rsquo;autres m\u00e9thodes ; c&rsquo;est surtout pour des raisons historiques qu&rsquo;on l&rsquo;associe aux seules machines \u00e0 vecteurs de support.<\/p>\n<p>Au-del\u00e0 de deux classes, on combine plusieurs SVM binaires, par des strat\u00e9gies un contre un ou un contre tous.<\/p>","protected":false},"excerpt":{"rendered":"<p>Marge, vecteurs de support, marge souple, noyau : comprends ce qu&rsquo;est une machine \u00e0 vecteurs de support et comment elle trace sa fronti\u00e8re, avec le code.<\/p>\n","protected":false},"author":1,"featured_media":615,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[],"class_list":["post-616","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-machine-learning"],"_links":{"self":[{"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/posts\/616","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/comments?post=616"}],"version-history":[{"count":3,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/posts\/616\/revisions"}],"predecessor-version":[{"id":773,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/posts\/616\/revisions\/773"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/media\/615"}],"wp:attachment":[{"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/media?parent=616"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/categories?post=616"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/tags?post=616"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}