2016-10-11 132 views
2

当我学习Python SKlearn时,遇到的第一个示例是Generalized Linear ModelsR lm与Python sklearn linear_model

其第一实施例的代码:

from sklearn import linear_model 
reg = linear_model.LinearRegression() 
reg.fit([[0, 0], [1, 1], [2,2]], [0, 1,2]) 
reg.fit 
reg.coef_ 
array([ 0.5, 0.5]) 

在这里,我假定[[0, 0], [1, 1], [2,2]]表示含有x1 = c(0,1,2)x2 = c(0,1,2)y = c(0,1,2)以及一个data.frame。

立刻,我开始认为array([ 0.5, 0.5])x1x2的系数。

但是,这些估计是否存在标准误差?如何测试p值,R2和其他数字?

然后我尝试做同样的事情在R.

X = data.frame(x1 = c(0,1,2),x2 = c(0,1,2),y = c(0,1,2)) 
lm(data=X, y~x1+x2) 
Call: 
lm(formula = y ~ x1 + x2, data = X) 

#Coefficients: 
#(Intercept)   x1   x2 
# 1.282e-16 1.000e+00   NA 

显然x1x2是完全线性相关,因此OLS将失败。为什么SKlearn仍能正常工作并给出结果?我是否以一种错误的方式变得滑稽?谢谢。

+3

也许http://stats.stackexchange.com /问题/ 116825 /异输出换-R-LM-和蟒-statsmodel醇类换线性回归 – hrbrmstr

回答

6

两种解决方案都是正确的(假设NA表现为零)。有利于哪种解决方案取决于OLS估算器使用的数值解算器。

sklearn.linear_model.LinearRegression基于scipy.linalg.lstsq进而调用在此所说明的LAPACK gelsd程序:

http://www.netlib.org/lapack/lug/node27.html

特别是它说的是,当问题是秩亏它试图最小范数最小二乘解。

如果你想有利于其他的解决方案,你可以使用一个坐标下降解算器L1罚一点点在次套索类实现:

>>> from sklearn.linear_model import Lasso 
>>> reg = Lasso(alpha=1e-8) 
>>> reg.fit([[0, 0], [1, 1], [2, 2]], [0, 1, 2]) 

Lasso(alpha=1e-08, copy_X=True, fit_intercept=True, max_iter=1000, 
    normalize=False, positive=False, precompute=False, random_state=None, 
    selection='cyclic', tol=0.0001, warm_start=False) 
>>> reg.coef_ 
array([ 9.99999985e-01, 3.97204719e-17])