svmtrain - 指定错误分类的成本
Posted
技术标签:
【中文标题】svmtrain - 指定错误分类的成本【英文标题】:svmtrain - Specify the cost for missclassification 【发布时间】:2015-01-15 23:40:19 【问题描述】:Matlab 提供命令 fitcsvm 来训练 svm。在其中,您可以传递一个名为 Cost 的键值对,它为每个类的 SVM 指定一个自定义的错误分类惩罚。由于我使用的是旧版本的 matlab,所以我需要使用 svmtrain。但是,我找不到该函数的这样一个键值对。有什么办法可以做到吗?
【问题讨论】:
miss-classification penalty
究竟测量了什么?
误报成本与误报成本。我有一个两类 svm,其中误报比误报更具破坏性。
我没有机会与fitcsvm
合作。在ClassificationTree.fit
中有一个类似于您想要的选项。我认为唯一相关的选项是 soft margin
您可以将其设置为 inf
以获得硬边距,但它对 FP 和 FN 的影响相同。
你说的是MATLAB中svmtrain
中的boxconstraint
参数吗?
@ParagS.Chandakkar,他想调整分类器,这样无论有多少假阴性,他都可以减少假阳性,这是boxconstraint
无法调整的。
【参考方案1】:
C-SVM 的成本参数也称为“boxconstraint”。请在this index查看其使用详情。
每个类别具有不同成本参数的 C-SVM 称为 2C-SVM。重要的是要知道,这种策略最适合处理不平衡的二进制数据集,其中一个类中的样本数量远高于另一个。在这种 2C-SVM 技术中,一对好的错误分类成本还可以降低平衡数据集上的误报(或误报)的比率,但优化这些参数通常非常昂贵。如果你有时间,看看一种叫做“偏差转移”的技术。使用这种技术,您可以使用单个成本参数训练 C-SVM 模型,然后增加(或减少)偏差 (b) 参数以控制误报(或误报)的比率。它比 2C-SVM 快得多,并提供可比较的结果。
【讨论】:
但是盒子约束的描述说它限制了错误。我只是想更加重视某些错误。还是我理解错了? 描述说:“C 可以是一个标量,也可以是一个与训练数据长度相同的向量。如果 C 是一个标量,它会自动重新缩放 N/(2*N1)第一组数据点,第二组数据点 N/(2*N2),其中 N1 为第一组元素个数,N2 为第二组元素个数,N = N1 + N2" .因此,当 C 是标量时,会自动设置权重以考虑不平衡数据。要为每个类赋予自定义权重,您需要将其设置为权重数组,其中一类元素的权重为“X”,类 B 的元素权重为“Y”。 所以如果 C 作为向量给出,我基本上为每个数据点分配一个自定义权重以进行错误分类? 是的,但是 C 数组不仅仅是权重。它是加权 C 参数的列表。例如,如果您选择 C 参数为 1,并且现在您希望对误报的权重比误报多 3 倍,那么您的 C 数组可能类似于:[0.5, 0.5, 0.5, ..., 1.5, 1.5, 1.5]。正类的第一个值和负类的最后一个值。对于等于 2 的 C,值可以是:[1, 1, 1, ..., 3, 3, 3]。选择一个好的“C”参数是另一回事。有很多技术可以做到这一点。网格搜索很简单。 我认为 C 的值是我在“boxconstraints”字段中输入的值。我究竟如何指定 C 并另外指定一个 C 数组?例如,我想将误报的权重增加 5 倍,我将一个向量传递给“boxconstraint”,其值为 [0.5 0.5, ..., 2.5 2.5],第一个值的索引对应于正例的索引,而根据您写的内容,后一个值的索引对应于底片的索引。您还指出,对于这些值,我的 C 参数必须为 1。我该如何指定?【参考方案2】:如果你想对误报进行比误报更准确的分类,我认为你可以将C
作为向量传递。请阅读 this 和 this 以了解 C
在 SVM 中的作用。我引用了第二个链接:
“但是,与任何正则化方案一样,这里至关重要的是,为惩罚因子 C 选择一个适当的值。如果它太大,我们对不可分离点的惩罚很高,我们可能会存储许多支持向量和过拟合。如果它太小,我们可能会欠拟合。 Alpaydin (2004),第 224 页。
因此,您可以传递较大的 C
值来表示误报,而传递较小的值 C
来表示误报。您必须注意许多其他因素,例如,过度拟合和表现不佳。通常,为C
设置一个较大的值可以在训练中获得良好的性能,但在测试集上会由于过度拟合而恶化。 C
的(非常)小值可能会忽略约束并产生次优分类结果,即您可以使用不同的 C
值获得显着更高的性能。为避免这种情况,您可以进行交叉验证。这个我没试过。
【讨论】:
但是盒子约束的描述说它限制了错误。我只是想更加重视某些错误。还是我理解错了? 我认为,如果您将 C 作为值数组给出,并且如果您给出较大的 C 值以表示误报,则会有很大的惩罚,并且这些值将被正确分类(因此错误更少) .假阴性反之亦然。您必须尝试使用不同的参数。以上是关于svmtrain - 指定错误分类的成本的主要内容,如果未能解决你的问题,请参考以下文章