9 机器学习 支持向量机
機器學習
1 支持向量機
1.1 介紹
支持向量機,Support Vector Machines(SVM),也稱為支持向量網絡。
支持向量機用于處理分類問題,最初主要用于處理二分類問題。
SVM本質是判別模型,與概率無關。
支持向量機分類:Hard-margin SVM,Soft-margin SVM 和 Kernel SVM。
1.2 原理
SVM有三寶,間隔 對偶 核技巧。
1.2.1 目標
先來看看下面這一組數據的分布,這是一組兩種標簽的數據,兩種標簽分別由圓和方塊代表。支持向量機的分類方法,是在這組分布中找出一個超平面作為決策邊界,使模型在數據上的分類誤差盡量接近于0,尤其是在未知數據集上的分類誤差盡量小。
1.2.2 超平面與決策邊界
在幾何中,超平面是一個空間的子空間,它是維度比所在空間小一維的空間。如果數據空間本身是三維的,則其超平面是二維平面,而如果數據空間本身是二維的,則其超平面是一維的直線。
在二分類問題中,如果一個超平面能夠將數據劃分為兩個集合,其中每個集合中包含單獨的一個類別,我們就說這個超平面是數據的“決策邊界”。
但是,對于一個數據集來說,讓訓練誤差為0的決策邊界可以有無數條。
1.2.3 決策邊界的邊際
在上圖基礎上,我們無法保證這條決策邊界在未知數據集(測試集)上的表現也會優秀。對于現有的數據集來說,我們有B1和B2兩條可能的決策邊界。我們可以把決策邊界B1向兩邊平移,直到碰到離這條決策邊界最近的方塊和圓圈后停下,形成兩個新的超平面,分別是b11和b12,并且我們將原始的決策邊界移動到b11和b12的中間,確保B1到b11和b12的距離相等。在b11和b12中間的距離,叫做B1這條決策邊界的邊際(margin),通常記作d。
為了簡便,我們稱b11和b12為“虛線超平面”,大家知道是這兩個超平面是由原來的決策邊界向兩邊移動,直到碰到距離原來的決策邊界最近的樣本后停下而形成的超平面就可以了。從圖中可以看出,與決策邊界接觸的樣本點相當于支撐(支持)著決策邊界,將決策邊界固定住。
對B2也執行同樣的操作,然后我們來對比一下兩個決策邊界。現在兩條決策邊界右邊的數據都被判斷為圓,左邊的數據都被判斷為方塊,兩條決策邊界在現在的數據集上的訓練誤差都是0,沒有一個樣本被分錯。
那么請思考,在測試集中,影響分類效果的因素是什么?
1.2.4 決策邊界的邊際對分類效果的影響
我們引入和原本的數據集相同分布的測試樣本(紅色所示),平面中的樣本變多了,此時我們可以發現,對于B1而言,依然沒有一個樣本被分錯,這條決策邊界上的泛化誤差也是0。但是對于B2而言,卻有三個方塊被誤人類成了圓,而有兩個圓被誤分類成了方塊,這條決策邊界上的泛化誤差就遠遠大于B1了。
這個例子表現出,擁有越大邊際的決策邊界,則在分類中的泛化誤差越小。如果邊際很小,則任何輕微擾動都會對決策邊界的分類產生很大的影響。邊際很小的情況,是一種模型在訓練集上表現很好,卻在測試集上表現糟糕的情況,出現“過擬合”問題。
所以我們在找尋決策邊界的時候,希望邊際越大越好。
1.2.5 支持向量機分類原理
支持向量機,是通過找出邊際最大的決策邊界,來對數據進行分類的分類器,因此支持向量分類器也稱為最大邊際分類器。
支持向量機的核心問題是如何找出邊際最大的決策邊界。
支持向量機的核心思想是從輸入空間(Input Space)向特征空間(Feature Space)的映射,在映射后的空間(即特征空間)中進行分類操作,在特征空間中,問題能夠簡化成線性可分的問題。
1.2.6 找出邊際最大的決策邊界
假設現在數據集中有N個訓練樣本,每個訓練樣本i可以表示為(xi,yi)(i=1,2,3…N),其中xi是的特征向量維度為二。二分類的標簽yi的取值為(1,-1)這兩類結果。接下來可視化我們的N個樣本數據的特征數據:紫色為一類,紅色為另一類。
我們讓所有紫色點的標簽為1,紅色點的標簽為-1。我們要在這個數據集上尋找一個決策邊界,在二維平面上,決策邊界(超平面)就是一條直線。二維平面上的任意一條線可以被表示為:
我們將表達式變換一下:等號左邊-等號右邊=0
其中[a, -1]就是我們的參數向量,X就是我們的特征向量,b是我們的截距。這個公式也線性回歸公式很像,但是線性回歸公式等號的左邊為我們預測出的結果,而現在的公式表示我們要找出我們的決策邊界。
如果在決策邊界上任意取兩個點xa和xb,并帶入決策邊界的表達式,則有:
將兩式相減,可以得到:
一個向量的轉至乘以另一個向量,可以獲得兩個向量的點積(dot product)。兩個向量的點積為0表示兩個向量的方向是互相垂直的。這是線性代數中的基礎結論!xa與xb是一條直線上的兩個點,相減后的得到的向量方向是由xa指向xb,所以xa-xb的方向是平行于他們所在的直線-》我們的決策邊界的。而w與xa-xb相互垂直,所以參數向量w的方向必然是垂直于我們的決策邊界。
此時我們就有了決策邊界(決策邊界上任意一點對應的y值為0)。圖中任意一個紫色的點 x p x_p xp?可以表示為: w T ? x p + b = p w^T*x_p+b=p wT?xp?+b=p。
紫色點所表示的標簽為y是1,所以我們規定p>0。
同樣,對于任意一個紅色的點 x r x_r xr?來講,我們可以將它表示為: w T ? x r + b = p w^T*x_r+b=p wT?xr?+b=p。
紅色點所表示的標簽y是-1,所以我們規定r<0。
此時,我們如果有新的測試數據 x t x_t xt?,則的標簽就可以根據以下式子來判定:
我們之前說過,決策邊界的兩邊要有兩個超平面,這兩個超平面在二維空間中就是兩條平行線(就是我們的虛線超平面),而他們之間的距離就是我們的邊際d。而決策邊界位于這兩條線的中間,所以這兩條平行線必然是對稱的。我們另這兩條平行線被表示為:
支持向量
此時,我們可以讓這兩條線分別過兩類數據中距離我們的虛線決策邊界最近的點,這些點就被稱為“支持向量”,而決策邊界永遠在這兩條線的中間。我們令紫色類的點為xp,紅色類的點為xr(xp和xr作為支持向量),則我們可以得到:
兩式相減是為了求出兩條虛線之間的距離。
如下圖所示,(xp-xr)可表示為兩點之間的連線(距離),而我們的邊際d是平行于w的,所以我們現在,相當于是得到了三角型中的斜邊,并且知道一條直角邊的方向。在線性代數中,我們有如下數學性質。
向量a乘以向量b方向上的單位向量,可以得到向量a在向量b方向上的投影的長度。xp-xr作為向量a,則w作為向量b,則可以求出邊際的長度。
向量b除以自身的模長||b||可以得到b方向上的單位向量。
所以,我們將上述式子兩邊除以||w||,可以得到:
求最大邊界所對應的決策邊界,要最大化d,就求解w的最小值。我們可以把求解 的最小值轉化為,求解以下函數的最小值:
只所以要在模長上加上平方,是因為模長的本質是一個距離(距離公式中是帶根號的),所以它是一個帶根號的存在,我們對它取平方,是為了消除根號,不帶平方也可以。
我們的兩條虛線表示的超平面,表示的是樣本數據邊緣所在的點。所以對于任意樣本i,我們可以把決策函數寫作:
至此,我們就得到了支持向量機的損失函數:
1.2.7 拉格朗日乘數
對損失函數進行求解。
目標是求解讓損失函數最小化的w。
如果||w||為0,f(w)必然最小了。但是||w||=0其實是一個無效的值,原因有簡單。
首先,我們的決策邊界是wx+b=0,如果w為0,則這個向量里包含的所有元素都為0,那就有b=0這個唯一值。然而,如果b和w都為0,決策邊界就不再是一條直線了,條件中的yi(wxi+b)>=1就不可能實現,所以w不可以是一個0向量。可見,單純讓f(w)=||w||**2/2為0,是不能求解出合理的w的,我們希望能夠找出一種方式,能夠讓我們的條件yi(wxi+b)>=1在計算中也被納入考慮,一種業界認可的方法是使用拉格朗日乘數法。
借助拉格朗日乘數將引出對偶問題,這里不進行推導。
1.3 非線性SVM與核函數
1.3.1 非線性SVM
當然,不是所有的數據都是線性可分的,不是所有的數據都能一眼看出,有一條直線,或一個平面,甚至一個超平面可以將數據完全分開。比如下面的環形數據。對于這樣的數據,我們需要對它進行一個升維變化,讓數據從原始的空間x投射到新空間q(x)中。升維之后,我們明顯可以找出一個平面,能夠將數據切分開來。
q(x)是一個映射函數,它代表了某種能夠將數據升維的非線性的變換,我們對數據進行這樣的變換,確保數據在自己的空間中一定能夠線性可分。
1.3.2 核函數
上述這種手段是有問題的,我們很難去找出一個函數q(x)來滿足我們的需求,并且我們并不知道數據究竟被映射到了一個多少維度的空間當中,有可能數據被映射到了無限空間中,讓我們的計算和預測都變得無比艱難。所以無法統一定義一個固定的q(x)函數。為了避免這些問題,我們使用核函數來幫助我們。
核函數K(xi,xtest)能夠用原始數據空間中的向量計算來表示升維后地空間中的點積q(x)*q(xtest),以幫助我們尋找合適的q(x)。選用不同的核函數,就可以解決不同數據分布下的尋找超平面問題。
在sklearn的SVM中,這個功能由參數“kernel”(?k?rnl)和一系列與核函數相關的參數來進行控制.因此我們更加重視不同的核函數選擇對模型產生的影響是什么,而不是搞明白核函數的推導原理。
探索核函數在不同數據集上的表現:
觀察結果
可以觀察到,線性核函數和多項式核函數在非線性數據上表現會浮動,如果數據相對線性可分,則表現不錯,如果是像環形數據那樣徹底不可分的,則表現糟糕。在線性數據集上,線性核函數和多項式核函數即便有擾動項也可以表現不錯,可見多項式核函數是雖然也可以處理非線性情況,但更偏向于線性的功能。
Sigmoid核函數就比較尷尬了,它在非線性數據上強于兩個線性核函數,但效果明顯不如rbf,它在線性數據上完全比不上線性的核函數們,對擾動項的抵抗也比較弱,所以它功能比較弱小,很少被用到。
rbf,高斯徑向基核函數基本在任何數據集上都表現不錯,屬于比較萬能的核函數。
個人的經驗是,無論如何先試試看高斯徑向基核函數,它適用于核轉換到很高的空間的情況,在各種情況下往往效果都很不錯,如果rbf效果不好,那我們再試試看其他的核函數。另外,多項式核函數多被用于圖像處理之中。
2 代碼實現
sklearn.svm.LinearSVC(penalty='l2', loss='squared_hinge', dual=True, tol=0.0001, C=1.0, multi_class='ovr', fit_intercept=True, intercept_scaling=1, class_weight=None, verbose=0, random_state=None, max_iter=1000)重要參數 kernel:選擇核函數:linear、poly、rbf、sigmod; C:正則化力度,處理過擬合; class_weight:類別分布不均衡處理。 import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.datasets import load_breast_cancer from sklearn.decomposition import PCA from sklearn.svm import SVC from sklearn.model_selection import train_test_split %matplotlib inlineX = load_breast_cancer().data y = load_breast_cancer().targetpca = PCA(n_components=2) # PCA降維,便于在二維平面上繪圖。 pca_X = pca.fit_transform(X)plt.scatter(pca_X[:, 0], pca_X[:, 1], c=y) x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=2020)s = SVC(C=1, kernel='linear').fit(x_train, y_train) s.score(x_test, y_test) # 0.9824561403508771s = SVC(C=1, kernel='poly').fit(x_train, y_train) s.score(x_test, y_test) # 0.8947368421052632s = SVC(C=5, kernel='poly').fit(x_train, y_train) s.score(x_test, y_test) # 0.9210526315789473s = SVC(C=1, kernel='rbf').fit(x_train, y_train) s.score(x_test, y_test) # 0.9122807017543859s = SVC(C=5, kernel='rbf').fit(x_train, y_train) s.score(x_test, y_test) # 0.9298245614035088總結
以上是生活随笔為你收集整理的9 机器学习 支持向量机的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从大型语言模型LLM走向人工通用智能AG
- 下一篇: 社区说|浅谈 WorkManager 的