{"id":3232,"date":"2022-03-10T06:03:53","date_gmt":"2022-03-10T06:03:53","guid":{"rendered":"https:\/\/akyalab.com\/?p=3232"},"modified":"2022-03-25T23:34:10","modified_gmt":"2022-03-25T23:34:10","slug":"linear-regression-in-python","status":"publish","type":"post","link":"https:\/\/akyalab.com\/fr\/linear-regression-in-python\/","title":{"rendered":"R\u00e9gression lin\u00e9aire en Python"},"content":{"rendered":"<h3 class=\"wp-block-heading\">Introduction:<\/h3>\n\n\n\n<p>Les algorithmes de r\u00e9gression pr\u00e9disent des valeurs continues \u00e0 partir de variables pr\u00e9dictives. Pr\u00e9dire le prix d'une maison en fonction de ses caract\u00e9ristiques est un bon exemple d'analyse de r\u00e9gression. Dans cet article, je vais impl\u00e9menter une r\u00e9gression lin\u00e9aire univari\u00e9e (une variable) en python.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">R\u00e9gression lin\u00e9aire? Qu'est-ce que \u00e7a veut dire\u00a0?<\/h3>\n\n\n\n<p>La r\u00e9gression lin\u00e9aire est un algorithme qui trouvera une ligne droite qui se rapproche le plus possible d'un ensemble de points. Les points repr\u00e9sentent les donn\u00e9es d'entra\u00eenement.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"341\" height=\"229\" src=\"https:\/\/akyalab.com\/wp-content\/uploads\/2022\/03\/linear_regression.jpeg\" alt=\"\" class=\"wp-image-3233\" srcset=\"https:\/\/akyalab.com\/wp-content\/uploads\/2022\/03\/linear_regression.jpeg 341w, https:\/\/akyalab.com\/wp-content\/uploads\/2022\/03\/linear_regression-300x201.jpeg 300w, https:\/\/akyalab.com\/wp-content\/uploads\/2022\/03\/linear_regression-18x12.jpeg 18w\" sizes=\"(max-width: 341px) 100vw, 341px\" \/><figcaption>https:\/\/mrmint.fr\/regression-lineaire-python-pratique<\/figcaption><\/figure>\n\n\n\n<p>Nos points en orange sont les donn\u00e9es d'entr\u00e9e. Ils sont repr\u00e9sent\u00e9s par le couple (x_{i}, y_{i}). Les valeurs x_{i} sont les variables pr\u00e9dictives, et y_{i} est la valeur observ\u00e9e (le prix d'une maison par exemple). On cherche \u00e0 trouver une droite F(x) = \\alpha*x + \\beta telle que, quel que soit x_{i}, on veuille F(x_{i}) \\approx y_{i}.<\/p>\n\n\n\n<p>In other words, we want a line that is as close as possible to all the points of our training data.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Pr\u00e9sentation du probl\u00e8me<\/h3>\n\n\n\n<p>Le probl\u00e8me que nous essayons de r\u00e9soudre et son jeu de donn\u00e9es sont ceux d'un cours que j'ai suivi <a href=\"https:\/\/fr.coursera.org\/learn\/machine-learning\">Andrew NG&#8217;s<\/a> Machine Learning on Coursera. At the time I had to implement the solution in MATLAB. I can assure you it was not my cup of tea. \ud83d\ude09<\/p>\n\n\n\n<p>Le probl\u00e8me \u00e0 r\u00e9soudre est le suivant :<\/p>\n\n\n\n<p>Supposons que vous soyez le PDG d'une franchise de food truck. Vous envisagez diff\u00e9rentes villes pour ouvrir un nouveau point de vente. La cha\u00eene a d\u00e9j\u00e0 des camions dans diff\u00e9rentes villes et vous avez des donn\u00e9es sur les b\u00e9n\u00e9fices et les populations de la ville.<br>You want to use this data to help you choose the city to open a new point of sale there.<\/p>\n\n\n\n<p>Ce probl\u00e8me est de type apprentissage supervis\u00e9 qui peut \u00eatre mod\u00e9lis\u00e9 par un algorithme de r\u00e9gression lin\u00e9aire. Il est de type supervis\u00e9 car pour chaque ville ayant un certain nombre d'habitants (variable pr\u00e9dictive X), on dispose du gain r\u00e9alis\u00e9 dans cette derni\u00e8re (la variable que l'on cherche \u00e0 pr\u00e9dire : Y).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Format de donn\u00e9es<\/h3>\n\n\n\n<p>Les donn\u00e9es d\u2019apprentissage sont au format CSV. Les donn\u00e9es sont s\u00e9par\u00e9s par des virgules. La premi\u00e8re colonne repr\u00e9sente la population d\u2019une ville et la deuxi\u00e8me colonne indique le profit d\u2019un camion ambulant dans cette ville. Une valeur n\u00e9gative indique une perte.\n\\end<br>\\end<br>Le nombre d\u2019enregistrements de nos donn\u00e9es d\u2019entr\u00e9es est 97.<\/p>\n\n\n\n<p>Le fichier est t\u00e9l\u00e9chargeable depuis mon espace Github: https:\/\/github.com\/ybenzaki\/univariate_linear_regression_python <a href=\"https:\/\/github.com\/ybenzaki\/univariate_linear_regression_python\">ici<\/a><\/p>\n\n\n\n<p>Pour r\u00e9soudre ce probl\u00e8me, on va pr\u00e9dire le profit (la variable Y) en fonction de la taille de la population (la variable pr\u00e9dictive X)<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Chargement des donn\u00e9es<\/h3>\n\n\n\n<p>Tout d\u2019abord, il faudra lire et charger les donn\u00e9es contenues dans le fichier CSV. Python propose via sa librairie Pandas des classes et fonctions pour lire divers formats de fichiers dont le CSV. <a href=\"https:\/\/pandas.pydata.org\/pandas-docs\/stable\/index.html#\">Pandas<\/a> library classes and functions to read various file formats including CSV.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><code>import<\/code> <code>pandas as pd<\/code><br><code>df =<\/code> <code>pd.read_csv(\"D:\\DEV\\PYTHON_PROGRAMMING\\univariate_linear_regression_dataset.csv\")<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>La fonction read_csv(), renvoie un DataFrame. Il s\u2019agit d\u2019un tableau de deux dimensions contenant, respectivement, la taille de population et les profits effectu\u00e9s. Pour pouvoir utiliser les librairies de r\u00e9gression de Python, il faudra s\u00e9parer les deux colonnes dans deux variables Python.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#selection de la premi\u00e8re colonne de notre dataset (la taille de la population)\nX = df.iloc[0:len(df),0]\n#selection de deuxi\u00e8me colonnes de notre dataset (le profit effectu\u00e9)\nY = df.iloc[0:len(df),1]<\/code><\/pre>\n\n\n\n<p>Les variables X et Y sont maintenant de simples tableaux contenant 97 \u00e9l\u00e9ments.<\/p>\n\n\n\n<p>Note :<\/p>\n\n\n\n<p>La fonction len() permet d\u2019obtenir la taille d\u2019un tableau<br>La fonction iloc permet de r\u00e9cup\u00e9rer une donn\u00e9e par sa position\niloc[0:len(df),0] permettra de r\u00e9cup\u00e9rer toutes les donn\u00e9es de la ligne 0 \u00e0 la ligne 97 (qui est len(df)) se trouvant \u00e0 la colonne d\u2019indice 0<br>iloc[0:len(df),0] will retrieve all data from line 0 to line 97 (which is len(df)) located at column index 0<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Visualisation des donn\u00e9es<\/h3>\n\n\n\n<p>Avant de mod\u00e9liser un probl\u00e8me de Machine Learning, il est souvent utile de comprendre les donn\u00e9es. Pour y arriver, on peut les visualiser dans des graphes pour comprendre leur dispersion, d\u00e9duire les corr\u00e9lations entre les variables pr\u00e9dictives etc\u2026<\/p>\n\n\n\n<p>Parfois, il est impossible de visualiser les donn\u00e9es car le nombre de variables pr\u00e9dictives est trop important. Ce n\u2019est pas le cas ici, on ne dispose que de deux variables : la population et les profits.<\/p>\n\n\n\n<p>Nous pouvons utiliser un graphe de type nuage de points (Scatter plot) pour visualiser les donn\u00e9es :<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"800\" height=\"597\" src=\"https:\/\/akyalab.com\/wp-content\/uploads\/2022\/03\/data_viz.png\" alt=\"\" class=\"wp-image-3235\" srcset=\"https:\/\/akyalab.com\/wp-content\/uploads\/2022\/03\/data_viz.png 800w, https:\/\/akyalab.com\/wp-content\/uploads\/2022\/03\/data_viz-300x224.png 300w, https:\/\/akyalab.com\/wp-content\/uploads\/2022\/03\/data_viz-768x573.png 768w, https:\/\/akyalab.com\/wp-content\/uploads\/2022\/03\/data_viz-16x12.png 16w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n\n\n\n<p>On voit clairement qu\u2019il y a une corr\u00e9lation lin\u00e9aire entre les variables. Et que plus la taille de la population augmente, plus le profit en fait de m\u00eame.<\/p>\n\n\n\n<p>Le code Python permettant d\u2019effectuer ce nuage de points est le suivant :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import matplotlib.pyplot as plt\n \naxes = plt.axes()\naxes.grid() # dessiner une grille pour une meilleur lisibilit\u00e9 du graphe\nplt.scatter(X,Y) # X et Y sont les variables qu'on a extraite dans le paragraphe pr\u00e9c\u00e9dent\nplt.show()<\/code><\/pre>\n\n\n\n<p>Note :<\/p>\n\n\n\n<p>Matplotlib est la librairie python permettant de faire des graphes de plusieurs types :<br>Histogrammes<br>Nuages de Points,<br>Dessiner des courbes de fonctions<br>Des sch\u00e9mas camembert (Pie plot)<br>etc\u2026<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Appliquer l\u2019algorithme<\/h3>\n\n\n\n<p>Maintenant qu\u2019on comprend mieux nos donn\u00e9es, nous allons attaquer le c\u0153ur du probl\u00e8me : Trouver une fonction pr\u00e9dictive F(X) qui prendra en entr\u00e9e une taille de population, et produira en sortie une estimation du gain esp\u00e9r\u00e9. L\u2019id\u00e9e du jeu est que la pr\u00e9diction soit proche de la valeur observ\u00e9e F(X) \\approx Y.<\/p>\n\n\n\n<p>Note : Par souci de simplicit\u00e9, j\u2019ai fait le choix de ne pas d\u00e9couper mes donn\u00e9es issues du fichier CSV en Training Set et Test Set. Cette bonne pratique, \u00e0 appliquer dans vos probl\u00e9matiques ML, permet d\u2019\u00e9viter le sur-apprentissage. Dans cet article,  nos donn\u00e9es serviront \u00e0 la fois \u00e0 l\u2019entrainement de notre algorithme de r\u00e9gression et aussi comme jeu de test.<\/p>\n\n\n\n<p>Pour utiliser la r\u00e9gression lin\u00e9aire \u00e0 une variable (univari\u00e9e), on utilisera le module scipy.stats. Ce dernier dispose de la fonction linregress, qui permet de faire la r\u00e9gression lin\u00e9aire. <a href=\"https:\/\/docs.scipy.org\/doc\/scipy\/reference\/generated\/scipy.stats.linregress.html#scipy.stats.linregress\">scipy.stats<\/a> module. The latter has the linregress function, which allows you to do linear regression.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>from scipy import stats\n#linregress() returns several return variables. We will be interested\n# especially on slope and intercept\nslope, intercept, r_value, p_value, std_err = stats.linregress(X, Y)<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Effectuer des pr\u00e9dictions<\/h3>\n\n\n\n<p>Apr\u00e8s que la fonction linregress() nous ait renvoy\u00e9 les param\u00e8tres de notre mod\u00e8le : slope et intercept, on pourra effectuer des pr\u00e9dictions. En effet, la fonction de pr\u00e9diction sera de la forme :<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/akyalab.com\/wp-content\/uploads\/2022\/03\/quicklatex.com-455c8cff21f0d1127b306b19cc71dee2_l3.svg\" alt=\"\" class=\"wp-image-3236\"\/><\/figure>\n\n\n\n<p>On peut \u00e9crire cette fonction F(x) en python comme suit :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def predict(x):\n   return slope * x + intercept<\/code><\/pre>\n\n\n\n<p>Gr\u00e2ce \u00e0 cette fonction, on peut effectuer une pr\u00e9diction sur nos 97 populations ce qui nous fera une ligne droite.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#the variable fitLine will be an array of predicted values \u200b\u200bfrom the array of variables X\nfitLine = predict(X)\nplt.plot(X, fitLine, c='r')<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"800\" height=\"597\" src=\"https:\/\/akyalab.com\/wp-content\/uploads\/2022\/03\/prediction.png\" alt=\"\" class=\"wp-image-3237\" srcset=\"https:\/\/akyalab.com\/wp-content\/uploads\/2022\/03\/prediction.png 800w, https:\/\/akyalab.com\/wp-content\/uploads\/2022\/03\/prediction-300x224.png 300w, https:\/\/akyalab.com\/wp-content\/uploads\/2022\/03\/prediction-768x573.png 768w, https:\/\/akyalab.com\/wp-content\/uploads\/2022\/03\/prediction-16x12.png 16w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n\n\n\n<p>En effet, on voit bien que la ligne rouge, approche le plus possible tous les points du jeu de donn\u00e9es. Joli non ? \ud83d\ude42<\/p>\n\n\n\n<p>Si on prend par hasard, la 22 \u00e8me ligne de notre fichier CSV, on a la taille de population qui fait : 20.27 * 10 000 personnes et le gain effectu\u00e9 \u00e9tait  : 21.767 * 10 000 $<\/p>\n\n\n\n<p>En appelant la fonction predict() qu\u2019on a d\u00e9fini pr\u00e9c\u00e9demment :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>print predict(20.27)\n# return : 20.3870988313<\/code><\/pre>\n\n\n\n<p>On obtient un gain estim\u00e9 proche du vrai gain observ\u00e9 (avec un certain degr\u00e9 d\u2019erreur)<\/p>","protected":false},"excerpt":{"rendered":"<p>Introduction : Les algorithmes de r\u00e9gression pr\u00e9disent des valeurs continues \u00e0 partir de variables pr\u00e9dictives. Pr\u00e9dire le prix d'une maison en fonction de ses caract\u00e9ristiques est un bon exemple d'analyse de r\u00e9gression. Dans cet article, je vais impl\u00e9menter une r\u00e9gression lin\u00e9aire univari\u00e9e (une variable) en python. R\u00e9gression lin\u00e9aire? Qu'est-ce que \u00e7a veut dire\u00a0? La r\u00e9gression lin\u00e9aire est un algorithme qui trouvera une ligne droite qui vient comme [\u2026]<\/p>","protected":false},"author":3,"featured_media":3233,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0},"categories":[91],"tags":[],"_links":{"self":[{"href":"https:\/\/akyalab.com\/fr\/wp-json\/wp\/v2\/posts\/3232"}],"collection":[{"href":"https:\/\/akyalab.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/akyalab.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/akyalab.com\/fr\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/akyalab.com\/fr\/wp-json\/wp\/v2\/comments?post=3232"}],"version-history":[{"count":4,"href":"https:\/\/akyalab.com\/fr\/wp-json\/wp\/v2\/posts\/3232\/revisions"}],"predecessor-version":[{"id":3379,"href":"https:\/\/akyalab.com\/fr\/wp-json\/wp\/v2\/posts\/3232\/revisions\/3379"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/akyalab.com\/fr\/wp-json\/wp\/v2\/media\/3233"}],"wp:attachment":[{"href":"https:\/\/akyalab.com\/fr\/wp-json\/wp\/v2\/media?parent=3232"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/akyalab.com\/fr\/wp-json\/wp\/v2\/categories?post=3232"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/akyalab.com\/fr\/wp-json\/wp\/v2\/tags?post=3232"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}