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方法根節點的選取(也就是如何選第一個參與分類的分類器),也有一些方法可以改善整體效果,我們總希望根節點少犯錯誤爲好,因此參與第一次分類的兩個類別,最好是差別特別特別大,大到以至於不太可能把他們分錯;或者我們就總取在兩類分類中正確率最高的那個分類器作根節點,或者我們讓兩類分類器在分類的時候,不光輸出類別的標籤,還輸出一個類似“置信度”的東東,當它對自己的結果不太自信的時候,我們就不光按照它的輸出走,把它旁邊的那條路也走一走,等等。








參考:

http://www.blogjava.net/zhenandaci/archive/2009/03/26/262113.html





























發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章