Multiple-Regression
為什麼 statsmodels.api.OLS 會過度報告 r 平方值?
我
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 在大多數應用程序中是荒謬的。 在以下主題中進一步討論了此問題和相關問題: