Search
Régression linéaire

Dans ce cours, nous traitons la régression linéaire, une approche très simple pour l'apprentissage supervisé. En particulier, la régression linéaire est un outil utile pour prédire une variable réponse quantitative.

Régression linéaire simple

La régression linéaire simple porte bien son nom : il s'agit d'une approche très simple pour prédire une réponse quantitative Y sur la base d'une variable prédictive X. Elle suppose qu'il existe approximativement une relation linéaire entre X et Y . Mathématiquement, nous pouvons écrire cette relation linéaire comme

$$ Y\approx \beta_0 + \beta_1 X \label{simpleLM}\tag{3.1} $$

Dans l'équation \ref{simpleLM}, $\beta_0$ et $\beta_1$ sont deux constantes inconnues qui représentent les termes de l'intercept ($\beta_0$) et de la pente ($\beta_1$ ) dans le modèle linéaire. Ils sont connus comme les coefficients ou paramètres du modèle.

Une fois que nous avons utilisé nos données d'entraînement du modèle pour estimer $\hat{\beta}_0$ et $\hat{\beta}_1$, nous pouvons prédire nos $Y$ en écrivant:

$$ \hat{y}= \hat{\beta}_0 + \hat{\beta}_1 X \label{simpleLM_vraie}\tag{3.2} $$
options(warn=-1)
adv<-read.csv("https://raw.githubusercontent.com/nmeraihi/data/master/islr/Advertising.csv")
head(adv)
XTVRadioNewspaperSales
1 230.137.8 69.2 22.1
2 44.539.3 45.1 10.4
3 17.245.9 69.3 9.3
4 151.541.3 58.5 18.5
5 180.810.8 58.4 12.9
6 8.748.9 75.0 7.2
fit.lm <- lm(Sales ~ TV, data=adv)
summary(fit.lm)
Call:
lm(formula = Sales ~ TV, data = adv)

Residuals:
    Min      1Q  Median      3Q     Max 
-8.3860 -1.9545 -0.1913  2.0671  7.2124 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 7.032594   0.457843   15.36   <2e-16 ***
TV          0.047537   0.002691   17.67   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 3.259 on 198 degrees of freedom
Multiple R-squared:  0.6119,	Adjusted R-squared:  0.6099 
F-statistic: 312.1 on 1 and 198 DF,  p-value: < 2.2e-16
library(ggplot2)
options(repr.plot.width=5, repr.plot.height=3)
library(ggplot2)
options(repr.plot.width=5, repr.plot.height=3)
ggplot(adv, aes(TV, Sales)) +
  geom_point() +
  geom_smooth(method = "lm", se = FALSE)
`geom_smooth()` using formula 'y ~ x'

Estimation des coefficients

Soit $ \hat{y}= \hat{\beta}_0 + \hat{\beta}_1 X$ la prédiction pour $Y$ sur la $i$ème valeur de $X$. Pour chaque point rouge dans la figure ci-dessous, on peut calculer "de combien on s'est trompé" dans notre prédiction, on peut le faire en calculant la distance (verticale) entre le point rouge et la droite bleue qui la régression linéaire simple de notre jeu de données.

image.png

Alors pour chaque point $i$, nous pouvons écrire $e_i=y_i -\hat{y}_i$. Nous appelons $e_i$ le $i$ème résidu. Nous pouvons calculer la somme du carré (valeur positives et négatives) des résidus par:

$$ \text{RSS}=e_1^2, e_2^2, \dots, e_n^2, $$

ou de manière équivalente à

$$ \text{RSS}=(y_1-\hat{\beta}_0 - \hat{\beta}_1 x_1)^2, (y_2-\hat{\beta}_0 - \hat{\beta}_1 x_2)^2, \dots, (y_n-\hat{\beta}_0 - \hat{\beta}_1 x_2)^2. \label{RSS}\tag{3.3.1} $$

Le but bien évidemment est d'avoir cette somme des résidus la plus petite possible. Nous devons donc minimiser RSS

$$ \underset{\beta_0, \dots, \beta_p}{\text{arg min }} \text{RSS}=\sum_{i=1}^n\Bigg( y_i -\sum_{j=0}^p\beta_j x_{i,j} \Bigg)^2 \label{argminRSS}\tag{3.3.2} $$

L'approche des moindres carrés choisit $\beta_0$ et $\beta_0$ pour minimiser le RSS. On peut montrer que;

$$ \hat{\beta}_1=\frac{\sum_{i=1}^n (x_i-\bar{x})(y_i-\bar{y})}{\sum_{i=1}^n (x_i-\bar{x})^2} \label{RSSbeta}\tag{3.4.1} $$
$$ \hat{\beta}_0=\bar{y}-\hat{\beta}_1 \bar{x} \label{RSSy}\tag{3.4.2} $$

où $\bar{y}=\frac{1}{n}\sum_{i=1}^ny_i$ et$\bar{x}=\frac{1}{n}\sum_{i=1}^nx_i$ sont les moyennes d'échantillonnage. En d'autres termes, (3.4.1) et (3.4.2) définissent les estimations des coefficients des moindres carrés pour la régression linéaire simple.

Exercice:

Soit le vecteur de paramètres $\beta$; $$ \beta:=[\beta_0, \dots \beta_1]^T, $$

le vecteur de la variable réponse des données d'entraînement:

$$ \mathbf{y}=[y_1, \dots y_n]^T $$

et la matrice contenant les prédicteurs de l'ensemble des données d'entraînement:

\begin{equation*} \mathbf{X}_{n,p} = \begin{pmatrix} 1 & x_{1,1} & \cdots & x_{1,p} \\ 1 & x_{2,1} & \cdots & x_{2,p} \\ \vdots & \vdots & \ddots & \vdots \\ 1 & x_{n,1} & \cdots & x_{n,p} \end{pmatrix} \end{equation*}

Montrer que l'estimateur OLS ( ordinary least square ) des paramètres $\beta$ dans une régression linéaire est donné par:

$$ \hat{\beta}= (\mathbf{x}^T \mathbf{x})^{-1}\mathbf{x}^T\mathbf{y} \label{simpleLMOLS}\tag{3.4.3} $$

Estimation des Coefficients avec statsmodels

fit.lm$coefficients
(Intercept)
7.03259354912769
TV
0.0475366404330198

On peut donc écrire:

$$ \texttt{ventes} \approx 7.032594 + 0.047537\texttt{ télévision} $$

L'équation ci-dessus implique donc qu'une augmentation de 100 unités des coûts de publicité (TV) augmentera les vente de quatre unités.

Régression linéaire multiple

La régression linéaire simple est une approche utile pour prédire une variable réponse sur la base d'une seule variable explicative. Cependant, dans la pratique, nous avons souvent plus d'un prédicteur. Par exemple, dans les données sur la publicité, nous avons examiné la relation entre les ventes et la publicité télévisée. Nous disposons également de données sur les sommes dépensées en publicité à la radio et dans les journaux, et nous souhaiterions peut-être savoir si l'un ou l'autre de ces deux médias est associé aux (plus ou moins) aux recettes des ventes.

Au lieu d'ajuster un modèle de régression linéaire simple distinct pour chaque prédicteur, une meilleure approche consiste à étendre le modèle de régression linéaire simple $Y= \beta_0 + \beta_1 X + \epsilon$ afin qu'il puisse directement s'adapter à de multiples prédicteurs. Nous pouvons le faire en donnant à chaque prédicteur un coefficient de pente distinct dans un modèle unique. En général, supposons que nous ayons $p$ prédicteurs distincts. Le modèle de régression linéaire multiple prend alors la forme

$$ Y= \beta_0 + \beta_1 X_1, \beta_2 X_2 + \dots + \beta_p X_p + \epsilon \tag{3.5} $$

où $X_j$ représente le $j$ème prédicteur et $\beta_j$ quantifie l'association entre cette variable et la réponse. Nous interprétons $\beta_j$ comme l'effet moyen sur $Y$ d'une augmentation d'une unité de $X_j$, en maintenant fixes tous les autres prédicteurs. Dans l'exemple de la publicité, (3.5) devient

$$ \texttt{ventes} = \beta_0 + \beta_1 \texttt{ télévision} + \beta_2 \texttt{ radio}+ \beta_3 \texttt{ journaux} +\epsilon $$

Estimation des coefficients de régression

Exemple 1

Les valeurs de $\hat{\beta}_0, \hat{\beta}_1, \dots, \hat{\beta}_p$ sont la solution qui minimiste l'équation \ref{argminRSS}. Tout logiciel statistique peut être utilisé pour calculer ces estimations de ces coefficients.

fit.lm3 <- lm(Sales ~ TV + Radio + Newspaper, data=adv)
summary(fit.lm3)
Call:
lm(formula = Sales ~ TV + Radio + Newspaper, data = adv)

Residuals:
    Min      1Q  Median      3Q     Max 
-8.8277 -0.8908  0.2418  1.1893  2.8292 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept)  2.938889   0.311908   9.422   <2e-16 ***
TV           0.045765   0.001395  32.809   <2e-16 ***
Radio        0.188530   0.008611  21.893   <2e-16 ***
Newspaper   -0.001037   0.005871  -0.177     0.86    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1.686 on 196 degrees of freedom
Multiple R-squared:  0.8972,	Adjusted R-squared:  0.8956 
F-statistic: 570.3 on 3 and 196 DF,  p-value: < 2.2e-16
fit.lm3$coefficients
(Intercept)
2.93888936945941
TV
0.0457646454553976
Radio
0.188530016918204
Newspaper
-0.00103749304247628

Exemple 2

Appliquons maintenat une régression linéaire multiple sur les deux prédicteurs 'Radio', 'TV'. Mais tout d'abord trançon un nuage de ponits 3D de la variable réponse ventes par rapport aux deux variables explicatives Radio et TV.

# install.packages("plotly")
library(plotly)
plot_ly(showscale=FALSE) %>%
  add_markers(
    x = adv$Radio,
    y = adv$TV,
    z = adv$Sales,
    hoverinfo = 'text',
    text = ~paste("x1 - Radio: ", adv$Radio, 
                  "</br> x2 - TV: ", adv$TV, 
                  "</br> y - Ventes: ", adv$Sales)
  ) %>% 
  layout(
    scene = list(
      xaxis = list(title = "x1 - Radio"),
      yaxis = list(title = "x2 - TV ($)"),
      zaxis = list(title = "y - Vente ($)")
    )
  )