【機(jī)器學(xué)習(xí)實(shí)戰(zhàn)(三)】sklearn包中SVM算法庫(kù)的使用

目錄

    1. SVM相關(guān)知識(shí)點(diǎn)回顧
      1.1. SVM與SVR
      1.2. 核函數(shù)
    1. sklearn中SVM相關(guān)庫(kù)的簡(jiǎn)介
    • 2.1. 分類庫(kù)與回歸庫(kù)
    • 2.2. 高斯核調(diào)參
      • 2.2.1. 需要調(diào)節(jié)的參數(shù)
      • 2.2.2. 調(diào)參方法:網(wǎng)格搜索
    1. 編程實(shí)現(xiàn)

這是《西瓜書帶學(xué)訓(xùn)練營(yíng)·實(shí)戰(zhàn)任務(wù)》系列的第三篇筆記

1. SVM相關(guān)知識(shí)點(diǎn)回顧

1.1. SVM與SVR

  • SVM分類算法

    其原始形式是:

    其中m為樣本個(gè)數(shù),我們的樣本為(x1,y1),(x2,y2),...,(xm,ym)。w,b是我們的分離超平面的w??(xi)+b=0系數(shù), ξi為第i個(gè)樣本的松弛系數(shù), C為懲罰系數(shù)。?(xi)為低維到高維的映射函數(shù)

    通過拉格朗日函數(shù)以及對(duì)偶化后的形式為:

  • SVR回歸算法

    其中m為樣本個(gè)數(shù),我們的樣本為(x1,y1),(x2,y2),...,(xm,ym)。w,b是我們的回歸超平面的w?xi+b=0系數(shù), ξi,ξi為第i個(gè)樣本的松弛系數(shù), C為懲罰系數(shù),?為損失邊界,到超平面距離小于?的訓(xùn)練集的點(diǎn)沒有損失。?(xi)為低維到高維的映射函數(shù)。

1.2. 核函數(shù)

在scikit-learn中,內(nèi)置的核函數(shù)一共有4種:

  • 線性核函數(shù)(Linear Kernel)表達(dá)式為:K(x,z)=x?z,就是普通的內(nèi)積

  • 多項(xiàng)式核函數(shù)(Polynomial Kernel)是線性不可分SVM常用的核函數(shù)之一,表達(dá)式為:K(x,z)=(γx?z+r)d ,其中,γ,r,d都需要自己調(diào)參定義

  • 高斯核函數(shù)(Gaussian Kernel),在SVM中也稱為徑向基核函數(shù)(Radial Basis Function,RBF),它是 libsvm 默認(rèn)的核函數(shù),當(dāng)然也是 scikit-learn 默認(rèn)的核函數(shù)。表達(dá)式為:K(x,z)=exp(?γ||x?z||2), 其中,γ大于0,需要自己調(diào)參定義

  • Sigmoid核函數(shù)(Sigmoid Kernel)也是線性不可分SVM常用的核函數(shù)之一,表達(dá)式為:K(x,z)=tanh(γx?z+r), 其中,γ,r都需要自己調(diào)參定義

一般情況下,對(duì)非線性數(shù)據(jù)使用默認(rèn)的高斯核函數(shù)會(huì)有比較好的效果,如果你不是SVM調(diào)參高手的話,建議使用高斯核來做數(shù)據(jù)分析。

2. sklearn中SVM相關(guān)庫(kù)的簡(jiǎn)介

scikit-learn SVM算法庫(kù)封裝了libsvm 和 liblinear 的實(shí)現(xiàn),僅僅重寫了算法了接口部分

2.1. 分類庫(kù)與回歸庫(kù)

  • 分類算法庫(kù)

    包括SVC, NuSVC,和LinearSVC 3個(gè)類

    對(duì)于SVC, NuSVC,和LinearSVC 3個(gè)分類的類,SVC和 NuSVC差不多,區(qū)別僅僅在于對(duì)損失的度量方式不同,而LinearSVC從名字就可以看出,他是線性分類,也就是不支持各種低維到高維的核函數(shù),僅僅支持線性核函數(shù),對(duì)線性不可分的數(shù)據(jù)不能使用

  • 回歸算法庫(kù)

    包括SVR, NuSVR,和LinearSVR 3個(gè)類

    同樣的,對(duì)于SVR, NuSVR,和LinearSVR 3個(gè)回歸的類, SVR和NuSVR差不多,區(qū)別也僅僅在于對(duì)損失的度量方式不同。LinearSVR是線性回歸,只能使用線性核函數(shù)

2.2. 高斯核調(diào)參

2.2.1. 需要調(diào)節(jié)的參數(shù)

  • SVM分類模型

    如果是SVM分類模型,這兩個(gè)超參數(shù)分別是懲罰系數(shù)CRBF核函數(shù)的系數(shù)γ

    懲罰系數(shù)C

    它在優(yōu)化函數(shù)里主要是平衡支持向量的復(fù)雜度和誤分類率這兩者之間的關(guān)系,可以理解為正則化系數(shù)

    • 當(dāng)C比較大時(shí),我們的損失函數(shù)也會(huì)越大,這意味著我們不愿意放棄比較遠(yuǎn)的離群點(diǎn)。這樣我們會(huì)有更加多的支持向量,也就是說支持向量和超平面的模型也會(huì)變得越復(fù)雜,也容易過擬合

    • 當(dāng)C比較小時(shí),意味我們不想理那些離群點(diǎn),會(huì)選擇較少的樣本來做支持向量,最終的支持向量和超平面的模型也會(huì)簡(jiǎn)單

    scikit-learn中默認(rèn)值是1

    C越大,泛化能力越差,易出現(xiàn)過擬合現(xiàn)象;C越小,泛化能力越好,易出現(xiàn)過欠擬合現(xiàn)象

    BF核函數(shù)的參數(shù)γ

    RBF 核函數(shù)K(x,z)=exp(?γ||x?z||2) γ>0

    γ主要定義了單個(gè)樣本對(duì)整個(gè)分類超平面的影響

    • 當(dāng)γ比較小時(shí),單個(gè)樣本對(duì)整個(gè)分類超平面的影響比較小,不容易被選擇為支持向量

    • 當(dāng)γ比較大時(shí),單個(gè)樣本對(duì)整個(gè)分類超平面的影響比較大,更容易被選擇為支持向量,或者說整個(gè)模型的支持向量也會(huì)多

    scikit-learn中默認(rèn)值是 1/樣本特征數(shù)

    γ越大,訓(xùn)練集擬合越好,泛化能力越差,易出現(xiàn)過擬合現(xiàn)象

    如果把懲罰系數(shù)C和RBF核函數(shù)的系數(shù)γ一起看,當(dāng)C比較大, γ比較大時(shí),我們會(huì)有更多的支持向量,我們的模型會(huì)比較復(fù)雜,容易過擬合一些。如果C比較小 , γ比較小時(shí),模型會(huì)變得簡(jiǎn)單,支持向量的個(gè)數(shù)會(huì)少

  • SVM回歸模型

    SVM回歸模型的RBF核比分類模型要復(fù)雜一點(diǎn),因?yàn)榇藭r(shí)我們除了懲罰系數(shù)C和RBF核函數(shù)的系數(shù)γ之外,還多了一個(gè)損失距離度量?

    對(duì)于損失距離度量?,它決定了樣本點(diǎn)到超平面的距離損失

    • 當(dāng) ? 比較大時(shí),損失較小,更多的點(diǎn)在損失距離范圍之內(nèi),而沒有損失,模型較簡(jiǎn)單

    • 當(dāng) ? 比較小時(shí),損失函數(shù)會(huì)較大,模型也會(huì)變得復(fù)雜

    scikit-learn中默認(rèn)值是0.1

    如果把懲罰系數(shù)C,RBF核函數(shù)的系數(shù)γ和損失距離度量?一起看,當(dāng)C比較大, γ比較大,?比較小時(shí),我們會(huì)有更多的支持向量,我們的模型會(huì)比較復(fù)雜,容易過擬合一些。如果C比較小 , γ比較小,?比較大時(shí),模型會(huì)變得簡(jiǎn)單,支持向量的個(gè)數(shù)會(huì)少

2.2.2. 調(diào)參方法:網(wǎng)格搜索

對(duì)于SVM的RBF核,我們主要的調(diào)參方法都是交叉驗(yàn)證。具體在scikit-learn中,主要是使用網(wǎng)格搜索,即GridSearchCV類

from sklearn.model_selection import GridSearchCV
grid = GridSearchCV(SVC(), param_grid={"C":[0.1, 1, 10], "gamma": [1, 0.1, 0.01]}, cv=4)
grid.fit(X, y)

將GridSearchCV類用于SVM RBF調(diào)參時(shí)要注意的參數(shù)有:

  1. estimator:即我們的模型,此處我們就是帶高斯核的SVC或者SVR

  2. param_grid:即我們要調(diào)參的參數(shù)列表。 比如我們用SVC分類模型的話,那么param_grid可以定義為{"C":[0.1, 1, 10], "gamma": [0.1, 0.2, 0.3]},這樣我們就會(huì)有9種超參數(shù)的組合來進(jìn)行網(wǎng)格搜索,選擇一個(gè)擬合分?jǐn)?shù)最好的超平面系數(shù)

  3. cv:S折交叉驗(yàn)證的折數(shù),即將訓(xùn)練集分成多少份來進(jìn)行交叉驗(yàn)證。默認(rèn)是3。如果樣本較多的話,可以適度增大cv的值

3. 編程實(shí)現(xiàn)

  1. 生成測(cè)試數(shù)據(jù)

    from sklearn.datasets import make_circles
    from sklearn.preprocessing import StandardScaler
    
    # 生成一些隨機(jī)數(shù)據(jù)用于后續(xù)分類
    X, y = make_circles(noise=0.2, factor=0.5, random_state=1) # 生成時(shí)加入了一些噪聲
    X = StandardScaler().fit_transform(X) # 把數(shù)據(jù)歸一化
    
    

    生成的隨機(jī)數(shù)據(jù)可視化結(jié)果如下:

  1. 調(diào)參

    接著采用網(wǎng)格搜索的策略進(jìn)行RBF核函數(shù)參數(shù)搜索

    from sklearn.model_selection import GridSearchCV
    grid = GridSearchCV(SVC(), param_grid={"C":[0.1, 1, 10], "gamma": [1, 0.1, 0.01]}, cv=4) # 總共有9種參數(shù)組合的搜索空間
    grid.fit(X, y)
    print("The best parameters are %s with a score of %0.2f"
          % (grid.best_params_, grid.best_score_))
    
    輸出為:
    The best parameters are {'C': 10, 'gamma': 0.1} with a score of 0.91
    

    可以對(duì)9種參數(shù)組合訓(xùn)練的結(jié)果進(jìn)行可視化,觀察分類的效果:

    x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
    y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
    xx, yy = np.meshgrid(np.arange(x_min, x_max,0.02),
                         np.arange(y_min, y_max, 0.02))
    
    for i, C in enumerate((0.1, 1, 10)):
        for j, gamma in enumerate((1, 0.1, 0.01)):
            plt.subplot()       
            clf = SVC(C=C, gamma=gamma)
            clf.fit(X,y)
            Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
    
            # Put the result into a color plot
            Z = Z.reshape(xx.shape)
            plt.contourf(xx, yy, Z, cmap=plt.cm.coolwarm, alpha=0.8)
    
            # Plot also the training points
            plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.coolwarm)
    
            plt.xlim(xx.min(), xx.max())
            plt.ylim(yy.min(), yy.max())
            plt.xticks(())
            plt.yticks(())
            plt.xlabel(" gamma=" + str(gamma) + " C=" + str(C))
            plt.show()
    
1.000 0.100 0.001
0.1
1
10

參考資料:

(1) 劉建平Pinard《scikit-learn 支持向量機(jī)算法庫(kù)使用小結(jié)》

(2) 劉建平Pinard《支持向量機(jī)高斯核調(diào)參小結(jié)》

(3) loveliuzz《機(jī)器學(xué)習(xí)sklearn19.0——SVM算法》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容