投票分类器决策边界可视化

机器学习领域,分类器的决策边界是理解模型如何区分不同类别的重要工具。本文将介绍如何使用Python的scikit-learn库来可视化投票分类器(VotingClassifier)的决策边界。将以Iris数据集中的两个特征为例,展示如何绘制决策边界,并计算并展示一个样本的类别概率。

首先,初始化了三个示例分类器:决策树分类器(DecisionTreeClassifier)、K最近邻分类器(KNeighborsClassifier)和支持向量机分类器(SVC)。这些分类器被用来初始化一个软投票的VotingClassifier,其权重设置为[2, 1, 2]。这意味着在计算平均概率时,决策树分类器和SVC的预测概率的权重是K最近邻分类器的两倍。

使用了Iris数据集中的两个特征来训练这些分类器。Iris数据集是一个经典的多类分类数据集,包含了150个样本,每个样本有四个特征,分别代表花萼的长度和宽度以及花瓣的长度和宽度。选择了前两个特征(花萼的长度和宽度)来进行分类器的训练和可视化。

接下来,展示了如何使用matplotlib库来绘制决策边界。创建了一个2x2的子图,分别用于展示单个分类器的决策边界和投票分类器的决策边界。每个子图都使用DecisionBoundaryDisplay.from_estimator方法来绘制分类器的决策边界,并通过scatter方法在同一个子图上绘制了数据点。

在代码实现部分,首先导入了必要的库,包括itertools、matplotlib.pyplot、sklearn中的datasets、ensemble、inspection、neighbors、svm和tree模块。然后,加载了Iris数据集,并从中提取了前两个特征作为X,以及对应的目标变量y。接着,初始化了三个分类器,并使用这些分类器来初始化VotingClassifier。对每个分类器进行了训练,并使用VotingClassifier对数据进行了预测。

在绘制决策边界时,使用了for循环来遍历每个分类器和对应的子图。在每次迭代中,使用DecisionBoundaryDisplay.from_estimator方法来绘制分类器的决策边界,并设置了alpha参数为0.4,以使边界半透明。然后,使用scatter方法在同一个子图上绘制了数据点,并通过set_title方法设置了子图的标题。最后,使用plt.show()方法来显示绘制的图形。

通过这种方式,可以直观地看到不同分类器的决策边界,以及投票分类器是如何结合这些边界来进行预测的。这有助于理解模型的工作原理,以及如何通过调整分类器的权重来优化模型的性能。

from sklearn import datasets from sklearn.ensemble import VotingClassifier from sklearn.inspection import DecisionBoundaryDisplay from sklearn.neighbors import KNeighborsClassifier from sklearn.svm import SVC from sklearn.tree import DecisionTreeClassifier import matplotlib.pyplot as plt from itertools import product # 加载示例数据 iris = datasets.load_iris() X = iris.data[:, [0, 2]] y = iris.target # 训练分类器 clf1 = DecisionTreeClassifier(max_depth=4) clf2 = KNeighborsClassifier(n_neighbors=7) clf3 = SVC(gamma=0.1, kernel="rbf", probability=True) eclf = VotingClassifier(estimators=[("dt", clf1), ("knn", clf2), ("svc", clf3)], voting="soft", weights=[2, 1, 2]) clf1.fit(X, y) clf2.fit(X, y) clf3.fit(X, y) eclf.fit(X, y) # 绘制决策区域 f, axarr = plt.subplots(2, 2, sharex="col", sharey="row", figsize=(10, 8)) for idx, clf, tt in zip(product([0, 1], [0, 1]), [clf1, clf2, clf3, eclf], ["决策树(深度=4)", "KNN(k=7)", "核SVM", "软投票"]): DecisionBoundaryDisplay.from_estimator(clf, X, alpha=0.4, ax=axarr[idx[0], idx[1]], response_method="predict") axarr[idx[0], idx[1]].scatter(X[:, 0], X[:, 1], c=y, s=20, edgecolor="k") axarr[idx[0], idx[1]].set_title(tt) plt.show()
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485