平均回归系数以建立模型是否存在任何理论问题?

机器算法验证 回归 最小二乘 集成学习
2022-02-15 12:34:38

我想建立一个回归模型,它是多个 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个回答

鉴于 OLS 最小化了所有无偏线性估计器中残差的 MSE(通过高斯马尔可夫定理),并且无偏线性估计器的加权平均值(例如,来自您的每个kfolds) 本身是一个无偏的线性估计器,它必须是应用于整个数据集的 OLS 将优于加权平均k线性回归,除非偶然,两者给出相同的结果。

至于过拟合——线性模型不像梯度提升机器那样容易过拟合。线性的执行就是为了这一点。如果您有非常少量的异常值将您的 OLS 回归线拉离应有的位置,您的方法可能会稍微 - 只是稍微 - 减轻损害,但在处理该问题的情况下有更好的方法极少数的异常值,例如稳健的线性回归,或简单地绘制数据,识别,然后删除异常值(假设它们确实不代表您有兴趣估计其参数的数据生成过程。)

运行引导程序怎么样?使用无限制随机抽样(带放回抽样)以 100% 的抽样率创建 100-1000 个重复样本。通过复制运行模型并获得每个回归系数的中值。或者试试平均数。还要看一下每个系数的分布,看看符号是否发生变化以及累积分布值是多少。