R语言构建逻辑回归ROC曲线时confusionMatrix相关报错如何解决
R语言ROC绘制与混淆矩阵报错解决方法
混淆矩阵相关报错解决方案
所有关于类别水平不匹配、无重叠类别的报错,核心原因是标签取值、因子水平未对齐,预测与真实标签用了不同字段:
- 错误根源:
- 首次代码混淆了标签字段:训练模型用
quality_binary,构造混淆矩阵时真实值取了my_type_test$quality,两个字段的取值、类别数量完全不一致 - 修改后代码逻辑顺序错误:先给预测值赋值真实值的levels,此时还未将真实值转成因子,
levels(df$Actual)为NULL,触发level数量不匹配报错 - 可能存在预测结果全为0/全为1的情况,和真实标签完全没有重叠类别
- 首次代码混淆了标签字段:训练模型用
- 修复代码:
# 提前统一训练、测试集的标签因子水平,避免后续对齐问题 my_type_train$quality_binary <- factor(my_type_train$quality_binary, levels = c(0,1)) my_type_test$quality_binary <- factor(my_type_test$quality_binary, levels = c(0,1)) # 训练逻辑回归模型 my_log <- glm(quality_binary ~ fixed.acidity + volatile.acidity + citric.acid + chlorides + free.sulfur.dioxide + total.sulfur.dioxide + density + pH + sulphates + alcohol, data = my_type_train, family = "binomial") # 生成测试集预测概率 prediction <- predict(my_log, newdata = my_type_test, type = "response") # 转类别,提前对齐因子水平 predict_cat <- factor(ifelse(prediction < 0.5, 0, 1), levels = c(0,1)) # 生成混淆矩阵,注意第一个参数为预测值,第二个为真实值,positive填实际正类的取值 result <- confusionMatrix(predict_cat, my_type_test$quality_binary, positive = "1") print(result)
ROC绘制与AUC计算报错解决方案
仅字符串可转符号、对象不存在的报错,核心原因是变量存储位置错误、命名不统一:
- 错误根源:
- 首次代码把预测概率
prob存在了训练集里,调用ROC时用测试集,测试集没有prob字段 - 混淆了标签字段,ROC计算时用了
quality而非建模用的quality_binary - 修改后ROC对象存为
roc2,画图时还在调用旧的roc对象
- 首次代码把预测概率
- 修复代码:
# 把预测概率存在测试集里,不要存在训练集 my_type_test$prob <- prediction library(pROC) # 用测试集的真实标签和对应预测概率计算ROC roc_obj <- roc(quality_binary ~ prob, data = my_type_test) # 输出AUC值 print(auc(roc_obj)) # 绘制ROC曲线 library(ggplot2) ggroc(roc_obj, color = "red") + geom_abline(slope = 1, intercept = 1, linetype = "dashed") + labs(title = "Logistic回归ROC曲线", x = "特异度", y = "灵敏度")
额外注意事项
- 不要重复执行
install.packages(),已安装的包直接用library()调用即可 - 变量命名要统一,避免出现调用未定义对象的低级错误
- 提前检查
quality_binary的取值,确认只有0和1两类,无异常值
内容的提问来源于stack exchange,提问作者Crystal
相关产品推荐
相关产品推荐

