Régression linéaire

Ce notebook s'intéresse à la façon d'interpréter les résultats d'une régression linéaire lorsque les variables sont corrélées puis il explore une façon d'associer arbre de décision et régression linéaire pour construire une régression linéaire par morceaux.

Un cas simple

Une façon d'interpréter des résultats statistiques est de les calculer dans un cas où la réponse cherchée est connue. On simule un modèle simple $Y=\alpha X_1 + 0.X_2 + \epsilon$ et on cale une régression linéaire. On suppose que $X_1, X_2, \epsilon$ sont des variables aléatoires gaussiennes de même variance et moyenne.

On vérifie que le coefficient devant $X_1$ est non nul (P-value nulle, 0 n'est pas l'intervalle de confiance). Le coefficient devant $X_2$ n'est pas nul mais presque, la P-value est élevée, le coefficient $R^2$ est élevé. Dessinons.

Evolution de R2

Dans la régression précédente, le coefficient $R^2$ transcrit en quelque sorte la part du bruit $\epsilon$ par rapport au terme $\alpha X_1$. Faisons varier $\alpha$.

Dans ce cas de régression simple, la valeur à prédire est $y_i$, la valeur prédite est $\hat{y_i}=\alpha X_{1i}$ et la moyenne $\bar{y} = \alpha \bar{X_1} + \bar{\epsilon} = 0$.

$$R^2 = 1 - \frac{\sum_{i=1}^n (\hat{y_i}-\bar{y})^2}{\sum_{i=1}^n (y_i - \bar{y})^2}=1-\frac{\mathbb{V}\epsilon}{\alpha^2\mathbb{V}X_1+\mathbb{V}\epsilon} = 1 - \frac{1}{1+\alpha^2}=\frac{\alpha^2}{1+\alpha^2}$$

Deux variables corrélées

On ne change pas le modèle mais on fait en sorte que $X_2=X_1$. Les deux variables sont corrélées.

Les variables corrélées n'ont pas l'air de déranger l'algorithme de résolution car il utilise la méthode SVD pour résoudre le même problème dans un espace de moindre dimension. Le problème survient que les deux variables ne sont pas complétement corrélées. On étudie le modèle $Y \sim X_1 + X'_2$ avec $X'_2 = \alpha X_1 + (1-\alpha) X_2$ et on réduit la variance du bruit pour en diminuer les effets.

Le $r^2$ augmente quand la corrélation augmente mais les coefficients sont moins fiables. Les résultats devraient être sensiblement identiques en théorie mais en pratique, plus le déterminant devient proche de zéro, plus l'ordinateur est limité par sa précision numérique. Pour en savoir plus, vous pouvez lire un examen écrit que j'ai rédigé, en python bien sûr : Examen Programmation ENSAE première année 2006. Cette précision est aux alentours de $10^{-15}$ ce qui correspond à la précision numérique des double.

On fait un dernier test avec scikit-learn pour vérifier que l'algorithme de résolution donne des résultats similaires pour un cas où le déterminant est quasi-nul.

Le second graphe est trompeur mais il ne faut pas oublier de regarder l'échelle de l'axe des ordonnées.

Indicatrices

$X_1$ est une variable aléatoire gaussienne. On teste maintenant un modèle $Y = X'_1 + X'_2 + \epsilon$ avec $X'_1 = X_1 \mathbf{1\!\!1}_{X_1 < 0}$ et $X'_2 = X_1 \mathbf{1\!\!1}_{X_1 \geqslant 0}$.

On découpe en trois.

Régression linéaire par morceaux

On se place dans un cas particulier où le problème est linéaire par morceaux :

$$Y = -2 X_1 \mathbf{1\!\!1}_{X_1 + \epsilon_1 <0} + 4 X_1 \mathbf{1\!\!1}_{X + \epsilon_1 > 0} + \epsilon_2$$

La régression donne de très mauvais résultat sur ce type de problèmes mais on cherche une façon systématique de découper le problème en segments linéaires.

Passons à un arbre de décision qui n'est pas le meilleur modèle mais on va détourner ses résultats pour revenir à un problème de régression par morceaux.

On extrait tous les seuils de l'arbre et on ajoute les milieux de segments.

On fait une régression sur les variables $W_{i>0} = X_1 \mathbf{1\!\!1}_{X_1 > t_i}$, $W_0 = X_1$ où les $(t_i)$ sont les seuils.

Dessinons les résultats de la prédictions.

Le modèle nous suggère de ne garder que quelques seuils. En s'appuyant sur les p-values :

Le coefficient $R^2$ est quasiment identique pour un nombre de segments moindre. Je me suis amusé à rendre ce code plus générique pour comparer la première étape, le découpage en morceaux, via deux modèles, un arbre de décision et le nouvel objet KBinsDiscretizer qui segmente une variable sans tenir compte de la cible. La régression n'est plus nécessaire linéaire : Piecewise linear regression. Je me suis également amusé à faire de même pour une classification par morceaux PiecewiseClassifier. Celle-ci pose quelques soucis pratiques car toutes les classes ne sont pas forcément représentées dans chaque compartiment...