SVM的核函數如何選取?
常用的核函數有那麼幾個,我也是從書本中了解的,沒什麼經驗。我這裡比較好奇,通常的SVM工具包如何設定核函數呢?枚舉取效果最好的?
在我的工作中,最常用的是Linear核與RBF核。
1. Linear核:主要用於線性可分的情形。參數少,速度快,對於一般數據,分類效果已經很理想了。2. RBF核:主要用於線性不可分的情形。參數多,分類結果非常依賴於參數。有很多人是通過訓練數據的交叉驗證來尋找合適的參數,不過這個過程比較耗時。我個人的體會是:使用libsvm,默認參數,RBF核比Linear核效果稍差。通過進行大量參數的嘗試,一般能找到比linear核更好的效果。至於到底該採用哪種核,要根據具體問題,有的數據是線性可分的,有的不可分,需要多嘗試不同核不同參數。如果特徵的提取的好,包含的信息量足夠大,很多問題都是線性可分的。當然,如果有足夠的時間去尋找RBF核參數,應該能達到更好的效果。SVM關鍵是選取核函數的類型,主要有線性內核,多項式內核,徑向基內核(RBF),sigmoid核。 這些函數中應用最廣的應該就是RBF核了,無論是小樣本還是大樣本,高維還是低維等情況,RBF核函數均適用,它相比其他的函數有一下優點:1)RBF核函數可以將一個樣本映射到一個更高維的空間,而且線性核函數是RBF的一個特例,也就是說如果考慮使用RBF,那麼就沒有必要考慮線性核函數了。2)與多項式核函數相比,RBF需要確定的參數要少,核函數參數的多少直接影響函數的複雜程度。另外,當多項式的階數比較高時,核矩陣的元素值將趨於無窮大或無窮小,而RBF則在上,會減少數值的計算困難。3)對於某些參數,RBF和sigmoid具有相似的性能。
我用的是台灣大學開發的libSVM,裡面option-t是用來選擇核函數的,一般2是默認的核函數,如果不選option t的話就是這個,效果還可以,1是polynomial,多項分類,需要你在訓練樣本中提前準備好多個label,以便後面分類有一個標答。4是自己設定的kernel function,如果你自己的code里應用了核函數的話就不必用以上的選項,可以直接用輸出的數值(distance或者similarity)來進行訓練。
0 -- linear: u"*v
1 -- polynomial: (gamma*u"*v + coef0)^degree 2 -- radial basis function: exp(-gamma*|u-v|^2)3 -- sigmoid: tanh(gamma*u"*v + coef0)
4 -- precomputed kernel (kernel values in training_set_file)
一般用線性核和高斯核,也就是Linear核與RBF核需要注意的是需要對數據歸一化處理,很多使用者忘了這個小細節然後一般情況下RBF效果是不會差於Linear但是時間上RBF會耗費更多,其他同學也解釋過了下面是吳恩達的見解:1. 如果Feature的數量很大,跟樣本數量差不多,這時候選用LR或者是Linear Kernel的SVM2. 如果Feature的數量比較小,樣本數量一般,不算大也不算小,選用SVM+Gaussian Kernel3. 如果Feature的數量比較小,而樣本數量很多,需要手工添加一些feature變成第一種情況
難道大家不都是試所有的核函數,看那個效果好。就說自己的數據是適合哪種核函數的數據分布特性的么。
記口訣:
初級
高維用線性,不行換特徵;低維試線性,不行換高斯中級
線性試試看,不行換高斯,卡方有奇效,絕招MKL玩家Kernel度量相似性,自己做啊自己做一般我們用的R裡面的e1071包的svm函數和python的scikit-learn包里的svm函數都是基於libsvm實現的:http://www.csie.ntu.edu.tw/~cjlin/libsvm/libsvm
libsvm提供了下列幾個核函數:
通常來說,個人經驗RBF kernel是第一選擇,幾乎效果都是最好的。此外,linear kernel也有用武之地,(其實linear kernel本身就是RBF的一種特殊情況),因為當features的數量很多的時候,linear kernel的速度優勢比較明顯。當然有時間當然最好是都試一遍,看看哪個更符合自己的數據分布特性了。linear:
u"*v
polynomial:(gamma*u"*v + coef0)^degree
radial basis:exp(-gamma*|u-v|^2)
sigmoid:tanh(gamma*u"*v + coef0)
直接看libsvm作者自己寫的guide吧:
A Practical Guide to Support Vector Classification
https://www.csie.ntu.edu.tw/~cjlin/papers/guide/guide.pdf
一般來說先用RBF kernel
3.1里有講,簡單說一下就是:
- RBF kernel可以處理非線性的情況,linear kernel可以是RBF kernel的特殊情況,sigmoid kernel又在某些參數下和RBF很像
- polynomial kernel的參數比RBF多,而參數越多模型越複雜
- RBF kernel更方便計算,取值在[0,1];而用polynomial kernel取值範圍是(0,inf),在自由度高的情況下更凸顯出劣勢;至於sigmoid,它可能在某些參數下是無效的
當然有些情況下用linear kernel就好了,比如特徵維數很高的時候。
私以為無論新手還是之前接觸過SVM,看一看那篇guide都會有幫助,非常pragmatic。
我們先看幾張圖
分別選用了linear, rbf, poly。
就擬合程度來講,linear在線性可分的情況下和rbf想過差不多,在線性不可分的情況下rbf明顯優於linear,poly在前兩種情況下效果都不怎麼好,但是在變化劇烈的情況下ploy稍微好點。
就速度來講,linear肯定是最快的,poly的話因為參數很多,測試中最慢。
就參數而言,linear簡單易用,rbf, poly參數較多,但是調參好的話可以得到較好的結果。
還是需要看情況選擇吧。
看到別人的答案里提到了吳恩達給出的選擇核函數的方法,關於那三點,我的理解是:
(1)如果特徵維數很高,往往線性可分(SVM解決非線性分類問題的思路就是將樣本映射到更高維的特徵空間中),可以採用LR或者線性核的SVM;
(2)如果樣本數量很多,由於求解最優化問題的時候,目標函數涉及兩兩樣本計算內積,使用高斯核明顯計算量會大於線性核,所以手動添加一些特徵,使得線性可分,然後可以用LR或者線性核的SVM;
(3)如果不滿足上述兩點,即特徵維數少,樣本數量正常,可以使用高斯核的SVM。
可以試試 pGMM 核函數.
http://www.stat.rutgers.edu/home/pingli/papers/epGMM.pdf
混合核函數
推薦閱讀: