在交叉验证随机森林时,插入符如何处理sampsize参数?

时间:2016-11-15 19:36:13

标签: r random-forest r-caret cross-validation

我正在研究一个高度不平衡的两类分类问题,其中大部分记录对应于多数类。我正在研究的一种技术是随机森林,其中每个单独树的引导样本是通过对大多数类进行下采样来创建的。 randomForest包为此提供了一个简单的实现,例如:

library(caret)
# Generate random train/test data
train <- twoClassSim(500, intercept = -13)
test <- twoClassSim(500, intercept = -13)

library(randomForest)
# Calculate the size of the minority class
nmin <- min(table(train$Class))
# Fit randomForest
fit <- randomForest(Class ~ ., data = train, ntree = 50, replace=T,
                    strata = train$Class, sampsize = c(nmin,nmin))

在上面的代码中,参数 strata sampsize 用于告诉randomForest对每个bootstrap样本进行下采样。请注意,参数 sampsize 不能大于少数类中的记录数量。例如,以下代码片段将返回错误:

fit <- randomForest(Class ~ ., data = train, ntree = 5000, replace=T,
                    strata = train$Class, sampsize = c(nmin+1,nmin+1))

Error in randomForest.default(m, y, ...) : 
  sampsize can not be larger than class frequency

第一个结果是有希望的,我想尝试不同的 mtry 值,希望能够挤出一些额外的百分比。为此,我使用插入符号:

# Set trainControl for 10-fold cross-validation
ctrl <- trainControl(method = "cv", classProbs = TRUE, 
summaryFunction = twoClassSummary)

# Evaluate three values of mtry with caret
fit2 <- train(Class ~ ., data = train, method = "rf", ntree = 50, 
      metric = "ROC", trControl = ctrl,
      tuneGrid = expand.grid(mtry = c(2,5,10)),
  strata = train$Class, sampsize = c(nmin,nmin))

现在我的问题是: 由于应用了10倍的CV,因此每次折叠时插入符号将大约90%的训练数据发送到randomForest。结果,这些子集的少数类中的样本数将小于nmin。但是,上面的代码片段不会抛出错误'sampsize不能大于类频率'。这是否意味着插入符调整 sampsize 参数。如果是这样,它是如何调整的?

长篇故事,希望很清楚! 提前致谢, 阿诺

0 个答案:

没有答案