多类分类中的Scikit SVM输出始终给出相同的标签


10

我目前正在使用带有以下代码的Scikit学习:

clf = svm.SVC(C=1.0, tol=1e-10, cache_size=600, kernel='rbf', gamma=0.0, 
              class_weight='auto')

然后用7个不同的标签拟合并预测一组数据。我得到了一个奇怪的输出。无论我在验证集上使用预测的标签是哪种交叉验证技术,始终都是标签7。

我尝试了其他一些参数,包括完整的默认参数one(svm.SVC()),但是只要我使用的内核方法rbf代替,poly否则linear它将无法工作,而对于polyand 来说确实很好linear

此外,我已经尝试对火车数据而不是验证数据进行预测,它非常适合。

有人以前见过这种问题,知道这里发生了什么吗?

我从不详细查看我的班级分布,但我知道应该有30%左右是7、14%是4。

我什至尝试手动进行1-vs-rest实施,但仍然没有帮助。


您的数据属于每个类别的比例是多少?
gung-恢复莫妮卡

我的数据中确实有更多的“ 7”,但不多。其中约30%是7。@gung
Tamaki Sakura

Answers:


10

可能的原因是您没有调整模型。您需要为和找到合适的值。在您的情况下,默认值很糟糕,这会导致琐碎的模型始终产生特定的类。如果一个类的实例比其他类多得多,则这特别常见。你的班级分布是什么?γCγ

scikit-learn的超参数搜索功能有限,但是您可以将其与Optunity之类的调整库一起使用。此处提供有关通过Optunity调整scikit-learn SVC的示例。

免责声明:我是Optunity的首席开发人员。


实际上,我一直努力尝试将C和伽马的每种组合(从0到4为10的幂)进行尝试,但是所有这些都给了我7分。我什至开始怀疑我是否以正确的方式编译scikit学习。
玉木樱

8

问题确实出在参数测试上。我没有尝试何时gamma介于0.0(即1 / n_feature)和1之间。关于我的数据,我gamma应该将其转向1e-8


4
这是很合理的。值太大会导致内核矩阵接近单位矩阵。每个预测最终都将成为偏差项(因为所有内核评估都非常接近于零),在您的情况下,这恰好导致了7类。γ
马克·克拉森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.