实用libsvm入门笔记(A Practical Guide to Support Vector Classication)
一、建议过程:
许多初学者从以下过程进行深入:
1、 把数据转换到SVM格式
2、 随机的尝试一些内核和参数
3、 测试
我们建议初学者按照以下过程进行深入:
1、 把数据转换到SVM格式
2、 引入简单的归一化方法对数据进行归一化
3、 考虑RBF核
4、 用交叉验证找到最好的参数C和γ
5、 用找到的参数C和γ对整个训练集进行训练
6、 测试
在下面的章节中我们将详细讨论这一过程
二、数据的预处理
1、数据分类
SVM需要每一个数据实例用一个向量来表达一个实数。这里,如果存在类别属性,我们首先把它们转换成数值型数据。我们推荐用m个数字来代表m个属性,在m个数字中只有1个为1,其他都为0。举个例子,一个3类别属性{红,绿,蓝}可以表示成(0,0,1), (0,1,0), (1,0,0)。
我们的经验表明,如果一个属性的类别数不是很大,这种表达要比1个浮点型数值更加稳定。
2、归一化
在应用SVM之前进行归一化是十分重要的。主要的优势是归一化可以避免较大的属性数值变化主宰那些较小的属性数值变化。另一个优势是降低数值计算的难度。因为内核的数值是根据特征向量计算得出的,如线性的和多项式的内核,大数值的属性可能会导致数值计算问题。我们建议线性的把属性数值归一化到[-1,+1]或[0,1]。
当然,我们必须使用相同的归一化方法同时归一化训练集和测试集。例如,假设我们把训练集的第一个属性从[-10,+10]归一化到[-1,+1]。如果测试集的第一个属性是从[-11,+8],我们也必须把他们归一化到[-1.1,+0.8]。
三、模型选择
尽管这里只有4中通用的内核方法,我们也要先从中选择一个。然后确定惩罚参数C和参数γ。
1、 RBF核
通常RBF和作为首选核方法是有原因的。此核方法非线性的把采样数据映射到高维空间,比起线性的核方法,RBF核并不需要关心数据属性和标签是否存在线性关系。进一步说,线性的核方法可以看作RBF核的一种特殊情况,可以证明:惩罚参数C1的线性内核和惩罚参数C2加上RBF参数γ的RBF内核有着相同的分类表现。另外,sigmoid内核和RBF在特定参数下也有着相同的表现。
第二个原因是超参数的数量也影响着复杂度和模型选择。多项式核比RBF核有着更多的超参数。
最后,RBF核拥有更少的数值计算难度。一个关键点是当 对比多项式核其核值可能趋近无穷
或接近于0
在维数较大时。并且我们必须注意sigmoid核在某些参数下是不合法的。
还有一些情况RBF核是不合适的。在实际中,当特征的数量特别大的时候最好使用线性的核方法,这个我们在后面讨论。
2、 交叉验证和网格搜索
对于RBF核有两个参数:C和γ。对于一个给定的问题,最好的参数C和γ是未知的,必须用一种方法来选择最好的参数。一个通常的做法是把数据分成两个部分,其中一部分认为是未知的。那个未知的部分作为一个独立的数据集用来反映测试精度。对于这一过程的一个改进版本叫做“交叉验证”。
在v-fold交叉验证中,我们首先把训练集分成v个相同大小的子集。从而一个子集用来测试在其他v-1个训练集中训练的分类器。这样整个数据集中的每一个实例被预测一次,交叉验证精度为正确分类数据的百分比。
交叉验证过程可以阻止过拟合问题。
我们推荐一种网格搜索算法寻找C和γ在交叉验证中。多对(C,γ)值用在交叉验证,从中选择交叉验证精度最好的参数对。我们发现以指数形式增长的C和γ是一种实用的方法用于选出好的参数(比如, )。
网格搜索是一种直接但朴素的方法。事实上,有许多先进的方法可以减少计算开销,比如近似交叉验证率。不管怎样,我们选择这个简单的网格搜索算法有2个动机。
一个是,用近似或启发式的方法而不是竭尽全力的寻找参数使我们在心理上没有安全感。另一个原因是用网格搜索来寻找参数不会比其他方法慢很多,因为只有2个参数。还有,网格搜索可以很好的并行计算。
做一个完整的网格搜索还是需要很长时间,我们建议用一个粗网格来完成。找到一个较好的区域后,我们在细化网格,最终找到最好的参数。
上述方法可以在上千数据的数据集中工作良好,对于更大的数据集,一个可行的方法是随机的找出一个子集用上述方法搜索,然后在较好的区域中完成整个数据集搜索。
四、讨论
在一些情况下上述建议的处理过程显然是不够的,一些其他的技术如特征选择是需要的。这些问题已经超出了本文的知道。我们的经验表明,如果特征超过千维的话,在送入SVM之前需要选择其一个合适大小的子集。
关于LINER和RBF内核的选择(什么时候该选择LINER而舍弃RBF):
1、 实例的数量 远小于 特征的维数
2、 实例的数量 和 特征的维数 都非常大
3、 实例的数量 远大于 特征的维数