分类 - 因子水平的使用
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
解决了这个问题并保持了0
和1
的水平
【讨论】:
【参考方案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 <- "my value"
)。如果你用类似的东西重命名响应变量的级别,这个问题可能会消失
levels(training.dt$churn) <- c("first_class", "second_class")
根据this Q。
【讨论】:
以上是关于分类 - 因子水平的使用的主要内容,如果未能解决你的问题,请参考以下文章
R语言数据预处理:将指定的分类变量转化为因子变量通过levels参数指定因子水平通过labels参数指定因子标签