機器學習-支持向量機(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問題語句非常有用。