本教程是一个关于如何使用不同的支持向量机(SVM)核函数的练习。这个练习是监督学习教程部分中的一个环节,旨在帮助学习者理解并掌握SVM核函数在实际问题中的应用。为scikit-learn开发者团队,遵循BSD-3-Clause许可证。
首先,需要导入必要的库,包括matplotlib用于绘图,numpy用于数学运算,以及sklearn中的datasets和svm模块。接着,加载了著名的鸢尾花数据集,并对其进行了预处理,只保留了两个类别的数据,以便于在二维平面上进行可视化。
import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, svm
iris = datasets.load_iris()
X = iris.data
y = iris.target
X = X[y != 0, :2]
y = y[y != 0]
接下来,设置了随机种子,以确保结果的可重复性。然后,对数据进行了随机打乱,并按照90%的比例划分了训练集和测试集。
n_sample = len(X)
np.random.seed(0)
order = np.random.permutation(n_sample)
X = X[order]
y = y[order].astype(float)
X_train = X[:int(0.9 * n_sample)]
y_train = y[:int(0.9 * n_sample)]
X_test = X[int(0.9 * n_sample):]
y_test = y[int(0.9 * n_sample):]
在模型训练阶段,尝试了三种不同的核函数:线性核、径向基函数核(RBF)和多项式核。对于每种核函数,都创建了一个SVC模型,并使用训练数据对其进行了训练。然后,使用训练好的模型对测试数据进行了预测,并在二维平面上绘制了决策边界。
for kernel in ("linear", "rbf", "poly"):
clf = svm.SVC(kernel=kernel, gamma=10)
clf.fit(X_train, y_train)
plt.figure()
plt.clf()
plt.scatter(X[:, 0], X[:, 1], c=y, zorder=10, cmap=plt.cm.Paired, edgecolor="k", s=20)
plt.scatter(X_test[:, 0], X_test[:, 1], s=80, facecolors="none", zorder=10, edgecolor="k")
plt.axis("tight")
x_min = X[:, 0].min()
x_max = X[:, 0].max()
y_min = X[:, 1].min()
y_max = X[:, 1].max()
XX, YY = np.mgrid[x_min:x_max:200j, y_min:y_max:200j]
Z = clf.decision_function(np.c_[XX.ravel(), YY.ravel()])
Z = Z.reshape(XX.shape)
plt.pcolormesh(XX, YY, Z > 0, cmap=plt.cm.Paired)
plt.contour(XX, YY, Z, colors=["k", "k", "k"], linestyles=["--", "-", "--"], levels=[-0.5, 0, 0.5])
plt.title(kernel)
plt.show()
通过上述代码,可以清晰地看到不同核函数对决策边界的影响。线性核生成了一个直线决策边界,而RBF和多项式核则能够生成更加复杂的曲线边界,以更好地适应数据的分布。这个练习不仅帮助理解了SVM核函数的工作原理,还展示了如何在实际问题中应用这些核函数。
整个脚本的运行时间大约为5.41秒,这表明了使用SVM进行分类的效率。此外,本教程还提供了Jupyter Notebook和Python源代码的下载链接,方便学习者进一步学习和实践。
相关示例还包括了高斯过程分类(GPC)在鸢尾花数据集上的应用,以及多层感知器中正则化的变化等。这些示例进一步扩展了对机器学习模型的理解,并展示了不同模型在实际问题中的应用。