2 votes

La régression linéaire en python tourne mal avec une ligne de régression complètement erronée

Bonjour à tous Je pratiquais la régression linéaire sur un jeu de données provenant de kaggle ( https://www.kaggle.com/sohier/calcofi , bouteille.csv), et j'essaie de l'implémenter de la manière suivante :

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

df = pd.read_csv("bottle.csv")
df

df1 = df.loc[:,"T_degC":"Salnty"]
df1 = df1.dropna()

from sklearn.cross_validation import train_test_split
from sklearn.linear_model import LinearRegression
X = df1["T_degC"]
y = df1["Salnty"]
X = X.values
type(X)
y = y.values
type(y)

X_train, X_test, y_train, y_test = train_test_split(X,y, test_size = 0.4)
lm = LinearRegression()

X_train = X_train.reshape(-1,1)
X_test = X_test.reshape(-1,1)
y_train = y_train.reshape(-1,1)

lm.fit(X_train, y_train)

Le problème survient lorsque je regarde les intercepts et le coefficient, qui sont :

lm.intercept_
lm.coef_

qui s'avèrent être 34,4 et -0,05 respectivement. Mais considérez ensuite le nuage de points des variables X et y :

plt.scatter(X_train, y_train)

Il ne semble pas qu'une ligne à pente négative puisse être la ligne de régression de cette distribution. Je me demande donc ce que j'ai pu faire de mal pour arriver à ce résultat.

7voto

Jondiedoop Points 2996

C'est une étude de cas très intéressante !

Il semble que le la ligne de régression est en fait juste y vos yeux (et votre complot) vous trompent .

Le nuage de points que vous produisez ressemble à ça :
Scatter plot with alpha=1

On dirait bien une pente positive, non ? Pas vrai ?
Eh bien, non. Il y a tellement de points ici, que il est impossible de voir où se trouvent le plus de points . Il se pourrait bien que la plupart des points montrent une pente descendante, mais qu'ils soient tous superposés, et que "quelques" autres points qui ne sont pas superposés montrent une pente ascendante.

Un meilleur tracé : réduisez le chevauchement visuel

Pour tester cela, j'ai tracé les points avec une opacité beaucoup plus faible et une taille de marqueur plus petite (pour que la quantité de chevauchement soit réduite) :

plt.scatter(X_train, y_train, alpha=0.002, s=1)
plt.show()

Scatter plot with less overlap
Ici, vous pouvez voir qu'en fait, la plupart des points présentent une pente descendante (bien que l'on puisse également affirmer qu'une corrélation linéaire n'est pas la meilleure façon de modéliser la corrélation). Rappelez-vous que la régression linéaire essaie d'ajuster le meilleur modèle de corrélation. droit ligne, ce qui signifie qu'il suit la plupart des points, mais ne sera pas en mesure de capturer un modèle plus difficile qui n'est pas droit s'il n'y a que quelques points aberrants.

En fait, le coefficient de corrélation linéaire est également négatif :

df1[["T_degC", "Salnty"]].corr()
#          T_degC    Salnty
#T_degC  1.000000 -0.505266
#Salnty -0.505266  1.000000

Conclusion

Donc en bref :
1. Votre ligne de régression semble être correcte
2. Assurez-vous que vous regardez le bon graphique - si tous les points sont superposés, un diagramme de dispersion n'est peut-être pas optimal.

Edit : confirmation visuelle

Encore un graphique : le nuage de points avec votre régression par-dessus : scatter plot with regression on top of it

Cela semble raisonnable (pour une ligne droite), n'est-ce pas ?

Peut-être qu'une autre parcelle serait plus facile à regarder avec autant de points de toute façon :

import seaborn as sns
sns.jointplot(x='T_degC', y='Salnty', data=df1, kind='hex')

hexbin jointplot

Le jointplot visualise explicitement le chevauchement en colorant plus fortement les parties du graphique où il y a beaucoup de points. Cela confirme à nouveau l'existence d'une tendance à la baisse, mais il y a un nombre (relativement faible) d'autres points qui vont à l'encontre de cette tendance. J'espère que cela vous aidera !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X