scikit-learn 流程图
在机器学习过程中,一项重要问题就是针对不同类型的数据集和问题进行合适的模型选择。
在python的scikit文档库中提供了一般的模型选择流程:

SVM算法

SVM算法原理

1.综述

根据数据集的性质,SVM算法可以被分为3类:
- linear support vector machine in linearly separable case(数据集线性可分)
- linear support vector machine(数据集基本线性可分:引入松弛变量)
- non-linear support vector machine (数据集线性不可分: kernel)

2. 函数间隔和几何间隔

函数间隔: 对于给定的数据集和超平面( w , b ), 定义超平面( w , b )关于样本点( x , y )
的函数间隔是 γ^=y(wx+b) 其中,超平面是 wx+b=0 ,所以 |wx+b| 相对可以标示距离远近,而和类标记 y 的乘积可以标示分类是否正确

其中数据集的函数间隔就是所有数据样本点中距离最近的点

几何间隔: 对函数间隔进行标准化,即令 w=1 , 则得到关于样本点( x , y )的几何间隔
γ=y(wwx+bw)

从概念中可以得到几何间隔和函数间隔关于 1w 成正比

3.间隔最大化

SVM求解正确划分数据集并且几何间隔最大化的超平面
感知机算法(Perceptron)专注于误分类最小策略,解有无数个,SVM最优解唯一

线性可分SVM优化

对于线性可分SVM,优化表示: minw,b12w2 s.t.y(wx+b)10,i=1,2,,N
可求得对应对偶算法为 minα12i=1Nj=1Nαiαjyiyj(xixj)i=1Nαi
s.t.i=1Nαiyi=0,αi0
通过化简和KKT条件可以求得 f(x)=sign(1Nαiyi(xxi)+b)

部分线性可分SVM优化

可以引入松弛变量,使得函数间隔加上松弛变量后 1 。即可得到凸优化问题: minw,b,ξ12w2+Ci=1Nξi

非线性SVM

引入kernel函数,将线性可分SVM中的内积用核函数替代
其中核函数需要满足 K(x,y)=ϕ(x)ϕ(y)
主要的核函数类型有:
- Linear Kernel K(x,y)=xy ,既是内积
- Polynomial Kernel K(x,y)=(γxy+z)d , γ,z,d 都是参数
- Gaussian Kernel K(x,y)=exp(γxy2) , γ 是参数
- sigmoid Kernel K(x,y)=tanh(γxy+1) ,其中 γ 是参数
在SVM中,常用正定核函数来进行求解。

正定核充要条件: x,K(x,y) 对应的Gram矩阵是半正定矩阵

SVM算法评价和使用

SVM的主要优点均是由支撑向量的存在而引出的:
- effective in high dimensional spaces(Kernel)
- 在维数远大于样本数时依然有效(support vectors)
- 可以改变Kernel解决不同的决策功能要求
缺点类似于大部分小型判别模型分类器:
- 维数太大时性能较差
- 不直接提供概率估计,概率模拟可以使用CV(expensive)

skicit-learn SVM算法库

分类

  1. LinearSVC → linear Kernel
  2. SVC → other Kernel + 松弛变量的惩罚系数 C[0,]
  3. NuSVC → other Kernel + 等效参数 ν(0,1] ,表示误分类的上限和support vector所占比例下限

使用选择

  1. 对于小样本问题(samples<100k),优先使用LinearSVC。
  2. 效果不好且不是处理文本类型问题时,继续使用SVC求解。

R.F.
1. 由于Support Vector的原理,svc优先适合解决小样本分类问题
2. 而且LinearSVC不需要调参,对于不是特别复杂的问题可以直接求解
3. LinearSVC基于liblinear,求解线性问题时,运算速度远大于 libsvm-based SVC


运算复杂度确定:
SVM的核心是二次规划(QP),在于将support vector和其余训练数据分离。
运算复杂度在 O(nfeatures×n2samples) O(nfeatures×n3samples) 之间


Tips:
SVM算法不是尺度不变量,最好根据实际对数据进行[0,1]或[-1,+1]之间的scaling和(0,1)标准化
LinearSVC在底层运算中使用随机数生成器来选择特征,因此对于相同的数据输入可能结果有轻微不同


对于multi-class问题:
1. SVC和NuSVC使用one-against-one进行多类分类。总共需要创建n_class*(n_class-1)/2种分类器
2. LinearSVC使用one-against-rest进行多类分类。总共需要创建n_class分类,速度快,效果差

调参问题

可以总结简单表格如下:

参数 LinearSVC SVC NuSVC
惩罚系数C 默认是1,可以CV选择,噪声越大,C相对越小 同左
kernel ‘linear’是线性核函数;’rbf’高斯核;’poly’多项式核;’sigmoid’ 同左
penaly ‘l1’为L1正则,’l2’为L2正则;默认L2,稀疏选择L1
dual 是否用对偶优化;如果样本量远大于特征,不适用对偶优化
class_weight 样本权重,balanced自动调权,样本越多权重越小

基础如上


RBF核函数参数影响:
γ 定义单个训练样本的影响到达多远, γ 越低,影响越远
C决定决策表面的光滑性。C越低,表面越光滑

更多相关文章

  1. python学习笔记10(函数一): 函数使用、调用、返回值
  2. Linux下共享内存相关函数
  3. Linux回调函数的应用---已经验证
  4. c中变参函数的理解和编写(hello world引发的思考)
  5. 浅谈Oracle函数返回Table集合
  6. Linux-C语言函数手册
  7. Linux 下nice 函数用法提高一个进程的友善值
  8. 设置查看linux 造成程序Core dumped 的函数调用层次
  9. 为什么函数在ELF中的其他共享库的长度信息?

随机推荐

  1. Android自动化测试之如何安装Android虚拟
  2. Android与JS互调的简单使用
  3. android开启线程的误区
  4. 我的Android音乐播放器
  5. 多个 Android Drawable shape 组合画田字
  6. Android 修改EditText光标颜色
  7. Android系统Surface机制的SurfaceFlinger
  8. android之视频播放
  9. Android中drawable使用Shape资源
  10. Android:创建窗口式Activity