我编写了一个分类器(高斯混合模型)来对五个人类行为进行分类。对于每个观察,分类器计算出属于一个聚类的后验概率。
我想评估使用阈值参数化的系统的性能,该阈值的范围是0到100。对于每个阈值,对于每个观察,如果属于一个集群的概率大于阈值,我将接受分类器的结果否则我将其丢弃。
对于每个阈值,我都会计算出真阳性,真阴性,假阳性,假阴性的数量。
比我计算两个函数:敏感性和特异性
sensitivity = TP/(TP+FN);
specificity=TN/(TN+FP);
在Matlab中:
plot(1-specificity,sensitivity);
具有ROC曲线。但是结果却不是我所期望的。
这是丢弃,错误,纠正,敏感性和特异性的功能图,它改变了一个 Action 的阈值。
这是一个 Action 的ROC曲线图
这是相同 Action 的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')
分析
假设我们要确定定义“virginica”与“non-virginica”的线性分类器的界限。我们可以在其他类(class)中查看“自我与非自我”,但是他们会有自己的
因此,现在我们进行一些线性判别并为它们绘制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,这对于快速工作很有用,但并不能使您详细了解每一步。
此时您可以提出的问题包括: