Her biri tam verinin bir alt kümesine dayanan, birden çok OLS modelinin ortalaması olan bir regresyon modeli oluşturmak istiyorum. Bunun arkasındaki fikir bu makaleye dayanmaktadır . K kıvrımları oluşturuyorum ve her biri kıvrımlardan biri olmayan verilerde k OLS modelleri oluşturuyorum. Daha sonra son modeli elde etmek için regresyon katsayılarını ortalarım.
Bu beni çoklu regresyon ağaçlarının yapıldığı ve ortalaması alındığı rastgele orman regresyonu gibi bir şeye benziyor. Bununla birlikte, ortalama OLS modelinin performansı, tüm veriler üzerinde sadece bir OLS modeli oluşturmaktan daha kötü görünmektedir. Sorum şu: Birden fazla OLS modelinin ortalamasının yanlış veya istenmeyen olmasının teorik bir nedeni var mı? Birden fazla OLS modelinin ortalamasının aşırı sığmayı azaltmasını bekleyebilir miyiz? Aşağıda bir R örneği verilmiştir.
#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