【问题标题】:TPR & FPR Curve for different classifiers - kNN, NaiveBayes, Decision Trees in R不同分类器的 TPR 和 FPR 曲线 - R 中的 kNN、朴素贝叶斯、决策树
【发布时间】:2016-03-23 22:48:05
【问题描述】:

我正在尝试了解和绘制不同类型分类器的 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 是训练数据,diabetest.testing 是 testing.data。

情节如下所示:

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

对于 NaiveBayes 和决策树,在 predict 函数中指定 prob/raw 参数时,我得到的不是单个数字向量,而是一个列表或矩阵向量,其中指定了每个类的概率(我猜),例如:

diabetes.model <- naiveBayes(class ~ ., data = diabetesTrainset)
diabetes.predicted <- predict(diabetes.model, diabetesTestset, type="raw")

和糖尿病预测是:

     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 中我得到一个向量而对于其他分类器我将它们分别用于两个类?

【问题讨论】:

    标签: r machine-learning classification roc


    【解决方案1】:

    ROC曲线

    您为knn11 分类器提供的 ROC 曲线看起来不正确 - 它位于对角线下方,表明您的分类器正确分配类标签的几率少于 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
    

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

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

    【讨论】:

      【解决方案2】:

      看起来你从根本上是错误的。

      理想情况下,KNN 图看起来像上面一个。这里有几点你可以使用。

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

      预测类

      print(model_name.predict(test))

      3 个最近的邻居

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

      【讨论】:

        猜你喜欢
        • 2012-05-06
        • 2011-10-20
        • 2021-10-31
        • 2017-01-10
        • 2014-07-12
        • 2013-06-23
        • 2018-07-17
        • 2018-02-06
        相关资源
        最近更新 更多