SVM使用與引數優化

2021-08-03 17:38:44 字數 4434 閱讀 1778

對python語言有所了解的科研人員可能都知道scipy——乙個開源的基於python的科學計算工具包。基於scipy,目前開發者們針對不同的應用領域已經發展出了為數眾多的分支版本,它們被統一稱為scikits,即scipy工具包的意思。而在這些分支版本中,最有名,也是專門面向機器學習的乙個就是scikit-learn。

scikit-learn的基本功能主要被分為六大部分:分類,回歸,聚類,資料降維,模型選擇和資料預處理。

需要特別注意的是,這裡的特徵提取與上文在資料降維中提到的特徵選擇非常不同。特徵選擇是指通過去除不變、協變或其他統計上不重要的特徵量來改進機器學習的一種方法。

總結來說,scikit-learn實現了一整套用於資料降維,模型選擇,特徵提取和歸一化的完整演算法/模組,雖然缺少按步驟操作的參考教程,但scikit-learn針對每個演算法和模組都提供了豐富的參考樣例和詳細的說明文件。

如前所述,scikit-learn需要numpy和scipy等其他包的支援,因此在安裝scikit-learn之前需要提前安裝一些支援包. python、numpy、scipy

最後安裝scikit-learn

sudo pip install -u scikit-learn
具體的使用方法,可以搜尋 scikit user guidance,或者瀏覽

了解使用方法。

主要使用k-fold cross validation(記為k-cv)。

將原始資料分成k組(一般是均分),將每個子集資料分別做一次驗證集,其餘的k-1組子集資料作為訓練集,這樣會得到k個模型,用這k個模型最終的驗證集的分類準確率的平均數作為此k-cv下分類器的效能指標.k一般大於等於2,實際操作時一般從3開始取,只有在原始資料集合資料量小的時候才會嘗試取2.k-cv可以有效的避免過學習以及欠學習狀態的發生,最後得到的結果也比較具有說服性.

具體的介紹可瀏覽交叉驗證(crossvalidation):

該資料集的內容如下:

5.1,3.5,1.4,0.2,iris-setosa

4.9,3.0,1.4,0.2,iris-setosa

4.7,3.2,1.3,0.2,iris-setosa

4.6,3.1,1.5,0.2,iris-setosa

5.0,3.6,1.4,0.2,iris-setosa

5.4,3.9,1.7,0.4,iris-setosa

4.6,3.4,1.4,0.3,iris-setosa

5.0,3.4,1.5,0.2,iris-setosa

對於該資料集的描述,官網給出如下說明:

1. number of instances: 150 (50 in each of three classes)

2. number of attributes: 4 numeric, predictive attributes and the class

3. attribute information:

1. sepal length in cm

2. sepal width in cm

3. petal length in cm

4. petal width in cm

5. class:

-- iris setosa

-- iris versicolour

-- iris virginica

4. missing attribute values: none

summary statistics:

min max mean sd class correlation

sepal length: 4.3 7.9 5.84 0.83 0.7826

sepal width: 2.0 4.4 3.05 0.43 -0.4194

petal length: 1.0 6.9 3.76 1.76 0.9490 (high!)

petal width: 0.1 2.5 1.20 0.76 0.9565 (high!)

5. class distribution: 33.3% for each of 3 classes.

引數優化目前常用的方法是讓c和g在一定的範圍內取值,對於取定的c和g,把訓練集作為原始資料集利用k-cv方法得到在此對c和g組合下驗證集的分類準確率,最終取得訓練集驗證分類準確率最高的那組c和g作為最佳引數。對於可能會有多組的c和g對應著最高的驗證分類準備率的情況下,選取能夠達到最高驗證分類準確率中引數c最小的那對c和g作為最佳的引數,在取最小c的情況下,可能還會存在多組g,那麼就選取搜尋到的第一組c和g作為最佳引數。因為懲罰係數c值過大,會導致過於擬合的情況,模型泛化能力不好。

這種尋優思想可以用網格引數優化來實現。懲罰引數的變化範圍在[2^cmin,2^cmax],即在該範圍內尋找最佳的引數c,預設值為cmin=-8,cmax=8,。rbf中的g變化範圍也在[2^gmin,2^gmax],,預設值同樣為為gmin=-8,gmax=8。c,g分別構成橫軸和縱軸,cstep,gstep分別是進行網格引數須有時 c和g的步進太小,即c的取值為 2^cmin,2^(cmin+cstep),…,2^cmax ,同理g,預設步進取值為1,通過這種方法找到最佳的c和g組合。

import numpy as np

from sklearn.model_selection import train_test_split

from sklearn import svm

from sklearn.model_selection import cross_val_score

fr = open('iris.data')

lines = fr.readlines()

data =

target =

forline

inlines:

dt = line.strip('\n').split(',')

dt1 =

for i in dt[0:4]:

target_np = np.array(target)

data_np = np.array(data)

result =

for i in (-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5):

c = 2 ** i

for j in (-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5):

g = 2 ** j

rbf_svc = svm.svc(kernel='rbf', gamma=g, c=c).fit(data_np, target_np) # 高斯kernel

# rbf_svc = svm.linearsvc(c=c).fit(data_np, target_np)

scores = cross_val_score(rbf_svc, data_np, target_np, cv=10)

result1 = sorted(result, key=lambda x:x[2])

for i in result1:

print i

說明:

資料集的特徵數量為4,資料集的大小為150,因此,我採用了高斯kernel的svm,該模型適合特徵數量較小資料集大小適中的情況。

c和g我從2^-5 ~ 2^5 尋值,設定了預設的步進大小為1,通過該方法,我將得到的準確率進行了排序,以下是關鍵部分的情況(結果略大,忽略可以捨棄的部分):

[16, 0.125, 0.97333333333333338]

[32, 0.03125, 0.97333333333333338]

[32, 0.0625, 0.97333333333333338]

[0.5, 0.5, 0.98000000000000009]

[0.5, 1, 0.98000000000000009]

[1, 0.125, 0.98000000000000009]

[1, 0.25, 0.98000000000000009]

[1, 0.5, 0.98000000000000009]

[2, 0.0625, 0.98000000000000009]

[2, 0.125, 0.98000000000000009]

[2, 0.25, 0.98000000000000009]

[4, 0.03125, 0.98000000000000009]

[4, 0.0625, 0.98000000000000009]

[4, 0.125, 0.98000000000000009]

[8, 0.03125, 0.98000000000000009]

[8, 0.125, 0.98000000000000009]

[16, 0.0625, 0.98000000000000009]

該資料是最後的排序資料,可見c和g最優的值為0.5,0.5

SVM引數優化

匯入包 from sklearn.svm import svc from sklearn.model selection import gridsearchcv將svm的c值和gamma調參,c值範圍為2 5 2 5到215 21 5,gamma值範圍為2 15 2 15到2 3 23.lmh sv...

SVM引數介紹

svm模型有兩個非常重要的引數c與gamma。其中 c是懲罰係數,即對誤差的寬容度。c越高,說明越不能容忍出現誤差,容易過擬合。c越小,容易欠擬合。c過大或過小,泛化能力變差 gamma是選擇rbf函式作為kernel後,該函式自帶的乙個引數。隱含地決定了資料對映到新的特徵空間後的分布,gamma越...

SVM演算法的引數

1.c float引數,預設值為1.0 2.kernel str引數,預設為 rbf 演算法中提供的核函式型別,可選引數有 除了上面限定的核函式外,還可以給出自己定義的核函式,內部就是用自己定義的核函式來計算核矩陣。3.degree int型,預設為3 4.gamma float引數,預設為auto...