我正在使用LibSVM对一些文档进行分类。正如最终结果所示,这些文档似乎很难归类。但是,在训练模型时,我注意到了一些东西。就是说:如果我的训练集例如是1000,那么大约有800个被选为支持向量。我到处都在寻找这是好事还是坏事。我的意思是支持向量的数量和分类器的性能之间有关系吗?我已经阅读了上一篇文章,但是我正在执行参数选择,而且我还确定特征向量中的属性都是有序的。我只需要知道这种关系。谢谢。ps:我使用线性内核。
Answers:
支持向量机是一个优化问题。他们试图找到一种将两个类别划分为最大边界的超平面。支持向量是落在该裕度内的点。如果将其从简单构建为更复杂,则最容易理解。
硬边距线性SVM
在数据是线性可分离的训练集中,并且您使用硬边距(不允许松弛),支持向量是沿着支持超平面(与边缘处的分割超平面平行的超平面)分布的点)
所有支持向量都恰好位于边缘。无论数据集的维数或大小如何,支持向量的数量都可以少至2个。
软边距线性SVM
但是,如果我们的数据集不是线性可分离的怎么办?我们介绍软边际支持向量机。我们不再要求我们的数据点位于边距之外,而是允许它们中的某些点越过边界进入边距。我们使用松弛参数C来控制它。(nu-SVM中的nu)这使我们在训练数据集上具有更大的裕度和更大的误差,但可以提高泛化性和/或允许我们找到不可线性分离的数据的线性分离。
现在,支持向量的数量取决于我们允许的松弛量和数据的分布。如果我们允许大量的松弛,我们将有大量的支持向量。如果我们允许很少的松弛,那么支持向量将很少。准确性取决于为要分析的数据找到合适的松弛水平。某些数据将无法获得较高的准确性,我们必须简单地找到最合适的数据。
非线性SVM
这将我们带到了非线性SVM。我们仍在尝试线性分割数据,但现在尝试在更高维度的空间中进行分割。这是通过内核函数完成的,内核函数当然具有自己的参数集。当我们将其转换回原始特征空间时,结果是非线性的:
现在,支持向量的数量仍然取决于我们允许的松弛量,但也取决于模型的复杂性。输入空间中最终模型的每一次转弯都需要一个或多个支持向量来定义。最终,SVM的输出是支持向量和一个alpha,这实际上定义了特定支持向量对最终决策的影响。
在这里,准确性取决于可能使数据过度拟合的高复杂度模型与为更好地推广而将一些训练数据错误地分类的大利润之间的权衡。如果您完全过度拟合数据,则支持向量的数量范围可能从很少到每个数据点。这种权衡是通过C以及通过选择内核和内核参数来控制的。
我假设当您说性能时,您指的是准确性,但我想我也会在计算复杂性方面谈及性能。为了使用SVM模型测试数据点,您需要计算每个支持向量与测试点的点积。因此,模型的计算复杂度在支持向量的数量上是线性的。支持向量更少意味着测试点的分类更快。
很好的资源: 用于模式识别的支持向量机教程
每1000个样本中有800个基本上告诉您SVM需要使用几乎每个训练样本来对训练集进行编码。这基本上告诉您数据没有太多规律性。
听起来好像您遇到的主要问题是培训数据不足。另外,也许考虑一些可以更好地分离此数据的特定功能。
两个样本数和属性的数目 可影响支持向量的数量,使模型更加复杂。我相信您使用单词甚至ngram作为属性,因此它们很多,自然语言模型本身也非常复杂。因此,可以支持1000个样本的800个支持向量。(还要注意@karenu关于C / nu参数的注释,这些注释对SV数量也有很大影响)。
为了获得有关此召回SVM主要思想的直觉。SVM在多维特征空间中工作,并尝试找到将所有给定样本分开的超平面。如果您有很多样本并且只有2个要素(2维),则数据和超平面可能如下所示:
这里只有3个支持向量,所有其他向量都在它们后面,因此不起作用。注意,这些支持向量仅由2个坐标定义。
现在假设您有3维空间,因此支持向量由3个坐标定义。
这意味着还有一个要调整的参数(坐标),这种调整可能需要更多的样本才能找到最佳的超平面。换句话说,在最坏的情况下,SVM每个样本只能找到1个超平面坐标。
当数据结构良好(即保持良好的模式)时,可能只需要几个支持向量,所有其他支持向量都将滞后。但是文本是非常非常糟糕的结构化数据。SVM尽其所能,尝试尽可能地适合样本,因此将比滴更多的样本作为支持向量。随着样本数量的增加,这种“异常”减少了(出现了更多无关紧要的样本),但是支持向量的绝对数量仍然很高。
SVM分类在支持向量(SV)的数量上是线性的。SV的数量在最坏的情况下等于训练样本的数量,因此800/1000尚不是最坏的情况,但仍然很糟糕。
再说一次,一千个培训文档就是一个小的培训集。您应该检查在扩展到10000s或更多文档时会发生什么。如果情况没有改善,请考虑使用经过LibLinear培训的线性SVM进行文档分类;这样可以更好地扩展(模型大小和分类时间在特征数量上是线性的,并且与训练样本的数量无关)。