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

↑↑↑點擊上方藍字,回覆資料,10個G的驚喜

編譯 | AI有道



什麼是支持向量機(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_blobsfrom sklearn.datasets.samples_generator import make_blobs
# creating datasets X contarining n_samples# Y containing two classesX,Y = make_blobs(n_samples=500, centers=2, random_state=0, cluster_std=0.40)import matplotlib.pyplot as plt# plotting scattersplt.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 scatterplt.scatter(X[:, 0], X[:, 1], c=Y, s=50, cmap='spring')
# plot a line between the different sets of datafor 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 librariesimport numpy as npimport pandas as pdimport 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 featuresx = np.column_stack((x.malignant,x.benign))
# 569 samples and 2 featuresx.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/



 
    
    
    

推薦閱讀

(點擊標題可跳轉閱讀)

23個優秀的機器學習數據集

6行代碼!用Python將PDF轉爲word

臺大美女教授陳縕儂:《應用深度學習》

李宏毅《機器學習》視頻教程 PPT

老鐵,三連支持一下,好嗎?↓↓↓

本文分享自微信公衆號 - 機器學習算法與Python實戰(tjxj666)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章