在机器学习领域,支持向量机(SVM)是一种常用的分类算法。本页面将介绍如何使用不同的SVM分类器对鸢尾花数据集进行分类,并展示它们的决策边界。鸢尾花数据集是一个经典的多类分类数据集,包含了150个样本,每个样本有四个特征,分别是萼片长度、萼片宽度、花瓣长度和花瓣宽度。在本例中,只考虑前两个特征,即萼片长度和萼片宽度,以便于在二维平面上可视化决策边界。
比较了四种不同的SVM分类器:线性SVM、线性SVC、RBF核SVM和多项式核SVM。线性模型的决策边界是线性的,而非线性模型的决策边界则更加灵活,可以根据核函数和参数的不同而变化。线性SVM和线性SVC虽然都使用线性决策边界,但它们在损失函数和多类分类策略上有所不同。线性SVM最小化平方合页损失,而线性SVC最小化常规合页损失。此外,线性SVM使用一对多(One-vs-All)的多类分类策略,而线性SVC使用一对一(One-vs-One)的策略。
在实际应用中,虽然在二维数据集上绘制分类器的决策函数可以帮助直观地理解它们的表达能力,但需要注意的是,这些直观感受并不总是能够推广到更现实的高维问题上。因此,在处理高维数据时,需要更加谨慎地选择和调整SVM分类器的参数。
以下是使用Python和scikit-learn库实现上述SVM分类器并绘制决策边界的代码示例。首先,导入必要的库,包括matplotlib用于绘图,sklearn用于加载数据集和训练模型,以及DecisionBoundaryDisplay用于显示决策边界。然后,加载鸢尾花数据集,并提取前两个特征。接下来,创建四个不同的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",
)
# 设置绘图网格
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)
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和线性SVC的决策边界是直线,而RBF核SVM和多项式核SVM的决策边界则是曲线。这些决策边界的形状和位置取决于核函数的选择和参数的设置。通过调整这些参数,可以优化模型的性能,使其更好地适应训练数据和预测新数据。