名义上这是一个好问题,但我非常肯定是因为有些奇怪的事情发生了…
作为背景,我正在处理面部表情/识别领域的问题,因此获得100%的准确率似乎令人难以置信(并不是说它在大多数应用程序中是合理的…)。我猜要么是数据集存在一些一致的偏差,使得SVM非常容易提取答案,要么,更有可能的是,我在SVM方面做错了什么。
我正在寻找建议,以帮助我了解发生了什么——是我(我对LibSVM的使用)的问题?还是数据的问题?
详细信息:
- 大约~2500个标记的数据向量/实例(个体转换后的视频帧——总共<20个个体),二元分类问题。每个实例约~900个特征。不平衡的数据集,比例约为1:4。
- 运行subset.py将数据分成测试集(500个实例)和训练集(剩余的)。
- 运行 “svm-train -t 0 “。(注意:显然不需要’-w1 1 -w-1 4’…)
- 在测试文件上运行svm-predict。准确率=100%!
尝试过的方法:
- 检查了大约10次,确认我没有在相同的数据文件上进行训练和测试,没有因为某些无意的命令行参数错误。
- 多次重新运行subset.py(甚至使用-s 1),并且只对多个不同的数据集进行了训练/测试(以防我随机碰到了最神奇的训练/测试对)。
- 运行了一个简单的类似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正在捕捉到的数据中存在的哪些微妙的实验者偏差。
回答:
另外两个想法:
确保你没有在相同的数据上进行训练和测试。这听起来有点傻,但在计算机视觉应用中,你应该注意:确保你没有重复数据(例如,同一视频的两帧落在不同的折叠中),你没有在同一个人身上进行训练和测试等。这比听起来更微妙。
确保你搜索了RBF内核的gamma和C参数。有一些好的理论(渐近)结果证明线性分类器只是一个退化的RBF分类器。所以你应该寻找一个好的 (C, gamma) 对。