我使用
mlr3
包和 mlr3learners
包构建了一个简单的 kNN 模型,使用 diabetes
包中的 mclust
数据集。我正在尝试使用 kNN 模型根据三个可用的数字特征(class
、glucose
、insulin
)来预测 sspg
类别,并使用 mlr3measures
包和混淆矩阵,因为我有兴趣评估某些类别是否比其他类别更容易被错误分类。我的问题是如何获得具有相对值的混淆矩阵?
使用以下代码我得到一个具有绝对值的混淆矩阵。
代码示例
# load packages
library(mlr3)
library(mlr3learners) # for classif.kknn
library(mlr3measures) # for confusion_matrix()
library(mclust) # for data(diabetes)
# load data
data(diabetes, package = "mclust")
diabetes <- as.data.table(diabetes)
# define task
diabetes_task <- as_task_classif(diabetes,
target = "class",
id = "diabetes")
# define ML algorithm
knn_model <- lrn('classif.kknn')
# partition data
splits <- partition(diabetes_task)
# train model
knn_model$train(diabetes_task,
row_ids = splits$train)
# test model
prediction <- knn_model$predict(diabetes_task,
row_ids = splits$test)
# evaluate performance
prediction$confusion
混淆矩阵
truth
response Chemical Normal Overt
Chemical 10 2 0
Normal 2 23 0
Overt 0 0 11
我想要一个具有相对值的混淆矩阵,而不是这个矩阵。我刚刚发现
confusion_matrix()
包中的 mlr3measures
函数包含一个用于获取相对值的参数(即 relative = TRUE
),但此函数仅在真相和响应标签只有两个因素时才有效。显然,在旧的 mlr
包中获得这一点相当简单。抱歉,如果问题有点基础,但是有没有一种简单的方法来获取相对值混淆矩阵?
正如评论中指出的,您可以简单地除以矩阵中所有值的总和:
prediction$confusion / sum(prediction$confusion)
truth
response Chemical Normal Overt
Chemical 0.25000000 0.06250000 0.04166667
Normal 0.00000000 0.45833333 0.00000000
Overt 0.00000000 0.00000000 0.18750000