前言
支持向量机下文简称SVM,是目前学习的所有算法中最难(数学上)的一个算法。但是他同样也是目前学习的算法中用途最广泛,最流行的明星算法。他可以用来分类,用来回归,用来进行检测异常。
1.什么是硬间隔SVM?
在二维空间中划分正反例的就是一条直线,在多维空间中我们可以想象有一个超平面能够帮助我们完成分类任务。
硬间隔支持向量机有两个目的:1是完美划分正反例 ,2 是尽可能使超平面远离最近的正反例(下图红圈圈出的一正一反的向量,也叫支持向量),或者叫寻找最大间隔(两条虚线之间的距离)。 目的1是所有分类器都应该要努力追求的,目的2可以从下图看出有另外两条斜线也能很好的分开正反例,想象一下,这时有一个点非常靠近这两条斜线,学习器结果就容易出错。因此他的泛化能力一定是弱于中间分的那个条线。
2.SVM到底如何工作的?
和逻辑回归,多元线性回归一样,SVM也有自己的损失函数(如下图公式),这个凸优化问题其实就是求解最大的间隔。
因为数学对我来说确实太难,简单说一下吧,这个凸优化问题的解法一般有SMO,拉格朗日以及梯度下降。两个点需要记住:1.当我们的数据样本的特征远远大于样本数量使推荐使用拉格朗日求偶,因为效率会比较高。2.是求解的难度和样本数量m是成正比的。
3.核函数
核函数是很难的概念,我用我自己的白话解释解释。当遇到一些线性不可分的数据集时,我们可以把样本从原始空间映射到一个更高维的特征空间(比如从二维变成三维),使得这个原本不可分的数据集变得可分。西瓜书原话:如果原始空间是有限维,即属性数有限,那么一定存在一个高纬度空间使样本可分。但是出现一个问题如果这些特征空间的维数很高,甚至可能是无穷维,直接计算这些维度之间的内积是非常困难的,这时核函数带着它的核魔法来了,核函数能够在原始样本空间中计算出的结果就等于高维度特征空间的内积。
常见的核函数有四种,分别是:linear, poly,rbf,sigmoid。这里的名字完全能对应到sklearn当中去,下面代码都有。
介绍一下他们的特点:
名字 | 中文 | 特点 |
---|---|---|
linear | 线性核 | 一般来说,先用线性核跑模型,别问为什么,问就是快 |
poly | 多项式核 | 多项式核需要degree属性 |
rbf | 高斯径向基核 | 一般来说高斯在什么样的数据集中都发挥良好。(高斯高斯,yyds) |
sigmoid | sigmoid核 | 一般来说什么数据集,sigmoid跑出来都很不行 |
核函数的选择特别的重要,若核函数不适合,则意味着将样本映射到了一个不适合的空间,结果就拉垮
4. 软间隔支持向量机
和硬间隔支持向量机的逻辑几乎相同,在此基础上,软间隔允许学习器在学习的过程中或者说训练当中有一些样本被分类错误。在松弛变量前的常数C,就比较像正则化参数对于逻辑回归的影响。在下面乳腺癌的例子中,我们也可以看出,软间隔支持向量机的泛化能力更强。
5. 支持向量回归(SVR)
简单提一嘴,SVR和SVM的优化问题很像,SVR实际是以超平面为中心,找到一个宽度为的2E尽可能小的间隔带,与此同时希望间隔带尽可能地多地把所有样本都包含住。
6. 代码实现
以sklearn数据集中的乳腺癌数据为例。
from sklearn.datasets import load_breast_cancer
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn