經常用到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()
實驗結果: