我正在预测一个具有10个层次的变量,并使用rpart进行分类。生成表格的具体代码是
as.vector(t(table(predict(bb.rt,set[train,],type=”class”),response[train])))
但结果很差:观察类别→
预测类别↓
1 2 3 4 5 6 7 8 9 10 1 26.0 0.0 0.6 0.0 0.0 0 0.0 0 0.0 0.2 10 0.2 0.0 0.0 0.0 0.4 0 0.0 0 0.4 12.8 2 0.0 45.6 0.6 1.4 0.6 0 0.0 0 0.0 0.0 3 0.2 0.0 6.0 0.0 0.0 0 0.0 0 0.0 0.0 4 0.0 0.2 0.0 3.4 0.0 0 0.0 0 0.0 0.0 5 0.0 0.0 0.0 0.0 11.8 0 0.0 0 0.0 0.0 6 0.0 0.0 0.0 0.0 0.0 19 0.0 0 0.0 0.0 7 0.0 0.8 0.0 0.0 0.0 0 16.8 0 0.0 0.0 8 0.0 0.0 0.0 0.0 0.0 0 0.0 4 0.0 0.0 9 0.0 0.0 0.0 0.0 0.0 0 0.0 0 9.4 0.6
预测类别按字母顺序排序,但观察类别未按此顺序排序。我需要它们以相同的方式排序,以便我可以比较对角线上的值与其他值。
回答:
如果我正确理解了您的问题,似乎您只是想要一个混淆矩阵。
当然,手动计算这些并不难,但R的各种包中有(至少)十几个内置函数可以为您处理所有这些——数据处理、表格格式化、错误检查等。我在下方使用的内置函数还可以计算分类错误。
mda包有一个名为confusion的内置函数。使用方法如下:
> library(mda)> data(iris)> iris_fit = fda(Species ~., data=iris)> CM = confusion(predict(iris_fit, iris), iris$Species)> # 观察分类(真实)是按列排列的;> # 预测是按行排列的 > CM true predicted setosa versicolor virginica setosa 50 0 0 versicolor 0 48 1 virginica 0 2 49 attr(,"error") [1] 0.02
同样,CRAN上的第三方包中有更多函数可以计算混淆矩阵。
使用sos包对R包空间进行快速搜索,得到以下结果:
> library(sos)> findFn("confusion", maxPages=5, sortby="MaxScore")
我故意将搜索限制在前5页的结果(返回了87个独立函数)。从这些结果中,其他具有混淆矩阵函数的R包包括:
-
zmisclassification.matrix 在fpc包中
-
panr.confusion 在pamr包中
-
confusion 在DAAG包中