在机器学习中,理解模型是如何做出决策的非常重要。决策边界是模型决策空间中的一个分界线,它将不同的类别分开。对于线性模型,这个边界通常是直线或平面。在本文中,将探讨如何使用Python和sklearn库来可视化一个多类SGD(随机梯度下降)分类器的决策边界。
首先,需要导入必要的库和数据集。Iris数据集是一个经典的机器学习数据集,包含了150个样本,每个样本有4个特征,并且分为3个类别。将使用这个数据集中的前两个特征来训练模型,这样可以在二维平面上可视化决策边界。
import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets
from sklearn.inspection import DecisionBoundaryDisplay
from sklearn.linear_model import SGDClassifier
接下来,加载Iris数据集,并只取前两个特征。然后,将数据随机打乱,并标准化特征值,以确保模型不会因为特征的量纲不同而产生偏差。
iris = datasets.load_iris()
X = iris.data[:, :2]
y = iris.target
colors = "bry"
idx = np.arange(X.shape[0])
np.random.seed(13)
np.random.shuffle(idx)
X = X[idx]
y = y[idx]
mean = X.mean(axis=0)
std = X.std(axis=0)
X = (X - mean) / std
clf = SGDClassifier(alpha=0.001, max_iter=100).fit(X, y)
现在,有了训练好的模型,可以绘制决策边界。将使用DecisionBoundaryDisplay类来帮助绘制。这个类可以自动为找到决策边界,并将其绘制在图上。
ax = plt.gca()
DecisionBoundaryDisplay.from_estimator(clf, X, cmap=plt.cm.Paired, ax=ax, response_method="predict",
xlabel=iris.feature_names[0], ylabel=iris.feature_names[1])
plt.axis("tight")
除了绘制决策边界,还可以绘制训练点,以查看它们是如何被分类的。将使用scatter函数来绘制这些点,并为每个类别指定不同的颜色。
for i, color in zip(clf.classes_, colors):
idx = np.where(y == i)
plt.scatter(X[idx, 0], X[idx, 1], c=color, label=iris.target_names[i], edgecolor="black", s=20)
plt.title("多类SGD的决策面")
plt.axis("tight")
最后,还可以绘制三个一对一(one-vs-all)分类器的超平面。这些超平面将显示每个类别与其他类别的分界线。
xmin, xmax = plt.xlim()
ymin, ymax = plt.ylim()
coef = clf.coef_
intercept = clf.intercept_
def plot_hyperplane(c, color):
def line(x0):
return (-(x0 * coef[c, 0]) - intercept[c]) / coef[c, 1]
plt.plot([xmin, xmax], [line(xmin), line(xmax)], ls="--", color=color)
for i, color in zip(clf.classes_, colors):
plot_hyperplane(i, color)
plt.legend()
plt.show()
通过上述代码,可以清晰地看到多类SGD分类器在Iris数据集上的决策边界。这些边界将不同的类别分开,并且每个类别的训练点都被正确地分类。这种可视化方法对于理解模型的决策过程非常有帮助。