支持向量机实例

Posted Karen读书笔记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了支持向量机实例相关的知识,希望对你有一定的参考价值。



SVM能对线性和非线性的数据的进行回归和分类,也可以识别异常数据。SVM更适合于对复杂中小型数据进行分类。

 

01

线性支持向量机分类器


SVC(kernel=’linear’)

支持向量机实例


定义svc间隔边界并画图

支持向量机实例


两条虚线是SVM分类的最大间隔边界,在两条边界之外增加更多的数据不会影响分类,所以决定分类的是间隔边界上的点。这样不仅把实例正确的分类,且有最高的确信度

支持向量机实例

 

SVM对于归一化很敏感,如果数据特征的取值范围相差较大且没做归一化可以看到间隔边界很窄(左图),右图归一化后间隔边界增大确信度增大

支持向量机实例

 

软边界分类

数据会有异常点以及噪音,不会总是那么完美的分隔,因此软边界分类是一个相对灵活的模型,让间隔边界足够的大同时让margin violations尽量的小。

 

LinearSVC(loss=’hinge’),也可以选择使用SVC(kernel=‘linear’)但会慢很多。还可以选择SGD(loss=”hinge”)训练svm分类器,虽然收敛比较慢但数据量大的时候很有用。

支持向量机实例


Pipline的svm需要unscaled参数回去。LinearSVC不支持直接找支持向量,需要计算。

支持向量机实例


在sklearn里面通过控制超参数c,c越小间隔边界越大margin violation越大,c越大间隔边界越小margin violation越小。如果SVM模型过拟合,则应该减小c

支持向量机实例


02

非线性支持向量机分类器

创建数据集

支持向量机实例


Add Polynomial Feature

这样的数据线性不可分,如果多项式,给数据特征多加几个degree的特征就可分了。LinearSVC(loss=’hinge’)

支持向量机实例
支持向量机实例


Polynomial Kernel

增加多项式特征对于许多算法都可以应用,但是多项式degree低的不能处理复杂的数据集,degree高的会产生很多特征模型会很慢。在SVM里面可以使用kernel trick达到一样的效果而不真正的产生这些特征。(映射在特征空间)

SVC(kernel=’poly’)

支持向量机实例

 

可以看到degree越高模型越复杂,最优参数的选择可以使用gridsearch。

支持向量机实例


Gaussian RBF Kernel

RBF可以增加相似的特征

Gaussian Radial Basis Function (RBF) 高斯核函数

支持向量机实例

高斯核函数把数据映射到无穷维,此时线性可分

支持向量机实例


映射后的x,一维坐标表示对于特征x2的相似度,二维坐标表示对于特征x3的相似度。

支持向量机实例

 

Gamma越大,bell-shape曲线更窄,实例映射后的影响范围更小,决策边界越不规律,会随着实例个体的变化而变化容易过拟合。相反gamma越小,决策边界越光滑。(和超参数c一样,过拟合减小)

 

Tips

首选linear kerneal(LinearSVC,因为LinearSVC比SVC(kernel=’linear’)更快),如果训练数据不是很大可以使用Gaussian RBF kernel。

支持向量机实例


03

SVM回归


SVM在分类的时候是要找到最大间隔且margin violation尽量小,SVM回归是把实例拟合分隔带同时margin violation尽量小。间隔带的宽度由超参数ε控制,ε越大越宽。在边界里面增加实例并不会影响模型的预测。

 

LinearSVR(epsilon=0.5)

支持向量机实例
支持向量机实例


对于非线性的回归可以使用kernel

SVR(kernel=’linear’)

支持向量机实例


 

04

练习

  1. SVM分类器可以输出对实例的置信度和概率吗?

    实例到间隔边界的距离可以作为置信度(0-1),但不能直接作为分类的概率。可以通过设置probability=True,Logistic Regression 会通过置信度的分数转换成概率,这时SVM可以使用 predict_proba()


  2. 训练SVM问题,有百万个数据几百个特征,应该使用原始问题解决还是对偶形式解决?

    使用核技巧的SVM一定是使用了对偶形式解决,所以速度较慢。这个问题只针对于linear SVM,原始问题计算复杂度是和实例数成正比,但是对偶问题的计算复杂度是m的二次方到三次方。所以数据非常多的时候应该选择原始形式。


  3. 训练SVM分类器时使用RBF kernel,这时欠拟合,怎么调整参数ganmma和c?

    Gamma调大,c调大


  4. 用SVC、SGD、LinearSVC训练线性可分数据

支持向量机实例
支持向量机实例


   5.   用SVM classifier训练MNIST数据集

         读取数据

支持向量机实例

         LinearSVC

支持向量机实例

        LinearSVC 特征归一化

支持向量机实例

       SVC,kernel默认为RBF,二分类ovr

支持向量机实例

       SVC Random Search

支持向量机实例

      

       最佳模型在验证集的表现

支持向量机实例

      有一点过拟合,还有调整的空间。

 

 

   6.  SVM训练 California Housing dataset

 

      读取数据,特征归一化

支持向量机实例

      LinearSVR

支持向量机实例

LinearSVR random search

支持向量机实例



  最佳模型在验证集的表现



Reference:《Hands-On Machine Learning with Scikit-Learn&TensorFlow》

代码:https://github.com/ageron/handson-ml/blob/master


以上是关于支持向量机实例的主要内容,如果未能解决你的问题,请参考以下文章

什么是支持向量机?

支持向量机(2)

数据挖掘-支持向量机

支持向量机——核技巧

支持向量机实例

支持向量机(SVM)基本原理