从示例中了解svm(支持向量机)算法(以及代码)

介绍

掌握机器学习算法根本不是一个神话。大多数初学者都是从学习回归开始的。它易于学习和使用,但这是否能解决我们的目的?当然不是!因为,你可以做的不仅仅是回归!

把机器学习算法想象成一个装有轴,剑,刀片,弓,匕首等的军械库。你有各种工具,但你应该学会在正确的时间使用它们。作为类比,将“回归”想象成能够有效切割和切割数据的剑,但无法处理高度复杂的数据。相反,“支持向量机”就像一把锋利的刀 - 它适用于较小的数据集,但在它们上面,它可以在构建模型时更加强大和强大。

目录

  1. 什么是支持向量机?
  2. 它是如何工作的?
  3. 如何在Python和R中实现SVM?
  4. 如何调整SVM的参数?
  5. 与SVM相关的利弊

什么是支持向量机?

“支持向量机”(SVM)是一种监督机器学习算法,可用于分类或回归任务。但是,它主要用于分类问题。在此算法中,我们将每个数据项绘制为n维空间中的点(其中n是你具有的特征数),每个要素的值是特定坐标的值。然后,我们通过找到很好地区分两个类的超平面来执行分类(请看下面的图片)。
在这里插入图片描述
支持向量只是观察个别的坐标。支持向量机是一个最好地隔离两个类(超平面/线)的边界。

它是如何工作的?

上面,我们已经习惯了用超平面隔离这两个类的过程。现在燃烧的问题是“我们如何识别正确的超平面?”。别担心,它并不像你想象的那么难!

识别正确的超平面(场景-1): 这里,我们有三个超平面(A,B和C)。现在,确定正确的超平面以对星形和圆形进行分类。
在这里插入图片描述
你需要记住一个拇指规则来识别正确的超平面:“选择超级平面,更好地隔离这两个类”。在这种情况下,超平面“B”极好地完成了这项工作。

识别正确的超平面(场景-2): 在这里,我们有三个超平面(A,B和C),并且所有这些都很好地隔离了类。现在,我们如何识别正确的超平面?
在这里插入图片描述
在这里,最大化最近数据点(任一类)和超平面之间的距离将有助于我们决定正确的超平面。该距离称为Margin。让我们看一下下面的图片:
在这里插入图片描述
在上面,您可以看到超平面C的边距与A和B相比都很高。因此,我们将正确的超平面命名为C.另一个选择超平面的重要原因具有较高边际的平面具有鲁棒性。如果我们选择具有低边距的超平面,那么很有可能错过分类。

识别正确的超平面(场景-3):提示: 使用前一节中讨论的规则来识别正确的超平面
在这里插入图片描述
一些人可能选择了超平面B,因为它与A相比具有更高的margin(距离)。但是, SVM选择超平面,在最大化边界之前准确地对类进行分类。这里,超平面B具有分类误差,并且A已经正确地分类。因此,超平面是A.

我们可以对两个类进行分类(场景-4)吗?:下面,我无法使用直线分隔这两个类,因为其中一个星位于其他(圆)类的区域中作为异常值。
在这里插入图片描述
正如我已经提到的,另一端的一颗星就像是星级的异常。SVM具有忽略异常值并找到具有最大余量的超平面的功能。因此,我们可以说,SVM对异常值很强。
在这里插入图片描述
找到超平面以分离到类(场景-5):在下面的场景中,我们不能在两个类之间有线性超平面,那么SVM如何对这两个类进行分类?到目前为止,我们只看过线性超平面。SVM可以解决这个问题。容易!它通过引入附加功能解决了这个问题。在这里,我们将添加一个新特征z = x ^ 2 + y ^ 2。现在,让我们绘制轴x和z上的数据点:在上图中,要考虑的点是:
在这里插入图片描述
在这里插入图片描述
o z的所有值都是正的,因为z是x和y的平方和
o 在原始图中,红色圆圈出现在靠近x和y轴原点的位置,导致较低的z值,星形相对远离原点,导致z值较高。

在SVM中,很容易在这两个类之间建立线性超平面。但是,另一个出现的问题是,我们是否需要手动添加此功能以获得超平面。不,SVM有一种称为核技巧的技术。这些函数采用低维度输入空间并将其转换为更高维度的空间,即它将不可分离的问题转换为可分离的问题,这些函数称为内核。它主要用于非线性分离问题。简而言之,它执行一些非常复杂的数据转换,然后根据您定义的标签或输出找出分离数据的过程。

当我们在原始输入空间中查看在这里插入图片描述超平面时,它看起来像一个圆圈:
在这里插入图片描述
现在,让我们看看在数据科学挑战中应用SVM算法的方法。

如何在Python中实现SVM?

在Python中,scikit-learn是一个广泛使用的库,用于实现机器学习算法,SVM也可用于scikit-learn库并遵循相同的结构(导入库,对象创建,拟合模型和预测)。我们来看下面的代码:

#Import Library
from sklearn import svm

#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
# Create SVM classification object 
model = svm.svc(kernel='linear', c=1, gamma=1) 

# there is various option associated with it, like changing kernel, gamma and C value. Will discuss more # about it in next section.Train the model using the training sets and check score
model.fit(X, y)
model.score(X, y)

#Predict Output
predicted= model.predict(x_test)

如何调整SVM的参数?

机器学习算法的调整参数值有效地提高了模型性能。让我们看一下SVM可用的参数列表。

sklearn.svm.SVC(C=1.0, kernel='rbf', degree=3, gamma=0.0, coef0=0.0, shrinking=True, probability=False,tol=0.001, cache_size=200, class_weight=None, verbose=False, max_iter=-1, random_state=None)

我将讨论一些对模型性能影响较大的重要参数,“内核”,“伽马”和“C”。

内核:我们已经讨论过了。在这里,我们有内核提供的各种选项,如“linear”,“rbf”,“poly”等(默认值为“rbf”)。这里“rbf”和“poly”对非线性超平面很有用。让我们看一下这个例子,我们在Iris数据集的两个特征上使用线性内核来对它们的类进行分类。

示例: 线性内核

import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm, datasets

# import some data to play with iris = datasets.load_iris()
X = iris.data[:, :2] # we only take the first two features. We could
# avoid this ugly slicing by using a two-dim dataset
y = iris.target

# we create an instance of SVM and fit out data. We do not scale our
# data since we want to plot the support vectors
C = 1.0 # SVM regularization parameter
svc = svm.SVC(kernel='linear', C=1,gamma=0).fit(X, y)

# create a mesh to plot in
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
h = (x_max / x_min)/100
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))

plt.subplot(1, 1, 1)
Z = svc.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, cmap=plt.cm.Paired, alpha=0.8)

plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired)
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.xlim(xx.min(), xx.max())
plt.title('SVC with linear kernel')
plt.show()
 plt.show()

在这里插入图片描述

示例: rbf 内核

将内核类型更改为下面的行中的rbf并查看影响。

svc = svm.SVC(kernel ='rbf',C = 1,gamma = 0).fit(X,y)

在这里插入图片描述
如果你有大量的特征(> 1000),我建议你去线性内核,因为数据在高维空间中更可能是线性可分的。此外,您可以RBF,但不要忘记交叉验证其参数,以避免过度拟合。

gamma:‘rbf’,'poly’和’sigmoid’的内核系数。伽马值越高,将尝试精确拟合训练数据集,即泛化误差并导致过拟合问题。

示例:如果我们有不同的伽玛值,如0,10或100,比较一下不同。

svc = svm.SVC(kernel ='rbf',C = 1,gamma = 0).fit(X,y)

在这里插入图片描述
C: 错误术语的惩罚参数C. 它还控制平滑决策边界与正确分类训练点之间的权衡。
在这里插入图片描述
我们应该始终查看交叉验证分数,以便有效地组合这些参数并避免过度拟合。

与SVM相关的利弊

优点
 o 它具有明显的分离距离,效果非常好
 o 它在高维空间中有效。
 o 在尺寸数量大于样本数量的情况下,它是有效的。
 o 它在决策函数中使用训练点的子集(称为支持向量),因此它也具有内存效率。
缺点
 o 当我们拥有大量数据集时,它表现不佳,因为所需的训练时间更长
 o 当数据集具有更多噪声,即目标类重叠时,它也表现不佳
 o SVM不直接提供概率估计,这些是使用代价高的五重交叉验证计算的。它是Python scikit-learn库的SVC方法。

结束语

在本文中,我们详细介绍了机器学习算法,支持向量机。我讨论了它的工作概念,python中的实现过程,通过调整其参数,优点和缺点使模型高效的技巧。我建议您使用SVM并通过调整参数来分析此模型的功能。

本文转译自:https://www.analyticsvidhya.com/blog/2017/09/understaing-support-vector-machine-example-code/?spm=a2c4e.11153940.blogcont224388.12.1c5528d2PcVFCK

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值