【白话机器学习】算法理论+实战之支持向量机(SVM)
1. 寫在前面
如果想從事數(shù)據(jù)挖掘或者機(jī)器學(xué)習(xí)的工作,掌握常用的機(jī)器學(xué)習(xí)算法是非常有必要的, 常見的機(jī)器學(xué)習(xí)算法:
監(jiān)督學(xué)習(xí)算法:邏輯回歸,線性回歸,決策樹,樸素貝葉斯,K近鄰,支持向量機(jī),集成算法Adaboost等
無(wú)監(jiān)督算法:聚類,降維,關(guān)聯(lián)規(guī)則, PageRank等
為了詳細(xì)的理解這些原理,曾經(jīng)看過西瓜書,統(tǒng)計(jì)學(xué)習(xí)方法,機(jī)器學(xué)習(xí)實(shí)戰(zhàn)等書,也聽過一些機(jī)器學(xué)習(xí)的課程,但總感覺話語(yǔ)里比較深?yuàn)W,讀起來(lái)沒有耐心,并且理論到處有,而實(shí)戰(zhàn)最重要, 所以在這里想用最淺顯易懂的語(yǔ)言寫一個(gè)白話機(jī)器學(xué)習(xí)算法理論+實(shí)戰(zhàn)系列。
個(gè)人認(rèn)為,理解算法背后的idea和使用,要比看懂它的數(shù)學(xué)推導(dǎo)更加重要。idea會(huì)讓你有一個(gè)直觀的感受,從而明白算法的合理性,數(shù)學(xué)推導(dǎo)只是將這種合理性用更加嚴(yán)謹(jǐn)?shù)恼Z(yǔ)言表達(dá)出來(lái)而已,打個(gè)比方,一個(gè)梨很甜,用數(shù)學(xué)的語(yǔ)言可以表述為糖分含量90%,但只有親自咬一口,你才能真正感覺到這個(gè)梨有多甜,也才能真正理解數(shù)學(xué)上的90%的糖分究竟是怎么樣的。如果這些機(jī)器學(xué)習(xí)算法是個(gè)梨,本文的首要目的就是先帶領(lǐng)大家咬一口。另外還有下面幾個(gè)目的:
檢驗(yàn)自己對(duì)算法的理解程度,對(duì)算法理論做一個(gè)小總結(jié)
能開心的學(xué)習(xí)這些算法的核心思想, 找到學(xué)習(xí)這些算法的興趣,為深入的學(xué)習(xí)這些算法打一個(gè)基礎(chǔ)。
每一節(jié)課的理論都會(huì)放一個(gè)實(shí)戰(zhàn)案例,能夠真正的做到學(xué)以致用,既可以鍛煉編程能力,又可以加深算法理論的把握程度。
也想把之前所有的筆記和參考放在一塊,方便以后查看時(shí)的方便。
學(xué)習(xí)算法的過程,獲得的不應(yīng)該只有算法理論,還應(yīng)該有樂趣和解決實(shí)際問題的能力!
今天是白話機(jī)器學(xué)習(xí)算法理論+實(shí)戰(zhàn)的第六篇,支持向量機(jī)算法(Support Vector Machine,SVM),這是一種二分類模型,它基本模型是定義在特征空間上的間隔最大的線性分類器, 間隔最大使它有別于感知機(jī),支持向量機(jī)還包含核技巧,這使它成為實(shí)質(zhì)上的非線性分類器,支持向量機(jī)在處理二分類問題上表現(xiàn)非常優(yōu)越,也是一個(gè)很好的算法了。SVM 作為有監(jiān)督的學(xué)習(xí)模型,通??梢詭臀覀兡J阶R(shí)別、分類以及回歸分析。
但是寫這篇文章,確實(shí)有點(diǎn)難度,因?yàn)橹С窒蛄繖C(jī)的推導(dǎo)過程中涉及到很多的數(shù)學(xué)公式,什么拉格朗日對(duì)偶,KKT等這些東西了。而如果真的要從原理上深挖,那就不叫白話機(jī)器學(xué)習(xí)算法理論了,所以這里我還是會(huì)忽略掉推導(dǎo)演繹的過程,因?yàn)槲矣X得除了寫論文,大部分時(shí)候,不會(huì)用到這些公式推導(dǎo)。
所謂白話,我理解的就是先懂算法的基本原理,然后用起來(lái)再說(shuō)。至于具體細(xì)節(jié),需要的時(shí)候再補(bǔ),后面我會(huì)把所有數(shù)學(xué)公式的推導(dǎo)過程,更深層的原理的鏈接都貼上來(lái)。今天會(huì)用白話的語(yǔ)言說(shuō)一下支持向量機(jī)的理論部分,然后說(shuō)一下如何調(diào)用工具實(shí)現(xiàn)SVM,最后做一個(gè)乳腺癌檢測(cè)的實(shí)戰(zhàn)。
大綱如下:
SVM的工作原理(去找最大的分類間隔)
硬間隔、軟間隔和非線性SVM(線性可分SVM,線性SVM,非線性SVM)
SVM如何解決多分類問題(一對(duì)多法和一對(duì)一法)
SVM實(shí)戰(zhàn):如何進(jìn)行乳腺癌檢測(cè)?
OK, let's go!
2. 支持向量機(jī)?太深?yuàn)W了名字,還是從幾個(gè)小練習(xí)開始吧!
支持向量機(jī),英文叫做Support Vector Machine。一聽這名字就感覺高大上, 好多人一看到這就感覺太難了,名字都聽不懂,然后就溜了,哪有電視好玩。但是你就不好奇聽起來(lái)這么高大上的東西,在生活中是如何表現(xiàn)呢嗎?其實(shí)也是來(lái)源于生活的, 不行?我們先做幾個(gè)練習(xí)好不好。
練習(xí)1:桌子上放了紅色和藍(lán)色兩種球,你能不能用一根棍子將這兩種顏色的球分開?你說(shuō):這還不簡(jiǎn)單,就干凈利落的直接搞定,嗯,太棒了。練習(xí)2:我第一個(gè)是不是出簡(jiǎn)單了啊?那么我提高一下難度,桌子上依然放著紅色、藍(lán)色兩種球,但是它們的擺放不規(guī)律,如下圖所示。如何用一根棍子把這兩種顏色分開呢?這時(shí)候你就為難了,這用一根棍子能分開??除非把棍子彎曲,像下面這樣:所以這里直線變成了曲線。如果在同一個(gè)平面上來(lái)看,紅藍(lán)兩種顏色的球是很難分開的。那么有沒有一種方式,可以讓它們自然地分開呢?
這里你可能會(huì)靈機(jī)一動(dòng),猛拍一下桌子,這些小球瞬間騰空而起,如下圖所示。在騰起的那一剎那,出現(xiàn)了一個(gè)水平切面,恰好把紅、藍(lán)兩種顏色的球分開。在這里,二維平面變成了三維空間。原來(lái)的曲線變成了一個(gè)平面。這個(gè)平面,我們就叫做超平面。(你真是太厲害了,球都飛成這樣,手疼不疼?)
你知道嗎?這其實(shí)就有點(diǎn)支持向量機(jī)的味道了,支持向量機(jī)的計(jì)算過程,就是幫我們找到那個(gè)綠色的超平面的過程,這個(gè)超平面就是我們的SVM分類器。哈哈,神奇不?這么高大上的東西,竟然是在找這樣一個(gè)超平面?
下面看看SVM的原理吧!
3. SVM的工作原理
還是從練習(xí)1開始,我相信,好多人劃分的方式可能和我畫的不一樣,比如下面這幾種:A,B,C這三條直線,都可以把紅藍(lán)球給分開。究竟哪一個(gè)最好呢?
★很明顯,直線 B 更靠近藍(lán)色球,但是在真實(shí)環(huán)境下,球再多一些的話,藍(lán)色球可能就被劃分到了直線 B 的右側(cè),被認(rèn)為是紅色球。
同樣直線 A 更靠近紅色球,在真實(shí)環(huán)境下,如果紅色球再多一些,也可能會(huì)被誤認(rèn)為是藍(lán)色球。
所以相比于直線 A 和直線 B,直線 C 的劃分更優(yōu),因?yàn)樗聂敯粜愿鼜?qiáng)。啥叫魯棒性?在這里你可以理解成容錯(cuò)能力比較強(qiáng)。不會(huì)輕易的分錯(cuò)紅色球和藍(lán)色球。
你可能又說(shuō)了,你畫的當(dāng)然那么輕松,可以計(jì)算機(jī)究竟怎么才能找到直線C這種呢?(實(shí)際上,我們的分類環(huán)境不是在二維平面中的,而是在多維空間中,這樣直線 C 就變成了決策面 C。)
問得好,下面就來(lái)回答這個(gè)問題,可以回答之前,需要先介紹一個(gè)SVM特有的概念:分類間隔。
在保證決策面不變,且分類不產(chǎn)生錯(cuò)誤的情況下,我們可以移動(dòng)決策面 C,直到產(chǎn)生兩個(gè)極限的位置:如圖中的決策面 A 和決策面 B。極限的位置是指,如果越過了這個(gè)位置,就會(huì)產(chǎn)生分類錯(cuò)誤。這樣的話,兩個(gè)極限位置 A 和 B 之間的分界線 C 就是最優(yōu)決策面。
極限位置到最優(yōu)決策面 C 之間的距離,就是“分類間隔”,英文叫做 margin。如果我們轉(zhuǎn)動(dòng)這個(gè)最優(yōu)決策面,你會(huì)發(fā)現(xiàn)可能存在多個(gè)最優(yōu)決策面,它們都能把數(shù)據(jù)集正確分開,這些最優(yōu)決策面的分類間隔可能是不同的,而那個(gè)擁有“最大間隔”(max margin)的決策面就是 SVM 要找的最優(yōu)解。那么怎么確定最大間隔呢?
談到分類間隔這個(gè)詞,就有必要先說(shuō)說(shuō)這個(gè)距離應(yīng)該如何衡量了。(間隔可以分為函數(shù)間隔和幾何間隔,前者是衡量多個(gè)點(diǎn)都同一超平面的相對(duì)距離,而后者是衡量同一點(diǎn)到不同超平面的真實(shí)距離,很明顯,這里需要用到后者,因?yàn)槲覀冞@里有太多的超平面)
而如果想說(shuō)距離,就得先定義出超平面來(lái)吧。
在上面這個(gè)例子中,如果我們把紅藍(lán)兩種顏色的球放到一個(gè)三維空間里,你發(fā)現(xiàn)決策面就變成了一個(gè)平面。這里我們可以用線性函數(shù)來(lái)表示,如果在一維空間里就表示一個(gè)點(diǎn),在二維空間里表示一條直線,在三維空間中代表一個(gè)平面,當(dāng)當(dāng)然空間維數(shù)還可以更多,這樣我們給這個(gè)線性函數(shù)起個(gè)名稱叫做“超平面”。超平面的數(shù)學(xué)表達(dá)可以寫成:在這個(gè)公式里,w、x 是 n 維空間里的向量,其中 x 是函數(shù)變量;w 是法向量。法向量這里指的是垂直于平面的直線所表示的向量,它決定了超平面的方向。
SVM 就是幫我們找到一個(gè)超平面,這個(gè)超平面能將不同的樣本劃分開,同時(shí)使得樣本集中的點(diǎn)到這個(gè)分類超平面的最小距離(即分類間隔)最大化。
接下來(lái),我們定義某類樣本集到超平面的距離是這個(gè)樣本集合內(nèi)的樣本到超平面的最短距離。我們用 di 代表點(diǎn) xi 到超平面 wxi+b=0 的歐氏距離。因此我們要求 di 的最小值,用它來(lái)代表這個(gè)樣本到超平面的最短距離。di 可以用公式計(jì)算得出:其中||w||為超平面的范數(shù),di 的公式可以用解析幾何知識(shí)進(jìn)行推導(dǎo),這里不做解釋。
SVM要做的就是求解最大分類間隔, 怎么求?我們已經(jīng)知道了點(diǎn)到超平面的距離公式,我們希望一個(gè)訓(xùn)練樣本(xi,yi),這個(gè)樣本點(diǎn)和分離超平面的幾何距離最小,記作γ,其他的每一個(gè)訓(xùn)練樣本的間隔都大于γ,在這個(gè)約束下,我們要最大化這個(gè)γ,即最大化超平面(w,b)關(guān)于訓(xùn)練集的幾何間隔。這就成了求解一個(gè)優(yōu)化問題了。上面那種形式還可以這樣表示:而這個(gè)||w||這是個(gè)常數(shù),可以提出來(lái):這樣就會(huì)發(fā)現(xiàn),后面那個(gè)是一個(gè)函數(shù)間隔了,我們知道函數(shù)間隔的取值并不影響最優(yōu)化問題的解(因?yàn)榧僭O(shè)w和b按比例變?yōu)棣藈和λb,那么函數(shù)間隔也變?yōu)棣吮?#xff0c;這一變化對(duì)最小化問題不影響),所以索性我們?nèi)『竺娴臑?, 即所有樣本點(diǎn)到超平面的函數(shù)間隔至少是1,即下面的改寫:這個(gè)問題,我們可以轉(zhuǎn)換一下,化成倒數(shù),同時(shí)最小化,變成等價(jià)的問題:到此,這就成了一個(gè)凸優(yōu)化的問題,可以轉(zhuǎn)成拉格朗日的對(duì)偶問題,判斷是否滿足KKT條件,然后求解,需要數(shù)學(xué)公式推導(dǎo)了。但是不想寫這一塊,因?yàn)檫@里只想說(shuō)明這個(gè)超平面通過這種方式就能求出來(lái),而不需要知道是怎么求出來(lái)的。
就假設(shè)我求完了,求出了這個(gè)超平面,比如下面這個(gè):數(shù)學(xué)公式不知道不要緊,但是得知道幾個(gè)術(shù)語(yǔ), 要不然就是外行了。
分離超平面:也就是那個(gè)能把樣本分開的那個(gè)最優(yōu)超平面了
支撐超平面:是分離超平面平移到極限位置之后的那兩條直線
分離間隔:支撐超平面之間的距離
支持向量:就是那兩個(gè)極限位置的樣本。(在決定分離超平面時(shí),只有支持向量在起作用,而其他實(shí)例點(diǎn)不起作用。由于支持向量在確定分離超平面中起著決定性作用,所以將這類模型叫做支持向量機(jī))
支持向量機(jī)的原理知道了吧??就是求一個(gè)超平面,這個(gè)超平面能把所有的樣本點(diǎn)最有把握的分開。最有把握就是說(shuō),樣本點(diǎn)到超平面的距離最大。而之所以叫做支持向量,是因?yàn)樵跊Q定分離超平面的時(shí)候,只有極限位置的那兩個(gè)點(diǎn)有用,其他點(diǎn)根本沒有大作用,因?yàn)橹灰獦O限位置離得超平面的距離最大,就是最佳的分離平面了。而具體的求解方法,是求解一個(gè)凸優(yōu)化的問題,用到一些數(shù)學(xué)的知識(shí),在這里我們不展開講。不知道這樣說(shuō)明白了沒有?
下面,還有一個(gè)要討論的問題,就是,線性可分的情況往往在實(shí)際生活中是一個(gè)理想的狀態(tài),這個(gè)條件實(shí)際上太嚴(yán)厲了,哪有那么好的數(shù)據(jù)?一點(diǎn)噪聲都沒有嗎??萬(wàn)一有一點(diǎn)數(shù)據(jù)怎么辦呢?
別慌,支持向量機(jī)沒有那么脆弱,上面說(shuō)的那種完全線性可分,叫做硬間隔最大化,看這個(gè)詞也知道多么嚴(yán)厲了啊!有硬,當(dāng)然就有軟了,下面談?wù)勡涢g隔最大化,也就是有點(diǎn)噪聲點(diǎn)怎么樣。
4. 硬間隔、軟間隔和非線性SVM
假如數(shù)據(jù)是完全的線性可分的,那么學(xué)習(xí)到的模型可以稱為硬間隔支持向量機(jī)。換個(gè)說(shuō)法,硬間隔指的就是完全分類準(zhǔn)確,不能存在分類錯(cuò)誤的情況。軟間隔,就是允許一定量的樣本分類錯(cuò)誤。
我們知道,實(shí)際工作中的數(shù)據(jù)沒有那么“干凈”,或多或少都會(huì)存在一些噪點(diǎn)。所以線性可分是個(gè)理想情況。這時(shí),我們需要使用到軟間隔 SVM(近似線性可分),比如下面這種情況:這種情況,是不是就柔和了一些啊,就是允許有分類錯(cuò)誤的點(diǎn)。人無(wú)完人嘛,況且機(jī)器了啊。那么優(yōu)化目標(biāo)變成了下面的這種:又出來(lái)一個(gè)公式,但是這一個(gè)和上面的那個(gè)最優(yōu)化問題類似,無(wú)非就是目標(biāo)那多出來(lái)一項(xiàng)松弛項(xiàng)。就是允許有分類錯(cuò)誤的點(diǎn),但是盡可能的少就可以了。這個(gè)也是轉(zhuǎn)成拉格朗日對(duì)偶問題進(jìn)行求解,依然不用求,了解一下即可。如果想知道怎么求,可以參考我下面的鏈接(統(tǒng)計(jì)學(xué)習(xí)方法之支持向量機(jī)筆記)
另外還存在一種情況,就是非線性支持向量機(jī)。
比如下面的樣本集就是個(gè)非線性的數(shù)據(jù)。圖中的兩類數(shù)據(jù),分別分布為兩個(gè)圓圈的形狀。那么這種情況下,不論是多高級(jí)的分類器,只要映射函數(shù)是線性的,就沒法處理,SVM 也處理不了。
這時(shí),我們需要引入一個(gè)新的概念:核函數(shù)。它可以將樣本從原始空間映射到一個(gè)更高維的特質(zhì)空間中,使得樣本在新的空間中線性可分。這樣我們就可以使用原來(lái)的推導(dǎo)來(lái)進(jìn)行計(jì)算,只是所有的推導(dǎo)是在新的空間,而不是在原來(lái)的空間中進(jìn)行。還記得上面的一拍桌子,球飛起來(lái)的情況不??你拍手的過程,其實(shí)就是核函數(shù)做映射的過程,把二維平面上的點(diǎn),通過等價(jià)運(yùn)算,放到了三維空間中,這樣就可能找出一個(gè)超平面來(lái)分類這些點(diǎn)了。
核技巧類似這樣:所以在非線性 SVM 中,核函數(shù)的選擇就是影響 SVM 最大的變量。最常用的核函數(shù)有線性核、多項(xiàng)式核、高斯核、拉普拉斯核、sigmoid 核,或者是這些核函數(shù)的組合。這些函數(shù)的區(qū)別在于映射方式的不同。通過這些核函數(shù),我們就可以把樣本空間投射到新的高維空間中。
至于這些核函數(shù)長(zhǎng)什么樣子,可以看下面的鏈接,在sklearn中使用的時(shí)候,還會(huì)介紹具體怎么用。
至此,向量機(jī)的理論就講的差不多了,你明白了多少?
簡(jiǎn)單的理一下子吧:(放在平時(shí)是不理的,由于這塊確實(shí)涉及到了太多的數(shù)學(xué)知識(shí),只白話描述有點(diǎn)困難,所以理理上面想表達(dá)一個(gè)什么意思):
★首先,我們所說(shuō)的支持向量機(jī),其實(shí)有三種情況:
樣本完全線性可分,針對(duì)這種情況,我們通過硬間隔最大化方式學(xué)習(xí),即找到一個(gè)超平面能夠完全無(wú)誤的分類。目標(biāo)函數(shù)長(zhǎng)這樣:求解這個(gè)問題,需要轉(zhuǎn)成拉格朗日對(duì)偶形式,然后用拉格朗日函數(shù)法,考慮KKT條件等一系列操作,會(huì)求出最優(yōu)的w*, b*。就形成了一個(gè)超平面:g(x) = wx + b。就是最優(yōu)的面,這樣求出的向量機(jī)叫做線性可分支持向量機(jī)。
樣本不完全線性可分,針對(duì)這種情況,通過軟間隔最大化方式學(xué)習(xí),即允許分類錯(cuò)誤,但是要盡可能的少。目標(biāo)函數(shù)長(zhǎng)這樣:求解這個(gè)問題,也同樣需要轉(zhuǎn)成拉格朗日的對(duì)偶形式,然后考慮拉格朗日乘數(shù)法,KKT等,求出最優(yōu)的w*, 但此時(shí)b*不止一個(gè)。這時(shí)候,求出的向量機(jī)叫做線性支持向量機(jī)。
樣本本身就是一個(gè)非線性的數(shù)據(jù)集。這時(shí)候就需要通過核函數(shù)進(jìn)行轉(zhuǎn)換一下,到一個(gè)別的空間里面,讓它變成一個(gè)線性可分的,然后再去求最優(yōu)的超平面。這一個(gè)優(yōu)化問題長(zhǎng)這樣:當(dāng)然已經(jīng)轉(zhuǎn)成了對(duì)偶問題,K(xi, xj) 就是通過核函數(shù)進(jìn)行的轉(zhuǎn)換。這一個(gè)也能解出結(jié)果來(lái)。這里不詳細(xì)描述,這樣的向量機(jī)叫做非線性支持向量機(jī)。
關(guān)于向量機(jī)的原理這塊,我想說(shuō)的就是上面這些。?知道這三種情況,和優(yōu)化目標(biāo),大體上是怎么個(gè)求法,就可以了?,F(xiàn)在沒有必要追究那么明白,在深度學(xué)習(xí)的時(shí)代,神經(jīng)網(wǎng)絡(luò)都搞不過來(lái),如果不想真的搞科研,真的在向量機(jī)上突破,我建議先懂我上面描述的這些,然后重點(diǎn)在下面學(xué)學(xué)咋用,你會(huì)發(fā)現(xiàn),即使你不明白這些東西手算怎么求解,你也同樣可以學(xué)會(huì)根據(jù)樣本特征實(shí)現(xiàn)向量機(jī),并且用支持向量機(jī)進(jìn)行乳腺癌的檢測(cè)。即使你會(huì)手算支持向量機(jī)的求解,你也無(wú)法用手算進(jìn)行乳腺癌的檢測(cè),還是得使用工具實(shí)現(xiàn)向量機(jī),去進(jìn)行檢測(cè)。
好吧,可能已經(jīng)迷糊了,什么這的,那的啊??我理解,這塊確實(shí),如果想真的學(xué)明白,還就得知道一些數(shù)學(xué)的知識(shí), 水平有限,既想白話,又想不寫數(shù)學(xué),我太難了。
下面聊點(diǎn)輕松點(diǎn)的話題,上面都是講的如何支持向量機(jī)把紅球和籃球分開,那如果我不是兩種顏色的球呢?向量機(jī)應(yīng)該怎么做,這就是一個(gè)多分類的問題了。
5. 用SVM如何解決多分類問題
SVM 本身是一個(gè)二值分類器,最初是為二分類問題設(shè)計(jì)的,也就是回答 Yes 或者是 No。而實(shí)際上我們要解決的問題,可能是多分類的情況,比如對(duì)文本進(jìn)行分類,或者對(duì)圖像進(jìn)行識(shí)別。
針對(duì)這種情況,我們可以將多個(gè)二分類器組合起來(lái)形成一個(gè)多分類器,常見的方法有“一對(duì)多法”和“一對(duì)一法”兩種。
一對(duì)多法 假設(shè)我們要把物體分成 A、B、C、D 四種分類,那么我們可以先把其中的一類作為分類 1,其他類統(tǒng)一歸為分類 2。這樣我們可以構(gòu)造 4 種 SVM,分別為以下的情況:????(1)樣本 A 作為正集,B,C,D 作為負(fù)集;????(2)樣本 B 作為正集,A,C,D 作為負(fù)集;????(3)樣本 C 作為正集,A,B,D 作為負(fù)集;????(4)樣本 D 作為正集,A,B,C 作為負(fù)集。這種方法,針對(duì) K 個(gè)分類,需要訓(xùn)練 K 個(gè)分類器,分類速度較快,但訓(xùn)練速度較慢,因?yàn)槊總€(gè)分類器都需要對(duì)全部樣本進(jìn)行訓(xùn)練,而且負(fù)樣本數(shù)量遠(yuǎn)大于正樣本數(shù)量,會(huì)造成樣本不對(duì)稱的情況,而且當(dāng)增加新的分類,比如第 K+1 類時(shí),需要重新對(duì)分類器進(jìn)行構(gòu)造。
一對(duì)一法 一對(duì)一法的初衷是想在訓(xùn)練的時(shí)候更加靈活。我們可以在任意兩類樣本之間構(gòu)造一個(gè) SVM,這樣針對(duì) K 類的樣本,就會(huì)有 C(k,2) 類分類器。比如我們想要?jiǎng)澐?A、B、C 三個(gè)類,可以構(gòu)造 3 個(gè)分類器:????(1)分類器 1:A、B;????(2)分類器 2:A、C;????(3)分類器 3:B、C。當(dāng)對(duì)一個(gè)未知樣本進(jìn)行分類時(shí),每一個(gè)分類器都會(huì)有一個(gè)分類結(jié)果,即為 1 票,最終得票最多的類別就是整個(gè)未知樣本的類別。
這樣做的好處是,如果新增一類,不需要重新訓(xùn)練所有的 SVM,只需要訓(xùn)練和新增這一類樣本的分類器。而且這種方式在訓(xùn)練單個(gè) SVM 模型的時(shí)候,訓(xùn)練速度快。
但這種方法的不足在于,分類器的個(gè)數(shù)與 K 的平方成正比,所以當(dāng) K 較大時(shí),訓(xùn)練和測(cè)試的時(shí)間會(huì)比較慢。
6. 支持向量機(jī)實(shí)戰(zhàn) - 如何乳腺癌檢測(cè)?
懂了上面的原理之后,我們就可以親手實(shí)現(xiàn)向量機(jī),然后進(jìn)行實(shí)戰(zhàn)了。哈哈,激動(dòng)不?你可能會(huì)說(shuō),上面的原理還沒搞清楚呢??還沒弄明白KKT和拉格朗日對(duì)偶呢, 那也沒關(guān)系,你也能夠先用,然后在學(xué)。
6.1 如何在sklearn中使用SVM
在Python的sklearn工具包中有SVM算法, 首先引入工具包
from sklearn import svmSVM 既可以做分類,也可以做回歸。
當(dāng)用 SVM 做回歸的時(shí)候,我們可以使用 SVR 或 LinearSVR。SVR 的英文是 Support Vector Regression
當(dāng)做分類器的時(shí)候,我們使用的是 SVC 或者 LinearSVC。SVC 的英文是 Support Vector Classification。
簡(jiǎn)單說(shuō)一下兩者的區(qū)別:
★從名字上你能看出 LinearSVC 是個(gè)線性分類器,用于處理線性可分的數(shù)據(jù),只能使用線性核函數(shù)。
如果是針對(duì)非線性的數(shù)據(jù),需要用到 SVC。在 SVC 中,我們既可以使用到線性核函數(shù)(進(jìn)行線性劃分),也能使用高維的核函數(shù)(進(jìn)行非線性劃分)。
如何創(chuàng)建一個(gè)SVM分類器呢?
★首先使用SVC的構(gòu)造函數(shù):model = svm.SVC(kernel=‘rbf’, C=1.0, gamma=‘a(chǎn)uto’),這里有三個(gè)重要的參數(shù) kernel、C 和 gamma。
kernel代表核函數(shù)的選擇,有四種選擇,默認(rèn)rbf,即高斯核函數(shù)
linear:線性核函數(shù),是在數(shù)據(jù)線性可分的情況下使用的,運(yùn)算速度快,效果好。不足在于它不能處理線性不可分的數(shù)據(jù)。
poly:多項(xiàng)式核函數(shù),多項(xiàng)式核函數(shù)可以將數(shù)據(jù)從低維空間映射到高維空間,但參數(shù)比較多,計(jì)算量大。
rbf:高斯核函數(shù)(默認(rèn)),高斯核函數(shù)同樣可以將樣本映射到高維空間,但相比于多項(xiàng)式核函數(shù)來(lái)說(shuō)所需的參數(shù)比較少,通常性能不錯(cuò),所以是默認(rèn)使用的核函數(shù)。
sigmoid:sigmoid 核函數(shù),sigmoid 經(jīng)常用在神經(jīng)網(wǎng)絡(luò)的映射中。因此當(dāng)選用 sigmoid 核函數(shù)時(shí),SVM 實(shí)現(xiàn)的是多層神經(jīng)網(wǎng)絡(luò)。
參數(shù) C 代表目標(biāo)函數(shù)的懲罰系數(shù),懲罰系數(shù)指的是分錯(cuò)樣本時(shí)的懲罰程度,默認(rèn)情況下為 1.0。當(dāng) C 越大的時(shí)候,分類器的準(zhǔn)確性越高,但同樣容錯(cuò)率會(huì)越低,泛化能力會(huì)變差。相反,C 越小,泛化能力越強(qiáng),但是準(zhǔn)確性會(huì)降低。
參數(shù) gamma 代表核函數(shù)的系數(shù),默認(rèn)為樣本特征數(shù)的倒數(shù),即 gamma = 1 / n_features。
在創(chuàng)建 SVM 分類器之后,就可以輸入訓(xùn)練集對(duì)它進(jìn)行訓(xùn)練。
★我們使用 model.fit(train_X,train_y),傳入訓(xùn)練集中的特征值矩陣 train_X 和分類標(biāo)識(shí) train_y。特征值矩陣就是我們?cè)谔卣鬟x擇后抽取的特征值矩陣(當(dāng)然你也可以用全部數(shù)據(jù)作為特征值矩陣);分類標(biāo)識(shí)就是人工事先針對(duì)每個(gè)樣本標(biāo)識(shí)的分類結(jié)果。這樣模型會(huì)自動(dòng)進(jìn)行分類器的訓(xùn)練。我們可以使用 prediction=model.predict(test_X) 來(lái)對(duì)結(jié)果進(jìn)行預(yù)測(cè),傳入測(cè)試集中的樣本特征矩陣 test_X,可以得到測(cè)試集的預(yù)測(cè)分類結(jié)果 prediction。
”同樣我們也可以創(chuàng)建線性 SVM 分類器
★使用 model=svm.LinearSVC()。在 LinearSVC 中沒有 kernel 這個(gè)參數(shù),限制我們只能使用線性核函數(shù)。由于 LinearSVC 對(duì)線性分類做了優(yōu)化,對(duì)于數(shù)據(jù)量大的線性可分問題,使用 LinearSVC 的效率要高于 SVC。
”如果你不知道數(shù)據(jù)集是否為線性,可以直接使用 SVC 類創(chuàng)建 SVM 分類器。
在訓(xùn)練和預(yù)測(cè)中,LinearSVC 和 SVC 一樣,都是使用 model.fit(train_X,train_y) 和 model.predict(test_X)。
6.2 SVM進(jìn)行乳腺癌檢測(cè)
6.2.1 數(shù)據(jù)集介紹
數(shù)據(jù)集來(lái)自美國(guó)威斯康星州的乳腺癌診斷數(shù)據(jù)集,點(diǎn)擊這里進(jìn)行下載。
醫(yī)療人員采集了患者乳腺腫塊經(jīng)過細(xì)針穿刺 (FNA) 后的數(shù)字化圖像,并且對(duì)這些數(shù)字圖像進(jìn)行了特征提取,這些特征可以描述圖像中的細(xì)胞核呈現(xiàn)。腫瘤可以分成良性和惡性。部分?jǐn)?shù)據(jù)截屏如下所示:數(shù)據(jù)表一共包括了 32 個(gè)字段,代表的含義如下:上面的表格中,mean 代表平均值,se 代表標(biāo)準(zhǔn)差,worst 代表最大值(3 個(gè)最大值的平均值)。每張圖像都計(jì)算了相應(yīng)的特征,得出了這 30 個(gè)特征值(不包括 ID 字段和分類標(biāo)識(shí)結(jié)果字段 diagnosis),實(shí)際上是 10 個(gè)特征值(radius、texture、perimeter、area、smoothness、compactness、concavity、concave points、symmetry 和 fractal_dimension_mean)的 3 個(gè)維度,平均、標(biāo)準(zhǔn)差和最大值。這些特征值都保留了 4 位數(shù)字。字段中沒有缺失的值。在 569 個(gè)患者中,一共有 357 個(gè)是良性,212 個(gè)是惡性。
6.2.2 項(xiàng)目執(zhí)行流程
在這里插入圖片描述首先我們需要加載數(shù)據(jù)源;
在準(zhǔn)備階段,需要對(duì)加載的數(shù)據(jù)源進(jìn)行探索,查看樣本特征和特征值,這個(gè)過程你也可以使用數(shù)據(jù)可視化,它可以方便我們對(duì)數(shù)據(jù)及數(shù)據(jù)之間的關(guān)系進(jìn)一步加深了解。然后按照“完全合一”的準(zhǔn)則來(lái)評(píng)估數(shù)據(jù)的質(zhì)量,如果數(shù)據(jù)質(zhì)量不高就需要做數(shù)據(jù)清洗。數(shù)據(jù)清洗之后,你可以做特征選擇,方便后續(xù)的模型訓(xùn)練;
在分類階段,選擇核函數(shù)進(jìn)行訓(xùn)練,如果不知道數(shù)據(jù)是否為線性,可以考慮使用 SVC(kernel=‘rbf’) ,也就是高斯核函數(shù)的 SVM 分類器。然后對(duì)訓(xùn)練好的模型用測(cè)試集進(jìn)行評(píng)估。
下面,我們編寫一下吧:在導(dǎo)入數(shù)據(jù)集之前,你需要用到這些包:
import numpy as np import pandas as pdimport matplotlib.pyplot as plt import seaborn as snsfrom sklearn.svm import SVC, LinearSVC from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.metrics import accuracy_score導(dǎo)入數(shù)據(jù)集
# 加載數(shù)據(jù)集,你需要把數(shù)據(jù)放到目錄中 data = pd.read_csv("./data.csv") # 數(shù)據(jù)探索 # 因?yàn)閿?shù)據(jù)集中列比較多,我們需要把dataframe中的列全部顯示出來(lái) pd.set_option('display.max_columns', None) print(data.columns) print(data.head(5)) print(data.describe())# 結(jié)果如下 Index(['id', 'diagnosis', 'radius_mean', 'texture_mean', 'perimeter_mean','area_mean', 'smoothness_mean', 'compactness_mean', 'concavity_mean','concave points_mean', 'symmetry_mean', 'fractal_dimension_mean','radius_se', 'texture_se', 'perimeter_se', 'area_se', 'smoothness_se','compactness_se', 'concavity_se', 'concave points_se', 'symmetry_se','fractal_dimension_se', 'radius_worst', 'texture_worst','perimeter_worst', 'area_worst', 'smoothness_worst','compactness_worst', 'concavity_worst', 'concave points_worst','symmetry_worst', 'fractal_dimension_worst'],dtype='object')id diagnosis radius_mean texture_mean perimeter_mean area_mean \ 0 842302 M 17.99 10.38 122.80 1001.0 1 842517 M 20.57 17.77 132.90 1326.0 2 84300903 M 19.69 21.25 130.00 1203.0 3 84348301 M 11.42 20.38 77.58 386.1 4 84358402 M 20.29 14.34 135.10 1297.0接下來(lái),數(shù)據(jù)清洗
★運(yùn)行結(jié)果中,你能看到 32 個(gè)字段里,id 是沒有實(shí)際含義的,可以去掉。diagnosis 字段的取值為 B 或者 M,我們可以用 0 和 1 來(lái)替代。另外其余的 30 個(gè)字段,其實(shí)可以分成三組字段,下劃線后面的 mean、se 和 worst 代表了每組字段不同的度量方式,分別是平均值、標(biāo)準(zhǔn)差和最大值。
”代碼如下:
# 將特征字段分成3組 features_mean= list(data.columns[2:12]) features_se= list(data.columns[12:22]) features_worst=list(data.columns[22:32]) # 數(shù)據(jù)清洗 # ID列沒有用,刪除該列 data.drop("id",axis=1,inplace=True) # 將B良性替換為0,M惡性替換為1 data['diagnosis']=data['diagnosis'].map({'M':1,'B':0})然后我們要做特征字段的篩選,首先需要觀察下 features_mean 各變量之間的關(guān)系,這里我們可以用 DataFrame 的 corr() 函數(shù),然后用熱力圖幫我們可視化呈現(xiàn)。同樣,我們也會(huì)看整體良性、惡性腫瘤的診斷情況。
# 將腫瘤診斷結(jié)果可視化 sns.countplot(data['diagnosis'],label="Count") plt.show() # 用熱力圖呈現(xiàn)features_mean字段之間的相關(guān)性 corr = data[features_mean].corr() plt.figure(figsize=(14,14)) # annot=True顯示每個(gè)方格的數(shù)據(jù) sns.heatmap(corr, annot=True) plt.show()這是運(yùn)行的結(jié)果:熱力圖中對(duì)角線上的為單變量自身的相關(guān)系數(shù)是 1。顏色越淺代表相關(guān)性越大。所以你能看出來(lái) radius_mean、perimeter_mean 和 area_mean 相關(guān)性非常大,compactness_mean、concavity_mean、concave_points_mean 這三個(gè)字段也是相關(guān)的,因此我們可以取其中的一個(gè)作為代表。
那么如何進(jìn)行特征選擇呢?
特征選擇的目的是降維,用少量的特征代表數(shù)據(jù)的特性,這樣也可以增強(qiáng)分類器的泛化能力,避免數(shù)據(jù)過擬合。我們能看到 mean、se 和 worst 這三組特征是對(duì)同一組內(nèi)容的不同度量方式,我們可以保留 mean 這組特征,在特征選擇中忽略掉 se 和 worst。同時(shí)我們能看到 mean 這組特征中,radius_mean、perimeter_mean、area_mean 這三個(gè)屬性相關(guān)性大,compactness_mean、daconcavity_mean、concave points_mean 這三個(gè)屬性相關(guān)性大。我們分別從這 2 類中選擇 1 個(gè)屬性作為代表,比如 radius_mean 和 compactness_mean。
這樣我們就可以把原來(lái)的 10 個(gè)屬性縮減為 6 個(gè)屬性,代碼如下:
# 特征選擇 features_remain = ['radius_mean','texture_mean', 'smoothness_mean','compactness_mean','symmetry_mean', 'fractal_dimension_mean']對(duì)特征進(jìn)行選擇之后,我們就可以準(zhǔn)備訓(xùn)練集和測(cè)試集:
# 抽取30%的數(shù)據(jù)作為測(cè)試集,其余作為訓(xùn)練集 train, test = train_test_split(data, test_size = 0.3)# in this our main data is splitted into train and test # 抽取特征選擇的數(shù)值作為訓(xùn)練和測(cè)試數(shù)據(jù) train_X = train[features_remain] train_y=train['diagnosis'] test_X= test[features_remain] test_y =test['diagnosis']在訓(xùn)練之前,我們需要對(duì)數(shù)據(jù)進(jìn)行規(guī)范化,這樣讓數(shù)據(jù)同在同一個(gè)量級(jí)上,避免因?yàn)榫S度問題造成數(shù)據(jù)誤差:
# 采用Z-Score規(guī)范化數(shù)據(jù),保證每個(gè)特征維度的數(shù)據(jù)均值為0,方差為1 ss = StandardScaler() train_X = ss.fit_transform(train_X) test_X = ss.transform(test_X)最后我們可以讓 SVM 做訓(xùn)練和預(yù)測(cè)了:
# 創(chuàng)建SVM分類器 model = svm.SVC() # 用訓(xùn)練集做訓(xùn)練 model.fit(train_X,train_y) # 用測(cè)試集做預(yù)測(cè) prediction=model.predict(test_X) print('準(zhǔn)確率: ', metrics.accuracy_score(prediction,test_y))# 運(yùn)行結(jié)果 準(zhǔn)確率: 0.9181286549707602從上面來(lái)看,準(zhǔn)確率還可以, 你可以嘗試用所有的特征進(jìn)行計(jì)算,也可以嘗試換成線性可分支持向量機(jī)試試吧。
7. 總結(jié)
到這終于寫完了支持向量機(jī), 我的天啊,沒想到這么多,趕緊來(lái)總結(jié)一下吧。今天我們從支持向量機(jī)的原理出發(fā),通過小練習(xí)得到了超平面的初識(shí),然后介紹了間隔和三種支持向量機(jī),每一種支持向量機(jī)都針對(duì)不同的數(shù)據(jù)集訓(xùn)練出來(lái)的,并且背后都隱藏著很高深的數(shù)學(xué)推導(dǎo)。這一塊數(shù)學(xué)知識(shí)很多,我都沒有講,只講了大體上應(yīng)該怎么算,詳細(xì)過程我下面的鏈接里面都有,感興趣的自行查看。
然后又介紹了向量機(jī)處理多分類的情況,兩種方法一對(duì)一和一對(duì)多。
最后,理解了向量機(jī)的原理之后,利用sklearn實(shí)現(xiàn)了支持向量機(jī),并拿來(lái)做了一個(gè)乳腺癌檢測(cè)的例子。
希望通過今天的學(xué)習(xí)同樣能夠讓你收獲滿滿!加油吧!
參考:
http://note.youdao.com/noteshare?id=643e2e951d12826c31be515d9bcc5cc2&sub=FDE2B3547BB74A2B901D47177FA1DA3E
http://note.youdao.com/noteshare?id=646c827fb51e067cb70d19f8b9a15cce&sub=D215BB1FE25D461D81027EA7C40FB7B8
https://blog.csdn.net/b285795298/article/details/81977271
http://note.youdao.com/noteshare?id=dd8506ca4fdf4a3d68757f985dfbb8e8&sub=4401DBD7C07C4D8C883F997B92563591
http://note.youdao.com/noteshare?id=d50add1394ad30ed2ce4438a93a38ffd&sub=1D7BA8DE2F354111A7B3D58E7FBC7F84
https://www.jiqizhixin.com/articles/2018-10-17-20
個(gè)人公眾號(hào):AI蝸牛車
保持謙遜、保持自律、保持進(jìn)步往期精彩回顧適合初學(xué)者入門人工智能的路線及資料下載機(jī)器學(xué)習(xí)在線手冊(cè)深度學(xué)習(xí)在線手冊(cè)AI基礎(chǔ)下載(pdf更新到25集)本站qq群1003271085,加入微信群請(qǐng)回復(fù)“加群”獲取一折本站知識(shí)星球優(yōu)惠券,請(qǐng)回復(fù)“知識(shí)星球”喜歡文章,點(diǎn)個(gè)在看總結(jié)
以上是生活随笔為你收集整理的【白话机器学习】算法理论+实战之支持向量机(SVM)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 总结和展望:情感分析研究的新视野
- 下一篇: 【白话机器学习】算法理论+实战之朴素贝叶