13

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

作为上下文,我正在研究面部表情/识别空间中的一个问题,因此获得 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 次我没有对相同的数据文件进行训练和测试
  • 多次重新运行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 数据中的微妙实验者偏见的任何建议。

4

2 回答 2

11

另外两个想法:

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

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

于 2011-08-23T02:31:34.023 回答
10

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

  1. Quickie(约 2 分钟):通过决策树算法运行数据。这在 Matlab 中可用classregtree,或者您可以加载到 R 中并使用rpart。这可以告诉您是否有一个或几个功能恰好提供了完美的分离。
  2. 不那么快(约 10-60 分钟,取决于您的基础设施):迭代地拆分特征(即从 900 到 2 组 450)、训练和测试。如果其中一个子集为您提供了完美的分类,请再次拆分它。只需不到 10 次这样的拆分就可以找出问题变量的位置。如果它碰巧在剩余许多变量的情况下“中断”(甚至在第一次拆分中),请选择不同的随机特征子集,一次削减更少的变量等。它不可能需要全部 900 个来拆分数据.
  3. 更深入的分析(几分钟到几小时):尝试标签的排列。如果您可以置换所有这些并仍然获得完美的分离,那么您的训练/测试设置就会出现问题。如果您选择越来越大的子集进行置换(或者,如果朝另一个方向前进,则保持静态),您可以看到您开始失去可分性的地方。或者,考虑减少你的训练集大小,如果即使训练集非常小,你也能获得可分离性,那么有些事情很奇怪。

方法#1 速度很快,应该很有洞察力。我可以推荐其他一些方法,但#1 和#2 很简单,如果它们不提供任何见解,那就太奇怪了。

于 2011-08-23T02:17:24.193 回答