我正在研究一个高度不平衡的两类分类问题,其中大部分记录对应于多数类。我正在研究的一种技术是随机森林,其中每个单独树的引导样本是通过对大多数类进行下采样来创建的。 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 参数。如果是这样,它是如何调整的?
长篇故事,希望很清楚! 提前致谢, 阿诺