R语言模型过拟合处理:训练集R2高,测试集R2低
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低是模型过拟合的典型表现,可以通过交叉验证、正则化等方法来解决。选择合适的参数和方法,可以有效提高模型的泛化能力。
原文地址: https://www.cveoy.top/t/topic/lRl9 著作权归作者所有。请勿转载和采集!