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 。它们有一个参数来控制这个百分比。

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

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

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

  1. 机器学习(十九)——PageRank算法, KNN, loss function详解

    http://antkillerfarm.github.io/ PageRank算法 概述 在PageRank提出之前,已经有研究者提出利用网页的入链数量来进行链接分析计算,这种入链方法假设一个网页的 ...

  2. g++ 编译mysql动态库_Linux下g++编译以及使用静态库和动态库的方法详解

    下面小编就为大家带来一篇Linux下g++编译与使用静态库和动态库的方法.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 在windows环境下,我们通常在IDE如VS的 ...

  3. 依赖注入底层反射原理_PHP基于反射机制实现自动依赖注入的方法详解_php技巧...

    这篇文章主要介绍了PHP基于反射机制实现自动依赖注入的方法,结合实例形式分析了php使用反射实现自动依赖注入的步骤.原理与相关操作技巧,本文实例讲述了PHP基于反射机制实现自动依赖注入的方法.分享给大 ...

  4. python accept解析_python中requests库使用方法详解

    一.什么是Requests Requests 是⽤Python语⾔编写,基于urllib,采⽤Apache2 Licensed开源协议的 HTTP 库.它⽐ urllib 更加⽅便,可以节约我们⼤量的 ...

  5. python中requests库的用途-数据爬虫(三):python中requests库使用方法详解

    有些网站访问时必须带有浏览器等信息,如果不传入headers就会报错,如下 使用 Requests 模块,上传文件也是如此简单的,文件的类型会自动进行处理: 因为12306有一个错误证书,我们那它的网 ...

  6. 机器学习翻译任务中的constrain decoding 实现流程方法详解

    机器学习翻译任务中的constrain decoding 实现流程 前言 一.(Vectorized) Lexically constrained decoding with dynamic beam ...

  7. python魔方程序算法_Python魔方方法详解

    魔法方法 含义 基本的魔法方法 __new__(cls[, ...]) 1. __new__ 是在一个对象实例化的时候所调用的第一个方法 2. 它的第一个参数是这个类,其他的参数是用来直接传递给 __ ...

  8. svn服务端删除版本库_删除SVN目录及从服务器端删除SVN版本库文件方法详解

    删除SVN目录 当使用了svn版本控制系统后每个目录下都会有一个.svn目录存在,开发完当交付产品或者上传到服务器时一般要把这些目录删除,这里总结了一下在linux和win下的办法. 一.在linux ...

  9. 项目从服务器移除,删除SVN目录及从服务器端删除SVN版本库文件方法详解

    删除SVN目录 当使用了svn版本控制系统后每个目录下都会有一个.svn目录存在,开发完当交付产品或者上传到服务器时一般要把这些目录删除,这里总结了一下在linux和win下的办法. 一.在linux ...

最新文章

  1. MS SQL SERVER2005 分页存储过程
  2. 关于阿里面试的的一个小题
  3. 有关windows 10自动更新 永久关闭
  4. Linux Kickstart无人值守安装(上)
  5. 这篇博士论文致谢句句诛心......
  6. 【网络小说推荐】纨绔才子
  7. python中类的定义方法_Python类的定义、方法和属性使用
  8. 常用电子元件识别图解大全
  9. 合肥市关于印发合肥市大数据发展行动纲要(2016—2020)的通知
  10. 【修电脑】电脑将在1分钟后重启
  11. 爬取豆瓣电影排行榜(评分)
  12. 禅道mysql怎么在本地配置_本地安装部署禅道
  13. 复古传奇服务器维护时间,复古传奇手游刷怪时间
  14. 做饭真的很简单!做饭扫盲贴!
  15. 记一次面试准备(续上)
  16. vue-cropper图片裁剪 PC
  17. UT、IT、ST、UAT
  18. 安凯AK3918E加载mtk7601驱动不能ifconfig wlan0 down
  19. 除了茶颜悦色、文和友?长沙打造旅游城市缺什么?
  20. 谷歌最新的百分比布局库的示例项目

热门文章

  1. css设置元素继承父元素宽度_CSS设置HTML元素的高度与宽度的各种情况总结
  2. 原生js实现轮播图实例教程
  3. 【新星计划】MATLAB-定义函数
  4. 我们注意到您的计算机目前处于离线状态_如何将您的计算机添加到Pekka网络
  5. C语言实验——拍皮球_JAVA
  6. leetcode -day19 Convert Sorted List to Binary Search Tree
  7. 倒排索引(Inverted File Index )
  8. 你想了解的「SpringCloud」都在这里
  9. 「消息队列」看过来!
  10. Java 解惑(Java Puzzler)