1. 程式人生 > >SVM→8.SVM實戰→3.調節SVM參數

SVM→8.SVM實戰→3.調節SVM參數

復雜 flatten 標簽 decision display autumn 技術分享 分享圖片 每次

《SVM→8.SVM實戰→3.調節SVM參數》

描述代碼
  1. 導入模塊
1
2
3
4
from sklearn.datasets.samples_generator
import make_blobs import matplotlib.pyplot as plt from sklearn.svm import SVC # "Support vector classifier" import numpy as np
  1. 生成數據集
    1. 使用make_blobs函數生成用於聚類的數據,主要參數有:
      1. n_samples:樣本個數
      2. centers:樣本中心(類別)數
      3. random_state:隨機種子(被指定後,每次構造數據相同)
      4. cluster_std:數據離散程度
      5. n_features:特征數,默認是2
    2. 返回值有樣本數據集X和標簽y,且都是ndarray對象
1
2
3
4
In[3
]: type(make_blobs) Out[3]: function In[4]: X, y = make_blobs(n_samples=50, centers=2,random_state=0, cluster_std=0.80) In[5]: plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap=‘autumn‘)
技術分享圖片
  1. 模型選擇及超參數調優
    1. 使用svm.SVC(C=1.0, kernel=’rbf’)來創建一個SVC對象,選擇核為linear及不同的C技術分享圖片
    2. 當C值特別大時,相當於技術分享圖片=0,此時為硬間隔最大化;當C值很小時,此時為軟間隔最大化,軟間隔的支持向量或者在間隔邊界上,或者在間隔邊界與分離超平面之間, 或者在分離超平面誤分一側。

1
2
3
4
5
6
7
_,axi = plt.subplots(1,2)

for axi, C in zip(axi, [10.0, 0.1]):
    model = SVC(kernel=‘linear‘, C=C).fit(X, y)
    axi.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap=‘autumn‘)
    plot_svc_decision_function(model, axi)
    axi.set_title(‘C = {0:.1f}.format(C), size=14)
plot_svc_decision_function參考見擴展
  1. 繪制圖形
    1. 使用svm.SVC(C=1.0, kernel=’rbf’)來創建一個SVC對象,選擇核為rbf及不同的gamma 技術分享圖片
    2. gamma越大,擬合的曲線就越復雜。
1
2
3
4
5
6
7
_,axi = plt.subplots(1,2)

for axi, gamma,C in zip(axi, [10.0, 0.1],[1,1]):
    model = SVC(kernel=‘rbf‘, gamma=gamma,C=C).fit(X, y)
    axi.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap=‘autumn‘)
    plot_svc_decision_function(model, axi)
    axi.set_title(‘gamma = {0:.1f}.format(gamma), size=14)





Show 拓展參考見SVM→8.SVM實戰→1.訓練一個基本的SVM
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
def plot_svc_decision_function(model, ax=None, plot_support=True):
    """Plot the decision function for a 2D SVC"""
    if ax is None:
        ax = plt.subplot(111)
    xlim = ax.get_xlim()
    ylim = ax.get_ylim()

    # create grid to evaluate model
    x = np.linspace(xlim[0], xlim[1], 30)
    y = np.linspace(ylim[0], ylim[1], 30)
    X,Y = np.meshgrid(x, y)
    xy = np.vstack([X.flatten(), Y.flatten()]).T
    P = model.decision_function(xy).reshape(X.shape)

    # plot decision boundary and margins
    #levels是 alpha是透明度 linestyles
    ax.contour(X, Y, P, colors=‘k‘,
               levels=[-1, 0, 1], alpha=0.5,
               linestyles=[‘--‘, ‘-‘, ‘--‘])

    # plot support vectors
    if plot_support:
        ax.scatter(model.support_vectors_[:, 0],
                   model.support_vectors_[:, 1],
                   s=500,c=‘‘,edgecolors=‘black‘)

SVM→8.SVM實戰→3.調節SVM參數