首页 文章

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

提问于
浏览
13

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

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

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

细节:

  • 关于~2500个标记的数据向量/实例(个体的变换视频帧 - 总共<20个人),二进制分类问题 . ~900个功能/实例 . 不 balancer 数据的比率约为1:4 .

  • Ran subset.py将数据分成测试(500个实例)和训练(剩余) .

  • 然后"svm-train -t 0 " . (注意:显然不需要'-w1 1 -w-1 4' ...)

  • Ran 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数据中的哪些微妙的实验者偏见正在接受 .

2 回答

  • 11

    另外两个想法:

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

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

  • 10

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

    • Quickie(~2分钟):通过决策树算法运行数据 . 这可以在Matlab中通过 classregtree 获得,或者您可以加载到R并使用 rpart . 这可以告诉您是否只有一个或几个功能可以实现完美分离 .

    • 不那么快(约10-60分钟,取决于您的基础设施):迭代分割功能(即从900到2组450),训练和测试 . 如果其中一个子集为您提供了完美的分类,请再次拆分 . 找出问题变量的位置需要不到10次这样的拆分 . 如果碰到"break"并且剩余许多变量(或者甚至在第一次拆分中),请选择不同的随机特征子集,一次减少更少的变量,等等 . 它不可能需要全部900来分割数据 .

    • 更深入的分析(几分钟到几个小时):尝试标签的排列 . 如果您可以置换所有这些并且仍然可以完美分离,那么您的列车/测试设置就会出现问题 . 如果选择越来越大的子集进行置换(或者,如果向另一个方向移动,则保留静态),您可以看到开始失去可分性的位置 . 或者,考虑减少训练集的大小以及是否即使使用非常小的训练集,你也可以获得可分离性,然后有些东西很奇怪 .

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

相关问题