python中的线性回归严重错误,完全错误的回归线

hep*_*aes 2 python linear-regression scikit-learn

大家好,我正在对来自kaggle(https://www.kaggle.com/sohier/calcofi,bottle.csv)的数据集进行线性回归,我尝试以下列方式实现它:

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)
Run Code Online (Sandbox Code Playgroud)

当我查看截距和系数时会出现问题,它们是:

lm.intercept_
lm.coef_
Run Code Online (Sandbox Code Playgroud)

结果分别为34.4和-0.05.但是考虑X和y变量的散点图:

plt.scatter(X_train, y_train)
Run Code Online (Sandbox Code Playgroud)

它肯定看起来不像负斜率线可以是这种分布的回归线.因此,我想知道我可能做错了什么导致了这个结果.

Jon*_*oop 6

这是一个非常有趣的案例研究!

看起来回归线实际上是正确的,你的眼睛(和你的情节)欺骗了你.

您生成的散点图如下所示:
分散图,alpha = 1

当然看起来像一个积极的斜坡,对吗?对?
好吧,不.这里有很多要点,不可能看到最多的点在哪里.可能情况下,大多数点会显示向下的斜率,但它们都在彼此的顶部,并且没有在彼此之上的"少数"其他点显示向上的斜率.

更好的情节:降低视觉重叠

为了测试这一点,我绘制了具有低得多的不透明度和较小标记尺寸的点(因此重叠量将减少:

plt.scatter(X_train, y_train, alpha=0.002, s=1)
plt.show()
Run Code Online (Sandbox Code Playgroud)

分散图较少重叠
在这里你可以看到,实际上大多数点都显示出向下的斜率(尽管人们也可能认为线性相关不是建模相关性的最佳方法).请记住,线性回归试图拟合最佳直线,这意味着它遵循大多数点,但如果那里只有少数异常值,则无法捕获不直的模式.

实际上线性相关系数也是负的:

df1[["T_degC", "Salnty"]].corr()
#          T_degC    Salnty
#T_degC  1.000000 -0.505266
#Salnty -0.505266  1.000000
Run Code Online (Sandbox Code Playgroud)

结论

简而言之:
1.您的回归线似乎是正确的
2.确保您正在查看正确的图 - 如果所有点都在彼此之上,则散点图可能不是最佳的.

编辑:视觉确认

还有一个情节:散点图和回归顶部: 散点图上有回归

这似乎是合理的(直线),不是吗?

也许用另外的方式更容易看到另一个情节:

import seaborn as sns
sns.jointplot(x='T_degC', y='Salnty', data=df1, kind='hex')
Run Code Online (Sandbox Code Playgroud)

hexbin jointplot

联合图通过着色图中具有更多点的部分来明确地显示重叠.这再次证实存在下降趋势,但有一个(相对较小的)其他点数与此趋势相反.希望有所帮助!