Quiero construir un modelo de regresión que sea un promedio de múltiples modelos OLS, cada uno basado en un subconjunto de datos completos. La idea detrás de esto se basa en este documento . Creo k pliegues y construyo k modelos OLS, cada uno con datos sin uno de los pliegues. Luego promedio los coeficientes de regresión para obtener el modelo final.
Esto me parece similar a algo como la regresión forestal aleatoria, en la que se construyen y promedian árboles de regresión múltiple. Sin embargo, el rendimiento del modelo OLS promedio parece peor que simplemente construir un modelo OLS en todos los datos. Mi pregunta es: ¿hay alguna razón teórica por la que promediar múltiples modelos OLS sea incorrecto o indeseable? ¿Podemos esperar promediar múltiples modelos OLS para reducir el sobreajuste? A continuación se muestra un ejemplo de 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