2017-01-12 9 views
2

ランダムなフォレストモデルの構造を視覚化するためにforestFloorパッケージを使用しています。 caretパッケージのランダムフォレスト出力でforestFloor()を使用しようとするまで、すべてがうまくいっていました。私はひどく不均衡なクラスを持っているので、SMOTEサンプリング戦略を使用しているのでrandomForestの代わりにcaretを使用する必要があります。私はいくつかの問題を修正し、caret::trainkeep.inbag=TRUEkeep.forest=TRUEを渡して、trainクラスオブジェクトに隠されたrandomForestオブジェクトを見つけました。$finalModelcaretパッケージのrandomForest出力にforestFloor()を使用するにはどうすればよいですか?

私はまだエラーを取得: Error in eval(substitute(expr), envir, enclos) : index out of bounds

mlbenchでピマインディアン糖尿データセットから取られ、次の最小限の作業例を参照してください。前もって感謝します!

> sessionInfo() 
R version 3.3.2 (2016-10-31) 
Platform: x86_64-pc-linux-gnu (64-bit) 
Running under: Ubuntu 14.04.5 LTS 

other attached packages: 
[1] DMwR_0.4.1   caret_6.0-70  ggplot2_2.1.0  
[4] lattice_0.20-34  forestFloor_1.9.5 randomForest_4.6-12 
[7] mlbench_2.1-1 

library(mlbench) 
library(randomForest) 
library(forestFloor) 

data(PimaIndiansDiabetes) 
y = PimaIndiansDiabetes$diabetes 
X = PimaIndiansDiabetes 
X = X[,!names(X)=="diabetes"] 
rf.randomForest = randomForest(X,y,sampsize=25,ntree=5000,mtry=4, 
keep.inbag = T,keep.forest = T) 

## Use forestFloor on randomForest output, works great 
ff = forestFloor(rf.randomForest,X,binary_reg = T,calc_np=T) 
Col = fcol(ff,cols=1,outlier.lim = 2.5) 
plot(ff,col=Col,plot_GOF = T) 

## Now fit random forest using SMOTE from caret package 
ctrl <- trainControl(method = "cv", number=5, 
        classProbs = TRUE, 
        summaryFunction = twoClassSummary, 
        sampling = "smote") 
rf.SMOTE <- train(x=X,y=y, 
         method = "rf", 
         tuneGrid = data.frame(mtry = 3), 
         metric = "ROC", 
         trControl = ctrl, 
         keep.inbag=TRUE, 
         keep.forest=TRUE) 
rf.caret <- rf.SMOTE$finalModel 

## Use forestFloor on caret output, throws error 
ff = forestFloor(rf.caret,X,binary_reg = T,calc_np=T) 
+0

この問題を修正したことがありますか? – Pete900

+0

一種...「キャレット」パッケージ全体ではなく、SMOTEリサンプリングだけです。ソレン氏は潜在的な修正について回答しましたが、まだ試していません:https://github.com/sorhawell/forestFloor/issues/22 – bstock

答えて

0

ソレンの助けを借りて、これを見つけました:https://github.com/sorhawell/forestFloor/issues/22

言い換えSoren:問題は、caretのSMOTEのバージョンがトレーニングデータを再サンプリングし、別の場所に保存することです(?)。フィーチャの貢献度を推定するには、トレーニングに使用したのと同じデータセット(X)をforestFloorに渡す必要があります。 forestFloorでのフィーチャー寄与計算は、提供されたトレーニングセットと一致するようにアウトオブバッグサンプリングとインバッグマトリックスに依存します。

修正:caretパッケージ内でSMOTEを使用する代わりに、DMwRパッケージのSMOTE機能を使用することができます。 DMwR::SMOTEは、再サンプリングされたトレーニングデータを返信し、randomForestに入力してからforestFloorに入力することができます。

library(randomForest) 
library(DMwR) 
library(forestFloor) 
# covar = names of covariate/feature column names (character vector) 
# target = response column names (character) 
X <- cbind(dat[,covar], factor(dat[,target])) 
names(X) <- c(covar, target) 
bin.formula <- formula(paste0(target," ~ ",paste0(covar,collapse=" + "))) 
X.SMOTE <- SMOTE(bin.formula, data=X, k=5) 
rf.SMOTE <- randomForest(x=X.SMOTE[,covar], y=X.SMOTE[,target], keep.inbag=T, ...) 
ff.bin = forestFloor(rf.fit = rf.SMOTE, X = X.SMOTE[,covar]) 
関連する問題