我试图在SMOTE的trainControl函数内的R中使用caret。按照作者的example,我执行以下操作:

#first, create an imbalanced data set
set.seed(2969)
imbal_train <- twoClassSim(10000, intercept = -20, linearVars = 20)
imbal_test  <- twoClassSim(10000, intercept = -20, linearVars = 20)

table(imbal_train$Class)
Class1 Class2
 9411    589


我想使用SMOTE算法对我的少数派进行过采样。但是,必须谨慎进行。例如,在进行交叉验证之前,我们不应该过采样。这将导致我们出现乐观的泛化错误。

#create my folds (5 in this case)
folds <- createFolds(factor(imbal_train$Class), k = 5, list = TRUE,returnTrain=TRUE)

#trainControl to set up my training phase.
ctrl <- trainControl(method = "cv", index = folds,
                 classProbs = TRUE,
                 summaryFunction = twoClassSummary,
                 savePredictions = "all",
                 ## new option here:
                 sampling = "smote")

#train the model
set.seed(5627)
smote_inside <- train(Class ~ ., data = imbal_train,
                  method = "treebag",
                  nbagg = 50,
                  metric = "ROC",
                  trControl = ctrl)


它运行没有错误。现在,我想查看每次迭代中使用的训练和测试集。我需要确保在对训练文件夹进行过度采样之前,先保留一个文件夹,并且在其中没有创建新的综合记录。

查看train输出的对象,可以看到smote_inside$control可能有一些信息。具体来说,它具有indexindex_out:这些是每次cv迭代中训练和测试的行索引。但是,当我这样做时:

lista=smote_inside$control
dd=imbal_train[lista$index$Fold1,] #training data first cv iteration
table(dd$Class)
Class1 Class2
7529    471


您可以看到它仍然不平衡。 SMOTE应该创建少数群体的一些综合记录。也许这些信息保存在另一个地方?

问题:


如何查看使用smote创建的新培训记录以平衡数据?
如何确定测试文件夹没有被过度采样污染?
在哪里可以找到SMOTE的插入符号?指向源代码的指针。

最佳答案

一些答案:


它不保留该信息
它旨在不污染保留数据。如果要证明(超出您引用的链接中显示的内容),请查看createModel以查看其如何进行采样,以及predictionFunction了解预测之前如何处理数据。
软件包的来源基本上随处可见。上面的两个功能(以及probFunction)起作用。

08-24 15:10