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

文章用于總結(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ù)
  1. C (float參數(shù) 默認(rèn)值為1.0)
    表示錯誤項的懲罰系數(shù)C越大甩卓,即對分錯樣本的懲罰程度越大,因此在訓(xùn)練樣本中準(zhǔn)確率越高蕉斜,但是泛化能力降低逾柿;相反,減小C的話宅此,容許訓(xùn)練樣本中有一些誤分類錯誤樣本机错,泛化能力強(qiáng)。對于訓(xùn)練樣本帶有噪聲的情況父腕,一般采用后者弱匪,把訓(xùn)練樣本集中錯誤分類的樣本作為噪聲。
  2. kernel (str參數(shù) 默認(rèn)為‘rbf’)
    該參數(shù)用于選擇模型所使用的核函數(shù)璧亮,算法中常用的核函數(shù)有:
    -- linear:線性核函數(shù)
    -- poly:多項式核函數(shù)
    --rbf:徑像核函數(shù)/高斯核
    --sigmod:sigmod核函數(shù)
    --precomputed:核矩陣萧诫,該矩陣表示自己事先計算好的斥难,輸入后算法內(nèi)部將使用你提供的矩陣進(jìn)行計算
  3. degree (int型參數(shù) 默認(rèn)為3)
    該參數(shù)只對'kernel=poly'(多項式核函數(shù))有用,是指多項式核函數(shù)的階數(shù)n财搁,如果給的核函數(shù)參數(shù)是其他核函數(shù)蘸炸,則會自動忽略該參數(shù)。
  4. gamma (float參數(shù) 默認(rèn)為auto)
    該參數(shù)為核函數(shù)系數(shù)尖奔,只對‘rbf’,‘poly’,‘sigmod’有效搭儒。如果gamma設(shè)置為auto,代表其值為樣本特征數(shù)的倒數(shù)提茁,即1/n_features淹禾,也有其他值可設(shè)定。
  5. coef0:(float參數(shù) 默認(rèn)為0.0)
    該參數(shù)表示核函數(shù)中的獨(dú)立項茴扁,只有對‘poly’和‘sigmod’核函數(shù)有用铃岔,是指其中的參數(shù)c。
  6. probability( bool參數(shù) 默認(rèn)為False)
    該參數(shù)表示是否啟用概率估計峭火。 這必須在調(diào)用fit()之前啟用毁习,并且會使fit()方法速度變慢。
  7. shrinkintol: float參數(shù) 默認(rèn)為1e^-3g(bool參數(shù) 默認(rèn)為True)
    該參數(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(字典類型或者‘balance’字符串衅枫。默認(rèn)為None)
    該參數(shù)表示給每個類別分別設(shè)置不同的懲罰參數(shù)C嫁艇,如果沒有給,則會給所有類別都給C=1弦撩,即前面參數(shù)指出的參數(shù)C步咪。如果給定參數(shù)‘balance’,則使用y的值自動調(diào)整與輸入數(shù)據(jù)中的類頻率成反比的權(quán)重益楼。
  11. verbose ( bool參數(shù) 默認(rèn)為False)
    該參數(shù)表示是否啟用詳細(xì)輸出歧斟。此設(shè)置利用libsvm中的每個進(jìn)程運(yùn)行時設(shè)置,如果啟用偏形,可能無法在多線程上下文中正常工作静袖。一般情況都設(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ù)時所使用的偽隨機(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ù)并以字典行書儲存,默認(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}
  1. svc.predict(X)
    根據(jù)測試數(shù)據(jù)集進(jìn)行預(yù)測
  2. svc.score(X, y[, sample_weight])
    返回給定測試數(shù)據(jù)和標(biāo)簽的平均精確度
  3. svc.predict_log_proba(X_test)敦锌,svc.predict_proba(X_test)
    當(dāng)sklearn.svm.SVC(probability=True)時,才會有這兩個值佳簸,分別得到樣本的對數(shù)概率以及普通概率乙墙。
  • 應(yīng)用實例(以iris分類為例)
  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ù)集的分類(目前沒整一些其他的數(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末汉买,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子漓雅,更是在濱河造成了極大的恐慌录别,老刑警劉巖朽色,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件邻吞,死亡現(xiàn)場離奇詭異,居然都是意外死亡葫男,警方通過查閱死者的電腦和手機(jī)抱冷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來梢褐,“玉大人旺遮,你說我怎么就攤上這事∮龋” “怎么了耿眉?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長鱼响。 經(jīng)常有香客問我鸣剪,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任筐骇,我火速辦了婚禮债鸡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘铛纬。我一直安慰自己厌均,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布告唆。 她就那樣靜靜地躺著棺弊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪悔详。 梳的紋絲不亂的頭發(fā)上镊屎,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機(jī)與錄音茄螃,去河邊找鬼缝驳。 笑死,一個胖子當(dāng)著我的面吹牛归苍,可吹牛的內(nèi)容都是我干的拼弃。 我是一名探鬼主播溺忧,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼歌溉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了匙头?” 一聲冷哼從身側(cè)響起蹂析,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤喻频,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后宋梧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體加叁,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡豫柬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年燕偶,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片创夜。...
    茶點(diǎn)故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡杭跪,死狀恐怖仙逻,靈堂內(nèi)的尸體忽然破棺而出驰吓,到底是詐尸還是另有隱情,我是刑警寧澤系奉,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布檬贰,位于F島的核電站,受9級特大地震影響缺亮,放射性物質(zhì)發(fā)生泄漏翁涤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望葵礼。 院中可真熱鬧号阿,春花似錦、人聲如沸鸳粉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽届谈。三九已至枯夜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間艰山,已是汗流浹背湖雹。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留曙搬,地道東北人摔吏。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像纵装,于是被迫代替她去往敵國和親舔腾。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容