Ich möchte ein Regressionsmodell erstellen, bei dem es sich um einen Durchschnitt mehrerer OLS-Modelle handelt, die jeweils auf einer Teilmenge der vollständigen Daten basieren. Die Idee dahinter basiert auf diesem Papier . Ich erstelle k Falten und erstelle k OLS-Modelle, die jeweils auf Daten ohne eine der Falten basieren. Ich mittle dann die Regressionskoeffizienten, um das endgültige Modell zu erhalten.
Dies erscheint mir ähnlich wie eine zufällige Waldregression, bei der mehrere Regressionsbäume erstellt und gemittelt werden. Die Leistung des gemittelten OLS-Modells scheint jedoch schlechter zu sein, als nur ein einziges OLS-Modell für die gesamten Daten zu erstellen. Meine Frage ist: Gibt es einen theoretischen Grund, warum die Mittelung mehrerer OLS-Modelle falsch oder unerwünscht ist? Können wir damit rechnen, dass mehrere OLS-Modelle gemittelt werden, um die Überanpassung zu verringern? Unten ist ein R-Beispiel.
#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