使用libSVM的SVM中的数据不平衡

时间:2013-09-30 08:42:30

标签: machine-learning svm libsvm

当我使用由75%'true'标签和25%'false'标签组成的不平衡数据集时,如何在libSVM中设置gamma和Cost参数?由于数据不平衡,我得到的所有预测标签都设置为“True”的常数错误。

如果问题不在于libSVM,而在于我的数据集,我应该如何从理论机器学习的角度处理这种不平衡? *我使用的功能数量在4-10之间,我有一小组250个数据点。

3 个答案:

答案 0 :(得分:6)

类不平衡与选择C和gamma无关,为了解决这个问题,你应该使用class weighting scheme,例如scikit-learn包(建立于libsvm} )

使用带有交叉验证的网格搜索执行最佳Cgamma的选择。您应该在此处尝试大量值,对于C,选择110^15之间的值是合理的,而gamma范围值的简单且良好的启发式是计算的所有数据点之间的成对距离,并根据此分布的百分位选择伽玛 - 考虑将每个点放入方差等于1/gamma的高斯分布 - 如果选择此分布重叠的gamma很多点你会得到非常“平滑”的模型,而使用小的方差会导致过度拟合。

答案 1 :(得分:6)

不平衡的数据集可以通过各种方式解决。类平衡对内核参数没有影响,例如RBF内核的gamma

两种最流行的方法是:

  1. 每个班级使用不同的错误分类处罚,这基本上意味着更改C。通常,最小的类得到更高的权重,常见的方法是npos * wpos = nneg * wneg。 LIBSVM允许您使用其-wX标志执行此操作。
  2. 对过多代表类进行子样本以获得相等数量的正面和负数,然后按照传统方式进行平衡训练。请注意,您基本上忽略了大量数据,这在直觉上是一个坏主意。

答案 2 :(得分:3)

我知道这个问题已经被问过了,但是我想回答一下,因为你可能会觉得我的答案很有用。

正如其他人所提到的,您可能需要考虑为少数群体使用不同的权重或使用不同的错误分类惩罚。但是,有一种更聪明的方法来处理不平衡的数据集。

您可以使用 SMOTE S ynthetic M inority O ver-sampling Te < / strong> chnique)算法为少数类生成合成数据。这是一个简单的算法,可以很好地处理一些不平衡的数据集。

在算法的每次迭代中,SMOTE会考虑少数类的两个随机实例,并在其间的某处添加相同类的人工示例。该算法继续用样本注入数据集,直到两个类变得平衡或一些其他标准(例如,添加一定数量的示例)。您可以在下面找到描述算法对2D特征空间中的简单数据集所执行操作的图片。

将权重与少数类相关联是此算法的一个特例。当您将权重$ w_i $与实例i关联时,您基本上是在实例i之上添加额外的$ w_i - 1 $实例!

SMOTE

  • 您需要做的是使用此算法创建的样本扩充初始数据集,并使用此新数据集训练SVM。您还可以在不同语言(如Python和Matlab)中找到许多在线实现。

  • 此算法还有其他扩展,如果您愿意,我可以为您指出更多资料。

  • 要测试分类器,您需要将数据集拆分为测试和训练,将合成实例添加到火车组(不添加任何测试集),训练模型列车设置,最后在测试集上测试。如果您在测试时考虑生成的实例,那么最终会产生偏差(并且可笑地更高)的准确性和召回。