R lm与Python sklearn linear_model

Joh*_*ohn 3 python regression r linear-regression scikit-learn

当我研究Python SKlearn时,我遇到的第一个例子是广义线性模型.

第一个例子的代码:

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])
Run Code Online (Sandbox Code Playgroud)

在这里我想[[0, 0], [1, 1], [2,2]]代表含有data.frame x1 = c(0,1,2)x2 = c(0,1,2)y = c(0,1,2)也.

随即,我开始认为array([ 0.5, 0.5])是对coeffs 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  
Run Code Online (Sandbox Code Playgroud)

显然x1并且x2完全线性相关,因此OLS将失败.为什么SKlearn仍然有效并给出了这个结果?我是以错误的方式得到了sklearn吗?谢谢.

ogr*_*sel 6

两种解决方案都是正确的(假设NA表现得像零).哪种解决方案更受青睐取决于OLS估算器使用的数值求解器.

sklearn.linear_model.LinearRegression基于scipy.linalg.lstsq它依次调用gelsd此处描述的LAPACK 例程:

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

特别是它说当问题排名不足时,它寻求最小范数最小二乘解.

如果你想支持另一个解决方案,你可以使用一个坐标下降求解器,在Lasso类中实现一点点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])
Run Code Online (Sandbox Code Playgroud)