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

2024-10-02 20:32:54 发布

您现在位置:Python中文网/ 问答频道 /正文

大家好,我在kaggle(https://www.kaggle.com/sohier/calcofi)的数据集上练习线性回归,瓶子.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)

当我查看截距和系数时,问题就出现了:

^{pr2}$

结果分别是34.4和-0.05。然后考虑X和y变量的散点图:

plt.scatter(X_train, y_train)

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


Tags: csvfromtestimportdfmatplotlibastrain
1条回答
网友
1楼 · 发布于 2024-10-02 20:32:54

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

似乎回归线事实上是正确的你的眼睛(和你的情节)正在欺骗你。在

您生成的散点图如下:
Scatter plot with alpha=1

看起来是个正斜率,对吧?对吗?
好吧,不。这里有太多的点,以至于不可能看到大多数点在哪里。大多数点都是向下倾斜的,但它们都在彼此的顶部,另外一些不在彼此顶部的点显示出向上的坡度。在

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

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

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

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

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

^{pr2}$

结论

简而言之:
1回归线似乎是正确的
2确保你看的是正确的图-如果所有的点都在另一个上面,散点图可能不是最佳的。在

编辑:视觉确认

还有一个图:上面有回归图的散点图: scatter plot with regression on top of it

这似乎合理(对于直线),不是吗?在

也许另一个情节会更容易看,因为有这么多要点:

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

hexbin jointplot

jointplot通过对图中有多个点的部分着色来显式地显示重叠。这再次证实了一个下降的趋势,但是有一些(相对较少的)其他点与这个趋势相反。 希望有帮助!在

相关问题 更多 >