我想构建一个回归模型,该模型是多个OLS模型的平均值,每个模型都基于完整数据的子集。其背后的思想是基于本文的。我创建k个折叠并建立k个OLS模型,每个模型都基于没有折叠之一的数据。然后,我平均回归系数以获得最终模型。
这让我印象深刻,类似于随机森林回归,其中建立了多个回归树并将其平均。但是,平均OLS模型的性能似乎比仅在整个数据上构建一个OLS模型差。我的问题是:为多个OLS模型求平均有理论上的错误或不合需要的理由吗?我们可以期望平均多个OLS模型来减少过度拟合吗?下面是一个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
2
您可以尝试使用中值系数值,而不是平均系数值。我已经看到这种技术有时可以产生更好的结果。
—
James Phillips
它可能不会提高性能或减少过度拟合,但它确实具有其他有用的应用程序。此小伙子会为他的流式时间序列数据选择正确的趋势youtube.com/watch?v=0zpg9ODE6Ww&index=64&list=WL
—
乔什
另请参阅此帖子,stats.stackexchange.com
—
q /