web-dev-qa-db-ja.com

分類-因子レベルの使用

現在、チャーン問題の予測モデルに取り組んでいます。
次のモデルを実行しようとすると、常に次のエラーが発生します。クラスレベルの少なくとも1つが有効なR変数名ではありません。これにより、変数名がX0、X1に変換されるため、クラス確率が生成されるときにエラーが発生します。有効なR変数名として使用できる因子水準を使用してください。

fivestats <- function(...) c( twoClassSummary(...), defaultSummary(...))
fitControl.default    <- trainControl( 
    method  = "repeatedcv"
  , number  = 10
  , repeats = 1 
  , verboseIter = TRUE
  , summaryFunction  = fivestats
  , classProbs = TRUE
  , allowParallel = TRUE)
set.seed(1984)

rpartGrid             <-  expand.grid(cp = seq(from = 0, to = 0.1, by = 0.001))
rparttree.fit.roc <- train( 
    churn ~ .
  , data      = training.dt  
  , method    = "rpart"
  , trControl = fitControl.default
  , tuneGrid  = rpartGrid
  , metric = 'ROC'
  , maximize = TRUE
)

添付の画像では、私のデータが表示されていますが、すでに一部のデータをchrから因子変数に変換しています。

DATA OVERVIEW

私の問題が何であるかわかりません。データ全体を因子に変換する場合、たとえば変数total_airtime_outにはおそらく約9000の因子があります。

助けてくれてありがとう!

7
Simon

私があなたのエラーを再現することは正確には可能ではありませんが、私の知識に基づいた推測では、エラーメッセージはあなたが知る必要があるすべてを伝えます:

クラスレベルの少なくとも1つが有効なR変数名ではありません。これにより、変数名が次のように変換されるため、クラス確率が生成されるときにエラーが発生しますX0、X1。 有効なR変数名として使用できる因子レベルを使用してください。

鉱山を強調します。応答変数を見ると、そのレベルは_"0"_および_"1"_であり、これらはRでは有効な変数名ではありません(_0 <- "my value"_は実行できません)。おそらく、応答変数のレベルの名前を次のように変更すると、この問題は解消されます

levels(training.dt$churn) <- c("first_class", "second_class")

this Q のとおり。

23
einar

この基本関数はどうですか:

 make.names(churn) ~ .,

「文字列から構文的に有効な名前を作る」には?

ソース

3
Dbercules

@einarの正解に加えて、因子レベルを変換するdplyr構文は次のとおりです。

training.dt  %>% 
  mutate(churn = factor(churn, 
          levels = make.names(levels(churn))))

レベルは次のように基礎となるデータを変更するため、因子レベルのlabelsのみを変更することをわずかに好みます。

training.dt  %>% 
  mutate(churn = factor(churn, 
          labels = make.names(levels(churn))))
0
Agile Bean

同じ問題があり、trainControl()classProbs = FALSEを設定することで修正しました。これで問題が解決し、レベル01が維持されました

0
Salma