不平衡数据的 LibSVM 成本权重不起作用

机器算法验证 支持向量机 matlab 不平衡类 libsvm
2022-03-19 14:05:44

我有一个数据集,其中负标记值的数量是正标记值数量的 163 倍。也就是说,我有一个不平衡的数据集。我试过了:

model = svmtrain(trainLabels, trainFeatures, '-h 0 -b 1 -s 0 -c 10 -w1 163 -w-1 1');
[predicted_label, accuracy, prob_estimates] = svmpredict(testLabels, testFeatures, 
                                                         model, '-b 1');

准确率接近 99%。我搜索并找到了一个帖子 (#7) [死链接?] 上面写着:

您是否尝试过以较小的比例加权(即:<1)

我将模型更改为:

model = svmtrain(trainLabels, trainFeatures, '-h 0 -b 1 -s 0 -c 10 -w1 0.5 -w-1 0.003');
[predicted_label, accuracy, prob_estimates] = svmpredict(testLabels, testFeatures, 
                                                         model, '-b 1');

由于数据不平衡,我每次仍然有很高的准确性。有任何想法吗?

PS:我正在尝试实施2008年KDD杯的第一个挑战-乳腺癌。我想按降序对候选人进行排名。

3个回答

我只知道使用 SVM 处理不平衡集的两种方法:

  1. 使用 bagging:您创建数据的引导样本,以便您解决大量平衡问题。您对它们中的每一个都训练一个 SVM,然后对生成的分类器集合使用多数投票。

  2. 如果您使用的是 C-SVM,那么您可以重新加权错误分类成本,

Ciψi
转化为 其中,分别。是正例的索引集,分别是。对于反面例子。您选择新的软边距常数,使得,其中分别是正样本和负样本的数量。
C+iϵI+ψi+CiϵIψi
I+IC+C=nn+n+n

答案:删除 -b 1 或使其成为 -b 0

-b probability_estimates:是否为概率估计训练 SVC 或 SVR 模型,0 或 1(默认 0)

我遇到了同样的问题,并通过谷歌搜索发现了这篇文章。显然它不适用于概率估计。

如果您正在执行排名任务,则根据 ROC 曲线下的面积来评估您的系统可能更有意义!在我看来,排序任务的准确性不一定是您想要优化系统的目的。

对于您的问题,您的数据有多倾斜?在处理生物医学分类中的倾斜数据方面已经做了很多工作(因为这在生物医学中出现了很多)。我的博士导师写了一个算法,叫做成本成比例的拒绝抽样,我认为它可以满足你的需求——我很确定我们最终使用它是LibSVM因为同样的问题!简而言之,该算法解决了错误分类成本不成比例的问题(例如,如果 100 个文档中有一个描述了一种感兴趣的疾病,您不想错过该文档)。它根据成本函数对数据进行重新采样

P(c)=Cost(c)max[Cost(c), cC]

换句话说,每个样本都根据类样本由该样本的误分类成本除以样本误分类成本来确定。PcCost(c)