史诗级干货长文支持向量机

Posted ZSYL

tags:

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

1. SVM算法简介

1.1 SVM算法导入

在很久以前的情⼈节,大侠要去救他的爱人,但魔鬼和他玩了⼀个游戏。

魔⻤在桌⼦上似乎有规律放了两种颜⾊的球,说:

“你⽤⼀根棍分开它们?要求:尽量在放更多球之后,仍然适⽤。”

于是⼤侠这样放,⼲的不错?


然后魔⻤,⼜在桌上放了更多的球,似乎有⼀个球站错了阵营。


怎么办?

把分解的⼩棍⼉变粗。

SVM就是试图把棍放在最佳位置,好让在棍的两边有尽可能⼤的间隙。

现在即使魔⻤放了更多的球,棍仍然是⼀个好的分界线。

然后,在SVM ⼯具箱中有另⼀个更加重要的技巧( trick)。 魔⻤看到⼤侠已经学会了⼀个trick,于是魔⻤给了⼤侠⼀ 个新的挑战。


现在,⼤侠没有棍可以很好帮他分开两种球了,现在怎么办呢?

当然像所有武侠⽚中⼀样⼤侠桌⼦⼀拍,球⻜到空中。然后,凭借⼤侠的轻功,⼤侠抓起⼀张纸,插到了两种球的中间。


现在,从魔⻤的⻆度看这些球,这些球看起来像是被⼀条曲线分开了。


再之后,⽆聊的⼤⼈们,把上⾯的物体起了别名:

球—— 「data」数据
棍⼦—— 「classifier」分类
最⼤间隙——「optimization」最优化
拍桌⼦——「kernelling」核⽅法
纸——「hyperplane」超平⾯

案例来源:http://bytesizebio.net/2014/02/05/support-vector-machines-explained-well/

⽀持向量机直观感受https://www.youtube.com/watch?v=3liCbRZPrZA

1.2 SVM算法定义

1.2.1 定义

SVM:SVM全称是supported vector machine(⽀持向量机),即寻找到⼀个超平⾯使样本分成两类,并且间隔最⼤。

SVM能够执⾏线性或⾮线性分类、回归,甚⾄是异常值检测任务。它是机器学习领域最受欢迎的模型之⼀。SVM特别适⽤于中⼩型复杂数据集的分类。

1.2.2 超平面最大间隔介绍


上左图显示了三种可能的线性分类器的决策边界:

虚线所代表的模型表现⾮常糟糕,甚⾄都⽆法正确实现分类。其余两个模型在这个训练集上表现堪称完美,但是它们的决策边界与实例过于接近,导致在⾯对新实例时,表现可能不会太好。

右图中的实线代表SVM分类器的决策边界,不仅分离了两个类别,且尽可能远离最近的训练实例。

1.2.3 硬间隔和软间隔

1.2.3.1 硬间隔分类

在上⾯我们使⽤超平⾯进⾏分割数据的过程中,如果我们严格地让所有实例都不在最⼤间隔之间,并且位于正确的⼀ 边,这就是硬间隔分类。

硬间隔分类有两个问题,⾸先,它只在数据是线性可分离的时候才有效;其次,它对异常值⾮常敏感。

当有⼀个额外异常值的鸢尾花数据:左图的数据根本找不出硬间隔,⽽右图最终显示的决策边界与我们之前所看到的⽆ 异常值时的决策边界也⼤不相同,可能⽆法很好地泛化。

1.2.3.2 软间隔分类

要避免这些问题,最好使⽤更灵活的模型。⽬标是尽可能在保持最⼤间隔宽阔和限制间隔违例(即位于最⼤间隔之上, 甚⾄在错误的⼀边的实例)之间找到良好的平衡,这就是软间隔分类。

要避免这些问题,最好使⽤更灵活的模型。⽬标是尽可能在保持间隔宽阔和限制间隔违例之间找到良好的平衡,这就是软间隔分类。


在Scikit-Learn的SVM类中,可以通过超参数C来控制这个平衡:C值越⼩,则间隔越宽,但是间隔违例也会越多。上图显示了在⼀个⾮线性可分离数据集上,两个软间隔SVM分类器各⾃的决策边界和间隔。

左边使⽤了⾼C值,分类器的错误样本(间隔违例)较少,但是间隔也较⼩。

右边使⽤了低C值,间隔⼤了很多,但是位于间隔上的实例也更多。看起来第⼆个分类器的泛化效果更好,因为⼤多数间隔违例实际上都位于决策边界正确的⼀边,所以即便是在该训练集上,它做出的错误预测也会更少。

1.3 小结

  • SVM算法定义
    • 寻找到⼀个超平⾯使样本分成两类,并且间隔最⼤。
  • 硬间隔和软间隔
    • 硬间隔
      • 只有在数据是线性可分离的时候才有效
      • 对异常值⾮常敏感
  • 软间隔
    • 尽可能在保持最⼤间隔宽阔和限制间隔违例之间找到良好的平衡

2. SVM算法API初步使用

>>> from sklearn import svm 
>>> X = [[0, 0], [1, 1]] 
>>> y = [0, 1] 
>>> clf = svm.SVC() 
>>> clf.fit(X, y) 
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
 decision_function_shape='ovr', degree=3, gamma='scale', kernel='rbf', 
 max_iter=-1, probability=False, random_state=None, shrinking=True, 
 tol=0.001, verbose=False)

在拟合后, 这个模型可以用来预测新的值:

>>> clf.predict([[2., 2.]]) 
array([1])

3. SVM算法原理

3.1 定义输入数据

假设给定⼀个特征空间上的训练集为:

至于为什么正负用(-1,1)表示呢?
其实这⾥没有太多原理,就是⼀个标记,你也可以⽤(2,-3)来标记。只是为了⽅便,y /y = y ∗ y 的过程中刚好 可以相等,便于之后的计算。)

3.2 线性可分支持向量机

⽐如我们看到的特征有2个:
x1, x2,组成最先⻅到的线性函数可以是w x + w x .
但也许这两个特征并不能很好地描述数据,于是我们进⾏维度的转化,变成了
w1 x1 + w2 x2 + w3 x1 x2 + w4 x1^2 + w5 x2^2 .
于是我们多了三个特征。⽽这个就是笼统地描述x的映射的。
最简单直接的就是:Φ(x) = x

以上就是线性可分⽀持向量机的模型表达式。我们要去求出这样⼀个模型,或者说这样⼀个超平⾯y(x),它能够最优地分离两个集合。

其实也就是我们要去求⼀组参数(w,b),使其构建的超平⾯函数能够最优地分离两个集合。

如下就是⼀个最优超平⾯:


⼜⽐如说这样:


阴影部分是⼀个“过渡带”,“过渡带”的边界是集合中离超平⾯最近的样本点落在的地⽅。

3.3 SVM的计算过程与算法步骤

3.3.1 推导目标函数

我们知道了⽀持向量机是个什么东⻄了。现在我们要去寻找这个⽀持向量机,也就是寻找⼀个最优的超平⾯。

于是我们要建⽴⼀个⽬标函数。那么如何建⽴呢?


拓展:什么是∣∣w∣∣?

3.3.2 目标函数的求解

到这⼀步,终于把目标函数给建立起来了。

那么下⼀步⾃然是去求目标函数的最优值.

因为⽬标函数带有⼀个约束条件,所以我们可以⽤拉格朗⽇乘⼦法求解

3.3.2.1 朗格朗⽇乘⼦法

啥是拉格朗⽇乘⼦法呢?

拉格朗⽇乘⼦法 (Lagrange multipliers)是⼀种寻找多元函数在⼀组约束下的极值的⽅法.

通过引⼊拉格朗⽇乘⼦,可将有 d 个变量与 k 个约束条件的最优化问题转化为具有 d + k 个变量的⽆约束优化问题求解。

3.3.2.2 对偶问题


参考资料:https://wenku.baidu.com/view/7bf945361b37f111f18583d049649b6649d70975.html

如何获取对偶函数?


3.3.2.3 整体流程确定


3.4 举例


1) ⾸先确定⽬标函数


2) 求得⽬标函数的极值



ps:参考的另⼀种计算⽅式:https://blog.csdn.net/zhizhjiaodelaoshu/article/details/97112073

3.5 小结


4. SVM的损失函数

在SVM中,我们主要讨论三种损失函数:


小结

  • SVM的损失函数
    • 0/1损失函数
    • Hinge损失函数
    • Logistic损失函数

5. SVM的核方法

【SVM + 核函数】 具有极⼤威⼒。

核函数并不是SVM特有的,核函数可以和其他算法也进⾏结合,只是核函数与SVM结合的优势⾮常⼤。

5.1 什么是核函数

5.1.1 核函数概念

核函数,是将原始输⼊空间映射到新的特征空间,从⽽,使得原本线性不可分的样本可能在核空间可分。

下图所示的两类数据,分别分布为两个圆圈的形状,这样的数据本身就是线性不可分的,此时该如何把这两类数据分开呢?

  • 假设X是输⼊空间,
  • H是特征空间,
  • 存在⼀个映射ϕ使得X中的点x能够计算得到H空间中的点h,
  • 对于所有的X中的点都成⽴:

5.1.2 核函数举例

5.1.2.1 核方法举例1



经过上⾯公式,具体变换过过程为:

5.1.2.2 核方法举例2

  • 下⾯这张图位于第⼀、⼆象限内。我们关注红⾊的⻔,以及“北京四合院”这⼏个字和下⾯的紫⾊的字⺟。
  • 我们把红⾊的⻔上的点看成是“+”数据,字⺟上的点看成是“-”数据,它们的横、纵坐标是两个特征。
  • 显然,在这个⼆维空间内,“+”“-”两类数据不是线性可分的。


(前后轴为x轴,左右轴为y轴,上下轴为z轴)

  • 绿⾊的平⾯可以完美地分割红⾊和紫⾊,两类数据在三维空间中变成线性可分的了。
  • 三维中的这个判决边界,再映射回⼆维空间中:是⼀条双曲线,它不是线性的。
  • 核函数的作⽤就是⼀个从低维空间到⾼维空间的映射,⽽这个映射可以把低维空间中线性不可分的两类点变成线性可分的。

5.2 常见核函数

1.多项核中,d=1时,退化为线性核;
2.高斯核亦称为RBF核。


5.3 小结

  • SVM的核方法
    • 将原始输⼊空间映射到新的特征空间,从而,使得原本线性不可分的样本可能在核空间可分。
    • 常见核函数
      • 线性核
      • 多项式核
      • RBF核
      • Sigmoid核

6. SVM回归

SVM回归是让尽可能多的实例位于预测线上,同时限制间隔违例(也就是不在预测线距上的实例)。

线距的宽度由超参数ε控制。

7. SVM算法API再介绍

7.1 SVM算法API综述

  • SVM⽅法既可以⽤于分类(⼆/多分类),也可⽤于回归和异常值检测。
  • SVM具有良好的鲁棒性,对未知数据拥有很强的泛化能⼒,特别是在数据量较少的情况下,相较其他传统机器学习算法具有更优的性能。

使⽤SVM作为模型时,通常采⽤如下流程:

  1. 对样本数据进⾏归⼀化
  2. 应⽤核函数对样本进⾏映射(最常采⽤和核函数是RBF和Linear,在样本线性可分时,Linear效果要⽐RBF好)
  3. ⽤cross-validation和grid-search对超参数进⾏优选
  4. ⽤最优参数训练得到模型
  5. 测试

sklearn中⽀持向量分类主要有三种⽅法:SVC、NuSVC、LinearSVC,扩展为三个⽀持向量回归⽅法:SVR、 NuSVR、LinearSVR。

  • SVC和NuSVC方法基本⼀致,唯⼀区别就是损失函数的度量⽅式不同
    • NuSVC中的nu参数和SVC中的C参数;
  • LinearSVC是实现线性核函数的⽀持向量分类,没有kernel参数。

7.2 SVC

class sklearn.svm.SVC(C=1.0, kernel='rbf', degree=3,coef0=0.0,random_state=None)
  • C: 惩罚系数,⽤来控制损失函数的惩罚系数,类似于线性回归中的正则化系数。

    • C越⼤,相当于惩罚松弛变量,希望松弛变量接近0,即对误分类的惩罚增⼤,趋向于对训练集全分对的情 况,这样会出现训练集测试时准确率很⾼,但泛化能⼒弱,容易导致过拟合。
    • C值⼩,对误分类的惩罚减⼩,容错能⼒增强,泛化能⼒较强,但也可能⽋拟合。
  • kernel: 算法中采⽤的核函数类型,核函数是⽤来将⾮线性问题转化为线性问题的⼀种⽅法。

    • 参数选择有RBF, Linear, Poly, Sigmoid或者⾃定义⼀个核函数。
      • 默认的是"RBF",即径向基核,也就是⾼斯核函数;
      • ⽽Linear指的是线性核函数,
      • Poly指的是多项式核,
      • Sigmoid指的是双曲正切函数tanh核;。
  • degree:

    • 当指定kernel为’poly’时,表示选择的多项式的最⾼次数,默认为三次多项式;
    • 若指定kernel不是’poly’,则忽略,即该参数只对’poly’有⽤。
      • 多项式核函数是将低维的输⼊空间映射到⾼维的特征空间。
  • coef0: 核函数常数值(y=kx+b中的b值),

    • 只有‘poly’和‘sigmoid’核函数有,默认值是0。

7.3 NuSVC

class sklearn.svm.NuSVC(nu=0.5)
  • nu: 训练误差部分的上限和⽀持向量部分的下限,取值在(0,1)之间,默认是0.5

7.4 LinearSVC

class sklearn.svm.LinearSVC(penalty='l2', loss='squared_hinge', dual=True, C=1.0)
  • penalty:正则化参数,
    • L1和L2两种参数可选,仅LinearSVC有。
    • loss:损失函数,
    • 有hinge和squared_hinge两种可选,前者⼜称L1损失,后者称为L2损失,默认是squared_hinge,
    • 其中hinge是SVM的标准损失,squared_hinge是hinge的平⽅
  • dual:是否转化为对偶问题求解,默认是True。
  • C:惩罚系数,
    • ⽤来控制损失函数的惩罚系数,类似于线性回归中的正则化系数。

7.5 小结

  • SVM的核⽅法
    • 将原始输⼊空间映射到新的特征空间,从⽽,使得原本线性不可分的样本可能在核空间可分。
  • SVM算法api
    • sklearn.svm.SVC
    • sklearn.svm.NuSVC
    • sklearn.svm.LinearSVC

8. 案例:数字识别器

学习目标

应用SVM算法实现数字识别器

请参考【机器学习】SVM算法案例:数字识别器

9. SVM总结

9.1 SVM基本综述

  • SVM是⼀种⼆类分类模型。
  • 它的基本模型是在特征空间中寻找间隔最⼤化的分离超平⾯的线性分类器。
    • 1)当训练样本线性可分时,通过硬间隔最⼤化,学习⼀个线性分类器,即线性可分⽀持向量机;
    • 2)当训练数据近似线性可分时,引⼊松弛变量,通过软间隔最⼤化,学习⼀个线性分类器,即线性⽀持向量机;
    • 3)当训练数据线性不可分时,通过使⽤核技巧及软间隔最⼤化,学习⾮线性⽀持向量机。

9.2 SVM优缺点

  • SVM的优点:
    • 在⾼维空间中⾮常⾼效;
    • 即使在数据维度⽐样本数量⼤的情况下仍然有效;
    • 在决策函数(称为⽀持向量)中使⽤训练集的⼦集,因此它也是⾼效利⽤内存的;
    • 通⽤性:不同的核函数与特定的决策函数⼀⼀对应;
  • SVM的缺点:
    • 如果特征数量⽐样本数量⼤得多,在选择核函数时要避免过拟合;
    • 对缺失数据敏感;
    • 对于核函数的⾼维映射解释⼒不强

加油!

感谢!

努力!

以上是关于史诗级干货长文支持向量机的主要内容,如果未能解决你的问题,请参考以下文章

史诗级干货长文朴素贝叶斯

史诗级干货长文K-近邻算法

史诗级干货长文聚类算法

史诗级干货长文集成学习算法

史诗级干货长文HMM模型

史诗级干货长文决策树算法