機器學習基礎篇:支援向量機(SVM)理論與實踐

紅色石頭發表於2021-08-20

什麼是支援向量機(SVM)?

支援向量機 (SVM) 是一種相對簡單的監督機器學習演算法,用於解決分類或迴歸問題。它更適合分類,但有時對迴歸也非常有用。 SVM演算法的本質是在不同的資料型別之間找到一個超平面來建立邊界。在二維空間中,這個超平面是一條直線。

在 SVM演算法中,我們在 N 維空間中繪製資料集中的每個資料項,其中 N 是資料中特徵/屬性的數量。接下來,我們找到最佳的超平面來對不同型別的資料進行分類。因此我們可以瞭解到SVM 本質上只能解決二分類的問題(即,在兩個類之間進行選擇)。但是,如今有多種技術可用於解決多分類的問題。

支援向量機(SVM)解決多分類問題

為了在多分類問題上使用SVM,我們可以為每一類資料建立一個二元分類器。每個分類器的兩個結果將是:

  • 資料點屬於該類或
  • 資料點不屬於該類或

例如,在水果分類問題中,要進行多類分類,我們可以為每個水果建立一個二元分類器。例如,“芒果”類,將有一個二元分類器來預測它是芒果還是不是芒果。選擇得分最高的分類器作為 SVM 的輸出。

複雜的 SVM(非線性可分)

SVM對線性可分資料進行分類有比較好的表現。線性可分資料是任何可以繪製在圖形中並且可以使用直線進行分類的資料。

我們使用帶核心的SVM 來處理非線性可分的資料。 比如說,我們把一維非線性可分的資料可以轉換為二維資料,該資料將將在二維上線性可分。這是通過將每個一維資料點對映到相應的二維有序對來完成的。

因此,對於任何維度的任何非線性可分資料,我們可以將資料對映到更高的維度,然後使其變得線性可分。這是一個非常強大和普遍的轉變。

核心不是資料點之間相似性的度量。 核化 SVM 中的核函式告訴您,給定原始特徵空間中的兩個資料點,新變換的特徵空間中的點之間的相似度是多少。

現有各種可用的核心函式,其中兩個比較流行:

Radial BasisFunction Kernel (RBF):變換後的特徵空間中兩點之間的相似度是向量與原始輸入空間之間距離的指數衰減函式,如下所示。 RBF 是 SVM 中使用的預設核心。

多項式核心:多項式核心採用一個附加引數“度”來控制模型的複雜度和轉換的計算成本。

核心化 SVM 的優點:

1、在有些資料集上表現的比較常好;

2、具有通用性:可以指定不同的核心函式,或者也可以為特定資料型別定義自定義核心;

3、同樣適用於高維資料和低維資料。

核心化 SVM 的缺點:

1、效率(執行時間和記憶體使用)隨著訓練集大小的增加而降低;

2、需要標準化輸入資料和引數調整,自適應能力弱;

3、沒用提供概率估計方法;

4、對做出的預測比較難解釋。

用python語言實現SVM

首先我們用sklearn包自帶的方法建立兩組資料集:

# importing scikit learn with make_blobs
from sklearn.datasets.samples_generator import make_blobs

# creating datasets X contarining n_samples
# Y containing two classes
X,Y = make_blobs(n_samples=500, centers=2,
          random_state=0, cluster_std=0.40)
import matplotlib.pyplot as plt
# plotting scatters
plt.scatter(X[:,0], X[:, 1], c=Y, s=50, cmap='spring');
plt.show()

建立後的資料集視覺化如下圖:

SVM不僅是在此處在兩個類之間畫一條線,而且還要考慮某個給定寬度的線周圍的區域。 下面是它的外觀示例:

# creating line space between -1 to 3.5 
xfit = np.linspace(-1, 3.5)

# plotting scatter
plt.scatter(X[:, 0], X[:, 1], c=Y, s=50, cmap='spring')

# plot a line between the different sets of data
for m, b, d in [(1, 0.65, 0.33), (0.5, 1.6, 0.55), (-0.2, 2.9, 0.2)]:
    yfit = m * xfit + b
    plt.plot(xfit, yfit, '-k')
    plt.fill_between(xfit, yfit - d, yfit + d, edgecolor='none', 
    color='#AAAAAA', alpha=0.4)

plt.xlim(-1, 3.5);
plt.show()

以上是支援向量機的直覺,它優化了表示資料集之間垂直距離的線性判別模型。 現在讓我們使用我們的訓練資料訓練分類器。 在訓練之前,我們需要將癌症資料集匯入為 csv 檔案,我們將從所有特徵中訓練兩個特徵。

# importing required libraries
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# reading csv file and extracting class column to y.
x = pd.read_csv("C:\...\cancer.csv")
a = np.array(x)
y  = a[:,30] # classes having 0 and 1

# extracting two features
x = np.column_stack((x.malignant,x.benign))

# 569 samples and 2 features
x.shape

print (x),(y)

現在我們將利用這些點來擬合SVM分類器。 雖然似然模型的數學細節很有趣,但我們將在別處閱讀這些細節。 相反,我們只是將scikit-learn 演算法視為完成上述任務的黑匣子。

# import support vector classifier 
# "Support Vector Classifier"
from sklearn.svm import SVC  
clf = SVC(kernel='linear') 

# fitting x samples and y classes 
clf.fit(x, y)

擬合完成後,該模型可用於預測新值:

clf.predict([[120, 990]])

clf.predict([[85, 550]])

輸出:

array([ 0.])
array([ 1.])

我們可以通過 matplotlib 分析獲取的資料和預處理方法以製作最佳超平面的過程。

原文連結:

https://www.geeksforgeeks.org/introduction-to-support-vector-machines-svm/


相關文章