提问人:Kris 提问时间:12/17/2015 最后编辑:BraculaKris 更新时间:7/15/2023 访问量:1936
不同分类器的 TPR 和 FPR 曲线 - kNN、朴素贝叶斯、R 中的决策树
TPR & FPR Curve for different classifiers - kNN, NaiveBayes, Decision Trees in R
问:
我正在尝试理解和绘制不同类型的分类器的 TPR/FPR。我在 R 中使用 kNN、NaiveBayes 和决策树。使用 kNN,我正在执行以下操作:
clnum <- as.vector(diabetes.trainingLabels[,1], mode = "numeric")
dpknn <- knn(train = diabetes.training, test = diabetes.testing, cl = clnum, k=11, prob = TRUE)
prob <- attr(dpknn, "prob")
tstnum <- as.vector(diabetes.testingLabels[,1], mode = "numeric")
pred_knn <- prediction(prob, tstnum)
pred_knn <- performance(pred_knn, "tpr", "fpr")
plot(pred_knn, avg= "threshold", colorize=TRUE, lwd=3, main="ROC curve for Knn=11")
其中是我想要预测的标签(类)的向量,是训练数据,是测试数据。diabetes.trainingLabels[,1]
diabetes.training
diabetes.testing
存储在 prob 属性中的值是一个数值向量(十进制,介于 0 和 1 之间)。我将类标签因子转换为数字,然后我可以将其与 ROCR 库中的预测/性能函数一起使用。不是 100% 确定我做对了,但至少它有效。
对于 NaiveBayes 和决策树,在 predict 函数中指定了 prob/raw 参数,我没有得到一个单一的数字向量,而是一个列表或矩阵向量,其中指定了每个类的概率(我猜),例如:
diabetes.model <- naiveBayes(class ~ ., data = diabetesTrainset)
diabetes.predicted <- predict(diabetes.model, diabetesTestset, type="raw")
并且是:diabetes.predicted
tested_negative tested_positive
[1,] 5.787252e-03 0.9942127
[2,] 8.433584e-01 0.1566416
[3,] 7.880800e-09 1.0000000
[4,] 7.568920e-01 0.2431080
[5,] 4.663958e-01 0.5336042
问题是如何用它来绘制 ROC 曲线,为什么在 kNN 中我得到一个向量,而对于其他分类器,我将它们分别用于两个类?
答:
ROC曲线
您为分类器提供的 ROC 曲线看起来不对 - 它位于对角线下方,表示您的分类器正确分配类标签的时间不到 50%。最有可能的是,您提供了错误的类标签或错误的概率。如果在训练中使用了 0 和 1 的类标签 - 这些相同的类标签应以相同的顺序传递给 ROC 曲线(没有 0 和 1 翻转)。knn11
另一种不太可能的可能性是你有一个非常奇怪的数据集。
其他分类器的概率
ROC曲线被开发用于从雷达调用事件。从技术上讲,它与预测事件密切相关 - 您正确猜测从雷达接近的飞机的偶数的概率。所以它使用一种概率。当有人对两个“命中”概率不明显的类别进行分类时,这可能会令人困惑,例如在你有案例和对照的情况下。
但是,任何两个类别的分类都可以用“命中”和“未命中”来称呼 - 您只需要选择一个称为“事件”的类别。在您的情况下,患有糖尿病可能被称为事件。
所以从这个表中:
tested_negative tested_positive [1,] 5.787252e-03 0.9942127 [2,] 8.433584e-01 0.1566416 [3,] 7.880800e-09 1.0000000 [4,] 7.568920e-01 0.2431080 [5,] 4.663958e-01 0.5336042
你只需要选择一个概率 - 一个事件的概率 - 可能是“tested_positive”。另一个“tested_negative”只是因为在对特定人患有糖尿病进行分类时,有 79% 的几率——他同时“认为”该人有 21% 的几率没有糖尿病。但是你只需要一个数字来表达这个想法,所以 knn 只返回一个,而其他分类器可以返回两个。1-tested_positive
我不知道您为决策树使用了哪个库,因此无法帮助该分类器的输出。
理想情况下,KNN 图看起来像上面的图。以下是您可以使用的几点。
- 在代码中计算距离。
- 在 python 中使用以下代码进行预测
预测类
print(model_name.predict(test))
3 最近邻
print(model_name.kneighbors(test)[1])
评论