2017-11-30 29 views
2

caretのtrainControl関数内のRSMOTEを使用しようとしています。次のように私は著者の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に情報があることがわかりました。具体的には、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は、少数派クラスの合成記録を作成することになっています。たぶん、この情報は別の場所に保存されますか?

質問:

  1. がどのようにデータのバランスをとるために打っを使用して作成された新しいトレーニング記録を見ることができますか?

  2. テストフォルダがオーバーサンプリングによって汚染されていないことを確認するにはどうすればよいですか?

  3. SMOTEでキャレットが何をしているのかはどこにありますか?ソースコードへのポインタ。

答えて

1

いくつかの答え:それは提示されたデータを汚染しないように設計されている情報

  • を保持しません

    1. 。あなたが参照するリンクに表示されているもの以外の証明が必要な場合は、createModelを参照してサンプリングの仕組みを確認し、predictionFunctionを予測前にどのように処理するかを見てください。

    2. パッケージソースは基本的にどこでも利用できます。上記の2つの機能(probFunctionと一緒に)を作業に使用します。