機器學習必修課!scikit-learn 支持向量機算法庫使用小結

本文從實踐的角度對scikit-learn SVM算法庫的使用做一個小結。scikit-learn SVM算法庫封裝了libsvm 和 liblinear 的實現,僅僅重寫了算法了接口部分。


1. scikit-learn SVM算法庫使用概述


scikit-learn中SVM的算法庫分為兩類,一類是分類的算法庫,包括SVC, NuSVC,和LinearSVC 3個類。另一類是迴歸算法庫,包括SVR, NuSVR,和LinearSVR 3個類。相關的類都包裹在sklearn.svm模塊之中。

對於SVC, NuSVC,和LinearSVC 3個分類的類,SVC和 NuSVC差不多,區別僅僅在於對損失的度量方式不同,而LinearSVC從名字就可以看出,他是線性分類,也就是不支持各種低維到高維的核函數,僅僅支持線性核函數,對線性不可分的數據不能使用。

同樣的,對於SVR, NuSVR,和LinearSVR 3個迴歸的類, SVR和NuSVR差不多,區別也僅僅在於對損失的度量方式不同。LinearSVR是線性迴歸,只能使用線性核函數。

我們使用這些類的時候,如果有經驗知道數據是線性可以擬合的,那麼使用LinearSVC去分類 或者LinearSVR去迴歸,它們不需要我們去慢慢的調參去選擇各種核函數以及對應參數, 速度也快。如果我們對數據分佈沒有什麼經驗,一般使用SVC去分類或者SVR去迴歸,這就需要我們選擇核函數以及對核函數調參了。

什麼特殊場景需要使用NuSVC分類 和 NuSVR 迴歸呢?如果我們對訓練集訓練的錯誤率或者說支持向量的百分比有要求的時候,可以選擇NuSVC分類 和 NuSVR 。它們有一個參數來控制這個百分比。

這些類的詳細使用方法我們在下面再詳細講述。

2. 回顧SVM分類算法和迴歸算法

我們先簡要回顧下SVM分類算法和迴歸算法,因為這裡面有些參數對應於算法庫的參數,如果不先複習下,下面對參數的講述可能會有些難以理解。

對於SVM分類算法,其原始形式是:

其中m為樣本個數,我們的樣本為。是我們的分離超平面的係數,為第i個樣本的鬆弛係數, C為懲罰係數。為低維到高維的映射函數。

通過拉格朗日函數以及對偶化後的形式為:

其中和原始形式不同的為拉格朗日系數向量。為我們要使用的核函數。

3. SVM核函數概述

在scikit-learn中,內置的核函數一共有4種,當然如果你認為線性核函數不算核函數的話,那就只有三種。

1)線性核函數(Linear Kernel)表達式為:,就是普通的內積,LinearSVC 和 LinearSVR 只能使用它。

2) 多項式核函數(Polynomial Kernel)是線性不可分SVM常用的核函數之一,表達式為:(,其中,都需要自己調參定義,比較麻煩。

3)高斯核函數(Gaussian Kernel),在SVM中也稱為徑向基核函數(Radial Basis Function,RBF),它是libsvm默認的核函數,當然也是scikit-learn默認的核函數。表達式為:, 其中,大於0,需要自己調參定義。

4)Sigmoid核函數(Sigmoid Kernel)也是線性不可分SVM常用的核函數之一,表達式為:(, 其中,都需要自己調參定義。

一般情況下,對非線性數據使用默認的高斯核函數會有比較好的效果,如果你不是SVM調參高手的話,建議使用高斯核來做數據分析。

4. SVM分類算法庫參數小結

這裡我們對SVM分類算法庫的重要參數做一個詳細的解釋,重點講述調參的一些注意點。

機器學習必修課!scikit-learn 支持向量機算法庫使用小結

5. SVM迴歸算法庫參數小結

SVM迴歸算法庫的重要參數巨大部分和分類算法庫類似,因此這裡重點講述和分類算法庫不同的部分,對於相同的部分可以參考上一節對應參數。

機器學習必修課!scikit-learn 支持向量機算法庫使用小結

6. SVM算法庫其他調參要點

上面已經對scikit-learn中類庫的參數做了總結,這裡對其他的調參要點做一個小結。

1)一般推薦在做訓練之前對數據進行歸一化,當然測試集中的數據也需要歸一化。。

2)在特徵數非常多的情況下,或者樣本數遠小於特徵數的時候,使用線性核,效果已經很好,並且只需要選擇懲罰係數C即可。

3)在選擇核函數時,如果線性擬合不好,一般推薦使用默認的高斯核'rbf'。這時我們主要需要對懲罰係數C和核函數參數進行艱苦的調參,通過多輪的交叉驗證選擇合適的懲罰係數C和核函數參數。

4)理論上高斯核不會比線性核差,但是這個理論卻建立在要花費更多的時間來調參上。所以實際上能用線性核解決問題我們儘量使用線性核。


分享到:


相關文章: