【问题标题】:Bug in sklearn.linear_model LinearRegression?sklearn.linear_model 线性回归中的错误?
【发布时间】:2015-07-07 01:09:39
【问题描述】:

我正在关注this ipython 笔记本。现在有点过时了,一些 API 调用已经改变。但是,数学应该仍然有效!

我的问题:我想知道为什么 sklearn LinearRegression 得出的结果是虚假的,而 statsmodel OLS 的结果与我的指南相同。

sklearn LinearRegression 系数是 -3.05335819e+09、3.05335819e+09、9.31299461e-02、-3.29341722e+00

虽然statsmodel OLS 结果是: -1.17513710e-05、-1.17509020e-05、9.23027375e-02、-3.27115207e+00

不幸的是,要完全遵循示例,必须从 R 导出“波士顿”数据集。

我用代码创建了一个gist:

import pandas as pd
import numpy as np
import scipy as sp
import statsmodels.api as sm
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
%matplotlib inline
# Data from R ISLR package - write.csv(Boston, "Boston.csv", col.names = FALSE)
boston_df = pd.read_csv("../../r/Boston.csv")
# fitting medv ~ lstat + I(lstat^2)
boston_df["lstat^2"] = boston_df["lstat"] ** 2
# fitting medv ~ poly(lstat,4). We already have lstat^2 and lstat from previous
boston_df["lstat^4"] = np.power(boston_df["lstat"], 4)
boston_df["lstat^3"] = np.power(boston_df["lstat"], 4)
X = boston_df[["lstat^4", "lstat^3", "lstat^2", "lstat"]]
y = boston_df["medv"]
reg7 = LinearRegression()
reg7.fit(X, y)
(reg7.intercept_, reg7.coef_)

导致:

array([ -3.05335819e+09, 3.05335819e+09, 9.31299461e-02, -3.29341722e+00])

但是,如果我使用 statsmodel OLS 计算线性回归:

# X = boston_df[["lstat^4", "lstat^3", "lstat^2", "lstat"]]
X = sm.add_constant(X)
# X = boston_df[[1., "lstat^4", "lstat^3", "lstat^2", "lstat"]]
ols = sm.OLS(y,X).fit()
# ols.summary()
ols.params.values[1:]

我得到以下结果:

array([ -1.17513710e-05,  -1.17509020e-05,   9.23027375e-02,
    -3.27115207e+00])

这是预期的。

这削弱了我对 sklearn 的信心。我在 OSX 上运行它,在 ipython 3.0.0、statsmodels (0.6.1)、scikit-learn (0.15.2)、numpy (1.9.2)

谢谢

【问题讨论】:

    标签: scikit-learn statsmodels


    【解决方案1】:
    boston_df["lstat^4"] = np.power(boston_df["lstat"], 4)
    boston_df["lstat^3"] = np.power(boston_df["lstat"], 4)
    

    在这里,为什么两者都是四阶多项式?这是一个错字还是意图?因为从结果来看,3 阶和 4 阶项的系数具有完全相同的大小,只是符号不同。这通常是由于多重共线性问题,这两个项几乎完全正相关。在这种情况下,sm.OLS 和 sklearn.linear_model.LinearRegression() 都不正确。它需要标准的正则化处理。

    【讨论】:

    • 感谢您发现我复制的错误。通过此更改,两个 API 的结果相同。
    猜你喜欢
    • 2021-11-06
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 2016-08-31
    • 2017-10-13
    • 2020-10-25
    • 2019-11-19
    • 1970-01-01
    相关资源
    最近更新 更多