Scikit - 学习分类器比较

Beginner

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

简介

在本实验中,我们将在合成数据集上比较 Scikit-Learn 中的几种分类器。本实验的目的是说明不同分类器决策边界的性质。我们将对数据集进行预处理,将其拆分为训练集和测试集,并绘制数据集。然后,我们将遍历分类器,在训练数据上拟合分类器,绘制决策边界,并绘制测试数据。最后,我们将显示测试集上的分类准确率。

虚拟机提示

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

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

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

导入必要的库

我们将首先导入必要的库。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline
from sklearn.datasets import make_moons, make_circles, make_classification
from sklearn.neural_network import MLPClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC
from sklearn.gaussian_process import GaussianProcessClassifier
from sklearn.gaussian_process.kernels import RBF
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.discriminant_analysis import QuadraticDiscriminantAnalysis
from sklearn.inspection import DecisionBoundaryDisplay

准备数据集

我们将使用三个合成数据集:月牙形、圆形和线性可分数据集。我们将对每个数据集进行预处理,将它们拆分为训练集和测试集,然后绘制数据集。

## 准备数据集
X, y = make_classification(
    n_features=2, n_redundant=0, n_informative=2, random_state=1, n_clusters_per_class=1
)
rng = np.random.RandomState(2)
X += 2 * rng.uniform(size=X.shape)
线性可分数据集 = (X, y)

数据集 = [
    make_moons(noise=0.3, random_state=0),
    make_circles(noise=0.2, factor=0.5, random_state=1),
    线性可分数据集,
]

## 绘制数据集
figure = plt.figure(figsize=(27, 9))
i = 1
for ds_cnt, ds in enumerate(数据集):
    X, y = ds
    X_train, X_test, y_train, y_test = train_test_split(
        X, y, test_size=0.4, random_state=42
    )

    x_min, x_max = X[:, 0].min() - 0.5, X[:, 0].max() + 0.5
    y_min, y_max = X[:, 1].min() - 0.5, X[:, 1].max() + 0.5

    cm = plt.cm.RdBu
    cm_bright = ListedColormap(["#FF0000", "#0000FF"])
    ax = plt.subplot(len(数据集), len(分类器) + 1, i)
    if ds_cnt == 0:
        ax.set_title("输入数据")
    ax.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=cm_bright, edgecolors="k")
    ax.scatter(
        X_test[:, 0], X_test[:, 1], c=y_test, cmap=cm_bright, alpha=0.6, edgecolors="k"
    )
    ax.set_xlim(x_min, x_max)
    ax.set_ylim(y_min, y_max)
    ax.set_xticks(())
    ax.set_yticks(())
    i += 1

需注意,文档中“分类器”处原文未给出具体内容,这里保留英文“classifiers”以便对照原文理解。

比较分类器

我们将遍历各个分类器,在训练数据上拟合这些分类器,绘制决策边界,并绘制测试数据。我们还将展示测试集上的分类准确率。

## 定义分类器
名称 = [
    "最近邻",
    "线性支持向量机",
    "径向基函数支持向量机",
    "高斯过程",
    "决策树",
    "随机森林",
    "神经网络",
    "AdaBoost",
    "朴素贝叶斯",
    "二次判别分析",
]

分类器 = [
    KNeighborsClassifier(3),
    SVC(kernel="linear", C=0.025),
    SVC(gamma=2, C=1),
    GaussianProcessClassifier(1.0 * RBF(1.0)),
    DecisionTreeClassifier(max_depth=5),
    RandomForestClassifier(max_depth=5, n_estimators=10, max_features=1),
    MLPClassifier(alpha=1, max_iter=1000),
    AdaBoostClassifier(),
    GaussianNB(),
    QuadraticDiscriminantAnalysis(),
]

## 比较分类器
for 名称, 分类器 in zip(名称, 分类器):
    ax = plt.subplot(len(数据集), len(分类器) + 1, i)

    分类器 = make_pipeline(StandardScaler(), 分类器)
    分类器.fit(X_train, y_train)
    得分 = 分类器.score(X_test, y_test)
    DecisionBoundaryDisplay.from_estimator(
        分类器, X, cmap=cm, alpha=0.8, ax=ax, eps=0.5
    )

    ax.scatter(
        X_train[:, 0], X_train[:, 1], c=y_train, cmap=cm_bright, edgecolors="k"
    )
    ax.scatter(
        X_test[:, 0], X_test[:, 1], c=y_test, cmap=cm_bright, alpha=0.6, edgecolors="k"
    )

    ax.set_xlim(x_min, x_max)
    ax.set_ylim(y_min, y_max)
    ax.set_xticks(())
    ax.set_yticks(())
    if ds_cnt == 0:
        ax.set_title(名称)
    ax.text(
        x_max - 0.3,
        y_min + 0.3,
        ("%.2f" % 得分).lstrip("0"),
        size=15,
        horizontalalignment="right",
    )
    i += 1

需注意,文档中“数据集”处原文未给出具体内容,这里保留英文“datasets”以便对照原文理解。

总结

在本实验中,我们在合成数据集上比较了 Scikit - Learn 中的几种分类器。我们对数据集进行了预处理,将它们拆分为训练集和测试集,并绘制了数据集。然后,我们遍历了各个分类器,在训练数据上拟合这些分类器,绘制了决策边界,并绘制了测试数据。最后,我们展示了测试集上的分类准确率。