0

我計算係數是這樣的:多元迴歸沒有得到相同的係數爲sklearn

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 

,並得到這些結果:如果我創建sklearn.linear_model模型我得到這些

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

然而結果:

[ 118.45775015 64.56441108 -256.2.43324362 327.45075841] 

這隻發生在我使用

preprocessing.PolynomialFeatures(degree=2) 
poly.fit_transform(x) 

度大於1.當我使用原始數據時,兩種方法的係數都是相同的。有什麼可以解釋這一點?某處是否有截斷?

回答

2

只需檢查:您使用的是sklearn.linear_model的哪個型號? LinearRegression?來自該模塊的所有其他迴歸模型都會受到懲罰,可以解釋這種差異。

假設這是使用LinearRegression,你應該:

  • 確保你應該恆定值1數據陣列中具有柱和治療該列的beta爲線性模型的intercept_

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

假設你也照顧到了這一點,你應該記住,提取多項式特徵將顯着增加特徵的數量,並且如果你的樣本數量太小,經驗協方差矩陣將受到病態調節,並且調用np.inv將會非常不穩定。參考LinearRegression使用迭代最小二乘法解決方案,而不是涉及np.inv的封閉形式公式。

n_features >> n_samples您應該使用懲罰性線性迴歸模型,如sklearn.linear_model.Ridge而不是普通最小二乘。