【ML-9-5】SVM的sklearn.svm.SVC()函數應用


經常用到sklearn中的SVC函數,這里把文檔中的參數:

本身這個函數也是基於libsvm實現的,所以在參數設置上有很多相似的地方。(PS: libsvm中的二次規划問題的解決算法是SMO)。

sklearn.svm.SVC(C=1.0, kernel='rbf', degree=3, gamma='auto', coef0=0.0, shrinking=True, probability=False,

Tol=0.001, cache_size200, class_weight=None, verbose=False,  max_iter=-1, 

decision_function_shape=None,random_state=None)

參數:

1、C:C-SVC的懲罰參數C默認值是1.0,C越大,相當於懲罰松弛變量,希望松弛變量接近0,即對誤分類的懲罰增大,趨向於對訓練集全分對的情況,這樣對訓練集測試時准確率很高,但泛化能力弱。C值小,對誤分類的懲罰減小,允許容錯,將他們當成噪聲點,泛化能力較強。

C一般可以選擇為:0.0001 到10000,選擇的越大,表示對錯誤例懲罰程度越大,可能會導致模型過擬合

2、kernel :核函數,默認是rbf,可以是'linear', 'poly', 'rbf', 'sigmoid', 'precomputed' 

    0 – 線性:u'v

    1 – 多項式:(gamma*u'*v + coef0)^degree

    2 – RBF函數:exp(-gamma|u-v|^2)

    3 –sigmoid:tanh(gamma*u'*v + coef0)

數學表達式:

3、degree :多項式poly函數的維度,默認是3,選擇其他核函數時會被忽略。建議設置為2;

4、gamma :'rbf','poly'和'sigmoid'的核系數。當前默認值為'auto',它使用1 / n_features,如果gamma='scale'傳遞,則使用1 /(n_features * X.std())作為gamma的值。當前默認的gamma''auto'將在版本0.22中更改為'scale'。

5、 coef0 :核函數的常數項。對於'poly'和 'sigmoid'有用。

6、probability :默認False。是否啟用概率估計。必須在調用fit之前啟用它,並且會減慢該方法的速度。

7、shrinking :默認為true,是否采用shrinking heuristic(收縮啟發式)方法

8、 tol :默認為1e-3,停止訓練的誤差值大小,

9、cache_size :默認為200,核函數cache緩存大小

10、 class_weight :{dict,'balanced'}。將類i的參數C設置為SVC的class_weight [i] * C. 如果沒有給出,所有類都應該有一個權重。"平衡"模式使用y的值自動調整與輸入數據中的類頻率成反比的權重n_samples / (n_classes * np.bincount(y))

11、verbose :默認False。啟用詳細輸出。請注意,此設置利用libsvm中的每進程運行時設置,如果啟用,則可能無法在多線程上下文中正常運行。

12、max_iter :最大迭代次數。-1為無限制。

13、decision_function_shape :'ovo', 'ovr' or None, default=None3

14、random_state :默認 無。偽隨機數生成器的種子在對數據進行混洗以用於概率估計時使用。如果是int,則random_state是隨機數生成器使用的種子; 如果是RandomState實例,則random_state是隨機數生成器; 如果沒有,隨機數生成器所使用的RandomState實例np.random。

主要調節的參數有:C、kernel、degree、gamma、coef0。

   

與核函數相對應的libsvm參數建議:

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以及r:gamma一般可選1 2 3 4,coef0選0.2 0.4 0.60.8 1

屬性:

support_ :支持向量索引。

support_vectors_ :支持向量。

n_support_ :每一類的支持向量數目

dual_coef_ :決策函數中支持向量的系數

coef_ :賦予特征的權重(原始問題中的系數)。這僅適用於線性內核。

intercept_ :決策函數中的常量。

  

---實驗練習

對身高體重的數據進行svm分類,要求分別使用線性函數、三次多項式函數、徑向基函數和Sigmoid函數作為核函數進行模型訓練,並觀察分類效果(利用plt繪制樣本點,胖的樣本點與瘦的樣本點用顏色區分,結果繪制出分類曲線):

   

代碼:

   
%matplotlib inline  
import numpy as np  
import scipy as sp  
from sklearn import svm
from sklearn.model_selection import train_test_split
# 注意: 如果sklearn是0.18之前的版本,則執行下面的語句:
# from sklearn.cross_validation import train_test_split  
import matplotlib.pyplot as plt  
#導入數據
data   = []  
labels = []  
# 讀取身高體重數據集
with open("./Input/data.txt") as ifile:  
        for line in ifile:  
            tokens = line.strip().split(' ')  
            # data列表存儲身高體重數據
            data.append([float(tk) for tk in tokens[:-1]]) 
            # label列表存儲此人被定義為胖還是瘦
            labels.append(tokens[-1])  
# x: 以array形式存儲身高體重構成的坐標
x = np.array(data)  
# labels: 將label列表array化
labels = np.array(labels)  
y = np.zeros(labels.shape) 
# y:存儲0,1化的體重標簽,值為0說明此人被定義為瘦,值為1說明此人定義為胖
y[labels=='fat']=1  
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.0)  
# 建立畫布(可以不用關心具體的實現過程)
h = .02    
x_min, x_max = x_train[:, 0].min() - 0.1, x_train[:, 0].max() + 0.1  
y_min, y_max = x_train[:, 1].min() - 1, x_train[:, 1].max() + 1  
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),  
                     np.arange(y_min, y_max, h))  
# 繪圖名稱
titles = ['LinearSVC (linear kernel)',  
          'SVC with polynomial kernel',  
          'SVC with RBF kernel',  
          'SVC with Sigmoid kernel'] 

'''
svm.SVC(kernel='linear'):核函數為線性函數
svm.SVC(kernel='poly', degree=3):核函數為3次多項式函數,如果degree=n,則使用的核函數是n次多項式函數
svm.SVC():核函數為徑向基函數
svm.SVC(kernel='sigmoid'):核函數為Sigmoid函數
'''
#以下是參數的重點部分:
# 核函數為線性函數
clf_linear  = svm.SVC(kernel='linear',C=50).fit(x, y)
# 核函數為多項式函數
clf_poly    = svm.SVC(kernel='poly', degree=2,coef0=10).fit(x, y)   
# 核函數為徑向基函數
clf_rbf     = svm.SVC(kernel='rbf',C=100,gamma=0.5).fit(x, y)  
# 核函數為Sigmoid函數
clf_sigmoid = svm.SVC(kernel='sigmoid',C=1000000,gamma=0.0001,coef0=-1.5).fit(x, y)  

for i, clf in enumerate((clf_linear, clf_poly, clf_rbf, clf_sigmoid)):  
    answer = clf.predict(np.c_[xx.ravel(), yy.ravel()]) 
    plt.subplot(2, 2, i + 1)  
    plt.subplots_adjust(wspace=0.4, hspace=0.4)      
    # 將數據點繪制在坐標圖上  
    z = answer.reshape(xx.shape)  
    plt.contourf(xx, yy, z, cmap=plt.cm.Paired, alpha=0.8)  
  
    plt.scatter(x_train[:, 0], x_train[:, 1], c=y_train, cmap=plt.cm.Paired)  
    plt.xlabel('Height(m)')  
    plt.ylabel('Weight(kg)')  
    plt.xlim(xx.min(), xx.max())  
    plt.ylim(yy.min(), yy.max())  
    plt.xticks(())  
    plt.yticks(())  
    plt.title(titles[i])  
plt.show()  

實驗結果:

   

   

   

   

   

   

   

   

   

   

   

   

   

   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM