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

python中的线性回归出现了严重错误,回归线完全错误,python,scikit-learn,linear-regression,Python,Scikit Learn,Linear Regression,大家好,我在kaggle(,瓶子.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() fr

大家好,我在kaggle(,瓶子.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)
当我查看截距和系数时,问题出现了:

lm.intercept_
lm.coef_
结果分别为34.4和-0.05。然后考虑X和Y变量的散点图:

plt.scatter(X_train, y_train)

它看起来绝对不像一条负斜率的线,可以是这个分布的回归线。因此,我想知道我做错了什么导致了这个结果

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

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

您正在生成的散点图如下所示:

看起来确实是正斜率,对吗?对吗?
不,这里有太多的点,不可能看到最多的点在哪里。很可能大多数点会显示一个向下的坡度,但它们都在彼此的顶部,而其他一些不在彼此顶部的点会显示一个向上的坡度

更好的绘图:降低视觉重叠 为了测试这一点,我以更低的不透明度和更小的标记大小绘制了点(因此重叠量将减少:

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

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

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

df1[["T_degC", "Salnty"]].corr()
#          T_degC    Salnty
#T_degC  1.000000 -0.505266
#Salnty -0.505266  1.000000
结论 简而言之:
1.您的回归线似乎是正确的
2.确保您看到的是正确的图-如果所有点都在彼此的顶部,散点图可能不是最佳的

编辑:视觉确认 还有一个图:上面有回归的散点图:

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

也许另一个情节更容易看,有这么多的点:

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

jointplot通过对图中有许多点的部分着色来明确显示重叠。这再次证实了存在下降趋势,但有(相对较少)数量的其他点与该趋势相反。
希望这能有所帮助!

我对你的答案的全面性感到惊讶。我现在完全理解了。非常感谢。