当我使用由 75% 的“真”标签和 25% 的“假”标签组成的不平衡数据集时,我应该如何在 libSVM 中设置我的 gamma 和 Cost 参数?由于数据不平衡,我不断收到将所有预测标签设置为“真”的错误。
如果问题不在于 libSVM,而在于我的数据集,那么从理论机器学习的角度来看,我应该如何处理这种不平衡?*我使用的功能数量在 4-10 之间,并且我有一小部分 250 个数据点。
当我使用由 75% 的“真”标签和 25% 的“假”标签组成的不平衡数据集时,我应该如何在 libSVM 中设置我的 gamma 和 Cost 参数?由于数据不平衡,我不断收到将所有预测标签设置为“真”的错误。
如果问题不在于 libSVM,而在于我的数据集,那么从理论机器学习的角度来看,我应该如何处理这种不平衡?*我使用的功能数量在 4-10 之间,并且我有一小部分 250 个数据点。
可以通过多种方式处理不平衡的数据集。gamma
类平衡对 RBF 内核等内核参数没有影响。
两种最流行的方法是:
C
。通常,最小的类的权重更高,一种常见的方法是npos * wpos = nneg * wneg
. LIBSVM 允许您使用它的-wX
标志来执行此操作。类不平衡与 C 和 gamma 的选择无关,要解决此问题,您应该使用例如包中可用的类加权方案scikit-learn
(建立在libsvm
)
C
最好的选择gamma
是使用带有交叉验证的网格搜索来执行的。您应该在这里尝试大范围的值,因为在 和C
之间选择值是合理的1
,10^15
而一个简单而良好的范围值启发式方法gamma
是计算所有数据点之间的成对距离并根据该分布的百分位数选择 gamma - 想想在每个点中放置一个方差等于的高斯分布1/gamma
- 如果您选择这样gamma
的分布重叠将有很多点,您将获得非常“平滑”的模型,而使用小方差会导致过度拟合。
我知道前段时间有人问过这个问题,但我想回答一下,因为您可能会发现我的回答很有用。
正如其他人所提到的,您可能需要考虑对少数类使用不同的权重或使用不同的错误分类惩罚。但是,有一种更聪明的方法来处理不平衡的数据集。
您可以使用SMOTE(Synthetic M inority O过采样技术)算法为少数类生成合成数据。这是一个简单的算法,可以很好地处理一些不平衡的数据集。
在算法的每次迭代中,SMOTE 都会考虑少数类的两个随机实例,并在其间某处添加同一类的人工示例。该算法不断地向数据集注入样本,直到两个类达到平衡或一些其他标准(例如添加一定数量的示例)。您可以在下面找到一张图片,该图片描述了该算法对 2D 特征空间中的简单数据集所做的工作。
将权重与少数类相关联是该算法的一个特例。当您将权重 $w_i$ 与实例 i 相关联时,您基本上是在实例 i 之上添加额外的 $w_i - 1$ 个实例!
你需要做的是用这个算法创建的样本来扩充你的初始数据集,并用这个新数据集训练 SVM。您还可以在线找到许多不同语言的实现,例如 Python 和 Matlab。
该算法还有其他扩展,如果您愿意,我可以为您指出更多材料。
要测试分类器,您需要将数据集拆分为测试和训练,将合成实例添加到训练集(不要添加到测试集),在训练集上训练模型,最后在测试集上对其进行测试。如果您在测试时考虑生成的实例,您最终会得到有偏差(而且高得离谱)的准确度和召回率。