{"version":"1.0","provider_name":"","provider_url":"https:\/\/beta.reboot-conseil.com","author_name":"Yohann Jolain","author_url":"https:\/\/beta.reboot-conseil.com\/index.php\/author\/yohann\/","title":"La cross-validation avec scikit-learn -","type":"rich","width":600,"height":338,"html":"<blockquote class=\"wp-embedded-content\" data-secret=\"CjVt8WQAI1\"><a href=\"https:\/\/beta.reboot-conseil.com\/index.php\/2024\/04\/26\/la-cross-validation-avec-scikit-learn\/\">La cross-validation avec scikit-learn<\/a><\/blockquote><iframe sandbox=\"allow-scripts\" security=\"restricted\" src=\"https:\/\/beta.reboot-conseil.com\/index.php\/2024\/04\/26\/la-cross-validation-avec-scikit-learn\/embed\/#?secret=CjVt8WQAI1\" width=\"600\" height=\"338\" title=\"\u00ab\u00a0La cross-validation avec scikit-learn\u00a0\u00bb &#8212; \" data-secret=\"CjVt8WQAI1\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\" class=\"wp-embedded-content\"><\/iframe><script>\n\/*! This file is auto-generated *\/\n!function(d,l){\"use strict\";l.querySelector&&d.addEventListener&&\"undefined\"!=typeof URL&&(d.wp=d.wp||{},d.wp.receiveEmbedMessage||(d.wp.receiveEmbedMessage=function(e){var t=e.data;if((t||t.secret||t.message||t.value)&&!\/[^a-zA-Z0-9]\/.test(t.secret)){for(var s,r,n,a=l.querySelectorAll('iframe[data-secret=\"'+t.secret+'\"]'),o=l.querySelectorAll('blockquote[data-secret=\"'+t.secret+'\"]'),c=new RegExp(\"^https?:$\",\"i\"),i=0;i<o.length;i++)o[i].style.display=\"none\";for(i=0;i<a.length;i++)s=a[i],e.source===s.contentWindow&&(s.removeAttribute(\"style\"),\"height\"===t.message?(1e3<(r=parseInt(t.value,10))?r=1e3:~~r<200&&(r=200),s.height=r):\"link\"===t.message&&(r=new URL(s.getAttribute(\"src\")),n=new URL(t.value),c.test(n.protocol))&&n.host===r.host&&l.activeElement===s&&(d.top.location.href=t.value))}},d.addEventListener(\"message\",d.wp.receiveEmbedMessage,!1),l.addEventListener(\"DOMContentLoaded\",function(){for(var e,t,s=l.querySelectorAll(\"iframe.wp-embedded-content\"),r=0;r<s.length;r++)(t=(e=s[r]).getAttribute(\"data-secret\"))||(t=Math.random().toString(36).substring(2,12),e.src+=\"#?secret=\"+t,e.setAttribute(\"data-secret\",t)),e.contentWindow.postMessage({message:\"ready\",secret:t},\"*\")},!1)))}(window,document);\n\/\/# sourceURL=https:\/\/beta.reboot-conseil.com\/wp-includes\/js\/wp-embed.min.js\n<\/script>\n","thumbnail_url":"https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2024\/04\/crossvalidation.jpg","thumbnail_width":1024,"thumbnail_height":1024,"description":"Avant de commencer, cet article est la suite de l&rsquo;article sur la cr\u00e9ation de mod\u00e8les avec scikit-learn. Je vais reprendre beaucoup de concepts que j&rsquo;ai expliqu\u00e9s dans cet article et surtout beaucoup de code. M\u00eame si je vais r\u00e9expliquer mon code, je le ferai plus bri\u00e8vement. Si vous souhaitez avoir des explications suppl\u00e9mentaires, je vous conseille vivement de lire mon article pr\u00e9c\u00e9dent sur scikit-learn et celui sur l&rsquo;introduction au Machine Learning. Maintenant que les bases sont pos\u00e9es, commen\u00e7ons ! Qu&rsquo;est ce que la cross-validation ? La cross-validation, ou validation crois\u00e9e en bon Fran\u00e7ais, c&rsquo;est une m\u00e9thode d&rsquo;entrainement qui consiste \u00e0 entra\u00eener plusieurs fois un mod\u00e8le sur le m\u00eame dataset, mais en changeant \u00e0 chaque fois le jeu d&rsquo;entra\u00eenement et de test (qui provienne du coup de diff\u00e9rentes parties du dataset). On mesure ensuite le score de test de chacun des mod\u00e8les entra\u00een\u00e9s et on fait une moyenne pour mesurer la performance de l&rsquo;algorithme. Entre chaque entra\u00eenement, le mod\u00e8le est naturellement r\u00e9initialis\u00e9, pour \u00e9viter qu&rsquo;il apprenne tout le dataset. L&rsquo;objectif de ces diff\u00e9rents entra\u00eenements est d&rsquo;\u00eatre s\u00fbr que la m\u00e9thode qu&rsquo;on a utilis\u00e9e est correcte, et que le split des donn\u00e9es, entre jeu d&rsquo;entra\u00eenement et jeu de test n&rsquo;a pas \u00e9t\u00e9 favorable \u00e0 un algorithme ou \u00e0 un autre. Pour le dire autrement, le but est d&rsquo;\u00eatre s\u00fbr que le mod\u00e8le a bien g\u00e9n\u00e9ralis\u00e9 le probl\u00e8me qu&rsquo;il essaie de r\u00e9soudre, et que les mesures de performances en rendent bien compte. La mani\u00e8re dont le jeu de donn\u00e9es est s\u00e9par\u00e9 lors d&rsquo;une cross-validation, d\u00e9pend de la strat\u00e9gie de cross-validation que l&rsquo;on choisit. Il y a, en effet, plusieurs mani\u00e8res de s\u00e9parer un jeu de donn\u00e9es et le choix de la strat\u00e9gie d\u00e9pend du jeu de donn\u00e9es et de ce que l&rsquo;on veut faire. Cet article va couvrir les plus communes. Une pr\u00e9cision n\u00e9anmoins, vous l&rsquo;avez peut-\u00eatre d\u00e9j\u00e0 compris, mais le but de la validation crois\u00e9e n&rsquo;est pas d&rsquo;am\u00e9liorer les performances de notre mod\u00e8le, mais bien de mesurer de mani\u00e8re plus fiable ses performances pour les comparer plus pr\u00e9cis\u00e9ment avec d&rsquo;autres mod\u00e8les. Notre mod\u00e8le et jeu de donn\u00e9es Comme pour l&rsquo;article pr\u00e9c\u00e9dent, mon jeu de donn\u00e9es sera l&rsquo;Adult Census Income. Cela nous permettra de retrouver des rep\u00e8res pris pr\u00e9c\u00e9demment, notamment sur l&rsquo;objectif du mod\u00e8le. En effet, le mod\u00e8le aura le m\u00eame but, d\u00e9terminer, \u00e0 partir des informations qu&rsquo;on a, si le salaire de la personne est sup\u00e9rieur ou non \u00e0 $50k par an. Pour le mod\u00e8le, nous allons changer un peu l&rsquo;algorithme, je vais utiliser une Random Forest, une for\u00eat al\u00e9atoire. Sans n\u00e9cessairement rentrer dans le d\u00e9tail, une f\u00f4ret al\u00e9atoire est un ensemble d&rsquo;arbres de d\u00e9cisions, qui sont entrain\u00e9s chacun sur une petite partie des donn\u00e9es, et le mod\u00e8le prend sa d\u00e9cision en faisant une moyenne des r\u00e9ponses des arbres de d\u00e9cisions. Voici donc le mod\u00e8le qui va servir de base pour la cross-validation : Ce mod\u00e8le est donc une for\u00eat al\u00e9atoire, et le mod\u00e8le prend soin de pr\u00e9traiter les donn\u00e9es num\u00e9riques et cat\u00e9goriques pour normaliser les premi\u00e8res et num\u00e9riser les secondes. Bref rappel Dans le premier article pour entrainer le mod\u00e8le, nous utilisions la fonction train_test_split qui s\u00e9parait le jeu de donn\u00e9es en 2 jeux. Cette fonction s\u00e9pare al\u00e9atoirement le dataset en jeu d&rsquo;entra\u00eenement et de validation. Cette s\u00e9paration a beau \u00eatre al\u00e9atoire, elle peut n\u00e9anmoins \u00eatre biais\u00e9e, en cr\u00e9ant des d\u00e9s\u00e9quilibres de donn\u00e9es qui peuvent soit rendre notre mod\u00e8le moins performant ou au contraire le favoriser.Le but des mod\u00e8les que l&rsquo;on cr\u00e9e est de g\u00e9n\u00e9raliser les r\u00e8gles permettant de d\u00e9duire de nos entr\u00e9es, la cible, et de s&rsquo;adapter aux nouvelles donn\u00e9es. Il est donc important que la mesure des performances soit la plus pr\u00e9cise et neutre possible, en \u00e9liminant le plus de biais \u00e9ventuels. Validation crois\u00e9e par K-blocs La premi\u00e8re strat\u00e9gie de cross-validation que nous allons voir est la strat\u00e9gie par K-blocs (ou KFold en anglais). Le principe est simple, on va diviser le dataset en K-parties, o\u00f9 K est un nombre entier qu&rsquo;on choisit \u00e0 l&rsquo;avance (entre 5 et 10 en g\u00e9n\u00e9ral), et on va entra\u00eener K mod\u00e8les avec \u00e0 chaque fois 1 partie du dataset qui sert de jeu de test, et les autres parties qui servent de jeu d&rsquo;entrainement. La partie qui sert de jeu de test n&rsquo;est jamais la m\u00eame, \u00e9videmment. Comment impl\u00e9mente-t-on \u00e7a avec scikit-learn ? La premi\u00e8re chose \u00e0 savoir, c&rsquo;est comment faire une validation crois\u00e9e. Pour cela, il y a la fonction cross_validate qui permet de faciliter ce processus. Ensuite, pour le KFold, il y a la classe KFold qui permet de cr\u00e9er ces diff\u00e9rentes segmentations du dataset. Par d\u00e9faut, la m\u00e9thode cross_validate retourne 3 informations par splits : le temps d&rsquo;entra\u00eenement, le temps pour mesurer le score et le score de test. Dans le code ci-dessus, vous pouvez voir comment on effectue une cross-validation. D&rsquo;abord, on cr\u00e9e la strat\u00e9gie avec, ici, la classe KFold. Le param\u00e8tre n_splits indique le nombre de parties du dataset que l&rsquo;on cr\u00e9e (ce que j&rsquo;ai appel\u00e9 K jusque maintenant). Ensuite, on appelle la fonction cross_validate, qui prend en pram\u00e8tre le mod\u00e8le, les donn\u00e9es, et la cible. On sp\u00e9cifie ensuite le cv, qui est la strat\u00e9gie de validation crois\u00e9e que l&rsquo;on veut, et on peut ensuite aussi pr\u00e9ciser la m\u00e9trique de score avec le param\u00e8tre scoring. Ce dernier param\u00e8tre peut \u00eatre une chaine de caract\u00e8res pr\u00e9d\u00e9finie par scikit-learn ou une fonction de score. On r\u00e9cup\u00e8re ensuite les r\u00e9sultats, que j&rsquo;ai convertis ici en DataFrame pour les manipuler plus facilement. On peut ainsi voir ici, le score de chaque instance du mod\u00e8le entrain\u00e9. Plut\u00f4t facile, non ? Maintenant que nous avons vu la base, nous allons pouvoir voir d&rsquo;autres strat\u00e9gies. La s\u00e9paration par K-blocs stratifi\u00e9s Le principe de s\u00e9paration par K-blocs stratifi\u00e9s est l\u00e9g\u00e8rement diff\u00e9rent de celui par K bloc, et il s&rsquo;applique uniquemen pour des probl\u00e8mes de classification. L&rsquo;objectif de cette s\u00e9paration va toujours \u00eatre de cr\u00e9er K parties du dataset, mais ce coup-ci, on va vouloir que chaque partie, chaque bloc, contiennent la m\u00eame r\u00e9partition de donn\u00e9es. Je m&rsquo;explique, reprenons notre dataset, l&rsquo;Adult Census Income. Ce dataset"}