1. 程式人生 > >自學機器學習之sklearn實現支援向量機

自學機器學習之sklearn實現支援向量機

對於支援向量機,我看了好久也沒能看的很明白,裡面的理論有點多。所以呢,只能用sklearn來跑跑svm模型了。。

下面是程式碼:(svm支援多類別分類,所以這次還使用iris的資料)

from sklearn import  svm

from sklearn.datasets import  load_iris

from sklearn.model_selection import train_test_split

datas = load_iris()
# print(datas)
data_x = datas.data
data_y = datas.target
# print(data_x)
#print(data_y) x_train,x_test,y_train,y_test = train_test_split(data_x,data_y,test_size=0.3) clf = svm.SVC()#預設核函式是高斯核 # print(clf) clf = clf.fit(x_train,y_train) print(clf.predict(x_test)) print(y_test)

這裡寫圖片描述

對於svm.SVC引數的設定:

sklearn中的SVC函式是基於libsvm實現的,所以在引數設定上有很多相似的地方。(PS: libsvm中的二次規劃問題的解決演算法是SMO)。
對於SVC函式的引數解釋如下:(主要參考的sklearn 文件)
C: float引數 預設值為1.0
錯誤項的懲罰係數。C越大,即對分錯樣本的懲罰程度越大,因此在訓練樣本中準確率越高,但是泛化能力降低,也就是對測試資料的分類準確率降低。相反,減小C的話,容許訓練樣本中有一些誤分類錯誤樣本,泛化能力強。對於訓練樣本帶有噪聲的情況,一般採用後者,把訓練樣本集中錯誤分類的樣本作為噪聲。

kernel: str引數 預設為‘rbf’
演算法中採用的核函式型別,可選引數有:
‘linear’:線性核函式
‘poly’:多項式核函式
‘rbf’:徑像核函式/高斯核
‘sigmod’:sigmod核函式
‘precomputed’:核矩陣
precomputed表示自己提前計算好核函式矩陣,這時候演算法內部就不再用核函式去計算核矩陣,而是直接用你給的核矩陣。核矩陣為如下形式:

還有一點需要說明,除了上面限定的核函式外,還可以給出自己定義的核函式,其實內部就是用你自己定義的核函式來計算核矩陣。

degree: int型引數 預設為3
這個引數只對多項式核函式有用,是指多項式核函式的階數n
如果給的核函式引數是其他核函式,則會自動忽略該引數。

gamma: float引數 預設為auto
核函式係數,只對‘rbf’,‘poly’,‘sigmod’有效。
如果gamma為auto,代表其值為樣本特徵數的倒數,即1/n_features.

coef0: float引數 預設為0.0
核函式中的獨立項,只有對‘poly’和‘sigmod’核函式有用,是指其中的引數c

probability: bool引數 預設為False
是否啟用概率估計。 這必須在呼叫fit()之前啟用,並且會fit()方法速度變慢。

shrinking: bool引數 預設為True
是否採用啟發式收縮方式

tol: float引數 預設為1e^-3
svm停止訓練的誤差精度
cache_size: float引數 預設為200
指定訓練所需要的記憶體,以MB為單位,預設為200MB。
class_weight: 字典型別或者‘balance’字串。預設為None
給每個類別分別設定不同的懲罰引數C,如果沒有給,則會給所有類別都給C=1,即前面引數指出的引數C.
如果給定引數‘balance’,則使用y的值自動調整與輸入資料中的類頻率成反比的權重。
verbose : bool引數 預設為False
是否啟用詳細輸出。 此設定利用libsvm中的每個程序執行時設定,如果啟用,可能無法在多執行緒上下文中正常工作。一般情況都設為False,不用管它。
max_iter : int引數 預設為-1
最大迭代次數,如果為-1,表示不限制
random_state: int型引數 預設為None
偽隨機數發生器的種子,在混洗資料時用於概率估計。
★fit() 方法:用於訓練SVM,具體引數已經在定義SVC物件的時候給出了,這時候只需要給出資料集X和X對應的標籤y即可。
★predict() 方法: 基於以上的訓練,對預測樣本T進行類別預測,因此只需要接收一個測試集T,該函式返回一個數組表示個測試樣本的類別。