機器學習-支援向量機(SVM:Support Vector Machine)案例
- 2019 年 10 月 7 日
- 筆記
背景介紹
我第一次聽到「支援向量機」這個名字,我覺得,如果這個名字本身聽起來那麼複雜,那麼這個概念的表述將超出我的理解範圍。 幸運的是,我看到了一些大學講座影片,並意識到這個工具是多麼簡單有效。 在本文中,我們將討論支援向量機如何工作。 本文適合那些對此演算法知之甚少且對學習新技術有好奇心的讀者 。 在以下文章中,我們將詳細探討該技術,並分析這些技術比其他技術更強的案例。

什麼是分類分析?
讓我們考慮一個例子來理解這些概念。 我們的人口佔50%-50%的男性和女性。 使用這個群體的樣本,您想要創建一些規則,這些規則將指導我們其他人口的性別等級。 使用這種演算法,我們打算建立一個機器人,可以識別一個人是男性還是女性。 這是分類分析的樣本問題。 使用一些規則,我們將嘗試將人口分為兩個可能的部分。 為簡單起見,我們假設確定的兩個區別因素是:個體的身高和頭髮長度。 以下是樣本的散點圖。

圖中的藍色圓圈表示女性,綠色方塊表示男性。 圖中的一些預期見解是:
我們人口中的男性平均身高較高。
我們人口中的女性頭皮較長。
如果我們看到一個身高180厘米,頭髮長度為4厘米的人,我們最好的猜測是將這個人歸類為男性。 這就是我們進行分類分析的方法。
什麼是支援向量,什麼是SVM?
支援向量只是個別觀察的坐標。 例如,(45,150)是對應於女性的支援向量。 支援向量機是一個最好的男性與女性隔離的邊界。 在這種情況下,這兩個類很好地相互分離,因此更容易找到SVM。
如何找到手頭的支援向量機?
有許多可能的前沿可以對問題進行分類。 以下是三個可能的邊界。

我們如何確定哪個是這個特定問題陳述的最佳前沿?
解釋SVM中目標函數的最簡單方法是找到邊界與最近支援向量的最小距離(這可以屬於任何類)。 例如,橙色邊界最接近藍色圓圈。 最近的藍色圓圈距離邊境2個單位。 一旦我們擁有所有邊界的這些距離,我們只需選擇具有最大距離的邊界(距離最近的支援向量)。 在顯示的三個邊界中,我們看到黑色邊界距離最近的支撐向量(即15個單位)最遠。
如果我們找不到隔離類的乾淨邊界怎麼辦?
在這個商業案例中,我們的工作相對容易找到SVM。 如果分發看起來如下所示怎麼辦?

在這種情況下,我們看不到直接在當前平面中的直線邊界,它可以作為SVM。 在這種情況下,我們需要將這些矢量映射到更高維度的平面,以便它們彼此隔離。 一旦我們開始制定SVM,就會涵蓋這些案例。 現在,您可以想像這種轉換將導致以下類型的SVM。

原始分布中的每個綠色正方形都映射到變換後的比例尺上。 變換後的規模明顯偏離了階級。 已經提出了許多演算法來進行這些變換,其中一些將在以下文章中討論。
接下來看使用Python的Scikit-learn的SVM案例:
''' The following code is for Support Vector Machines Created by - ANALYTICS VIDHYA ''' # importing required libraries import pandas as pd from sklearn.svm import SVC from sklearn.metrics import accuracy_score # read the train and test dataset train_data = pd.read_csv('train-data.csv') test_data = pd.read_csv('test-data.csv') # shape of the dataset print('Shape of training data :',train_data.shape) print('Shape of testing data :',test_data.shape) # Now, we need to predict the missing target # variable in the test data # target variable - Survived # seperate the independent and target variable on training data train_x = train_data.drop(columns=['Survived'],axis=1) train_y = train_data['Survived'] # seperate the independent and target variable on testing data test_x = test_data.drop(columns=['Survived'],axis=1) test_y = test_data['Survived'] model = SVC() # fit the model with the training data model.fit(train_x,train_y) # predict the target on the train dataset predict_train = model.predict(train_x) print('Target on train data',predict_train) # Accuray Score on train dataset accuracy_train = accuracy_score(train_y,predict_train) print('accuracy_score on train dataset : ', accuracy_train) # predict the target on the test dataset predict_test = model.predict(test_x) print('Target on test data',predict_test) # Accuracy Score on test dataset accuracy_test = accuracy_score(test_y,predict_test) print('accuracy_score on test dataset : ', accuracy_test)
上面程式碼運行結果:
Shape of training data : (712, 25) Shape of testing data : (179, 25) Target on train data [0 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 1 1 1 0 0 1 0 1 0 0 1 0 0 0 0 1 0 1 1 1 1 0 1 0 11 0 0 0 0 0 0 1 1 0 0 1 0 0 1 1 1 0 0 1 1 1 1 0 1 0 0 0 0 0 1 0 0 1 0 1 11 0 0 0 1 0 0 0 1 0 1 0 0 1 0 1 0 0 1 0 0 1 1 0 0 1 0 0 0 1 1 1 0 0 0 0 00 1 0 1 1 0 0 0 0 1 1 0 0 1 0 0 1 0 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 00 0 1 0 0 1 0 1 1 1 1 0 0 1 0 1 0 0 1 1 1 1 1 0 0 1 1 1 1 0 0 0 0 1 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 1 01 0 0 0 0 0 1 1 1 0 1 1 1 0 1 1 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 1 10 0 0 1 0 0 0 0 0 1 0 1 1 0 0 0 1 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 1 1 0 0 10 0 1 0 0 1 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 1 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 1 1 1 01 0 0 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 1 1 0 1 0 1 1 00 0 0 1 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 1 10 0 0 0 1 0 0 0 1 1 1 0 0 0 0 1 1 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 10 0 0 1 1 1 0 0 0 0 0 1 0 0 0 1 0 1 0 1 1 1 0 0 0 0 0 0 1 1 0 0 0 0 1 1 11 0 1 0 0 0 0 0 0 1 1 0 0 1 0 0 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 11 0 1 1 1 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 1 0 1 1 0 0 10 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 1 1 0 0 0 1 1 0 0 1 0 0 0 1 1 1 0 1 0 0 01 0 1 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 1 0 0 0 1 0 0 0 0 0 1 0 0 0 10 0 1 0 1 0 1 0 1 1 1 0 0 1 0] accuracy_score on train dataset : 0.8497191011235955 Target on test data [0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 00 0 0 1 0 0 1 0 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 1 1 1 0 0 0 1 0 0 1 1 1 0 1 1 1 0 0 1 00 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 1 1 0 0 0 0 1 1 0 1 01 0 1 0 1 1 0 1 0 0 1 1 1 1 1 1 0 1 0 0 1 1 0 0 1 0 0 0 0 1 1 0 1 1 0 1 01 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 1 0 1 1 1 1 0 0 0 0 0] accuracy_score on test dataset : 0.7206703910614525
結束筆記
支援向量機是非常強大的分類演算法。 當與隨機森林和其他機器學習工具結合使用時,它們為集合模型提供了非常不同的維度。 因此,它們對於需要非常高的預測能力的情況變得非常重要。 由於配方的複雜性,這些演算法稍微難以可視化。 您會發現這些演算法對於解決一些Kaggle問題語句非常有用。