在python sklearn使用 SVM做分类

在python sklearn使用 SVM做分类

SVC(C-Support Vector Classification)实现基于libsvm,台湾大学林智仁教授团队开发的一个库。支持多分类。

1. SVM二分类

>>> import numpy as np
>>> X = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]])
>>> y = np.array([1, 1, 2, 2])
>>> from sklearn.svm import SVC
>>> clf = SVC()
>>> clf.fit(X, y) 
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
    decision_function_shape='ovr', degree=3, gamma='auto', kernel='rbf',
    max_iter=-1, probability=False, random_state=None, shrinking=True,
    tol=0.001, verbose=False)
>>> print(clf.predict([[-0.8, -1]]))
[1]

   
   
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12


2. SVM多分类

SVM算法最初是为二值分类问题设计的,当处理多类问题时,就需要构造合适的多类分类器。目前,构造SVM多类分类器的方法主要有两类:一类是直接法,直接在目标函数上进行修改,将多个分类面的参数求解合并到一个最优化问题中,通过求解该最优化问题“一次性”实现多类分类。这种方法看似简单,但其计算复杂度比较高,实现起来比较困难,只适合用于小型问题中;另一类是间接法,主要是通过组合多个二分类器来实现多分类器的构造,常见的方法有one-against-one和one-against-all两种。


a.一对多法(one-versus-rest,简称1-v-r SVMs)。训练时依次把某个类别的样本归为一类,其他剩余的样本归为另一类,这样k个类别的样本就构造出了k个SVM。分类时将未知样本分类为具有最大分类函数值的那类。

b.一对一法(one-versus-one,简称1-v-1 SVMs)。其做法是在任意两类样本之间设计一个SVM,因此k个类别的样本就需要设计k(k-1)/2个SVM。当对一个未知样本进行分类时,最后得票最多的类别即为该未知样本的类别。Libsvm中的多类分类就是根据这个方法实现的。

c.层次支持向量机(H-SVMs)。层次分类法首先将所有类别分成两个子类,再将子类进一步划分成两个次级子类,如此循环,直到得到一个单独的类别为止。

d.其他多类分类方法。除了以上几种方法外,还有有向无环图SVM(Directed Acyclic Graph SVMs,简称DAG-SVMs)和对类别进行二进制编码的纠错编码SVMs。

对c和d两种方法的详细说明可以参考论文《支持向量机在多类分类问题中的推广》(计算机工程与应用。2004)

>>> X = [[0], [1], [2], [3]]
>>> Y = [0, 1, 2, 3]
>>> clf = svm.SVC(decision_function_shape='ovo')
>>> clf.fit(X, Y) 
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
    decision_function_shape='ovo', degree=3, gamma='auto', 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
>>> clf.decision_function_shape = "ovr"
>>> dec = clf.decision_function([[1]])
>>> dec.shape[1] # 4 classes
4
   
   
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15


3. sklearn SVM中decision_function、predict与predict_proba的关系和区别

decision_function: 返回的是样本距离超平面的距离。二分类没什么好说的,对于多分类ovo,得到每对分类器的输出,n_class *(n_class - 1)/ 2个值。举个列子,

>>> clf.decision_function(predict_this)
[[ 96.42193513 -11.13296606 111.47424538 -88.5356536 44.29272494 141.0069203 ]]
   
   
   
   
  • 1
  • 2

对应的分类器是 [AB, AC, AD, BC, BD, CD]
所以我们得到每对分类器的结果[A, C, A, C, B, C]
例如,96.42193513 是正的,所以AB分离器得到的label是A
因为[A, C, A, C, B, C]中有3个C,得票最多,所以C就是整个多分类模型的预测label,这个就是使用predict得到的结果

而ovr,直接选择绝对值最大那个作为预测label

predict_proba: predict_proba涉及到Platt scaling,SVM中Platt scaling涉及到某些理论问题,如果一定要使用一个得分去表示,可以使用decision_function 去代替predict_proba

参考文章:
1. https://xacecask2.gitbooks.io/scikit-learn-user-guide-chinese-version/content/sec1.4.html
2. https://blog.csdn.net/gamer_gyt/article/details/51265347
3. https://datascience.stackexchange.com/questions/18374/predicting-probability-from-scikit-learn-svc-decision-function-with-decision-fun
4. https://stackoverflow.com/questions/15015710/how-can-i-know-probability-of-class-predicted-by-predict-function-in-support-v

如何使用sklearn中的SVM(SVC;SVR)

04-17 阅读数 2万+

SVM分类算法我们前面已经讲过了,那么我们平时要用到SVM的时候,除了在MATLAB中调用libsvm之外,我们的Python中的sklean也已经集成了SVM算法。这篇博客就讲一下sklearn中的... 博文 来自: wonengguwozai的博客

sklearn学习笔记(3)svm分类

08-16 阅读数 2809

Supportvectormachines(SVMs) 是一系列的有监督的学习方法,主要用于分类、回归和异常点检测。1.SVM的主要优点如下:在高维空间有效; 当样本空间的维度比样本数高时任然有效; ... 博文 来自: m0_37870649的博客

Scikit-learn实战之SVM分类

11-27 阅读数 1万+

Supportvectormachines(SVMs)是一系列的有监督的学习方法,主要用于分类、回归和异常点检测。1.SVM的主要优点如下:在高维空间有效;当样本空间的维度比样本数高时任然有效;使用训... 博文 来自: 学习AI算法,请关注微信公众号:机器学习算法全栈工程师……

使用Python语言完成SVM实现分类

11-22 阅读数 6646

SVM(supportvectormachine)支持向量机:注意:本文不准备提到数学证明的过程,一是因为有一篇非常好的文章解释的非常好:http://blog.csdn.net/v_july_v/a... 博文 来自: qq_37879432的博客


机器学习:支持向量机(SVM)与Python实现第(一)篇

08-23 阅读数 8609

前言最近看了AndrewNg的机器学习视频中的支持向量机,视频的内容比较浅显,没有深入解释支持向量机中的数学原理。但是对于一个比较执着于知道为什么的人,笔者还是去网上查找了有关支持向量机原理以及实现的... 博文

SVM的一些学习心得及案例(Python代码)实现

01-22 阅读数 7523

1、基本概念向量的内积即一个向量在另一个向量上的投影乘上被投影向量的模,上图不管是a投影在b上,还是b投影在a上,其结果是一样的,原理参照B站上3Blue1Browna∙b =(a1e1 + a2e2... 博文 来自: Riverhope的博客

python中运用SVM对新闻标题进行分类

04-16

- 问答

python 实现SVM向量机代码

03-28 阅读数 3260

基于python实现SVM向量机,训练出的分类器在当前测试数据中,预测精度在65%。另外环境依赖fromnumpyimport*importSVMimportxlrdimportpickle... 博文 来自: shuiyungtiang的博客

                        

没有更多推荐了,返回首页

你可能感兴趣的:(读书笔记)