1. 程式人生 > >機器學習:SVM(scikit-learn 中的 RBF、RBF 中的超參數 γ)

機器學習:SVM(scikit-learn 中的 RBF、RBF 中的超參數 γ)

import colors 機器 class 核函數 RoCE caf 情況 方差

一、高斯核函數、高斯函數

  • 技術分享圖片
  • μ:期望值,均值,樣本平均數;(決定告訴函數中心軸的位置:x = μ)
  • σ2:方差;(度量隨機樣本和平均值之間的偏離程度:技術分享圖片技術分享圖片 為總體方差, 技術分享圖片 為變量, 技術分享圖片 為總體均值, 技術分享圖片 為總體例數)
  1. 實際工作中,總體均數難以得到時,應用樣本統計量代替總體參數,經校正後,樣本方差計算公式:S^2= ∑(X- 技術分享圖片 ) ^2 / (n-1),S^2為樣本方差,X為變量, 技術分享圖片 為樣本均值,n為樣本例數。
  • σ:標準差;(反應樣本數據分布的情況:σ 越小高斯分布越窄,樣本分布越集中;σ 越大高斯分布越寬,樣本分布越分散)
  • γ = 1 / (2σ2):γ 越大高斯分布越窄,樣本分布越集中;γ 越小高斯分布越寬,樣本分布越密集;

二、scikit-learn 中的 RBF 核

 1)格式

  • from sklearn.svm import SVC
    
    svc = SVC(kernel=rbf, gamma=1.0)

    # 直接設定參數 γ = 1.0;

 2)模擬數據集、導入繪圖函數、設計管道

  • 此處不做考察泛化能力,只查看對訓練數據集的分類的決策邊界,不需要進行 train_test_split;
  • 模擬數據集
    import numpy as np
    import matplotlib.pyplot as plt
    
    from sklearn import datasets
    
    X, y = datasets.make_moons(noise=0.15, random_state=666)
    
    plt.scatter(X[y
    ==0, 0], X[y==0, 1]) plt.scatter(X[y==1, 0], X[y==1, 1]) plt.show()

    技術分享圖片

  • 導入繪圖函數
    def plot_decision_boundary(model, axis):
        
        x0, x1 = np.meshgrid(
            np.linspace(axis[0], axis[1], int((axis[1]-axis[0])*100)).reshape(-1,1),
            np.linspace(axis[2], axis[3], int((axis[3]-axis[2])*100)).reshape(-1,1)
        )
        X_new 
    = np.c_[x0.ravel(), x1.ravel()] y_predict = model.predict(X_new) zz = y_predict.reshape(x0.shape) from matplotlib.colors import ListedColormap custom_cmap = ListedColormap([#EF9A9A,#FFF59D,#90CAF9]) plt.contourf(x0, x1, zz, linewidth=5, cmap=custom_cmap)

  • 設計管道
    from sklearn.preprocessing import StandardScaler
    from sklearn.svm import SVC
    from sklearn.pipeline import Pipeline
    
    def RBFKernelSVC(gamma=1.0):
        return Pipeline([
            (std_scaler, StandardScaler()),
            (svc, SVC(kernel=rbf, gamma=gamma))
        ])

 3)調整參數 γ,得到不同的決策邊界

  • γ == 0.1
    svc_gamma_01 = RBFKernelSVC(gamma=0.1)
    svc_gamma_01.fit(X, y)
    
    plot_decision_boundary(svc_gamma_01, axis=[-1.5, 2.5, -1.0, 1.5])
    plt.scatter(X[y==0, 0], X[y==0, 1])
    plt.scatter(X[y==1, 0], X[y==1, 1])
    plt.show()

    技術分享圖片

  • γ == 0.5

    svc_gamma_05 = RBFKernelSVC(gamma=0.5)
    svc_gamma_05.fit(X, y)
    
    plot_decision_boundary(svc_gamma_05, axis=[-1.5, 2.5, -1.0, 1.5])
    plt.scatter(X[y==0, 0], X[y==0, 1])
    plt.scatter(X[y==1, 0], X[y==1, 1])
    plt.show()

    技術分享圖片

  • γ == 1

    svc_gamma_1 = RBFKernelSVC(gamma=1.0)
    svc_gamma_1.fit(X, y)
    
    plot_decision_boundary(svc_gamma_1, axis=[-1.5, 2.5, -1.0, 1.5])
    plt.scatter(X[y==0, 0], X[y==0, 1])
    plt.scatter(X[y==1, 0], X[y==1, 1])
    plt.show()

    技術分享圖片

  • γ == 10

    svc_gamma_10 = RBFKernelSVC(gamma=10)
    svc_gamma_10.fit(X, y)
    
    plot_decision_boundary(svc_gamma_10, axis=[-1.5, 2.5, -1.0, 1.5])
    plt.scatter(X[y==0, 0], X[y==0, 1])
    plt.scatter(X[y==1, 0], X[y==1, 1])
    plt.show()

    技術分享圖片

  • γ == 100

    svc_gamma_100 = RBFKernelSVC(gamma=100)
    svc_gamma_100.fit(X, y)
    
    plot_decision_boundary(svc_gamma_100, axis=[-1.5, 2.5, -1.0, 1.5])
    plt.scatter(X[y==0, 0], X[y==0, 1])
    plt.scatter(X[y==1, 0], X[y==1, 1])
    plt.show()

    技術分享圖片

 4)分析

  • 隨著參數 γ 從小到大變化,模型經歷:欠擬合——優——欠擬合;
  • γ == 100 時:
  1. 現象:每一個藍色的樣本周圍都形成了一個“鐘形”的圖案,藍色的樣本點是“鐘形”圖案的頂部;
  2. 原因:γ 的取值過大,樣本分布形成的“鐘形”圖案比較窄,模型過擬合;
  3. 決策邊界幾何意義:只有在“鐘形”圖案內分布的樣本,才被判定為藍色類型;否則都判定為黃山類型;
  • γ == 10 時,γ 值減小,樣本分布規律的“鐘形”圖案變寬,不同樣本的“鐘形”圖案區域交叉一起,形成藍色類型的樣本的分布區域;
  • 超參數 γ 值越小模型復雜度越低,γ 值越大模型復雜度越高;

機器學習:SVM(scikit-learn 中的 RBF、RBF 中的超參數 γ)