使用Python可视化支持向量机SVM
作者:python收藏家
支持向量机(SVM)是用于分类和回归任务的强大监督学习模型。它们受欢迎背后的一个关键因素是它们有效处理线性和非线性数据的能力。在本文中,我们将探索使用Python和流行的库(如scikit-learn和Matplotlib)可视化SVM。
支持向量机(SVM)
支持向量机的工作原理是找到最佳的超平面,最好地分离特征空间中的类。选择超平面以使边缘最大化,边缘是超平面与每个类的最近数据点之间的距离,称为支持向量。这个超平面是通过求解一个优化问题来确定的,该优化问题的目标是最小化分类误差,同时最大化间隔。
SVM可以通过使用不同的核函数(如线性、多项式、径向基函数(RBF)和sigmoid核)来用于线性和非线性分类任务。这些内核允许支持向量机通过将原始特征空间映射到更高维的空间来处理非线性决策边界,其中类变得可分离。
可视化线性SVM
让我们首先使用Iris数据集可视化一个简单的线性SVM。我们将使用Scikit-Learn生成数据并训练SVM模型。然后,我们将绘制决策边界和支持向量,以了解模型如何分离类。
导入必要的库并加载数据集
该数据集包含三种鸢尾花的萼片和花瓣尺寸的测量值。在这里,只有前两个特征(萼片长度和宽度)被保留用于可视化目的。
import numpy as np import matplotlib.pyplot as plt from sklearn import datasets from sklearn.svm import SVC iris = datasets.load_iris() X = iris.data[:, :2] # Only first two features for visualization y = iris.target
基于线性核的SVM训练
在Iris数据集上训练具有线性核的SVM模型。线性核适用于线性可分数据,旨在找到分离不同类别的最佳超平面。
# Train SVM with linear kernel clf_linear = SVC(kernel='linear') clf_linear.fit(X, y)
创建决策边界
创建网格以覆盖特征空间。这允许生成用于可视化目的的点。SVM模型的决策边界将绘制在此网格上。
# Create a mesh to plot decision boundaries h = 0.02 # step size in the mesh x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1 y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1 xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
线性支持向量机决策边界的绘制
绘制了具有线性核的SVM的决策边界。这是通过使用predict方法预测 网格上所有点的类标签来实现的。然后使用填充轮廓图(plt.contourf)可视化决策边界,并将原始数据点覆盖在图上以供参考。
# Plot decision boundary of Linear SVM Z_linear = clf_linear.predict(np.c_[xx.ravel(), yy.ravel()]) Z_linear = Z_linear.reshape(xx.shape) plt.contourf(xx, yy, Z_linear, cmap=plt.cm.Paired, alpha=0.8) plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired) plt.title('Linear SVM') plt.xlabel('Sepal Length') plt.ylabel('Sepal Width') plt.xlim(xx.min(), xx.max()) plt.ylim(yy.min(), yy.max()) plt.show()
在上面的可视化中,线性SVM以线性方式对数据点进行分类。尽管准确度不是很高,我们可以清楚地看到红色部分有大量错误分类的数据点,但这就是非线性svm的用武之地。
可视化非线性SVM
SVM还可以通过使用核函数来处理非线性决策边界。让我们使用具有多项式内核的相同Iris数据集来可视化非线性SVM。
理解γ参数对RBF核函数的影响
在可视化非线性支持向量机之前,让我们来探讨一下RBF核中γ参数的影响。
γ参数显著影响RBF核在SVM中的行为。它本质上决定了单个数据点对决策边界的影响。
- 较低的γ值会导致每个数据点的影响更大,从而导致更平滑的决策边界。
- 相反,较高的γ值会缩小数据点的影响,从而创建更复杂且可能过度拟合的决策边界。
定义γ值
定义了一个名为gamma_values的列表,包含γ超参数的不同值,控制单个训练示例的影响。
import numpy as np import matplotlib.pyplot as plt from sklearn import datasets from sklearn.svm import SVC iris = datasets.load_iris() X = iris.data[:, :2] # Only first two features for visualization y = iris.target gamma_values = [0.1, 1, 10, 50, 100, 200]
为每个γ值绘制决策边界
将创建一个大小为20×10英寸的图形,以容纳每个γ值的子图。代码迭代gamma_values列表中的每个γ值。对于每个γ值,使用指定的γ值训练具有RBF核的SVM模型。
在循环内部,创建一个meshgrid来覆盖特征空间,允许生成用于可视化目的的点。网格定义为步长为0.02。
对于每个γ值,绘制具有RBF核的SVM的决策边界。这是通过使用predict方法预测 网格上所有点的类标签来实现的。
然后使用填充轮廓图(plt.contourf)可视化决策边界。原始数据点覆盖在图上以供参考,颜色对应于其各自的类别标签。
# Plot decision boundaries for each gamma value plt.figure(figsize=(20, 10)) for i, gamma in enumerate(gamma_values, 1): # Train SVM with RBF kernel clf_rbf = SVC(kernel='rbf', gamma=gamma) clf_rbf.fit(X, y) # Create a mesh to plot decision boundaries h = 0.02 # step size in the mesh x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1 y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1 xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h)) # Plot decision boundary plt.subplot(2, 3, i) Z_rbf = clf_rbf.predict(np.c_[xx.ravel(), yy.ravel()]) Z_rbf = Z_rbf.reshape(xx.shape) plt.contourf(xx, yy, Z_rbf, cmap=plt.cm.Paired, alpha=0.8) plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired) plt.title(f'RBF SVM (Gamma={gamma})') plt.xlabel('Sepal Length') plt.ylabel('Sepal Width') plt.xlim(xx.min(), xx.max()) plt.ylim(yy.min(), yy.max()) plt.tight_layout() plt.show()
在上面的可视化中,γ值显然对模型的准确性和复杂性有很大影响。
我们选择了6个不同的γ值,因此我们有6个不同的可视化,γ值越高,准确度越高,这就是为什么在γ值为200的可视化中,我们的模型几乎完美地分类了数据点。
但是当我们选择γ值为50的模型时,它与线性SVM的结果非常相似,准确性也不是很高。
结论
总之,支持向量机(SVM)是线性和非线性分类任务的强大模型。可视化支持向量机,特别是使用不同的内核和超参数,可以提供对其行为和性能的有价值的见解。
到此这篇关于使用Python可视化支持向量机SVM的文章就介绍到这了,更多相关Python可视化支持向量机SVM内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!