Python机器学习

支持向量机

Python机器学习支持向量机详细操作教程

SVM简介

支持向量机(SVM)是强大而灵活的监督式机器学习算法,可用于分类和回归。但通常,它们用于分类问题。在1960年代,SVM首次推出,但在1990年得到了完善。与其他机器学习算法相比,SVM具有其独特的实现方式。最近,由于它们能够处理多个连续和分类变量,它们非常受欢迎。

SVM的工作

SVM模型基本上是多维空间中超平面中不同类的表示。 SVM将以迭代方式生成超平面,从而可以最大程度地减少误差。 SVM的目标是将数据集分为几类,以找到最大边缘超平面(MMH)。
工作SVM
以下是SVM中的重要概念-
支持向量-最接近超平面的数据点称为支持向量。将在这些数据点的帮助下定义分隔线。 超平面-如上图所示,它是一个决策平面或空间,被划分为一组具有不同类的对象。 边距-可以定义为不同类别的壁橱数据点上的两条线之间的间隙。可以将其计算为从线到支持向量的垂直距离。大利润被认为是好的利润,小利润被认为是不好的利润。
SVM的主要目标是将数据集分为几类,以找到最大边缘超平面(MMH),这可以通过以下两个步骤完成-
首先,SVM将迭代生成超平面,以最佳方式隔离类。 然后,它将选择正确分隔各类的超平面。

在Python中实现SVM

在Python中实现SVM -我们将从导入以下标准库开始-

SVM内核

在实践中,SVM算法是通过内核实现的,该内核将输入数据空间转换为所需的形式。 SVM使用一种称为内核技巧的技术,其中内核占用低维输入空间并将其转换为高维空间。简而言之,内核通过增加更多维度来将不可分离的问题转换为可分离的问题。它使SVM更加强大,灵活和准确。以下是SVM使用的一些内核类型。

线性内核

它可用作任意两个观测值之间的点积。线性核的公式如下-
$$ K(x,x_ {i})\:= \:sum(x * x_ {i})$$
从上面的公式中,我们可以看到两个向量之间的乘积𝑥和𝑥𝑖是每对输入值的乘积之和。

多项式内核

它是线性核的更通用形式,可以区分弯曲或非线性输入空间。以下是多项式内核的公式-
$$ k(X,Xi)\:= 1 + sum(X * X_ {i})\ hat \:d $$
这里d是多项式的阶数,我们需要在学习算法中手动指定。

径向基函数(RBF)内核

RBF内核(主要用于SVM分类)将输入空间映射到不确定的维空间中。以下公式以数学方式对其进行了解释-
$$ K(x,xi)\:= exp(-gamma ^ * sum(x-xi \ hat \:2))$$
在这里, 伽玛的范围是0到1。我们需要在学习算法中手动指定它。良好的默认值 gamma 为0.1。
当我们为线性可分离数据实现SVM时,我们可以在Python中为不可线性分离的数据实现它。可以使用内核来完成。

示例

以下是使用内核创建SVM分类器的示例。我们将使用来自 scikit-learn -
iris 数据集
我们将从导入以下软件包开始-
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-26
import pandas as pd
import numpy as np
from sklearn import svm, datasets
import matplotlib.pyplot as plt
现在,我们需要加载输入数据-
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-26
iris = datasets.load_iris()
从该数据集中,我们采用了以下两个特征-
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-26
X = iris.data[:, :2]
y = iris.target
接下来,我们将使用原始数据绘制SVM边界,如下所示-
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-26
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))
X_plot = np.c_[xx.ravel(), yy.ravel()]
现在,我们需要提供正则化参数的值,如下所示:-
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-26
C = 1.0
接下来,可以如下创建SVM分类器对象-
Svc_classifier = svm.SVC(内核='线性',C = C).fit(X,y)
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-26
Z = svc_classifier.predict(X_plot)
Z = Z.reshape(xx.shape)
plt.figure(figsize=(15, 5))
plt.subplot(121)
plt.contourf(xx, yy, Z, cmap=plt.cm.tab10, alpha=0.3)
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Set1)
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.xlim(xx.min(), xx.max())
plt.title('Support Vector Classifier with linear kernel')
输出
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-26
Text(0.5, 1.0, 'Support Vector Classifier with linear kernel')
支持矢量分类器
要使用 rbf 内核创建SVM分类器,可以将内核更改为 rbf ,如下所示-
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-26
Svc_classifier = svm.SVC(kernel = 'rbf', gamma =‘auto’,C = C).fit(X, y)
Z = svc_classifier.predict(X_plot)
Z = Z.reshape(xx.shape)
plt.figure(figsize=(15, 5))
plt.subplot(121)
plt.contourf(xx, yy, Z, cmap = plt.cm.tab10, alpha = 0.3)
plt.scatter(X[:, 0], X[:, 1], c = y, cmap = plt.cm.Set1)
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.xlim(xx.min(), xx.max())
plt.title('Support Vector Classifier with rbf kernel')
输出
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-26
Text(0.5, 1.0, 'Support Vector Classifier with rbf kernel')
支持矢量内核
我们将gamma值设置为"自动",但您也可以将其值设置为0到1。

SVM分类器的优缺点

SVM分类器的优点
SVM分类器具有很高的准确性,并且可以在高维空间中很好地工作。 SVM分类器基本上使用训练点的子集,因此结果使用的内存更少。
SVM分类器的缺点
它们具有很高的训练时间,因此在实践中不适合大型数据集。另一个缺点是SVM分类器不能与重叠的类一起很好地工作。
昵称: 邮箱:
Copyright © 2022 立地货 All Rights Reserved.
备案号:京ICP备14037608号-4