機(jī)器學(xué)習(xí)筆記(3)-sklearn支持向量機(jī)SVM

文章用于總結(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ù)
  1. 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)的樣本作為噪聲。
  2. 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ì)算
  3. 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ù)。
  4. gamma (float參數(shù) 默認(rèn)為auto)
    該參數(shù)為核函數(shù)系數(shù),只對(duì)‘rbf’,‘poly’,‘sigmod’有效。如果gamma設(shè)置為auto,代表其值為樣本特征數(shù)的倒數(shù),即1/n_features,也有其他值可設(shè)定。
  5. coef0:(float參數(shù) 默認(rèn)為0.0)
    該參數(shù)表示核函數(shù)中的獨(dú)立項(xiàng),只有對(duì)‘poly’和‘sigmod’核函數(shù)有用,是指其中的參數(shù)c。
  6. probability( bool參數(shù) 默認(rèn)為False)
    該參數(shù)表示是否啟用概率估計(jì)。 這必須在調(diào)用fit()之前啟用,并且會(huì)使fit()方法速度變慢。
  7. shrinkintol: float參數(shù) 默認(rèn)為1e^-3g(bool參數(shù) 默認(rèn)為T(mén)rue)
    該參數(shù)表示是否選用啟發(fā)式收縮方式。
  8. tol( float參數(shù) 默認(rèn)為1e^-3)
    svm停止訓(xùn)練的誤差精度,也即閾值。
  9. cache_size(float參數(shù) 默認(rèn)為200)
    該參數(shù)表示指定訓(xùn)練所需要的內(nèi)存,以MB為單位,默認(rèn)為200MB。
  10. 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)重。
  11. verbose ( bool參數(shù) 默認(rèn)為False)
    該參數(shù)表示是否啟用詳細(xì)輸出。此設(shè)置利用libsvm中的每個(gè)進(jìn)程運(yùn)行時(shí)設(shè)置,如果啟用,可能無(wú)法在多線程上下文中正常工作。一般情況都設(shè)為False,不用管它。
  12. max_iter (int參數(shù) 默認(rèn)為-1)
    該參數(shù)表示最大迭代次數(shù),如果設(shè)置為-1則表示不受限制。
  13. 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。
  • 方法
  1. svc.decision_function(X)
    樣本X到分離超平面的距離
  2. svc.fit(X, y[, sample_weight])
    根據(jù)給定的訓(xùn)練數(shù)據(jù)擬合SVM模型。
  3. 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}
  1. svc.predict(X)
    根據(jù)測(cè)試數(shù)據(jù)集進(jìn)行預(yù)測(cè)
  2. svc.score(X, y[, sample_weight])
    返回給定測(cè)試數(shù)據(jù)和標(biāo)簽的平均精確度
  3. 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)為例)
  1. 官方示例
>>> 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]
  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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容