R语言模型过拟合处理:训练集R2高,测试集R2低

在使用R语言构建GBM模型时,经常遇到训练集R2很高,测试集R2很低的情况,这表明模型可能过拟合了训练集。过拟合意味着模型学习到了训练集中的噪声,导致其对测试集的预测效果不好。

示例代码:

fit <- 
gbm.step(data = train,
           gbm.x = 2:24, 
           gbm.y = 'ARG', 
           family = 'gaussian',
           tree.complexity = 3, 
           learning.rate = .01,
           bag.fraction = .9, 
           n.folds = 10,
           plot.main = F)


residuals <- train$ARG - predict(fit, newdata = train)

RSS <- sum(residuals^2)
TSS <- sum((input$ARG - mean(input$ARG))^2)
(paste('R2 =', round(1 - (RSS / TSS), 4)))


residuals <- test$ARG - predict(fit, newdata = test)

RSS <- sum(residuals^2)
TSS <- sum((test$ARG - mean(test$ARG))^2)
(paste('R2 =', round(1 - (RSS / TSS), 4)))

解决方案:

可以尝试使用交叉验证来调整模型参数,或者使用正则化方法来减少模型复杂度。

交叉验证调整模型参数:

fit <- gbm(data = train, 
           distribution = 'gaussian',
           n.trees = 10000,
           interaction.depth = 3,
           shrinkage = 0.01,
           bag.fraction = 0.9,
           cv.folds = 10,
           verbose = TRUE)

best.iter <- gbm.perf(fit, method = 'cv')

fit2 <- gbm(data = train, 
            distribution = 'gaussian',
            n.trees = best.iter,
            interaction.depth = 3,
            shrinkage = 0.01,
            bag.fraction = 0.9,
            verbose = TRUE)

residuals <- train$ARG - predict(fit2, newdata = train)

RSS <- sum(residuals^2)
TSS <- sum((train$ARG - mean(train$ARG))^2)
(paste('Train R2 =', round(1 - (RSS / TSS), 4)))

residuals <- test$ARG - predict(fit2, newdata = test)

RSS <- sum(residuals^2)
TSS <- sum((test$ARG - mean(test$ARG))^2)
(paste('Test R2 =', round(1 - (RSS / TSS), 4)))

上述代码中,使用了10折交叉验证来选择最佳迭代次数best.iter,然后使用该迭代次数构建新的模型fit2。最后计算了train和test的R2值。可以通过调整参数来进一步优化模型的表现。

其他方法:

  • 正则化: 使用L1或L2正则化来惩罚模型的复杂度。
  • 特征选择: 选择与目标变量相关性更高的特征,减少模型的复杂度。
  • 数据增强: 增加训练数据量,减少模型对训练集的过度依赖。

总结:

训练集R2高,测试集R2低是模型过拟合的典型表现,可以通过交叉验证、正则化等方法来解决。选择合适的参数和方法,可以有效提高模型的泛化能力。

R语言模型过拟合处理:训练集R2高,测试集R2低

原文地址: https://www.cveoy.top/t/topic/lRl9 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录