背景介绍
我第一次听到“支持向量机”这个名字,我觉得,如果这个名字本身听起来那么复杂,那么这个概念的表述将超出我的理解范围。 幸运的是,我看到了一些大学讲座视频,并意识到这个工具是多么简单有效。 在本文中,我们将讨论支持向量机如何工作。 本文适合那些对此算法知之甚少且对学习新技术有好奇心的读者 。 在以下文章中,我们将详细探讨该技术,并分析这些技术比其他技术更强的案例。
让我们考虑一个例子来理解这些概念。 我们的人口占50%-50%的男性和女性。 使用这个群体的样本,您想要创建一些规则,这些规则将指导我们其他人口的性别等级。 使用这种算法,我们打算建立一个机器人,可以识别一个人是男性还是女性。 这是分类分析的样本问题。 使用一些规则,我们将尝试将人口分为两个可能的部分。 为简单起见,我们假设确定的两个区别因素是:个体的身高和头发长度。 以下是样本的散点图。
图中的蓝色圆圈表示女性,绿色方块表示男性。 图中的一些预期见解是:
我们人口中的男性平均身高较高。
我们人口中的女性头皮较长。
如果我们看到一个身高180厘米,头发长度为4厘米的人,我们最好的猜测是将这个人归类为男性。 这就是我们进行分类分析的方法。
支持向量只是个别观察的坐标。 例如,(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问题语句非常有用。