我正在研究一个高度不 balancer 的两类分类问题,其中大部分记录对应于大多数类 . 我正在研究的一种技术是随机森林,其中每个单独树的引导样本是通过对大多数类进行下采样来创建的 . 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 can not be larger than class frequency' . 这是否意味着插入符调整sampsize参数 . 如果是这样,它是如何调整的?

长话,希望很清楚!在此先感谢,Arno