Scikit-learn实战之SVM分类

来源:互联网 发布:python os.popen 编辑:程序博客网 时间:2024/06/06 08:59

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 = 66>>> clf.decision_function_shape = "ovr">>> dec = clf.decision_function([[1]])>>> dec.shape[1] # 4 classes4

另一方面, 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

未完待续…

1 0
原创粉丝点击