为啥我的逻辑回归模型输出的因子不是 2 个水平? (错误:`data`和`reference`应该是相同级别的因素。)

Posted

技术标签:

【中文标题】为啥我的逻辑回归模型输出的因子不是 2 个水平? (错误:`data`和`reference`应该是相同级别的因素。)【英文标题】:Why isnt my logistic regression model output a factor of 2 levels? (Error: `data` and `reference` should be factors with the same levels.)为什么我的逻辑回归模型输出的因子不是 2 个水平? (错误:`data`和`reference`应该是相同级别的因素。) 【发布时间】:2020-04-29 18:01:47 【问题描述】:

通过阅读类似的问题,我知道问题在于 yhat.logisticReg 不是 2 个级别的因子,而 training.prepped$TARGET_FLAG 是。我认为可以通过更改我的模型或在预测中解决该问题,以便 yhat.logisticReg 是 2 个级别的因子。我该怎么做?

logisticReg = glm(TARGET_FLAG ~ .,
                  data = training.prepped,
                  family = binomial())
yhat.logisticReg = predict(logisticReg, training.prepped, type = "response")
confusionMatrix(yhat.logisticReg, training.prepped$TARGET_FLAG)

Error: `data` and `reference` should be factors with the same levels.
str(training.prepped$TARGET_FLAG)
Factor w/ 2 levels "0","1": 1 1 1 1 1 2 1 2 2 1 ...

str(yhat.logisticReg)
 Named num [1:8161] 0.1656 0.2792 0.3717 0.0894 0.272 ...
 - attr(*, "names")= chr [1:8161] "1" "2" "3" "4" ...

【问题讨论】:

嗨,Jacob,您正在尝试将一个因子与一个数值进行比较。您需要将 yhat.logisticReg 转换为二进制。 我认为是这样的。你会建议我怎么做?我可以在 predict 行之后简单地做一个列表理解 if/else 语句还是有更好的选择? @Filipe Lauaur 您要优化哪个指标?我在 R 中有一个代码,可以找到解决问题的最佳阈值。比 if/else 更好。 我需要预测“崩溃”或“没有崩溃”。其中1 表示崩溃,0 表示没有崩溃。我不完全确定哪个指标最适合优化,但我认为confusionMatrix 函数报告的“准确性”将是一个不错的选择@Filipe Lauar 【参考方案1】:

您可能需要先选择一个阈值,然后将您的实值数据转换为二进制值,例如

a <- c(0.2, 0.7, 0.4)
threshold <- 0.5
binary_a <- factor(as.numeric(a>threshold))

str(binary_a)
Factor w/ 2 levels "0","1": 1 2 1

【讨论】:

这(通过我所做的编辑)解决了我的问题,尽管 Filipe 是正确的,即 0.5 可能不是最准确的阈值。 binary_a &lt;- factor(a&gt;threshold) 也可以工作,级别可能是“TRUE”和“FALSE”,这可能更合适,但正如它所写的那样,它与我的 TARGET_FLAG 变量匹配。 或者更好的是选择在测试集上最大化 AUC 或 kappa 的阈值。【参考方案2】:

库插入符号具有方法confusionMatrix,该方法实现了多个指标。致电overall 即可获得准确率。如果您想要其他指标,您可以检查他们是否已实施并调用它。

library(caret)
acc = c()
for(value in yhat.logisticReg)

  predictions <- ifelse(yhat.logisticReg <= value, 0, 1)
  confusion_matrix = confusionMatrix(predictions, yhat.logisticReg)
  acc = c(acc,confusion_matrix$overall["Accuracy"])


best_acc = max(acc)
best_threshold  = yhat.logisticReg[which.max(acc)]

【讨论】:

我收到错误Error in accuracy(predictions, yhat.logisticReg) : could not find function "accuracy" 正如我所说,某些包中存在功能准确性,我将使用有效的代码更新答案。 当我调用best_acc 时,我得到1075.698 的结果,当我调用best_threshold 时,它返回&lt;NA&gt; NA 。这似乎是一个错误。 抱歉,Jacob,那个分位数是个错误。我更新了代码,我认为它现在可以工作了。

以上是关于为啥我的逻辑回归模型输出的因子不是 2 个水平? (错误:`data`和`reference`应该是相同级别的因素。)的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的逻辑回归模型准确率达到 100%?

R语言glm拟合logistic回归模型实战:基于glm构建逻辑回归模型及模型系数统计显著性分析每个预测因子对响应变量的贡献

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

R语言广义线性模型函数GLMglm函数构建逻辑回归模型(Logistic regression)构建仿真数据集控制所有其它预测变量进而评估单个预测因子对结果概率的影响

为啥我在逻辑回归和支持向量机中得到相同的输出

在逻辑回归中,如何在 python 中为我的虚拟变量设置“参考水平”