【问题标题】:Scikit-Learn LinearReression Doesn't preform well, on a very simple data set,Scikit-Learn LinearRegression 在非常简单的数据集上表现不佳,
【发布时间】:2020-01-06 20:05:28
【问题描述】:

当我尝试使用 scikit-learn LinearRegression 时,模型表现不佳,但是,当我尝试 scipy 线性回归时,它运行良好, 数据集很简单,是不是逻辑有问题还是代码有问题?

我尝试了多个自生成的线性数据,所有这些数据都包含 1 列特征和 1 列标签。

导入库

import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from scipy import stats

生成数据

X=[]
Y=[]
for i in range (100):
    X.append(2*i+3)
    Y.append(1.8*X[i]+32)
X=np.array(X,dtype=float)
Y=np.array(Y,dtype=float)

创建模型并拆分为测试和训练

reg = LinearRegression()
X_train, Y_train, X_test, Y_test = train_test_split(X, Y, test_size=0.5, random_state=0)

重塑测试和训练,因为它是单列特征

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

拟合训练数据并对其评分

reg.fit(X_train,Y_train)
reg.score(X_test,Y_test)

我得到的分数因数据集大小而异,但从来都不是很好,大多是负数,

但是当我使用 scipy 模型时

slope, intercept, r_value, p_value, std_err = stats.linregress(X, Y)

完美运行,总能找到斜率 1.8 和截距 32

【问题讨论】:

  • 当您使用stats.linregress 时,您将使用整个数据集。为什么不为您的 sklearn 模型使用相同的 entire 数据集?
  • 即使有 50% 的数据,我得到斜率=1.8 和截距=31.99
  • @Mr_U4913 我在发布带有多个数据集的问题或完全用于训练之前做了同样的事情,结果是一样的,
  • 我的问题被 jjurado answer 解决了

标签: python machine-learning scikit-learn linear-regression


【解决方案1】:

train_test_split 返回按您放置参数的相同顺序拆分的数据,因此首先返回 X,然后返回 Y。但是您混合了 X 和 Y。

如果您这样做,您的问题将得到解决:

X_train, X_test, Y_train, Y_test = train_test_split(X,Y,test_size=0.5,random_state=0)

Scipy 之所以有效,是因为您使用的是整个数据集。

【讨论】:

    猜你喜欢
    • 2021-12-29
    • 2013-07-01
    • 2020-02-22
    • 2013-07-07
    • 1970-01-01
    • 2016-02-11
    • 2018-04-28
    • 1970-01-01
    • 2020-09-30
    相关资源
    最近更新 更多