在 R 中使用 SMOTE 调试插入符号
debugging caret with SMOTE in R
我正在尝试在 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
算法对我的少数 class 进行过采样。但是,这必须小心进行。例如,我们不应该在进行交叉验证之前进行过度采样。这将导致我们出现乐观的泛化错误。
#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
可能有一些信息。具体来说,它有 index
和 index_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 应该从少数 class 中创建一些合成记录。也许这些信息保存在另一个地方?
问题:
如何查看使用smote创建的新训练记录以平衡数据?
如何确定测试文件夹没有被过采样污染?
在哪里可以找到插入符号对 SMOTE 的作用?指向源代码的指针。
一些答案:
它不保留该信息
它被设计成不污染保留数据。如果您想要证据(超出您引用的 link 中显示的内容),请查看 createModel
以了解它如何进行采样,并查看 predictionFunction
以了解在预测之前如何处理数据.
包源基本上随处可用。上面的两个函数(连同 probFunction
)起作用了。
我正在尝试在 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
算法对我的少数 class 进行过采样。但是,这必须小心进行。例如,我们不应该在进行交叉验证之前进行过度采样。这将导致我们出现乐观的泛化错误。
#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
可能有一些信息。具体来说,它有 index
和 index_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 应该从少数 class 中创建一些合成记录。也许这些信息保存在另一个地方?
问题:
如何查看使用smote创建的新训练记录以平衡数据?
如何确定测试文件夹没有被过采样污染?
在哪里可以找到插入符号对 SMOTE 的作用?指向源代码的指针。
一些答案:
它不保留该信息
它被设计成不污染保留数据。如果您想要证据(超出您引用的 link 中显示的内容),请查看
createModel
以了解它如何进行采样,并查看predictionFunction
以了解在预测之前如何处理数据.包源基本上随处可用。上面的两个函数(连同
probFunction
)起作用了。