2017-10-18 26 views
0

なぜこのエラーが発生するのでしょうか?私は自分のデータフレーム内のレベルを違法な列名にするだけで再現できますが、RF実装ではなぜ機能しますか?列名に誤りがありますが、列名は有効です

ランナーを使用することを考えれば、より速く実行されるようです。

library(caret) 
library(ranger) 
library(randomForest) 

df <- data.frame(class = c(rep(c('A','B'), 10)), var1 = runif(20, 0,10), var2 = runif(20, 0,20), var3 = c(rep(c(' A','1 B', 'C'), 6), 'D','D')) 
df 

CTRL <- trainControl(method = "repeatedcv", 
        number = 2, 
        repeats = 1, 
        verboseIter = TRUE, 
        classProbs = TRUE, 
        returnResamp = "final", 
        summaryFunction = twoClassSummary) 

ranger_model <- caret::train(class ~ ., 
           df, 
           method = "ranger", 
           trControl = CTRL, 
           preProc = c("center", "scale"), 
           metric="ROC", 
           tuneGrid = expand.grid(.mtry=c(1,2))) 

rf_model <- caret::train(class ~ ., 
           df, 
           method = "rf", 
           trControl = CTRL, 
           preProc = c("center", "scale"), 
           metric="ROC", 
           tuneGrid = expand.grid(.mtry=c(1,2))) 

ranger_model 
rf_model 

レンジャー出力:また

+ Fold1.Rep1: mtry=1 
model fit failed for Fold1.Rep1: mtry=1 Error in parse.formula(formula, data) : 
Error: Illegal column names in formula interface. Fix column names or use alternative interface in ranger. 

、私はエラーを生成レンジャーのドキュメントをチェックしたときに、これはTRUEと評価され、なぜ、私は私のコードを実行するときので、理解していませんよ

## Error if illegal column name 
if (!all(make.names(independent_vars[!interaction_idx]) == independent_vars[!interaction_idx])) { 
stop("Error: Illegal column names in formula interface. Fix column names or use alternative interface in ranger.") 
} 

https://github.com/cran/ranger/blob/master/R/formula.R

I:DF、私は同じ結果を得ることはありません私のDFでそれを実行します。因子列が列名として因子レベルを使用して1ホットエンコードされたマトリックスの中に作られているので

formula <- 'class ~ .' 
data <- df 

f <- as.formula(formula) 
t <- terms(f, data = data) 

## Get dependent var(s) 
response <- data.frame(eval(f[[2]], envir = data)) 
colnames(response) <- deparse(f[[2]]) 

## Get independent vars 
independent_vars <- attr(t, "term.labels") 
interaction_idx <- grepl(":", independent_vars) 

## Error if illegal column name 
if (!all(make.names(independent_vars[!interaction_idx]) == independent_vars[!interaction_idx])) { 
    print("Error: Illegal column names in formula interface. Fix column names or use alternative interface in ranger.") 
} 

> !all(make.names(independent_vars[!interaction_idx]) == independent_vars[!interaction_idx]) 
## [1] FALSE 

はそれですか?再び、なぜそれがレンジャーではなくRFで機能するのかはわかりません。

思考?

答えて

1

キャレット6.0-77で修正する必要があります。あなたの例では、tuneGridsplitruleパラメータを追加する必要があります:

library(caret) 
library(ranger) 
library(randomForest) 

df <- data.frame(class = c(rep(c('A','B'), 10)), var1 = runif(20, 0,10), var2 = runif(20, 0,20), var3 = c(rep(c(' A','1 B', 'C'), 6), 'D','D')) 
df 

CTRL <- trainControl(method = "repeatedcv", 
        number = 2, 
        repeats = 1, 
        verboseIter = TRUE, 
        classProbs = TRUE, 
        returnResamp = "final", 
        summaryFunction = twoClassSummary) 

ranger_model <- caret::train(class ~ ., 
          df, 
          method = "ranger", 
          trControl = CTRL, 
          preProc = c("center", "scale"), 
          metric="ROC", 
          tuneGrid = expand.grid(.mtry=c(1,2), .splitrule="gini")) 

rf_model <- caret::train(class ~ ., 
         df, 
         method = "rf", 
         trControl = CTRL, 
         preProc = c("center", "scale"), 
         metric="ROC", 
         tuneGrid = expand.grid(.mtry=c(1,2))) 

ranger_model 
rf_model 
関連する問題