• SVM怎样解决多分类问题


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

     

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


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

     

           看起来非常美对不正确?仅仅可惜这样的算法还基本停留在纸面上,由于一次性求解的方法计算量实在太大。大到无法有用的地步。
          稍稍退一步,我们就会想到所谓“一类对其余”的方法,就是每次仍然解一个两类分类的问题。

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

     

  • 相关阅读:
    ComboBox联动DataGridview之Access表名联动表内容
    通过进程ID获取窗口句柄(微软)
    Excel操作类
    C# TextBox自动完成
    Mdi悬浮子窗体不超过主窗体边界
    Excel导入数据库_Excel2Sql
    C#连接SQL的增删改查
    用dynamic expression运行时访问dynamic object
    添加模式匹配
    对帐脚本语言的修改
  • 原文地址:https://www.cnblogs.com/jzssuanfa/p/7277869.html
Copyright © 2020-2023  润新知