Support vector machines (SVMs) 是一系列的有监督的学习方法,主要用于分类、回归和异常点检测。
1. SVM的主要优点如下:
- 在高维空间有效;
- 当样本空间的维度比样本数高时任然有效;
- 使用训练样本的子集构建决策函数(这些样本点被称之为支持向量),因此它的内存效率很高;
- SVM是一个全能型的机器学习算法:可以指定不同的核函数的决策函数,提供了常见的核函数,但是也可以指定自定义的核函数。
2. SVM的主要缺点有:
- 当特征维度远高于训练样本数时,该方法可能表现的不好;
- SVM不直接提供概率估计,这些都是使用昂贵的5折交叉验证计算得到的。
Scikit-learn中的SVM支持稠密和稀疏两种向量作为输入。但是使用SVM为稀疏数据做预测,他一定是符合这样的数据(scipy.sparse)。为了最佳的性能,使用numpy.ndarray作为稠密向量以及scipy.sparse.csr_matrix 作为稀疏向量,并且dtype=float64。
3. 分类
SVC,NuSVC和LinearSVC是三种在数据集上进行多分类的分类器。SVC和NuSVC是相类似的方法,但是它们接受不同的参数并且它们的数学公式也不一样。
作为分类器,SVC, NuSVC and LinearSVC 都接收两个数组作为输入:训练样本 X [n_samples, n_features], 结果类标 y [n_samples] (可以是字符串或者是整数)。
下面的代码生成一个简单的SVM分类器模型:
>>> from sklearn import svm
>>> X = [[0, 0], [1, 1]]
>>> y = [0, 1]
>>> clf = svm.SVC()
>>> clf.fit(X, y)
接下来就利用训练好的模型进行预测:
>>> clf.predict([[2., 2.]])
array([1])
SVM决策函数依赖于训练数据的某个子集:称之为支持向量。这些支持向量的属性可以从一下三个成员中获取: support_vectors_, support_ 以及 n_support。
>>> # 获取支持向量
>>> clf.support_vectors_
array([[ 0., 0.],
[ 1., 1.]])
>>> # 获取支持向量的索引
>>> clf.support_
array([0, 1]...)
>>> # 获取每个类的支持向量
>>> clf.n_support_
array([1, 1]...)
3.1 多类分类(Multi-class classification)
SVC 和 NuSVC 使用了“one-against-one”方法(Knerr et al.,1990)对于多类目标分类。如果n_class是类别的数目,那么n_class * (n_class - 1)/2个分类器会被构造并且每一个都要从两类数据中经过训练。为了提供与其他分类一致的接口,这个decision_function_shape选项允许集合“one-against-one”分类器的所有结果到一个大小为(n_samples,n_classes)的决策函数中:
>>> X = [[0], [1], [2], [3]]
>>> Y = [0, 1, 2, 3]
>>> clf = svm.SVC(decision_function_shape='ovo')
>>> clf.fit(X, Y)
>>> dec = clf.decision_function([[1]])
>>> dec.shape[1] # 4 classes: 4*3/2 = 6
6
>>> clf.decision_function_shape = "ovr"
>>> dec = clf.decision_function([[1]])
>>> dec.shape[1] # 4 classes
4
另一方面, LinearSVC 实现了“one-vs-the-rest”多类的策略,这样训练一个n_class个模型。如果仅仅有两个类,仅仅需要训练一个模型:
>>> lin_clf = svm.LinearSVC()
>>> lin_clf.fit(X, Y)
>>> dec = lin_clf.decision_function([[1]])
>>> dec.shape[1]
4
未完待续…
对机器学习,人工智能感兴趣的小伙伴可以加我微信:JeemyJohn,我拉你进我的机器学习群(群里很多高手哦!),或者扫描二维码!当然你也可以关注我的公众号,点击链接:燕哥带你学算法公众号团队简介