SVM怎样解决多分类问题
从 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怎样解决多分类问题的更多相关文章
- SVM之解决线性不可分
SVM之问题形式化 SVM之对偶问题 SVM之核函数 >>>SVM之解决线性不可分 写在SVM之前——凸优化与对偶问题 上一篇SVM之核函数介绍了通过计算样本核函数,实际上将样本映射 ...
- 基于SKLearn的SVM模型垃圾邮件分类——代码实现及优化
一. 前言 由于最近有一个邮件分类的工作需要完成,研究了一下基于SVM的垃圾邮件分类模型.参照这位作者的思路(https://blog.csdn.net/qq_40186809/article/det ...
- 【笔记】SVM思想解决回归问题
使用svm思想解决回归问题 使用svm思想解决是如何解决回归问题,其中回归问题的本质就是找一条线,能够最好的拟合数据点 怎么定义拟合就是回归算法的关键,线性回归算法就是让预测的直线的MSE的值最小,对 ...
- Keras入门(一)搭建深度神经网络(DNN)解决多分类问题
Keras介绍 Keras是一个开源的高层神经网络API,由纯Python编写而成,其后端可以基于Tensorflow.Theano.MXNet以及CNTK.Keras 为支持快速实验而生,能够把 ...
- 采用boosting思想开发一个解决二分类样本不平衡的多估计器模型
# -*- coding: utf-8 -*- """ Created on Wed Oct 31 20:59:39 2018 脚本描述:采用boosting思想开发一个 ...
- 【笔记】二分类算法解决多分类问题之OvO与OvR
OvO与OvR 前文书道,逻辑回归只能解决二分类问题,不过,可以对其进行改进,使其同样可以用于多分类问题,其改造方式可以对多种算法(几乎全部二分类算法)进行改造,其有两种,简写为OvO与OvR OvR ...
- SVM入门(十)将SVM用于多类分类
源地址:http://www.blogjava.net/zhenandaci/archive/2009/03/26/262113.html 从 SVM的那几张图可以看出来,SVM是一种典型的两类分类器 ...
- 将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 ...
- 机器学习:SVM(SVM 思想解决回归问题)
一.SVM 思想在解决回归问题上的体现 回归问题的本质:找到一条直线或者曲线,最大程度的拟合数据点: 怎么定义拟合,是不同回归算法的关键差异: 线性回归定义拟合方式:让所有数据点到直线的 MSE 的值 ...
随机推荐
- java 读写操作
java代码: 写入: public void getNotice(HttpServletRequest request, String notice){ String message = JSON. ...
- Jenkins+ProGet+Windows Batch搭建全自动的内部包(NuGet)打包和推送及管理平台
这一篇文章是继http://www.cnblogs.com/EasonJim/p/5954155.html的升级版,由于CCNET已经过时,所以我把打包过程的CCNET工具换成Jenkins去实现,批 ...
- 在html里网页中嵌入优酷的视频
<html> <embed src="http://player.youku.com/player.php/sid/XMjAzOTk4NjI4/v.swf" qu ...
- ThinkPHP示例:CURD
完整的控制器文件: class IndexAction extends Action { // 查询数据 public function index() { $Form = M("Form& ...
- sqlite constraint
sqlite3中的约束例如以下: CREATE TABLE CheckTable (rowId integer primary key autoincrement, name text not nul ...
- STL之pair类型具体分析
pair定义于头文件utility中.基本的作用是将两个数据组合成一个数据,两个数据能够是同一类型或者不同类型. pair类型提供的操作: pair<T1,T2> p1; pair< ...
- 有问必答项目 -数据库设计文档(ask-utf-8)
有问必答项目 -数据库设计文档(ask-utf-8) 表前缀的使用 早期租用公共的服务器 一个数据库,保存多个项目(问答.电子商务.医院),为了区分这些项目,使用前缀分割 ask_ ec_ hospi ...
- 【Excle数据透透视表】如何删除数据透视表
选中区域A4:C17,在键盘上按DELETE键删除,结果提示: 那么如何删除呢? 解决方案 选中整个数透视表,再删除 具体操作: 选中整个数据透视表→DELETE 注意:删除之后,源数据不会受到影响
- ngui 输入事件处理
NGUI不仅提供了图形接口,还提供了输入事件接口!事件接口是通过UICamera来实现的. Unity3d 为我们提供的原装的input尽管非常方便,但真正跨平台使用时(尤其是跨手机与Pc机时)仍然不 ...
- PHP通过prepare执行查询取得数据
可以用来防止sql注入 <?php $pdo=new PDO("mysql:host=localhost;dbname=itest", 'root',''); //先构建查询 ...