为何用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
相关产品推荐
相关产品推荐

