8

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

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

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

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

sensitivity = TP/(TP+FN);

specificity=TN/(TN+FP);

在matlab中:

plot(1-specificity,sensitivity);

得到 ROC 曲线。但结果不是我所期望的。

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

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

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

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

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

4

2 回答 2

5

背景

我正在回答这个问题,因为我需要研究内容,而这样的问题是一个很好的借口。谢谢你的好机会。

我使用来自内置 Fisher 鸢尾花数据的数据: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”的线性分类器的界限。我们可以查看其他类的“self vs. not-self”,但它们会有自己的

所以现在我们做一些线性判别式并为它们绘制 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,这对快速工作很有用,但不会让你详细学习每一步。

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

  • 哪个分类器最好?在这种情况下,我如何确定什么是最好的?
  • 分类器的凸包是什么?是否存在比任何纯方法都提供更多信息的分类器组合?也许是装袋?
于 2013-12-27T17:20:06.077 回答
-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

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

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

  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 的特征向量和“ground truth”类。当你评估分类器时,你得到分类器输出(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-structured-classification

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

希望这可以帮助,

于 2012-10-19T18:46:29.303 回答