You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何用Base R计算模型准确率的代码返回结果为0?

问题:Base R模型准确率计算结果始终为0的原因及修复方案

我用Base R测试模型,先执行以下代码生成预测结果:

probabilities <- predict(theModel, newdata = dataToModel2 , type = "response")   
dataToModel2$predictions <- ifelse(probabilities >= .5, "True", "False")

接着用这段代码计算准确率:

accuracy <- sum(dataToModel2$predictions == dataToModel2$incomeNum)/dim(dataToModel2)[1]

但准确率结果始终是0,而非正常数值。

附原模型数据:

dataToModel <- structure(
  list(
    sex = c("Male", "Male", "Male", "Male", "Female"),
    marital.status = c("Never-married", "married", "pMarried",
                       "married", "married"),
    race = c("White", "White", "White", "Black",
             "Black"),
    education = c(
      "University",
      "University",
      "less-than-Uni",
      "less-than-Uni",
      "University"
    ),
    incomeNum = c(FALSE, FALSE, FALSE,
                  FALSE, FALSE)
  ),
  row.names = c(NA, 5L),
  class = "data.frame"
)

预测数据:

dataToModel2 <- structure(
  list(
    sex = c("Male", "Male", "Male", "Male", "Male"),
    marital.status = c(
      "Never-married",
      "married",
      "married",
      "married",
      "Never-married"
    ),
    race = c("Black", "White", "White",
             "Black", "White"),
    education = c(
      "less-than-Uni",
      "less-than-Uni",
      "University",
      "less-than-Uni",
      "less-than-Uni"
    ),
    incomeNum = c(FALSE,
                  FALSE, FALSE, FALSE, FALSE),
    predictions = c("False", "False",
                    "True", "False", "False")
  ),
  row.names = c(1L, 2L, 3L, 4L, 6L),
  class = "data.frame"
)

核心原因

  • 数据类型不匹配:predictions列是字符串类型("True"/"False"),而incomeNum列是布尔类型(TRUE/FALSE)。在R中,字符串和布尔值直接比较时永远不会相等,导致sum()的结果为0。从提供的dataToModel2也能看到,第三行的"True"和对应的incomeNum值FALSE完全无法匹配,这直接拉低了总和。
  • 额外问题:训练数据dataToModel的incomeNum全为FALSE,模型无法学习到分类边界,预测结果的可靠性也会受影响。

修复方案

方案一:将预测结果转为布尔类型

修改生成预测结果的代码,直接输出布尔值而非字符串,让两列类型一致:

probabilities <- predict(theModel, newdata = dataToModel2 , type = "response")   
dataToModel2$predictions <- probabilities >= .5  # 直接生成TRUE/FALSE的布尔值

之后原准确率计算代码就能正常运行,也可以用更直观的nrow()替代dim()[1]:

accuracy <- sum(dataToModel2$predictions == dataToModel2$incomeNum) / nrow(dataToModel2)

方案二:将布尔值转为字符串再比较

如果需要保留predictions的字符串格式,计算准确率时把incomeNum转为对应的字符串:

accuracy <- sum(dataToModel2$predictions == ifelse(dataToModel2$incomeNum, "True", "False")) / nrow(dataToModel2)

内容的提问来源于stack exchange,提问作者IanAnthony1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 20:15:33