1. 程式人生 > >機器學習之SVM詳解

機器學習之SVM詳解

支援向量機簡介
支援向量機(SVM)是一種有監督的機器學習演算法,既可以用於分類,也可以用於迴歸。然而,它主要用於分類問題。在這個演算法中,我們將每個資料項繪製為n維空間中的一個點(其中n是您擁有的特徵數),每個特徵的值是特定座標的值。然後,我們通過找到區分這兩個類的超平面來執行分類(請看下面的快照)。
SVM
支援向量只是個體觀察的座標。支援向量機是分離這兩個類(超平面/直線)的前沿。你可以看一下支援向量的定義和它在這裡工作的一些例子。

SVM原理
在上面,我們已經習慣了用超平面分隔這兩個類的過程。現在最迫切的問題是“我們如何識別正確的超平面?”別擔心,沒有你想的那麼難!
識別正確的超平面(Scenario-1):這裡我們有三個超平面(A, B, C),現在,識別正確的超平面來分類星星和圓。
在這裡插入圖片描述


您需要記住一個識別正確超平面的經驗規則:“選擇能更好地隔離兩個類的超平面”。在這個場景中,超平面“B”出色地完成了這項工作。
識別正確的超平面(場景-2):在這裡,我們有三個超平面(A、B和C),它們都能很好地分隔類。現在,我們如何識別正確的超平面?
在這裡插入圖片描述
在這裡,最大化最近的資料點(任意類)和超平面之間的距離將幫助我們決定正確的超平面。這個距離稱為邊距。讓我們看看下面的快照:
在這裡插入圖片描述
上面可以看到,超平面C的margin比A和b都要高,因此我們將正確的超平面命名為C。選擇超平面margin更高的另一個原因是魯棒性。如果我們選擇的超平面具有低的邊距,那麼就有很大的可能出現誤分類。

識別正確的超平面(場景-3):提示:使用上一節討論的規則來識別正確的超平面
在這裡插入圖片描述


一些人可能選擇了超平面B,因為它比A有更高的邊際。但是,這裡有個問題,SVM選擇了超平面,它在邊際最大化之前準確地分類了。在這裡,超平面B有一個分類錯誤,A分類都是正確的。因此,正確的超平面是A。
我們可以對兩個類(場景-4)進行分類嗎?:下面,我無法用直線將這兩個類隔離,因為其中一個星形位於另一個(circle)類的範圍內,是一個離群值。
在這裡插入圖片描述
正如我已經提到的,另一端的一個星形就像是星形類的一個離群值。支援向量機的一個特點是忽略離群值,找到具有最大邊距的超平面。因此,我們可以說,SVM對於離群值是穩健的。
在這裡插入圖片描述
找到要隔離到類的超平面(scenario -5):在下面的場景中,我們不能在兩個類之間有線性的超平面,那麼SVM如何對這兩個類進行分類呢?到目前為止,我們只研究了線性超平面。
在這裡插入圖片描述

支援向量機可以解決這個問題。很容易!它通過引入額外的特性來解決這個問題。在這裡,我們將新增一個新特性z = x ^ 2 + y ^ 2。現在,我們把x軸和z軸上的資料點畫出來:
在這裡插入圖片描述
在支援向量機中,很容易在這兩個類之間建立一個線性超平面。但是,另一個迫切需要解決的問題是,我們是否需要手工新增這個特性來擁有一個超平面。不,SVM有一種叫做核心技巧的技術。這些函式將低維輸入空間轉化為高維空間即將不可分問題轉化為可分問題,這些函式稱為核函式。它主要用於非線性分離問題。簡單地說,它做一些非常複雜的資料轉換,然後找出分離的過程。
當我們看原始輸入空間中的超平面時,它看起來像一個圓:
在這裡插入圖片描述
現在,讓我們看看如何在資料科學挑戰中應用SVM演算法。

Python中實現SVM
在Python中,scikit-learn是一種廣泛用於實現機器學習演算法的庫,scikit-learn庫中也有SVM,結構相同(匯入庫、物件建立、擬合模型和預測)。讓我們看看下面的程式碼:

#Import Library
from sklearn import svm
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
# Create SVM classification object 
model = svm.svc(kernel='linear', c=1, gamma=1) 
# there is various option associated with it, like changing kernel, gamma and C value. Will discuss more # about it in next section.Train the model using the training sets and check score
model.fit(X, y)
model.score(X, y)
#Predict Output
predicted= model.predict(x_test)

如何優化支援向量機的引數?
通過對機器學習演算法引數值的優化,有效地提高了模型的效能。讓我們看看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”、“gamma”和“C”。
kernel:我們已經討論過了。在這裡,我們可以使用核心提供的各種選項,如“linear”、“rbf”、“poly”等(預設值是“rbf”)。這裡的“rbf”和“poly”對於非線性超平面是有用的。讓我們看一下這個例子,我們在iris資料集的兩個特徵上使用了線性核來對它們的類進行分類。

例如:使用線性核

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()

在這裡插入圖片描述

示例:使用rbf核函式
在下面一行中將核心型別更改為rbf,並檢視其影響。
svc = svm.SVC(kernel='rbf', C=1,gamma=0).fit(X, y)
在這裡插入圖片描述

如果你有很多特徵(>1000)我建議你使用線性核函式因為在高維空間中資料更有可能是線性可分的。此外,您還可以交叉驗證RBF的引數,以避免過擬合。
gamma:“rbf”、“poly”和“sigmoid”的核係數。較高的伽馬值,會試圖根據訓練資料集精確擬合,即泛化誤差,導致過擬合問題。
舉個例子,如果我們有不同的值,比如0 10 100。`

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

在這裡插入圖片描述
C:錯誤項的懲罰引數C。它還控制了平滑決策邊界與訓練點正確分類之間的權衡。
在這裡插入圖片描述
我們應該經常檢視交叉驗證分數,以便有效地組合這些引數,避免過擬合。

支援向量機的優缺點:

  • 它工作得很好,而且有明顯的分離距離。
  • 它在高維空間中是有效的。
  • 在尺寸數大於樣本數的情況下,該方法是有效的。
  • 它在決策函式中使用了訓練點的子集(稱為支援向量),因此它也具有記憶體效率。
  • 當我們有大資料集時,由於所需的訓練時間較高,它的效能不佳。
  • 當資料集有更多的噪聲,即目標類重疊時,它的效能也不是很好。
  • 支援向量機不直接提供概率估計,這些估計是使用昂貴的5倍交叉驗證來計算的。它是與SVC方法相關的Python scikit-learn庫。