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