机器学习之SVM详解

支持向量机简介
支持向量机(SVM)是一种有监督的机器学习算法,既可以用于分类,也可以用于回归。然而,它主要用于分类问题。在这个算法中,我们将每个数据项绘制为n维空间中的一个点(其中n是您拥有的特征数),每个特征的值是特定坐标的值。然后,我们通过找到区分这两个类的超平面来执行分类(请看下面的快照)。
SVM
支持向量只是个体观察的坐标。支持向量机是分离这两个类(超平面/直线)的前沿。你可以看一下支持向量的定义和它在这里工作的一些例子。

SVM原理
在上面,我们已经习惯了用超平面分隔这两个类的过程。现在最迫切的问题是“我们如何识别正确的超平面?”别担心,没有你想的那么难!
识别正确的超平面(Scenario-1):这里我们有三个超平面(A, B, C),现在,识别正确的超平面来分类星星和圆。
在这里插入图片描述
您需要记住一个识别正确超平面的经验规则:“选择能更好地隔离两个类的超平面”。在这个场景中,超平面“B”出色地完成了这项工作。
识别正确的超平面(场景-2):在这里,我们有三个超平面(A、B和C),它们都能很好地分隔类。现在,我们如何识别正确的超平面?
在这里插入图片描述
在这里,最大化最近的数据点(任意类)和超平面之间的距离将帮助我们决定正确的超平面。这个距离称为边距。让我们看看下面的快照:
在这里插入图片描述
上面可以看到,超平面C的margin比A和b都要高,因此我们将正确的超平面命名为C。选择超平面margin更高的另一个原因是鲁棒性。如果我们选择的超平面具有低的边距,那么就有很大的可能出现误分类。

识别正确的超平面(场景-3):提示:使用上一节讨论的规则来识别正确的超平面
在这里插入图片描述
一些人可能选择了超平面B,因为它比A有更高的边际。但是,这里有个问题,SVM选择了超平面,它在边际最大化之前准确地分类了。在这里,超平面B有一个分类错误,A分类都是正确的。因此,正确的超平面是A。
我们可以对两个类(场景-4)进行分类吗?:下面,我无法用直线将这两个类隔离,因为其中一个星形位于另一个(circle)类的范围内,是一个离群值。
在这里插入图片描述
正如我已经提到的,另一端的一个星形就像是星形类的一个离群值。支持向量机的一个特点是忽略离群值,找到具有最大边距的超平面。因此,我们可以说,SVM对于离群值是稳健的。
在这里插入图片描述
找到要隔离到类的超平面(scenario -5):在下面的场景中,我们不能在两个类之间有线性的超平面,那么SVM如何对这两个类进行分类呢?到目前为止,我们只研究了线性超平面。
在这里插入图片描述
支持向量机可以解决这个问题。很容易!它通过引入额外的特性来解决这个问题。在这里,我们将添加一个新特性z = x ^ 2 + y ^ 2。现在,我们把x轴和z轴上的数据点画出来:
在这里插入图片描述
在支持向量机中,很容易在这两个类之间建立一个线性超平面。但是,另一个迫切需要解决的问题是,我们是否需要手工添加这个特性来拥有一个超平面。不,SVM有一种叫做内核技巧的技术。这些函数将低维输入空间转化为高维空间即将不可分问题转化为可分问题,这些函数称为核函数。它主要用于非线性分离问题。简单地说,它做一些非常复杂的数据转换,然后找出分离的过程。
当我们看原始输入空间中的超平面时,它看起来像一个圆:
在这里插入图片描述
现在,让我们看看如何在数据科学挑战中应用SVM算法。

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

#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可用的参数列表。

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)

我将讨论一些对模型性能影响较大的重要参数,如“kernel”、“gamma”和“C”。
kernel:我们已经讨论过了。在这里,我们可以使用内核提供的各种选项,如“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()

在这里插入图片描述

示例:使用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。它还控制了平滑决策边界与训练点正确分类之间的权衡。
在这里插入图片描述
我们应该经常查看交叉验证分数,以便有效地组合这些参数,避免过拟合。

支持向量机的优缺点:

  • 它工作得很好,而且有明显的分离距离。
  • 它在高维空间中是有效的。
  • 在尺寸数大于样本数的情况下,该方法是有效的。
  • 它在决策函数中使用了训练点的子集(称为支持向量),因此它也具有内存效率。
  • 当我们有大数据集时,由于所需的训练时间较高,它的性能不佳。
  • 当数据集有更多的噪声,即目标类重叠时,它的性能也不是很好。
  • 支持向量机不直接提供概率估计,这些估计是使用昂贵的5倍交叉验证来计算的。它是与SVC方法相关的Python scikit-learn库。

猜你喜欢

转载自blog.csdn.net/qinguanggai9953/article/details/84979954
今日推荐