机器学习-支持向量机(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问题语句非常有用。