1.svm
1.1 svm基本概念
支持向量机(support vector machines,SVM)是一种二分类模型,它将实例的特征向量映射为空间中的一些点,SVM 的目的就是想要画出一条线,以 “最好地” 区分这两类点,以至如果以后有了新的点,这条线也能做出很好的分类。SVM 适合中小型数据样本、非线性、高维的分类问题。
SVM特别适⽤于中⼩型复杂数据集的分类。
将实例的特征向量(以二维为例)映射为空间中的一些点,如下图的实心点和空心点,它们属于不同的两类。SVM 的目的就是想要画出一条线,以“最好地”区分这两类点,以至如果以后有了新的点,这条线也能做出很好的分类。
Q1:能够画出多少条线对样本点进行区分?
答:线是有无数条可以画的,区别就在于效果好不好,每条线都可以叫做一个划分超平面。比如上面的绿线就不好,蓝线还凑合,红线看起来就比较好。我们所希望找到的这条效果最好的线就是具有 “最大间隔的划分超平面”。
Q2:为什么要叫作“超平面”呢?
答:因为样本的特征很可能是高维的,此时样本空间的划分就不是一条线了。
Q3:画线的标准是什么?/ 什么才叫这条线的效果好?/ 哪里好?
答:SVM 将会寻找可以区分两个类别并且能使间隔(margin)最大的划分超平面。比较好的划分超平面,样本局部扰动时对它的影响最小、产生的分类结果最鲁棒、对未见示例的泛化能力最强。
Q4:间隔(margin)是什么?
答:对于任意一个超平面,其两侧数据点都距离它有一个最小距离(垂直距离),这两个最小距离的和就是间隔。比如下图中两条虚线构成的带状区域就是 margin,虚线是由距离中央实线最近的两个点所确定出来的(也就是由支持向量决定)。但此时 margin 比较小,如果用第二种方式画,margin 明显变大也更接近我们的目标。
Q5:为什么要让 margin 尽量大?
答:因为大 margin 犯错的几率比较小,也就是更鲁棒啦。
Q6:支持向量是什么?
答:从上图可以看出,虚线上的点到划分超平面的距离都是一样的,实际上只有这几个点共同确定了超平面的位置,因此被称作 “支持向量(support vectors)”,“支持向量机” 也是由此来的。
1.2.硬间隔、软间隔
1.2.1 硬间隔
硬间隔就是用一个超平面将两类完全分开,所有的点都位于间隔两侧,间隔中没有点
- 硬间隔分类有两个问题,⾸先,它只在数据是线性可分离的时候才有效;其次,它对异常值⾮常敏感。
1.2.2 软间隔
软间隔允许间隔中有点并且可以有错误的分类点
目标是尽可能在保持最⼤间隔宽度和限制间隔违例(即位于最⼤间隔之上,甚⾄在错误的⼀边的实例)之间找到良好的平衡
1.3 SVM的损失函数
- 绿色:0/1损失
- 当正例的点落在y=0这个超平面的下边,说明是分类正确,无论距离超平面所远多近,误差都是0.
- 当这个正例的样本点落在y=0的上方的时候,说明分类错误,无论距离多远多近,误差都为1.
- 图像就是上图绿色线。
- 蓝色:SVM Hinge损失函数
- 当一个正例的点落在y=1的直线上,距离超平面长度1,那么1-ξ=1,ξ=0,也就是说误差为0;
- 当它落在距离超平面0.5的地方,1-ξ=0.5,ξ=0.5,也就是说误差为0.5;
- 当它落在y=0上的时候,距离为0,1-ξ=0,ξ=1,误差为1;
- 当这个点落在了y=0的上方,被误分到了负例中,距离算出来应该是负的,比如-0.5,那么1-ξ=-0.5,ξ=1.5.误差为1.5.
以此类推,画在二维坐标上就是上图中蓝色那根线了。
- 红色:Logistic损失函数
- 损失函数的公式为:ln(1+e^{-y_i})ln(1+e−yi)
- 当yi=0时,损失等于ln2,这样真丑,所以我们给这个损失函数除以ln2.
- 这样到yi=0时,损失为1,即损失函数过(0,1)点
- 即上图中的红色线。
1.4 SVM的核⽅法
1.4.1 核函数概念
将原始输⼊空间映射到新的特征空间,从⽽,使得原本线性不可分的样本可能在核空间可分。
假设X是输⼊空间,
H是特征空间,
存在⼀个映射ϕ使得X中的点x能够计算得到H空间中的点h,
对于所有的X中的点都成⽴:
若x,z是X空间中的点,函数k(x,z)满⾜下述条件,那么都成⽴,则称k为核函数,⽽ϕ为映射函数:
1.4.1.1 核函数举例
通过上述公式可以将原来的位于二维空间中的不能用一个超平面分割的点映射到三维空间中
映射之后的点便可以用一个超平面分割
常用的核函数
1.5 SVM回归
SVM回归是让尽可能多的实例位于预测线上,同时限制间隔违例(也就是不在预测线距上的实例)。
线距的宽度由超参数ε控制。
1.6 svm api
sklearn中⽀持向量分类主要有三种⽅法:SVC、NuSVC、LinearSVC,扩展为三个⽀持向量回归⽅法:SVR、
NuSVR、LinearSVR。
class sklearn.svm.SVC(C=1.0, kernel='rbf', degree=3,coef0=0.0,random_state=None)
class sklearn.svm.NuSVC(nu=0.5)
class sklearn.svm.LinearSVC(penalty='l2', loss='squared_hinge', dual=True, C=1.0)