如何让data与reference拥有相同因子水平?解决confusionMatrix报错
解决confusionMatrix因子水平不匹配的错误
错误原因
你遇到的Error: data and reference should be factors with the same levels错误,核心问题有两个:
- 预测结果
pred.glm是字符向量,而真实标签irisTest$Species是因子类型,两者类型不匹配 - 即便转成因子,
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
相关产品推荐
相关产品推荐

