Multiple-Regression

為什麼 statsmodels.api.OLS 會過度報告 r 平方值?

  • March 14, 2017

statsmodels.api.OLS用來擬合具有 4 個輸入特徵的線性回歸模型。

數據的形狀是:

X_train.shape, y_train.shape  

Out[]: ((350, 4), (350,))

然後我擬合模型並以 3 種不同的方式計算 r 平方值:

import statsmodels.api as sm
import sklearn

ols = sm.OLS(y_train, X_train).fit()

y_pred = ols.predict(X_train)
res = y_train - y_pred

ss_tot = np.sum( (y_train - y_train.mean())**2 )
ss_res = np.sum( (y_train - y_pred)**2 )

(1 - ss_res/ss_tot), sklearn.metrics.r2_score(y_train, y_pred), ols.rsquared

Out[]: (0.91923900248372292, 0.91923900248372292, 0.99795455683297096)

手動計算的 r 平方值與來自的值sklearn.metrics.r2_score完全匹配。

然而,這個ols.rsquared價值似乎被高估了。

為什麼會這樣?如何statsmodels計算 rsquared 值?

這在技術上不是中的錯誤statsmodels,而是因為默認情況下statsmodels.OLS不會將截距/常數項添加到回歸方程的右側——您必須顯式添加它。相反,(以及絕大多數其他回歸程序)默認添加常量/截距項,除非它被明確禁止。sklearn

要將截距項添加到statsmodels,請使用以下內容:

ols = sm.OLS(y_train, sm.add_constant(X_train)).fit()

省略截距的原因改變了這是一個不同的定義沒有截距時使用。

我們可以查看平時作為兩個模型 A 和 B 之間誤差平方和的比例減少。

換句話說,我們比較了模型的性能,包括作為預測器與僅預測所有觀察值的恆定值(樣本均值)的模型。 當攔截從模型 A 中省略以形成一個新模型 - 將其稱為模型 C - 將其與簡化模型 B 進行比較不再有意義(B 嵌套在 A 中,但未嵌套在 C 中)。所以我們改為調整計算因此可以將其視為 C 與新模型 D 之間的比較

換句話說,我們將僅斜率模型與僅對所有觀測值進行恆定預測為 0 的模型進行比較。這常常自相矛盾地導致甚至比以前更高,但這只是因為簡化的參考模型 D 在大多數應用程序中是荒謬的。 在以下主題中進一步討論了此問題和相關問題:

去除統計上顯著的截距項增加在線性模型中

當在線性回歸中強制截距為 0 是可接受/可取的

什麼時候可以刪除線性回歸模型中的截距?

引用自:https://stats.stackexchange.com/questions/267325

comments powered by Disqus