从 SVM的那几张图能够看出来,SVM是一种典型的两类分类器。即它仅仅回答属于正类还是负类的问题。而现实中要解决的问题,往往是多类的问题(少部分例外,比如垃圾邮件过滤,就仅仅须要确定“是”还是“不是”垃圾邮件)。比方文本分类,比方数字识别。怎样由两类分类器得到多类分类器,就是一个值得研究的问题。

还以文本分类为例。现成的方法有非常多,当中一种一劳永逸的方法,就是真的一次性考虑全部样本,并求解一个多目标函数的优化问题,一次性得到多个分类面。就像下图这样:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

多个超平面把空间划分为多个区域,每一个区域相应一个类别,给一篇文章,看它落在哪个区域就知道了它的分类。

看起来非常美对不正确?仅仅可惜这样的算法还基本停留在纸面上,由于一次性求解的方法计算量实在太大。大到无法有用的地步。

      稍稍退一步,我们就会想到所谓“一类对其余”的方法,就是每次仍然解一个两类分类的问题。

比方我们有5个类别。第一次就把类别1的样本定为正样本,其余2,3,4,5的样本合起来定为负样本。这样得到一个两类分类器,它可以指出一篇文章是还是不是第1类的。第二次我们把类别2
的样本定为正样本。把1,3,4,5的样本合起来定为负样本,得到一个分类器,如此下去。我们能够得到5个这种两类分类器(总是和类别的数目一致)。到了有文章须要分类的时候。我们就拿着这篇文章挨个分类器的问:是属于你的么?是属于你的么?哪个分类器点头说是了,文章的类别就确定了。

这样的方法的优点是每个优化问题的规模比較小。并且分类的时候速度非常快(仅仅须要调用5个分类器就知道了结果)。

但有时也会出现两种非常尴尬的情况,比如拿一篇文章问了一圈,每个分类器都说它是属于它那一类的,或者每个分类器都说它不是它那一类的,前者叫分类重叠现象,后者叫不可分类现象。分类重叠倒还好办,随便选一个结果都不至于太离谱,或者看看这篇文章到各个超平面的距离,哪个远就判给哪个。不可分类现象就着实难办了,仅仅能把它分给第6个类别了……更要命的是,本来各个类别的样本数目是差点儿相同的,但“其余”的那一类样本数总是要数倍于正类(由于它是除正类以外其它类别的样本之和嘛)。这就人为的造成了数据不平衡问题。

因此我们还得再退一步,还是解两类分类问题,还是每次选一个类的样本作正类样本,而负类样本则变成仅仅选一个类(称为“一对一单挑”的方法,哦,不正确,没有单挑,就是“一对一”的方法。呵呵),这就避免了偏斜。因此过程就是算出这样一些分类器,第一个仅仅回答“是第1类还是第2类”。第二个仅仅回答“是第1类还是第3类”。第三个仅仅回答“是第1类还是第4类”。如此下去。你也能够立即得出,这种分类器应该有5
X 4/2=10个(通式是,假设有k个类别,则总的两类分类器数目为k(k-1)/2)。

尽管分类器的数目多了,可是在训练阶段(也就是算出这些分类器的分类平面时)所用的总时间却比“一类对其余”方法少非常多,在真正用来分类的时候。把一篇文章扔给全部分类器,第一个分类器会投票说它是“1”或者“2”,第二个会说它是“1”或者“3”,让每个都投上自己的一票,最后统计票数,假设类别“1”得票最多,就判这篇文章属于第1类。这样的方法显然也会有分类重叠的现象,但不会有不可分类现象。由于总不可能全部类别的票数都是0。看起来够好么?事实上不然。想想分类一篇文章,我们调用了多少个分类器?10个,这还是类别数为5的时候,类别数假设是1000,要调用的分类器数目会上升至约500,000个(类别数的平方量级)。这怎样是好?

看来我们必须再退一步。在分类的时候下功夫。我们还是像一对一方法那样来训练,仅仅是在对一篇文章进行分类之前。我们先依照以下图的样子来组织分类器(如你所见,这是一个有向无环图。因此这样的方法也叫做DAG SVM)

这样在分类时,我们就能够先问分类器“1对5”(意思是它能够回答“是第1类还是第5类”)。假设它回答5。我们就往左走。再问“2对5”这个分类器。假设它还说是“5”,我们就继续往左走,这样一直问下去,就能够得到分类结果。优点在哪?我们事实上仅仅调用了4个分类器(假设类别数是k,则仅仅调用k-1个),分类速度飞快。且没有分类重叠和不可分类现象!

缺点在哪?假如最一開始的分类器回答错误(明明是类别1的文章。它说成了5)。那么后面的分类器是不管怎样也无法纠正它的错误的(由于后面的分类器压根没有出现“1”这个类别标签),事实上对以下每一层的分类器都存在这样的错误向下累积的现象。。

只是不要被DAG方法的错误累积吓倒。错误累积在一对其余和一对一方法中也都存在,DAG方法好于它们的地方就在于。累积的上限。无论是大是小。总是有定论的。有理论证明。而一对其余和一对一方法中,虽然每个两类分类器的泛化误差限是知道的,可是合起来做多类分类的时候。误差上界是多少,没人知道。这意味着准确率低到0也是有可能的。这多让人郁闷。

并且如今DAG方法根节点的选取(也就是怎样选第一个參与分类的分类器)。也有一些方法能够改善总体效果。我们总希望根节点少犯错误为好,因此參与第一次分类的两个类别。最好是区别特别特别大,大到以至于不太可能把他们分错;或者我们就总取在两类分类中正确率最高的那个分类器作根节点,或者我们让两类分类器在分类的时候,不光输出类别的标签。还输出一个类似“置信度”的东东,当它对自己的结果不太自信的时候,我们就不光依照它的输出走。把它旁边的那条路也走一走。等等。

SVM怎样解决多分类问题的更多相关文章

  1. SVM之解决线性不可分

    SVM之问题形式化 SVM之对偶问题 SVM之核函数 >>>SVM之解决线性不可分 写在SVM之前——凸优化与对偶问题 上一篇SVM之核函数介绍了通过计算样本核函数,实际上将样本映射 ...

  2. 基于SKLearn的SVM模型垃圾邮件分类——代码实现及优化

    一. 前言 由于最近有一个邮件分类的工作需要完成,研究了一下基于SVM的垃圾邮件分类模型.参照这位作者的思路(https://blog.csdn.net/qq_40186809/article/det ...

  3. 【笔记】SVM思想解决回归问题

    使用svm思想解决回归问题 使用svm思想解决是如何解决回归问题,其中回归问题的本质就是找一条线,能够最好的拟合数据点 怎么定义拟合就是回归算法的关键,线性回归算法就是让预测的直线的MSE的值最小,对 ...

  4. Keras入门(一)搭建深度神经网络(DNN)解决多分类问题

    Keras介绍   Keras是一个开源的高层神经网络API,由纯Python编写而成,其后端可以基于Tensorflow.Theano.MXNet以及CNTK.Keras 为支持快速实验而生,能够把 ...

  5. 采用boosting思想开发一个解决二分类样本不平衡的多估计器模型

    # -*- coding: utf-8 -*- """ Created on Wed Oct 31 20:59:39 2018 脚本描述:采用boosting思想开发一个 ...

  6. 【笔记】二分类算法解决多分类问题之OvO与OvR

    OvO与OvR 前文书道,逻辑回归只能解决二分类问题,不过,可以对其进行改进,使其同样可以用于多分类问题,其改造方式可以对多种算法(几乎全部二分类算法)进行改造,其有两种,简写为OvO与OvR OvR ...

  7. SVM入门(十)将SVM用于多类分类

    源地址:http://www.blogjava.net/zhenandaci/archive/2009/03/26/262113.html 从 SVM的那几张图可以看出来,SVM是一种典型的两类分类器 ...

  8. 将SVM用于多类分类

    转自:http://www.lining0806.com/%E5%B0%86svm%E7%94%A8%E4%BA%8E%E5%A4%9A%E7%B1%BB%E5%88%86%E7%B1%BB/ SVM ...

  9. 机器学习:SVM(SVM 思想解决回归问题)

    一.SVM 思想在解决回归问题上的体现 回归问题的本质:找到一条直线或者曲线,最大程度的拟合数据点: 怎么定义拟合,是不同回归算法的关键差异: 线性回归定义拟合方式:让所有数据点到直线的 MSE 的值 ...

随机推荐

  1. 聊聊、Zookeeper API

    今天我们来说说 Zookeeper 客户端启动,整个文章分三个部分:第一部分是 Zookeeper 原生 API 客户端,第二部分是开源客户端 ZkClient,第三部分是开源客户端 Curator. ...

  2. 卸载django

    首先找到django安装路径 Python import sys; sys.path = sys.path[1:]; import django; print(django.__path__) 得到 ...

  3. selenium用法 (python)

    滑动到指定元素位置 browser.find_element_by_xpath("//font[text()='资产管理部经办人'][1]").location_once_scro ...

  4. CityEngine结合ArcGIS制作地质体web场景 [转]

    CityEnginewebWebWEB地质体 原文地址:http://www.cnblogs.com/esrichina/archive/2012/11/12/2762163.html 当我们想要对地 ...

  5. 测试整合之王Unitils

    16.4.1  Unitils概述(1) Unitils测试框架目的是让单元测试变得更加容易和可维护.Unitils构建在DbUnit与EasyMock项目之上并与JUnit和TestNG相结合.支持 ...

  6. Win7如何修复开机画面

    将下面文件保存为"修复Win7开机画面.bat"双击运行即可   bcdedit /set {current} locale zh-CN    

  7. java查看工具jhat-windows

    Analyzes the Java heap. This command is experimental and unsupported. Synopsis jhat [ options ] heap ...

  8. 谷歌浏览器插件-html页面js事件查看器

    谷歌浏览器插件-html页面js事件查看器 1.下载 下载地址:http://files.cnblogs.com/files/graceup/VisualEvent.zip 解压得到文件:Visual ...

  9. C# DateTime和String(转)

    http://www.cnblogs.com/Pickuper/articles/2058880.html C#语言之“string格式的日期时间字符串转为DateTime类型”的方法 方法一:Con ...

  10. 关于 html 中 table 表格 tr,td 的高度和宽度

    http://wenku.baidu.com/link?url=76BZcBS3YyA1QJwE7pCPJKERPex4uSQEQ1LI5ZkwTCtunw2cBTaLI8E71dxUhFW0CH4h ...