caret
のtrainControl関数内のR
にSMOTE
を使用しようとしています。次のように私は著者のexample次の操作を行います。SMOTEでRのデバッグキャレット
#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)
エラーなく実行されます。私は今、各反復で使用されるトレーニングとテストセットを見たいと思っています。トレーニングフォルダをオーバーサンプリングする前に、1つのフォルダが保持されていて、その内部に新しい合成レコードが作成されていないことを確認する必要があります。
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は、少数派クラスの合成記録を作成することになっています。たぶん、この情報は別の場所に保存されますか?
質問:
がどのようにデータのバランスをとるために打っを使用して作成された新しいトレーニング記録を見ることができますか?
テストフォルダがオーバーサンプリングによって汚染されていないことを確認するにはどうすればよいですか?
SMOTEでキャレットが何をしているのかはどこにありますか?ソースコードへのポインタ。