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

sev*_*ian 13 artificial-intelligence machine-learning svm computer-vision 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次我没有训练和测试相同的数据文件
  • 多次重新运行subset.py(甚至使用-s 1)并且仅训练/测试多个不同的数据集(如果我随机地在最神奇的火车/测试pa上
  • 运行一个简单的diff-like检查以确认测试文件不是训练数据的子集
  • 数据上的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数据中的哪些微妙的实验者偏见正在接受.

car*_*sdc 11

另外两个想法:

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

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


Ite*_*tor 10

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

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

方法#1很快,应该很有见地.我可以推荐一些其他的方法,但#1和#2很容易,如果他们没有提供任何见解会很奇怪.