支持向量的数量与训练数据和分类器性能之间的关系是啥? [关闭]
Posted
技术标签:
【中文标题】支持向量的数量与训练数据和分类器性能之间的关系是啥? [关闭]【英文标题】:What is the relation between the number of Support Vectors and training data and classifiers performance? [closed]支持向量的数量与训练数据和分类器性能之间的关系是什么? [关闭] 【发布时间】:2012-03-17 20:18:13 【问题描述】:我正在使用 LibSVM 对一些文档进行分类。正如最终结果显示的那样,这些文件似乎有点难以分类。然而,我在训练我的模型时注意到了一些事情。也就是说:如果我的训练集是例如 1000 个,则选择其中的 800 个作为支持向量。 我到处寻找这是好事还是坏事。我的意思是支持向量的数量和分类器的性能之间是否存在关系? 我已阅读此previous post,但我正在执行参数选择,并且我确信特征向量中的属性都是有序的。 我只需要知道关系。 谢谢。 ps:我使用的是线性内核。
【问题讨论】:
Fwiw,RBF-SVM 在 50000 个 MNIST 数字 (784d) 上提供 14398 个支持向量,占 29 %。 【参考方案1】:支持向量机是一个优化问题。他们试图找到一个以最大边距划分两个类的超平面。支持向量是落在此边距内的点。如果您将其从简单到复杂构建,则最容易理解。
硬边距线性 SVM
在数据是线性可分的训练集中,并且您使用硬边距(不允许松弛),支持向量是位于支持超平面上的点(在边缘处平行于分割超平面的超平面边距)
所有支持向量都恰好位于边缘。无论数据集的维数或大小,支持向量的数量都可以少至2。
软边距线性 SVM
但是如果我们的数据集不是线性可分的呢?我们引入了软边距 SVM。我们不再要求我们的数据点位于边缘之外,我们允许它们中的一些偏离线进入边缘。我们使用松弛参数 C 来控制它。 (nu-SVM 中的 nu)这为我们在训练数据集上提供了更大的余量和更大的误差,但提高了泛化性和/或允许我们找到线性不可分的数据的线性分离。
现在,支持向量的数量取决于我们允许的松弛程度和数据的分布。如果我们允许大量的松弛,我们将有大量的支持向量。如果我们允许很少的松弛,我们将有很少的支持向量。准确性取决于为正在分析的数据找到正确的松弛水平。有些数据不可能达到很高的准确度,我们必须尽可能地找到最合适的数据。
非线性支持向量机
这将我们带到非线性 SVM。我们仍在尝试对数据进行线性划分,但我们现在正尝试在更高维空间中进行。这是通过一个内核函数完成的,它当然有自己的一组参数。当我们将其转换回原始特征空间时,结果是非线性的:
现在,支持向量的数量仍然取决于我们允许多少 slack,但这也取决于我们模型的复杂性。在我们的输入空间中,最终模型中的每一次转折都需要一个或多个支持向量来定义。最终,SVM 的输出是支持向量和一个 alpha,本质上是定义特定支持向量对最终决策的影响程度。
在这里,准确性取决于在可能过度拟合数据的高复杂度模型与为了更好地泛化而错误地对一些训练数据进行分类的大边距之间的权衡。如果您完全过度拟合数据,支持向量的数量可以从很少到每个数据点不等。这种权衡是通过 C 语言以及通过选择内核和内核参数来控制的。
我假设当您说性能时,您指的是准确性,但我想我也会从计算复杂性的角度来谈论性能。为了使用 SVM 模型测试数据点,您需要计算每个支持向量与测试点的点积。因此,模型的计算复杂度与支持向量的数量呈线性关系。更少的支持向量意味着更快的测试点分类。
一个很好的资源: A Tutorial on Support Vector Machines for Pattern Recognition
【讨论】:
很好的答案!但是链接已经失效了……你能更新一下吗? A Tutorial on Support Vector Machines for Pattern Recognition (Archived from Cached version). “如果您完全过度拟合数据,支持向量的数量可以从很少到每个数据点不等。”总而言之,大量的支持向量并不好。所以问题是,1000 个训练样本中有 800 个 SV 是否“大”? 谢谢! ...以下链接和链接我发现了这个很好的解释! :)【参考方案2】:1000 个中有 800 个基本上告诉您 SVM 需要使用几乎每个训练样本来对训练集进行编码。这基本上告诉您,您的数据没有太多规律性。
听起来您遇到的主要问题是训练数据不足。另外,也许可以考虑一些可以更好地分离这些数据的特定功能。
【讨论】:
我选择了这个作为答案。之前的长答案只是无关紧要的 C&P SVM 解释 我同意。尽管其他答案试图给出一个很好的总结,但这与 o.p. 最相关。如果 S.V. 的部分大表示记忆,而不是学习,这意味着不好的泛化 => 样本外错误(测试集错误)会很大。【参考方案3】:样本数和属性数 可能影响支持向量的数量,使模型更加复杂。我相信您使用单词甚至 ngram 作为属性,所以它们的数量非常多,而自然语言模型本身就非常复杂。因此,1000 个样本的 800 个支持向量似乎没问题。 (还要注意@karenu 的 cmets 关于 C/nu 参数对 SV 数也有很大影响)。
为了直观了解这个召回 SVM 的主要思想。 SVM 在多维特征空间中工作,并试图找到分离所有给定样本的超平面。如果你有很多样本并且只有 2 个特征(2 维),那么数据和超平面可能如下所示:
这里只有 3 个支持向量,其他的都在它们后面,因此没有任何作用。请注意,这些支持向量仅由 2 个坐标定义。
现在假设您有 3 维空间,因此支持向量由 3 个坐标定义。
这意味着还有一个参数(坐标)需要调整,而这个调整可能需要更多的样本才能找到最优的超平面。换句话说,在最坏的情况下,SVM 每个样本只能找到 1 个超平面坐标。
当数据结构良好(即很好地保持模式)时,可能只需要几个支持向量 - 所有其他支持向量都将留在这些支持向量后面。但是文本是非常非常糟糕的结构化数据。 SVM 尽力而为,尽可能地拟合样本,因此将比 drop 更多的样本作为支持向量。随着样本数量的增加,这种“异常”会减少(出现更多不重要的样本),但支持向量的绝对数量仍然很高。
【讨论】:
感谢您的回答!您对上一段中提到的内容有任何参考吗? “当数据结构良好(即很好地保持模式)时,可能只需要几个支持向量 - 所有其他支持向量都将留在这些支持向量后面。但是文本是非常非常糟糕的结构化数据。SVM 尽力而为,试图拟合样本尽可能好,因此作为支持向量的样本比drops还要多。”谢谢 这是不正确的 - 如果数据集是线性可分的并且具有正确的分布,您可以拥有一个只有 2 个支持向量的 3 维数据集。您还可以拥有完全相同的数据集并最终得到 80% 的支持向量。这完全取决于你如何设置C。事实上,在nu-svm中你可以通过将nu设置得非常低(.1)来控制支持向量的数量 @karenu:我没有说属性数量的增长总是会导致支持向量数量的增长,我只是说即使使用固定的 C/nu 参数,支持向量的数量也取决于特征维度的数量和样本的数量。而对于本质上结构非常糟糕的文本数据,边距内的支持向量的数量(硬边距 SVM 不适用于文本分类,即使使用高阶内核)总是很高。 @Hossein:我的意思是线性可分性。想象一下垃圾邮件分类的任务。如果您的垃圾邮件几乎总是包含“伟哥”、“购买”、“金钱”之类的词,而您的垃圾邮件只包含“家”、“你好”、“问候”,那么您的数据结构良好并且可以很容易地在这些词向量。但是,在实践中,您会混合使用好词和坏词,因此您的数据没有任何明显的模式。如果您有 3 个来自 spam dict 的单词和 3 个来自 ham 的单词,您应该如何对消息进行分类?您需要更多功能,这也是 SVM 使用更多支持向量的原因之一。 @ffriend 我发现这具有误导性。对我说 depends 听起来好像如果您的数据集增加您的 # of sv 会增加,那么样本数(或维度数)和支持向量数之间存在某种关系。模型的复杂性和 SV 之间存在关系,具有更高维度的更大数据集确实有倾向于拥有更复杂的模型,但数据集的大小或维度并不直接决定# SV。【参考方案4】:SVM 分类在支持向量 (SV) 的数量上是线性的。最坏情况下 SV 的数量等于训练样本的数量,因此 800/1000 还不是最坏情况,但仍然很糟糕。
再一次,1000 个训练文档是一个小的训练集。您应该检查当您扩展到 10000 个或更多文档时会发生什么。如果情况没有改善,请考虑使用使用LibLinear 训练的线性 SVM 进行文档分类;这些可以更好地扩展(模型大小和分类时间与特征数量成线性关系,并且与训练样本的数量无关)。
【讨论】:
只是好奇,是什么让您认为 OP 尚未使用线性 SVM?如果使用一些非线性内核,我一定错过了。 @ChrisA.:是的,我只是在谈论速度。当使用相同的设置时,准确度应该大致相同(尽管 LibSVM 和 LibLinear 都使用了一些随机化,因此甚至不能保证在多次运行相同的训练算法时它是相同的)。 等等,这种随机化是否会进入最终分类器?我没有看过这两个库的代码,但这违背了我对这是一个具有唯一最小值的凸优化问题的整体理解。 这种随机化只在训练阶段进行,作为加速。优化问题确实是凸的。 随机化只是帮助它更快地收敛到最优解。【参考方案5】:来源之间存在一些混淆。例如,在教科书 ISLR 第 6 版中,C 被描述为“边界违规预算”,因此更高的 C 将允许更多的边界违规和更多的支持向量。 但是在 R 和 python 中的 svm 实现中,参数 C 被实现为“违规惩罚”,这是相反的,然后您会观察到,对于更高的 C 值,支持向量更少。
【讨论】:
以上是关于支持向量的数量与训练数据和分类器性能之间的关系是啥? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章