Support Vector Machines-scikielearn-翻译-毕设系列
Tim Chen(motion$) Lv5

写在前面的话

  • 本文是一篇译文,来自scikit-learn上的一篇关于SVM的简介。翻译本文的目的是在于更好的理解SVM,另一方面也可锻炼我的英语阅读能力和翻译水平。
  • 原文链接Support Vector Machines

支持向量机(SVM)

  • 支持向量机是监督学习的一种,它的功能很强大,即可以应用于分类,又可以应用于回归离群点的检测
  • 支持向量机的优点:
    • 在高维空间中有效
    • 可以处理由低维空间转换到高维空间中的样本
    • 决策函数中只用到训练集中的一个子集(通常被称为支持向量),所以所占内存较小
    • 通用性:决策函数中可以指定不同的核函数.支持常用的核函数,但也可以自定义自己的核函数
  • 支持向量机的缺点:
    • 如果特征维数比样本数要大,那么效果较差
    • 支持向量机不直接提供概率估计,它是通过一个较为复杂的5倍交叉验证来完成(看下面的分数和概率
  • scikit-learn中实现的支持向量机既接受密集的样本(numpy.ndarray and convertible to that by numpy.asarray)又接受稀少(any scipy.sparse)的样本向量作为输入.但是,如果用支持向量机为稀少的样本向量做预测,它必须先拟合好这样的数据。要得到最佳化的表现,密集的用C-ordered numpy.ndarray,稀少的用scipy.spare.csr_matrix,而且dtype=float64。

分类

  • SVC,NuSVC和LinearSVC可以对数据集进行多类分类。
  • SVC和NuSVC是相似的方法,但是接收的参数和数学公式有少少不同(详见数学公式)。另一方面,LinearSVC则是通过线性核函数来实现支持向量机的另一种方式。既然LinearSVC不接受kernel作为关键字,那么我们就默认它是线性的。它还可能缺少SVC和NuSVC中的某些字段,例如support_。
  • SVC,NuSVC和LinearSVC中的输入为两个数组,X数组为训练集,它的大小是[n_samples, n_features],Y数组是一个标签类,字符串或者整数,大小为[n_samples]。
1
2
3
4
5
6
7
8
>>> from sklearn import svm
>>> X = [[0, 0], [1, 1]]
>>> y = [0, 1]
>>> clf = svm.SVC()
>>> clf.fit(X, y)
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, degree=3,
gamma=0.0, kernel='rbf', max_iter=-1, probability=False, random_state=None,
shrinking=True, tol=0.001, verbose=False)
  • 拟合之后,模型就可以用来预测新变量:
1
2
>>> clf.predict([[2., 2.]])
array([1])
  • 支持向量机决策函数依赖训练集的某个子集,被称作支持向量。这些支持向量的某些属性可以在成员support_vectors,support_和n_support中找到。
1
2
3
4
5
6
7
8
9
10
>>> # get support vectors
>>> clf.support_vectors_
array([[ 0., 0.],
[ 1., 1.]])
>>> # get indices of support vectors
>>> clf.support_
array([0, 1]...)
>>> # get number of support vectors for each class
>>> clf.n_support_
array([1, 1]...)

多类分类器

  • SVC和NuSVC为多分类分类器实现了“一对一”的方法(Kerr et al., 1991)。如果n_class代表类的个数,那么就要构造n_class * (n_class - 1) / 2个分类器,而且每一个数据训练成两个类:
1
2
3
4
5
6
7
8
9
10
>>> X = [[0], [1], [2], [3]]
>>> Y = [0, 1, 2, 3]
>>> clf = svm.SVC()
>>> clf.fit(X, Y)
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, degree=3,
gamma=0.0, kernel='rbf', max_iter=-1, probability=False, random_state=None,
shrinking=True, tol=0.001, verbose=False)
>>> dec = clf.decision_function([[1]])
>>> dec.shape[1] # 4 classes: 4*3/2 = 6
6
  • 另一个方面,LinearSVC则为多分类分类器实现了“一对其他”的方法,所以只需要训练n_class个模型,如果是分两类,那么只需要训练一个模型。
1
2
3
4
5
6
7
8
>>> lin_clf = svm.LinearSVC()
>>> lin_clf.fit(X, Y)
LinearSVC(C=1.0, class_weight=None, dual=True, fit_intercept=True,
intercept_scaling=1, loss='l2', multi_class='ovr', penalty='l2',
random_state=None, tol=0.0001, verbose=0)
>>> dec = lin_clf.decision_function([[1]])
>>> dec.shape[1]
4
  • 关于决策函数,详见数学公式
  • 既然LinearSVC也实现了另一个候补的多分类策略,由Crammer和Singer构造的所谓的多分类SVM,记作multi_class=’crammer_singer’。这个方法是很稳定的,但是对于“一对其他”的分类器并非如此。实际上,“一对其他”分类器通常是首选的,因为结果大多数比较相似的,但是运行时间就没有什么比较的意义了。
  • 对于“一对其他”的LinearSVC中的coef_和intercept_属性,他们分别表示为[n_class,n_features]和[n_class]。

后记

 评论