当我研究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])
在这里,我假设[[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])
是x1
和x2
的娇夫.
但是,这些估计值是否存在标准误差?t检验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
显然,x1
和x2
完全线性依赖,因此OLS将失败。为什么SKlearn仍然有效并给出这个结果?我是否以错误的方式学习了 sklearn?谢谢。
两种解决方案都是正确的(假设 NA 的行为类似于零(。哪种解决方案更受欢迎取决于 OLS 估计器使用的数值求解器。
sklearn.linear_model.LinearRegression
基于 scipy.linalg.lstsq
,而又调用 LAPACK gelsd
例程,如下所述:
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])