使用 SVM 进行分类的有效方法

机器算法验证 机器学习 支持向量机
2022-04-01 06:29:15

我正在使用 SVM 分类器 libsvm 进行二进制分类,其中大约 95% 属于一个类。

参数 C 和 gamma 将在实际训练发生之前设置。我按照教程进行了操作,但仍然没有得到任何好的结果。

库附带一个脚本,它应该有助于为参数选择正确的值,但这个脚本所做的基本上是最大化准确度指标 (TP+TN)/ALL,所以在我的情况下,它选择参数用流行的类标签标记所有数据。

我想选择基于召回和精度指标的参数。我怎么能解决这个问题。准确性对于我正在做的事情来说是一个毫无意义的指标。此外,我热衷于将库 libsvm 更改为可以帮助我解决此问题的任何其他库,只要它采用相同格式的数据即可。

1 1:0.3 2:0.4 ... -1 1.0.4 2:0.23 依此类推

有人可以帮忙吗?

更新:是的,我确实尝试了 grid.py 和 easy.py,但即使网格搜索使用对数刻度,它也非常慢。我的意思是,即使我只在一小部分数据上运行它,也需要数十小时才能完成。这是使用 SVM 最有效的方法吗?也尝试过 svmlight,但它的作用完全相同,它用一个标签标记所有数据。

UPDATE2:我修改了我的问题,以更好地反映我面临的问题

2个回答

我会做两件事。首先,为了解决由于数据不平衡导致的准确性问题,您需要分别设置错误分类正例和负例的成本。在您的情况下,一个合理的经验法则是将大班的成本设置为 5,小班的成本设置为 95。这样,对较小类别的 10% 进行错误分类将与对较大类别的 10% 进行错误分类具有相同的成本,即使后者 10% 的点数要大得多。如果你使用命令行,命令类似于 -w0 5 -w1 95。我觉得无论如何都需要这样做(即使你现在使用 F 分数)因为这是 SVM 优化的,所以除非你这样做,你所有的 F 分数都会很差。

其次,为了解决速度问题,我会尝试预先计算内核。对于 26k 点,这是不可行的,但如果您愿意进行二次采样,您可以为每个 gamma 预先计算一次内核,并在所有 C 中重用它。

默认情况下,libSVM 使用交叉验证方法和使用准确度(用于分类)或均方误差(用于回归)作为评估度量的 SVM 模型找到最佳超参数。

Weka 还有其他几个评估指标来找到最佳参数(使用 gridSearch)

如果您感兴趣的指标不存在,那么想到的最简单的解决方案是编写一个执行交叉验证的小程序,并根据您选择的指标优化模型的参数。