支持向量机算法_支持向量机算法介绍及其参数讲解

算法介绍

支持向量机(SupportVector Machine, SVM)是一类按监督学习(supervised learning)方式对数据进行二元分类的广义线性分类器(generalized linear classifier),其决策边界是对学习样本求解的最大边距超平面(maximum-margin hyperplane)。

支持向量机(supportvector machines, SVM)是一种二分类模型,它的基本模型是定义在特征空间上的间隔最大的线性分类器,间隔最大使它有别于感知机;SVM还包括核技巧,这使它成为实质上的非线性分类器。SVM的的学习策略就是间隔最大化,可形式化为一个求解凸二次规划的问题,也等价于正则化的合页损失函数的最小化问题。SVM的的学习算法就是求解凸二次规划的最优化算法。

支持向量机种类:

线性支持向量机:就是一条线可以完全把数据进行分类。

线性可分示意图

支持向量机算法_支持向量机算法介绍及其参数讲解_第1张图片

非线性支持向量机:利用核函数将数据映射到高维空间,然后在更高的维度中把数据进行分类。

线性不可分示意图

支持向量机算法_支持向量机算法介绍及其参数讲解_第2张图片

SVM原理:找到能区分特征空间最大间隔的分类器,把问题转化成一个凸二次规划问题的求解。只要保证每个类别的这些支持向量跟分类机的几何距离最大,就可以保证分类的准确度。SVM学习的基本想法是求解能够正确划分训练数据集并且几何间隔最大的分离超平面。如下图所示,wx+b=0即为分离超平面,对于线性可分的数据集来说,这样的超平面有无穷多个(即感知机),但是几何间隔最大的分离超平面却是唯一的。

算法示意图

支持向量机算法_支持向量机算法介绍及其参数讲解_第3张图片

非线性SVM算法原理:对于输入空间中的非线性分类问题,可以通过非线性变换将它转化为某个维特征空间中的线性分类问题,在高维特征空间中学习线性支持向量机。由于在线性支持向量机学习的对偶问题里,目标函数和分类决策函数都只涉及实例和实例之间的内积,所以不需要显式地指定非线性变换,而是用核函数替换当中的内积。核函数表示,通过一个非线性转换后的两个实例间的内积。

算法优势

优点

  1. 有严格的数学理论支持,可解释性强,不依靠统计方法,从而简化了通常的分类和回归问题;

  2. 能找出对任务至关重要的关键样本(即:支持向量);

  3. 采用核技巧之后,可以处理非线性分类/回归任务;

  4. 最终决策函数只由少数的支持向量所确定,计算的复杂性取决于支持向量的数目,而不是样本空间的维数,这在某种意义上避免了“维数灾难”。

缺点

  1. 训练时间长。当采用 SMO 算法时,由于每次都需要挑选一对参数,因此时间复杂度为O(N2),其中N为训练样本的数量;

  2. 当采用核技巧时,如果需要存储核矩阵,则空间复杂度为O(N2);

  3. 模型预测时,预测时间与支持向量的个数成正比。当支持向量的数量较大时,预测计算复杂度较高。

  4. 支持向量机目前只适合小批量样本的任务,无法适应百万甚至上亿样本的任务。

参数介绍

sklearn.svm.SVC(*,C=1.0,kernel='rbf',degree=3,gamma='scale',coef0=0.0,shrinking=True,probability=False,tol=0.001,cache_size=200,class_weight=None,verbose=False,max_iter=-1,decision_function_shape='ovr',break_ties=False,random_state=None)

参数:

  1. C: 目标函数的惩罚系数C,用来平衡分类间隔margin和错分样本的,default C=1.0;

  2. kernel:参数选择有RBF,Linear,Poly,Sigmoid,precomputed或者自定义一个核函数, 默认的是RBF,即径向基核,也就是高斯核函数;而Linear指的是线性核函数,Poly指的是多项式核,Sigmoid指的是双曲正切函数tanh核。

    在这里需要具体讲一下各种核函数怎么使用:

    (1).RBF核:高斯核函数就是在属性空间中找到一些点,这些点可以是也可以不是样本点,把这些点当做base,以这些base为圆心向外扩展,扩展半径即为带宽,即可划分数据。换句话说,在属性空间中找到一些超圆,用这些超圆来判定正反类。

    (2).线性核和多项式核:这两种核的作用也是首先在属性空间中找到一些点,把这些点当做base,核函数的作用就是找与该点距离和角度满足某种关系的样本点。当样本点与该点的夹角近乎垂直时,两个样本的欧式长度必须非常长才能保证满足线性核函数大于0;而当样本点与base点的方向相同时,长度就不必很长;而当方向相反时,核函数值就是负的,被判为反类。即,它在空间上划分出一个梭形,按照梭形来进行正反类划分。

    (3).Sigmoid核:同样地是定义一些base,核函数就是将线性核函数经过一个tanh函数进行处理,把值域限制在了-1到1上。

    总之,都是在定义距离,大于该距离,判为正,小于该距离,判为负。至于选择哪一种核函数,要根据具体的样本分布情况来确定。

  3. degree:degree决定了多项式的最高次幂;

  4. gamma:核函数的系数('Poly','RBF','Sigmoid'), 默认是gamma=1/n_features,即核函数的带宽,超圆的半径;

  5. coef0:核函数中的独立项,'RBF'和'Poly'有效,即加在这两种核函数后面的bias值,次幂为0的项,默认是0.0,即认为多项式的核的常数项为0;

  6. probablity: 布尔取值,默认是false,指的是预测判定的时候是否采用概率估计;

  7. shrinking:是否进行启发式;

  8. tol(default=1e-3): svm结束标准的精度,即容忍1000分类里出现一个错误;

  9. cache_size: 制定训练所需要的内存(以MB为单位);

  10. class_weight: 正类和反类的样本数量是不一样的,这里就会出现类别不平衡问题,该参数就是指每个类所占据的权重,默认为1,即默认正类样本数量和反类一样多,也可以用一个字典dict指定每个类的权值,或者选择默认的参数balanced,指按照每个类中样本数量的比例自动分配权值。

  11. verbose: 在训练数据完成之后,会把训练的详细信息全部输出打印出来,可以看到训练了多少步,训练的目标值是多少;但是在多线程环境下,由于多个线程会导致线程变量通信有困难,因此verbose选项的值就是出错,所以多线程下不要使用该参数。

  12. max_iter: 最大迭代次数,这个是硬限制,它的优先级要高于tol参数,不论训练的标准和精度达到要求没有,都要停止训练。默认值是-1,指没有最大次数限制;

  13. decision_function_shape:原始的SVM只适用于二分类问题,如果要将其扩展到多类分类,就要采取一定的融合策略,这里提供了三种选择。ovo一对一,决策所使用的返回的是(样本数,类别数*(类别数-1)/2),ovr一对多,返回的是(样本数,类别数),或者None,就是不采用任何融合策略, 默认是ovr,因为此种效果要比oro略好一点。

  14. random_state :在使用SVM训练数据时,要先将训练数据打乱顺序,用来提高分类精度,这里就用到了伪随机序列。如果该参数给定的是一个整数,则该整数就是伪随机序列的种子值;如果给定的就是一个随机实例,则采用给定的随机实例来进行打乱处理;如果啥都没给,则采用默认的 np.random实例来处理。

属性

  1. support_:是一个array类型,它指的是训练出的分类模型的支持向量的索引,即在所有的训练样本中,哪些样本成为了支持向量。

  2. support_vectors_:支持向量的集合,即汇总了当前模型的所有的支持向量。

  3. n_support_:比如SVC将数据集分成了4类,该属性表示了每一类的支持向量的个数。

  4. dual_coef_:array,shape=[n_class-1,n_SV]对偶系数支持向量在决策函数中的系数,在多分类问题中,这个会有所不同。

  5. coef_:array,shape=[n_class-1,n_features]该参数仅在线性核时才有效,指的是每一个属性被分配的权值。

  6. intercept_:array,shape=[n_class*(n_class-1)/2]决策函数中的常数项bias。和coef_共同构成决策函数的参数值。

调优方法

  1. 对训练数据和测试数据最好都做归一化;

  2. 如果特征非常多,或者样本数远少于特征数时,数据更偏向线性可分,用线性核函数效果就会很好;

  3. 优先选择线性核函数,如果拟合不好同,再推荐默认的高斯(rbf),因为高斯需要通过交叉验证选择适合的惩罚系数C和gamma;

  4. 理论上高斯不会比线性核差,但是高斯需要花非常多的时间在调参上,实际业务中能用线性就用线性.

    核函数选择:

    (1).RBF核:高斯核函数就是在属性空间中找到一些点,这些点可以是也可以不是样本点,把这些点当做base,以这些base为圆心向外扩展,扩展半径即为带宽,即可划分数据。换句话说,在属性空间中找到一些超圆,用这些超圆来判定正反类。

    (2).线性核和多项式核:这两种核的作用也是首先在属性空间中找到一些点,把这些点当做base,核函数的作用就是找与该点距离和角度满足某种关系的样本点。当样本点与该点的夹角近乎垂直时,两个样本的欧式长度必须非常长才能保证满足线性核函数大于0;而当样本点与base点的方向相同时,长度就不必很长;而当方向相反时,核函数值就是负的,被判为反类。即,它在空间上划分出一个梭形,按照梭形来进行正反类划分。

    (3).Sigmoid核:同样地是定义一些base,核函数就是将线性核函数经过一个tanh函数进行处理,把值域限制在了-1到1上。

    总之,都是在定义距离,大于该距离,判为正,小于该距离,判为负。至于选择哪一种核函数,要根据具体的样本分布情况来确定。 

    一般有如下指导规则

    (1).应用最广的应该就是RBF核,无论是小样本还是大样本,高维还是低维等情况,RBF核函数均适用。

    (2).如果Feature的数量很大,甚至和样本数量差不多时,往往线性可分,这时选用LR或者线性核Linear;

    (3).如果Feature的数量很小,样本数量正常,不算多也不算少,这时选用RBF核;

    (4).如果Feature的数量很小,而样本的数量很大,这时手动添加一些Feature,使得线性可分,然后选用LR或者线性核Linear;

    (5).多项式核一般很少使用,效率不高,结果也不优于RBF;

    (6).Linear核参数少,速度快;RBF核参数多,分类结果非常依赖于参数,需要交叉验证或网格搜索最佳参数,比较耗时;

适用场景

SVM主要是处理二分类场景的问题。

SVM在各领域的模式识别问题中有应用,包括人像识别、文本分类、手写字符识别、生物信息学等。

demo示例

from sklearn import svmX = [[0, 0], [1, 1]]y = [0, 1]clf = svm.SVC()clf.fit(X, y)# SVC()clf.predict([[2., 2.]])# array([1])# get support vectorsclf.support_vectors_# array([[0., 0.], [1., 1.]])# get indices of support vectorsclf.support_# array([0, 1]...)# get number of support vectors for each classclf.n_support_# array([1, 1]...)# Multi-class classification(多分类)X = [[0], [1], [2], [3]]Y = [0, 1, 2, 3]clf = svm.SVC(decision_function_shape='ovo')clf.fit(X, Y)# SVC(decision_function_shape='ovo')dec = clf.decision_function([[1]])dec.shape[1] # 4 classes: 4*3/2 = 6# 6clf.decision_function_shape = "ovr"dec = clf.decision_function([[1]])dec.shape[1] # 4 classes# 4# On the other hand, LinearSVC implements “one-vs-the-rest” multi-class strategy, thus training n_classes models.lin_clf = svm.LinearSVC()lin_clf.fit(X, Y)# LinearSVC()dec = lin_clf.decision_function([[1]])dec.shape[1]# 4

你可能感兴趣的:(支持向量机算法)