帮助 - LibSVM的准确率达到100%?

时间:2011-08-23 00:21:52

标签: artificial-intelligence machine-learning computer-vision svm libsvm

名义上是一个很好的问题,但我很确定这是因为有趣的事情正在发生......

作为背景,我正在研究面部表情/识别空间中的问题,因此获得100%的准确度似乎令人难以置信地难以置信(并非在大多数应用程序中都是合理的......)。我猜测数据集中存在一些一致的偏差,它使得SVM过于容易地得出答案,=或=,更可能的是,我在SVM方面做错了。

我正在寻找建议,以帮助了解发生了什么 - 是我(=我对LibSVM的使用)?或者是数据?

细节:

  • 关于约2500个标记的数据向量/实例(个体的变换视频帧 - 总共<20个人),二进制分类问题。 ~900个功能/实例。不平衡数据的比率约为1:4。
  • Ran subset.py将数据分成测试(500个实例)和训练(剩余)。
  • 跑“svm-train -t 0”。 (注意:显然不需要'-w1 1 -w-1 4'......)
  • 在测试文件上运行svm-predict。精度= 100%!
事情尝试了:

  • 检查了大约10次我没有训练&amp;通过一些无意的命令行参数错误测试相同的数据文件
  • 多次重新运行subset.py(甚至使用-s 1),并且只训练/测试了多个不同的数据集(如果我随机选择最神奇的火车/测试pa
  • 运行了一个简单的类似diff的检查,以确认测试文件不是训练数据的子集
  • svm-scale对数据的准确性没有影响(准确度= 100%)。 (虽然支持向量的数量确实从nSV = 127,bSV = 64到nBSV = 72,bSV = 0。)
  • ((怪异))使用默认的RBF内核(副线性 - 即删除'-t 0')导致准确性变为垃圾(?!)
  • (健全性检查)使用针对未缩放数据集的缩放数据集训练的模型运行svm-predict导致精度= 80%(即,它总是猜测主导类)。这绝对是一个完整性检查,以确保svm-predict在名义上在我的机器上正常运作。

初步结论?:

数据的某些东西被淹没 - 不知何故,在数据集中,有一个微妙的,实验者驱动的效果,SVM正在接受。

(首先,这不解释为什么RBF内核会产生垃圾结果。)

非常感谢有关a)如何修复我对LibSVM的使用(如果这实际上是问题)或b)确定LibSVM数据中的微妙实验者偏见的任何建议。

2 个答案:

答案 0 :(得分:11)

另外两个想法:

确保您没有对同一数据进行培训和测试。这听起来有点愚蠢,但在计算机视觉应用中,你应该注意:确保你没有重复数据(比如同一个视频的两个帧落在不同的折叠上),你不是在同一个人的训练和测试等等。它比听起来更微妙。

确保搜索RBF内核的gamma和C参数。有很好的理论(渐近)结果证明线性分类器只是简并RBF分类器。所以你应该寻找一个好的(C,gamma)对。

答案 1 :(得分:10)

尽管魔鬼在细节中,但您可以尝试三种简单的测试:

  1. 快速(约2分钟):通过决策树算法运行数据。这可以通过classregtree在Matlab中找到,也可以加载到R并使用rpart。这可以告诉您是否只有一个或几个功能可以完美分离。
  2. 不那么快(约10-60分钟,取决于您的基础设施):迭代分割功能(即从900到2组450),训练和测试。如果其中一个子集为您提供了完美的分类,请再次拆分。只需不到10个这样的拆分就可以找出问题变量的位置。如果碰巧“中断”剩余许多变量(或者甚至在第一次拆分中),选择一个不同的随机特征子集,一次减少更少的变量,等等。它不可能需要全部900来分割数据
  3. 更深入的分析(几分钟到几个小时):尝试标签的排列。如果您可以置换所有这些并且仍然可以完美分离,那么您的列车/测试设置就会出现问题。如果选择越来越大的子集进行置换(或者,如果向另一个方向移动,则保留静态),您可以看到开始失去可分性的位置。或者,考虑减少你的训练集大小,如果你的训练集非常小,你就可以分离,那就有些奇怪了。
  4. 方法#1快速&amp;应该是富有洞察力的。我可以推荐其他一些方法,但#1和#2很容易,如果他们没有给出任何见解,那就太奇怪了。