目錄
1. 支持向量機理論
支持向量機(Support Vector Machine:SVM)
支持向量機的目的是什麼?
利用訓練數據集的間隔最大化找到一個最優分離超平面
你可能有兩個名詞不太懂,間隔?分離超平面?
別緊張,沒有人剛開始學習SVM的時候就知道這兩個東西
先來看個例子,現在有一些人的身高和體重數據,將它們繪製成散點圖,是這樣的:
如果現在給你一個未知男女的身高和體重,你能分辨出性別嗎?
這個簡單,我直接將已知的點劃分爲兩部分,這個點落在哪一部分就對應相應的性別
ok,那就可以畫一條直線,直線以上是男生,直線以下是女生
問題來了,現在這個是一個二維平面,我們可以畫直線,如果是三維的呢?該怎麼畫?
小時候就學過,一維平面是點,二維平面是線,三維平面是面
對的,那麼注意,今天的第一個概念:
超平面是平面的一般化:
- 在一維的平面中,它是點
- 在二維的平面中,它是線
- 在三維的平面中,它是面
在更高的維度中,我們稱之爲超平面
爲了大家更快的適應超平面這種說法,後面的直線、平面都直接叫超平面了
繼續剛纔的問題,我們剛纔是通過一個分離超平面分出了男和女,這個超平面唯一嗎?
很明顯,並不唯一,這樣的超平面有若干個
那麼問題來了,既然有若干個,那我肯定要最好的,這裏最好的叫最優分離超平面
如何在衆多分離超平面中選擇一個最優分離超平面?
下面這兩個分離超平面,你選哪個?綠色的還是黑色的?
對,當然是黑色的。
黑色的我懂,可是原理是什麼?
很簡單,原理有兩個,分別是:
- 正確的對訓練數據進行分類
- 對未知數據也能很好的分類
黑色的分離超平面能夠對訓練數據很好的分類,當新增未知數據時,黑色的分離超平面泛化能力也強於綠色。
深究一下,爲什麼黑色的要強於綠色?原理又是什麼?
其實很簡單:最優分離超平面其實是和兩側樣本點有關,而且只和這些點有關。
怎麼理解這句話呢,我們看張圖:
其中當間隔達到最大,兩側樣本點的距離相等的超平面爲最優分離超平面。
注意,今天的第二個概念:
對應上圖,Margin對應的就是最優分離超平面的間隔,此時的間隔達到最大
一般來說,間隔中間是無點區域,裏面不會有任何點(理想狀態下)
給定一個超平面,我們可以就算出這個超平面與和它最接近的數據點之間的距離。那麼間隔(Margin)就是二倍的這個距離
我還是不理解爲什麼這個分離超平面就是最優分離超平面
那你在看這張圖
在這張圖裏面間隔MarginB小於上張圖的MarginA
當出現新的未知點,MarginB分離超平面的泛化能力不如Margin
你可能不理解泛化能力這個詞,那換個說法:當出現未知點時,用MarginB的分離超平面去分類,錯誤率大於MarginA
總結一下
支持向量機是爲了通過間隔最大化找到一個最優分離超平面
而之所以叫做支持向量,是因爲在決定分離超平面的時候,只有極限位置的那兩個點有用,其他點根本沒有大作用,因爲只要極限位置離得超平面的距離最大,就是最優的分離超平面了。
怎麼樣,一口氣學了這麼多,甚至還了解了SVM的深奧意義,是不是有點點小激動?
趁着現在還激動想一個問題:如何確定最大化間隔?
2. 如何確定最大化間隔
如果我們能夠確定兩個平行超平面,那麼兩個超平面之間的最大距離就是最大化間隔。
看個圖你就都明白了:
左右兩個平行超平面將數據完美的分開,我們只需要計算上述兩個平行超平面的距離即可。
所以,我們找到最大化間隔:
- 找到兩個平行超平面,可以劃分數據集並且兩平面之間沒有數據點
- 最大化上述兩個超平面
2.1. 確定兩個平行超平面
怎麼確定兩個平行超平面?
我們知道一條直線的數學方程是:y-ax+b=0,而超平面會被定義成類似的形式:
超平面的方程中,加粗的字體w、x表示向量,表示向量的內積。
這個我覺得應該不用多說了,平面方程公式,默認都懂哈
推廣到n維空間,則超平面方程中的w、x分別爲:
等等,還有一個問題,如何確保兩超平面之間沒有數據點?
我們的目的是通過兩個平行超平面對數據進行分類,那我們可以這樣定義兩個超平面:
對於每一個向量xi:滿足:
或者
也就是這張圖:
所有的紅點都是1類,所有的藍點都是−1類。
整理一下上面的兩個超平面:
不等式兩邊同時乘以 yi,-1類的超平面yi=-1,要改變不等式符號,合併後得
ok,記住上面的約束條件。
2.2. 確定間隔
如何求兩個平行超平面的間隔呢?
我們可以先做這樣一個假設:
- 是滿足約束的超平面
- 是滿足約束的超平面
- 是上的一點
則x0到平面h1的垂直距離m就是我們要的間隔。
這個間隔是可以通過計算算出來的,推導還需要一些步驟,直接放結果了就:
其中||w||表示w的二範數,求所有元素的平方和,然後在開方。比如,二維平面下:
可以發現,w 的模越小,間隔m 越大
2.3. 確定目標
我們的間隔最大化,最後就成了這樣一個問題:
了其中w和b,我們的最優分離超平面就確定了,目的也就達到了
上面的最優超平面問題是一個凸優化問題,可以轉換成了拉格朗日的對偶問題,判斷是否滿足KKT條件,然後求解
上一句話包含的知識是整個SVM的核心,涉及到大量的公式推導。
但是既然是大話系列,那麼涉及到推導的東西我們就略過了,你只需要知道它的目的就是爲了找出一個最優分離超平面
就假設我們已經解出了最大間隔,找到了最優分離超平面,它是這樣的:
ok,那我們的支持向量機的原理就說完了。
除去上面我們對最大間隔的推導計算,剩下的部分其實是不難理解的。
從上面過程,我們可以發現,其實最終分類超平面的確定依賴於部分極限位置的樣本點,這叫做支持向量。
由於支持向量在確定分離超平面中起着決定性作用,所有將這類模型叫做支持向量機
我們在上面圖中的點都是線性可分的,也就是一條線(或一個超平面)可以很容易的分開的
但是實際情況不都是這樣,比如有的女生身高比男生高,有的男生體重比女生都輕
像這種存在噪聲點分類,應該怎麼處理?
3. 針對樣本的SVM
3.1. 硬間隔線性支持向量機
上面例子中提到的樣本點都是線性可分的,我們就可以通過分類將樣本點完全分類準確,不存在分類錯誤的情況
,這種叫硬間隔,這類模型叫做硬間隔線性SVM
3.2. 軟間隔線性支持向量機
同樣的,可以通過分類將樣本點不完全分類準確,存在少部分分類錯誤的情況
,這叫軟間隔,這類模型叫做軟間隔線性SVM
不一樣的是,因爲有分類錯誤的樣本點,但我們仍需要將錯誤降至最低,所有需要添加一個懲罰項來進行浮動,所有此時求解的最大間隔就變成了這樣:
3.3. 非線性支持向量機
硬間隔和軟間隔都是對線性可分的樣本點進行分類,那如果樣本點本身就不線性可分?
舉個例子:下面這幅圖
樣本點並不是線性可分的,這種問題應該怎麼處理呢?
解決這個問題之前,先看一下這個小短視頻:
SVM with polynomial kernel 可視化
視頻中是將平面中的樣本點映射到三維空間中,使用一個平面將樣本線性可分
所以我們需要一種方法,可以將樣本從原始空間映射到一個更高緯的空間中,使得樣本在新的空間中線性可分。這,叫核函數
在非線性SVM中,核函數的選擇關係到SVM的分類效果。
幸好的是,我們有多種核函數:線性核函數、多項式核函數、高斯核函數、sigmoid核函數等等,甚至你還可以將這些核函數進行組合,以達到最優線性可分的效果
核函數瞭解到應該就差不多了,具體的實現我們在下一節的實戰再說
4. 多分類支持向量機
還有最後一個問題:多分類
我們前面提到的所有例子最終都指向了二分類,現實中可不止有二分類,更多的是多分類問題
那麼多分類應該怎麼分呢?
有兩種方法:一對多和一對一
4.1. 一對多法
一對多法講究的是將所有的分類分成兩類:一類只包含一個分類,另一類包含剩下的所有分類
舉個例子:現在有A、B、C、D四種分類,根據一對多法可以這樣分:
- ①:樣本A作爲正集,B、C、D爲負集
- ②:樣本B作爲正集,A、C、D爲負集
- ③:樣本C作爲正集,A、B、D爲負集
- ④:樣本D作爲正集,A、B、C爲負集
4.2. 一對一法
一對一法講究的是從所有分類中只取出兩類,一個爲正類一個爲父類
再舉個例子:現在有A、B、C三種分類,根據一對一法可以這樣分:
- ①分類器:樣本A、B
- ②分類器:樣本A、C
- ③分類器:樣本B、C
可以看到,兩種方法各有優缺點,具體的直接看思維導圖(文末)
5. 實戰之前你還需瞭解這些
我們知道針對樣本有線性SVM和非線性SVM
同樣的在sklearn 中提供的這兩種的實現,分別是:LinearSVC和SVC
SVC?不應該時SVM嗎?
SVC:Support Vector Classification 用作處理分類問題
那是不是意味着還可以處理迴歸問題?
是的,沒錯。但我們常用SVM來做分類問題
處理迴歸問題會用到LinearSVR和SVR(R代表Regression)
SVC和LinearSVC
LinearSVC是線性分類器,用於處理線性分類的數據,且只能使用線性核函數
SVC是非線性分類器,即可以使用線性核函數進行線性劃分,也可以使用高維核函數進行非線性劃分
SVM的使用
在sklearn 中,同樣還是一句話調用SVM
from sklearn import svm
如何創建SVM分類器呢?
主要說一下SVC的創建,因爲它的參數比較重要
model = svm.SVC(kernel='rbf', C=1.0, gamma=0.001)
分別解釋一下三個重要參數:
- kernel代表核函數的選擇,有四種選擇,默認rbf(即高斯核函數)
- 參數C代表目標函數的懲罰係數,默認情況下爲 1.0
- 參數gamma代表核函數的係數,默認爲樣本特徵數的倒數
其中kernel代表的四種核函數分別是:
- linear:線性核函數,在數據線性可分的情況下使用的
- poly:多項式核函數,可以將數據從低維空間映射到高維空間
- rbf:高斯核函數,同樣可以將樣本映射到高維空間,但所需的參數較少,通常性能不錯
- sigmoid:sigmoid核函數,常用在神經網絡的映射中
SVM的使用就介紹這麼多,來實戰測試一下
6. 實戰項目
6.1. 數據集
SVM的經典數據集:乳腺癌診斷
醫療人員採集了患者乳腺腫塊經過細針穿刺 (FNA) 後的數字化圖像,並且對這些數字圖像進行了特徵提取,這些特徵可以描述圖像中的細胞核呈現。通過這些特徵可以將腫瘤分成良性和惡性
本次數據一共569條、32個字段,先來看一下具體數據字段吧
其中mean結尾的代表平均值、se結尾的代表標準差、worst結尾代表最壞值(這裏具體指腫瘤的特徵最大值)
所有其實主要有10個特徵字段,一個id字段,一個預測類別字段
我們的目的是通過給出的特徵字段來預測腫瘤是良性還是惡性
準備好了嗎?3,2,1 開始
6.2. 數據EDA
EDA:Exploratory Data Analysis探索性數據分析
先來看數據分佈情況
一共569條、32個字段
32個字段中1個object類型,一個int型id,剩下的都是float 類型。
另外:數據中不存在缺失值
大膽猜測一下,object類型可能是類別型數據,即最終的預測類型,需要進行處理,先記下
再來看連續型數據的統計數據:
好像也沒啥問題(其實因爲這個數據本身比較規整)
那直接開始特徵工程吧
6.3. 特徵工程
首先就是將類別數據連續化
再來觀察每一個特徵的三個指標:均值、標準差和最大值。
優先選擇均值,最能體現該指特徵的整體情況
現在還有十個特徵,我們通過熱力圖來看一下特徵之間的關係
# 熱力圖查看特徵之間的關係
sns.heatmap(df_data[df_data_X.columns].corr(), linewidths=0.1, vmax=1.0, square=True,
cmap=sns.color_palette('RdBu', n_colors=256),
linecolor='white', annot=True)
plt.title('the feature of corr')
plt.show()
熱力圖是這樣的:
我們發現radius_mean、perimeter_mean和area_mean這三個特徵強相關,那我們只保留一個就行了
這裏保留熱力圖裏面得分最高的perimeter_mean
最後一步
因爲是連續數值,最好對其進行標準化
標準化之後的數據是這樣的:
6.4. 訓練模型
上面已經做好了特徵工程,我們直接塞進模型看看效果怎麼樣
因爲並不知道數據樣本到底是否線性可分,所有我們都來試一下兩種算法
先來看看LinearSVC 的效果
效果很好,簡直好的不行
這個準確率就不要糾結了,後面真正做實際案例的時候再糾結準確率吧
ok,還有SVC的效果
因爲SVC需要設置參數,直接通過網格搜索讓機器自己找到最優參數
效果更好,小一我一時都驚呆了
可以看出,最終模型還是選擇rbf高斯核函數,果然實至名歸
好了,今天的項目就到這了
主要是通過數據EDA+特徵工程完成了數據方面的工作,然後通過交叉驗證+網格搜索確定了最優模型和最優參數
7. 寫在後面的話
DataWhale四月學習的最後一個算法,其實SVM自己之前就看過,也寫了相應的筆記,所以總結起來就比較遊刃有餘。
如果看了前幾篇文章的同學應該會發現現在總結還有點早,因爲第四篇就是一個湊數的,那個,其實我還在寫,寫完了會及時更上來的。
第四篇本來是關於條件隨機場的內容,結果我發現HMM自己還不是很懂,於是,第四篇就成了HMM算法了,等到HMM寫完我會繼續更上條件隨機場這一節的。
算法學起來確實很吃力,不過一個算法+一個項目的學,應該會比單純推算法有意思些,也會有成就感些。
我是小一,第一步的一,我們下節見!
對了,思維導圖奉上: