sklearn.linear_model LinearRegression 中的错误?
Bug in sklearn.linear_model LinearRegression?
我正在关注 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 中导出 "Boston" 数据集。
我用代码创建了一个 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)
谢谢
boston_df["lstat^4"] = np.power(boston_df["lstat"], 4)
boston_df["lstat^3"] = np.power(boston_df["lstat"], 4)
这里,为什么都是4阶多项式?这是错字还是故意的?因为从结果来看,3 次和 4 次项的系数大小完全相同,只是符号不同。这通常是由于这两项具有几乎完全正相关的多重共线性问题。在这种情况下,sm.OLS
和 sklearn.linear_model.LinearRegression()
都不正确。它需要标准的正则化处理。
我正在关注 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 中导出 "Boston" 数据集。
我用代码创建了一个 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)
谢谢
boston_df["lstat^4"] = np.power(boston_df["lstat"], 4)
boston_df["lstat^3"] = np.power(boston_df["lstat"], 4)
这里,为什么都是4阶多项式?这是错字还是故意的?因为从结果来看,3 次和 4 次项的系数大小完全相同,只是符号不同。这通常是由于这两项具有几乎完全正相关的多重共线性问题。在这种情况下,sm.OLS
和 sklearn.linear_model.LinearRegression()
都不正确。它需要标准的正则化处理。