问题 混淆矩阵中的错误:数据和参考因子必须具有相同的级别数


我用R插入符训练了一个线性回归模型。我现在正在尝试生成混淆矩阵并继续收到以下错误:

confusionMatrix.default出错(pred,测试$ Final): 数据和参考因子必须具有相同的级别数

EnglishMarks <- read.csv("E:/Subject Wise Data/EnglishMarks.csv", 
header=TRUE)
inTrain<-createDataPartition(y=EnglishMarks$Final,p=0.7,list=FALSE)
training<-EnglishMarks[inTrain,]
testing<-EnglishMarks[-inTrain,]
predictionsTree <- predict(treeFit, testdata)
confusionMatrix(predictionsTree, testdata$catgeory)
modFit<-train(Final~UT1+UT2+HalfYearly+UT3+UT4,method="lm",data=training)
pred<-format(round(predict(modFit,testing)))              
confusionMatrix(pred,testing$Final)

生成混淆矩阵时会发生错误。两个对象的级别相同。我无法弄清问题是什么。它们的结构和水平如下。它们应该是一样的。任何帮助将非常感谢,因为它让我破解!

> str(pred)
chr [1:148] "85" "84" "87" "65" "88" "84" "82" "84" "65" "78" "78" "88" "85"  
"86" "77" ...
> str(testing$Final)
int [1:148] 88 85 86 70 85 85 79 85 62 77 ...

> levels(pred)
NULL
> levels(testing$Final)
NULL

4960
2018-05-02 11:57


起源

线索正好在str的输出中。看看它们有何不同? pred属于类字符,测试$ Final是类整数。当你在这里打电话格式 pred<-format(round(predict(modFit,testing))),它将它转换为字符格式,就像提供列表时那样。你为什么要格式化?你可能应该计算模型的RMSE或MAE,看看这个 heuristically.wordpress.com/2013/07/12/... - infominer
@infominer现在我通过使用pred <-as.integer(格式(round(predict(modFit,testing))))命令将char结果转换为int,但仍然存在与之前相同的错误。我不知道我在哪里我错了。 - abcd


答案:


table(pred) 和 table(testing$Final)。您将看到测试集中至少有一个数字从未被预测过(即从未出现过) pred)。这就是“不同级别”的原因。有一个自定义函数的例子可以解决这个问题 这里

但是,我发现这个技巧很好用:

table(factor(pred, levels=min(test):max(test)), 
      factor(test, levels=min(test):max(test)))

它应该给你与函数完全相同的混淆矩阵。


6
2018-05-10 04:25





confusionMatrix(pred,testing$Final)

每当您尝试构建混淆矩阵时,请确保真值和预测值都是因子数据类型。

这里有pred和 testing$Final 必须是类型 factor。而不是检查级别,检查两个变量的类型,如果不是,则将它们转换为因子。

这里 testing$final 是类型 int。将其转化为因子,然后构建混淆矩阵。


2
2017-07-31 09:36





像下面这样的东西似乎对我有用。这个想法类似于@nayriz:

confusionMatrix(
  factor(pred, levels = 1:148),
  factor(testing$Final, levels = 1:148)
)

关键是要确保因子水平匹配。


1
2018-04-30 20:57