简介
本实验展示了如何使用 scikit-learn 识别 0 到 9 的手写数字图像。
虚拟机使用提示
虚拟机启动完成后,点击左上角切换到“笔记本”标签,以访问 Jupyter Notebook 进行练习。
有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。
如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们会及时为你解决问题。
本实验展示了如何使用 scikit-learn 识别 0 到 9 的手写数字图像。
虚拟机启动完成后,点击左上角切换到“笔记本”标签,以访问 Jupyter Notebook 进行练习。
有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。
如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们会及时为你解决问题。
首先,我们需要导入必要的库。我们将使用matplotlib进行可视化,从sklearn中导入datasets和metrics来加载和评估数据集,并使用svm来训练支持向量机。
import matplotlib.pyplot as plt
from sklearn import datasets, svm, metrics
from sklearn.model_selection import train_test_split
我们将加载数字数据集,该数据集由 8x8 像素的数字图像组成。我们将使用matplotlib的imshow()方法来可视化前 4 张图像及其对应的标签。
digits = datasets.load_digits()
_, axes = plt.subplots(nrows=1, ncols=4, figsize=(10, 3))
for ax, image, label in zip(axes, digits.images, digits.target):
ax.set_axis_off()
ax.imshow(image, cmap=plt.cm.gray_r, interpolation="nearest")
ax.set_title("Training: %i" % label)
我们需要将图像展平,把每个形状为(8, 8)的二维灰度值数组转换为形状为(64,)的数组。这将为我们提供一个形状为(n_samples, n_features)的数据集,其中n_samples是图像的数量,n_features是每个图像中的像素总数。
n_samples = len(digits.images)
data = digits.images.reshape((n_samples, -1))
我们将使用sklearn.model_selection中的train_test_split()方法将数据集分割为 50% 的训练子集和 50% 的测试子集。
X_train, X_test, y_train, y_test = train_test_split(
data, digits.target, test_size=0.5, shuffle=False
)
我们将使用sklearn中的svm.SVC()方法在训练样本上训练一个支持向量分类器。
clf = svm.SVC(gamma=0.001)
clf.fit(X_train, y_train)
我们将使用训练好的模型来预测测试子集中样本的数字值。然后,我们将使用sklearn.metrics中的metrics.classification_report()和metrics.ConfusionMatrixDisplay.from_predictions()方法来评估模型。
predicted = clf.predict(X_test)
print(
f"Classification report for classifier {clf}:\n"
f"{metrics.classification_report(y_test, predicted)}\n"
)
disp = metrics.ConfusionMatrixDisplay.from_predictions(y_test, predicted)
disp.figure_.suptitle("Confusion Matrix")
print(f"Confusion matrix:\n{disp.confusion_matrix}")
如果评估分类器的结果以混淆矩阵的形式存储,而不是以y_true和y_pred的形式存储,我们仍然可以使用metrics.classification_report()方法按如下方式构建分类报告:
y_true = []
y_pred = []
cm = disp.confusion_matrix
for gt in range(len(cm)):
for pred in range(len(cm)):
y_true += [gt] * cm[gt][pred]
y_pred += [pred] * cm[gt][pred]
print(
"Classification report rebuilt from confusion matrix:\n"
f"{metrics.classification_report(y_true, y_pred)}\n"
)
在本实验中,我们学习了如何使用 scikit-learn 通过支持向量机识别 0 到 9 的手写数字。我们加载并可视化了数字数据集,准备并分割了数据集,训练了模型,使用分类报告和混淆矩阵对模型进行了预测和评估。