当 p > n 时,sklearn 如何进行线性回归?

Posted

技术标签:

【中文标题】当 p > n 时,sklearn 如何进行线性回归?【英文标题】:how does sklearn do Linear regression when p >n? 【发布时间】:2014-07-06 01:00:55 【问题描述】:

众所周知,当变量数 (p) 大于样本数 (n) 时,未定义最小二乘估计量。

在 sklearn 中,我收到以下值:

In [30]: lm = LinearRegression().fit(xx,y_train)

In [31]: lm.coef_
Out[31]: 
array([[ 0.20092363, -0.14378298, -0.33504391, ..., -0.40695124,
         0.08619906, -0.08108713]])

In [32]: xx.shape
Out[32]: (1097, 3419)

调用 [30] 应返回错误。在这种情况下,当 p>n like 时,sklearn 是如何工作的?

编辑: 似乎矩阵填充了一些值

if n > m:
        # need to extend b matrix as it will be filled with
        # a larger solution matrix
        if len(b1.shape) == 2:
            b2 = np.zeros((n, nrhs), dtype=gelss.dtype)
            b2[:m,:] = b1
        else:
            b2 = np.zeros(n, dtype=gelss.dtype)
            b2[:m] = b1
        b1 = b2

【问题讨论】:

【参考方案1】:

当线性系统欠定时,sklearn.linear_model.LinearRegression 找到最小的L2 范数解,即

argmin_w l2_norm(w) subject to Xw = y

通过将X 的伪逆应用于y,始终可以很好地定义和获得,即

w = np.linalg.pinv(X).dot(y)

LinearRegression使用的scipy.linalg.lstsq的具体实现使用了get_lapack_funcs(('gelss',), ...,它正是一个通过奇异值分解找到最小范数解的求解器(LAPACK提供)。

看看这个例子

import numpy as np
rng = np.random.RandomState(42)
X = rng.randn(5, 10)
y = rng.randn(5)

from sklearn.linear_model import LinearRegression
lr = LinearRegression(fit_intercept=False)
coef1 = lr.fit(X, y).coef_
coef2 = np.linalg.pinv(X).dot(y)

print(coef1)
print(coef2)

你会看到coef1 == coef2。 (注意fit_intercept=False是在sklearn估计器的构造函数中指定的,否则会在拟合模型之前减去每个特征的均值,产生不同的系数)

【讨论】:

这是否与使用岭回归获得的解决方案相同?这个方法是不是只有新版本的sklearn才实现?我很确定在某些版本中它会返回错误 不,岭回归增加了一个额外的 L2 惩罚,从而改变了目标函数和得到的解决方案。最小 L2 范数解只是欠定情况下解的仿射空间中所有解中的一个(明智的)选择。但是,如果您将岭回归解作为正则化参数的函数,并让该参数趋于0,您会找到这个最小范数解。 好的,那么所获得的解决方案应该更多地与作为 LARS 算法路径的最终结果获得的结果相同,这是有道理的,因为当 p>n 时,这是 LSE 的标准定义。 (那正确吗?) 。你知道这是否也在之前版本的 sklearn-scipy 中实现了吗? LARS-Lasso 在惩罚项变为0 时会收敛到所有解中的最小L1 范数解。至于pureLARS,你可能是对的,因为它不会丢弃变量,但我不能给你确凿的证据。 请注意,在实践中,当您遇到n < p 时,您最好使用sklearn.linear_model.Ridge 并以较小的代价代替最小范数解决方案。

以上是关于当 p > n 时,sklearn 如何进行线性回归?的主要内容,如果未能解决你的问题,请参考以下文章

如何在sklearn逻辑回归中设置样本权重?

使用sklearn进行高斯朴素贝叶斯分类的数据类型,如何清理数据[重复]

当设置 n_job=-1 并且 TF 在单个 GPU 上运行时,带有 TF 模型的 KerasClassifier 可以与 sklearn.cross_val_score 一起使用吗?

当预测变量不是二进制时,Sklearn 朴素贝叶斯伯努利分类器如何工作?

如何分析sklearn中tfidf矩阵的值?

对于 sklearn GridSearchCV,你如何保证每个折叠的训练集中都有类?