从 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. 11.【nuxt起步】-登录验证

    1.新建/pages/login.vue 2.安装cookie Cnpm install js-cookie --s 3.Login.vue增加 import Cookie from 'js-cook ...

  2. Android WiFi开发教程(一)——WiFi热点的创建与关闭

    相对于BlueTooth,WiFi是当今使用最广的一种无线网络传输技术, 几乎所有智能手机.平板电脑和笔记本电脑都支持Wi-Fi上网.因此,掌握基本的WiFI开发技术是非常必要的.本教程将围绕一个小D ...

  3. oracle如何获得新插入记录的id

    .对于提交(最后一次操作commit了)的话可以查询那个提交段 SELECT 列名1,列名2…… FROM 表名 VERSIONS BETWEEN TIMESTAMP MINVALUE AND MAX ...

  4. php猴子吃桃

    <?php header("content-type:text/html;charset=utf-8"); /* 有一堆桃子,猴子第一天吃了其中的一半,并再多吃了一个! 以后 ...

  5. 微信开源组件WCDB漫谈及Demo

    代码地址如下:http://www.demodashi.com/demo/12422.html 前言 移动端的数据库选型一直是一个难题,直到前段时间看到了WeMobileDev(微信前端团队)放出了第 ...

  6. oracle 使用job定时自动重置sequence

    一.赋予用户创建和删除sequence的权限 grant create any sequence to user_name; grant drop any sequnce to user_name; ...

  7. HTTP基础(整理)

    前一段时间看了有关这个协议的相关文档,对这个协议有了新的理解,这里整理一下. http是应用层面向对象的协议. 它有以下几个特点: 1.  支持客户服务器模式(这是废话,不支持这个模式怎么工作) 2. ...

  8. 1.1 合用weightSum属性和layout_weight属性

    <打造高质量Android应用:Android开发必知的50个诀窍>第1章活用布局,本章将介绍Android布局相关的一些窍门和建议.通过本章,读者不仅可以学习如何从零开始创建特定类型的布 ...

  9. Codeforces Round #263 (Div. 2) proB

    题目: B. Appleman and Card Game time limit per test 1 second memory limit per test 256 megabytes input ...

  10. php 字符串内容是数组格式 转换成数组

    一个简单的应用.. 例, $str    =    "array( 'USD'=>'1', 'GBP'=>'0.6494', 'EUR'=>'0.7668' ,'JPY'= ...