手写数字分类的在线求解器比较

Beginner

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

简介

在本实验中,我们将比较不同在线求解器对手写数字分类的性能。我们将使用 scikit-learn 库来加载和预处理数据,以及训练和测试分类器。目标是观察不同求解器在不同比例的训练数据下的表现。

虚拟机使用提示

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

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

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

加载并预处理数据

我们将首先从 scikit-learn 中加载手写数字数据集,并将其拆分为训练集和测试集。我们还将对数据进行缩放,使其均值为零,方差为单位方差。

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

## 加载数字数据集
X, y = datasets.load_digits(return_X_y=True)

## 将数据拆分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

## 对数据进行缩放,使其均值为零,方差为单位方差
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

定义分类器

我们将定义几个用于分类的在线求解器,每个求解器都有不同的超参数。我们将使用以下分类器:

  • SGDClassifier
  • 感知机(Perceptron)
  • 被动攻击分类器(PassiveAggressiveClassifier)
  • 逻辑回归(LogisticRegression)
from sklearn.linear_model import SGDClassifier, Perceptron, PassiveAggressiveClassifier, LogisticRegression

classifiers = [
    ("随机梯度下降(SGD)", SGDClassifier(max_iter=1000)),
    ("感知机", Perceptron(max_iter=1000)),
    ("被动攻击 I 型", PassiveAggressiveClassifier(max_iter=1000, loss="hinge", C=1.0, tol=1e-4)),
    ("被动攻击 II 型", PassiveAggressiveClassifier(max_iter=1000, loss="squared_hinge", C=1.0, tol=1e-4)),
    ("逻辑回归", LogisticRegression(max_iter=1000))
]

训练并评估分类器

我们将在 1% 到 95% 的不同比例训练数据上训练每个分类器,并在测试集上评估它们的性能。我们将重复这个过程 10 次,以更准确地估计测试错误率。

heldout = [0.01, 0.05, 0.25, 0.5, 0.75, 0.9, 0.95]
rounds = 10
xx = 1.0 - np.array(heldout)

for name, clf in classifiers:
    print("Training %s" % name)
    yy = []
    for i in heldout:
        yy_ = []
        for r in range(rounds):
            X_train_, X_test_, y_train_, y_test_ = train_test_split(X_train, y_train, test_size=i, random_state=r)
            clf.fit(X_train_, y_train_)
            y_pred = clf.predict(X_test_)
            yy_.append(1 - np.mean(y_pred == y_test_))
        yy.append(np.mean(yy_))
    plt.plot(xx, yy, label=name)

plt.legend(loc="upper right")
plt.xlabel("Proportion of training data")
plt.ylabel("Test error rate")
plt.show()

解读结果

从图表中我们可以观察到,随机梯度下降分类器(SGDClassifier)、感知机(Perceptron)和被动攻击分类器的表现相似,其中被动攻击 II 型分类器的性能略好一些。逻辑回归(LogisticRegression)分类器总体表现最佳,在所有比例的训练数据下测试错误率最低。

总结

在本实验中,我们比较了不同在线求解器对手写数字分类的性能。我们观察到逻辑回归(LogisticRegression)分类器总体表现最佳,而随机梯度下降分类器(SGDClassifier)、感知机(Perceptron)和被动攻击分类器的表现相似。这种比较有助于我们为特定问题和数据集选择最合适的分类器。