svm學習:鬆弛變量與懲罰因子

1.鬆弛變量

如今咱們已經把一個原本線性不可分的文本分類問題,經過映射到高維空間而變成了線性可分的。就像下圖這樣: 算法

圓形和方形的點各有成千上萬個(畢竟,這就是咱們訓練集中文檔的數量嘛,固然很大了)。如今想象咱們有另外一個訓練集,只比原先這個訓練集多了一篇文章,映射到高維空間之後(固然,也使用了相同的核函數),也就多了一個樣本點,可是這個樣本的位置是這樣的:
就是圖中黃色那個點,它是方形的,於是它是負類的一個樣本,這單獨的一個樣本,使得本來線性可分的問題變成了線性不可分的。這樣相似的問題(僅有少數點線性不可分)叫作「近似線性可分」的問題。

以咱們人類的常識來判斷,說有一萬個點都符合某種規律(於是線性可分),有一個點不符合,那這一個點是否就表明了分類規則中咱們沒有考慮到的方面呢(於是規則應該爲它而作出修改)?
框架

其實咱們會以爲,更有可能的是,這個樣本點壓根就是錯誤,是噪聲,是提供訓練集的同窗人工分類時一打瞌睡錯放進去的。因此咱們會簡單的忽略這個樣本點,仍然使用原來的分類器,其效果絲絕不受影響。
函數

但這種對噪聲的容錯性是人的思惟帶來的,咱們的程序可沒有。因爲咱們本來的優化問題的表達式中,確實要考慮全部的樣本點(不能忽略某一個,由於程序它怎麼知道該忽略哪個呢?),在此基礎上尋找正負類之間的最大幾何間隔,而幾何間隔自己表明的是距離,是非負的,像上面這種有噪聲的狀況會使得整個問題無解。這種解法其實也叫作「硬間隔」分類法,由於他硬性的要求全部樣本點都知足和分類平面間的距離必須大於某個值。
測試

所以由上面的例子中也能夠看出,硬間隔的分類法其結果容易受少數點的控制,這是很危險的(儘管有句話說真理老是掌握在少數人手中,但那不過是那一小撮人聊以自慰的詞句罷了,咱仍是得民主)。
優化

但解決方法也很明顯,就是仿照人的思路,容許一些點到分類平面的距離不知足原先的要求。因爲不一樣的訓練集各點的間距尺度不太同樣,所以用間隔(而不是幾何間隔)來衡量有利於咱們表達形式的簡潔。咱們原先對樣本點的要求是:
spa


意思是說離分類面最近的樣本點函數間隔也要比1大。若是要引入容錯性,就給1這個硬性的閾值加一個鬆弛變量,即容許:
文檔


由於鬆弛變量是非負的,所以最終的結果是要求間隔能夠比1小。可是當某些點出現這種間隔比1小的狀況時(這些點也叫離羣點),意味着咱們放棄了對這些點的精確分類,而這對咱們的分類器來講是種損失。可是放棄這些點也帶來了好處,那就是使分類面沒必要向這些點的方向移動,於是能夠獲得更大的幾何間隔(在低維空間看來,分類邊界也更平滑)。顯然咱們必須權衡這種損失和好處。好處很明顯,咱們獲得的分類間隔越大,好處就越多。回顧咱們原始的硬間隔分類對應的優化問題: 基礎


||w||^2就是咱們的目標函數(固然係數無關緊要),但願它越小越好,於是損失就必然是一個能使之變大的量(能使它變小就不叫損失了,咱們原本就但願目標函數值越小越好)。那如何來衡量損失,有兩種經常使用的方式,有人喜歡用:
變量


而有人喜歡用: 程序


其中L都是樣本的數目。兩種方法沒有大的區別。若是選擇了第一種,獲得的方法的就叫作二階軟間隔分類器,第二種就叫作一階軟間隔分類器。把損失加入到目標函數裏的時候,就須要一個懲罰因子(cost,也就是libSVM的諸多參數中的C),原來的優化問題就變成了下面這樣:


這個式子有這麼幾點要注意:

(1)並不是全部的樣本點都有一個鬆弛變量與其對應。實際上只有「離羣點」纔有,或者也能夠這麼看,全部沒離羣的點鬆弛變量都等於0(對負類來講,離羣點就是在前面圖中,跑到H2右側的那些負樣本點,對正類來講,就是跑到H1左側的那些正樣本點)。
(2)鬆弛變量的值實際上標示出了對應的點到底離羣有多遠,值越大,點就越遠。
(3)懲罰因子C決定了你有多重視離羣點帶來的損失,顯然當全部離羣點的鬆弛變量的和必定時,你定的C越大,對目標函數的損失也越大,此時就暗示着你很是不肯意放棄這些離羣點,最極端的狀況是你把C定爲無限大,這樣只要稍有一個點離羣,目標函數的值立刻變成無限大,立刻讓問題變成無解,這就退化成了硬間隔問題。
(4)懲罰因子C不是一個變量,整個優化問題在解的時候,C是一個你必須事先指定的值,指定這個值之後,解一下,獲得一個分類器,而後用測試數據看看結果怎麼樣,若是不夠好,換一個C的值,再解一次優化問題,獲得另外一個分類器,再看看效果,如此就是一個參數尋優的過程,但這和優化問題自己決不是一回事,優化問題在解的過程當中,C一直是定值,要記住。
(5)儘管加了鬆弛變量這麼一說,但這個優化問題仍然是一個優化問題(汗,這不廢話麼),解它的過程比起原始的硬間隔問題來講,沒有任何更加特殊的地方。

從大的方面說優化問題解的過程,就是先試着肯定一下w,也就是肯定了前面圖中的三條直線,這時看看間隔有多大,又有多少點離羣,把目標函數的值算一算,再換一組三條直線(你能夠看到,分類的直線位置若是移動了,有些原來離羣的點會變得再也不離羣,而有的原本不離羣的點會變成離羣點),再把目標函數的值算一算,如此往復(迭代),直到最終找到目標函數最小時的w。

囉嗦了這麼多,讀者必定能夠立刻本身總結出來,鬆弛變量也就是個解決線性不可分問題的方法罷了,可是回想一下,核函數的引入不也是爲了解決線性不可分的問題麼?爲何要爲了一個問題使用兩種方法呢?
其實二者還有微妙的不一樣。通常的過程應該是這樣,還以文本分類爲例。在原始的低維空間中,樣本至關的不可分,不管你怎麼找分類平面,總會有大量的離羣點,此時用核函數向高維空間映射一下,雖然結果仍然是不可分的,但比原始空間裏的要更加接近線性可分的狀態(就是達到了近似線性可分的狀態),此時再用鬆弛變量處理那些少數「冥頑不化」的離羣點,就簡單有效得多啦。

本節中的(式1)也確實是支持向量機最最經常使用的形式。至此一個比較完整的支持向量機框架就有了,簡單說來,支持向量機就是使用了核函數的軟間隔線性分類法。

2.懲罰因子

接下來要說的東西其實不是鬆弛變量自己,但因爲是爲了使用鬆弛變量才引入的,所以放在這裏也算合適,那就是懲罰因子C。回頭看一眼引入了鬆弛變量之後的優化問題:


注意其中C的位置,也能夠回想一下C所起的做用(表徵你有多麼重視離羣點,C越大越重視,越不想丟掉它們)。這個式子是之前作SVM的人寫的,你們也就這麼用,但沒有任何規定說必須對全部的鬆弛變量都使用同一個懲罰因子,咱們徹底能夠給每個離羣點都使用不一樣的C,這時就意味着你對每一個樣本的重視程度都不同,有些樣本丟了也就丟了,錯了也就錯了,這些就給一個比較小的C;而有些樣本很重要,決不能分類錯誤(好比中央下達的文件啥的,笑),就給一個很大的C。

固然實際使用的時候並無這麼極端,但一種很經常使用的變形能夠用來解決分類問題中樣本的「偏斜」問題
先來講說樣本的偏斜問題,也叫數據集偏斜(unbalanced),它指的是參與分類的兩個類別(也能夠指多個類別)樣本數量差別很大。好比說正類有10,000個樣本,而負類只給了100個,這會引發的問題顯而易見,能夠看看下面的圖:


方形的點是負類。H,H1,H2是根據給的樣本算出來的分類面,因爲負類的樣本不多不多,因此有一些原本是負類的樣本點沒有提供,好比圖中兩個灰色的方形點,若是這兩個點有提供的話,那算出來的分類面應該是H’,H2’和H1,他們顯然和以前的結果有出入,實際上負類給的樣本點越多,就越容易出如今灰色點附近的點,咱們算出的結果也就越接近於真實的分類面。但如今因爲偏斜的現象存在,使得數量多的正類能夠把分類面向負類的方向「推」,於是影響告終果的準確性。

對付數據集偏斜問題的方法之一就是在懲罰因子上做文章,想必你們也猜到了,那就是給樣本數量少的負類更大的懲罰因子,表示咱們重視這部分樣本(原本數量就少,再拋棄一些,那人家負類還活不活了),所以咱們的目標函數中因鬆弛變量而損失的部分就變成了:


其中i=1…p都是正樣本,j=p+1…p+q都是負樣本。libSVM這個算法包在解決偏斜問題的時候用的就是這種方法。

那C+和C-怎麼肯定呢?它們的大小是試出來的(參數調優),可是他們的比例能夠有些方法來肯定。我們先假定說C+是5這麼大,那肯定C-的一個很直觀的方法就是使用兩類樣本數的比來算,對應到剛纔舉的例子,C-就能夠定爲500這麼大(由於10,000:100=100:1嘛)。

可是這樣並不夠好,回看剛纔的圖,你會發現正類之因此能夠「欺負」負類,其實並非由於負類樣本少,真實的緣由是負類的樣本分佈的不夠廣(沒擴充到負類本應該有的區域)。說一個具體點的例子,如今想給政治類和體育類的文章作分類,政治類文章不少,而體育類只提供了幾篇關於籃球的文章,這時分類會明顯偏向於政治類,若是要給體育類文章增長樣本,但增長的樣本仍然全都是關於籃球的(也就是說,沒有足球,排球,賽車,游泳等等),那結果會怎樣呢?雖然體育類文章在數量上能夠達到與政治類同樣多,但過於集中了,結果仍會偏向於政治類!因此給C+和C-肯定比例更好的方法應該是衡量他們分佈的程度。好比能夠算算他們在空間中佔據了多大的體積,例如給負類找一個超球——就是高維空間裏的球啦——它能夠包含全部負類的樣本,再給正類找一個,比比兩個球的半徑,就能夠大體肯定分佈的狀況。顯然半徑大的分佈就比較廣,就給小一點的懲罰因子。

可是這樣還不夠好,由於有的類別樣本確實很集中,這不是提供的樣本數量多少的問題,這是類別自己的特徵(就是某些話題涉及的面很窄,例如計算機類的文章就明顯不如文化類的文章那麼「天馬行空」),這個時候即使超球的半徑差別很大,也不該該賦予兩個類別不一樣的懲罰因子。

看到這裏讀者必定瘋了,由於說來講去,這豈不成了一個解決不了的問題?然而事實如此,徹底的方法是沒有的,根據須要,選擇實現簡單又合用的就好(例如libSVM就直接使用樣本數量的比)。

相關文章
相關標籤/搜索