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曲线的主干

我错了,但我不知道在哪里.也许我错误地计算了FP,FN,TP,TN,特别是当分类器的结果小于阈值时,所以我丢弃了.当丢弃时我必须增加什么?
背景
我正在回答这个问题,因为我需要处理这些内容,这样的问题是一个很好的借口.谢谢你的好机会.
我使用来自内置渔夫虹膜数据的数据: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
您是否将数据集分为训练集、交叉验证集和测试集?(如果你不划分数据,你的精确率-召回率曲线看起来很奇怪,这是正常的)
编辑:我认为您的问题有两个可能的来源:
正如您所说,要为“复合”分类器选择输出,您必须将新的(测试)数据点通过五个分类器,然后选择概率最大的一个。
然后,您应该有 5 个阈值来定义权重值,我会优先选择一个分类器而不是其他分类器。您应该检查 matlab 实现如何使用阈值,但它们的效果是您不会选择概率更大的类,而是选择加权概率更好的类。
我认为你可以从混淆矩阵中获得每个子分类器的TP、TN、FP、FN数据(记住你正在计算5个单独的分类器,即使你没有意识到)。我不确定,但你可以为每个子分类器绘制精确召回曲线。
另请检查这些幻灯片:http://www.slideserve.com/MikeCarlo/multi-class-and-structed-classification
我不知道 ROC 曲线是什么,我会检查一下,因为机器学习对我来说是一个非常有趣的主题。
希望这可以帮助,