多元回归与sklearn的系数不相同

时间:2016-02-25 01:04:04

标签: python scikit-learn regression linear-regression feature-selection

我正在计算这样的系数:

def estimate_multivariate(data, target):
    x = np.array(data)
    y = np.array(target)
    inv = np.linalg.inv(np.dot(x.T,x))
    beta = np.dot(np.dot(inv, x.T), y)
    return beta

并获得以下结果:

[[ 103.56793536] [  63.93186848][-272.06215991][ 500.43324361] [ 327.45075839]]

但是,如果我使用sklearn.linear_model创建模型,我会得到以下结果:

[ 118.45775015   64.56441108 -256.20123986  500.43324362  327.45075841]

只有在我使用

时才会发生这种情况
preprocessing.PolynomialFeatures(degree=2)
poly.fit_transform(x)
度数大于1的

。当我使用原始数据时,两种方法的系数是相同的。有什么可以解释这个?某处有截断吗?

1 个答案:

答案 0 :(得分:2)

只是为了检查一下:sklearn.linear_model使用了哪个型号? LinearRegression?来自该模块的所有其他回归模型都会受到惩罚,这可以解释这种差异。

假设这是使用LinearRegression,您应该:

  • 确保您的数据数组中的列应具有常量值1,并将该列的测试版视为线性模型的intercept_

  • 或禁用线性模型的截距拟合:LinearRegression(fit_intercept=False).fit(data, target).coef_

假设你也照顾到了这一点,你应该记住,提取多项式特征将显着增加特征的数量,如果你的样本数量太小,经验协方差矩阵将受到限制并调用{{1会非常不稳定。供参考np.inv使用迭代最小二乘解算器,而不是涉及LinearRegression的封闭形式公式。

np.inv使用惩罚线性回归模型时,例如n_features >> n_samples,而不是普通的最小二乘法。