{"id":3019,"date":"2017-03-23T13:50:21","date_gmt":"2017-03-23T17:50:21","guid":{"rendered":"http:\/\/bioinfo.iric.ca\/?p=3019\/"},"modified":"2017-08-03T14:39:14","modified_gmt":"2017-08-03T18:39:14","slug":"introduction_a_la_regression_lineaire","status":"publish","type":"post","link":"https:\/\/bioinfo.iric.ca\/fr\/introduction_a_la_regression_lineaire\/","title":{"rendered":"Introduction \u00e0 la r\u00e9gression lin\u00e9aire"},"content":{"rendered":"<p>L&rsquo;objectif\u00a0premier du scientifique des donn\u00e9es <em>(data scientist)<\/em> est l&rsquo;exploration de donn\u00e9es afin d&rsquo;en d\u00e9couvrir des relations d&rsquo;int\u00e9r\u00eat. Des m\u00e9thodes statistiques et d&rsquo;apprentissage machine lui servent\u00a0d&rsquo;outils pour la d\u00e9couverte et la mod\u00e9lisation de telles relations. L&rsquo;information d\u00e9couverte par ces m\u00e9thodes peut ensuite \u00eatre mise en pratique.\u00a0Par exemple, en m\u00e9decine clinique, l&rsquo;\u00e9laboration d&rsquo;un mod\u00e8le pr\u00e9dictif bas\u00e9 sur des\u00a0donn\u00e9es cliniques peut\u00a0servir d&rsquo;outil prognostic afin de\u00a0guider un\u00a0traitement.<\/p>\n<h3>R\u00e9gression lin\u00e9aire simple<\/h3>\n<p>L&rsquo;une des m\u00e9thodes\u00a0la plus\u00a0simple \u00e0 la disposition du scientifique des donn\u00e9es est la r\u00e9gression lin\u00e9aire o\u00f9 le cas le plus simple est une r\u00e9gression lin\u00e9aire avec une seule variable explicative. C&rsquo;est la r\u00e9gression lin\u00e9aire simple. Op\u00e9rant sur un ensemble d&rsquo;observations de deux dimensions (deux variables continues), la r\u00e9gression lin\u00e9aire simple tente tout simplement d&rsquo;ajuster, le mieux possible, une droite parmi les\u00a0donn\u00e9es.\u00a0Ici, \u00ab\u00a0le mieux possible\u00a0\u00bb signifie\u00a0minimiser la somme des erreurs carr\u00e9es, c&rsquo;est-\u00e0-dire la distance entre un point et la droite\u00a0(voir <a href=\"https:\/\/fr.wikipedia.org\/wiki\/M%C3%A9thode_des_moindres_carr%C3%A9s\">la m\u00e9thode des moindres carr\u00e9es<\/a>).\u00a0Pourquoi? Cette droite (notre mod\u00e8le) devient alors un outil permettant de ressortir, si elle existe, la\u00a0tendance sous-jacente dans les donn\u00e9es en plus de servir comme mod\u00e8le pr\u00e9dictif pour de\u00a0nouveaux \u00e9v\u00e9nements en se basant\u00a0sur ceux d\u00e9j\u00e0 observ\u00e9s.<\/p>\n<table class=\" aligncenter\" style=\"height: 341px; width: 747px;\">\n<tbody>\n<tr style=\"height: 333.1px;\">\n<td style=\"width: 372.727px; height: 333.1px;\">\n<p><div id=\"attachment_3032\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2017\/03\/example_dataset.png\"><img decoding=\"async\" aria-describedby=\"caption-attachment-3032\" class=\"wp-image-3032 size-medium\" src=\"https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2017\/03\/example_dataset-300x300.png\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2017\/03\/example_dataset-66x66.png 66w, https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2017\/03\/example_dataset-150x150.png 150w, https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2017\/03\/example_dataset-200x200.png 200w, https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2017\/03\/example_dataset-300x300.png 300w, https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2017\/03\/example_dataset-400x400.png 400w, https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2017\/03\/example_dataset-600x600.png 600w, https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2017\/03\/example_dataset-768x768.png 768w, https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2017\/03\/example_dataset-800x800.png 800w, https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2017\/03\/example_dataset.png 1000w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-3032\" class=\"wp-caption-text\">Nuage de points du jeu de donn\u00e9es.<\/p><\/div><\/td>\n<td style=\"width: 361.273px; height: 333.1px;\">\n<p><div id=\"attachment_3033\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2017\/03\/lr_example-1.png\"><img decoding=\"async\" aria-describedby=\"caption-attachment-3033\" class=\"wp-image-3033 size-medium\" src=\"https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2017\/03\/lr_example-1-300x300.png\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2017\/03\/lr_example-1-66x66.png 66w, https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2017\/03\/lr_example-1-150x150.png 150w, https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2017\/03\/lr_example-1-200x200.png 200w, https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2017\/03\/lr_example-1-300x300.png 300w, https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2017\/03\/lr_example-1-400x400.png 400w, https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2017\/03\/lr_example-1-600x600.png 600w, https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2017\/03\/lr_example-1-768x768.png 768w, https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2017\/03\/lr_example-1-800x800.png 800w, https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2017\/03\/lr_example-1.png 1000w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-3033\" class=\"wp-caption-text\">Superposition d&rsquo;une\u00a0droite de r\u00e9gression (bleu).<\/p><\/div><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p>Bien qu&rsquo;il soit tentant de\u00a0suivre cette droite pour pr\u00e9dire des \u00e9v\u00e8nements \u00e0 l&rsquo;ext\u00e9rieur de nos observations, il faut faire attention \u00e0 de telles pr\u00e9dictions puisque le mod\u00e8le n&rsquo;a pas \u00e9t\u00e9 b\u00e2ti en prenant compte de cet espace. Aucune information n&rsquo;est disponible pour supporter cette extrapolation.<\/p>\n<h3>T\u00e2che<\/h3>\n<p>Plus formellement, il s&rsquo;agit de trouver la\u00a0pente $m$\u00a0et l&rsquo;ordonn\u00e9e \u00e0 l&rsquo;origine $b$ pour une droite qui minimise la somme des erreurs (distances) carr\u00e9es entre nos observations et la droite. Rappelons nous l&rsquo;\u00e9quation d&rsquo;une droite :<\/p>\n<p style=\"text-align: center;\">$ y = m x + b$<\/p>\n<p>Bien que la diff\u00e9rence perpendiculaire repr\u00e9sente une diff\u00e9rence (ou erreur) plus exacte, seule la diff\u00e9rence verticale (diff\u00e9rence entre la valeur $y$ d&rsquo;une observation\u00a0et la valeur $y$ sur la droite de r\u00e9gression pour la m\u00eame valeur $x$) est utilis\u00e9e, simplifiant ainsi le calcul.<\/p>\n<h3>Approche na\u00efve<\/h3>\n<p><span style=\"color: #ff0000;\"><em>Avertissement! Cette section\u00a0et le code qui y est contenu est offert simplement comme exemple\u00a0jouet. Sautez\u00a0\u00e0 la section \u00ab\u00a0Approche analytique\u00a0\u00bb pour la\u00a0v\u00e9ritable solution!<\/em><\/span><\/p>\n<p>Connaissant l&rsquo;\u00e9quation de la droite, serait-il r\u00e9aliste\u00a0de g\u00e9n\u00e9rer une multitude de\u00a0droites avec pentes et ordonn\u00e9es \u00e0 l&rsquo;origine al\u00e9atoirement choisies? Un simple\u00a0calcul de l&rsquo;erreur pour\u00a0chaque droite\u00a0nous indiquerait donc si elle repr\u00e9sente une droite de r\u00e9gression approximant bien nos donn\u00e9es. Malheureusement, cette t\u00e2che est <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Paradoxe_du_singe_savant\">bien trop ambitieuse<\/a>. L&rsquo;espace de recherche est infiniment grand! Une infinit\u00e9 de droites doivent \u00eatre test\u00e9es pour aboutir \u00e0 la solution optimale. M\u00eame si l&rsquo;on se contente d&rsquo;une\u00a0solution non optimale,\u00a0cette technique\u00a0peut r\u00e9alistement seulement fonctionner si la recherche est s\u00e9v\u00e8rement born\u00e9e. Voici un brin de code python impl\u00e9mentant cette id\u00e9e loufoque.<\/p>\n<pre><code class=\"python\">import random\r\n\r\ndef error(m, b, X, Y):\r\n assert(len(X) == len(Y))\r\n return sum(((m*x+b) - Y[idx])**2 for idx, x in enumerate(X))\r\n\r\ndef naive_LR(X, Y, n):\r\n    assert(len(X) == len(Y))\r\n    best_error = None\r\n    best_m = None\r\n    best_b = None\r\n    for i in range(0,n):\r\n        # Attention! valeurs des bornes de m et b doivent \u00eatres\r\n        # ajust\u00e9es en fonction des donn\u00e9es!\r\n        m = random.uniform(-100, 100)\r\n        b = random.uniform(-100, 100)\r\n        error = error(m, b, X, Y)\r\n        if error &lt; best_error:\r\n            best_error = error\r\n            best_m = m\r\n            best_b = b\r\n        return best_error, best_m, b<\/code><\/pre>\n<p>Surprenament, lors de mes tests, cette impl\u00e9mentation semblait quand m\u00eame trouver une droite assez bien ajust\u00e9. Le succ\u00e8s de ce code d\u00e9pend largement\u00a0de la s\u00e9lection de bornes pour les valeurs possibles de\u00a0$m$\u00a0et $b$. Ici, les bornes ont \u00e9t\u00e9 s\u00e9lectionn\u00e9es plus ou moins al\u00e9atoirement en \u00e9tant s\u00fbr de s\u00e9lectionner des valeurs beaucoup plus grandes que les extr\u00eames retrouv\u00e9s\u00a0dans notre jeu de donn\u00e9es. Bien s\u00fbr, de meilleurs heuristiques peuvent \u00eatres concoct\u00e9es\u00a0pour la s\u00e9lection de telles bornes (avec comme cons\u00e9quence de rendre notre solution moins na\u00efve). Finalement, le nombre de droites \u00e0 g\u00e9n\u00e9rer, $n$, doit lui aussi \u00eatre fix\u00e9. Le nombre de\u00a0droites g\u00e9n\u00e9r\u00e9es augmente le nombre chances de trouver une droite bien ajust\u00e9e tout en augmentant le temps de calcul.<\/p>\n<h3>Approche\u00a0analytique<\/h3>\n<p>Heureusement, ce type de probl\u00e8me est assez simple pour qu&rsquo;une solution purement analytique existe. Comme nous l&rsquo;avons d\u00e9crit plus haut, c&rsquo;est la sommation de la distance verticale entre nos\u00a0observations et la droite de r\u00e9gression\u00a0au carr\u00e9e qui nous sert de fonction de co\u00fbt et cela est ce que nous tenons \u00e0 minimiser. Elle se r\u00e9sume ainsi :<\/p>\n<p style=\"text-align: center;\">$ cost = \\sum_{i=1}^n(y_i-\\hat{y_i})^2 $<\/p>\n<p>En y ins\u00e9rant\u00a0l&rsquo;\u00e9quation de la droite :<\/p>\n<p style=\"text-align: center;\">$ cost = \\sum_{i=1}^n(y_i-(m x_i + b))^2 $<\/p>\n<p>De cette fonction, on y isole la pente. Notez qu&rsquo;une barre plac\u00e9e sur\u00a0une variable (ex. $\\bar{x}$) repr\u00e9sente\u00a0la moyenne de cette variable dans nos observations.<\/p>\n<p style=\"text-align: center;\">$ \\hat{m} = \\frac{ \\sum_{i=1}^n (x_i &#8211; \\bar{x})(y_i &#8211; \\bar{y}) }{ \\sum_{i=1}^n (x_i &#8211; \\bar{x})^2 } $<\/p>\n<p>Une fois trouv\u00e9e, cette valeur peut \u00eatre introduite dans l&rsquo;\u00e9quation de la droite pour y trouver l&rsquo;ordonn\u00e9e \u00e0 l&rsquo;origine $b$.<\/p>\n<p style=\"text-align: center;\">$ \\hat{b} = \\bar{y}-\\hat{m}\\,\\bar{x} $<\/p>\n<p>(Une manipulation\u00a0math\u00e9matique\u00a0plus d\u00e9taill\u00e9e peut \u00eatre retrouv\u00e9e dans <a href=\"https:\/\/en.wikipedia.org\/wiki\/Simple_linear_regression#Fitting_the_regression_line\">l&rsquo;article wikip\u00e9dia anglais de la r\u00e9gression lin\u00e9aire simple<\/a>\u00a0et dans les <a href=\"http:\/\/www.stat.ufl.edu\/~winner\/qmb3250\/notespart2.pdf\">notes d&rsquo;un cours de stats de l&rsquo;universit\u00e9 de la Floride<\/a>.)<\/p>\n<p>Le code :<\/p>\n<pre><code class=\"python\">def mean(l):\r\n    return float(sum(l)) \/ len(l)\r\n\r\ndef analytical_LR(X, Y):\r\n    assert(len(X) == len(Y))\r\n    mean_x = mean(X)\r\n    mean_y = mean(Y)\r\n\r\n    num = sum((X[idx] - mean_x)*(Y[idx] - mean_y) for idx in range(len(X)))\r\n    denum = sum((X[idx] - mean_x)**2 for idx in range(len(X)))\r\n    m = num \/ float(denum)\r\n    b = mean_y - m*mean_x\r\n    error = error(m, b, X, Y)\r\n\r\n    return error, m, b\r\n<\/code><\/pre>\n<h3>Approche\u00a0it\u00e9rative &#8211; descente de gradient<\/h3>\n<p>Une solution peut aussi \u00eatre trouv\u00e9e par descente de gradient. Cette m\u00e9thode\u00a0tente d&rsquo;approcher une solution optimale en ajustant petit \u00e0 petit les param\u00e8tres de la fonction \u00e0 optimiser. Bien qu&rsquo;il soit possible de trouver une solution \u00e0 une r\u00e9gression lin\u00e9aire simple avec cette m\u00e9thode, elle est g\u00e9n\u00e9ralement utilis\u00e9e dans le cadre de\u00a0r\u00e9gression non lin\u00e9aire o\u00f9 une solution analytique requerrait\u00a0un calcul prohibitif ou est simplement non\u00a0disponible. La descente de gradient est une m\u00e9thode grandement utilis\u00e9e en apprentissage machine lors de, entre autres, l&rsquo;entrainement de r\u00e9seaux de neurones. Elle permet d&rsquo;obtenir rapidement une solution approximative \u00e0 un probl\u00e8me complexe.<\/p>\n<p>Cette approche sera couvert dans un prochain article.\u00a0Restez \u00e0 l&rsquo;\u00e9coute!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>L&rsquo;objectif\u00a0premier du scientifique des donn\u00e9es (data scientist) est l&rsquo;exploration de donn\u00e9es afin d&rsquo;en d\u00e9couvrir des relations d&rsquo;int\u00e9r\u00eat. Des m\u00e9thodes statistiques et d&rsquo;apprentissage machine lui servent\u00a0d&rsquo;outils pour la d\u00e9couverte et la mod\u00e9lisation de telles relations. L&rsquo;information d\u00e9couverte par ces m\u00e9thodes peut ensuite \u00eatre mise en pratique.\u00a0Par exemple, en m\u00e9decine clinique, l&rsquo;\u00e9laboration d&rsquo;un mod\u00e8le pr\u00e9dictif bas\u00e9 sur des\u00a0donn\u00e9es cliniques peut\u00a0servir d&rsquo;outil prognostic afin de\u00a0guider un\u00a0traitement. R\u00e9gression lin\u00e9aire simple L&rsquo;une des m\u00e9thodes\u00a0la plus\u00a0simple \u00e0 la disposition du scientifique des donn\u00e9es est la r\u00e9gression <a href=\"https:\/\/bioinfo.iric.ca\/fr\/introduction_a_la_regression_lineaire\/\"> [&#8230;]<\/a><\/p>\n","protected":false},"author":7,"featured_media":3033,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[69,26],"tags":[132,131,133,62,130],"class_list":["post-3019","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-analyse-de-donnees","category-langage-python","tag-ajustement-de-courbe","tag-apprentissage-automatique","tag-informatique","tag-statistiques","tag-visualisation-de-donnees"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2017\/03\/lr_example-1.png","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/posts\/3019","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/comments?post=3019"}],"version-history":[{"count":65,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/posts\/3019\/revisions"}],"predecessor-version":[{"id":3103,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/posts\/3019\/revisions\/3103"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/media\/3033"}],"wp:attachment":[{"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/media?parent=3019"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/categories?post=3019"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/tags?post=3019"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}