使用投票分类器进行鸢尾花分类

Machine LearningMachine LearningBeginner
立即练习

This tutorial is from open-source community. Access the source code

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,我们将使用 Scikit-Learn 的 VotingClassifier 基于两个特征预测鸢尾花的类别。我们将分别比较 DecisionTreeClassifierKNeighborsClassifierSVC 分类器的预测结果,然后使用 VotingClassifier 组合它们的预测结果,看看是否能得到更好的结果。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到 笔记本 标签页,以访问 Jupyter Notebook 进行练习。

有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。

如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们会立即为你解决问题。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/ModelSelectionandEvaluationGroup(["Model Selection and Evaluation"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/tree("Decision Trees") sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/neighbors("Nearest Neighbors") sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/ensemble("Ensemble Methods") sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/svm("Support Vector Machines") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/inspection("Inspection") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/tree -.-> lab-49328{{"使用投票分类器进行鸢尾花分类"}} sklearn/neighbors -.-> lab-49328{{"使用投票分类器进行鸢尾花分类"}} sklearn/ensemble -.-> lab-49328{{"使用投票分类器进行鸢尾花分类"}} sklearn/svm -.-> lab-49328{{"使用投票分类器进行鸢尾花分类"}} sklearn/inspection -.-> lab-49328{{"使用投票分类器进行鸢尾花分类"}} ml/sklearn -.-> lab-49328{{"使用投票分类器进行鸢尾花分类"}} end

加载数据

我们将使用 Scikit-Learn 的 datasets 模块加载鸢尾花数据集。我们只使用两个特征:萼片长度和花瓣长度。

from sklearn import datasets

iris = datasets.load_iris()
X = iris.data[:, [0, 2]]
y = iris.target

训练分类器

我们将初始化三个分类器:DecisionTreeClassifierKNeighborsClassifierSVC。然后,我们将使用这三个分类器初始化一个 VotingClassifier,并使用它来预测鸢尾花的类别。

from sklearn.tree import DecisionTreeClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC
from sklearn.ensemble import VotingClassifier

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)

绘制决策边界

我们将为每个分类器以及 VotingClassifier 绘制决策边界。

import matplotlib.pyplot as plt
from itertools import product
from sklearn.inspection import DecisionBoundaryDisplay

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)", "K近邻(k = 7)", "核支持向量机", "软投票"],
):
    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()

解读结果

我们可以看到,DecisionTreeClassifierKNeighborsClassifier 的决策边界相对简单,而 SVC 的决策边界则更为复杂。VotingClassifier 的决策边界与 SVC 的决策边界相似,但在某些区域的复杂度较低。

总结

在本实验中,我们使用了 Scikit-Learn 的 VotingClassifier 基于两个特征来预测鸢尾花的类别。我们训练了三个分类器:DecisionTreeClassifierKNeighborsClassifierSVC。然后,我们使用 VotingClassifier 来组合它们的预测结果并绘制了决策边界。我们发现 VotingClassifier 的决策边界与 SVC 的决策边界相似,但在某些区域的复杂度较低。