支持向量机的实用指导

网页中不能显示公式和配图,带配图的doc版可以在这里查看或下载:http://pan.baidu.com/s/1vIAtp


1.介绍

SVM是数据分类的一个有用的技术。虽然SVM被认为比神经网络简单,不熟悉的用户一开始很容易不习惯。在此我们给出梗概。

注意本指导不是给SVM研究者的,也不保证能达到高的准确率。同时,我们也不打算解决困难的问题。目的是为SVM初学者提供一个指导,让你在使用中很快得到一个可接受的结果。

虽然用户们不必知道SVM背后的潜在理论,我们相信有必要简要介绍下基础知识。一个分类器通常把数据分为训练集和测试集。每个训练集中的实例都有一个目标值(即 class labels)和若干属性(即特征和观察值)。SVM的目的是创建一个模型(基于训练集)来根据测试集的属性预测测试集的目标值。

给定一个实例-标签对 (xi, yi)的训练集,SVM要得到下列优化问题的解答:


这里训练集向量Xi通过函数φ被映射到一个更高的维度空间(也许是无限维)。SVM找出一个能最大程度分离这个空间的超平面。C>0是对错误的惩罚参数。此外

被称作核函数。虽然新的核函数正不断地被提出,初学者可能在SVM的书中常常遇到下面4个基本的核函数:

l 线性:

l 多项式:

径向基核函数(RBF)

l S型函数:

这里,γ,rd都是核参数。

1.1 真实世界的例子

表一展现了真实世界的例子。这些数据集是那些在开始不能得到合理准确度的用户们提供的。用本指导中的流程我们帮他们得到了更好的结果。细节在附录1中。

这些数据集在http://www.csie.ntu.edu.tw/~cjlin/papers/guide/ 

1.2 建议流程

许多新手使用如下流程:

l 把数据转换到SVM包的数据形式

l 随机实一些核函数和参数

l 测试

我们建议新手试试下面这个流程:

l 把数据转换到SVM包的数据形式

l 对数据进行简单地缩放

l 考虑径向基函数

l 用交叉验证找出最好的参数Cγ

l 用最好的参数Cγ训练整个训练集

l 测试

在下面几段我们来详细讨论流程的细节。

2. 数据预处理

2.1 类别特征

SVM要求每个数据实例被表示成 实数的向量。因此,如果有类别属性,我们先必须把它们转换成数字类型的数据。我们推荐用m个数字来表示有m个值得类别属性。只有一个数字是1,其他都是0。举例来说,一个有3中取值的属性比如{红,绿,蓝}可以被表示成(0,0,1),

0,1,0)和(1,0,0)。我们的经验告诉我们如果一个属性的取值数目不是很大,这种编码方式比用单个数字可能更稳定一些。

2.2 缩放

在应用SVM前先缩放十分重要。Part 2 of Sarle's Neural Networks FAQ Sarle (1997) 解释了缩放的重要性,其中的大部分考量对SVM也是有效的。缩放的主要目的在于避免属性中有较大取值范围的压过那些取值范围较小的属性。另一个作用是避免计算过程中的困难。因为核值通常依赖于特征向量的内积,比如线性核函数和多项式核函数,大属性值可能导致数字上的问题。我们推荐线性地把每个属性缩放到[-1+][0,1] 之间。

当然我们必须用同样的方法同时缩放训练集和测试集。比如:我们把训练集中的第一个实例从[-10,+10]缩放到[-1,+1]。如果测试集中的第一个实例的范围是[-11,+8],我们必须把测试集缩放到[-1.1,+0.8]。详见附录B

模型选取

虽然在Section1中只提到了4中常用的核函数,我们必须决定试哪个先。然后选定惩罚参数C和核参数。
3.1 RBF核(径向基函数)

通常来说,RBF核函数是一个合理的第一选择。这个函数非线性地把样本映射到一个更高维度的空间,不像线性函数,它可以处理标签值和属性值是非线性的情况。此外,线性核是RBF的一个特例因为带惩罚参数的线性核跟带参数 (C, γ)的RBF核函数有同样的效果。还有,S型核函数跟特定参数的RBF核函数也有相同的表现。

第二个理由是超参数的数目也影响了模型的选择。多项式核函数比RBF核函数有更多的超参数。

最后,RBF核函数在数学上困难少点。一个关键点在于当0<Kij<=1时,在指数很大时多项式核函数的核值可能趋于无穷大或者0。而且,我们必须注意到S型函数在某些参数配置下不是有效的。

RBF核函数在某些场景下不是合适的。比如当特征数目很大时,只能用线性核函数。我们会在附录C中讨论。

3.2 交叉验证和网格搜索

RBF有两个参数:Cγ。对于一个给定的问题,这两个参数事先是未知的;后果就是模型选取必须被实施。目的就是找出好的Cγ值来准确预测未知数据。注意它不能保证分类器能对训练数据达成高准确率。如上讨论,一个常用的策略是把数据分成两个部分,其中一部分被认作未知的。从“未知”数据集得到的预测准确度精准地反映了分类器在一个独立数据集上的表现。一个改进的方法就是交叉验证。

交叉验证可以防止过度拟合……(关于交叉验证部分的翻译略)

我们推荐一个用交叉验证的“网格搜索”法来找到Cγ。大量Cγ值对被尝试,有最好的交叉验证结果的被选中。我们发现用一个指数增长的Cγ序列来尝试是一个实用的好办法。

网格搜索是直接了当的但看起来很朴素。事实上,有好几个先进的方法可以减少计算量,比如,近似交叉验证率。然而,我们偏向于网格搜索有两个动机。

首先,心理上来说,我们可能觉得 使用一个不能彻底搜索全部可能的方法是不安全的。另一个理由是网格搜索相比于更先进的方法减少不了多少时间,因为参数只有2个。此外,网格搜索因为(C,γ)是独立的,所以可以很容易地进行并行计算。许多其他方法是一个迭代的过程,比如沿着一条路走,很难被并行计算。

 因为一次完全的网格搜索仍然很耗时,我们推荐先用粗糙网格。在识别出一个较好的网格区后,一个更精细的网格搜索在该区域被实施。比如,我们可以在german from the Statlog collection上做实验。在缩放数据集后,我们先用一个粗糙的网格,找到最好的Cγ为,然后在这个网格的邻近进行更加精细的网格搜索,得到了使交叉验证结果更好。在最好的参数找到后,整个训练集再次被训练来生成最终的分类器。

上述的方法在上千数据量时表现出色。对于很大的数据集,一个好办法是选出一个子集,进行粗糙的网格搜索,然后对整个数据集进行更加精细的网格搜索。


附上libsvm的官网:http://www.csie.ntu.edu.tw/~cjlin/libsvm/ 
以及原文连接:http://www.csie.ntu.edu.tw/~cjlin/papers/guide/guide.pdf


原文地址:https://www.cnblogs.com/rav009/p/5131102.html