Blog of Samperson

SVM——Sklearn库实现

2018-06-24

SVM简介

输入 输出 适用的数据集 说明
SVM(支持向量机) 训练数据集 识别结果 小样本、非线性及高维、超高维模式识别问题中有优势;就算数据在原特征空间线性不可分,只要给个合适的核函数,它就能运行得很好 基于分类边界的方法:将低维空间的点映射到高维空间,使它们成为线性可分,再使用线性划分的原理来判断分类边界。内存消耗大,难以解释,运行和调参麻烦。
能够处理非线性特征的相互作用;无需依赖整个数据;可以提高泛化能力。
当观测样本很多时,效率并不是很高;对非线性问题没有通用解决方案,有时候很难找到一个合适的核函数;对缺失数据敏感。



[1] 给定一组训练实例,每个训练实例被标记为属于两个类别中的一个或另一个,SVM训练算法创建一个将新的实例分配给两个类别之一的模型,使其成为非概率二元线性分类器。SVM模型是将实例表示为空间中的点,这样映射就使得单独类别的实例被尽可能宽的明显的间隔分开。然后将新的实例映射到同一空间,并基于它们落在间隔的哪一侧来预测所属类别。
[2] 除了进行线性分类之外,SVM还可以核技巧有效地进行非线性分类,将其输入隐式映射到高维特征空间中。当数据未被标记时,不能进行监督式学习,需要用非监督式学习,它会尝试找出数据到簇的自然聚类,并将新数据映射到这些已形成的簇。将支持向量机改进的聚类算法被称为支持向量聚类,当数据未被标记或者仅一些数据被标记时,支持向量聚类经常在工业应用中用作分类步骤的预处理。
[3] SVM分为SVC和SVR两个方法:SVC中也可以实现多类分类问题,而且默认使用的是 1vs1 的投票机制,需要建立的分类器很多。SVC也考虑到了累不平衡问题,处理方式在fit方法fit(X, y, sample_weight=None)。SVR用来预测或者回归。


接下来主要介绍SVC方法。

Demo

1
2
3
4
5
6
7
8
9
10
11
12
from sklearn import svm

X = [[0, 0], [1, 1], [1, 0]]
y = [0, 1, 1]
clf = svm.SVC()
clf.fit(X, y)

result = clf.predict([[2, 2], [3, 3]])
print(result)
print(clf.support_vectors_)
print(clf.support_)
print(clf.n_support_)

[1] clf.predict([[2, 2], [3, 3]]) # predict the target of testing samples,预测结果
[2] clf.support_vectors_ # support vectors,正类和负类支持向量
[3] clf.support_ # indices of support vectors,正类和负类支持向量索引
[4] clf.n_support_ # number of support vectors for each class,正类和负类支持向量总个数

参数说明

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

该函数的时间复杂度超过了O(N^2),对于较大的数据集(10000样本以上)不建议使用

[1] C:浮点数,默认为1.0。
[2] kernel:核函数,默认为rbf型,其他可选的有linear,poly,sigmoid,precomputed,以及可调用自定义形式callable。如果给出了一个可调用函数,则用于从数据矩阵预先计算核心矩阵; 该矩阵应该是一个形式为[n_samples,n_samples]的数组。
[3] degree:整数形,默认为3。用于多项式核函数的度数(poly)。被所有其他内核忽略。
[4] gamma:浮点,可选默认为auto。该参数是rbf,poly和sigmoid的内核系数。如果gamma是auto,那么将会使用1 / n_features。
[5] coef0: 浮点型,默认为0.0。核函数的独立特征,仅仅在’poly’和’sigmoid’核函数中有意义
[6] probability:布尔型,可选,默认为False。是否启用概率估计,必须在调用fit之前启用,启用后会降低算法效率
[7] shrinking:布尔型,可选默认为True。是否使用缩减启发式。
[8] tol: 浮点型 默认为3.0。停止标准的公差
[9] cache_size:浮点型,可选。指定内核缓存的大小(以MB为单位)。
[10] class_weight:{dict,balanced}, 可选。将类i的参数C设置为SVC的class_weight[I]*C。
如果没有给出,所有类的weight为1。balanced模式使用y值自动调整权重,调整方式是与输入数据中类频率成反比。如n_samples / (n_classes * np.bincount(y))
[11] verbose:布尔型,默认为False。启用详细输出。请注意,此设置利用libsvm中的每个进程运行时设置,如果启用,可能无法在多线程环境中正常工作。
[12] max_iter:整型,可选默认-1。求解器中迭代的极限,或无限制的-1。
[13] decision_function_shape:ovo,ovr或者默认None。是否将一对多ovr的决策函数其形式为(n_samples, n_classes),返回为其他的分类器。或者返回原始的一对一ovo决策函数其形式为(n_samples, n_classes * (n_classes - 1) / 2)。默认值“None”目前表现为“ovo”
[14] random_state:int,随机状态实例或无(默认),伪随机数发生器的种子在混洗数据时用于概率估计。

核函数

SVM中最核心的是核函数的选取和参数选择。
SVM可以解决线性不可分的问题,解决思想是对原始数据的维度变换,一般是扩维变换,使得原样本空间中的样本点线性不可分,但是在变维之后的空间中样本点是线性可分的,然后再变换后的高维空间中进行分类。
不管是不扩维的求解还是扩维的求解,在求解对偶问题的过程中都会用到各样本点的内积的结果。在很多情况下,扩维可能会把原数据扩到很高维(甚至无穷维),这时候直接求内积是非常困难的,为了避免做这样的事就提出了核函数的概念。

[1] 核函数:任意两个样本点在扩维后的空间的内积,如果等于这两个样本点在原来空间经过一个函数后的输出,那么这个函数就叫核函数。
[2] 作用:利用核函数可以转化高维内积为低维的函数运算了,只需要计算低维的内积,然后再平方。本质上隐含了从低维到高维的映射,从而避免直接计算高维的内积
[3] 示例:线性核函数、多项式核函数、径像基核函数/高斯核函数、拉普拉斯核函数、sigmod核函数

交叉参见

适于二分类的机器学习算法决策树卷积神经网络

参考资料

[1] http://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html#sklearn.svm.SVC
[2] https://blog.csdn.net/clover_daisy/article/details/54616496
[3] https://blog.csdn.net/sinat_35257860/article/details/70140508
[4] https://www.cnblogs.com/xiaotan-code/p/6695049.html