为什么我的逻辑回归模型输出不是一个2级因子?(错误:`data`和`reference`应该是具有相同级别的因子。)

为什么我的逻辑回归模型输出不是一个2级因子?(错误:`data`和`reference`应该是具有相同级别的因子。),r,machine-learning,classification,logistic-regression,r-caret,R,Machine Learning,Classification,Logistic Regression,R Caret,通过阅读类似的问题,我知道问题在于yhat.logisticReg不是两个级别的因素,而training.prepped$TARGET\u FLAG是。我假设这个问题可以通过改变我的模型或在预测中得到解决,因此yhat.logisticReg是一个2级因子。我该怎么做 logisticReg = glm(TARGET_FLAG ~ ., data = training.prepped, family = binomial()

通过阅读类似的问题,我知道问题在于
yhat.logisticReg
不是两个级别的因素,而
training.prepped$TARGET\u 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.

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

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

a库插入符号具有方法
confusionMatrix
,该方法实现了多个度量。调用
总体
可以获得准确度。如果您想要另一个度量,您可以检查他们是否实现了它,然后调用它

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)]
库(插入符号)
acc=c()
for(以yhat.logisticReg为单位的值)
{

预测嘿,雅各布,你正在尝试将一个因子与一个数值进行比较。你需要将
yhat.logisticReg
转换为二进制。我认为这是一个类似的问题。你建议我如何做?我可以在
predict
行之后简单地做一个列表理解if/else语句吗?还是有更好的选择@Filipe Lauaur您希望优化哪一个指标?我有一个R代码,可以找到解决您问题的最佳阈值。这比使用if/else更好。我需要预测“崩溃”或“不崩溃”。其中,
1
表示崩溃,
0
表示无崩溃。我不完全确定哪一个指标最适合优化,但我认为,
confusionMatrix
函数报告的“准确度”是一个不错的选择@Filipe LauarI获取准确度中的错误
错误(预测,yhat.logisticReg):找不到函数“准确性”
正如我所说,函数精度在某些软件包中存在,我将使用有效的代码更新答案。当我调用
best_acc
时,我得到结果
1075.698
,当我调用
best_threshold
时,它返回
NA
。这似乎是个错误。对不起,雅各布,那个分位数是个错误。我更新了代码,我想现在它可以工作了。这(通过我所做的编辑)解决了我的问题,尽管Filipe是正确的,0.5可能不是提供最高精度的阈值。
binary\u a threshold)
也可以工作,级别将为“真”和“假”这可能更合适,但在编写时,它与我的
TARGET\u FLAG
变量相匹配。或者更好地选择使测试集上的AUC或kappa最大化的阈值。
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)]