支持向量的数量与训练数据和分类器性能之间的关系是什么?

83

我正在使用LibSVM对一些文档进行分类。最终的结果显示,这些文档似乎有些难以分类。然而,在训练模型时我注意到了一些事情。就是:假设我的训练集有1000个,其中大约有800个被选为支持向量。

我已经到处寻找是否这是一件好事或坏事。我的意思是,支持向量的数量与分类器的性能之间是否存在关系?

我已阅读过这篇先前的帖子,但是我正在执行参数选择,并且我确定特征向量中的属性都是有序的。

我只需要知道它们之间的关系。

谢谢。

p.s:我使用线性内核。


就算这样,对于50000个MNIST数字(784维)上的RBF-SVM,得到了14398个支持向量,占总数的29%。 - denis
5个回答

169

支持向量机是一个优化问题。它们试图找到将两个类分开的超平面,并且具有最大间隔的支持向量是落在此间隔内的点。如果您从简单到更复杂地构建它,那么理解起来会很容易。

硬间隔线性SVM

在训练集中,数据是线性可分的,并且使用硬间隔(不允许有松弛),支持向量是落在支撑超平面上的点(这些超平面与边缘处分界超平面平行)。

Hard-Margin SVM

所有支持向量都恰好位于边缘上。无论数据集的维度或大小是多少,支持向量的数量可能只有2个。

软间隔线性SVM

但是,如果我们的数据集不是线性可分的呢?我们引入了软间隔SVM。我们不再要求数据点位于边缘之外,而是允许一些数据点偏离超平面进入边缘。我们使用松弛参数C(nu-SVM中的nu)来控制这一点。这样可以给我们更宽的边缘和更大的训练数据误差,但有助于泛化或允许我们找到非线性可分离数据的线性分割。

Soft-margin Linear SVM

现在,支持向量的数量取决于我们允许多少松弛以及数据的分布情况。如果我们允许大量松弛,那么我们将有大量的支持向量。如果我们几乎不允许松弛,则支持向量的数量很少。准确性取决于找到适合分析数据的松弛水平。对于某些数据,可能无法获得高精度,我们必须尽力找到最佳拟合。

非线性SVM

这将我们带到了非线性SVM。我们仍然试图在线性空间中划分数据,但现在我们尝试在更高维的空间中进行。这是通过核函数完成的,当然它有自己的一套参数。当我们将其转换回原始特征空间时,结果就是非线性的:

enter image description here

现在,支持向量的数量仍然取决于我们允许多少松弛,但也取决于我们模型的复杂性。我们输入空间中最终模型的每个扭曲和转折都需要一个或多个支持向量来定义。最终,SVM的输出是支持向量和alpha,实质上是定义该特定支持向量对最终决策的影响程度。 在这里,准确度取决于高复杂模型和大边际之间的权衡,前者可能会过度拟合数据,后者会将部分训练数据错误分类,以期获得更好的泛化。支持向量的数量可以从非常少到每个数据点都有,如果您完全过度拟合数据的话。这种权衡是通过C和选择核和核参数来控制的。 我假设当你说性能时,你指的是准确度,但我想也谈一谈计算复杂性方面的性能。为了使用SVM模型测试数据点,您需要计算每个支持向量与测试点的点积。因此,模型的计算复杂度与支持向量的数量成线性关系。较少的支持向量意味着更快的测试点分类。 一个好的资源: 模式识别支持向量机教程

非常好的答案!但链接已经失效了...您能否更新一下? - Matteo
支持向量机模式识别教程(来自缓存版本的归档) - lucid_dreamer
支持向量的数量可以从非常少到每个数据点都有,如果你完全过度拟合你的数据。总之,大量的支持向量并不好。那么问题是,1000个训练样本中的800个支持向量是否“大量”? - Kanmani
谢谢!我在以下链接和我找到的链接中发现了这个不错的解释! :) - leandr0garcia
这是一个非常棒的答案!解释得非常清楚! - Batool

32

800个样本中的大部分,基本上告诉你SVM需要使用几乎每个训练样本来编码训练集。这基本上告诉您,您的数据没有太多的规律性。

听起来你的主要问题是缺乏足够的训练数据。此外,也许考虑一些特定的特征来更好地区分这些数据。


13
我已经选择这个作为答案。之前的长篇回答只是无关紧要的复制粘贴SVM解释。 - Valentin H
9
我同意。虽然其他答案试图给出一个好的总结,但这个对原帖最相关。如果S.V.部分很大,那就意味着在死记硬背而不是学习,这会导致坏的泛化 => 样本外误差(测试集误差)会更大。 - Kai

12

样本数量和属性数量都可能影响支持向量的数量,使得模型更加复杂。我相信您使用单词甚至ngrams作为属性,因此它们的数量很多,并且自然语言模型本身非常复杂。因此,在1000个样本中有800个支持向量似乎是可以接受的。(还要注意@karenu关于C/nu参数的评论,这些参数也对SVs数量有很大影响)。

要理解这一点,请回想SVM的主要思想。SVM在一个多维特征空间中工作,并试图找到分隔所有给定样本的超平面。如果你有很多样本,但只有2个特征(2维),数据和超平面可能如下所示:

enter image description here

这里只有3个支持向量,其他所有支持向量都在它们后面,因此不起任何作用。请注意,这些支持向量仅由2个坐标定义。

现在想象一下,你有一个三维空间,因此支持向量由3个坐标定义。

enter image description here

这意味着有一个参数(坐标)需要调整,这可能需要更多的样本来找到最优的超平面。换句话说,在最坏的情况下,SVM每个样本只找到一个超平面坐标。

当数据结构良好(即相当好地保持了模式)时,可能只需要几个支持向量-其他所有支持向量都会留在它们后面。但文本是非常不良结构化的数据。SVM尽最大努力尝试尽可能合适地拟合样本,因此甚至要将更多的样本作为支持向量。随着样本数量的增加,这种“异常”会减少(更多的不重要的样本出现),但支持向量的绝对数量仍然很高。


谢谢您的回答!您有没有提及最后一段的相关参考资料呢?“当数据结构良好(即非常有规律)时,可能只需要几个支持向量 - 所有其他向量都将留在它们后面。但是文本是非常不规则的数据。SVM会尽力尝试将样本拟合得尽可能好,并因此选择更多的样本作为支持向量。” 谢谢。 - Hossein
@karenu:我并没有说属性数量的增长总是会导致支持向量数量的增长,我只是说即使使用固定的C/nu参数,支持向量数量也取决于特征维度和样本数量。对于文本数据来说,由于其天生的结构不良,边缘内的支持向量数量(即使使用高阶核函数)始终会很高,因此硬间隔支持向量机在文本分类中是不适用的。 - ffriend
@Hossein:我的意思是线性可分。想象一下垃圾邮件分类的任务。如果您的垃圾邮件几乎总是包含“伟哥”、“购买”、“货币”等词语,而您的普通邮件只包含“家庭”、“你好”、“问候”,那么您的数据结构良好,可以很容易地基于这些词向量进行分类。然而,在实践中,您会遇到好坏词混杂的情况,因此您的数据没有任何明显的模式。如果您的消息中有3个来自垃圾字典和3个来自普通邮件,您应该如何分类?您需要更多的特征,这也是SVM使用更多支持向量的原因之一。 - ffriend
@ffriend,我认为这是误导性的。对我来说,说它“取决于”听起来像是如果你的数据集增加了,你的支持向量数量也会增加,似乎样本数量(或维数)和支持向量数量之间存在某种关系。模型的复杂度和SV之间存在关系,更大的数据集和更高的维度确实有更多复杂的模型的倾向,但数据集的大小或维度并不直接决定SV的数量。 - karenu
@karenu:好的,我会重新措辞并添加一些注释。 - ffriend
显示剩余3条评论

8

SVM分类与支持向量(SVs)的数量成正比。支持向量的数量在最坏情况下等于训练样本数,因此800/1000尚未达到最坏情况,但它仍然很糟糕。

然而,1000个训练文档是一个相对较小的训练集。您应该检查当您扩大到10000个或更多文档时会发生什么。如果情况没有改善,请考虑使用线性SVM,通过LibLinear进行训练,用于文档分类;这些能够更好地扩展(模型大小和分类时间与特征数量成正比且独立于训练样本数量)。


@Hossein:那就使用LibLinear而不是LibSVM吧。它的训练速度更快,分类不使用支持向量而是单个系数向量。 - Fred Foo
1
@ChrisA.:是的,我只是在谈论速度。当使用相同的设置时,准确性应该大致相同(尽管LibSVM和LibLinear都使用一些随机化,因此甚至不能保证在同一训练算法的多次运行中相同)。 - Fred Foo
1
等等,这个随机化是否会传递到最终分类器?我还没有看过任何库的代码,但这违反了我对这是一个具有唯一最小值的凸优化问题的整体理解。 - Chris A.
1
这种随机化仅在训练阶段进行,以加速运行。优化问题确实是凸的。 - Fred Foo
1
随机化只是帮助它更快地收敛到最优解。 - karenu
显示剩余5条评论

0

来源之间存在一些混淆。例如,在教科书ISLR 6th Ed中,C被描述为“边界违规预算”,因此高C会导致更多的边界违规和支持向量。 但是在R和Python的SVM实现中,参数C被实现为“违反惩罚”,这是相反的,然后您会观察到在C值较高时支持向量较少。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接