【问题标题】:Classification - Usage of factor levels分类 - 因子水平的使用
【发布时间】:2017-10-20 10:49:16
【问题描述】:

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

我不明白我的问题是什么,如果我将整个数据转换为因子,那么例如变量 total_airtime_out 可能会有大约 9000 个因子。

感谢您的任何帮助!

【问题讨论】:

  • 能否请您添加虚拟数据或示例 + 代码(包括包),用它可以重新创建您的错误消息?谢谢。

标签: r classification prediction


【解决方案1】:

我遇到了同样的问题,

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

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,并通过在trainControl() 中设置classProbs = FALSE 解决了这个问题并保持了01 的水平

    【讨论】:

      【解决方案3】:

      除了@einar 的正确答案,这里是转换因子级别的 dplyr 语法:

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

      我更喜欢只更改因子级别的标签,因为级别会更改基础数据,如下所示:

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

      【讨论】:

        【解决方案4】:

        这个基函数怎么样:

         make.names(churn) ~ .,
        

        “从字符向量中生成语法上有效的名称”?

        Source

        【讨论】:

          【解决方案5】:

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

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

          强调我的。查看您的响应变量,它的级别是 "0""1",这些不是 R 中的有效变量名称(您不能这样做 0 &lt;- "my value")。如果你用类似的东西重命名响应变量的级别,这个问题可能会消失

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

          根据this Q

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-12-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-12-07
            • 1970-01-01
            相关资源
            最近更新 更多