Tôi muốn xây dựng một mô hình hồi quy trung bình của nhiều mô hình OLS, mỗi mô hình dựa trên một tập hợp con của dữ liệu đầy đủ. Ý tưởng đằng sau điều này được dựa trên bài báo này . Tôi tạo k nếp gấp và xây dựng k mô hình OLS, mỗi mô hình trên dữ liệu không có một nếp gấp. Sau đó tôi lấy trung bình các hệ số hồi quy để có được mô hình cuối cùng.
Điều này gây ấn tượng với tôi giống như một cái gì đó giống như hồi quy rừng ngẫu nhiên, trong đó nhiều cây hồi quy được xây dựng và tính trung bình. Tuy nhiên, hiệu suất của mô hình OLS trung bình có vẻ tệ hơn là chỉ xây dựng một mô hình OLS trên toàn bộ dữ liệu. Câu hỏi của tôi là: có một lý do lý thuyết tại sao trung bình nhiều mô hình OLS là sai hoặc không mong muốn? Chúng ta có thể mong đợi trung bình nhiều mô hình OLS để giảm quá mức không? Dưới đây là một ví dụ 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