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

如何让data与reference拥有相同因子水平?解决confusionMatrix报错

解决confusionMatrix因子水平不匹配的错误

错误原因

你遇到的Error: data and reference should be factors with the same levels错误,核心问题有两个:

  1. 预测结果pred.glm是字符向量,而真实标签irisTest$Species是因子类型,两者类型不匹配
  2. 即便转成因子,pred.glm的因子水平可能和真实标签不一致(比如类别顺序、缺失)

另外,你的代码里还有一个逻辑错误:multinom的predict默认返回的是分类标签(因子),不是概率值,所以不需要用ifelse判断0.5。


修复方案

方案1:修正预测逻辑(推荐)

直接使用predict返回的分类标签,它本身就是和训练数据同水平的因子,和真实标签天然匹配:

# 直接获取分类预测结果(因子类型)
pred.glm <- predict(fit.glm, irisTest)

方案2:强制统一因子水平

如果确实需要手动生成预测标签,必须将其转换为因子,并指定和真实标签完全一致的水平:

pred.glm <- factor(ifelse(predict(fit.glm, irisTest, type="prob")[,1] > 0.5, "setosa", "other"),
                   levels = levels(irisTest$Species))

注:这里加了type="prob"才会返回概率值,否则predict返回的是分类标签,和0.5比较无意义

方案3:确保数据集的因子一致性

在转换二分类时,直接将Species转成因子,避免后续拆分后类型混乱:

# 转换为二分类时直接生成因子
iris$Species <- factor(ifelse(iris$Species == "setosa", "setosa", "other"))

完整修正代码

# Load libraries
library(MASS)
library(caret)
library(nnet) 

# Loading iris dataset
data(iris)

# Convert it into a binary class dataset(直接转成因子)
iris$Species <- factor(ifelse(iris$Species == "setosa", "setosa", "other"))

# Split the dataset
set.seed(123)
trainIndex <- createDataPartition(iris$Species, p = .8, 
                                  list = FALSE, 
                                  times = 1)
irisTrain <- iris[ trainIndex,]
irisTest  <- iris[-trainIndex,]

# Fit Logistic Regression
fit.glm <- multinom(Species ~ ., data = iris)

# Predict using Logistic Regression(直接取分类结果)
pred.glm <- predict(fit.glm, irisTest)
cm.glm <- confusionMatrix(pred.glm, irisTest$Species)
acc.glm <- cm.glm$overall['Accuracy']
prec.glm <- cm.glm$byClass['Pos Pred Value']
rec.glm <- cm.glm$byClass['Sensitivity']

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 16:42:51