【机器学习基础】一文详尽之支持向量机(SVM)算法!
?Datawhale干貨?
作者:小一,Datawhale優(yōu)秀學(xué)習(xí)者
寄語:本文介紹了SVM的理論,細致說明了“間隔”和“超平面”兩個概念;隨后,闡述了如何最大化間隔并區(qū)分了軟硬間隔SVM;同時,介紹了SVC問題的應(yīng)用。最后,用SVM乳腺癌診斷經(jīng)典數(shù)據(jù)集,對SVM進行了深入的理解。
支持向量機(support vector machines, SVM)是一種二分類模型,它的基本模型是定義在特征空間上的間隔最大的線性分類器,間隔最大使它有別于感知機。
SVM的的學(xué)習(xí)策略就是間隔最大化,可形式化為一個求解凸二次規(guī)劃的問題,也等價于正則化的合頁損失函數(shù)的最小化問題。SVM的的學(xué)習(xí)算法就是求解凸二次規(guī)劃的最優(yōu)化算法。
下圖為SVM的分類效果顯示,可以發(fā)現(xiàn),不管是線性還是非線性,SVM均表現(xiàn)良好。
學(xué)習(xí)框架
后臺回復(fù) SVM 可下載SVM學(xué)習(xí)框架高清導(dǎo)圖
SVM理論
支持向量機(Support Vector Machine:SVM)的目的是用訓(xùn)練數(shù)據(jù)集的間隔最大化找到一個最優(yōu)分離超平面。
下邊用一個例子來理解下間隔和分離超平面兩個概念。現(xiàn)在有一些人的身高和體重數(shù)據(jù),將它們繪制成散點圖,是這樣的:
如果現(xiàn)在給你一個未知男女的身高和體重,你能分辨出性別嗎?直接將已知的點劃分為兩部分,這個點落在哪一部分就對應(yīng)相應(yīng)的性別。那就可以畫一條直線,直線以上是男生,直線以下是女生。
問題來了,現(xiàn)在這個是一個二維平面,可以畫直線,如果是三維的呢?該怎么畫?我們知道一維平面是點,二維平面是線,三維平面是面。
對的,那么注意,今天的第一個概念:超平面是平面的一般化:
在一維的平面中,它是點
在二維的平面中,它是線
在三維的平面中,它是面
在更高的維度中,我們稱之為超平面
注意:后面的直線、平面都直接叫超平面了。
繼續(xù)剛才的問題,我們剛才是通過一個分離超平面分出了男和女,這個超平面唯一嗎?很明顯,并不唯一,這樣的超平面有若干個。
那么問題來了,既然有若干個,那肯定要最好的,這里最好的叫最優(yōu)分離超平面。如何在眾多分離超平面中選擇一個最優(yōu)分離超平面?下面這兩個分離超平面,你選哪個?綠色的還是黑色的?
對,當(dāng)然是黑色的,可是原理是什么?很簡單,原理有兩個,分別是:
正確的對訓(xùn)練數(shù)據(jù)進行分類
對未知數(shù)據(jù)也能很好的分類
黑色的分離超平面能夠?qū)τ?xùn)練數(shù)據(jù)很好的分類,當(dāng)新增未知數(shù)據(jù)時,黑色的分離超平面泛化能力也強于綠色。深究一下,為什么黑色的要強于綠色?原理又是什么?
其實很簡單:最優(yōu)分離超平面其實是和兩側(cè)樣本點有關(guān),而且只和這些點有關(guān)。怎么理解這句話呢,我們看張圖:
其中當(dāng)間隔達到最大,兩側(cè)樣本點的距離相等的超平面為最優(yōu)分離超平面。注意,今天的第二個概念:對應(yīng)上圖,Margin對應(yīng)的就是最優(yōu)分離超平面的間隔,此時的間隔達到最大。
一般來說,間隔中間是無點區(qū)域,里面不會有任何點(理想狀態(tài)下)。給定一個超平面,我們可以就算出這個超平面與和它最接近的數(shù)據(jù)點之間的距離。那么間隔(Margin)就是二倍的這個距離。
如果還是不理解為什么這個分離超平面就是最優(yōu)分離超平面,那你在看這張圖。
在這張圖里面間隔MarginB小于上張圖的MarginA。當(dāng)出現(xiàn)新的未知點,MarginB分離超平面的泛化能力不如MarginA,用MarginB的分離超平面去分類,錯誤率大于MarginA
總結(jié)一下
支持向量機是為了通過間隔最大化找到一個最優(yōu)分離超平面。在決定分離超平面的時候,只有極限位置的那兩個點有用,其他點根本沒有大作用,因為只要極限位置離得超平面的距離最大,就是最優(yōu)的分離超平面了。?
如何確定最大化間隔
如果我們能夠確定兩個平行超平面,那么兩個超平面之間的最大距離就是最大化間隔。看個圖你就都明白了:
左右兩個平行超平面將數(shù)據(jù)完美的分開,我們只需要計算上述兩個平行超平面的距離即可。所以,我們找到最大化間隔:
找到兩個平行超平面,可以劃分數(shù)據(jù)集并且兩平面之間沒有數(shù)據(jù)點
最大化上述兩個超平面
1. 確定兩個平行超平面
怎么確定兩個平行超平面?我們知道一條直線的數(shù)學(xué)方程是:y-ax+b=0,而超平面會被定義成類似的形式:
推廣到n維空間,則超平面方程中的w、x分別為:
如何確保兩超平面之間沒有數(shù)據(jù)點?我們的目的是通過兩個平行超平面對數(shù)據(jù)進行分類,那我們可以這樣定義兩個超平面。
對于每一個向量xi:滿足:
屬于類別
或者
屬于類別
也就是這張圖:所有的紅點都是1類,所有的藍點都是?1類。
整理一下上面的兩個超平面:
屬于類別
屬于類別
不等式兩邊同時乘以 yi,-1類的超平面yi=-1,要改變不等式符號,合并后得
ok,記住上面的約束條件。
2. 確定間隔
如何求兩個平行超平面的間隔呢?我們可以先做這樣一個假設(shè):
?是滿足約束 的超平面
是滿足約束的超平面
是上的一點
則到平面的垂直距離就是我們要的間隔。
這個間隔是可以通過計算出來的,推導(dǎo)還需要一些步驟,直接放結(jié)果了就:
其中||w||表示w的二范數(shù),求所有元素的平方和,然后在開方。比如,二維平面下:
可以發(fā)現(xiàn),w 的模越小,間隔m 越大
3. 確定目標
我們的間隔最大化,最后就成了這樣一個問題:
找到使最小的
了其中w和b,我們的最優(yōu)分離超平面就確定了,目的也就達到了。
上面的最優(yōu)超平面問題是一個凸優(yōu)化問題,可以轉(zhuǎn)換成了拉格朗日的對偶問題,判斷是否滿足KKT條件,然后求解。上一句話包含的知識是整個SVM的核心,涉及到大量的公式推導(dǎo)。
此處略過推導(dǎo)的步驟,若想了解推導(dǎo)過程可直接百度。你只需要知道它的目的就是為了找出一個最優(yōu)分離超平面。就假設(shè)我們已經(jīng)解出了最大間隔,找到了最優(yōu)分離超平面,它是這樣的:
除去上面我們對最大間隔的推導(dǎo)計算,剩下的部分其實是不難理解的。從上面過程,我們可以發(fā)現(xiàn),其實最終分類超平面的確定依賴于部分極限位置的樣本點,這叫做支持向量。
由于支持向量在確定分離超平面中起著決定性作用,所有將這類模型叫做支持向量機。
我們在上面圖中的點都是線性可分的,也就是一條線(或一個超平面)可以很容易的分開的。但是實際情況不都是這樣,比如有的女生身高比男生高,有的男生體重比女生都輕,像這種存在噪聲點分類,應(yīng)該怎么處理?
針對樣本的SVM
1. 硬間隔線性SVM
上面例子中提到的樣本點都是線性可分的,我們就可以通過分類將樣本點完全分類準確,不存在分類錯誤的情況,這種叫硬間隔,這類模型叫做硬間隔線性SVM。
2. 軟間隔線性SVM
同樣的,可以通過分類將樣本點不完全分類準確,存在少部分分類錯誤的情況,這叫軟間隔,這類模型叫做軟間隔線性SVM。
不一樣的是,因為有分類錯誤的樣本點,但我們?nèi)孕枰獙㈠e誤降至最低,所有需要添加一個懲罰項來進行浮動,所有此時求解的最大間隔就變成了這樣:
硬間隔和軟間隔都是對線性可分的樣本點進行分類,那如果樣本點本身就不線性可分?舉個例子:下面這幅圖
樣本點并不是線性可分的,這種問題應(yīng)該怎么處理呢?解決這個問題之前,先看一下這個小短視頻:
視頻中是將平面中的樣本點映射到三維空間中,使用一個平面將樣本線性可分。
所以我們需要一種方法,可以將樣本從原始空間映射到一個更高緯的空間中,使得樣本在新的空間中線性可分,即:核函數(shù)。在非線性SVM中,核函數(shù)的選擇關(guān)系到SVM的分類效果。
幸好的是,我們有多種核函數(shù):線性核函數(shù)、多項式核函數(shù)、高斯核函數(shù)、sigmoid核函數(shù)等等,甚至你還可以將這些核函數(shù)進行組合,以達到最優(yōu)線性可分的效果
核函數(shù)了解到應(yīng)該就差不多了,具體的實現(xiàn)我們在下一節(jié)的實戰(zhàn)再說。
多分類SVM
前面提到的所有例子最終都指向了二分類,現(xiàn)實中可不止有二分類,更多的是多分類問題。那么多分類應(yīng)該怎么分呢?有兩種方法:一對多和一對一。
1. 一對多法
一對多法講究的是將所有的分類分成兩類:一類只包含一個分類,另一類包含剩下的所有分類
舉個例子:現(xiàn)在有A、B、C、D四種分類,根據(jù)一對多法可以這樣分:
①:樣本A作為正集,B、C、D為負集
②:樣本B作為正集,A、C、D為負集
③:樣本C作為正集,A、B、D為負集
④:樣本D作為正集,A、B、C為負集
該方法分類速度較快,但訓(xùn)練速度較慢,添加新的分類,需要重新構(gòu)造分類器。
2. 一對一法
一對一法講究的是從所有分類中只取出兩類,一個為正類一個為父類
再舉個例子:現(xiàn)在有A、B、C三種分類,根據(jù)一對一法可以這樣分:
①分類器:樣本A、B
②分類器:樣本A、C
③分類器:樣本B、C
該方法的優(yōu)點是:當(dāng)新增一類時,只需要訓(xùn)練與該類相關(guān)的分類器即可,訓(xùn)練速度較快。缺點是:當(dāng)類的種類K很多時,分類器個數(shù)K(K-1)/2會很多,訓(xùn)練和測試時間較慢。
SVC,Support Vector Classification
我們知道針對樣本有線性SVM和非線性SVM。同樣的在sklearn中提供的這兩種的實現(xiàn),分別是:LinearSVC和SVC。
SVC : Support Vector Classification 用支持向量機處理分類問題
SVR : Support Vector Regression ? ?用支持向量機處理回歸問題
1. SVC和LinearSVC
LinearSVC是線性分類器,用于處理線性分類的數(shù)據(jù),且只能使用線性核函數(shù)。SVC是非線性分類器,即可以使用線性核函數(shù)進行線性劃分,也可以使用高維核函數(shù)進行非線性劃分。
2. SVM的使用
在sklearn 中,一句話調(diào)用SVM,
from sklearn import svm主要說一下SVC的創(chuàng)建,因為它的參數(shù)比較重要
model = svm.SVC(kernel='rbf', C=1.0, gamma=0.001) 分別解釋一下三個重要參數(shù):kernel代表核函數(shù)的選擇,有四種選擇,默認rbf(即高斯核函數(shù))
參數(shù)C代表目標函數(shù)的懲罰系數(shù),默認情況下為 1.0
參數(shù)gamma代表核函數(shù)的系數(shù),默認為樣本特征數(shù)的倒數(shù)
其中kernel代表的四種核函數(shù)分別是:
linear:線性核函數(shù),在數(shù)據(jù)線性可分的情況下使用的
poly:多項式核函數(shù),可以將數(shù)據(jù)從低維空間映射到高維空間
rbf:高斯核函數(shù),同樣可以將樣本映射到高維空間,但所需的參數(shù)較少,通常性能不錯
sigmoid:sigmoid核函數(shù),常用在神經(jīng)網(wǎng)絡(luò)的映射中
SVM的使用就介紹這么多,來實戰(zhàn)測試一下。
經(jīng)典數(shù)據(jù)集實戰(zhàn)
1. 數(shù)據(jù)集
SVM的經(jīng)典數(shù)據(jù)集:乳腺癌診斷。醫(yī)療人員采集了患者乳腺腫塊經(jīng)過細針穿刺 (FNA) 后的數(shù)字化圖像,并且對這些數(shù)字圖像進行了特征提取,這些特征可以描述圖像中的細胞核呈現(xiàn)。通過這些特征可以將腫瘤分成良性和惡性。
本次數(shù)據(jù)一共569條、32個字段,先來看一下具體數(shù)據(jù)字段吧:
其中mean結(jié)尾的代表平均值、se結(jié)尾的代表標準差、worst結(jié)尾代表最壞值(這里具體指腫瘤的特征最大值)。所有其實主要有10個特征字段,一個id字段,一個預(yù)測類別字段。我們的目的是通過給出的特征字段來預(yù)測腫瘤是良性還是惡性。
2. 數(shù)據(jù)EDA
EDA:Exploratory Data Analysis探索性數(shù)據(jù)分析,先來看數(shù)據(jù)的分布情況:
df_data.info()一共569條、32個字段。32個字段中1個object類型,一個int型id,剩下的都是float 類型。另外:數(shù)據(jù)中不存在缺失值。
大膽猜測一下,object類型可能是類別型數(shù)據(jù),即最終的預(yù)測類型,需要進行處理,先記下。再來看連續(xù)型數(shù)據(jù)的統(tǒng)計數(shù)據(jù):
df_data.describe()好像也沒啥問題(其實因為這個數(shù)據(jù)本身比較規(guī)整),可直接開始特征工程吧。
3. 特征工程
首先就是將類別數(shù)據(jù)連續(xù)化
"""2. 類別特征向量化""" le = preprocessing.LabelEncoder() le.fit(df_data['diagnosis']) df_data['diagnosis'] = le.transform(df_data['diagnosis'])再來觀察每一個特征的三個指標:均值、標準差和最大值。優(yōu)先選擇均值,最能體現(xiàn)該指特征的整體情況。
現(xiàn)在還有十個特征,我們通過熱力圖來看一下特征之間的關(guān)系。
#熱力圖查看特征之間的關(guān)系 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()熱力圖是這樣的:
我們發(fā)現(xiàn)radius_mean、perimeter_mean和area_mean這三個特征強相關(guān),那我們只保留一個就行了。這里保留熱力圖里面得分最高的perimeter_mean。
最后一步,因為是連續(xù)數(shù)值,最好對其進行標準化。標準化之后的數(shù)據(jù)是這樣的:
?df_data_X?=?df_data_X.drop(['radius_mean',?'area_mean'],?axis=1) """5. 進行特征歸一化/縮放""" scaler = preprocessing.StandardScaler() df_data_X?=?scaler.fit_transform(df_data_X) return df_data_X, df_data_y4. 訓(xùn)練模型
上面已經(jīng)做好了特征工程,直接塞進模型看看效果怎么樣。因為并不知道數(shù)據(jù)樣本到底是否線性可分,所有我們都來試一下兩種算法。先來看看LinearSVC 的效果
"""1.1. 第一種模型驗證方法"""# 切分數(shù)據(jù)集X_train, X_test, y_train, y_test = train_test_split(data_X, data_y, test_size=0.2)# 創(chuàng)建SVM分類器model = svm.LinearSVC()# 用訓(xùn)練集做訓(xùn)練model.fit(X_train, y_train)# 用測試集做預(yù)測pred_label = model.predict(X_test)print('準確率: ', metrics.accuracy_score(pred_label, y_test))效果很好,簡直好的不行,在此,并沒有考慮準確率。
ok,還有SVC的效果。因為SVC需要設(shè)置參數(shù),直接通過網(wǎng)格搜索讓機器自己找到最優(yōu)參數(shù),效果更好。
"""2. 通過網(wǎng)格搜索尋找最優(yōu)參數(shù)"""parameters = {'gamma': np.linspace(0.0001, 0.1),'kernel': ['linear', 'poly', 'rbf', 'sigmoid'],}model = svm.SVC()grid_model = GridSearchCV(model, parameters, cv=10, return_train_score=True)grid_model.fit(X_train, y_train)# 用測試集做預(yù)測pred_label = grid_model.predict(X_test)print('準確率: ', metrics.accuracy_score(pred_label, y_test))# 輸出模型的最優(yōu)參數(shù)print(grid_model.best_params_)可以看出,最終模型還是選擇rbf高斯核函數(shù),果然實至名歸。主要是通過數(shù)據(jù)EDA+特征工程完成了數(shù)據(jù)方面的工作,然后通過交叉驗證+網(wǎng)格搜索確定了最優(yōu)模型和最優(yōu)參數(shù)。
總結(jié)
以上是生活随笔為你收集整理的【机器学习基础】一文详尽之支持向量机(SVM)算法!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【算法漫画】什么是红黑树?
- 下一篇: 算法工程师的效率神器——vim篇