首页 文章

使用R中的SMOTE调试插入符号

提问于
浏览
2

我想在 caret 中的trainControl函数中使用 R 中的 SMOTE . 以下作者的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

你可以看到它仍然是不 balancer 的 . SMOTE应该从少数类创建一些合成记录 . 也许这些信息保存在另一个地方?

问题:

  • 如何查看使用smote创建的新培训记录以 balancer 数据?

  • 如何确保测试文件夹没有被过采样污染?

  • 哪里可以找到注意事项与SMOTE有什么关系?指向源代码的指针 .

1 回答

  • 1

    一些答案:

    • 它不保留该信息

    • 它的设计不会污染保持数据 . 如果您需要证明(超出您所引用的链接中显示的内容),请查看 createModel 以了解它如何进行采样,并查看 predictionFunction 以了解在预测之前如何处理数据 .

    • 包源基本上可以在任何地方使用 . 上面的两个函数(以及 probFunction )来完成工作 .

相关问题