Je veux construire un modèle de régression qui est une moyenne de plusieurs modèles OLS, chacun basé sur un sous-ensemble des données complètes. L'idée derrière cela est basée sur cet article . Je crée k plis et je crée k modèles OLS, chacun sur des données sans l'un des plis. Je fais ensuite la moyenne des coefficients de régression pour obtenir le modèle final.
Cela me semble similaire à quelque chose comme la régression aléatoire des forêts, dans laquelle plusieurs arbres de régression sont construits et moyennés. Cependant, les performances du modèle OLS moyenné semblent pires que de simplement construire un modèle OLS sur l'ensemble des données. Ma question est: existe-t-il une raison théorique pour laquelle la moyenne de plusieurs modèles OLS est erronée ou indésirable? Pouvons-nous nous attendre à ce que la moyenne de plusieurs modèles OLS réduise le sur-ajustement? Voici un exemple 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