【机器学习】基于实战项目的SVM算法库使用方法详解

0. 学习背景

        本人在进行车道线检测项目中使用到了LBP+SVM算法来改善高复杂度场景下的车道线特征提取效果,主要流程如下:提取训练集中车道线的LBP特征,然后训练一个SVM分类器。在测试时,使用相同的特征提取方法,将特征值输入SVM分类器中,根据“决策面”方程,即超平面方程即可得到每个测试样本到分类超平面的距离,即该样本对应的“得分”。

       使用了自带的SVM算法库缩短项目周期。为了兼顾训练时间和分类效果,先基于少量训练样本使用线性分类器进行实验:在训练集上统计了查准率P和查全率R,其中正样本共4925,正确检测:4482,漏检:443,负样本:共10520,误检:375;查准率:P=92.88%,查全率:R=91.0%。

      为了进一步改善分类效果,增加训练样本数量(正样本3w张/负样本12w张)并使用RBF(径向基)核函数,测试结果较之前有明显的提升,但是仍存在一些问题。为了尽可能通晓各参数对SVM分类效果的影响,参考如下博文内容进行深入的学习。

之前通过一个系列对支持向量机(以下简称SVM)算法的原理做了一个总结,本文从实践的角度对scikit-learn SVM算法库的使用做一个小结。scikit-learn SVM算法库封装了libsvm 和 liblinear 的实现,仅仅重写了算法了接口部分。

1. scikit-learn SVM算法库使用概述

    scikit-learn中SVM的算法库分为两类,一类是分类的算法库,包括SVC, NuSVC,和LinearSVC 3个类。另一类是回归算法库,包括SVR, NuSVR,和LinearSVR 3个类。相关的类都包裹在sklearn.svm模块之中。

    对于SVC, NuSVC,和LinearSVC 3个分类的类,SVC和 NuSVC差不多,区别仅仅在于对损失的度量方式不同,而LinearSVC从名字就可以看出,他是线性分类,也就是不支持各种低维到高维的核函数,仅仅支持线性核函数,对线性不可分的数据不能使用。

    同样的,对于SVR, NuSVR,和LinearSVR 3个回归的类, SVR和NuSVR差不多,区别也仅仅在于对损失的度量方式不同。LinearSVR是线性回归,只能使用线性核函数。

    我们使用这些类的时候,如果有经验知道数据是线性可以拟合的,那么使用LinearSVC去分类 或者LinearSVR去回归,它们不需要我们去慢慢的调参去选择各种核函数以及对应参数, 速度也快。如果我们对数据分布没有什么经验,一般使用SVC去分类或者SVR去回归,这就需要我们选择核函数以及对核函数调参了。

    什么特殊场景需要使用NuSVC分类 和 NuSVR 回归呢?如果我们对训练集训练的错误率或者说支持向量的百分比有要求的时候,可以选择NuSVC分类 和 NuSVR 。它们有一个参数来控制这个百分比。

    这些类的详细使用方法我们在下面再详细讲述。

扫描二维码关注公众号,回复: 4967643 查看本文章

2. 回顾SVM分类算法和回归算法

    我们先简要回顾下SVM分类算法和回归算法,因为这里面有些参数对应于算法库的参数,如果不先复习下,下面对参数的讲述可能会有些难以理解。

    对于SVM分类算法,其原始形式是:

    对于SVM回归算法,其原始形式是:

3. SVM核函数概述

    在scikit-learn中,内置的核函数一共有4种,当然如果你认为线性核函数不算核函数的话,那就只有三种。

    一般情况下,对非线性数据使用默认的高斯核函数会有比较好的效果,如果你不是SVM调参高手的话,建议使用高斯核来做数据分析。  

4. SVM分类算法库参数小结

    这里我们对SVM分类算法库的重要参数做一个详细的解释,重点讲述调参的一些注意点。


 5. SVM回归算法库参数小结 

    SVM回归算法库的重要参数巨大部分和分类算法库类似,因此这里重点讲述和分类算法库不同的部分,对于相同的部分可以参考上一节对应参数。

6. SVM算法库其他调参要点

    上面已经对scikit-learn中类库的参数做了总结,这里对其他的调参要点做一个小结。

    1)一般推荐在做训练之前对数据进行归一化,当然测试集中的数据也需要归一化。。

    2)在特征数非常多的情况下,或者样本数远小于特征数的时候,使用线性核,效果已经很好,并且只需要选择惩罚系数C即可。

    3)在选择核函数时,如果线性拟合不好,一般推荐使用默认的高斯核'rbf'。这时我们主要需要对惩罚系数C和核函数参数γγ进行艰苦的调参,通过多轮的交叉验证选择合适的惩罚系数C和核函数参数γγ。

    4)理论上高斯核不会比线性核差,但是这个理论却建立在要花费更多的时间来调参上。所以实际上能用线性核解决问题我们尽量使用线性核。

部分内容转自:https://www.cnblogs.com/pinard/p/6117515.html

猜你喜欢

转载自blog.csdn.net/lyq_12/article/details/86502556