SVM 中的成本 (C) 参数是什么意思?

机器算法验证 交叉验证 支持向量机 libsvm 参数化 优化
2022-03-24 06:29:38

我正在尝试使 SVM 适合我的数据。我的数据集包含 3 个类,我正在执行 10 折交叉验证(在 LibSVM 中):

./svm-train -g 0.5 -c 10 -e 0.1 -v 10 training_data

帮助指出:

-c cost : set the parameter C of C-SVC, epsilon-SVR, and nu-SVR (default 1)

对我来说,提供更高的成本 (C) 值可以让我获得更高的准确性。SVM中的C实际上是什么意思?为什么以及何时应该使用 C 的更高/更低值(或 LibSVM 给定的默认值)?

1个回答

我试图给出一个简单易懂的答案。一个完整的答案可能需要涵盖从支持向量机背后的目的到损失和支持向量的更精细细节的所有内容。如果您想深入了解这些细节,您可能需要查看例如机器学习书籍中有关 SVM 的章节。

SVM 是大边距分类器这意味着黑白类样本之间的(假设是线性的)分离不仅是一种可能的分离,而且是可能的最佳分离,通过获得两类样本之间的最大可能间隔来定义。这将是示例图像中的H3

在此处输入图像描述

如果您考虑一下这一点,您会得出结论,分离来自那些更接近“另一类”的样本,因此那些接近边缘的样本(准确地说:边缘的那些在示例图像中,这些是用与正交的灰线标记的样本。这种行为会导致一个问题:由于用于推导分离的样本量在很大程度上是子集,影响这些样本的噪声很可能会导致分离对于大多数数据来说不是最佳的。这就是我们都知道的过度拟合:从所用训练的大边距的角度来看,分离将是最佳的,但会泛化得很差,因此对于其他/尚未看到的数据来说不是最佳的。H3

到目前为止,我们讨论的是“硬边距分类”:我们不允许任何样本位于边距内,因为这是迄今为止定义边距的方式。当我们现在放松这个硬属性时,我们最终会进行“软边距分类”。因此,margin 背后的想法保持不变——但我们现在可以允许某些样本位于 margin 内这样做的核心好处是,模型对数据的整体拟合可能比硬边距分类更好(以一些偏差为代价减少方差)。

因此,一方面,我们仍然必须解决我们的简单优化问题(如何最好地拟合模型 = 线与我们的数据)。另一方面,我们不想让所有/许多样本都在边距中——我们想以某种方式调整让多少样本进入边距,这样边距既不会完全过拟合,也不会完全失去其大边距属性。

这是参数进入阶段的地方。C核心思想很简单:我们修改优化问题以优化线与数据的拟合,同时惩罚边缘内的样本量,其中定义边缘内的样本量对总体误差。因此,您可以使用调整大边距分类的硬或软。较低时,边缘内的样本受到的惩罚比较高时要少。带一个CCCCC0,边缘内的样本不再受到惩罚 - 这是禁用大边缘分类的一种可能的极端。对于无限的,您有另一个可能的极端硬边距。C

这是一个小例子,可视化使用众所周知的 iris 数据集(在包中并使用包,但当然同样适用所引起的效果这就是原始数据的样子(这是一个二元分类问题):CRcaretlibsvm

library(caret)
d <- iris[51:150,c(1,2,5)]
plot(d[,c(2,1)], pch = ifelse(d[,3]=='versicolor', 1, 2))

虹膜1

这就是更改对模型性能的影响:C

m <- train(d[,1:2], factor(d[,3]), method = 'svmLinear', trControl = trainControl(method = 'repeatedcv', 10, 20), tuneGrid = expand.grid(C=3**(-7:7)))
plot(m, scales=list(x=list(log=3)))

支持向量机结果

这就是两个不同选择值之间的分隔差异(请注意,分隔线具有不同的倾斜度!):C

m1 <- train(d[,1:2], factor(d[,3]), method = 'svmLinear', preProcess = c('center', 'scale'), trControl = trainControl(method = 'none'), tuneGrid = expand.grid(C=3**(-7)))
plot(m1$finalModel)

SVM分离1

m2 <- train(d[,1:2], factor(d[,3]), method = 'svmLinear', preProcess = c('center', 'scale'), trControl = trainControl(method = 'none'), tuneGrid = expand.grid(C=3**(7)))
plot(m2$finalModel)

支持向量机分离 2

因此,实际上,您最有可能在 ML 设置中做的是正确调整,例如使用调整网格。您可以考虑例如此出版物以获取更多详细信息。它来自 LibSVM 人员,他们提供了很多有用的信息,从解释 SVM 如何与很好的示例一起工作到代码片段,例如如何将参数网格与 LibSVM 一起使用:C

许等人。(2003 年)。“支持向量分类的实用指南。” 国立台湾大学计算机科学与信息工程系。

顺便说一句:人们对 SVM参数的看法有一小部分,我也觉得这有助于理解它:http ://www.svms.org/parameters/C