训练数据中具有不相等组大小的SVM


12

我正在尝试从训练数据构建一个SVM,其中一组代表的数量更多。但是,组将在最终的测试数据中均等地代表。因此,我想使用R包接口的class.weights参数来平衡两组在训练数据中的影响。e1071libsvm

由于我不确定应该如何指定这些权重,因此我进行了一些测试:

  1. 生成一些空数据(随机特征;组标签之间的比例为2:1)
  2. 使用class.weights参数集安装一个svm 。
  3. 预测一堆新的空数据集并查看类比例。
  4. 针对不同的空训练集重复整个过程很多次。

这是我正在使用的R代码:

nullSVM <- function(n.var, n.obs) {
    # Simulate null training data
    vars   = matrix(rnorm(n.var*n.obs), nrow=n.obs)
    labels = rep(c('a', 'a', 'b'), length.out=n.obs)
    data   = data.frame(group=labels, vars)

    # Fit SVM
    fit = svm(group ~ ., data=data, class.weights=c(a=0.5, b=1))

    # Calculate the average fraction of 'a' we would predict from null test data
    mean(replicate(50, table(predict(fit, data.frame(matrix(rnorm(n.var*n.obs), nrow=n.obs))))[1])) / n.obs
}

library(e1071)
set.seed(12345)
mean(replicate(50, nullSVM(50, 300)))

从这个整体来看,我期望输出〜0.5,但是,这不是我得到的:

> mean(replicate(50, nullSVM(50, 300)))
[1] 0.6429987

class.weights放慢参数工作,排序,作为下我的重量a,降低了它在这个模拟代表(如果我忽略class.weights它返回接近1)......但为什么仅仅使用1的权重,我不明白:2( (2:1)的训练数据并不能使我一路跌到50%。

如果我误解了SVM,有人可以解释这一点吗?(或发送一些参考?)

如果我做错了,有人可以告诉我使用class.weights参数的正确方法吗?

可能是错误吗?(我认为不是,因为我了解此软件以及基本的libsvm相当成熟)


我没有libsvm的经验,但有LiblineaR的经验,类的权重至关重要。如果没有正确设置,如果您的班级严重失衡,您将得到次优的结果。我建议:使用不平衡的类获取真实的数据集,并尝试使用不同的class.weights值(在LiblineaR wi中)。对于线性核而言,LiblineaR的速度要快几个数量级,并且还具有不利的方法。根据我的经验,你先找到一个体面类权重,然后优化C.
马贝尔

Answers:


7

我认为这可能取决于C的值和您拥有的模式数量。SVM会尝试找到最大的边际判别力,因此,如果数据稀疏,那么SVM可能会找到硬边际解决方案,而没有任何Lagrange乘数达到上限(在这种情况下,每种情况的惩罚比率该类在本质上是无关紧要的,因为松弛变量很小或为零,请尝试增加训练模式的数量,看是否有效果(这样可以减少在框约束内找到硬边界解决方案的可能性) 。

更重要的是,C的最佳值取决于数据,您不仅可以将它们设置为某些预定值,还可以通过最小化留一法误差或某些一般性约束来优化它们。如果您的班级不平衡,则可以固定每个班级的价值比率,并优化所有模式的平均惩罚。


这是有道理的。在此模拟中,当我减少要素数量并增加观察数量时,输出值将接近0.5。但是,它永远都无法到达目的地-即使只有900行只有1列。
约翰·科尔比

当然,在实际数据上,我总是使用caret程序包或内置tune()函数进行模型参数调整,因此,我特别喜欢您的第二个想法,即如何通过调整重采样方案以偏爱少数群体来解决这一问题。非常感激。
约翰·科尔比

很高兴您的建议有用。有一篇关于设置最佳比率的论文可能也很有用theoval.cmp.uea.ac.uk/publications/pdf/ijcnn2001.pdf然而,最佳理论校正在实践中并不总是最佳,因此最佳结果可能实际上,可以通过调整两个单独的C参数而无需强制使用特定的比率,而在评估留一法模型选择标准时根据类对模式加权。
Dikran有袋动物2011年

2
我还要补充一点,这些天我倾向于使用内核岭回归而不是SVM,因为由于损失函数的导数不连续,您不会遇到这类违反直觉的问题。如果正确调整L2 SVM,经常会得到很小的C值,并且所有数据都是SV,这时您仍然拥有KRR模型。尽管使用SVM带来的理论见解至关重要,但我使用它们的次数越多,在实践中发现SVM的作用就越小。
Dikran有袋动物2011年

0

在训练svm时,找到支持向量以形成可区分的边界,并且当有足够的支持向量用于所有类别数据时,这将是没有问题的。在测试集的结果准确性中,您应该注意现实世界中所有类的数据均等,并且为获得真实结果,您应该对数据进行操作,并将其正确考虑为真实情况。


目前,这个答案还不太清楚-我考虑过对其进行复制编辑,但是在很多地方我不确定您的意图。标点和语法对于传达意义很重要。
Silverfish
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.