我写了一个分类器(高斯混合模型)来分类五个人类行为。对于每次观察,分类器计算属于群集的后验概率。
我想要用阈值参数化我的系统的性能,值为0到100.对于每个阈值,对于每个观察,如果属于一个群集的概率大于阈值,我接受结果分类器,否则我丢弃它。
对于每个阈值,我计算真阳性,真阴性,假阳性,假阴性的数量。
比我计算两个函数:灵敏度和特异性为
sensitivity = TP/(TP+FN);
specificity=TN/(TN+FP);
在matlab中:
plot(1-specificity,sensitivity);
获得ROC曲线。但结果并不是我所期望的。
这是丢弃,错误,纠正,敏感性和特异性功能的图,改变了一个动作的阈值。
这是一个动作的ROC曲线图
这是同一动作的ROC曲线的主干
我错了,但我不知道在哪里。也许我错误地计算了FP,FN,TP,TN,特别是当分类器的结果小于阈值时,所以我丢弃了。丢弃时我必须增加什么?
答案 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')
<强>分析强>
假设我们想要确定定义“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,这对于快速工作很有用,但不会让您详细了解每一步。
此时您可以提出的问题包括:
答案 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
您是在训练集,交叉验证集和测试集中划分数据集吗? (如果不分割数据,那么精确回忆曲线看起来很奇怪是正常的)
编辑:我认为您的问题有两种可能的来源:
正如您所说的为“复合”分类器选择输出时,您必须通过五个分类器传递新的(测试)数据点,并选择概率最大的分类器。
然后,你应该有5个阈值来定义加权值,我优先选择一个分类器而不是其他分类器。您应该检查matlab实现如何使用阈值,但它们的效果是您不选择具有更高概率的类,而是具有更好加权概率的类。
我认为您可以从混淆矩阵中获取每个子分类器的TP,TN,FP,FN数据(请记住,您正在计算5个单独的分类器,即使您没有意识到它)。我不确定,但您可以为每个子分类器绘制精确回忆曲线。
另请查看以下幻灯片:http://www.slideserve.com/MikeCarlo/multi-class-and-structured-classification
我不知道ROC曲线是什么,我会检查它,因为机器学习对我来说是一个非常有趣的主题。
希望这有帮助,