TPR&不同分类器的FPR曲线 - kNN,NaiveBayes,R中的决策树

时间:2015-12-17 12:51:31

标签: r machine-learning classification roc

我试图理解和绘制不同类型分类器的TPR / FPR。我在R中使用kNN,NaiveBayes和Decision Trees。对于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是训练数据,diabetest.testing是testing.data。

Plot如下所示: enter image description here

prob属性中存储的值是一个数字向量(0到1之间的小数)。我将类标签因子转换为数字,然后我可以将它与ROCR库中的谓词/性能函数一起使用。不是100%肯定我做得对,但至少它是有效的。

对于NaiveBayes和Decision Trees而言,在预测函数中使用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中我得到一个向量而对于其他分类我将它们分别用于两个类?

2 个答案:

答案 0 :(得分:0)

ROC曲线

您为knn11分类器提供的ROC曲线看起来很低 - 它低于对角线,表示您的分类器正确地分配了类别标签 less 超过50%的时间。最有可能的是,您提供了错误的类别标签或错误的概率。如果在训练中你使用0和1的类标签 - 那些相同的类标签应该以相同的顺序传递给ROC曲线(没有0和一个翻转)。

另一个不太可能的可能性是你有一个非常奇怪的数据集。

其他分类器的概率

开发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

你只需要选择一个概率 - 一个事件的概率 - 可能是“tests_positive”。另一个“measured_negative”只是1-tested_positive,因为当某个人患有糖尿病的分类器有79%的可能性时 - 他同时“认为”该人有21%的机会没有患糖尿病。但是你只需要一个数字来表达这个想法,所以knn只返回一个,而其他分类器可以返回两个。

我不知道您使用哪个库作为决策树,因此无法帮助该分类器的输出。

答案 1 :(得分:0)

看起来你从根本上就错了。 enter image description here

理想情况下,KNN 图看起来像上面的图。您可以使用以下几点。

  1. 在代码中计算距离。
  2. 使用下面的代码在python中进行预测

预测类

print(model_name.predict(test))

3 个最近的邻居

print(model_name.kneighbors(test)[1])