一個簡單的案例帶你瞭解支持向量機算法(Python代碼)

一個簡單的案例帶你瞭解支持向量機算法(Python代碼)

介紹

掌握機器學習算法並不是一個不可能完成的事情。大多數的初學者都是從學習迴歸開始的。是因為迴歸易於學習和使用,但這能夠解決我們全部的問題嗎?當然不行!因為,你要學習的機器學習算法不僅僅只有迴歸!

把機器學習算法想象成一個裝有斧頭,劍,刀,弓箭,匕首等等武器的軍械庫。你有各種各樣的工具,但你應該學會在正確的時間和場合使用它們。作為一個類比,我們可以將“迴歸”想象成一把能夠有效切割數據的劍,但它無法處理高度複雜的數據。相反,“支持向量機”就像一把鋒利的刀—它適用於較小的數據集,但它可以再這些小的數據集上面構建更加強大的模型。

現在,我希望你現在已經掌握了隨機森林,樸素貝葉斯算法和模型融合的算法基礎。如果沒有,我希望你先抽出一部分時間來了解一下他們,因為在本文中,我將指導你瞭解認識機器學習算法中關鍵的高級算法,也就是支持向量機的基礎知識。

如果你是初學者,並且希望開始你的數據科學之旅,那麼我希望你先去了解一些基礎的機器學習算法, 支持向量機相對來說對於數據科學的初學者來講的確有一點難了。

0.什麼是分類分析

讓我們用一個例子來理解這個概念。假如我們的人口是按照50%-50%分佈的男性和女性。那麼使用這個群體的樣本,就需要創建一些規則,這些規則將指導我們將其他人的性別進行分類。如果使用這種算法,我們打算建立一個機器人,可以識別一個人是男性還是女性。這是分類分析的樣本問題。我們將嘗試使用一些規則來劃分性別之間的不同。為簡單起見,我們假設使用的兩個區別因素是:個體的身高和頭髮長度。以下是樣本的散點圖。

一個簡單的案例帶你瞭解支持向量機算法(Python代碼)

圖中的藍色圓圈表示女性,綠色方塊表示男性。圖中的一些預期見解是:

我們人口中的男性的平均身高較高。

我們人口中的女性的頭髮較長。

如果我們看到一個身高180釐米,頭髮長度為4釐米的人,我們最好的分類是將這個人歸類為男性。這就是我們進行分類分析的方法。

1.什麼是支持向量機

“支持向量機”(SVM)是一種有監督的機器學習算法,可用於分類任務或迴歸任務。但是,它主要適用於分類問題。在這個算法中,我們將每個數據項繪製為n維空間中的一個點(其中n是你擁有的是特徵的數量),每個特徵的值是特定座標的值。然後,我們通過找到很好地區分這兩個類的超平面來執行分類的任務(請看下面的演示圖片)。

一個簡單的案例帶你瞭解支持向量機算法(Python代碼)

支持向量只是個體觀測的座標。支持向量機是一個最好地隔離兩個類(超平面或者說分類線)的前沿算法。

在我第一次聽到“支持向量機”這個名字,我覺得這個名字聽起來好複雜,如果連名字都這麼複雜的話,那麼這個名字的概念將超出我的理解。幸運的是,在我看了一些大學的講座視頻,才意識到這個算法其實也沒有那麼複雜。接下來,我們將討論支持向量機如何工作。我們將詳細探討該技術,並分析這些技術為什麼比其他技術更強。

2.它是如何工作的?

上面,我們已經習慣了用超平面來隔離兩種類別的過程,但是現在最迫切的問題是“我們如何識別正確的超平面?”。關於這個問題不用急躁,因為它並不像你想象的那麼難!

讓我們一個個的來理解如何識別正確的超平面:

  • 選擇正確的超平面(場景1):這裡,我們有三個超平面(A、B、C)。現在,讓我們用正確的超平面對星形和圓形進行分類。
一個簡單的案例帶你瞭解支持向量機算法(Python代碼)

你需要記住一個經驗的法則來識別正確的超平面:“選擇更好的可以隔離兩個類別的超平面”。在這種情況下,超平面“B”就非常完美的完成了這項工作。

  • 選擇正確的超平面(場景2):
  • 在這裡,我們有三個超平面(A,B,C),並且所有這些超平面都很好地隔離了類。現在,我們如何選擇正確的超平面?
一個簡單的案例帶你瞭解支持向量機算法(Python代碼)

  • 在這裡,在這裡,將最近的數據點(任一類)和超平面之間的距離最大化將有
  • 助於我們選擇正確的超平面。該距離稱為邊距。讓我們看一下下面的圖片:
一個簡單的案例帶你瞭解支持向量機算法(Python代碼)

上面,你可以看到超平面C的邊距與A和B相比都很高。因此,我們將正確的超平面選擇為C。選擇邊距較高的超平面的另一個決定性因素是穩健性。如果我們選擇一個低邊距的超平面,那麼很有可能進行錯誤分類。

  • 選擇正確的超平面(場景3):提示: 使用我們前面討論的規則來選擇正確的超平面
一個簡單的案例帶你瞭解支持向量機算法(Python代碼)

你們中的一些人可能選擇了超平面B,因為它與A相比具有更高的邊距。但是SVM選擇超平面是需要在最大化邊距之前準確地對類別進行分類。這裡,超平面B有一個分類的錯誤,而且A進行了正確的分類。因此,正確的超平面應該是A.

  • 我們可以對這個兩個類進行分類嗎?(場景4):下面這張圖片中,我們無法使用直線來分隔這兩個類,因為其中一個星星位於圓形類別的區域中作為一個異常值。
一個簡單的案例帶你瞭解支持向量機算法(Python代碼)

正如我剛剛已經提到的,另一端的那一顆星星就像是一個異常值。SVM具有忽略異常值並找到具有最大邊距的超平面的功能。因此,我們可以說,SVM對異常值有很強的穩健性

一個簡單的案例帶你瞭解支持向量機算法(Python代碼)

  • 找到一個超平面用來隔離兩個類別(場景5):
  • 在下面的場景中,我們不能在兩個類之間有線性的超平面,那麼SVM如何對這兩個類進行分類?到目前為止,我們只研究過線性超平面。
一個簡單的案例帶你瞭解支持向量機算法(Python代碼)

SVM可以解決這個問題。並且是輕鬆就可以做到!它通過引入額外的特徵來解決這個問題。在這裡,我們將添加一個新特徵

現在,讓我們繪製軸x和z上的數據點:

一個簡單的案例帶你瞭解支持向量機算法(Python代碼)

在上圖中,要考慮的問題是:

  • z的所有值都是正的,因為z是x和y的平方和
  • 在原圖中,紅色圓圈出現在靠近x和y軸原點的位置,導致z值比較低。星形相對遠離原點,導致z值較高。

在SVM中,很容易就可以在這兩個類之間建立線性超平面。但是,另一個需要解決的問題是,我們是否需要手動添加一個特徵以獲得超平面。不,並不需要這麼做,SVM有一種稱為核技巧的技術。這些函數把低維度的輸入空間轉換為更高維度的空間,也就是它將不可分離的問題轉換為可分離的問題,這些函數稱為內核函數。它主要用於非線性的分離問題。簡而言之,它執行一些非常複雜的數據轉換,然後根據你定義的標籤或輸出找出分離數據的過程。

當SVM找到一條合適的超平面之後,我們在原始輸入空間中查看超平面時,它看起來像一個圓圈:

現在,讓我們看看在數據科學中應用SVM算法的方法。

3.如何在Python中實現SVM?

在Python中,scikit-learn是一個廣泛使用的用於實現機器學習算法的庫,SVM也可在scikit-learn庫中使用並且遵循相同的結構(導入庫,創建對象,擬合模型和預測)。我們來看下面的代碼:

#導入庫

from sklearn import svm

#假設您有用於訓練數據集的X(特徵數據)和Y(目標),以及測試數據的x_test(特徵數據)

#創建SVM分類對象

model = svm.svc(kernel='linear', c=1, gamma=1)

#與之相關的選項有很多,比如更改kernel值(內核)、gamma值和C值。下一節將對此進行更多討論。使用訓練集訓練模型,並檢查成績

model.fit(X, y)

model.score(X, y)

#預測輸出

predicted= model.predict(x_test)

4.如何調整SVM的參數?

對機器學習算法進行調整參數值可以有效地提高模型的性能。讓我們看一下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:我們之間已經簡單的討論過了。在算法參數中,我們可以為kernel值提供各種內核選項,如“linear”,“rbf”,“poly”等(默認值為“rbf”)。其中“rbf”和“poly”對於找到非線性超平面是很有用的。讓我們看一下這個例子,我們使用線性內核函數對iris數據集中的兩個特性進行分類。

示例:使用linear的內核

import numpy as np

import matplotlib.pyplot as plt

from sklearn import svm, datasets

#導入數據

iris = datasets.load_iris()

X = iris.data[:, :2] #我們可以只考慮前兩個特徵

#我們可以使用雙數據集來避免醜陋的切片

y = iris.target

#我們創建了一個SVM實例並對數據進行擬合。不進行縮放

#是因為我們想要畫出支持向量

C = 1.0 #SVM正則化參數

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

#創建一個網格來進行可視化

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

一個簡單的案例帶你瞭解支持向量機算法(Python代碼)

示例:使用RBF內核

將內核類型更改為下面的代碼行中的rbf並查看影響。

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

一個簡單的案例帶你瞭解支持向量機算法(Python代碼)

](

如果你有大量的特徵數據(> 1000),那麼我建議你去使用線性內核,因為數據在高維空間中更可能是線性可分的。此外,你也可以使用RBF,但不要忘記交叉驗證其參數,以避免過度擬合。

gamma:'rbf','poly'和'sigmoid'的內核係數。伽馬值越高,則會根據訓練數據集進行精確擬合,也就是泛化誤差從而導致過擬合問題。

示例:如果我們使用不同的伽瑪值,如0,10或100,讓我們來查看一下不同的區別。

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

一個簡單的案例帶你瞭解支持向量機算法(Python代碼)

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

一個簡單的案例帶你瞭解支持向量機算法(Python代碼)

我們應該始終關注交叉驗證的分數,以便更有效地組合這些參數並避免過度擬合。

5.SVM的優缺點

  • 優點:
  • 它工作的效果很明顯,有很好的分類作用
  • 它在高維空間中同樣是有效的。
  • 它在尺寸數量大於樣本數量的情況下,也是有效的。
  • 它在決策函數(稱為支持向量)中使用訓練點的子集,因此它的內存也是有效的
  • 缺點:
  • 當我們擁有大量的數據集時,它表現並不好,因為它所需要的訓練時間更長
  • 當數據集具有很多噪聲,也就是目標類重疊時,它的表現性能也不是很好
  • SVM不直接提供概率估計,這些是使用昂貴的五重交叉驗證來計算的。它是Python scikit-learn庫的相關SVC方法。

實踐問題

找到一個正確的超平面用來將下面圖片中的兩個類別進行分類

一個簡單的案例帶你瞭解支持向量機算法(Python代碼)

結語

在本文中,我們詳細介紹了機器學習算法中的高階算法,支持向量機(SVM)。我們討論了它的工作原理,python中的實現過程,通過調整模型的參數來提高模型效率的技巧,討論了SVM的優缺點,以及最後留下的一個要你們自己解決的問題。我建議你使用SVM並通過調整參數來分析此模型的能力。

支持向量機是一種非常強大的分類算法。當與隨機森林和其他機器學習工具結合使用時,它們為集合模型提供了非常不同的維度。因此,在需要非常高的預測能力的情況下,他們就顯得非常重要。由於公式的複雜性,這些算法可能稍微有些難以可視化。

Understanding Support Vector Machine algorithm from examples (along with code)

相關推薦

推薦中...