Matlab 如何计算roc曲线?

Matlab 如何计算roc曲线?,matlab,classification,threshold,false-positive,roc,Matlab,Classification,Threshold,False Positive,Roc,我编写了一个分类器(高斯混合模型)来对五种人类行为进行分类。对于每个观测,分类器计算属于一个簇的后验概率 我想用一个阈值来评估系统的性能,该阈值的值从0到100。对于每个阈值,对于每个观察,如果属于其中一个簇的概率大于阈值,我接受分类器的结果,否则我放弃它 对于每个阈值,我计算真阳性、真阴性、假阳性、假阴性的数量 然后我计算两个函数:敏感性和特异性 sensitivity = TP/(TP+FN); specificity=TN/(TN+FP); 在matlab中: plot(1-speci

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

我想用一个阈值来评估系统的性能,该阈值的值从0到100。对于每个阈值,对于每个观察,如果属于其中一个簇的概率大于阈值,我接受分类器的结果,否则我放弃它

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

然后我计算两个函数:敏感性和特异性

sensitivity = TP/(TP+FN);

specificity=TN/(TN+FP);
在matlab中:

plot(1-specificity,sensitivity);
要有ROC曲线。但结果并不是我所期望的

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

这是一个动作的ROC曲线图

这是相同动作的ROC曲线的茎


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

您正在尝试绘制精度与召回率的曲线,这取决于分类器阈值参数。精确性和召回率的定义如下:

Precision = TP/(TP+FP)

Recall = TP/(TP+FN)   
您可以在中检查这些参数的定义:

这里有一些曲线:

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

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

  • 当您为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实现如何使用阈值,但它们的效果是您没有选择概率更高的类,而是选择加权概率更好的类

  • 正如你所说,也许你没有很好地计算TP,TN,FP,FN。测试数据应该具有属于所有类的数据点。然后有testdata(i,:)和classtestdata(i)是数据点i的特征向量和“基本事实”类。对分类器求值时,得到ClassifierRoutPut(i)=1或2或3或4或5。然后,您应该计算“混淆矩阵”,这是当您有多个类(>2)时计算TP、TN、FP、FN的方法: (注意您为多类问题计算的TP、TN、FP、FN之间的关系)
  • 我认为您可以从混淆矩阵中获得每个子分类器的TP、TN、FP、FN数据(请记住,您正在计算5个单独的分类器,即使您没有意识到)。我不确定,但您可以为每个子分类器绘制精确召回曲线

    同时检查以下幻灯片:

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


    希望这有帮助,

    背景

    我回答这个问题是因为我需要通读内容,像这样的问题是一个很好的借口。谢谢你给我这个好机会

    我使用来自内置fisher iris数据的数据:

    我还使用了Mathworks教程中关于分类和plotroc的代码片段

    问题描述

    在“刚毛”的分类领域内有更清晰的界限,但“花鸟”与“维吉尼亚”之间有重叠。这是一个二维图,其他一些信息已被丢弃以生成它。在这种情况下,分类边界的模糊性是很有用的

    %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”的线性分类器的界限。我们可以在其他课程中看“自我与非自我”,但他们会有自己的课程

    现在我们制作一些线性判别式,并绘制它们的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,这对于快速工作非常有用,但不会让您详细了解每一步

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

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

    是,我将数据集分为训练集、交叉验证集和测试集。正如您可以看到的,丢弃、错误和纠正的功能,改变一个动作的阈值(图n°1)是很好的。问题是另外两个功能敏感性和特异性。请再次检查我的答案。我编辑了它,试图回答如何识别阈值和TP,TN。。。对于