Support Vector Machines
scikit-learn中SVM的算法庫分為兩類棋凳,一類是分類的算法庫邪驮,包括SVC笙隙,?NuSVC,和LinearSVC 3個(gè)類隔心。另一類是回歸算法庫白群,包括SVR,?NuSVR硬霍,和LinearSVR 3個(gè)類帜慢。相關(guān)的類都包裹在sklearn.svm模塊之中。
我們使用這些類的時(shí)候,如果有經(jīng)驗(yàn)知道數(shù)據(jù)是線性可以擬合的粱玲,那么使用LinearSVC去分類 或者LinearSVR去回歸躬柬,它們不需要我們?nèi)ヂ恼{(diào)參去選擇各種核函數(shù)以及對(duì)應(yīng)參數(shù), 速度也快抽减。如果我們對(duì)數(shù)據(jù)分布沒有什么經(jīng)驗(yàn)允青,一般使用SVC去分類或者SVR去回歸,這就需要我們選擇核函數(shù)以及對(duì)核函數(shù)調(diào)參了卵沉。
什么特殊場(chǎng)景需要使用NuSVC分類 和 NuSVR 回歸呢颠锉?如果我們對(duì)訓(xùn)練集訓(xùn)練的錯(cuò)誤率或者說支持向量的百分比有要求的時(shí)候,可以選擇NuSVC分類 和 NuSVR?史汗。它們有一個(gè)參數(shù)來控制這個(gè)百分比琼掠。
nu代表訓(xùn)練集訓(xùn)練的錯(cuò)誤率的上限,或者說支持向量的百分比下限停撞,取值范圍為(0,1],默認(rèn)是0.5.它和懲罰系數(shù)C類似瓷蛙,都可以控制懲罰的力度。
一般情況下怜森,對(duì)非線性數(shù)據(jù)使用默認(rèn)的高斯核函數(shù)會(huì)有比較好的效果速挑,如果你不是SVM調(diào)參高手的話,建議使用高斯核來做數(shù)據(jù)分析副硅。
如果我們?cè)趉ernel參數(shù)使用了多項(xiàng)式核函數(shù) 'poly'姥宝,高斯核函數(shù)‘rbf’, 或者sigmoid核函數(shù),那么我們就需要對(duì)這個(gè)參數(shù)進(jìn)行調(diào)參恐疲。
樣本權(quán)重class_weight:
指定樣本各類別的的權(quán)重腊满,主要是為了防止訓(xùn)練集某些類別的樣本過多,導(dǎo)致訓(xùn)練的決策過于偏向這些類別培己。這里可以自己指定各個(gè)樣本的權(quán)重碳蛋,或者用“balanced”,如果使用“balanced”省咨,則算法會(huì)自己計(jì)算權(quán)重肃弟,樣本量少的類別所對(duì)應(yīng)的樣本權(quán)重會(huì)高。當(dāng)然零蓉,如果你的樣本類別分布沒有明顯的偏倚笤受,則可以不管這個(gè)參數(shù),選擇默認(rèn)的"None"
首先敌蜂,常用的核函數(shù)有:線性核函數(shù)箩兽、多項(xiàng)式核函數(shù)、(高斯)RBF徑向基核函數(shù)章喉。
在 SVM 中汗贫,選擇線性核函數(shù)和徑向基核函數(shù)時(shí)身坐,需要對(duì)數(shù)據(jù)進(jìn)行歸一化處理。
一般性建議落包,高維數(shù)據(jù)(數(shù)據(jù)維度大部蛇,是或者可以視為線性可分)的情況下,選擇線性核函數(shù)咐蝇,不行換特征搪花,再不行換高斯核。
維度少的時(shí)候嘹害,如果可以的話提取特征使用線性核函數(shù),不行再換高斯核函數(shù)吮便,因?yàn)榫€性核函數(shù)最簡(jiǎn)單最快笔呀,高斯核復(fù)雜而慢,但是除了速度之外的性能一般都可以達(dá)到或優(yōu)于線性核的效果髓需。多項(xiàng)式核的參數(shù)比高斯核的多许师,參數(shù)越多模型越復(fù)雜;高斯核的輸出值域在 0-1之間僚匆,計(jì)算方便微渠;多項(xiàng)式核的輸出值域在 0-inf 在某些情況下有更好的表現(xiàn)。
###
所謂的核技巧咧擂,就是使用一個(gè)變換將原空間的數(shù)據(jù)映射到新空間逞盆,在新空間里使用線性方法求解。
###
基本思想介紹
這里有一個(gè)有趣的問題:上面的兩條線都分開了紅色聚類和綠色聚類松申。是否有很好的理由選擇一條云芦,不選擇另一條呢?
別忘了贸桶,分類器的價(jià)值不在于它多么擅長(zhǎng)分離訓(xùn)練數(shù)據(jù)舅逸。我們最終想要用它分類未見數(shù)據(jù)點(diǎn)(稱為?測(cè)試數(shù)據(jù))。因此皇筛,我們想要選擇一條捕捉了訓(xùn)練集中的?通用模式(general pattern)的線琉历,這樣的線在測(cè)試集上表現(xiàn)出色的幾率很大。
上面的第一條線看起來有點(diǎn)“歪斜”水醋。下半部分看起來太接近紅聚類旗笔,而上半部分則過于接近綠聚類。是的离例,它完美地分割了訓(xùn)練數(shù)據(jù)换团,但是如果它看到略微遠(yuǎn)離其聚類的測(cè)試數(shù)據(jù)點(diǎn),它很有可能會(huì)弄錯(cuò)標(biāo)簽宫蛆。
第二條線沒有這個(gè)問題艘包。第二條線在正確分割訓(xùn)練數(shù)據(jù)的前提下的猛,盡可能地同時(shí)遠(yuǎn)離兩個(gè)聚類。保持在兩個(gè)聚類的正中間想虎,讓第二條線的“風(fēng)險(xiǎn)”更小卦尊,為每個(gè)分類的數(shù)據(jù)分布留出了一些搖動(dòng)的空間,因而能在測(cè)試集上取得更好的概括性舌厨。
SVM試圖找到第二條線岂却。上面我們通過可視化方法挑選了更好的分類器,但我們需要更準(zhǔn)確一點(diǎn)地定義其中的理念裙椭,以便在一般情形下加以應(yīng)用躏哩。下面是一個(gè)簡(jiǎn)化版本的SVM:
1、找到正確分類訓(xùn)練數(shù)據(jù)的一組直線揉燃。
2扫尺、在找到的所有直線中,選擇那條離最接近的數(shù)據(jù)點(diǎn)距離最遠(yuǎn)的直線炊汤。
支持向量是怎么計(jì)算的
距離最接近的數(shù)據(jù)點(diǎn)稱為?支持向量(support vector)正驻。
支持向量定義的沿著分隔線的區(qū)域稱為?間隔(margin)?。
盡管上圖顯示的是直線和二維數(shù)據(jù)抢腐,SVM實(shí)際上適用于任何維度姑曙;在不同維度下,SVM尋找類似二維直線的東西迈倍。
SVM允許我們通過參數(shù) C 指定愿意接受多少誤差伤靠。
由于現(xiàn)實(shí)世界的數(shù)據(jù)幾乎從來都不是整潔的,因此決定較優(yōu)的C值很重要授瘦。我們通常使用?交叉驗(yàn)證(cross-validation)之類的技術(shù)選定較優(yōu)的C值醋界。
核函數(shù)
注意,關(guān)鍵的地方來了提完!我們已經(jīng)有了一項(xiàng)非常擅長(zhǎng)尋找超平面的技術(shù)形纺,但是我們的數(shù)據(jù)卻是非線性可分的。所以我們?cè)撛趺崔k徒欣??將數(shù)據(jù)投影到一個(gè)線性可分的空間逐样,然后在那個(gè)空間尋找超平面!
2. 所以我首先投影數(shù)據(jù)接著運(yùn)行SVM打肝?
否脂新。為了讓上面的例子易于理解,我首先投影了數(shù)據(jù)粗梭。其實(shí)你只需讓SVM為你投影數(shù)據(jù)争便。這帶來了一些優(yōu)勢(shì),包括SVM將使用一種稱為?核(kernels)的東西進(jìn)行投影断医,這相當(dāng)迅速(我們很快將講解原因)滞乙。
另外奏纪,還記得我在上一點(diǎn)提過投影至無窮維么?那該如何表示斩启、存儲(chǔ)無窮維呢序调?結(jié)果SVM在這一點(diǎn)上非常聰明,同樣兔簇,這和核有關(guān)发绢。
這是讓SVM奏效的秘密武器。這里我們需要一點(diǎn)數(shù)學(xué)垄琐。
讓我們回顧下之前的內(nèi)容:
SVM在線性可分的數(shù)據(jù)上效果極為出色边酒。使用正確的C值,SVM在基本線性可分的數(shù)據(jù)上效果相當(dāng)出色狸窘。線性不可分的數(shù)據(jù)可以投影至完美線性可分或基本線性可分的空間甚纲,從而將問題轉(zhuǎn)化為1或2.
看起來讓SVM得到普遍應(yīng)用的關(guān)鍵是投影到高維。這正是核的用武之地朦前。
SVM的目標(biāo)是在正確分類的前提下,最大化間隔寬度
你可以不用在意以上公式的細(xì)節(jié)鹃操,只需注意一點(diǎn)韭寸,?以上計(jì)算都是基于向量的內(nèi)積。也就是說荆隘,無論是超平面的選取恩伺,還是確定超平面后分類測(cè)試數(shù)據(jù)點(diǎn),都只需要計(jì)算向量的內(nèi)積椰拒。
而?核函數(shù)(kernel function)晶渠,簡(jiǎn)稱?核(kernel)?正是算內(nèi)積的!核函數(shù)接受原始空間中兩個(gè)數(shù)據(jù)點(diǎn)作為輸入燃观,可以?直接給出投影空間中的點(diǎn)積褒脯。
看來用核函數(shù)計(jì)算所需內(nèi)積要快得多。大型數(shù)據(jù)集上缆毁,核函數(shù)節(jié)省的算力將飛速累積番川。這是核函數(shù)的巨大優(yōu)勢(shì)。
大多數(shù)SVM庫內(nèi)置了流行的核函數(shù)脊框,比如?多項(xiàng)式(Polynomial)颁督、?徑向基函數(shù)(Radial Basis Function,RBF)?浇雹、?Sigmoid?沉御。當(dāng)我們不進(jìn)行投影時(shí)(比如本文的第一個(gè)例子),我們直接在原始空間計(jì)算點(diǎn)積——我們把這叫做使用?線性核(linear kernel)?昭灵。
我們通常并不定義數(shù)據(jù)的投影吠裆。相反伐谈,我們從現(xiàn)有的核中選取一個(gè),加以微調(diào)硫痰,以找到最匹配數(shù)據(jù)的核函數(shù)衩婚。我們當(dāng)然可以定義自己的核,甚至自行投影效斑。但許多情形下不必如此非春。至少,我們從嘗試現(xiàn)有核函數(shù)開始缓屠。如果存在我們想要的投影的核奇昙,我們將使用它,因?yàn)楹私?jīng)车型辏快很多储耐。RBF核可以投影數(shù)據(jù)點(diǎn)至無窮維。
事實(shí)上滨溉,如果你需要?快速了解不同核什湘、C值等對(duì)尋找分割邊界的影響,你可以嘗試libSVM主頁上的“圖形界面”晦攒。標(biāo)記數(shù)據(jù)點(diǎn)分類闽撤,選擇SVM參數(shù),然后點(diǎn)擊運(yùn)行(Run)脯颜!這個(gè)可視化工具的魅力無可阻擋
參考文獻(xiàn)
【1】https://www.cnblogs.com/pinard/p/6117515.html? ??scikit-learn 支持向量機(jī)算法庫使用小結(jié)
【2】https://baijiahao.baidu.com/s?id=1607469282626953830&wfr=spider&for=pc? ??SVM教程:支持向量機(jī)的直觀理解
【3】https://blog.csdn.net/qq_35992440/article/details/80987664? ??SVM支持向量機(jī)入門及數(shù)學(xué)原理
【4】https://blog.csdn.net/MachineRandy/article/details/80358931? ? 機(jī)器學(xué)習(xí)中的核技巧