Regression

statsmodel OLS 和 scikit 線性回歸的區別

  • April 16, 2015

我有一個關於來自不同庫的兩種不同方法的問題,它們似乎在做同樣的工作。我正在嘗試製作線性回歸模型。

這是我在 OLS 中使用 statsmodel 庫的代碼:

X_train, X_test, y_train, y_test = cross_validation.train_test_split(x, y, test_size=0.3, random_state=1)

x_train = sm.add_constant(X_train)
model = sm.OLS(y_train, x_train)
results = model.fit()

print "GFT + Wiki / GT R-squared", results.rsquared

這打印出GFT + Wiki / GT R 平方 0.981434611923

第二個是scikit learn library 線性模型方法:

model = LinearRegression()
model.fit(X_train, y_train)

predictions = model.predict(X_test)

print 'GFT + Wiki / GT R-squared: %.4f' % model.score(X_test, y_test)

這打印出GFT + Wiki / GT R 平方:0.8543

所以我的問題是兩種方法都會打印我們的 R^2 結果,但一種是打印出 0.98,另一種是 0.85。

據我了解,OLS 適用於訓練數據集。所以我的問題,

  • 有沒有一種方法可以使用 OLS 處理測試數據集?
  • 訓練數據集分數是否給我們任何意義(在 OLS 中我們沒有使用測試數據集)?根據我過去的知識,我們必須使用測試數據。
  • OLS和scikit線性回歸有什麼區別。我們使用哪一個來計算模型的分數?

謝謝你的幫助。

首先在使用方面。您可以通過與 scikit-learn 中非常相似的方式在 statsmodels 中獲得預測,不同之處在於我們使用返回的結果實例fit

predictions = results.predict(X_test)

給定預測,我們可以計算基於預測誤差的統計量

prediction_error = y_test - predictions

有一個單獨的函數列表來計算預測統計的優劣,但它沒有集成到模型中,也不包括 R 平方。(我從來沒有聽說過 R 平方用於樣本外數據。)計算這些需要用戶做更多的工作,並且 statsmodels 沒有相同的統計數據集,尤其是對於分類或具有二元響應變量的模型。

對於您的另外兩點:

線性回歸的基本形式在 statsmodels 和 scikit-learn 中是相同的。但是,實現方式不同,可能會在邊緣情況下產生不同的結果,並且 scikit learn 通常對更大的模型有更多的支持。例如,statsmodels 目前在很少的部分使用稀疏矩陣。

最重要的區別在於周圍的基礎設施和直接支持的用例。

Statsmodels 很大程度上遵循傳統模型,我們想知道給定模型與數據的擬合程度,以及哪些變量“解釋”或影響結果,或者影響的大小。Scikit-learn 遵循機器學習傳統,主要支持的任務是選擇“最佳”模型進行預測。

因此,statsmodels 支持特徵的重點是分析訓練數據,包括假設檢驗和擬合優度度量,而 scikit-learn 支持基礎設施的重點是模型選擇樣本預測,因此對“測試數據”進行交叉驗證。

這就指出了區別,在用法上也有相當多的重疊。statsmodels 還進行預測,並在時間序列上下文中進行額外預測。但是,當我們想要對 statsmodels 中的預測進行交叉驗證時,目前通常更容易將 scikit-learn 的交叉驗證設置與 statsmodels 的估計模型一起重用。

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

comments powered by Disqus