文章用于總結(jié)對sklearn支持向量機(jī)模塊的使用醋旦,系統(tǒng)回顧作者近期的相關(guān)學(xué)習(xí),部分內(nèi)容來源網(wǎng)站(侵權(quán)聯(lián)系必刪)昭伸。
第一部分 SVM用途及優(yōu)缺點(diǎn)
1. 主要用途:
classification(分類)、regression(回歸)、outliers detection(異常檢測)
2. 優(yōu)缺點(diǎn):
支持向量機(jī)的優(yōu)勢在于:
- 在高維空間中非常高效.
- 即使在數(shù)據(jù)維度比樣本數(shù)量大的情況下仍然有效.
- 在決策函數(shù)(稱為支持向量)中使用訓(xùn)練集的子集,因此它也是高效利用內(nèi)存的.
- 通用性: 不同的核函數(shù)與特定的決策函數(shù)一一對應(yīng).常見的內(nèi)核已經(jīng)提供,也可以指定定制的內(nèi)核.
支持向量機(jī)的缺點(diǎn)包括:
- 如果特征數(shù)量比樣本數(shù)量大得多,在選擇核函數(shù)時要避免過擬合,而且正則化項是非常重要的.
- 支持向量機(jī)不直接提供概率估計,這些都是使用昂貴的五次交叉驗算計算的.
3. 原理及公式推導(dǎo)
由于知乎及CSDN中關(guān)于SVM的介紹太多斋配,此處不再累贅,附上一篇作者看到的相對比較詳細(xì)的文章 SVM
第二部分 SVM 針對不同問題的具體用法
(一). 分類問題
sklearn提供了三種基于svm的分類方法:
- sklearn.svm.NuSVC()
- sklearn.svm.LinearSVC()
- sklearn.svm.SVC()
1. sklearn.svm.SVC()
全稱是C-Support Vector Classification灌闺,是一種基于libsvm的支持向量機(jī)艰争,由于其時間復(fù)雜度為O(n^2),所以當(dāng)樣本數(shù)量超過兩萬時難以實現(xiàn)桂对。
- 官方源碼:
sklearn.svm.SVC(C=1.0, kernel='rbf', degree=3, gamma='auto', coef0=0.0, shrinking=True,
probability=False, tol=0.001, cache_size=200, class_weight=None,
verbose=False, max_iter=-1, decision_function_shape='ovr',
random_state=None)
- 相關(guān)參數(shù):
-
C (float參數(shù) 默認(rèn)值為1.0)
表示錯誤項的懲罰系數(shù)C越大甩卓,即對分錯樣本的懲罰程度越大,因此在訓(xùn)練樣本中準(zhǔn)確率越高蕉斜,但是泛化能力降低逾柿;相反,減小C的話宅此,容許訓(xùn)練樣本中有一些誤分類錯誤樣本机错,泛化能力強(qiáng)。對于訓(xùn)練樣本帶有噪聲的情況父腕,一般采用后者弱匪,把訓(xùn)練樣本集中錯誤分類的樣本作為噪聲。 -
kernel (str參數(shù) 默認(rèn)為‘rbf’)
該參數(shù)用于選擇模型所使用的核函數(shù)璧亮,算法中常用的核函數(shù)有:
-- linear:線性核函數(shù)
-- poly:多項式核函數(shù)
--rbf:徑像核函數(shù)/高斯核
--sigmod:sigmod核函數(shù)
--precomputed:核矩陣萧诫,該矩陣表示自己事先計算好的斥难,輸入后算法內(nèi)部將使用你提供的矩陣進(jìn)行計算 -
degree (int型參數(shù) 默認(rèn)為3)
該參數(shù)只對'kernel=poly'(多項式核函數(shù))有用,是指多項式核函數(shù)的階數(shù)n财搁,如果給的核函數(shù)參數(shù)是其他核函數(shù)蘸炸,則會自動忽略該參數(shù)。 -
gamma (float參數(shù) 默認(rèn)為auto)
該參數(shù)為核函數(shù)系數(shù)尖奔,只對‘rbf’,‘poly’,‘sigmod’有效搭儒。如果gamma設(shè)置為auto,代表其值為樣本特征數(shù)的倒數(shù)提茁,即1/n_features淹禾,也有其他值可設(shè)定。 -
coef0:(float參數(shù) 默認(rèn)為0.0)
該參數(shù)表示核函數(shù)中的獨(dú)立項茴扁,只有對‘poly’和‘sigmod’核函數(shù)有用铃岔,是指其中的參數(shù)c。 -
probability( bool參數(shù) 默認(rèn)為False)
該參數(shù)表示是否啟用概率估計峭火。 這必須在調(diào)用fit()之前啟用毁习,并且會使fit()方法速度變慢。 -
shrinkintol: float參數(shù) 默認(rèn)為1e^-3g(bool參數(shù) 默認(rèn)為True)
該參數(shù)表示是否選用啟發(fā)式收縮方式卖丸。 -
tol( float參數(shù) 默認(rèn)為1e^-3)
svm停止訓(xùn)練的誤差精度纺且,也即閾值。 -
cache_size(float參數(shù) 默認(rèn)為200)
該參數(shù)表示指定訓(xùn)練所需要的內(nèi)存稍浆,以MB為單位载碌,默認(rèn)為200MB。 -
class_weight(字典類型或者‘balance’字符串衅枫。默認(rèn)為None)
該參數(shù)表示給每個類別分別設(shè)置不同的懲罰參數(shù)C嫁艇,如果沒有給,則會給所有類別都給C=1弦撩,即前面參數(shù)指出的參數(shù)C步咪。如果給定參數(shù)‘balance’,則使用y的值自動調(diào)整與輸入數(shù)據(jù)中的類頻率成反比的權(quán)重益楼。 -
verbose ( bool參數(shù) 默認(rèn)為False)
該參數(shù)表示是否啟用詳細(xì)輸出歧斟。此設(shè)置利用libsvm中的每個進(jìn)程運(yùn)行時設(shè)置,如果啟用偏形,可能無法在多線程上下文中正常工作静袖。一般情況都設(shè)為False,不用管它俊扭。 -
max_iter (int參數(shù) 默認(rèn)為-1)
該參數(shù)表示最大迭代次數(shù)队橙,如果設(shè)置為-1則表示不受限制。 -
random_state(int,RandomState instance 捐康,None 默認(rèn)為None)
該參數(shù)表示在混洗數(shù)據(jù)時所使用的偽隨機(jī)數(shù)發(fā)生器的種子仇矾,如果選int,則為隨機(jī)數(shù)生成器種子解总;如果選RandomState instance贮匕,則為隨機(jī)數(shù)生成器;如果選None,則隨機(jī)數(shù)生成器使用的是np.random花枫。
- 方法
- svc.decision_function(X)
樣本X到分離超平面的距離 - svc.fit(X, y[, sample_weight])
根據(jù)給定的訓(xùn)練數(shù)據(jù)擬合SVM模型刻盐。 - svc.get_params([deep])
獲取此估算器的參數(shù)并以字典行書儲存,默認(rèn)deep=True,以分類iris數(shù)據(jù)集為例劳翰,得到的參數(shù)如下
{'C': 1.0, 'cache_size': 200, 'class_weight': None, 'coef0': 0.0,
'decision_function_shape': 'ovr', 'degree': 3, 'gamma': 'auto', 'kernel': 'rbf',
'max_iter': -1, 'probability': False, 'random_state': None, 'shrinking': True,
'tol': 0.001, 'verbose': False}
- svc.predict(X)
根據(jù)測試數(shù)據(jù)集進(jìn)行預(yù)測 - svc.score(X, y[, sample_weight])
返回給定測試數(shù)據(jù)和標(biāo)簽的平均精確度 - svc.predict_log_proba(X_test)敦锌,svc.predict_proba(X_test)
當(dāng)sklearn.svm.SVC(probability=True)時,才會有這兩個值佳簸,分別得到樣本的對數(shù)概率以及普通概率乙墙。
- 應(yīng)用實例(以iris分類為例)
- 官方示例
>>> import numpy as np
>>> X = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]])
>>> y = np.array([1, 1, 2, 2])
>>> from sklearn.svm import SVC
>>> clf = SVC()
>>> clf.fit(X, y)
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
decision_function_shape='ovr', degree=3, gamma='auto', kernel='rbf',
max_iter=-1, probability=False, random_state=None, shrinking=True,
tol=0.001, verbose=False) #可以根據(jù)前面介紹的參數(shù),做出相應(yīng)改變觀察結(jié)果變化
>>> print(clf.predict([[-0.8, -1]]))
[1]
- iris數(shù)據(jù)集的分類(目前沒整一些其他的數(shù)據(jù)集生均,后期會更新下)
from sklearn import svm
from sklearn import datasets
from sklearn.model_selection import train_test_split as ts
#import our data
iris = datasets.load_iris()
X = iris.data
y = iris.target
#split the data to 7:3
X_train,X_test,y_train,y_test = ts(X,y,test_size=0.3)
# select different type of kernel function and compare the score
# kernel = 'rbf'
clf_rbf = svm.SVC(kernel='rbf')
clf_rbf.fit(X_train,y_train)
score_rbf = clf_rbf.score(X_test,y_test)
print("The score of rbf is : %f"%score_rbf)
# kernel = 'linear'
clf_linear = svm.SVC(kernel='linear')
clf_linear.fit(X_train,y_train)
score_linear = clf_linear.score(X_test,y_test)
print("The score of linear is : %f"%score_linear)
# kernel = 'poly'
clf_poly = svm.SVC(kernel='poly')
clf_poly.fit(X_train,y_train)
score_poly = clf_poly.score(X_test,y_test)
print("The score of poly is : %f"%score_poly)
Results:
The score of rbf is : 0.955556
The score of linear is : 0.977778
The score of poly is : 0.911111
附上一個官方文檔中進(jìn)行手寫數(shù)字識別 的示例Examples
至此听想,svm的一些基本信息以及svc分類器的介紹已經(jīng)完成,后續(xù)補(bǔ)上基于svc的更多實例马胧。
下一篇將介紹SVM的另一個分類器--NuSVC