05.11 從示例中理解SVM算法(無計算)

編者按:掌握機器學習算法並不是什麼神話。對於大多數機器學習初學者來說,迴歸算法是很多人接觸到的第一類算法,它易於理解、方便使用,堪稱學習工作中的一大神器,但它真的是萬能的嗎?通過這篇文章,論智希望大家明白,有時候,生活中的一些萬金油工具其實並不是我們的唯一選擇。

如果把機器學習看做是一個堆滿刀、劍、斧、弓等兵器的軍械庫,裡面有成千上萬種工具,我們的選擇餘地的確很大,但我們應該學會在正確的時間和場合使用正確的武器。如果把迴歸算法看作是其中的劍,它可以輕鬆刺穿敵人(數據)的堅甲,但不能被庖丁用來解牛。對於這類問題高度複雜的數據處理任務,一把鋒利的“小刀”——支持向量機(SVM)往往更有效——它可以在較小的數據集上工作,並構建出更強大的模型。

從示例中理解SVM算法(無計算)

目錄

1. 什麼是支持向量機?

2. SVM的工作原理

3. 如何調整SVM參數

4. SVM的優點和缺點

1. 什麼是支持向量機?

在機器學習領域中,支持向量機”(SVM)是一種可用於分類和迴歸任務監督學習算法,在實踐中,它的主要應用場景是分類。為了解釋這個算法,首先我們可以想象一大堆數據,其中每個數據是高維空間中的一個點,數據的特徵有多少,空間的維數就有多少。相應的,數據的位置就是其對應各特徵的座標值。為了用一個超平面儘可能完美地分類這些數據點,我們就要用SVM算法來找到這個超平面。

從示例中理解SVM算法(無計算)

在這個算法中,所謂“支持向量”指的是那些在間隔區邊緣的訓練樣本點,而“機”則是用於分類的那個最佳決策邊界(線/面/超平面)。

2. SVM的工作原理

下面我們用圖像演示如何找出正確的超平面的幾種方法。

情景1

下圖中有三個超平面:A、B和C。那麼其中哪個是正確的邊界呢?只需記住一點:SVM選擇的是能分類兩種數據的決策邊界。很顯然,相比A和C,B更好地分類了圓和星,所以它是正確的超平面。

從示例中理解SVM算法(無計算)

情景2

下圖中同樣有A、B、C三個超平面,和情景1不同,這次三個超平面都很好地完成了分類,那麼其中哪個是正確的超平面呢?對此,我們再修改一下之前的表述:SVM選擇的是能更好地分類兩種數據的決策邊界。

從示例中理解SVM算法(無計算)

在這裡,我們可以繪製數據到決策邊界的距離來輔助判斷。如下圖所示,無論是星還是圓,它們到C的距離都是最遠的,因此這裡C就是我們要找的最佳決策邊界。

從示例中理解SVM算法(無計算)

之所以選擇邊距更遠的超平面,是因為它更穩健,容錯率更高。如果選擇A或C,如果後期我們繼續輸入樣本,它們發生錯誤分類的可能性會更高。

情景3

這裡我們先看圖,試著用上一情景的結論做出選擇。

從示例中理解SVM算法(無計算)

也許有些讀者最終選擇了B,因為兩類數據和它的邊距較A更遠。但是其中有個問題,就是B沒有正確分類,而A正確分類了。那麼在SVM算法面前,正確分類和最大邊距究竟孰重孰輕?很顯然,SVM首先考慮的是正確分類,其次才是優化數據到決策邊界的距離。情景3的正確超平面是A。

情景4

在前幾個例子裡,雖然我們把決策邊界表述為超平面,但它們在圖像中都是一條直線,這其實是不符合現實的。如在下圖中,我們就無法用直線進行分類。

從示例中理解SVM算法(無計算)

紅色的圓點之間出現了一顆藍色的星,並且它和其他同類數據不在同一側。那麼我們是否要繪製一條曲線來分類?或者說,是否要把它單獨分為一類?答案是否定的。

對比情景3,我們可以推斷此處的星是一個異常值,所以在這裡SVM算法不受分類前提困擾,可以直接在圓和星之間找出一個最合適的超平面進行分類。換句話說,SVM對於異常值是有效的

從示例中理解SVM算法(無計算)

情景5

讓我們繼續關注直線這個話題。在下圖中,兩類數據之間已經不具備直線邊界了,那麼SVM算法會怎麼分類?請想象電視劇中大俠拍桌震起酒杯的畫面。圖中目前只有X和Y兩個特徵,為了分類,我們可以添加一個新特徵Z = X2 + Y2,並繪製數據點在X軸和Z軸上的位置。

從示例中理解SVM算法(無計算)

從示例中理解SVM算法(無計算)

數據點被“震起來”後,星和圓在Z軸上出現了一個清晰的決策邊界,它在上圖中表示為一條二維的線,這裡有幾個注意點:

  • Z的所有值都是正的,因為它是X和Y的平方和;

  • 在原圖中,圓的分佈比星更靠近座標軸原點,這也是它們在Z軸上的值較低的原因。

在SVM中,我們通過增加空間維度能很輕易地在兩類數據間獲得這樣的線性超平面,但另一個亟待解決的問題是,像Z = X2 + Y2這樣的新特徵是不是都得由我們手動設計?不需要,SVM中有一種名為kernel的函數,它們能把低維輸入映射進高維空間,把原本線性不可分的數據變為線性可分,我們也稱它們為核函數。

核函數主要用於非線性分離問題。簡而言之,它會自動執行一些非常複雜的數據轉換,然後根據你定義的標籤或輸出找出分離數據的過程。

當我們把數據點從三維壓縮回二維後,這個超平面就成了一個圓圈:

從示例中理解SVM算法(無計算)

3. 如何調整SVM參數

在Python中,scikit-learn是一個受眾極廣的方便又強大的機器學習算法庫,所以我們可以直接在scikit-learn裡找到SVM。對於R語言,e1071軟件包可用於輕鬆創建SVM,它具有輔助函數以及Naive Bayes分類器的代碼,和Python大體相同。

在機器學習中,調參是提高模型性能額一種有效做法,我們先來看看SVM中的可用參數。

sklearn.svm.SVC(C=1.0, kernel='rbf', degree=3, gamma=0.0, coef0=0.0, shrinking=True, probability=False,tol=0.001, cache_size=200, class_weight=None, verbose=False, max_iter=-1, random_state=None)

這裡我們只介紹幾個重要參數的調參方法。

kernel:之前我們已經介紹了kernel是什麼,關於它,我們可以挑選各種函數:線性的、RBF核的、poly函數等(默認值為RBF核)。對非線性超平面來說,後兩種核函數效果顯著。以下是幾個例子:

例1:線性核函數

import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm, datasets
# import some data to play with
iris = datasets.load_iris()
X = iris.data[:, :2] # we only take the first two features. We could
# avoid this ugly slicing by using a two-dim dataset
y = iris.target
# we create an instance of SVM and fit out data. We do not scale our
# data since we want to plot the support vectors
C = 1.0 # SVM regularization parameter
svc = svm.SVC(kernel='linear', C=1,gamma=0).fit(X, y)
# create a mesh to plot in
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
h = (x_max / x_min)/100
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
np.arange(y_min, y_max, h))
plt.subplot(1, 1, 1)
Z = svc.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, cmap=plt.cm.Paired, alpha=0.8)
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired)
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.xlim(xx.min(), xx.max())
plt.title('SVC with linear kernel')

plt.show()

從示例中理解SVM算法(無計算)

例2:RBF核函數

把核函數類型更改為rbf,然後從圖中觀察變化。

svc = svm.SVC(kernel ='rbf',C = 1,gamma = 0).fit(X,y)

從示例中理解SVM算法(無計算)

如果你有大量特徵(> 1000),我建議你選擇線性內核,因為它們在高維空間內線性可分的概率更高。除此之外,那rbf就是個不錯的選擇,但是不要忘記交叉驗證其參數來避免過擬合。

gamma:rbf、poly和sigmoid的核係數。gamma值越高,模型就會更努力地擬合訓練數據集,所以它也是導致過擬合的一個要因。

例3:gamma = 0.01和100

svc = svm.SVC(kernel ='rbf',C = 1,gamma = 0).fit(X,y)

從示例中理解SVM算法(無計算)

C: 誤差項的懲罰參數C,它還控制著決策邊界的平滑與否和正確分類訓練點之間的權衡。

例4:C = 100和1000

從示例中理解SVM算法(無計算)

自始至終,我們都要記得用交叉驗證來有效組合這些參數,防止模型過擬合。

4. SVM的優點和缺點

優點

  • 效果很好,分類邊界清晰;

  • 在高維空間中特別有效;

  • 在空間維數大於樣本數的情況下很有效;

  • 它使用的是決策函數中的一個訓練點子集(支持向量),所以佔用內存小,效率高。

缺點

  • 如果數據量過大,或者訓練時間過長,SVM會表現不佳;

  • 如果數據集內有大量噪聲,SVM效果不好;

  • SVM不直接計算提供概率估計,所以我們要進行多次交叉驗證,代價過高。

小結

本文介紹了什麼是支持向量機、SVM的工作原理、如何在Python和R中實現SVM、如何調參以及它的的優點和缺點。希望讀者能在閱讀完畢後動手試一試,不要受近年來出現的“有DL還要學SVM嗎?”的說法的影響,經典的算法總有其可貴之處,它也是進公司面試時的一大熱門題目。

如果不知道從何開始,可以嘗試做做論智的這道題:

從示例中理解SVM算法(無計算)


分享到:


相關文章: