文章用于總結(jié)對(duì)sklearn支持向量機(jī)模塊的使用,系統(tǒng)回顧作者近期的相關(guān)學(xué)習(xí),部分內(nèi)容來(lái)源網(wǎng)站(侵權(quán)聯(lián)系必刪)。
第一部分 SVM用途及優(yōu)缺點(diǎn)
1. 主要用途:
classification(分類(lèi))、regression(回歸)、outliers detection(異常檢測(cè))
2. 優(yōu)缺點(diǎn):
支持向量機(jī)的優(yōu)勢(shì)在于:
- 在高維空間中非常高效.
- 即使在數(shù)據(jù)維度比樣本數(shù)量大的情況下仍然有效.
- 在決策函數(shù)(稱(chēng)為支持向量)中使用訓(xùn)練集的子集,因此它也是高效利用內(nèi)存的.
- 通用性: 不同的核函數(shù)與特定的決策函數(shù)一一對(duì)應(yīng).常見(jiàn)的內(nèi)核已經(jīng)提供,也可以指定定制的內(nèi)核.
支持向量機(jī)的缺點(diǎn)包括:
- 如果特征數(shù)量比樣本數(shù)量大得多,在選擇核函數(shù)時(shí)要避免過(guò)擬合,而且正則化項(xiàng)是非常重要的.
- 支持向量機(jī)不直接提供概率估計(jì),這些都是使用昂貴的五次交叉驗(yàn)算計(jì)算的.
3. 原理及公式推導(dǎo)
由于知乎及CSDN中關(guān)于SVM的介紹太多,此處不再累贅,附上一篇作者看到的相對(duì)比較詳細(xì)的文章 SVM
第二部分 SVM 針對(duì)不同問(wèn)題的具體用法
(一). 分類(lèi)問(wèn)題
sklearn提供了三種基于svm的分類(lèi)方法:
- sklearn.svm.NuSVC()
- sklearn.svm.LinearSVC()
- sklearn.svm.SVC()
1. sklearn.svm.SVC()
全稱(chēng)是C-Support Vector Classification,是一種基于libsvm的支持向量機(jī),由于其時(shí)間復(fù)雜度為O(n^2),所以當(dāng)樣本數(shù)量超過(guò)兩萬(wàn)時(shí)難以實(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)
表示錯(cuò)誤項(xiàng)的懲罰系數(shù)C越大,即對(duì)分錯(cuò)樣本的懲罰程度越大,因此在訓(xùn)練樣本中準(zhǔn)確率越高,但是泛化能力降低;相反,減小C的話,容許訓(xùn)練樣本中有一些誤分類(lèi)錯(cuò)誤樣本,泛化能力強(qiáng)。對(duì)于訓(xùn)練樣本帶有噪聲的情況,一般采用后者,把訓(xùn)練樣本集中錯(cuò)誤分類(lèi)的樣本作為噪聲。 -
kernel (str參數(shù) 默認(rèn)為‘rbf’)
該參數(shù)用于選擇模型所使用的核函數(shù),算法中常用的核函數(shù)有:
-- linear:線性核函數(shù)
-- poly:多項(xiàng)式核函數(shù)
--rbf:徑像核函數(shù)/高斯核
--sigmod:sigmod核函數(shù)
--precomputed:核矩陣,該矩陣表示自己事先計(jì)算好的,輸入后算法內(nèi)部將使用你提供的矩陣進(jìn)行計(jì)算 -
degree (int型參數(shù) 默認(rèn)為3)
該參數(shù)只對(duì)'kernel=poly'(多項(xiàng)式核函數(shù))有用,是指多項(xiàng)式核函數(shù)的階數(shù)n,如果給的核函數(shù)參數(shù)是其他核函數(shù),則會(huì)自動(dòng)忽略該參數(shù)。 -
gamma (float參數(shù) 默認(rèn)為auto)
該參數(shù)為核函數(shù)系數(shù),只對(duì)‘rbf’,‘poly’,‘sigmod’有效。如果gamma設(shè)置為auto,代表其值為樣本特征數(shù)的倒數(shù),即1/n_features,也有其他值可設(shè)定。 -
coef0:(float參數(shù) 默認(rèn)為0.0)
該參數(shù)表示核函數(shù)中的獨(dú)立項(xiàng),只有對(duì)‘poly’和‘sigmod’核函數(shù)有用,是指其中的參數(shù)c。 -
probability( bool參數(shù) 默認(rèn)為False)
該參數(shù)表示是否啟用概率估計(jì)。 這必須在調(diào)用fit()之前啟用,并且會(huì)使fit()方法速度變慢。 -
shrinkintol: float參數(shù) 默認(rèn)為1e^-3g(bool參數(shù) 默認(rèn)為T(mén)rue)
該參數(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(字典類(lèi)型或者‘balance’字符串。默認(rèn)為None)
該參數(shù)表示給每個(gè)類(lèi)別分別設(shè)置不同的懲罰參數(shù)C,如果沒(méi)有給,則會(huì)給所有類(lèi)別都給C=1,即前面參數(shù)指出的參數(shù)C。如果給定參數(shù)‘balance’,則使用y的值自動(dòng)調(diào)整與輸入數(shù)據(jù)中的類(lèi)頻率成反比的權(quán)重。 -
verbose ( bool參數(shù) 默認(rèn)為False)
該參數(shù)表示是否啟用詳細(xì)輸出。此設(shè)置利用libsvm中的每個(gè)進(jìn)程運(yùn)行時(shí)設(shè)置,如果啟用,可能無(wú)法在多線程上下文中正常工作。一般情況都設(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ù)時(shí)所使用的偽隨機(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ù)并以字典行書(shū)儲(chǔ)存,默認(rèn)deep=True,以分類(lèi)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ù)測(cè)試數(shù)據(jù)集進(jìn)行預(yù)測(cè) - svc.score(X, y[, sample_weight])
返回給定測(cè)試數(shù)據(jù)和標(biāo)簽的平均精確度 - svc.predict_log_proba(X_test),svc.predict_proba(X_test)
當(dāng)sklearn.svm.SVC(probability=True)時(shí),才會(huì)有這兩個(gè)值,分別得到樣本的對(duì)數(shù)概率以及普通概率。
- 應(yīng)用實(shí)例(以iris分類(lèi)為例)
- 官方示例
>>> 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ù)集的分類(lèi)(目前沒(méi)整一些其他的數(shù)據(jù)集,后期會(huì)更新下)
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
附上一個(gè)官方文檔中進(jìn)行手寫(xiě)數(shù)字識(shí)別 的示例Examples
至此,svm的一些基本信息以及svc分類(lèi)器的介紹已經(jīng)完成,后續(xù)補(bǔ)上基于svc的更多實(shí)例。
下一篇將介紹SVM的另一個(gè)分類(lèi)器--NuSVC