sklearn svm基本使用

2021-10-01 12:30:57 字數 3034 閱讀 6259

svm在解決分類問題具有良好的效果,出名的軟體包有libsvm(支援多種核函式),liblinear。此外python機器學習庫scikit-learn也有svm相關演算法,sklearn.svm.svc

sklearn.svm.linearsvc

分別由libsvm和liblinear發展而來。

推薦使用svm的步驟為:

將原始資料轉化為svm演算法軟體或包所能識別的資料格式;

將資料標準化;(防止樣本中不同特徵數值大小相差較大影響分類器效能)

不知使用什麼核函式,考慮使用rbf;

利用交叉驗證網格搜尋尋找最優引數(c, γ);(交叉驗證防止過擬合,網格搜尋在指定範圍內尋找最優引數)

使用最優引數來訓練模型;

測試。下面利用scikit-learn說明上述步驟:

1 import numpy as np

2 from sklearn.svm import svc

3 from sklearn.preprocessing import standardscaler

4 from sklearn.model_selection import gridsearchcv, train_test_split

5 6 def load_data(filename)

7 '''

8 假設這是鳶尾花資料,csv資料格式為:

9 0,5.1,3.5,1.4,0.2

10 0,5.5,3.6,1.3,0.5

11 1,2.5,3.4,1.0,0.5

12 1,2.8,3.2,1.1,0.2

13 每一行資料第乙個數字(0,1...)是標籤,也即資料的類別。

14 '''

15 data = np.genfromtxt(filename, delimiter=',')

16 x = data[:, 1:] # 資料特徵

17 y = data[:, 0].astype(int) # 標籤

18 scaler = standardscaler()

19 x_std = scaler.fit_transform(x) # 標準化

20 # 將資料劃分為訓練集和測試集,test_size=.3表示30%的測試集

21 x_train, x_test, y_train, y_test = train_test_split(x_std, y, test_size=.3)

22 return x_train, x_test, y_train, y_test

23 24

25 def svm_c(x_train, x_test, y_train, y_test):

26 # rbf核函式,設定資料權重

27 svc = svc(kernel='rbf', class_weight='balanced',)

28 c_range = np.logspace(-5, 15, 11, base=2)

29 gamma_range = np.logspace(-9, 3, 13, base=2)

30 # 網格搜尋交叉驗證的引數範圍,cv=3,3折交叉

31 param_grid =

32 grid = gridsearchcv(svc, param_grid, cv=3, n_jobs=-1)

33 # 訓練模型

34 clf = grid.fit(x_train, y_train)

35 # 計算測試集精度

36 score = grid.score(x_test, y_test)

37 print('精度為%s' % score)

38 39 if __name__ == '__main__':

40   svm_c(*load_data('example.csv'))

網格搜尋法中尋找最優引數中為尋找最優引數,網格大小如果設定範圍大且步長密集的話難免耗時,但是不這樣的話又可能找到的引數不是很好,針對這解決方法是,先在大範圍,大步長的粗糙網格內尋找引數。在找到的引數左右在設定精細步長找尋最優引數比如:

一開始尋找範圍是 c = 2−5 , 2 −3 , . . . , 2 15 and γ = 2−15 , 2 −13 , . . . , 2 3 .由此找到的最優引數是(23 , 2 −5 );

然後設定更小一點的步長,引數範圍變為21 , 2 1.25 , . . . , 2 5 and γ = 2−7 , 2 −6.75 , . . . , 2−3  在這個引數範圍再尋找最優引數。

這樣既可以避免一開始就使用大範圍,小步長而導致分類器進行過於多的計算而導致計算時間的增加。

如果訓練樣本的特徵數量過於巨大,也許就不需要通過rbf等非線性核函式將其對映到更高的維度空間上,利用非線性核函式也並不能提高分類器的效能。利用linear核函式也可以獲得足夠好的結果,此外,也只需尋找乙個合適引數c,但是利用rbf核函式取得與線性核函式一樣的效果的話需要尋找兩個合適引數(c, γ)。

分三種情況討論:

樣本數量遠小於特徵數量:這種情況,利用情況利用linear核效果會高於rbf核。

樣本數量和特徵數量一樣大:線性核合適,且速度也更快。liblinear更適合

樣本數量遠大於特徵數量: 非線性核rbf等合適。

本文主要參考這篇a practical guide to support vector classification

libsvm:a library for support vector machines

liblinear : a library for large linear classification

sklearn : scikit-learn machine learning in python

其它文章:

python直接執行目錄或者zip檔案

oracle基本使用

ocm oracle 大師認證 ocp oracle 專家認證 oca oracle 初級認證 認證 1千 1.oracle啟動 電腦 管理 服務 oracleorahome90tnslistener oracleservice 你要開啟的資料庫 2.oracle使用者 syssystem scot...

Git基本使用

設定使用者名稱與郵箱 git config global user.name my name git config global user.email my email.com 從已有的git庫中提取 每次更改 的操作 更新本地 到最新版本 需要merge才能合到本地 中 git fetch 合併更...

PyMongo基本使用

引用pymongo import pymongo 建立連線connection import pymongo conn pymongo.connection localhost 27017 或import conn connection localhost 27017 建立connection時,指...