Regression

平均回歸係數以建立模型是否存在任何理論問題?

  • July 1, 2018

我想建立一個回歸模型,它是多個 OLS 模型的平均值,每個模型都基於完整數據的一個子集。這背後的想法是基於這篇論文。我創建了 k 個折疊並構建了 k 個 OLS 模型,每個模型都基於沒有一個折疊的數據。然後我平均回歸係數以獲得最終模型。

這讓我覺得類似於隨機森林回歸,其中構建了多個回歸樹並對其進行平均。但是,平均 OLS 模型的性能似乎比簡單地在整個數據上構建一個 OLS 模型更差。我的問題是:為什麼平均多個 OLS 模型是錯誤的或不可取的,有理論上的原因嗎?我們可以期望平均多個 OLS 模型來減少過擬合嗎?下面是一個 R 示例。

#Load and prepare data
library(MASS)
data(Boston)
trn <- Boston[1:400,]
tst <- Boston[401:nrow(Boston),]

#Create function to build k averaging OLS model
lmave <- function(formula, data, k, ...){
 lmall <- lm(formula, data, ...)
 folds <- cut(seq(1, nrow(data)), breaks=k, labels=FALSE)
 for(i in 1:k){
   tstIdx <- which(folds==i, arr.ind = TRUE)
   tst <- data[tstIdx, ]
   trn <- data[-tstIdx, ]
   assign(paste0('lm', i), lm(formula, data = trn, ...))
 }

 coefs <- data.frame(lm1=numeric(length(lm1$coefficients)))
 for(i in 1:k){
   coefs[, paste0('lm', i)] <- get(paste0('lm', i))$coefficients
 }
 lmnames <- names(lmall$coefficients)
 lmall$coefficients <- rowMeans(coefs)
 names(lmall$coefficients) <- lmnames
 lmall$fitted.values <- predict(lmall, data)
 target <- trimws(gsub('~.*$', '', formula))
 lmall$residuals <- data[, target] - lmall$fitted.values

 return(lmall)
}

#Build OLS model on all trn data
olsfit <- lm(medv ~ ., data=trn)

#Build model averaging five OLS 
olsavefit <- lmave('medv ~ .', data=trn, k=5)

#Build random forest model
library(randomForest)
set.seed(10)
rffit <- randomForest(medv ~ ., data=trn)

#Get RMSE of predicted fits on tst
library(Metrics)
rmse(tst$medv, predict(olsfit, tst))
[1] 6.155792
rmse(tst$medv, predict(olsavefit, tst))
[1] 7.661 ##Performs worse than olsfit and rffit
rmse(tst$medv, predict(rffit, tst))
[1] 4.259403

鑑於 OLS 最小化了所有無偏線性估計器中殘差的 MSE(通過高斯馬爾可夫定理),並且無偏線性估計器的加權平均值(例如,來自您的每個folds) 本身是一個無偏的線性估計器,它必須是應用於整個數據集的 OLS 將優於加權平均線性回歸,除非偶然,兩者給出相同的結果。

至於過擬合——線性模型不像梯度提昇機器那樣容易過擬合。線性的執行就是為了這一點。如果您有非常少量的異常值將您的 OLS 回歸線拉離應有的位置,您的方法可能會稍微 - 只是稍微 - 減輕損害,但在處理該問題的情況下有更好的方法極少數的異常值,例如穩健的線性回歸,或簡單地繪製數據,識別,然後刪除異常值(假設它們確實不代表您有興趣估計其參數的數據生成過程。)

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

comments powered by Disqus