選自KDNuggets 機(jī)器之心編譯 參與:劉曉坤,、蔣思源
自從 Statsbot 團(tuán)隊發(fā)表了關(guān)于(時間序列的異常檢測(time series anomaly detection)的文章之后,很多讀者要求我們介紹支持向量機(jī)方法,。因此 Statsbot 團(tuán)隊將在不使用高深數(shù)學(xué)的前提下向各位讀者介紹 SVM,,并分享有用的程序庫和資源。 如果你曾經(jīng)使用機(jī)器學(xué)習(xí)執(zhí)行分類任務(wù),,應(yīng)該會聽說支持向量機(jī)(SVM),。這個算法的歷史已經(jīng)有五十出頭,它們隨著時間不斷在進(jìn)化,,并適應(yīng)于各種其它問題比如回歸,、離群值分析和排序等。 在很多深度學(xué)習(xí)開發(fā)者的模型儲備中,,SVM 都是他們的至愛,。在 [24]7(https://www./),我們也將使用它們解決多個問題,。 我將更專注于培養(yǎng)直覺理解而不是嚴(yán)密的數(shù)學(xué)推導(dǎo),,這意味著我們會盡可能跳過數(shù)學(xué)細(xì)節(jié)而建立其工作方式的理論的直觀理解。 分類問題假設(shè)你們的大學(xué)開設(shè)了一項機(jī)器學(xué)習(xí)課程,,課程的講師發(fā)現(xiàn)那些擅長數(shù)學(xué)或者統(tǒng)計學(xué)的學(xué)生往往表現(xiàn)的最好,。課程結(jié)束之后,老師們記錄了注冊課程的學(xué)生的分?jǐn)?shù),,他們對每一個學(xué)生根據(jù)其在機(jī)器學(xué)習(xí)課程上的表現(xiàn)加上了一個標(biāo)簽:「好」或者「壞」,。 現(xiàn)在,,老師們想要確定數(shù)學(xué)和統(tǒng)計學(xué)的得分與機(jī)器學(xué)習(xí)課程表現(xiàn)的關(guān)系?;蛟S,,根據(jù)他們的統(tǒng)計結(jié)果,他們會在學(xué)生注冊課程時加上一個前提條件限制,。 他們會怎么做呢,?首先把他們的數(shù)據(jù)表示出來,我們可以畫一個二維圖,,一個坐標(biāo)軸表示數(shù)學(xué)成績,,另一個表示統(tǒng)計學(xué)成績。每個學(xué)生的具體成績作為一個點在圖中表示,。 點的顏色(綠色或者紅色)表示學(xué)生在機(jī)器學(xué)習(xí)課程中的表現(xiàn):「好」或者「壞」,。將圖畫出來的話應(yīng)該是這樣的: 當(dāng)一個學(xué)生要求注冊課程的時候,講師將會要求她提供數(shù)學(xué)和統(tǒng)計學(xué)的成績,。根據(jù)他們已有的數(shù)據(jù),,他們將對她在機(jī)器學(xué)習(xí)課程上的表現(xiàn)作出合理的猜測。我們真正想要的是一類以形式(math_score,stats_score)饋送到「分?jǐn)?shù)元組」的算法,。這個算法能告訴你一個學(xué)生在圖中是以一個紅點還是一個綠點表示(紅/綠可理解為類別或者標(biāo)簽),。當(dāng)然,這個算法已經(jīng)以某種方式包含了訓(xùn)練數(shù)據(jù)的特征,。 在這個案例中,,一個好的算法將能尋找在紅色和綠色群集之間的分界線(即決策邊界),然后確定一個分?jǐn)?shù)多元組將依賴于哪一側(cè),。我們選擇綠色方或者紅色方的其中一側(cè)作為他在這項課程中最可能的表現(xiàn)水平標(biāo)簽,。 這條線稱為決策邊界(因為它將不同標(biāo)記的群集分離開來)或者分類器(我們用它來將點集分類)。圖中展示了這個問題中可能的兩個分類器,。 好分類器和壞分類器有一個很有趣的問題:以上兩條線都將紅色和綠色的點群集分離開來,。有什么合理依據(jù)能讓我們選擇其中一個而舍棄另一個嗎? 要注意一個分類器的價值并不在于它能將訓(xùn)練數(shù)據(jù)分離的多好,。我們最終是希望它能將尚未見過的數(shù)據(jù)分離(即測試數(shù)據(jù)),。因此我們需要選擇能捕捉訓(xùn)練數(shù)據(jù)的普遍模式的那條線,而這條線更可能在測試數(shù)據(jù)中表現(xiàn)的更好,。 以上所示的第一條線看起來有些許偏差,,其下半部分看起來過于接近紅點群集,其上半部分過于接近綠點群集,。當(dāng)然它確實很完美的將訓(xùn)練數(shù)據(jù)分離開來,,但是如果在測試數(shù)據(jù)中遇到了有一個點離群集稍遠(yuǎn)的情況,它很有可能會將其加上錯誤的標(biāo)記,。 而第二的點就沒有這樣的問題,。例如,,下圖為兩個分類器分離方塊點群集的結(jié)果展示。 第二條線在正確分離訓(xùn)練數(shù)據(jù)的同時也盡可能的遠(yuǎn)離兩個群集,,即采取最大間隔的策略。處于兩個群集的正中間位置能降低犯錯的風(fēng)險,,可以說,,這給了每一個類的數(shù)據(jù)分布更多的浮動空間,因此它能更好的泛化到測試數(shù)據(jù)中,。 SVM 就是試圖尋找第二類決策邊界的算法,。上文我們只是通過目測選擇更好的分類器,但實際上為了在一般案例中應(yīng)用,,我們需要將其隱含原理定義地更加精確,。以下將簡要說明 SVM 是如何工作的: 1. 尋找能準(zhǔn)確分離訓(xùn)練數(shù)據(jù)的決策邊界; 2. 在所有這些決策邊界中選擇能最大化與最近鄰點的距離的決策邊界,。 那些定義了這條決策邊界的最近鄰點被稱作支持向量,。而決策邊界周圍的區(qū)域被定義為間隔。下圖展示了支持向量和對應(yīng)的第二條決策邊界:黑色邊界的點(有兩個)和間隔(陰影區(qū)域),。 支持向量機(jī)提供了一個方法在多個分類器中尋找能更準(zhǔn)確分離測試數(shù)據(jù)的分類器,。雖然上圖中的決策邊界和數(shù)據(jù)是處于二維空間的,但是必須注意 SVM 實際上能在任何維度的數(shù)據(jù)中工作,,在這些維度中,,它們尋找的是和二維空間決策邊界類似的結(jié)構(gòu)。 比如,,在三維空間中它們尋找的是一個分離面(后面將簡要提到),,在更高維空間中它們尋找的是一個分離超平面,即將二維決策邊界和三維分離面推廣到任意維度的結(jié)構(gòu),。一個可以被決策邊界(或者在普遍意義上,,一個分離超平面)被稱作線性可分?jǐn)?shù)據(jù)。分離超平面被稱作線性分類器,。 容錯性和軟間隔分類器我們在上一節(jié)看到的是一個線性可分?jǐn)?shù)據(jù)的簡單例子,,但現(xiàn)實中的數(shù)據(jù)通常是很凌亂的。你也很可能經(jīng)常遇到一些不能正確線性分類的例子,。這里展示了一個這樣的例子: 很顯然,,使用一個線性分類器通常都無法完美的將標(biāo)簽分離,但我們也不想將其完全拋棄不用,,畢竟除了幾個錯點它基本上能很好的解決問題,。那么 SVM 會如何處理這個問題呢?SVM 允許你明確規(guī)定允許多少個錯點出現(xiàn),。你可以在 SVM 中設(shè)定一個參數(shù)「C」,;從而你可以在兩種結(jié)果中權(quán)衡: 1. 擁有很寬的間隔,; 2. 精確分離訓(xùn)練數(shù)據(jù); C 的值越大,,意味著在訓(xùn)練數(shù)據(jù)中允許的誤差越少,。 必需強(qiáng)調(diào)一下這是一個權(quán)衡的過程。如果想要更好地分類訓(xùn)練數(shù)據(jù),,那么代價就是間隔會更寬,。以下幾個圖展示了在不同的 C 值中分類器和間隔的變化(未顯示支持向量)。 注意決策邊界隨 C 值增大而傾斜的方式,。在更大的 C 值中,,它嘗試將右下角的紅點盡可能的分離出來。但也許我們并不希望在測試數(shù)據(jù)中也這么做,。第一張圖中 C=0.01,,看起來更好的抓住了普遍的趨勢,雖然跟更大的 C 值相比,,它犧牲了精確性,。 考慮到這是一個權(quán)衡方法,需要注意間隔如何隨著 C 值的增大而縮小,。 在之前的例子中,,間隔內(nèi)是不允許任何錯點的存在的。在這里我們看到,,同時擁有好的分離邊界和沒有錯點的間隔是基本不可能的,。由于現(xiàn)實世界中的數(shù)據(jù)幾乎不可能精確的分離,確定一個合適的 C 值很重要且很有實際意義,。我們往往使用交叉驗證選擇合適的 C 值,。 線性不可分?jǐn)?shù)據(jù)我們已經(jīng)介紹過支持向量機(jī)如何處理完美或者接近完美線性可分?jǐn)?shù)據(jù),那對于那些明確的非線性可分?jǐn)?shù)據(jù),,SVM 又是怎么處理的呢,?畢竟有很多現(xiàn)實世界的數(shù)據(jù)都是這一類型的。當(dāng)然,,尋找一個分離超平面已經(jīng)行不通了,,這反而突出了 SVMs 對這種任務(wù)有多擅長。 這里有一個關(guān)于線性不可分?jǐn)?shù)據(jù)的例子(這是著名的異或問題變體),,圖中展示了線性分類器 SVM 的結(jié)果: 這樣的結(jié)果并不怎么樣,,在訓(xùn)練數(shù)據(jù)中只能得到 75% 的準(zhǔn)確率,這是使用決策邊界能得到的最好結(jié)果,。此外,,決策邊界和一些數(shù)據(jù)點過于接近,甚至將一些點分割開來。 現(xiàn)在輪到我最喜歡 SVM 的部分登場了,。我們目前擁有:一項擅長尋找分離超平面的技術(shù),,以及無法線性分離的數(shù)據(jù)。那么怎么辦,? 當(dāng)然是,,將數(shù)據(jù)映射到另一個空間中使其線性可分然后尋找分離超平面!我會一步一步的詳細(xì)介紹這個想法,。 仍然從上圖中的數(shù)據(jù)集為例,,然后將其映射到三維空間中,其中新的坐標(biāo)為: 下圖中展示了映射數(shù)據(jù)的表示,,你發(fā)現(xiàn)了能塞進(jìn)一個平面的地方了嗎? 讓我們開始在上面運行 SVM: 標(biāo)簽分離很完美,,接下來將平面映射回初始的二維空間中看看決策邊界是什么樣子: 在訓(xùn)練數(shù)據(jù)中得到了 100% 的準(zhǔn)確率,,而且分離邊界并不會過于接近數(shù)據(jù)點,太棒了,!初始空間中決策邊界的形狀依賴于映射函數(shù)的形式,。在映射空間中,分離邊界通常是一個超平面,。 要記住,,映射數(shù)據(jù)的最主要的目的是為了使用 SVM 尋找分離超平面。 當(dāng)將分離超平面映射回初始空間時,,分離邊界不再是一條線了,,間隔和支持向量也變得不同。根據(jù)視覺直覺,,它們在映射空間的形態(tài)是很好理解的,。 看看它們在映射空間中的樣子,再看看在初始空間,。3D 間隔(為了避免視覺混亂,,沒有加上陰影)是分離超平面之間的區(qū)域。 在映射空間中有 4 個支持向量,,這很合理,,它們分布在兩個平面上以確定間隔。在初始空間中,,它們依然在決策邊界上,,但是看起來數(shù)量并不足以確定最大間隔。 讓我們回過頭分析一下: 1. 如何確定要將數(shù)據(jù)映射到什么樣的空間,?我之前已經(jīng)很明確的提過,,在某個地方出現(xiàn)了根號 2!在這個例子中,我想展示一下向高維空間映射的過程,,因此我選了一個很具體的映射,。一般而言,這是很難確定的,。不過,,多虧了 over』s theorem,我們能確定的是通過將數(shù)據(jù)映射到高維空間確實更可能使數(shù)據(jù)線性可分,。 2. 所以我要做的就是映射數(shù)據(jù)然后運行 SVM,?不是。為了使上述例子更好理解,,我解釋的好像我們需要先將數(shù)據(jù)映射,。如果你自行將數(shù)據(jù)映射,你要怎么表征無窮維空間呢,?看起來 SVMs 很擅長這個,,是時候看看算法的核函數(shù)了。 核函數(shù)最終還是這個獨家秘方才使得 SVM 有了打標(biāo)簽的能力,。在這里我們需要討論一些數(shù)學(xué),。讓我們盤查一下目前我們所見過的: 1. 對于線性可分?jǐn)?shù)據(jù),SVM 工作地非常出色,。 2. 對于近似線性可分?jǐn)?shù)據(jù),,只要只用正確的 C 值,SVM 仍然可以工作地很好,。 3. 對于線性不可分?jǐn)?shù)據(jù),,可以將數(shù)據(jù)映射到另一個空間使數(shù)據(jù)變得完美或者幾乎完美線性可分,將問題回歸到了 1 或者 2,。 首先 SVM 一個非常令人驚喜的方面是,,其所有使用的數(shù)學(xué)機(jī)制,如精確的映射,、甚至是空間的維度都沒有顯式表示出來,。你可以根據(jù)數(shù)據(jù)點(以向量表示)的點積將所有的數(shù)學(xué)寫出來。例如 P 維的向量 i 和 j,,第一個下標(biāo)區(qū)分?jǐn)?shù)據(jù)點,,第二個下標(biāo)表示維度: 點積的定義如下: 如果數(shù)據(jù)集中有 n 個點,SVM 只需要將所有點兩兩配對的點積以尋找分類器,。僅此而已,。當(dāng)我們需要將數(shù)據(jù)映射到高維空間的時候也是這樣,不需要向 SVM 提供準(zhǔn)確的映射,,而是提供映射空間中所有點兩兩配對的點積,。 重提一下我們之前做過的映射,,看看能不能找到相關(guān)的核函數(shù)。同時我們也會跟蹤映射的計算量,,然后尋找點積,,看看相比之下,核函數(shù)是怎么工作的,。 對于任意一個點 i: 其對應(yīng)的映射點的坐標(biāo)為: 我們需要進(jìn)行以下操作以完成映射:
加起來總共是 1+1+2=4 次乘法,,在新坐標(biāo)中的點積是: 為了計算兩個點 i 和 j 的點積,我們需要先計算它們的映射,。因此總共是 4+4=8 次乘法,,然后點積的計算包含了 3 次乘法和 2 次加法。
總數(shù)為 11+2=13 次計算,,而以下這個核函數(shù)將給出相同的結(jié)果: 首先在初始空間中計算向量的點積,,然后將結(jié)果進(jìn)行平方。把式子展開然后看看是否正確: 確實是這樣,。這個式子需要多少次計算呢,?看看以上式子的第二步。在二維空間中計算點積只需要 2 次乘法和 1 次加法,,平方運算是另一次乘法。因此,,總計為:
總數(shù)為 3+1=4 次計算,。只有之前計算量的 31%。 看起來使用核函數(shù)計算所需要的點積會更快,。目前看來這似乎并不是什么重要的選擇:只不過是 4 次和 13 次的比較,,但在輸入點處于高維度,而映射空間有更高的維度的情形中,,大型數(shù)據(jù)集的計算所節(jié)省的計算量能大大加快訓(xùn)練的速度,。因此使用核函數(shù)有相當(dāng)大的優(yōu)勢。 大部分 SVM 程序庫已經(jīng)經(jīng)過預(yù)包裝并包含了一些很受歡迎的核函數(shù)比如多項式,,徑向基函數(shù)(RBF),,以及 Sigmoid 函數(shù)。當(dāng)不使用映射的時候(比如文中第一個例子),,我們就在初始空間中計算點積,,我們之前提過,這叫做線性核函數(shù)(linear kernel),。很多核函數(shù)能提供額外的手段進(jìn)一步調(diào)整數(shù)據(jù),。比如,多項式核函數(shù): 該多項式允許選擇 c 和 d(多項式的自由度)的值,。在上述 3D 映射的例子中,,我使用的值為 c=0,d=2。但是核函數(shù)的優(yōu)點遠(yuǎn)遠(yuǎn)不止于此,! 還記得我之前提到向無窮維空間映射的情況嗎,?只需要知道正確的核函數(shù)就可以了。因此,,我們并不需要將輸入數(shù)據(jù)映射,,或者困惑無窮維空間的問題。 核函數(shù)就是為了計算當(dāng)數(shù)據(jù)確實被映射的時候,,內(nèi)積的形式,。RBF 核函數(shù)通常在一些具體的無窮維映射問題中應(yīng)用。在這里我們不討論數(shù)學(xué)細(xì)節(jié),,但會在文末提到一些參考文獻(xiàn),。 如何在空間維度為無窮的情況計算點積呢?如果你覺得困惑,,回想一下無窮序列的加法是如何計算的,,相似的道理。雖然在內(nèi)積中有無窮個項,,但是能利用一些公式將它們的和算出來,。 這解答了我們前一節(jié)中提到的問題??偨Y(jié)一下:
SVM 庫你可以在很多 SVM 庫中進(jìn)行選擇,,并開始你的實驗:
很多普適的機(jī)器學(xué)習(xí)庫比如 scikit-learn 也提供 SVM 模塊,,通常在專用的 SVM 庫中封裝。我推薦使用經(jīng)驗證測試可行的 libSVM,。 libSVM 通常是一個命令行工具,,但下載包通常捆綁封裝了 Python、Java 和 MATLAB,。只要將你的數(shù)據(jù)文件經(jīng) libSVM 格式化后(下載文件中 README 將解釋這一部分,,以及其它可選項),就可以開始試驗了,。 實際上,,如果你想快速理解不同核函數(shù)和 c 值等如何影響決策邊界,,試試登陸「Graphical Interface」的 home page。在上面標(biāo)記幾類數(shù)據(jù)點,,選擇 SVM 參數(shù),,然后運行就可以了。我很快去嘗試了一下: 我給 SVM 出了個難題,,然后我嘗試了幾個不同的核函數(shù): 網(wǎng)站界面并沒有展示分離邊界,,但會顯示 SVM 判斷分類標(biāo)簽的結(jié)果。正如你所見,,線性核函數(shù)完全忽略了紅點,,認(rèn)為整個空間中只有黃點。而 RBF 核函數(shù)則完整的為紅點劃出了兩個圈,! |
|