如何计算roc曲线?

时间:2012-10-19 18:26:28

标签: matlab classification threshold false-positive roc

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

我想要用阈值参数化我的系统的性能,值为0到100.对于每个阈值,对于每个观察,如果属于一个群集的概率大于阈值,我接受结果分类器,否则我丢弃它。

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

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

sensitivity = TP/(TP+FN);

specificity=TN/(TN+FP);

在matlab中:

plot(1-specificity,sensitivity);

获得ROC曲线。但结果并不是我所期望的。

这是丢弃,错误,纠正,敏感性和特异性功能的图,改变了一个动作的阈值。

This is the plot of the functions of discards, errors, corrects, sensitivity and specificity varying the threshold

这是一个动作的ROC曲线图 This is the plot of ROC curve

这是同一动作的ROC曲线的主干 enter image description here

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

2 个答案:

答案 0 :(得分:5)

<强>背景

我正在回答这个问题,因为我需要处理这些内容,这样的问题是一个很好的借口。谢谢你的好机会。

我使用来自内置渔夫虹膜数据的数据: http://archive.ics.uci.edu/ml/datasets/Iris

我还使用Mathworks教程中的分类和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')

display of the data

<强>分析

假设我们想要确定定义“virginica”与“non-virginica”的线性分类器的界限。我们可以看看其他课程的“自我与非自我”,但他们会有自己的

现在我们制作一些线性判别式并为它们绘制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)

结果显示如下,但删除了对角线的重复副本:

enter image description here

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

因此,这将为您提供“内置”ROC,这对于快速工作很有用,但不会让您详细了解每一步。

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

  • 哪个分类器最好?在这种情况下,如何确定最佳状态?
  • 分类器的凸壳是什么?是否存在一些比任何纯方法更具信息量的分类器混合?套袋也许?

答案 1 :(得分:-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

您是在训练集,交叉验证集和测试集中划分数据集吗? (如果不分割数据,那么精确回忆曲线看起来很奇怪是正常的)

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

  1. 当您为5个班级训练分类器时,通常您需要训练5个不同的分类器。一个分类器(A类= 1级,B类= 2级,3级,4级或5级),然后是(A类= 2级,B类= 1级,3级,4级或5级)的第二个分类器,...并且第五类为A类=第5类,B类=第1,2,3或4类)。
  2. 正如您所说的为“复合”分类器选择输出时,您必须通过五个分类器传递新的(测试)数据点,并选择概率最大的分类器。

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

    1. 正如你所说,也许你不能很好地计算TP,TN,FP,FN。您的测试数据应具有属于所有类的数据点。然后你有testdata(i,:)和classtestdata(i)是数据点i的特征向量和“地面实况”类。当您评估分类器时,您获得classifierOutput(i)= 1或2或3或4或5.然后您应该计算“混淆矩阵”,这是在有多个类时计算TP,TN,FP,FN的方法(&gt; 2): http://en.wikipedia.org/wiki/Confusion_matrix http://www.mathworks.com/help/stats/confusionmat.html (注意你为多类问题计算的TP,TN,FP,FN之间的关系)
    2. 我认为您可以从混淆矩阵中获取每个子分类器的TP,TN,FP,FN数据(请记住,您正在计算5个单独的分类器,即使您没有意识到它)。我不确定,但您可以为每个子分类器绘制精确回忆曲线。

      另请查看以下幻灯片:http://www.slideserve.com/MikeCarlo/multi-class-and-structured-classification

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

      希望这有帮助,