如何计算roc曲线?

Mar*_*ore 8 matlab classification false-positive threshold roc

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

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

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

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

sensitivity = TP/(TP+FN);

specificity=TN/(TN+FP);
Run Code Online (Sandbox Code Playgroud)

在matlab中:

plot(1-specificity,sensitivity);
Run Code Online (Sandbox Code Playgroud)

有ROC曲线.但结果并不是我所期望的.

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

这是丢弃,错误,纠正,敏感性和特异性功能改变阈值的图

这是一个动作的ROC曲线图 这是ROC曲线的图

这是同一动作的ROC曲线的主干 在此输入图像描述

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

Eng*_*ica 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')
Run Code Online (Sandbox Code Playgroud)

显示数据

分析

让我们说我们想确定一个线性分类器的界限,它定义了"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)
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

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

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

您现在可以提出的问题包括:

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


jes*_*ana -1

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

Precision = TP/(TP+FP)

Recall = TP/(TP+FN)   
Run Code Online (Sandbox Code Playgroud)

您可以在以下位置检查这些参数的定义: 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 类)。

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

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

  1. 正如你所说,也许你没有计算好TP、TN、FP、FN。您的测试数据应该具有属于所有类的数据点。然后你有 testdata(i,:) 和 classtestdata(i) 是数据点 i 的特征向量和“groundtruth”类。当您评估分类器时,您将获得 classifierOutput(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-structed-classification

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

希望这可以帮助,

  • 最初的定义是错误的。精度!=灵敏度,请查看。 (2认同)
  • `灵敏度=/=精度`!!!! `1 - 特异性 =/= 召回`!!!!。**1 - 特异性**称为**假阳性率**(`FPR`),**召回率**与**灵敏度**相同 (2认同)