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

标签 python scikit-learn linear-regression

大家好,我正在对来自 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)

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

lm.intercept_
lm.coef_

结果分别为 34.4 和 -0.05。但接下来考虑 X 和 y 变量的散点图:

plt.scatter(X_train, y_train)

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

最佳答案

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

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

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

当然看起来是正斜率,对吧?对吧?
好吧,不。这里的点太多了,不可能看到点最多的地方。大多数点可能会显示出向下的斜率,但它们都在彼此之上,而其他“少数”不在彼此之上的点则显示出向上的斜率。

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

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

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

Scatter plot with less overlap
在这里您可以看到,实际上大多数点都显示出向下的斜率(尽管有人可能会争辩说线性相关并不是相关性建模的最佳方式)。请记住,线性回归试图拟合最佳的直线 线,这意味着它遵循大多数点,但如果那里只有少数异常值,将无法捕获不直的更困难的模式.

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

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

结论

简而言之:
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 通过对图形中有很多点的部分进行更强烈的着色来明确地可视化重叠。这再次证实存在下降趋势,但有(相对较少的)其他点与该趋势相反。 希望对您有所帮助!

关于python - python中的线性回归严重错误,回归线完全错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53985153/

相关文章:

python - web2py SQLFORM.grid 参数定义

machine-learning - 机器学习中的大量特征不好(回归)?

python - Scikit-Learn LinearRegression 在非常简单的数据集上表现不佳,

gnuplot - 如何使用 Gnuplot 4.6 在我的图表中追踪趋势线?

python - 对 Python 的 cURL 请求(使用 multipart/form-data)

python - 如何在 App Engine 中使用 Google Acounts API?

python - 根据另一列记录一列的值 : Python & Pandas

python - 获取转换后逻辑回归最重要特征的名称

python - 在 scikit-learn 中实现词袋

python - 将列表转换为 numpy 数组