【问题标题】:how to calculate roc curves?如何计算roc曲线?
【发布时间】:2012-10-10 10:08:49
【问题描述】:

我编写了一个分类器(高斯混合模型)来对五种人类行为进行分类。对于每个观察,分类器都会计算属于某个集群的后验概率。

我想用阈值来评估我的系统的性能,阈值从 0 到 100。对于每个阈值,对于每个观察,如果属于某个集群的概率大于阈值,我接受结果分类器,否则我将其丢弃。

对于每个阈值,我计算真阳性、真阴性、假阳性、假阴性的数量。

比我计算两个函数:敏感性和特异性为

sensitivity = TP/(TP+FN);

specificity=TN/(TN+FP);

在matlab中:

plot(1-specificity,sensitivity);

拥有 ROC 曲线。但结果不是我所期望的。

这是改变一个动作的阈值的丢弃、错误、纠正、敏感性和特异性的函数图。

这是一个动作的ROC曲线图

这是同一动作的 ROC 曲线的主干

我错了,但我不知道在哪里。也许我做错了FP,FN,TP,TN的计算,特别是当分类器的结果小于阈值时,所以我有一个丢弃。有丢弃时我必须增加什么?

【问题讨论】:

  • 关心显示您的一些代码和数据...很难知道最终产品发生了什么。作为旁注,您展示的第一个数字看起来不正确(不知道机械原理,很难说 sens 的任何一个规范是否错误)
  • 你可以看看下面的例子。 saedsayad.com/flash/RocGainKS.html 这个动画展示了如何计算不同阈值的 TPR 和 FPR 并绘制它。

标签: matlab classification threshold false-positive roc


【解决方案1】:

您正在尝试根据分类器阈值参数绘制准确率与召回率的曲线。准确率和召回率的定义是:

Precision = TP/(TP+FP)

Recall = TP/(TP+FN)   

您可以在以下位置查看这些参数的定义: http://en.wikipedia.org/wiki/Precision_and_recall

这里有一些曲线: http://www.cs.cornell.edu/courses/cs578/2003fa/performance_measures.pdf

您是否将数据集划分为训练集、交叉验证集和测试集? (如果你不划分数据,你的precision-recall曲线看起来很奇怪是正常的)

已编辑:我认为您的问题有两个可能的来源:

  1. 当你为 5 个类训练一个分类器时,通常你必须训练 5 个不同的分类器。一个分类器用于(A 类 = 1 类,B 类 = 2、3、4 或 5 类),然后是(A 类 = 2 类,B 类 = 1、3、4 或 5 类)的第二个分类器,.. . 和第五个 A 级 = 5 级,B 级 = 1、2、3 或 4 级)。

正如您所说,要为“复合”分类器选择输出,您必须将新(测试)数据点通过五个分类器,然后选择概率最大的一个。

然后,您应该有 5 个阈值来定义我优先选择一个分类器而不是其他分类器的权重值。您应该检查 matlab 实现如何使用阈值,但它们的效果是您不会选择概率更高的类,而是选择加权概率更好的类。

  1. 正如您所说,您可能没有很好地计算 TP、TN、FP、FN。您的测试数据应该具有属于所有类的数据点。然后你有 testdata(i,:) 和 classtestdata(i) 是数据点 i 的特征向量和“ground truth”类。当你评估分类器时,你得到分类器输出(i)= 1 或 2 或 3 或 4 或 5。然后你应该计算“混淆矩阵”,这是当你有多个类时计算 TP、TN、FP、FN 的方法(> 2): http://en.wikipedia.org/wiki/Confusion_matrix http://www.mathworks.com/help/stats/confusionmat.html (注意您为多类问题计算的 TP、TN、FP、FN 之间的关系)

我认为你可以从混淆矩阵中获得每个子分类器的 TP、TN、FP、FN 数据(记住你是在计算 5 个单独的分类器,即使你没有意识到)。我不确定,但您可以为每个子分类器绘制精确召回曲线。

还可以查看这些幻灯片:http://www.slideserve.com/MikeCarlo/multi-class-and-structured-classification

我不知道ROC曲线是什么,我会检查一下,因为机器学习对我来说是一个非常有趣的主题。

希望对你有帮助,

【讨论】:

  • 是的,我将数据集分为训练集、交叉验证集和测试集。正如您所看到的丢弃、错误和纠正的功能,改变一个动作的阈值(图 n°1)是好的。问题在于其他两个功能的敏感性和特异性。
  • 再次检查我的答案。我已经对其进行了编辑,试图回答如何识别多类问题的阈值和 TP、TN、...。
  • 很高兴您能在您的问题中进一步解释解决方案。它可以帮助其他用户。我很高兴你解决了你的问题。
  • 初始定义错误。精度!= 灵敏度,请查看。
  • sensitivity =/= Precision!!!! 1 - specificity =/= recall!!!!。 1 - specificity 称为 False Positive Rate (FPR),RecallSensitivity跨度>
【解决方案2】:

背景

我之所以回答这个问题是因为我需要仔细研究内容,而这样的问题是一个很好的借口。谢谢你的好机会。

我使用来自内置 Fisher iris 数据的数据: http://archive.ics.uci.edu/ml/datasets/Iris

我还使用 Mathworks 分类教程中的代码 sn-ps 和 plotroc

问题描述

域内有更清晰的边界来分类“setosa”,但“versicoloir”与“virginica”有重叠。这是一个二维图,并且已经丢弃了一些其他信息来生成它。在这种情况下,分类边界的模糊性是有用的。

%load data
load fisheriris

%show raw data
figure(1); clf
gscatter(meas(:,1), meas(:,2), species,'rgb','osd');
xlabel('Sepal length');
ylabel('Sepal width');
axis equal
axis tight
title('Raw Data')

分析

假设我们要确定定义“virginica”与“non-virginica”的线性分类器的界限。我们可以查看其他类的“self vs. not-self”,但它们会有自己的

所以现在我们制作一些线性判别式并为它们绘制 ROC:

%load data
load fisheriris
load iris_dataset

irisInputs=meas(:,1:2)';
irisTargets=irisTargets(3,:);

ldaClass1 = classify(meas(:,1:2),meas(:,1:2),irisTargets,'linear')';
ldaClass2 = classify(meas(:,1:2),meas(:,1:2),irisTargets,'diaglinear')';
ldaClass3 = classify(meas(:,1:2),meas(:,1:2),irisTargets,'quadratic')';
ldaClass4 = classify(meas(:,1:2),meas(:,1:2),irisTargets,'diagquadratic')';
ldaClass5 = classify(meas(:,1:2),meas(:,1:2),irisTargets,'mahalanobis')';

myinput=repmat(irisTargets,5,1);
myoutput=[ldaClass1;ldaClass2;ldaClass3;ldaClass4;ldaClass5];
whos
plotroc(myinput,myoutput)

结果如下所示,虽然它需要删除对角线的重复副本:

您可以在代码中注意到我堆叠“myinput”和“myoutput”并将它们作为输入提供给“plotroc”函数。您应该将分类器的结果作为目标和实际值,并且可以获得类似的结果。这会将分类器的实际输出与目标值的理想输出进行比较。这些是 plotroc 的输入。

所以这会给你“内置”ROC,这对于快速工作很有用,但不会让你详细了解每一步。

此时您可以提出的问题包括:

  • 哪个分类器最好?在这种情况下,我如何确定什么是最好的?
  • 什么是分类器的凸包?是否存在比任何纯方法都提供更多信息的分类器组合?也许是装袋?

【讨论】:

    猜你喜欢
    • 2012-11-30
    • 2016-08-27
    • 2020-09-19
    • 2015-11-24
    • 2019-06-21
    • 2021-05-25
    • 2018-05-24
    • 2021-11-19
    • 2018-01-03
    相关资源
    最近更新 更多