轉自:SVM 調參策略:https://blog.csdn.net/u014484783/article/details/78220646
SVM 怎樣能得到好的結果?
1. 對數據做歸一化(simple scaling)?
2. 應用 RBF kernel?
3. 用cross-validation和grid-search 得到最優的c和g?
4. 用得到的最優c和g訓練訓練數據?
5. 測試
1 關于svm的C以及核函數參數設置
1.1 C的選擇
C一般可以選擇為:10^t , t=[- 4,4]就是0.0001 到10000。選擇的越大,表示對錯誤例懲罰程度越大,可能會導致模型過擬合
1.2 常見核函數及其選擇
0)線性核函數?
(無其他參數)?
1)多項式核函數?
(重點是階數的選擇,即d,一般選擇1-11:1 3 5 7 9 11,也可以選擇2,4,6…)?
2)RBF核函數?
(徑向基RBF內核,exp{-|xi-xj|^2/均方差},其中均方差反映了數據波動的大小。
gamma參數通常可選擇下面幾個數的倒數:0.1 0.2 0.4 0.6 0.8 1.6 3.2 6.4 12.8,默認的是類別數的倒數,即1/k,2分類的話就是0.5)?
3)sigmoid核函數 又叫做S形內核?
兩個參數g以及r:g一般可選1 2 3 4,r選0.2 0.4 0.6 0.8 1?
4)自定義核函數
核函數的參數:
1)對于線性核函數,沒有專門需要設置的參數?
2)對于多項式核函數,有三個參數。-d用來設置多項式核函數的最高此項次數,也就是公式中的d,默認值是3。-g用來設置核函數中的gamma參數設置,也就是公式中的第一個r(gamma),默認值是1/k(k是類別數)。-r用來設置核函數中的coef0,也就是公式中的第二個r,默認值是0。?
3)對于RBF核函數,有一個參數。-g用來設置核函數中的gamma參數設置,也就是公式中的第一個r(gamma),默認值是1/k(k是類別數)。?
4)對于sigmoid核函數,有兩個參數。-g用來設置核函數中的gamma參數設置,也就是公式中的第一個r(gamma),默認值是1/k(k是類別數)。-r用來設置核函數中的coef0,也就是公式中的第二個r,默認值是0。
2 關于cost和gamma
SVM模型有兩個非常重要的參數C與gamma。
-
其中 C是懲罰系數,即對誤差的寬容度。c越高,說明越不能容忍出現誤差,容易過擬合。C越小,容易欠擬合。C過大或過小,泛化能力變差
-
gamma是選擇RBF函數作為kernel后,該函數自帶的一個參數。隱含地決定了數據映射到新的特征空間后的分布,gamma越大,支持向量越少,gamma值越小,支持向量越多。支持向量的個數影響訓練與預測的速度。
- Grid Search?
使用grid Search雖然比較簡單,而且看起來很na?ve。但是他確實有兩個優點:?
可以得到全局最優?
(C,gamma)相互獨立,便于并行化進行 -
# SVM Classifier using cross validation
-
def svm_cross_validation(train_x, train_y):
-
from sklearn.grid_search import GridSearchCV
-
from sklearn.svm import SVC
-
model = SVC(kernel='rbf', probability=True)
-
param_grid = {'C': [1e-3, 1e-2, 1e-1, 1, 10, 100, 1000], 'gamma': [0.001, 0.0001]}
-
grid_search = GridSearchCV(model, param_grid, n_jobs = 8, verbose=1)
-
grid_search.fit(train_x, train_y)
-
best_parameters = grid_search.best_estimator_.get_params()
-
for para, val in list(best_parameters.items()):
-
print(para, val)
-
model = SVC(kernel='rbf', C=best_parameters['C'], gamma=best_parameters['gamma'], probability=True)
-
model.fit(train_x, train_y)
-
return model
SVM有如下主要幾個特點:
(1)非線性映射是SVM方法的理論基礎,SVM利用內積核函數代替向高維空間的非線性映射;
(2)對特征空間劃分的最優超平面是SVM的目標,最大化分類邊際的思想是SVM方法的核心;
(3)支持向量是SVM的訓練結果,在SVM分類決策中起決定作用的是支持向量;
(4)SVM 是一種有堅實理論基礎的新穎的小樣本學習方法。?
它基本上不涉及概率測度及大數定律等,因此不同于現有的統計方法。?
從本質上看,它避開了從歸納到演繹的傳統過程,實現了高效的從訓練樣本到預報樣本的“轉導推理”,大大簡化了通常的分類和回歸等問題;
(5)SVM 的最終決策函數只由少數的支持向量所確定,計算的復雜性取決于支持向量的數目,而不是樣本空間的維數,這在某種意義上避免了“維數災難”。
(6)少數支持向量決定了最終結果,這不但可以幫助我們抓住關鍵樣本、“剔除”大量冗余樣本,而且注定了該方法不但算法簡單,而且具有較好的“魯棒”性。?
這種“魯棒”性主要體現在:?
①增、刪非支持向量樣本對模型沒有影響;?
②支持向量樣本集具有一定的魯棒性;?
③有些成功的應用中,SVM 方法對核的選取不敏感
兩個不足:
(1) SVM算法對大規模訓練樣本難以實施?
由于SVM是借助二次規劃來求解支持向量,而求解二次規劃將涉及m階矩陣的計算(m為樣本的個數),當m數目很大時該矩陣的存儲和計算將耗費大量的機器內存和運算時間。針對以上問題的主要改進有?
J.Platt的SMO算法、?
T.Joachims的SVM、?
C.J.C.Burges等的PCGC、?
張學工的CSVM?
以及O.L.Mangasarian等的SOR算法
(2) 用SVM解決多分類問題存在困難?
經典的支持向量機算法只給出了二類分類的算法,而在數據挖掘的實際應用中,一般要解決多類的分類問題。可以通過多個二類支持向量機的組合來解決。主要有一對多組合模式、一對一組合模式和SVM決策樹;再就是通過構造多個分類器的組合來解決。主要原理是克服SVM固有的缺點,結合其他算法的優勢,解決多類問題的分類精度。如:與粗集理論結合,形成一種優勢互補的多類問題的組合分類器.
-----------------------------------------------------------------------------------------------------------------------------------------------------
https://blog.csdn.net/yzf0011/article/details/71521001
http://discussions.youdaxue.com/t/svm-rbf-kernel/6088
在我們機器學習的過程中,很多同學包括我自己也疑惑過rbf kernel函數的實際作用是什么?不同的參數又有什么作用。
上周我參加了上海的夏令營,這里就是我們討論的結果。
首先我們要知道Support Vector Machine到底是什么東西。看過課程視頻的同學都是到,SVM旨在將一組不可線性分割的數據線性分割。怎么做到的呢?通過將低維度的數據投影到高維度來實現。
這里又涉及到兩個關鍵詞“線性分割”、“投影”。
線性可分割
線性分割就是一組數據可以被一條直線(高維度空間中是超平面)分為兩半。
如上圖所示,A是線性可分的,B不是。
那么在更高維度中,線性就是指的一個平面。在三維空間中是平面,在更高維度中就是超平面。
投影
投影(映射)就是一個函數。z = f(x, y) 就是把x,y投影到z。“投影”這個用詞其實是一個幾何空間的借喻。意思就是說,將(x,y)這個本來屬于二維空間的點‘’投影‘’到第三維。如下:
(x1, y1) => (x1, y1, z1)
(x2, y2) => (x2, y2, z2)
(x3, y3) => (x3, y3, z3)
....
依次類推
內核函數 Kernel Function
內核函數就是投影所具體使用的函數。這里就用rbf來舉例。rbf全稱是Radial Based Function,基于半徑的函數。
在解釋 rbf 之前,先來看一個更簡單地例子。
如上圖所示,左邊的圈圈和叉叉是不可線性分割的。但是我們可以看出,一個圓圈可以將它們分開。這個圓其實就代表不同的點到原點(0,0)的距離的分界線。距離更大的叉叉在圓外面,距離小的圈圈在圓里面。
那么什么函數才可以僅僅基于 x1 和 x2 就算出離原點的距離呢?答案是:
define 距離函數 f(x1, x2) 為: sqrt( x1^2 + x2 ^ 2 ) 。然后讓 f(x1,x2) 投影到 x3
這里開不開根號其實無所謂,因為我們關心的不是絕對的距離,而是一個可以區分不同距離的尺度。
那么對于SVM來說,我們的 f 就是內核函數。通過這個 f,我們就可以將左邊的二維坐標系投影成右邊的三維坐標系。然后很明顯的,我們的數據變得線性可分割了(通過那個切面)。
Radial Based Function
現在我們再來看?rbf1
這是 rbf 的數學公式。當然,更一般性的寫法是
公式的具體含義這里不作很數學的解釋(比如說什么是 exponential function)
要注意的有3個方面。
- X 和 X’ 不是標量,是向量(別名:矢量)
- | X - X' | ^ 2 就是一個距離公式,X’ 是相對于 X 的另外一個點 (一個向量可以被當做一個點)
- gamma 是一個常數 (具體含義后面講)
我們可以觀察到,之前算到原點距離的 f 就是 這里的 rbf 的一種特殊情況。X’ 就是 (0,0)。而 rbf 中 X’ 是根據具體情況而定的。
我們可以再看到這個圖
對于圖 B 來說,用原點作為參考點肯定是不合適的。參考點應該是藍色數據的中心點。然后 rbf 可以算出每個點到該中心的距離,從而將其投影到一個三維空間,讓其變得可以線性分割。
rbf 投影后的結果大概就長這樣(圖片僅供參考)
gamma 參數什么意思
我們通過公式可知,gamma 是一個常量,而且是一個線性的因數。所以大家可以想象,gamma的作用,其實就是控制數據在向高維度投影后的縮放比例。如果 gamma 很大,那么上圖的點就會離切面很遠。如果 gamma 很小,上圖的點就會離切面很近。
而這個縮放比例就會影響線性分割面的運算結果(不同的loss function對距離的懲罰度不一樣)。這也是SVM對數據 Scaling 和 Normalization 是敏感的原因之一。因為最后都是算的一個 Linear Model
這就是為什么,有人說如果原始數據比較分散,gamma可以小一點。反之,如果原始數據很密集,gamma可以大一點。當然,這不是絕對的,所以我們才要做 GridSearch
通常我們會 0.01、0.1、1、10、100 ... 這樣指數級地搜索一個比較好的 gamma
sklearn SVM 里的 C 是什么意思?
我都寫了這么多,這就留給你當作業吧。多看?sklearn 文檔3。記住,gamma 和 C 是好基友
你可以在評論里面寫自己對 C 的理解