{"id":977,"date":"2024-04-26T15:06:24","date_gmt":"2024-04-26T14:06:24","guid":{"rendered":"https:\/\/ai.reboot-conseil.com\/?p=977"},"modified":"2024-04-26T15:06:25","modified_gmt":"2024-04-26T14:06:25","slug":"la-cross-validation-avec-scikit-learn","status":"publish","type":"post","link":"https:\/\/beta.reboot-conseil.com\/index.php\/2024\/04\/26\/la-cross-validation-avec-scikit-learn\/","title":{"rendered":"La cross-validation avec scikit-learn"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Avant de commencer, cet article est la suite de <a href=\"https:\/\/ai.reboot-conseil.com\/index.php\/2024\/02\/29\/creez-des-modeles-de-machine-learning-avec-scikit-learn\/\" data-type=\"link\" data-id=\"https:\/\/ai.reboot-conseil.com\/index.php\/2024\/02\/29\/creez-des-modeles-de-machine-learning-avec-scikit-learn\/\">l&rsquo;article sur la cr\u00e9ation de mod\u00e8les avec scikit-learn<\/a>. 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 <a href=\"https:\/\/ai.reboot-conseil.com\/index.php\/2024\/02\/29\/creez-des-modeles-de-machine-learning-avec-scikit-learn\/\">mon article pr\u00e9c\u00e9dent sur scikit-learn<\/a> et celui sur <a href=\"https:\/\/ai.reboot-conseil.com\/index.php\/2024\/01\/25\/retour-aux-fondamentaux-le-machine-learning\/\" data-type=\"link\" data-id=\"https:\/\/ai.reboot-conseil.com\/index.php\/2024\/01\/25\/retour-aux-fondamentaux-le-machine-learning\/\">l&rsquo;introduction au Machine Learning<\/a>. Maintenant que les bases sont pos\u00e9es, commen\u00e7ons !<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Qu&rsquo;est ce que la cross-validation ?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">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.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">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.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">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.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">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.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Notre mod\u00e8le et jeu de donn\u00e9es<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Comme pour l&rsquo;article pr\u00e9c\u00e9dent, mon jeu de donn\u00e9es sera l&rsquo;<a href=\"https:\/\/www.kaggle.com\/datasets\/uciml\/adult-census-income\">Adult Census Income<\/a>. 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.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pour le mod\u00e8le, nous allons changer un peu l&rsquo;algorithme, je vais utiliser une <a href=\"https:\/\/scikit-learn.org\/stable\/modules\/generated\/sklearn.ensemble.RandomForestClassifier.html#sklearn.ensemble.RandomForestClassifier\" data-type=\"link\" data-id=\"https:\/\/scikit-learn.org\/stable\/modules\/generated\/sklearn.ensemble.RandomForestClassifier.html#sklearn.ensemble.RandomForestClassifier\"><code>Random Forest<\/code><\/a>, une for\u00eat al\u00e9atoire. Sans n\u00e9cessairement rentrer dans le d\u00e9tail, une f\u00f4ret al\u00e9atoire est un <a href=\"https:\/\/scikit-learn.org\/stable\/modules\/ensemble.html#ensemble\" data-type=\"link\" data-id=\"https:\/\/scikit-learn.org\/stable\/modules\/ensemble.html#ensemble\">ensemble<\/a> 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 : <\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img fetchpriority=\"high\" decoding=\"async\" width=\"956\" height=\"542\" src=\"https:\/\/ai.reboot-conseil.com\/wp-content\/uploads\/2024\/04\/image.png\" alt=\"\" class=\"wp-image-979\" style=\"width:740px;height:auto\" srcset=\"https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2024\/04\/image.png 956w, https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2024\/04\/image-300x170.png 300w, https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2024\/04\/image-768x435.png 768w\" sizes=\"(max-width: 956px) 100vw, 956px\" \/><figcaption class=\"wp-element-caption\">Mod\u00e8le de base pour cet article<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">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.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Bref rappel<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Dans le premier article pour entrainer le mod\u00e8le, nous utilisions la fonction <code><a href=\"https:\/\/scikit-learn.org\/stable\/modules\/generated\/sklearn.model_selection.train_test_split.html#sklearn.model_selection.train_test_split\">train_test_split<\/a> <\/code>qui s\u00e9parait le jeu de donn\u00e9es en 2 jeux.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"926\" height=\"143\" src=\"https:\/\/ai.reboot-conseil.com\/wp-content\/uploads\/2024\/04\/image-1.png\" alt=\"\" class=\"wp-image-980\" srcset=\"https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2024\/04\/image-1.png 926w, https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2024\/04\/image-1-300x46.png 300w, https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2024\/04\/image-1-768x119.png 768w\" sizes=\"(max-width: 926px) 100vw, 926px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">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.<br>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.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Validation crois\u00e9e par K-blocs<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La premi\u00e8re strat\u00e9gie de cross-validation que nous allons voir est la strat\u00e9gie par <a href=\"https:\/\/scikit-learn.org\/stable\/modules\/generated\/sklearn.model_selection.KFold.html#sklearn.model_selection.KFold\">K-blocs<\/a> (ou <a href=\"https:\/\/scikit-learn.org\/stable\/modules\/generated\/sklearn.model_selection.KFold.html#sklearn.model_selection.KFold\">KFold<\/a> 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.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><img decoding=\"async\" width=\"1024\" height=\"543\" src=\"https:\/\/ai.reboot-conseil.com\/wp-content\/uploads\/2024\/04\/image-2-1024x543.png\" alt=\"\" class=\"wp-image-984\" srcset=\"https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2024\/04\/image-2-1024x543.png 1024w, https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2024\/04\/image-2-300x159.png 300w, https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2024\/04\/image-2-768x407.png 768w, https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2024\/04\/image-2.png 1048w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">D\u00e9coupage du dataset en KFold (K = 4)<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">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 <code><a href=\"https:\/\/scikit-learn.org\/stable\/modules\/generated\/sklearn.model_selection.cross_validate.html#sklearn.model_selection.cross_validate\">cross_validate<\/a> <\/code>qui permet de faciliter ce processus. Ensuite, pour le KFold, il y a la classe <code><a href=\"https:\/\/scikit-learn.org\/stable\/modules\/generated\/sklearn.model_selection.KFold.html#sklearn.model_selection.KFold\">KFold<\/a> <\/code>qui permet de cr\u00e9er ces diff\u00e9rentes segmentations du dataset. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Par d\u00e9faut, la m\u00e9thode <code>cross_validate<\/code> retourne 3 informations par splits : le temps d&rsquo;entra\u00eenement, le temps pour mesurer le score et le score de test.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"720\" height=\"357\" src=\"https:\/\/ai.reboot-conseil.com\/wp-content\/uploads\/2024\/04\/image-4.png\" alt=\"\" class=\"wp-image-986\" srcset=\"https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2024\/04\/image-4.png 720w, https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2024\/04\/image-4-300x149.png 300w\" sizes=\"(max-width: 720px) 100vw, 720px\" \/><figcaption class=\"wp-element-caption\">Validation crois\u00e9e avec scikit-learn<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">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 <code>KFold<\/code>. Le param\u00e8tre <code>n_splits<\/code> indique le nombre de parties du dataset que l&rsquo;on cr\u00e9e (ce que j&rsquo;ai appel\u00e9 K jusque maintenant).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ensuite, on appelle la fonction <code>cross_validate<\/code>, qui prend en pram\u00e8tre le mod\u00e8le, les donn\u00e9es, et la cible. On sp\u00e9cifie ensuite le <code>cv<\/code>, 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 <code>scoring<\/code>. Ce dernier param\u00e8tre peut \u00eatre une <a href=\"https:\/\/scikit-learn.org\/stable\/modules\/model_evaluation.html#scoring-parameter\">chaine de caract\u00e8res pr\u00e9d\u00e9finie par scikit-learn<\/a> ou <a href=\"https:\/\/scikit-learn.org\/stable\/modules\/model_evaluation.html#scoring\">une fonction de score<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">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.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Plut\u00f4t facile, non ? Maintenant que nous avons vu la base, nous allons pouvoir voir d&rsquo;autres strat\u00e9gies.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">La s\u00e9paration par K-blocs stratifi\u00e9s<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">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;<a href=\"https:\/\/www.kaggle.com\/datasets\/uciml\/adult-census-income\">Adult Census Income<\/a>. Ce dataset contient les donn\u00e9es de 32 000 foyers am\u00e9ricains. Parmi ces foyers, 76% d&rsquo;entre eux ont un revenu en dessous de $50K, et 24% au dessus de $50K. La s\u00e9paration en K-blocs stratifi\u00e9s va faire en sorte que dans chaque bloc, il y ait 76% de foyers avec un revenu en dessous de $50K et 24% au dessus de $50K.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"574\" src=\"https:\/\/ai.reboot-conseil.com\/wp-content\/uploads\/2024\/04\/image-5-1024x574.png\" alt=\"\" class=\"wp-image-988\" srcset=\"https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2024\/04\/image-5-1024x574.png 1024w, https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2024\/04\/image-5-300x168.png 300w, https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2024\/04\/image-5-768x430.png 768w, https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2024\/04\/image-5.png 1119w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">D\u00e9coupage du dataset en Stratified KFold (K = 4)<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Cela garantit que toutes les donn\u00e9es sont correctement repr\u00e9sent\u00e9es dans chacun des blocs. Mais cela suppose aussi que le dataset repr\u00e9sente correctement les donn\u00e9es que nous allons rencontrer en production (ce qui devrait \u00eatre le cas, mais ne l&rsquo;est pas toujours).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Passons \u00e0 l&rsquo;impl\u00e9mentation, et comme toujours, scikit-learn a une classe pour nous aider : <a href=\"https:\/\/scikit-learn.org\/stable\/modules\/generated\/sklearn.model_selection.StratifiedKFold.html#sklearn.model_selection.StratifiedKFold\"><code>StratifiedKFold<\/code><\/a>. Et elle s&rsquo;utilise de la mani\u00e8re suivante : <\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"866\" height=\"166\" src=\"https:\/\/ai.reboot-conseil.com\/wp-content\/uploads\/2024\/04\/image-6.png\" alt=\"\" class=\"wp-image-989\" srcset=\"https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2024\/04\/image-6.png 866w, https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2024\/04\/image-6-300x58.png 300w, https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2024\/04\/image-6-768x147.png 768w\" sizes=\"(max-width: 866px) 100vw, 866px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Comme pour la s\u00e9paration en K-blocs, <code>StratifiedKFold<\/code> prend un param\u00e8tre <code>n_splits <\/code>qui permet de d\u00e9finir le nombre de blocs que nous souhaitons cr\u00e9er. Le reste du code est similaire.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Juste une petite pr\u00e9cision sur le contenu du print :  une mani\u00e8re de pr\u00e9senter les r\u00e9sultats d&rsquo;un cross-validation est d&rsquo;afficher la moyenne des scores de tests avec une marge d&rsquo;erreur correspondant \u00e0 l&rsquo;\u00e9cart-type des r\u00e9sultats. Cela permet de pr\u00e9senter simplement les donn\u00e9es et les comparer facilement.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Une autre chose que je souhaite vous montrer avec la m\u00e9thode <code>cross_validate<\/code>, c&rsquo;est que le param\u00e8tre <code>cv <\/code>accepte aussi comme valeur des entiers. La strat\u00e9gie de split utilis\u00e9e sera alors la s\u00e9paration par K-blocs stratifi\u00e9s pour les classifications et une simple s\u00e9paration par K-blocs pour les r\u00e9gressions.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">La s\u00e9paration al\u00e9atoire<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La s\u00e9paration al\u00e9atoire, comme son nom l&rsquo;indique, va s\u00e9parer, pour chaque instance de mod\u00e8le, le jeu de donn\u00e9es al\u00e9atoirement entre jeu d&rsquo;entra\u00eenement et jeu de test. On doit d\u00e9finir 2 choses : le nombre de s\u00e9parations que l&rsquo;on souhaite faire et la taille du jeu de test.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"606\" src=\"https:\/\/ai.reboot-conseil.com\/wp-content\/uploads\/2024\/04\/image-7-1024x606.png\" alt=\"\" class=\"wp-image-992\" srcset=\"https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2024\/04\/image-7-1024x606.png 1024w, https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2024\/04\/image-7-300x177.png 300w, https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2024\/04\/image-7-768x454.png 768w, https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2024\/04\/image-7.png 1045w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">S\u00e9paration al\u00e9atoire<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Dans scikit-learn, la classe qui impl\u00e9mente \u00e7a est <code><a href=\"https:\/\/scikit-learn.org\/stable\/modules\/generated\/sklearn.model_selection.ShuffleSplit.html#sklearn.model_selection.ShuffleSplit\">ShuffleSplit<\/a><\/code> et elle s&rsquo;impl\u00e9mente de la fa\u00e7on suivante : <\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"876\" height=\"163\" src=\"https:\/\/ai.reboot-conseil.com\/wp-content\/uploads\/2024\/04\/image-9.png\" alt=\"\" class=\"wp-image-994\" srcset=\"https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2024\/04\/image-9.png 876w, https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2024\/04\/image-9-300x56.png 300w, https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2024\/04\/image-9-768x143.png 768w\" sizes=\"(max-width: 876px) 100vw, 876px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Ici, on va entra\u00eener 10 mod\u00e8les avec une s\u00e9paration 80\/20 des donn\u00e9es entre jeu d&rsquo;entra\u00eenement et jeu de test. Le reste du code reste le m\u00eame.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La validation crois\u00e9e est un processus qui permet de comparer de mani\u00e8re plus pr\u00e9cise et fiable, les diff\u00e9rentes architectures de mod\u00e8les, en r\u00e9duisant les biais qui peuvent \u00eatre associ\u00e9s \u00e0 la s\u00e9paration des jeux d&rsquo;entra\u00eenement et de test. Le m\u00e9canisme principal mis en jeu lors de ce processus, est d&rsquo;entrainer plusieurs mod\u00e8les avec des jeux d&rsquo;entra\u00eenement et de test diff\u00e9rents, m\u00eame s&rsquo;ils restent issus du m\u00eame dataset.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Il existe beaucoup de strat\u00e9gies possibles pour s\u00e9parer les donn\u00e9es lors de la cross-validation, cet article en couvre 3, mais scikit-learn en propose bien d&rsquo;autres. Vous pouvez les retrouver dans leur <a href=\"https:\/\/scikit-learn.org\/stable\/modules\/classes.html#splitter-classes\">documentation<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>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<\/p>\n","protected":false},"author":4,"featured_media":997,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[40,1],"tags":[55,7,37,65],"class_list":["post-977","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutoriels","category-uncategorized","tag-fondamentaux","tag-ia","tag-machine-learning","tag-scikit-learn"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.7 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>La cross-validation avec scikit-learn -<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/beta.reboot-conseil.com\/index.php\/2024\/04\/26\/la-cross-validation-avec-scikit-learn\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"La cross-validation avec scikit-learn -\" \/>\n<meta property=\"og:description\" content=\"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\" \/>\n<meta property=\"og:url\" content=\"https:\/\/beta.reboot-conseil.com\/index.php\/2024\/04\/26\/la-cross-validation-avec-scikit-learn\/\" \/>\n<meta property=\"article:published_time\" content=\"2024-04-26T14:06:24+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-26T14:06:25+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2024\/04\/crossvalidation.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"1024\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Yohann Jolain\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"Yohann Jolain\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/beta.reboot-conseil.com\/index.php\/2024\/04\/26\/la-cross-validation-avec-scikit-learn\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/beta.reboot-conseil.com\/index.php\/2024\/04\/26\/la-cross-validation-avec-scikit-learn\/\"},\"author\":{\"name\":\"Yohann Jolain\",\"@id\":\"https:\/\/beta.reboot-conseil.com\/#\/schema\/person\/bacb74c31f0df7384807193ebe0a205d\"},\"headline\":\"La cross-validation avec scikit-learn\",\"datePublished\":\"2024-04-26T14:06:24+00:00\",\"dateModified\":\"2024-04-26T14:06:25+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/beta.reboot-conseil.com\/index.php\/2024\/04\/26\/la-cross-validation-avec-scikit-learn\/\"},\"wordCount\":1728,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/beta.reboot-conseil.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/beta.reboot-conseil.com\/index.php\/2024\/04\/26\/la-cross-validation-avec-scikit-learn\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2024\/04\/crossvalidation.jpg\",\"keywords\":[\"Fondamentaux\",\"IA\",\"Machine Learning\",\"scikit-learn\"],\"articleSection\":[\"Tutoriels\",\"Uncategorized\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/beta.reboot-conseil.com\/index.php\/2024\/04\/26\/la-cross-validation-avec-scikit-learn\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/beta.reboot-conseil.com\/index.php\/2024\/04\/26\/la-cross-validation-avec-scikit-learn\/\",\"url\":\"https:\/\/beta.reboot-conseil.com\/index.php\/2024\/04\/26\/la-cross-validation-avec-scikit-learn\/\",\"name\":\"La cross-validation avec scikit-learn -\",\"isPartOf\":{\"@id\":\"https:\/\/beta.reboot-conseil.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/beta.reboot-conseil.com\/index.php\/2024\/04\/26\/la-cross-validation-avec-scikit-learn\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/beta.reboot-conseil.com\/index.php\/2024\/04\/26\/la-cross-validation-avec-scikit-learn\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2024\/04\/crossvalidation.jpg\",\"datePublished\":\"2024-04-26T14:06:24+00:00\",\"dateModified\":\"2024-04-26T14:06:25+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/beta.reboot-conseil.com\/index.php\/2024\/04\/26\/la-cross-validation-avec-scikit-learn\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/beta.reboot-conseil.com\/index.php\/2024\/04\/26\/la-cross-validation-avec-scikit-learn\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/beta.reboot-conseil.com\/index.php\/2024\/04\/26\/la-cross-validation-avec-scikit-learn\/#primaryimage\",\"url\":\"https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2024\/04\/crossvalidation.jpg\",\"contentUrl\":\"https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2024\/04\/crossvalidation.jpg\",\"width\":1024,\"height\":1024},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/beta.reboot-conseil.com\/index.php\/2024\/04\/26\/la-cross-validation-avec-scikit-learn\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/beta.reboot-conseil.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"La cross-validation avec scikit-learn\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/beta.reboot-conseil.com\/#website\",\"url\":\"https:\/\/beta.reboot-conseil.com\/\",\"name\":\"AI Squad\",\"description\":\"Dans le doute, Reboot\",\"publisher\":{\"@id\":\"https:\/\/beta.reboot-conseil.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/beta.reboot-conseil.com\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/beta.reboot-conseil.com\/#organization\",\"name\":\"AI Squad By Reboot Conseil\",\"url\":\"https:\/\/beta.reboot-conseil.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/beta.reboot-conseil.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2023\/09\/cropped-cropped-Logo-IA-Squad-by-Reboot-Conseil-3.png\",\"contentUrl\":\"https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2023\/09\/cropped-cropped-Logo-IA-Squad-by-Reboot-Conseil-3.png\",\"width\":500,\"height\":218,\"caption\":\"AI Squad By Reboot Conseil\"},\"image\":{\"@id\":\"https:\/\/beta.reboot-conseil.com\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/beta.reboot-conseil.com\/#\/schema\/person\/bacb74c31f0df7384807193ebe0a205d\",\"name\":\"Yohann Jolain\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/beta.reboot-conseil.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/771bceb60c3835e74bae64ff0a958295632caea61088783f3e9a9e648705c500?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/771bceb60c3835e74bae64ff0a958295632caea61088783f3e9a9e648705c500?s=96&d=mm&r=g\",\"caption\":\"Yohann Jolain\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"La cross-validation avec scikit-learn -","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/beta.reboot-conseil.com\/index.php\/2024\/04\/26\/la-cross-validation-avec-scikit-learn\/","og_locale":"fr_FR","og_type":"article","og_title":"La cross-validation avec scikit-learn -","og_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","og_url":"https:\/\/beta.reboot-conseil.com\/index.php\/2024\/04\/26\/la-cross-validation-avec-scikit-learn\/","article_published_time":"2024-04-26T14:06:24+00:00","article_modified_time":"2024-04-26T14:06:25+00:00","og_image":[{"width":1024,"height":1024,"url":"https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2024\/04\/crossvalidation.jpg","type":"image\/jpeg"}],"author":"Yohann Jolain","twitter_card":"summary_large_image","twitter_misc":{"\u00c9crit par":"Yohann Jolain","Dur\u00e9e de lecture estim\u00e9e":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/beta.reboot-conseil.com\/index.php\/2024\/04\/26\/la-cross-validation-avec-scikit-learn\/#article","isPartOf":{"@id":"https:\/\/beta.reboot-conseil.com\/index.php\/2024\/04\/26\/la-cross-validation-avec-scikit-learn\/"},"author":{"name":"Yohann Jolain","@id":"https:\/\/beta.reboot-conseil.com\/#\/schema\/person\/bacb74c31f0df7384807193ebe0a205d"},"headline":"La cross-validation avec scikit-learn","datePublished":"2024-04-26T14:06:24+00:00","dateModified":"2024-04-26T14:06:25+00:00","mainEntityOfPage":{"@id":"https:\/\/beta.reboot-conseil.com\/index.php\/2024\/04\/26\/la-cross-validation-avec-scikit-learn\/"},"wordCount":1728,"commentCount":0,"publisher":{"@id":"https:\/\/beta.reboot-conseil.com\/#organization"},"image":{"@id":"https:\/\/beta.reboot-conseil.com\/index.php\/2024\/04\/26\/la-cross-validation-avec-scikit-learn\/#primaryimage"},"thumbnailUrl":"https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2024\/04\/crossvalidation.jpg","keywords":["Fondamentaux","IA","Machine Learning","scikit-learn"],"articleSection":["Tutoriels","Uncategorized"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/beta.reboot-conseil.com\/index.php\/2024\/04\/26\/la-cross-validation-avec-scikit-learn\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/beta.reboot-conseil.com\/index.php\/2024\/04\/26\/la-cross-validation-avec-scikit-learn\/","url":"https:\/\/beta.reboot-conseil.com\/index.php\/2024\/04\/26\/la-cross-validation-avec-scikit-learn\/","name":"La cross-validation avec scikit-learn -","isPartOf":{"@id":"https:\/\/beta.reboot-conseil.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/beta.reboot-conseil.com\/index.php\/2024\/04\/26\/la-cross-validation-avec-scikit-learn\/#primaryimage"},"image":{"@id":"https:\/\/beta.reboot-conseil.com\/index.php\/2024\/04\/26\/la-cross-validation-avec-scikit-learn\/#primaryimage"},"thumbnailUrl":"https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2024\/04\/crossvalidation.jpg","datePublished":"2024-04-26T14:06:24+00:00","dateModified":"2024-04-26T14:06:25+00:00","breadcrumb":{"@id":"https:\/\/beta.reboot-conseil.com\/index.php\/2024\/04\/26\/la-cross-validation-avec-scikit-learn\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/beta.reboot-conseil.com\/index.php\/2024\/04\/26\/la-cross-validation-avec-scikit-learn\/"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/beta.reboot-conseil.com\/index.php\/2024\/04\/26\/la-cross-validation-avec-scikit-learn\/#primaryimage","url":"https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2024\/04\/crossvalidation.jpg","contentUrl":"https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2024\/04\/crossvalidation.jpg","width":1024,"height":1024},{"@type":"BreadcrumbList","@id":"https:\/\/beta.reboot-conseil.com\/index.php\/2024\/04\/26\/la-cross-validation-avec-scikit-learn\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/beta.reboot-conseil.com\/"},{"@type":"ListItem","position":2,"name":"La cross-validation avec scikit-learn"}]},{"@type":"WebSite","@id":"https:\/\/beta.reboot-conseil.com\/#website","url":"https:\/\/beta.reboot-conseil.com\/","name":"AI Squad","description":"Dans le doute, Reboot","publisher":{"@id":"https:\/\/beta.reboot-conseil.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/beta.reboot-conseil.com\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/beta.reboot-conseil.com\/#organization","name":"AI Squad By Reboot Conseil","url":"https:\/\/beta.reboot-conseil.com\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/beta.reboot-conseil.com\/#\/schema\/logo\/image\/","url":"https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2023\/09\/cropped-cropped-Logo-IA-Squad-by-Reboot-Conseil-3.png","contentUrl":"https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2023\/09\/cropped-cropped-Logo-IA-Squad-by-Reboot-Conseil-3.png","width":500,"height":218,"caption":"AI Squad By Reboot Conseil"},"image":{"@id":"https:\/\/beta.reboot-conseil.com\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/beta.reboot-conseil.com\/#\/schema\/person\/bacb74c31f0df7384807193ebe0a205d","name":"Yohann Jolain","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/beta.reboot-conseil.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/771bceb60c3835e74bae64ff0a958295632caea61088783f3e9a9e648705c500?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/771bceb60c3835e74bae64ff0a958295632caea61088783f3e9a9e648705c500?s=96&d=mm&r=g","caption":"Yohann Jolain"}}]}},"_links":{"self":[{"href":"https:\/\/beta.reboot-conseil.com\/index.php\/wp-json\/wp\/v2\/posts\/977","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/beta.reboot-conseil.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/beta.reboot-conseil.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/beta.reboot-conseil.com\/index.php\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/beta.reboot-conseil.com\/index.php\/wp-json\/wp\/v2\/comments?post=977"}],"version-history":[{"count":9,"href":"https:\/\/beta.reboot-conseil.com\/index.php\/wp-json\/wp\/v2\/posts\/977\/revisions"}],"predecessor-version":[{"id":996,"href":"https:\/\/beta.reboot-conseil.com\/index.php\/wp-json\/wp\/v2\/posts\/977\/revisions\/996"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/beta.reboot-conseil.com\/index.php\/wp-json\/wp\/v2\/media\/997"}],"wp:attachment":[{"href":"https:\/\/beta.reboot-conseil.com\/index.php\/wp-json\/wp\/v2\/media?parent=977"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/beta.reboot-conseil.com\/index.php\/wp-json\/wp\/v2\/categories?post=977"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/beta.reboot-conseil.com\/index.php\/wp-json\/wp\/v2\/tags?post=977"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}