我目前正在使用带有线性内核的 SVM 对我的数据进行分类。训练集没有错误。 ( )尝试了几个值。这并没有改变测试集上的错误。
现在我想知道:这是由我正在使用的 ruby 绑定引起的错误( rb-libsvm)还是理论上可以解释?libsvm
参数是否应该总是改变分类器的性能?
我目前正在使用带有线性内核的 SVM 对我的数据进行分类。训练集没有错误。 ( )尝试了几个值。这并没有改变测试集上的错误。
现在我想知道:这是由我正在使用的 ruby 绑定引起的错误( rb-libsvm)还是理论上可以解释?libsvm
参数是否应该总是改变分类器的性能?
在 SVM 中,您正在搜索两件事:具有最大最小边距的超平面,以及正确分离尽可能多的实例的超平面。问题是你并不总是能够同时得到这两种东西。c 参数决定了你对后者的渴望有多大。我在下面画了一个小例子来说明这一点。在左侧,您有一个较低的 c,这为您提供了相当大的最小边距(紫色)。但是,这要求我们忽略我们未能正确分类的蓝色圆圈异常值。在右边你有一个高c。现在您将不会忽略异常值,因此最终得到的边距要小得多。
那么这些分类器中哪一个是最好的呢?这取决于您将预测的未来数据是什么样的,当然大多数情况下您并不知道。如果未来的数据如下所示:
那么使用大 c 值学习的分类器是最好的。
另一方面,如果未来的数据看起来像这样:
那么使用低 c 值学习的分类器是最好的。
根据您的数据集,更改 c 可能会或可能不会产生不同的超平面。如果它确实产生了不同的超平面,这并不意味着您的分类器将为您用来分类的特定数据输出不同的类。Weka 是一个很好的工具,用于可视化数据并为 SVM 设置不同的设置。它可以帮助您更好地了解数据的外观以及为什么更改 c 值不会更改分类错误。一般来说,只有很少的训练实例和很多属性可以更容易地对数据进行线性分离。此外,您正在评估您的训练数据而不是新的看不见的数据这一事实使分离更容易。
你想从什么样的数据中学习模型?多少数据?我们能看到吗?
C 参数告诉 SVM 优化您希望避免对每个训练示例进行错误分类的程度。对于较大的 C 值,如果该超平面在正确分类所有训练点方面做得更好,则优化将选择一个较小边距的超平面。相反,一个非常小的 C 值将导致优化器寻找一个更大边距的分离超平面,即使该超平面错误分类了更多的点。对于非常小的 C 值,您应该得到错误分类的示例,即使您的训练数据是线性可分的。
C 本质上是一个正则化参数,它控制在训练数据上实现低误差和最小化权重范数之间的权衡。它类似于岭回归中的岭参数(实际上在实践中,线性支持向量机和岭回归在性能或理论上几乎没有差异,所以我通常使用后者 - 或者如果属性多于观察值,则使用核岭回归)。
正确调整 C 是使用 SVM 的最佳实践中的重要一步,因为结构风险最小化(基本方法背后的关键原则)是通过调整 C 来实现的。参数 C 强制执行规范的上限权重,这意味着有一组由 C 索引的嵌套假设类。随着我们增加 C,我们增加了假设类的复杂性(如果我们稍微增加 C,我们仍然可以形成我们之前可以形成的所有线性模型还有一些我们在增加权重允许范数的上限之前无法做到的)。因此,除了通过最大边距分类实现 SRM 之外,它还通过控制 C 来限制假设类的复杂性来实现。
遗憾的是,目前确定如何设置 C 的理论还没有得到很好的发展,所以大多数人倾向于使用交叉验证(如果他们做了什么)。
C 是一个正则化参数,它控制实现低训练误差和低测试误差之间的权衡,即能够将分类器推广到看不见的数据。
考虑线性 SVM 的目标函数:min |w|^2+C∑ξ。如果您的 C 太大,优化算法将尝试减少 |w| 尽可能导致超平面尝试正确分类每个训练示例。这样做会导致分类器泛化特性的损失。另一方面,如果你的 C 太小,那么你给你的目标函数一定的自由来增加 |w| 很多,这会导致很大的训练误差。
下面的图片可能会帮助您形象化这一点。