각각 전체 데이터의 하위 집합을 기반으로 평균 여러 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