分类 - 因子水平的使用

时间:2017-05-20 10:24:30

标签: r classification prediction

我目前正在研究流失问题的预测模型。
每当我尝试运行以下模型时,我都会收到此错误:至少有一个类级别不是有效的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个因子。

感谢您提供任何帮助!

5 个答案:

答案 0 :(得分:16)

我不可能重现您的错误,但我有根据的猜测是错误消息告诉您需要知道的一切:

  

至少有一个类级别不是有效的R变量名称。这会在生成类概率时导致错误,因为变量名称将转换为X0,X1。 请使用可用作有效R变量名称的因子级别。

强调我的。查看您的响应变量,其级别为"0""1",这些在R中不是有效的变量名称(您不能0 <- "my value")。如果你用

之类的东西重命名响应变量的级别,大概这个问题就会消失

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

根据this Q

答案 1 :(得分:3)

该基本功能如何:

 make.names(churn) ~ .,

“根据字符向量制作在语法上有效的名称”?

Source

答案 2 :(得分:0)

在@einar的正确答案之外,这是转换因子水平的dplyr语法:

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

我稍微喜欢只更改因子水平的标签,因为水平会更改基础数据,例如:

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

答案 3 :(得分:0)

我遇到了相同的问题,并通过在classProbs = FALSE中设置trainControl()来解决了此问题,并保持了01的级别

答案 4 :(得分:0)

我遇到了同样的问题,

class(iris$Species); levels(iris$Species)
iris.lvls <- factor(iris, levels = c("1", "2", "3"))
class(iris.lvls); levels(iris.lvls)