在利用支持向量機進行分類的時候怎麼選擇合適的核函數?


Andrew Ng理論1:當數據量足夠龐大時,feature足夠多時,所有的分類演算法最終的效果都差不多。也就是說,不管你選用什麼樣的核,在訓練集夠大的情況下都是然並卵。當然,就分類效果來說,非線性的比線性的核好一些。但線性的也能夠有很不錯的分類效果,而且計算量比非線性小,所以需要具體情況具體分析。

Andrew Ng理論2:老實人Andrew教你如何選擇合適的SVM核。

情況1:當訓練集不大,feature比較多的時候,用線性的核。因為多feature的情況下就已經可以給線性的核提供不錯的variance去fit訓練集。

情況2:當訓練集相對可觀,而feature比較少,用非線性的核。因為需要演算法提供更多的variance去fit訓練集。

情況3:feature少,訓練集非常大,用線性的核。因為非線性的核需要的計算量太大了。而龐大的訓練集,本身就可以給非線性的核提供很好的分類效果。

附圖,圖中給出了feature和example量化的數字。

提高你的分類效果,不僅僅跟你的核函數有關。同時也很你的訓練集大小,feature的選擇,懲罰參數入(lambda)的選擇有關。

Andrew Ng的課在理論方面講的不太深入,很多我在convex optimization上重點講的理論都被一筆帶過。不過從實用上來講,他確實講的非常好,30年專註提高分類效果,非常實在!做應用的話強烈建議去看一遍。


只就問題本身而言,Ng的課上的確給了一個很general的指導。還有一篇非常detail的論文,討論了如何選擇SVM核函數,其作者便是LibSVM的作者,建議參考下。A Practical Guide to Support Vector Classification: http://www.csie.ntu.edu.tw/~cjlin/papers/guide/guide.pdf, 另一篇介紹核函數的blog:Kernel Functions for Machine Learning Applications。


根據我的經驗,rbf核是最通用的核函數。如果你是用SVM做應用,一般不需要在核函數上下功夫,線性情況就用線性核,非線性的時候用rbf核就可以了。

不過最近我發現,有的時候,非線性的情況下用線性核效果也會很好。


簡單寫一些理論上的結果。

先看看kernel是如何引入的。首先SVM的dual形式中包含內積,我們希望可以利用內積的性質把原始數據的內積轉化為函數變換(所謂的利用特徵函數變換到特徵空間)後的內積 langle X, Y 
angle 	o langle f(X), f(Y)
angle,這樣有助於處理數據線性不可分的情況,同時變換後不影響SVM的分類/回歸結果,而且還方便求解。那麼如何選擇這個變換函數 f 呢?我們希望在一類連續平滑的函數 mathcal{F} 裡面找。怎麼構建 mathcal{F} 呢?在Hilbert space這個完備的內積空間上,我們可以定義一種Mercer kernel: K(cdot, cdot): mathcal{X} 	imes mathcal{Y}	o mathbb{R} ,它是一個二元函數並且滿足一系列性質(連續對稱正定等)。這樣 mathcal{F} 可以表示為kernel的線性組合: mathcal{F} = {f: f(cdot)= sumalpha K_x(cdot)} ,而且內積可以進而表示為 langle f, g
angle = langle f, g
angle_K = sum alpha eta K(x,y)f,g in mathcal{F} 。這樣有很多好處,比如內積的結果和 f,g的具體形式無關,reproducing propertylangle K_x, K_y 
angle = K(x,y)K_x 可以看作連續的evaluation functional,保證一致收斂等等。這樣我們就選好了 f 的形式,並且獲得了它的一系列好處,並且甩給定義了Mercer kernel的Hilbert space一個名字:Reproducing Kernel Hilbert Space (RKHS),就是這麼粗暴。

回到SVM,定義在RKHS上的SVM就成了 min sum (1-Yf(X)) + frac{lambda}{2}|f|_K^2 ,其對偶形式也是替換內積為mercer kernel下的內積。這裡有一個representer theorem 直接給出了解的形式 widehat{f}(x) = sum_ialpha_i K(x_i, x) 。但是具體求解的時候,還是和核函數的選擇有關。

怎麼選核函數呢?這裡講講背後的原理。其實就是常說的bias 和 variance的tradeoff。只不過這裡的bias和variance不是很直觀。比如bias可以是 |widehat{f}-f |_{infty} ,variance可以是 mathbb{E}|f_n - widehat{f}| 。二者的tradeoff和具體核函數的形式有關,並且可以找到一個合適的error bound。舉例來說,如果選mercer kernel為無窮維高斯核函數,那麼為了平衡bias和variance,需要調試 sigma ,可以用cross validation來調參。

具體的不同核函數對比結果可以看

refs:

[1] Valentini, Giorgio, and Thomas G. Dietterich. amp;quot;Bias-variance analysis of support vector machines for the development of SVM-based ensemble methods.amp;quot; Journal of Machine Learning Research 5.Jul (2004): 725-775.


我在實習的時候,請教過某985院校數學學院高材生這個問題,他的回答是:

他們在處理SVM如何選擇核函數這個問題的時候,有一套相對成熟的方法來判斷當前數據集大致適合哪一種核函數,and更多的時候,這個「適合當前數據集的核函數」不是現成就有的,是需要他們自己去編程實現的。

聽完後,我當時瞬間在心中膜拜了一下!!

後來通過實習,慢慢地發現,商業領域對於機器學習演算法的選擇,並不傾向於選擇像SVM這種高大上機器學習演算法(它們就像黑盒子,雖然很牛逼,但你卻不能很好地解釋它的工作成果,比如在所有特徵集中,到底哪個變數更重要,它們是怎麼影響因變數變化的等等)。相反,LR和Decision Tree這兩種演算法,就相當吃香。

樓主如果不是用SVM做學術的話,沒必要去深究哪種核函數更合適?

原因一,上面已經說了。

原因二,SVM現成的核函數,就那麼幾個,挨個挨個試也可以找到相對最優的。

BUT,但我理解的SVM過度依賴參數,除了過度依賴合適的核函數外,SVM還過度的依賴當前核函數下的具體參數。


或者可以用mutiple kernel learning,一堆kernel放一起,讓模型自己學出個最好的kernel吧,論文如下:

http://users.ics.aalto.fi/gonen/files/gonen_jmlr11_paper.pdf


隨便選一個就行了,不行就換一個,這根本就沒啥可說。而且一般也不會用svm,因為速度慢,線性svm的話被logistic完爆


核函數使用默認的rbf效果就不錯。SVM主要是調整正則項的超參,這個對模型的表現是比較重要的。


我都是試的,參數也要試,感覺很蠢


推薦閱讀:

除了 arxiv.org, 機器學習與數據挖掘相關在哪可以閱讀比較專業的文獻?
如何有效的區分和理解RNN循環神經網路與遞歸神經網路?
人工神經網路與人類神經網路有關係嗎?
ICCV2017有什麼令人關注的文章?
機器如何去理解一個「概念」?

TAG:機器學習 | SVM | 分類演算法 | kernel核函數 |