	{"id":21214,"date":"2020-11-25T09:21:16","date_gmt":"2020-11-25T09:21:16","guid":{"rendered":"https:\/\/www.artefact.com\/?post_type=news&#038;p=21214"},"modified":"2024-09-20T17:45:14","modified_gmt":"2024-09-20T16:45:14","slug":"how-did-we-put-our-sales-forecasting-solution-for-croissants-into-production","status":"publish","type":"blog","link":"https:\/\/www.artefact.com\/fr\/blog\/how-did-we-put-our-sales-forecasting-solution-for-croissants-into-production\/","title":{"rendered":"Comment avons-nous mis en production notre solution de pr\u00e9vision des ventes pour les croissants ?"},"content":{"rendered":"<p><div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-1 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-padding-top:0px;--awb-padding-right:0px;--awb-padding-bottom:0px;--awb-padding-left:0px;--awb-margin-bottom:40px;--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"max-width:calc( 1440px + 20px );margin-left: calc(-20px \/ 2 );margin-right: calc(-20px \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-0 fusion_builder_column_1_2 1_2 fusion-flex-column avada-news-bloc-image\" style=\"--awb-bg-size:cover;--awb-width-large:50%;--awb-margin-top-large:0px;--awb-spacing-right-large:10px;--awb-margin-bottom-large:0px;--awb-spacing-left-large:10px;--awb-width-medium:50%;--awb-order-medium:0;--awb-spacing-right-medium:10px;--awb-spacing-left-medium:10px;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:10px;--awb-spacing-left-small:10px;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-image-element\" style=\"text-align:left;--awb-caption-title-font-family:var(--h2_typography-font-family);--awb-caption-title-font-weight:var(--h2_typography-font-weight);--awb-caption-title-font-style:var(--h2_typography-font-style);--awb-caption-title-size:var(--h2_typography-font-size);--awb-caption-title-transform:var(--h2_typography-text-transform);--awb-caption-title-line-height:var(--h2_typography-line-height);--awb-caption-title-letter-spacing:var(--h2_typography-letter-spacing);\"><span class=\"fusion-imageframe imageframe-none imageframe-1 hover-type-none\"><img decoding=\"async\" width=\"300\" height=\"74\" title=\"Moyen Blog\" src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/04\/Medium-Blog.png\" data-orig-src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/04\/Medium-Blog-300x74.png\" alt class=\"lazyload img-responsive wp-image-60582\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%274000%27%20height%3D%27992%27%20viewBox%3D%270%200%204000%20992%27%3E%3Crect%20width%3D%274000%27%20height%3D%27992%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-srcset=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/04\/Medium-Blog-200x50.png 200w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/04\/Medium-Blog-400x99.png 400w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/04\/Medium-Blog-600x149.png 600w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/04\/Medium-Blog-800x198.png 800w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/04\/Medium-Blog-1200x298.png 1200w\" data-sizes=\"auto\" data-orig-sizes=\"(max-width: 640px) 100vw, 800px\" \/><\/span><\/div><\/div><\/div><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-1 fusion_builder_column_1_2 1_2 fusion-flex-column\" style=\"--awb-padding-top:10px;--awb-padding-right:10px;--awb-padding-bottom:10px;--awb-padding-left:10px;--awb-bg-size:cover;--awb-width-large:50%;--awb-margin-top-large:0px;--awb-spacing-right-large:10px;--awb-margin-bottom-large:0px;--awb-spacing-left-large:10px;--awb-width-medium:50%;--awb-order-medium:0;--awb-spacing-right-medium:10px;--awb-spacing-left-medium:10px;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:10px;--awb-spacing-left-small:10px;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-text fusion-text-1\"><p>ACTUALIT\u00c9S \/ TECHNOLOGIE DE L'AI<\/p>\n<\/div><div class=\"fusion-text fusion-text-2\"><p>25 novembre 2020<br \/>\nChez Artefact, nous sommes tellement fran\u00e7ais que nous avons d\u00e9cid\u00e9 d'appliquer l'apprentissage automatique aux croissants. Ce premier article sur deux explique comment nous avons d\u00e9cid\u00e9 d'utiliser Catboost pour pr\u00e9dire les ventes de \u201cviennoiseries\u201d. Les caract\u00e9ristiques les plus importantes qui influencent les ventes sont les derni\u00e8res ventes hebdomadaires, le fait que le produit soit en promotion ou non et son prix. Nous vous pr\u00e9senterons quelques caract\u00e9ristiques techniques int\u00e9ressantes, notamment la cannibalisation et les raisons pour lesquelles vous devez parfois mettre \u00e0 jour votre variable cible.<\/p>\n<\/div><\/div><\/div><\/div><\/div><div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-2 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-background-color:#ffffff;--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"max-width:calc( 1440px + 20px );margin-left: calc(-20px \/ 2 );margin-right: calc(-20px \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-2 fusion_builder_column_1_1 1_1 fusion-flex-column\" style=\"--awb-bg-color:#ffffff;--awb-bg-color-hover:#ffffff;--awb-bg-size:cover;--awb-width-large:100%;--awb-margin-top-large:0px;--awb-spacing-right-large:10px;--awb-margin-bottom-large:0px;--awb-spacing-left-large:10px;--awb-width-medium:100%;--awb-order-medium:0;--awb-spacing-right-medium:10px;--awb-spacing-left-medium:10px;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:10px;--awb-spacing-left-small:10px;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-text fusion-text-3\" style=\"--awb-text-color:#000000;\"><p><span style=\"color: #ff0066;\"><strong class=\"jl kd\">Qu'est-ce que c'est ?<\/strong><\/span><\/p>\n<p>Chez Artefact, nous sommes tellement fran\u00e7ais que nous avons d\u00e9cid\u00e9 d'appliquer l'apprentissage automatique aux croissants. Ce premier article sur deux explique comment nous avons d\u00e9cid\u00e9 d'utiliser Catboost pour pr\u00e9dire les ventes de \u201cviennoiseries\u201d. Les caract\u00e9ristiques les plus importantes qui influencent les ventes sont les derni\u00e8res ventes hebdomadaires, le fait que le produit soit en promotion ou non et son prix.<\/p>\n<p>Nous vous pr\u00e9senterons quelques caract\u00e9ristiques techniques int\u00e9ressantes, notamment la cannibalisation et les raisons pour lesquelles vous devez parfois mettre \u00e0 jour votre variable cible. Nous avons choisi la pr\u00e9cision des pr\u00e9visions et le biais comme mesures d'\u00e9valuation. Notre deuxi\u00e8me article vous expliquera comment nous avons mis ce mod\u00e8le en production et quelques bonnes pratiques de ML Ops.<\/p>\n<p><span style=\"color: #ff0066;\"><strong class=\"jl kd\">Pour qui ?<\/strong><\/span><\/p>\n<ul>\n<li>Data scientifique, ing\u00e9nieur ML ou Data amoureux<\/li>\n<\/ul>\n<p id=\"cb94\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\"><span style=\"color: #ff0066;\"><strong class=\"jl kd\">\u00c0 retenir ?<\/strong><\/span><\/p>\n<ul class=\"\">\n<li id=\"ead1\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Algorithmes de stimulation pour la pr\u00e9diction de s\u00e9ries temporelles<\/li>\n<li id=\"2597\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Comment r\u00e9pondre \u00e0 un probl\u00e8me de pr\u00e9vision avec data bruyant ?<\/li>\n<li id=\"a441\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Comment g\u00e9rer les contraintes op\u00e9rationnelles dans la production<\/li>\n<\/ul>\n<p id=\"d9f7\" class=\"il im dn ce in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf jg jh ji ek\"><span style=\"color: #ff0066;\"><strong>Contexte<\/strong><\/span><\/p>\n<p id=\"730b\" class=\"jj jk dn jl b em jm iq jn ep jo iu jp jq jr js jt ju jv jw jx jy jz ka kb kc df ek\" data-selectable-paragraph=\"\">Nous avons r\u00e9cemment travaill\u00e9 sur un sujet tr\u00e8s int\u00e9ressant et stimulant pour un grand d\u00e9taillant en France : Comment pr\u00e9voir la demande quotidienne de produits frais p\u00e9rissables tels que les p\u00e2tisseries, y compris nos chers croissants.<\/p>\n<p class=\"jj jk dn jl b em jm iq jn ep jo iu jp jq jr js jt ju jv jw jx jy jz ka kb kc df ek\" data-selectable-paragraph=\"\">Ce d\u00e9taillant \u00e9tait confront\u00e9 \u00e0 un probl\u00e8me classique de cha\u00eene d'approvisionnement : chaque jour, ses boulangers doivent cuire une certaine quantit\u00e9 de produits frais et p\u00e9rissables : croissants, pains au chocolat, baguettes, tartes au citron, etc. La plupart de ces produits ne durent pas plus d'une journ\u00e9e, et s'ils ne sont pas vendus, ils sont consid\u00e9r\u00e9s comme un manque \u00e0 gagner. La plupart de ces produits ne durent pas plus d'une journ\u00e9e. S'ils ne sont pas vendus, ils sont consid\u00e9r\u00e9s comme des pertes de revenus. Le d\u00e9fi consiste \u00e0 pr\u00e9voir quotidiennement, sept jours \u00e0 l'avance, la quantit\u00e9 de chaque produit p\u00e9rissable pour chaque magasin. Ce projet vise donc \u00e0 am\u00e9liorer la disponibilit\u00e9 des produits en rayon tout en r\u00e9duisant le gaspillage alimentaire.<\/p>\n<p class=\"jj jk dn jl b em jm iq jn ep jo iu jp jq jr js jt ju jv jw jx jy jz ka kb kc df ek\" data-selectable-paragraph=\"\">Pour pr\u00e9voir les ventes quelques jours \u00e0 l'avance, une solution interne utilisant des mesures statistiques simples \u00e9tait d\u00e9j\u00e0 utilis\u00e9e. Cependant, apr\u00e8s avoir rencontr\u00e9 les responsables de la boulangerie, nous avons compris qu'il y avait une nette marge d'am\u00e9lioration en tirant parti de plus de data et de caract\u00e9ristiques telles que les effets de saisonnalit\u00e9, la m\u00e9t\u00e9o, les vacances, les effets de substitution de produits, etc. Nous avons donc d\u00e9cid\u00e9 d'utiliser la solution actuelle comme r\u00e9f\u00e9rence et d'essayer des algorithmes plus r\u00e9cents pour am\u00e9liorer la pr\u00e9cision des pr\u00e9visions.<\/p>\n<p class=\"jj jk dn jl b em jm iq jn ep jo iu jp jq jr js jt ju jv jw jx jy jz ka kb kc df ek\" data-selectable-paragraph=\"\">Et pour conclure cette introduction, une illustration du d\u00e9fi et de ce que nous voulons r\u00e9aliser.<\/p>\n<p data-selectable-paragraph=\"\"><img decoding=\"async\" class=\"lazyload size-full wp-image-21368 aligncenter\" src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2020\/11\/0_tmryqg1LTyu3u_b8.jpeg\" data-orig-src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2020\/11\/0_tmryqg1LTyu3u_b8.jpeg\" alt=\"\" width=\"700\" height=\"393\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27700%27%20height%3D%27393%27%20viewBox%3D%270%200%20700%20393%27%3E%3Crect%20width%3D%27700%27%20height%3D%27393%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-srcset=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2020\/11\/0_tmryqg1LTyu3u_b8-200x112.jpeg 200w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2020\/11\/0_tmryqg1LTyu3u_b8.jpeg 700w\" data-sizes=\"auto\" data-orig-sizes=\"(max-width: 700px) 100vw, 700px\" \/><\/p>\n<figure class=\"hn ho hp hq hr hd cx cy paragraph-image\">\n<div class=\"hu hv hw hx aj hy\" tabindex=\"0\" role=\"button\">\n<div class=\"cx cy kr\">\n<div class=\"ie s hw if\">\n<div class=\"ig ih s\">\n<div class=\"hz ia t u v ib aj bm ic id\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/figure>\n<\/div><\/div><\/div><\/div><\/div><div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-3 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-background-color:#ffffff;--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"max-width:calc( 1440px + 20px );margin-left: calc(-20px \/ 2 );margin-right: calc(-20px \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-3 fusion_builder_column_1_1 1_1 fusion-flex-column\" style=\"--awb-bg-color:#ffffff;--awb-bg-color-hover:#ffffff;--awb-bg-size:cover;--awb-width-large:100%;--awb-margin-top-large:0px;--awb-spacing-right-large:10px;--awb-margin-bottom-large:0px;--awb-spacing-left-large:10px;--awb-width-medium:100%;--awb-order-medium:0;--awb-spacing-right-medium:10px;--awb-spacing-left-medium:10px;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:10px;--awb-spacing-left-small:10px;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-text fusion-text-4\" style=\"--awb-text-color:#000000;\"><p><span style=\"color: #ff0066;\"><strong>D\u00e9veloppement de mod\u00e8les<\/strong><\/span><\/p>\n<p>Maintenant que nous avons un probl\u00e8me bien d\u00e9fini et des objectifs \u00e0 atteindre, nous pouvons enfin commencer \u00e0 \u00e9crire du beau code python dans nos carnets - que le plaisir commence !<\/p>\n<p><span style=\"color: #ff0066;\"><strong>Demande Data<\/strong><\/span><\/p>\n<p>Comme dans tout projet scientifique data, tout commence par data. D'apr\u00e8s notre exp\u00e9rience, nous vous recommandons vivement de demander data le plus t\u00f4t possible. N'h\u00e9sitez pas \u00e0 demander beaucoup de data et, pour chaque source de data, veillez \u00e0 identifier un r\u00e9f\u00e9rent, une personne que vous pouvez facilement contacter et \u00e0 qui vous pouvez poser vos questions sur la collection de data ou sur la fa\u00e7on dont le data est structur\u00e9.<\/p>\n<p>Gr\u00e2ce aux diff\u00e9rentes r\u00e9unions, nous avons pu dresser une liste des data que nous pouvions utiliser :<\/p>\n<ul>\n<li>Transactionnel data incluant le prix des produits.<\/li>\n<li>Promotions : une liste de toutes les promotions \u00e0 venir et des prix qui y sont associ\u00e9s.<\/li>\n<li>Informations sur les produits : diff\u00e9rentes caract\u00e9ristiques relatives aux produits.<\/li>\n<li id=\"8e84\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Informations sur les magasins : emplacement, taille des magasins, concurrents.<\/li>\n<li id=\"c5b6\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">M\u00e9t\u00e9o data.<\/li>\n<li id=\"ca97\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">D\u00e9chets data : \u00e0 la fin de chaque journ\u00e9e, combien de produits ont \u00e9t\u00e9 jet\u00e9s.<\/li>\n<\/ul>\n<p id=\"aa80\" class=\"il im dn ce in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf jg jh ji ek\"><span style=\"color: #ff0066;\"><strong>Analyse exploratoire Data (EDA) et d\u00e9tection des valeurs aberrantes<\/strong><\/span><\/p>\n<p id=\"67bb\" class=\"jj jk dn jl b em jm iq jn ep jo iu jp jq jr js jt ju jv jw jx jy jz ka kb kc df ek\" data-selectable-paragraph=\"\">Une fois le data collect\u00e9, nous avons commenc\u00e9 \u00e0 l'analyser. Y a-t-il une saisonnalit\u00e9 dans mon data ? Une tendance ? Combien de produits ai-je ? Sont-ils constants dans le temps ? Y a-t-il des produits saisonniers ?<\/p>\n<p class=\"jj jk dn jl b em jm iq jn ep jo iu jp jq jr js jt ju jv jw jx jy jz ka kb kc df ek\" data-selectable-paragraph=\"\">En tra\u00e7ant les diff\u00e9rentes s\u00e9ries temporelles, nous avons \u00e9galement rep\u00e9r\u00e9 quelques caract\u00e9ristiques int\u00e9ressantes :<\/p>\n<ul class=\"\">\n<li id=\"80a9\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Saisonnalit\u00e9 sur l'ann\u00e9e mais aussi en semaine.<\/li>\n<li id=\"d0ce\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Prix et si le produit est en promotion ou non.<\/li>\n<li id=\"c317\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Cannibalisation des produits et ventes diff\u00e9r\u00e9es en cas de rupture de stock.<\/li>\n<li id=\"dd82\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">La structure des ventes varie d'un magasin \u00e0 l'autre.<\/li>\n<\/ul>\n<p id=\"e6a0\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\">Notez que nous avons cr\u00e9\u00e9 diff\u00e9rentes fonctionnalit\u00e9s li\u00e9es \u00e0 la tarification. Le prix absolu, mais aussi les prix relatifs par rapport aux autres produits de la m\u00eame sous-famille, famille ou magasin. Le prix relatif est un moyen de quantifier la cannibalisation des prix entre les produits. Nous avons \u00e9galement cr\u00e9\u00e9 des fonctions traduisant la variation du prix d'un produit dans le temps.<\/p>\n<p class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\">Pour des t\u00e2ches de pr\u00e9diction aussi terre \u00e0 terre, le diable se cache dans les d\u00e9tails et il est vraiment important de rechercher les valeurs aberrantes et les anomalies, de prendre le temps d'analyser votre data.<\/p>\n<p id=\"3dfd\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\">Mais tout d'abord, pourquoi devrions-nous nous pr\u00e9occuper de la d\u00e9tection des valeurs aberrantes ? Pour de nombreuses raisons, cela peut indiquer une mauvaise data, des erreurs dans les ETL, des processus commerciaux que vous ne connaissiez pas. Deuxi\u00e8mement, il est tr\u00e8s probable que cela ait un impact sur votre algorithme et la partie inf\u00e9rence, il s'agit donc d'une partie importante du d\u00e9veloppement.<\/p>\n<p class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\">Vous pouvez rep\u00e9rer les valeurs aberrantes \u00e0 diff\u00e9rents moments du projet, soit au cours de l'analyse exploratoire data (EDA), soit en analysant les erreurs les plus importantes de vos mod\u00e8les.<\/p>\n<p class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\">En effectuant l'AED, nous avons rep\u00e9r\u00e9 quelques data \u00e9tranges telles que les ventes B2B, par exemple 1800 ventes d'un seul article sur un seul re\u00e7u d'achat. Des valeurs aberrantes li\u00e9es \u00e0 la tarification, principalement dues \u00e0 des erreurs manuelles de la caissi\u00e8re : des prix n\u00e9gatifs ou un croissant co\u00fbtant 250 euros !<\/p>\n<figure class=\"hn ho hp hq hr hd cx cy paragraph-image\">\n<div class=\"hu hv hw hx aj hy\" tabindex=\"0\" role=\"button\">\n<div class=\"cx cy ks\">\n<div class=\"ie s hw if\">\n<div class=\"kt ih s\">\n<div class=\"hz ia t u v ib aj bm ic id\"><\/div>\n<p><img decoding=\"async\" class=\"lazyload vl vm t u v ib aj c aligncenter\" src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2024\/09\/01TAXEHqr9CLKkcfH.png\" data-orig-src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2024\/09\/01TAXEHqr9CLKkcfH.png\" data-sizes=\"auto\" data-orig-sizes=\"700px\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27709%27%20height%3D%27348%27%20viewBox%3D%270%200%20709%20348%27%3E%3Crect%20width%3D%27709%27%20height%3D%27348%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-srcset=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2024\/09\/01TAXEHqr9CLKkcfH.png 276w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2024\/09\/01TAXEHqr9CLKkcfH.png 552w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2024\/09\/01TAXEHqr9CLKkcfH.png 640w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2024\/09\/01TAXEHqr9CLKkcfH.png 700w\" alt=\"Image for post\" width=\"709\" height=\"348\" \/><\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/figure>\n<p id=\"fd19\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\">Nous avons remarqu\u00e9 que nos pr\u00e9dictions \u00e9taient parfois totalement fausses les premiers jours des p\u00e9riodes de promotion. Apr\u00e8s analyse, nous avons constat\u00e9 que cela \u00e9tait d\u00fb au fait que la promotion \u00e9tait lanc\u00e9e un jour avant ou apr\u00e8s le jour officiel. En effet, il arrive que le responsable prenne une certaine libert\u00e9 et d\u00e9cide de modifier le d\u00e9but ou la fin des promotions. Ces changements peuvent \u00eatre rep\u00e9r\u00e9s et corrig\u00e9s dans le jeu d'entra\u00eenement data mais peuvent conduire \u00e0 de grosses erreurs de pr\u00e9diction. En effet, les promotions peuvent atteindre des volumes 4 \u00e0 5 fois plus importants qu'en l'absence de promotion.<\/p>\n<p class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\">Voici une liste d'autres exemples int\u00e9ressants de processus et de m\u00e9canismes que nous avons d\u00e9couverts gr\u00e2ce \u00e0 cette analyse et que vous trouverez peut-\u00eatre dans vos projets :<\/p>\n<ul class=\"\">\n<li id=\"2720\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">L'assortiment n'est pas toujours coh\u00e9rent d'un jour \u00e0 l'autre en raison de contraintes op\u00e9rationnelles, d'erreurs, de la gestion des stocks.<\/li>\n<li id=\"1132\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Pour certaines sources data, les dates indiqu\u00e9es correspondent aux jours o\u00f9 le data a \u00e9t\u00e9 charg\u00e9, de sorte que vous devez retirer un jour pour obtenir le jour r\u00e9el.<\/li>\n<\/ul>\n<\/div><\/div><\/div><\/div><\/div><div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-4 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-background-color:#ffffff;--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"max-width:calc( 1440px + 20px );margin-left: calc(-20px \/ 2 );margin-right: calc(-20px \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-4 fusion_builder_column_1_1 1_1 fusion-flex-column\" style=\"--awb-bg-color:#ffffff;--awb-bg-color-hover:#ffffff;--awb-bg-size:cover;--awb-width-large:100%;--awb-margin-top-large:0px;--awb-spacing-right-large:10px;--awb-margin-bottom-large:0px;--awb-spacing-left-large:10px;--awb-width-medium:100%;--awb-order-medium:0;--awb-spacing-right-medium:10px;--awb-spacing-left-medium:10px;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:10px;--awb-spacing-left-small:10px;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-text fusion-text-5\" style=\"--awb-text-color:#000000;\"><p><span style=\"color: #ff0066;\"><strong>De la pr\u00e9diction des ventes \u00e0 la pr\u00e9diction optimale des ventes<\/strong><\/span><\/p>\n<p>Un d\u00e9fi nous a amen\u00e9s \u00e0 mettre \u00e0 jour notre variable cible. Parfois, en raison d'une influence inattendue ou d'une mauvaise pr\u00e9vision, le d\u00e9partement s'attendait \u00e0 une p\u00e9nurie de produits avant la fin de la journ\u00e9e. Deux ph\u00e9nom\u00e8nes peuvent alors se produire : le client ne trouvant pas son produit n'ach\u00e8te rien, ou ach\u00e8te un produit similaire. Sur la base de l'historique data, nous avons d\u00e9duit quelques lois de distribution (statistiques de base) qui nous ont permis de mod\u00e9liser cet impact et de mettre \u00e0 jour notre variable cible afin de pr\u00e9dire non pas les ventes historiques mais les ventes optimales pour un produit particulier.<\/p>\n<p>Cette mise \u00e0 jour de la variable cible est d\u00e9licate car il est vraiment difficile de savoir si la mise \u00e0 jour a eu un sens. Avez-vous r\u00e9ellement am\u00e9lior\u00e9 la qualit\u00e9 du data ou l'avez-vous d\u00e9t\u00e9rior\u00e9e ? Une fa\u00e7on de quantifier notre impact a \u00e9t\u00e9 de prendre les ventes sans rupture de stock et de cr\u00e9er une fausse p\u00e9nurie, par exemple en supprimant toutes les ventes apr\u00e8s 17 ou 18 heures, puis en essayant de reconstituer les ventes. Cette m\u00e9thode nous permet de revenir \u00e0 un probl\u00e8me classique supervis\u00e9 que nous pouvons \u00e9valuer objectivement.<\/p>\n<p>Nous avons ainsi pu pr\u00e9dire les ventes optimales et \u00e9viter que notre algorithme n'apprenne des sch\u00e9mas de p\u00e9nurie.<\/p>\n<p><span style=\"color: #ff0066;\"><strong>Nos mod\u00e8les<\/strong><\/span><\/p>\n<p>Apr\u00e8s avoir correctement nettoy\u00e9 notre data, nous pouvons enfin tester et essayer quelques mod\u00e8les.<\/p>\n<p id=\"7083\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\">Vous disposez d'un grand nombre de possibilit\u00e9s pour r\u00e9soudre un probl\u00e8me de pr\u00e9vision : approches statistiques classiques (SARIMA, lissage exponentiel, proph\u00e8te, etc.), approches d'apprentissage automatique (r\u00e9gression lin\u00e9aire, algorithmes de boosting) ou apprentissage profond (RNN, LSTM, CNN). Comment choisir la bonne approche est une question d\u00e9licate, voici quelques \u00e9l\u00e9ments qui nous ont aid\u00e9s \u00e0 faire notre choix :<\/p>\n<ul class=\"\">\n<li id=\"8a12\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Pas une mais plusieurs s\u00e9ries temporelles : ~10 000<\/li>\n<li id=\"80b8\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">S\u00e9ries temporelles irr\u00e9guli\u00e8res : il peut arriver qu'il n'y ait pas de ventes pendant certains jours en raison de choix du gestionnaire, de contraintes commerciales ou op\u00e9rationnelles.<\/li>\n<li id=\"6ae9\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Les promotions ont un impact consid\u00e9rable et ne sont ni saisonni\u00e8res ni cycliques.<\/li>\n<li id=\"6ba6\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Nous avons observ\u00e9 une forte corr\u00e9lation entre les ventes \u00e0 J-0 et les ventes \u00e0 J-7, J-14, J-21 pour les articles par magasin et le fait d'\u00eatre en promotion ou non.<\/li>\n<li id=\"6a82\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Les \u00e9l\u00e9ments exog\u00e8nes data ont un impact sur les ventes : prix, journ\u00e9es sp\u00e9ciales, etc.<\/li>\n<\/ul>\n<p id=\"638a\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\">Pour ces raisons, nous avons d\u00e9cid\u00e9 de choisir Catboost comme mod\u00e8le. Catboost pr\u00e9sente de nombreux avantages tels que la gestion native des valeurs cat\u00e9gorielles et manquantes, la prise en charge d'un grand nombre de caract\u00e9ristiques, une bonne mise \u00e0 l'\u00e9chelle et la possibilit\u00e9 d'inf\u00e9rer un grand nombre de s\u00e9ries temporelles au sein d'un m\u00eame mod\u00e8le. De plus, il fournit un joli trac\u00e9 pendant l'apprentissage et s'int\u00e8gre tr\u00e8s facilement avec\u00a0<em class=\"ku\">SHAP<\/em>\u00a0pour l'importance de la caract\u00e9ristique.<\/p>\n<p class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\">Voici par exemple une capture d'\u00e9cran du trac\u00e9 interactif de l'algorithme pendant son apprentissage :<\/p>\n<figure class=\"hn ho hp hq hr hd cx cy paragraph-image\">\n<div class=\"hu hv hw hx aj hy\" tabindex=\"0\" role=\"button\">\n<div class=\"cx cy kv\">\n<div class=\"ie s hw if\">\n<div class=\"kw ih s\">\n<div class=\"hz ia t u v ib aj bm ic id\"><\/div>\n<p><img decoding=\"async\" class=\"lazyload vl vm t u v ib aj c aligncenter\" src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2024\/09\/0IHYfQrWymxriIbmh.png\" data-orig-src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2024\/09\/0IHYfQrWymxriIbmh.png\" data-sizes=\"auto\" data-orig-sizes=\"700px\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27714%27%20height%3D%27355%27%20viewBox%3D%270%200%20714%20355%27%3E%3Crect%20width%3D%27714%27%20height%3D%27355%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-srcset=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2024\/09\/0IHYfQrWymxriIbmh.png 276w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2024\/09\/0IHYfQrWymxriIbmh.png 552w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2024\/09\/0IHYfQrWymxriIbmh.png 640w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2024\/09\/0IHYfQrWymxriIbmh.png 700w\" alt=\"Image for post\" width=\"714\" height=\"355\" \/><\/p>\n<\/div>\n<div><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/figure>\n<p id=\"e5ba\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\">N\u00e9anmoins, l'un des inconv\u00e9nients des approches de ML pures est la n\u00e9cessit\u00e9 de coder vous-m\u00eame toutes les caract\u00e9ristiques, en particulier celles li\u00e9es au temps. Sans une forte ing\u00e9nierie des caract\u00e9ristiques, ces algorithmes seront incapables d'identifier les sch\u00e9mas temporels. De plus, ils ne peuvent d\u00e9duire qu'une p\u00e9riode de temps fixe, contrairement \u00e0 Sarima ou Prophet, o\u00f9 vous pouvez sp\u00e9cifier le nombre de jours \u00e0 pr\u00e9voir \u00e0 l'aide du param\u00e8tre periods.<\/p>\n<p class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\">Enfin, vous devez faire tr\u00e8s attention aux fuites de data, en particulier lorsque vous construisez votre dispositif de d\u00e9calage.<\/p>\n<p class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\">L'une des principales caract\u00e9ristiques n'\u00e9tait pas le d\u00e9calage hebdomadaire mais la moyenne des d\u00e9calages : J-7, J-14, J-21, ... etc. des six derni\u00e8res semaines. En effet, la caract\u00e9ristique non r\u00e9guli\u00e8re de nos s\u00e9ries temporelles, combin\u00e9e \u00e0 l'utilisation de promotions de temps \u00e0 autre, induit une saisonnalit\u00e9 floue, d'o\u00f9 l'utilisation d'une moyenne. Il est important de noter que l'utilisation de cette moyenne comme mod\u00e8le unique donne d\u00e9j\u00e0 de tr\u00e8s bonnes performances !<\/p>\n<p id=\"8cf2\" class=\"il im dn ce in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf jg jh ji ek\"><span style=\"color: #ff0066;\"><strong>Un mod\u00e8le ou plusieurs mod\u00e8les<\/strong><\/span><\/p>\n<p class=\"il im dn ce in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf jg jh ji ek\">En r\u00e9sum\u00e9, nous avons utilis\u00e9 un algorithme : Catboost, pour pr\u00e9dire l'ensemble de nos 10 000 s\u00e9ries temporelles, pour chaque produit et chaque magasin. Mais qu'en est-il si un article a un mod\u00e8le de vente vraiment particulier, ou un magasin sp\u00e9cifique ? L'algorithme pourrait-il identifier et apprendre ce mod\u00e8le ?<\/p>\n<p class=\"il im dn ce in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf jg jh ji ek\">Ces questions nous am\u00e8nent \u00e0 nous demander si nous ne devrions pas regrouper nos produits et nos magasins et former un algorithme par groupe. M\u00eame si l'utilisation d'algorithmes d'arbres de d\u00e9cision devrait permettre de relever ce d\u00e9fi, nous avons observ\u00e9 des limites dans certains cas sp\u00e9cifiques.<\/p>\n<p class=\"il im dn ce in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf jg jh ji ek\">Les algorithmes de stimulation sont des algorithmes it\u00e9ratifs, bas\u00e9s sur des apprenants faibles qui se concentrent sur leurs plus grosses erreurs. C'est \u00e9videmment un peu trop simplifi\u00e9, mais cela me permet de souligner l'une de leurs limites. Si vous n'avez pas normalis\u00e9 votre variable cible, votre algorithme se concentrera \u201cuniquement\u201d sur les produits pr\u00e9sentant de grosses erreurs, qui sont plus susceptibles d'\u00eatre ceux dont les ventes sont les plus importantes. Par cons\u00e9quent, l'algorithme peut se concentrer davantage sur les produits ou les magasins dont le volume de ventes est plus important.<\/p>\n<p class=\"il im dn ce in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf jg jh ji ek\">Nous n'avons pas trouv\u00e9 la solution id\u00e9ale pour relever ce d\u00e9fi, mais nous avons observ\u00e9 quelques am\u00e9liorations en regroupant nos produits\/magasins par famille ou par fr\u00e9quence de vente.<\/p>\n<p id=\"b5a4\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\">L'un des avantages de l'apprentissage de plusieurs algorithmes est qu'il est possible d'utiliser plusieurs algorithmes :<\/p>\n<ul class=\"\">\n<li id=\"6fdc\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Une formation plus rapide<\/li>\n<li id=\"9f1e\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Plus facile \u00e0 ajuster<\/li>\n<li id=\"25e8\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Plus facile \u00e0 d\u00e9boguer<\/li>\n<li id=\"9727\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">En cas d'anomalies du data, tous les mod\u00e8les ne fonctionneront pas de la m\u00eame mani\u00e8re.<\/li>\n<li id=\"812c\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Selon les produits, vous pouvez jouer avec la fonction de perte et favoriser la p\u00e9nurie ou la surproduction.<\/li>\n<\/ul>\n<p id=\"6381\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\">Mais d'un autre c\u00f4t\u00e9, il sera plus difficile \u00e0 maintenir !<\/p>\n<p class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\">Finalement, nous avons d\u00e9cid\u00e9 d'adopter cette approche car elle donnait de meilleurs r\u00e9sultats.<\/p>\n<\/div><\/div><\/div><\/div><\/div><div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-5 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-background-color:#ffffff;--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"max-width:calc( 1440px + 20px );margin-left: calc(-20px \/ 2 );margin-right: calc(-20px \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-5 fusion_builder_column_1_1 1_1 fusion-flex-column\" style=\"--awb-bg-color:#ffffff;--awb-bg-color-hover:#ffffff;--awb-bg-size:cover;--awb-width-large:100%;--awb-margin-top-large:0px;--awb-spacing-right-large:10px;--awb-margin-bottom-large:0px;--awb-spacing-left-large:10px;--awb-width-medium:100%;--awb-order-medium:0;--awb-spacing-right-medium:10px;--awb-spacing-left-medium:10px;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:10px;--awb-spacing-left-small:10px;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-text fusion-text-6\" style=\"--awb-text-color:#000000;\"><p id=\"9fc2\" class=\"il im dn ce in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf jg jh ji ek\"><span style=\"color: #ff0066;\"><strong>Comment \u00e9valuer notre mod\u00e8le ?<\/strong><\/span><\/p>\n<p id=\"66f9\" class=\"jj jk dn jl b em jm iq jn ep jo iu jp jq jr js jt ju jv jw jx jy jz ka kb kc df ek\" data-selectable-paragraph=\"\">Nous avons discut\u00e9 d'un grand nombre de mod\u00e8les et de leurs performances dans les sections pr\u00e9c\u00e9dentes. Mais comment \u00e9valuer un algorithme de pr\u00e9vision ? Il est \u00e9vident que ce probl\u00e8me est tr\u00e8s similaire \u00e0 tous les autres probl\u00e8mes d'apprentissage automatique, mais il a n\u00e9anmoins ses propres sp\u00e9cificit\u00e9s :<\/p>\n<ol>\n<li>\u00a0Validation crois\u00e9e<\/li>\n<\/ol>\n<p id=\"2a03\" class=\"jj jk dn jl b em jm iq jn ep jo iu jp jq jr js jt ju jv jw jx jy jz ka kb kc df ek\" data-selectable-paragraph=\"\">Comme nous l'avons d\u00e9j\u00e0 mentionn\u00e9, l'un des d\u00e9fis de la pr\u00e9vision des s\u00e9ries temporelles est d'\u00e9viter les fuites data. Cela peut se produire lors de la cr\u00e9ation de nos caract\u00e9ristiques : retards, normalisation de nos variables, etc...<\/p>\n<p id=\"8fa3\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\">Mais cela peut \u00e9galement se produire lors de la validation crois\u00e9e, en divisant les ensembles data de formation, de validation et de test.<\/p>\n<p id=\"bc69\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\">Vous ne pouvez pas utiliser la m\u00e9thode classique\u00a0<em class=\"ku\">train_test_split()<\/em>\u00a0de sklearn. Pourquoi ? Imaginez que votre dataset soit les ventes de 2019, si vous divisez al\u00e9atoirement, vous vous entra\u00eenerez sur data de janv, f\u00e9v, ..., d\u00e9cembre 2019 et votre data de test aura les ventes des m\u00eames dates ! Par cons\u00e9quent, votre algorithme s'entra\u00eenera sur des mod\u00e8les qu'il n'aura pas en production, d'o\u00f9 un probl\u00e8me de fuite de data. Pour r\u00e9soudre ce probl\u00e8me, il existe d'autres fa\u00e7ons de diviser votre data, comme la fonction T<em class=\"ku\">imeSeriesSplit()<\/em>\u00a0\u00e9galement de sklearn.<\/p>\n<p id=\"8558\" class=\"kx im dn ce in ky kz eo ir la lb er iv es lc eu iz ev ld ex jd ey le fa jh lf ek\">2. Le choix de la m\u00e9trique :<\/p>\n<p id=\"22a7\" class=\"jj jk dn jl b em jm iq jn ep jo iu jp jq jr js jt ju jv jw jx jy jz ka kb kc df ek\" data-selectable-paragraph=\"\">La pr\u00e9vision des s\u00e9ries temporelles est un probl\u00e8me de r\u00e9gression, c'est pourquoi nous pouvons utiliser les mesures classiques telles que MSE, RMSE, mais d'autres mesures sont \u00e9galement disponibles, dont voici une liste non exhaustive :<\/p>\n<ul class=\"\">\n<li id=\"08a5\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">MAPE ou pr\u00e9cision des pr\u00e9visions<\/li>\n<li id=\"2012\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Un MAPE pond\u00e9r\u00e9<\/li>\n<li id=\"7dfa\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Distorsion temporelle dynamique<\/li>\n<\/ul>\n<p id=\"2f5b\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\">Nous avons optimis\u00e9 notre algorithme en utilisant le RMSE, mais pour communiquer avec nos propri\u00e9taires d'entreprise, nous avons utilis\u00e9 une pr\u00e9cision de pr\u00e9vision pond\u00e9r\u00e9e :<\/p>\n<figure class=\"hn ho hp hq hr hd cx cy paragraph-image\">\n<div class=\"cx cy lg\">\n<div class=\"ie s hw if\">\n<div class=\"lh ih s\">\n<div class=\"hz ia t u v ib aj bm ic id\"><\/div>\n<p><img decoding=\"async\" class=\"lazyload vl vm t u v ib aj c aligncenter\" src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2024\/09\/1TMosktPGqo5c6MG4bQVw8g.png\" data-orig-src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2024\/09\/1TMosktPGqo5c6MG4bQVw8g.png\" data-sizes=\"auto\" data-orig-sizes=\"342px\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27342%27%20height%3D%2750%27%20viewBox%3D%270%200%20342%2050%27%3E%3Crect%20width%3D%27342%27%20height%3D%2750%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-srcset=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2024\/09\/1TMosktPGqo5c6MG4bQVw8g.png 276w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2024\/09\/1TMosktPGqo5c6MG4bQVw8g.png 342w\" alt=\"Image for post\" width=\"342\" height=\"50\" \/><\/p>\n<\/div>\n<div><\/div>\n<\/div>\n<\/div>\n<\/figure>\n<p id=\"5685\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\">Nous l'avons d'abord calcul\u00e9e au niveau de la journ\u00e9e et du magasin, puis nous l'avons agr\u00e9g\u00e9e par magasin \u00e0 l'aide d'une moyenne pond\u00e9r\u00e9e, les pond\u00e9rations \u00e9tant les ventes par jour des diff\u00e9rents magasins. Cette mesure peut \u00e9videmment \u00eatre contest\u00e9e, mais elle pr\u00e9sente l'avantage d'avoir une valeur pour chaque magasin et, si un jour le directeur r\u00e9alise une performance vraiment sup\u00e9rieure (mauvaise ou bonne), elle n'est pas surestim\u00e9e. En outre, l'AF est une mesure r\u00e9ellement interpr\u00e9table qui parle \u00e0 l'entreprise, contrairement \u00e0 la RMSE.<\/p>\n<p id=\"9603\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\">Enfin, une autre mesure int\u00e9ressante \u00e0 garder \u00e0 l'esprit est le biais, qui introduit la tendance g\u00e9n\u00e9rale de l'algorithme \u00e0 sur-pr\u00e9dire ou \u00e0 sous-pr\u00e9dire. En fonction de l'analyse de rentabilit\u00e9, vous voudrez peut-\u00eatre privil\u00e9gier l'une ou l'autre de ces tendances. Dans notre cas, nous avons l\u00e9g\u00e8rement surestim\u00e9 les pr\u00e9visions afin d'\u00eatre s\u00fbrs d'avoir le produit en rayon et de satisfaire nos clients !<\/p>\n<p id=\"f905\" class=\"il im dn ce in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf jg jh ji ek\"><span style=\"color: #ff0066;\"><strong>En conclusion, quelques conseils pour les projets data<\/strong><\/span><\/p>\n<p id=\"8308\" class=\"jj jk dn jl b em jm iq jn ep jo iu jp jq jr js jt ju jv jw jx jy jz ka kb kc df ek\" data-selectable-paragraph=\"\">J'ai pens\u00e9 qu'il serait \u00e9galement int\u00e9ressant de partager avec vous quelques conseils et erreurs que nous commettons au niveau des projets.<\/p>\n<p id=\"8ff5\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\">Tout d'abord, comment avons-nous d\u00e9velopp\u00e9 nos mod\u00e8les, notre ing\u00e9nierie des fonctionnalit\u00e9s ?<\/p>\n<p id=\"14f4\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\">Toutes ces diff\u00e9rentes \u00e9tapes, exp\u00e9riences ont \u00e9t\u00e9 r\u00e9alis\u00e9es dans des cahiers, mais l'utilisation de cahiers n'est pas synonyme de code sale ! Au contraire, nous vous recommandons vivement de prendre le temps d'\u00e9crire des carnets corrects avec des titres, des noms propres, des fonctions, et de factoriser les lignes redondantes.<\/p>\n<p id=\"5708\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\">L'utilisation de notebooks soul\u00e8ve quelques d\u00e9fis, en particulier lorsque de nombreux d\u00e9veloppeurs travaillent ensemble : conflits sur github, code non r\u00e9plicable, etc...<\/p>\n<p id=\"bc94\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\">Voici quelques conseils pour r\u00e9duire ces probl\u00e8mes :<\/p>\n<ul class=\"\">\n<li id=\"e4b4\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Versionnez vos carnets en utilisant les d\u00e9marques<\/li>\n<li id=\"2bc5\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">\u00c9vitez de travailler ensemble sur les m\u00eames cahiers<\/li>\n<li id=\"8f73\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Si c'est encore le cas, pour g\u00e9rer les conflits dans le bloc-notes, utilisez la fonction\u00a0<em class=\"ku\">nbdev<\/em>\u00a0biblioth\u00e8que \u00e0 partir de fastai<\/li>\n<li id=\"684e\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Regrouper les fonctions communes dans des fichiers .py afin que tout le monde utilise les m\u00eames fonctions<\/li>\n<li id=\"bec5\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Pour versionner votre exp\u00e9rience, utilisez des outils tels que\u00a0<a class=\"ck li\" href=\"https:\/\/mlflow.org\/\" rel=\"noopener nofollow\" target=\"_blank\">Flux ML<\/a><\/li>\n<li id=\"1688\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Evitez print() et utilisez un logger \u00e0 la place, n'enregistrez que les informations utiles. V\u00e9rifiez\u00a0<a class=\"ck li\" href=\"https:\/\/scikit-lego.readthedocs.io\/en\/latest\/pandas_pipeline.html#Logging-in-method-chaining\" rel=\"noopener nofollow\" target=\"_blank\">scikit-lego<\/a>\u00a0qui poss\u00e8de des fonctionnalit\u00e9s assez int\u00e9ressantes, des d\u00e9corateurs.<\/li>\n<li id=\"3dbf\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Si vous voulez vraiment imprimer des documents, essayez la biblioth\u00e8que.\u00a0<a class=\"ck li\" href=\"https:\/\/github.com\/willmcgugan\/rich\" rel=\"noopener nofollow\" target=\"_blank\">riche<\/a>\u00a0ce qui le rend plus agr\u00e9able et peut \u00e9galement \u00eatre utilis\u00e9 comme outil d'enregistrement. Ici, un\u00a0<a class=\"ck li\" href=\"https:\/\/calmcode.io\/rich\/introduction.html\" rel=\"noopener nofollow\" target=\"_blank\">D\u00e9monstration rapide<\/a>\u00a0de riche par calmcode.io<\/li>\n<\/ul>\n<p id=\"3ec0\" class=\"il im dn ce in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf jg jh ji ek\"><span style=\"color: #ff0066;\"><strong>Principaux enseignements<\/strong><\/span><\/p>\n<p id=\"1370\" class=\"jj jk dn jl b em jm iq jn ep jo iu jp jq jr js jt ju jv jw jx jy jz ka kb kc df ek\" data-selectable-paragraph=\"\">Nous aurions aim\u00e9 partager avec vous nos r\u00e9sultats, mais nous n'avons pas \u00e9t\u00e9 autoris\u00e9s \u00e0 le faire pour des raisons de confidentialit\u00e9 :<\/p>\n<ul class=\"\">\n<li id=\"b9cf\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Soyez aussi bon que leur meilleur planificateur de la demande<\/li>\n<li id=\"2351\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Augmenter le FA de certains magasins jusqu'\u00e0 30%<\/li>\n<\/ul>\n<p id=\"5540\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\">Mais d'un autre c\u00f4t\u00e9, voici la liste de nos plus grands apprentissages qui, je l'esp\u00e8re, vous aideront \u00e0 d\u00e9velopper votre propre solution :<\/p>\n<ul class=\"\">\n<li id=\"f872\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Prenez le temps de comprendre votre probl\u00e8me, de d\u00e9finir un objectif clair et mesurable, une mesure d'\u00e9valuation, etc.<\/li>\n<li id=\"683c\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Si vous n'avez pas trouv\u00e9 d'anomalies, c'est que vous n'avez pas assez regard\u00e9 !<\/li>\n<li id=\"f77b\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Suivez rigoureusement vos exp\u00e9riences<\/li>\n<li id=\"7685\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">\u00c9crivez du code propre, en particulier dans des carnets de notes, cela vous facilitera grandement la vie au moment du d\u00e9ploiement.<\/li>\n<li id=\"e5e1\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Pensez toujours que la production et les fuites data sont votre pire ennemi dans la pr\u00e9vision des s\u00e9ries temporelles.<\/li>\n<li id=\"2864\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Commencez par un p\u00e9rim\u00e8tre restreint, avec des mod\u00e8les simples, testez, \u00e9chouez, apprenez, am\u00e9liorez et r\u00e9ussissez !<\/li>\n<\/ul>\n<\/div><\/div><\/div><\/div><\/div><div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-6 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--link_hover_color: #ff0066;--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-padding-top:0px;--awb-padding-right:0px;--awb-padding-bottom:0px;--awb-padding-left:0px;--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"max-width:calc( 1440px + 20px );margin-left: calc(-20px \/ 2 );margin-right: calc(-20px \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-6 fusion_builder_column_1_2 1_2 fusion-flex-column\" style=\"--awb-bg-size:cover;--awb-width-large:50%;--awb-margin-top-large:0px;--awb-spacing-right-large:10px;--awb-margin-bottom-large:0px;--awb-spacing-left-large:10px;--awb-width-medium:50%;--awb-order-medium:0;--awb-spacing-right-medium:10px;--awb-spacing-left-medium:10px;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:10px;--awb-spacing-left-small:10px;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-image-element\" style=\"text-align:center;--awb-margin-top:0px;--awb-margin-right:0px;--awb-margin-bottom:0px;--awb-margin-left:0px;--awb-caption-title-font-family:var(--h2_typography-font-family);--awb-caption-title-font-weight:var(--h2_typography-font-weight);--awb-caption-title-font-style:var(--h2_typography-font-style);--awb-caption-title-size:var(--h2_typography-font-size);--awb-caption-title-transform:var(--h2_typography-text-transform);--awb-caption-title-line-height:var(--h2_typography-line-height);--awb-caption-title-letter-spacing:var(--h2_typography-letter-spacing);\"><span class=\"fusion-imageframe imageframe-none imageframe-2 hover-type-none\"><img decoding=\"async\" width=\"1057\" height=\"591\" title=\"data-driven\" src=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%271057%27%20height%3D%27591%27%20viewBox%3D%270%200%201057%20591%27%3E%3Crect%20width%3D%271057%27%20height%3D%27591%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-orig-src=\"https:\/\/www.artefact.com\/wp-content\/uploads\/2020\/06\/Global-Newsletter-Data-Digest_LinkedIn_600x315_april.jpg\" alt class=\"lazyload img-responsive wp-image-30246\"\/><\/span><\/div><\/div><\/div><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-7 fusion_builder_column_1_2 1_2 fusion-flex-column fusion-flex-align-self-center fusion-column-inner-bg-wrapper\" style=\"--awb-inner-bg-size:cover;--awb-width-large:50%;--awb-margin-top-large:0px;--awb-spacing-right-large:10px;--awb-margin-bottom-large:0px;--awb-spacing-left-large:10px;--awb-width-medium:50%;--awb-order-medium:0;--awb-spacing-right-medium:10px;--awb-spacing-left-medium:10px;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:10px;--awb-spacing-left-small:10px;\"><span class=\"fusion-column-inner-bg hover-type-none\"><a class=\"fusion-column-anchor\" href=\"https:\/\/go.pardot.com\/l\/597421\/2020-05-06\/2k5zzj\" target=\"_blank\" rel=\"noopener\"><span class=\"fusion-column-inner-bg-image\"><\/span><\/a><\/span><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-center fusion-content-layout-column\"><div class=\"fusion-text fusion-text-7\"><p><b>Int\u00e9ress\u00e9 par le num\u00e9rique et le data marketing ?<\/b><\/p>\n<p>Inscrivez-vous \u00e0 Data Digest, la lettre d'information de Artefact, pour recevoir chaque mois dans votre bo\u00eete aux lettres \u00e9lectronique des conseils, des id\u00e9es et des avis utiles.<\/p>\n<p><b>Inscrivez-moi !<\/b><\/p>\n<\/div><\/div><\/div><\/div><\/div><\/p>","protected":false},"excerpt":{"rendered":"<p>25 novembre 2020<br \/>\nChez Artefact, nous sommes tellement fran\u00e7ais que nous avons d\u00e9cid\u00e9 d'appliquer l'apprentissage automatique aux croissants. Ce premier article sur deux explique comment nous avons d\u00e9cid\u00e9 d'utiliser Catboost pour pr\u00e9dire les ventes de \u201cviennoiseries\u201d. Les caract\u00e9ristiques les plus importantes qui influencent les ventes sont les derni\u00e8res ventes hebdomadaires, le fait que le produit soit en promotion ou non et son prix. Nous vous pr\u00e9senterons quelques caract\u00e9ristiques techniques int\u00e9ressantes, notamment la cannibalisation et les raisons pour lesquelles vous devez parfois mettre \u00e0 jour votre variable cible.<\/p>","protected":false},"featured_media":21373,"parent":0,"template":"","meta":{"_acf_changed":false,"ep_exclude_from_search":false},"blog-category":[2995],"blog-language":[2991],"class_list":["post-21214","blog","type-blog","status-publish","has-post-thumbnail","hentry","blog-category-ai-technology","blog-language-en"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.artefact.com\/fr\/wp-json\/wp\/v2\/blog\/21214","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.artefact.com\/fr\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.artefact.com\/fr\/wp-json\/wp\/v2\/types\/blog"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.artefact.com\/fr\/wp-json\/wp\/v2\/media\/21373"}],"wp:attachment":[{"href":"https:\/\/www.artefact.com\/fr\/wp-json\/wp\/v2\/media?parent=21214"}],"wp:term":[{"taxonomy":"blog-category","embeddable":true,"href":"https:\/\/www.artefact.com\/fr\/wp-json\/wp\/v2\/blog-category?post=21214"},{"taxonomy":"blog-language","embeddable":true,"href":"https:\/\/www.artefact.com\/fr\/wp-json\/wp\/v2\/blog-language?post=21214"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}