支持向量机
支持向量机是一个功能请打并且全面的机器学习模型,它能够执行线性或非线性、回归,甚至是异常值检测任务。它是机器学习领域最受欢迎的模型之一。SVM特别适用于中小型复杂数据集的分类。
一、线性SVM分类
可以将SVM分类器视为在类别之间拟合可能的最宽的街道,因此也可以叫做大间隔分类。
注意,在街道意外的地方增加更多训练实例,不会对决策边界产生影响,也就是说它完全由街道边缘的实例所决定。SVM对特征的缩放非常敏感。
二、软间隔分类
1、硬间隔分类:如果严格地让所有实例都不在街道上,并且位于正确的一边
2、硬间隔分类的两个问题:(1)它只在数据是线性可分离的时候才有效
(2)它对于异常值非常敏感
3.软间隔分类:避免这些问题,最好使用更灵活的模型。目标是尽可能在保持街道宽度和限制间隔违例(即位于街道之上,升值在错误一边的实例)之间找到良好的平衡。
4.Scikit-Learn 的SVM类中,可以通过超参数C来控制这个平衡:C值越小,则街道越宽,但是间隔违例也会越多。
5.三种分类器的比较
(1)LinearSVC(C=1,loss="hinge")
(2)SVM(kernel = "linear",C = 1),但是这个要慢得多,特别是对于大型训练集而言
(3)SGDClassifier(loss="hinge",alpha=1/(m*C)),适用于常规梯度下降来训练线性SVM分类器。,不会像LinearSVC那样快速收敛,但是对于内存处理不了的大型数据集或是线性分类任务,它非常有效。
三、非线性SVM
在许多情况下,线性SVM分类器是有效的,并且通常出人意料的好,但是,有很多数据集远不是线性课分离的。处理非线性数据集的方法之一是添加更多特征,比如多项式特征,在某些情况下,这可能导致数据集变得线性可分离。
1.多项式核——添加多项式
添加多项式特征实现起来非常简单,并且对所有的机器学习算法有效。但是,如果多项式太低阶,处理不了费换成那个复杂的数据集,而高阶则会创造出戴昂的特征,导致模型太慢。
使用SVM时,可以运用数学技巧——核技巧
它产生的结果就跟添加了许多多项式特征,甚至是非常高阶的多项式特征一样,但实际上并不需要真的添加。
2.添加相似特征——用相似特征替代
(1)解决非线性问题的另一种技术是添加相似特征。这些特征经过相似函数计算得出,相似函数可以测量每个实例与一个特定地标之间的相似程度。
例:
在x1 =-2和x2 = 1处添加两个地标。接下来,采用高斯径向基函数(RBF)作为相似函数:
这是一个从0到1变化的钟形函数。实例x1=-1:它与第一个地标的距离为1,与第二个地标的距离为2.因此它的新特征为0.74,0.30
(2)怎么选择地标:
最简单的方法时在数据集里面一个实例的位置上创建一个地标。缺点是:一个有m个实例n个特征的训练集会被转换成一个m个实例
3.如何选择核函数
有那么多的核函数,该如何决定使用哪一个?有一个经验法则是,永远先从现行核函数开始尝试(LinearSVC 比 SVC(kernel =“linear”)快得多),特别是训练集非常大或特征非常多的时候。如果训练集不太大,你可以试试高斯RBF核, 大多数情况下它都非常好用。
4.计算复杂度
(1)liblinear库为线性SVM实现了一个优化算法,LinearSVC正是基于该库的。这个算法不支持核技巧,不过它与训练实例的数量和特征数量几乎线性相关:其训练时间复杂度大致为O(m x n)
(2)SVC是基于libsvm库的,这个库的算法支持核技巧。训练时间复杂度通常在和之间,这意味着如果训练实例的数量变大,它会慢得可怕,所以这个算法完美适用于复杂但是中小型的训练集。但是,它还是可以良好适应地特征数量的增加,特别是应对稀疏特征。
四、SVM回归
SVM回归要做的是让尽可能多的实例位于街道上,在同时街道的同时还限制间隔违例,SVM回归要让尽可能多的实例位于街道上,同时限制间隔为例。街道的宽度由超参数控制。
五、工作原理
线性SVM是通过简单地计算决策函数来预测新实例x的分类。如果结果为正,则预测类别是正类(1),否则为负类(0)
训练线性SVM分类器即意味着找到W和b的值,从而使这个间隔尽可能宽的同时,避免(硬间隔)或是限制(软间隔)间隔违例
(1)训练目标
要最小化||w||来得到尽可能大的间隔。但是,如果我们想要避免任何间隔违例(硬间隔),那么就要使所有正类训练集的决策函数大于1,负类训练集的决策函数小于-1。因此,我们可以将硬间隔线性SVM分类器的目标,看做一个约束优化问题,对所有实例:
公式:硬间隔线性SVM分类器的目标
使得
虽然最小化和结果相同,但是有一个简单好用的导数。而在W =0 时,是不可微的。优化算法在可微函数上的工作效果要好得多。
(2)软间隔
要达到软间隔的目标,需要引入一个松弛变量,衡量的是第i个实例多大程度上允许间隔违例。现在有两个相互冲突的目标:使松弛变量越小越好从而减少间隔违例,同时还要使 最小化以增大间隔。这正是超参数C的用武之地:允许我们在两个目标之间权衡。