分类 - 因子水平的使用

Posted

技术标签:

【中文标题】分类 - 因子水平的使用【英文标题】: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 个因子。

感谢您的任何帮助!

【问题讨论】:

能否请您添加虚拟数据或示例 + 代码(包括包),用它可以重新创建您的错误消息?谢谢。 【参考方案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。

【讨论】:

以上是关于分类 - 因子水平的使用的主要内容,如果未能解决你的问题,请参考以下文章

R语言数据预处理:将指定的分类变量转化为因子变量通过levels参数指定因子水平通过labels参数指定因子标签

为啥 predict 的输出是 0 水平的因子?

R:ggplot 中的因子水平被视为连续数据集

处理训练和测试数据中的不同因子水平

R语言批量把dataframe多个分类变量因子化处理批量把多个分类变量转换为因子变量

尝试使用“bnlearn”实现一个简单的朴素贝叶斯分类器。不断收到错误“变量必须是数字、因子或有序因子”