多类分类中 Scikit SVM 的输出总是给出相同的标签

机器算法验证 支持向量机 scikit-学习 libsvm 多级 机会
2022-03-15 17:23:45

我目前正在使用 Scikit learn 和以下代码:

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

然后对一组具有 7 个不同标签的数据进行拟合和预测。我得到了一个奇怪的输出。无论我使用哪种交叉验证技术,验证集上的预测标签总是标签 7。

我尝试了一些其他参数,包括完整的默认参数 ( svm.SVC()),但只要我使用的内核方法是rbf而不是,poly否则linear它就不起作用,而它对polyand非常有效linear

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

有没有人以前见过这种问题并且知道这里发生了什么?

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

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

2个回答

一个可能的原因是您没有调整模型。你需要找到好的价值观Cγ. 在您的情况下,默认值结果很糟糕,这导致了总是产生某个类的琐碎模型。如果一个类的实例比其他类多得多,这尤其常见。你的班级分布是什么?

scikit-learn 的超参数搜索功能有限,但您可以将它与像Optunity这样的调优库一起使用。此处提供了有关使用 Optunity 调整 scikit-learn SVC 的示例

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

问题确实是参数测试。我没有尝试何时gamma介于 0.0(即 1/n_feature)和 1 之间。关于我的数据gamma应该转向周围的东西1e-8