【问题标题】:confusionMatrix for logistic regression in RR中逻辑回归的confusionMatrix
【发布时间】:2018-02-12 04:17:24
【问题描述】:

我想使用我的训练数据和测试数据为我的逻辑回归计算两个混淆矩阵:

logitMod <- glm(LoanStatus_B ~ ., data=train, family=binomial(link="logit"))

我将预测概率的阈值设置为 0.5:

confusionMatrix(table(predict(logitMod, type="response") >= 0.5,
                      train$LoanStatus_B == 1))

下面的代码非常适合我的训练集。 但是,当我使用测试集时:

confusionMatrix(table(predict(logitMod, type="response") >= 0.5,
                      test$LoanStatus_B == 1))

它给了我一个错误

Error in table(predict(logitMod, type = "response") >= 0.5, test$LoanStatus_B == : all arguments must have the same length

这是为什么?我怎样才能解决这个问题?谢谢!

【问题讨论】:

  • 你需要将测试数据集传递给预测函数,否则它将在训练数据集上进行预测。即predict(logitMod, newdata=test, type="response")
  • 谢谢它的工作原理!..

标签: r validation logistic-regression confusion-matrix


【解决方案1】:

我认为使用 predict 存在问题,因为您忘记提供新数据。此外,您可以使用 caret 包中的函数 confusionMatrix 来计算和显示混淆矩阵,但您不需要在调用之前列出结果。

在这里,我创建了一个包含代表性二进制目标变量的玩具数据集,然后我训练了一个与您所做的类似的模型。

train <- data.frame(LoanStatus_B = as.numeric(rnorm(100)>0.5), b= rnorm(100), c = rnorm(100), d = rnorm(100))
logitMod <- glm(LoanStatus_B ~ ., data=train, family=binomial(link="logit"))

现在,您可以预测数据(例如,您的训练集),然后使用带有两个参数的confusionMatrix()

  • 您的预测
  • 观察到的类
library(caret)
# Use your model to make predictions, in this example newdata = training set, but replace with your test set    
pdata <- predict(logitMod, newdata = train, type = "response")

# use caret and compute a confusion matrix
confusionMatrix(data = as.numeric(pdata>0.5), reference = train$LoanStatus_B)

这是结果

Confusion Matrix and Statistics

          Reference
Prediction  0  1
         0 66 33
         1  0  1

               Accuracy : 0.67            
                 95% CI : (0.5688, 0.7608)
    No Information Rate : 0.66            
    P-Value [Acc > NIR] : 0.4625          

【讨论】:

  • 这一行在做什么 data = as.numeric(pdata>0.5)
  • 您的目标变量是 0 或 1,但预测返回的值在 0 到 1 之间。因此您需要将其转换为二进制(离散化)。例如,您测试一个值是大于还是小于 0.5。然后使用 as.nmeric 将 TRUE 转换为 1(并将 FALSE 转换为 0)
  • 所以这是门槛,对吧?我可以将其更改为我想要的任何 0-1 数字
  • 结果中的最后一行是“'Positive' Class : 0”,但在我的情况下,我想要正类:1,这是默认值,我可以这样做吗?
  • 在这种情况下,“1”对应于您的数字 1。然而,积极的论点是作为一个角色提供的!如果您关心准确性,那没关系。但这对于计算敏感性/特异性很重要,因为您需要知道哪些是真/假阳性。例如,尝试:confusionMatrix(data = as.factor(c("A","B", "B", "B", "A", "A", "A", "A", "B", "B")), reference = as.factor(c("A","A", "A", "B", "A", "A", "A", "A", "B", "A")), positive = "A")positive = "B" 的同一行。我希望这很有用。如果是这样,请验证我的答案。谢谢
猜你喜欢
  • 2021-04-28
  • 2018-01-26
  • 2014-06-20
  • 2021-11-13
  • 1970-01-01
  • 2014-06-26
  • 2019-08-20
  • 2021-05-02
  • 2017-07-30
相关资源
最近更新 更多