使用支持向量机「Support Vector Machines,SVMs」在Python中对数据进行分类

1. 什么是支持向量机(SVM)?

支持向量机(Support Vector Machine,SVM)是一种分类算法,也可用于回归问题。它的核心思想是找到一个超平面,能够将不同类别的数据集分隔开来,并且能够使得分类边界到最近的数据点距离最大。

SVM的基本思想是将数据转化到高维空间,再寻求一个最优超平面使得这些数据得到最好的线性划分。

SVM在分类问题中的优化目标是:在所有可分的数据中,寻找距离分类超平面最近的数据点(距离叫做“间隔”),使得这些点的“间隔”最大化。这些最近点叫做“支持向量点”,因此SVM的名称就来自于此。

2. SVM 如何工作?

2.1 线性分类

在线性分类问题中,支持向量机会寻找一条直线将两种分类分开。这称之为二分类问题。在实际应用中,支持向量机会构建一个能够将数据点分开的一条线。例如,我们可以使用鸢尾花数据集来演示这个问题。

import seaborn as sns

iris = sns.load_dataset('iris')

import matplotlib.pyplot as plt

sns.scatterplot('sepal_length', 'sepal_width', hue='species', data=iris)

plt.show()

以上代码可以获得一个鸢尾花数据集的图表。

现在我们需要找到一条直线来将图中的三种鸢尾花分离开来。我们需要使用支持向量机算法来求得这条直线。

from sklearn.svm import SVC

X = iris[['sepal_length', 'sepal_width']]

y = iris['species']

svc = SVC(kernel='linear', C=1)

svc.fit(X, y)

# 绘制决策边界

import numpy as np

import matplotlib.pyplot as plt

plt.scatter(X['sepal_length'], X['sepal_width'], c=y, s=50, cmap='autumn')

ax = plt.gca()

xlim = ax.get_xlim()

ylim = ax.get_ylim()

# 创建网格来评估模型

xx = np.linspace(xlim[0], xlim[1], 30)

yy = np.linspace(ylim[0], ylim[1], 30)

YY, XX = np.meshgrid(yy, xx)

xy = np.vstack([XX.ravel(), YY.ravel()]).T

Z = svc.decision_function(xy).reshape(XX.shape)

# 绘制决策边界和间隔

ax.contour(XX, YY, Z, colors='k', levels=[-1, 0, 1], alpha=0.5,

linestyles=['--', '-', '--'])

ax.scatter(svc.support_vectors_[:, 0], svc.support_vectors_[:, 1], s=100,

linewidth=1, facecolors='none', edgecolors='k')

plt.show()

以上代码可以获得一个使用支持向量机分类的鸢尾花图表。

我们可以看到使用SVM算法得出了一个好的分界线,并且最大化了分类间隔。

2.2 非线性分类

SVM算法不仅仅可以用于线性分类,还可以用于非线性分类。

举个例子,我们来看看这个数据集。

from sklearn.datasets import make_circles

X, y = make_circles(100, factor=.1, noise=.1)

plt.scatter(X[:,0], X[:,1], c=y, s=50, cmap='autumn')

plt.show()

以上代码可以获得一个使用make_circles函数生成的数据集图表。

这个数据集不是线性可分的,但是我们可以在高维空间中将其转换为线性可分的。下面的代码使用SVM算法在高维空间中找到了一个球形的分界线。

from mpl_toolkits import mplot3d

r = np.exp(-(X ** 2).sum(1))

from sklearn.svm import SVC

clf = SVC(kernel='linear')

clf.fit(X, y)

fig = plt.figure()

ax = plt.subplot(111, projection='3d')

ax.scatter3D(X[:, 0], X[:, 1], r, c=y, s=50, cmap='autumn')

ax.set_xlabel('x')

ax.set_ylabel('y')

ax.set_zlabel('z')

ax.view_init(elev=30, azim=30)

# 绘制分界线

def plot_3D(elev=30, azim=30, X=X, y=y):

ax.view_init(elev=elev, azim=azim)

plt.scatter(X[:, 0], X[:, 1], r, c=y, s=50, cmap='autumn', edgecolors='k')

plt.xlabel('x')

plt.ylabel('y')

plt.show()

plot_3D()

以上代码可以获得一个高维空间中的分界线。

3. SVM 与其他算法的比较

我们现在来看看SVM算法与其他常见算法的比较。

3.1 SVM 与逻辑回归

与逻辑回归(Logistic Regression,LR)算法相比,SVM算法在非线性分类中更为优秀。但是在小型线性分类问题中,逻辑回归算法更快,所以在实际应用中需要根据具体情况选择。

3.2 SVM 与决策树

SVM算法的最大优点在于它可以处理高维数据,并且在处理高维数据时能够做到非常高的准确性。但是与决策树算法相比,SVM算法会更耗时。

因此,在处理高维数据时使用SVM算法是最好的选择,而对于较小的数据集,使用决策树算法更为合适。

4. 总结

支持向量机是一种分类算法,在分类问题中的优化目标是最大化分类边界到最近数据点的距离。支持向量机不仅仅适用于线性分类,还可以处理非线性分类。在处理高维数据时,SVM算法的准确性非常高,并且比决策树算法更适合处理这种情况。

后端开发标签