在本例中,将探讨如何利用Python编程语言中的matplotlib库和scikit-learn库,对鸢尾花数据集中的前两个特征(萼片长度和萼片宽度)进行可视化,以展示四种不同核函数的SVM分类器的决策边界。这些核函数包括线性核、径向基函数(RBF)核和多项式核。
首先,需要了解线性模型和非线性模型在决策边界上的差异。线性模型,如LinearSVC()和SVC(kernel='linear'),会产生直线型的决策边界,而这两种模型在决策边界上的差异可能源于它们在损失函数和多类分类策略上的不同。LinearSVC()通过最小化平方铰链损失来优化模型,而SVC()则最小化常规铰链损失。此外,LinearSVC()采用一对多(One-vs-All)的多类策略,而SVC()则采用一对一(One-vs-One)策略。
非线性核模型,如使用多项式或高斯RBF核的SVC,能够产生更灵活的非线性决策边界。这些边界的形状取决于所使用的核函数类型及其参数。需要注意的是,虽然在二维数据集上绘制分类器的决策函数可以帮助直观理解它们的表达能力,但这些直观理解并不总是能够推广到更现实的高维问题上。
以下是一个Python代码示例,展示了如何加载鸢尾花数据集,创建SVM模型,并绘制它们的决策边界。
import matplotlib.pyplot as plt
from sklearn import datasets, svm
from sklearn.inspection import DecisionBoundaryDisplay
# 加载鸢尾花数据集
iris = datasets.load_iris()
# 仅取前两个特征
X = iris.data[:, :2]
y = iris.target
# 设置SVM正则化参数
C = 1.0
# 创建SVM模型实例
models = (
svm.SVC(kernel="linear", C=C),
svm.LinearSVC(C=C, max_iter=10000),
svm.SVC(kernel="rbf", gamma=0.7, C=C),
svm.SVC(kernel="poly", degree=3, gamma="auto", C=C),
)
# 训练模型
models = (clf.fit(X, y) for clf in models)
# 设置图表标题
titles = (
"SVC with linear kernel",
"LinearSVC (linear kernel)",
"SVC with RBF kernel",
"SVC with polynomial (degree 3) kernel",
)
# 设置2x2网格进行绘图
fig, sub = plt.subplots(2, 2)
plt.subplots_adjust(wspace=0.4, hspace=0.4)
X0, X1 = X[:, 0], X[:, 1]
# 绘制决策边界和数据点
for clf, title, ax in zip(models, titles, sub.flatten()):
disp = DecisionBoundaryDisplay.from_estimator(
clf,
X,
response_method="predict",
cmap=plt.cm.coolwarm,
alpha=0.8,
ax=ax,
xlabel=iris.feature_names[0],
ylabel=iris.feature_names[1],
)
ax.scatter(X0, X1, c=y, cmap=plt.cm.coolwarm, s=20, edgecolors="k")
ax.set_xticks(())
ax.set_yticks(())
ax.set_title(title)
plt.show()
运行上述脚本,可以得到一个包含四个子图的图形,每个子图展示了一个SVM分类器的决策边界。这些子图的标题分别对应于所使用的核函数类型。通过观察这些图形,可以直观地比较不同核函数对决策边界的影响。
需要注意的是,虽然这种可视化方法对于理解SVM分类器在简单二维数据集上的表现很有帮助,但在处理更复杂的高维数据时,这种直观理解可能并不总是适用。因此,在实际应用中,需要结合其他方法和指标来全面评估模型的性能。