【发布时间】:2017-02-07 02:11:58
【问题描述】:
我有一个相对较大的美国多个市场房屋销售数据集。对于每个市场,我想建立一个梯度提升回归模型来预测销售价格。我的大多数自变量(特征)都有缺失值,这对于 R 中的 gbm 来说应该没问题。
caret 中的gbm 算法要求您指定超参数的值(n.trees、shrinkage、interaction.depth、n.minobsinnode 等)。我想结合交叉验证进行网格搜索以选择最佳超参数集:
# -------- A function to drop variables that are more than 80% missing or have no variance
Drop_Useless_Vars <- function(datan) {
n = nrow(datan)
p = ncol(datan)
na = is.na(datan)
n_na = apply(X = na, MARGIN = 2, FUN = sum)
n_unique = apply(X = datan, MARGIN = 2, function(x) length(na.omit((unique(x)))))
return(as.data.frame(datan[, -which(n_na > 0.8*n | n_unique < 2)]))
}
# -------- load libraries
library(gbm)
library(caret)
# -------- prepare training scheme
control = trainControl(method = "cv", number = 5)
# -------- design the parameter tuning grid
grid = expand.grid(n.trees = 10000,
interaction.depth = seq(2, 10, 1),
n.minobsinnode = c(3, 4, 5),
shrinkage = c(0.1, 0.01, 0.001))
# -------- tune the parameters
tuner = train(log(saleprice) ~ ., data = Drop_Useless_Vars(df), method = "gbm", distribution = "gaussian",
trControl = control, verbose = FALSE, tuneGrid = grid, metric = "RMSE")
# -------- get the best combo
n_trees = tuner$bestTune$n.trees
interaction_depth = tuner$bestTune$interaction.depth
shrinkage = tuner$bestTune$shrinkage
n_minobsinnode = tuner$bestTune$n.minobsinnode
上面的代码工作正常,除了一些缺失值更频繁的市场。我收到如下所示的错误:
Error in checkForRemoteErrors(val) :
4 nodes produced errors; first error: variable 26: assessor_full_baths has only missing values.
assessor_full_baths 是我模型中的功能之一。所以发生的情况是,当算法对数据进行采样以进行交叉验证时,一个或多个折叠的变量完全缺失。
如何对caret 使用的抽样方案进行分层?也就是说,我怎样才能强制每个折叠对于缺失值具有相同的分布?另外,你们知道如何让gbm 函数忽略完全丢失的变量而不告诉它它们是哪些变量吗?
如果您能提供任何帮助,我将不胜感激。
【问题讨论】:
-
为什么超参数是“所谓的”?该算法如何仅在 1 折交叉验证中排除具有所有缺失值的特征?
-
我的一位老教授在谈论贝叶斯设置中的超参数时经常说“所谓的”,我想它已经卡在我的脑海里了。另外,我读了一篇论文,其中这些参数被称为正则化参数,这对我来说更有意义。
标签: r missing-data cross-validation gbm