Распознавание рукописных цифр

Beginner

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

Введение

В этом практическом занятии показано, как использовать scikit-learn для распознавания изображений рукописных цифр от 0 до 9.

Советы по использованию ВМ

После запуска виртуальной машины щелкните в верхнем левом углу, чтобы переключиться на вкладку Ноутбук и получить доступ к Jupyter Notebook для практики.

Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook не загрузится полностью. Проверка операций не может быть автоматизирована из-за ограничений Jupyter Notebook.

Если вы столкнетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.

Импорт библиотек

Сначала нам нужно импортировать необходимые библиотеки. Мы будем использовать matplotlib для визуализации, datasets и metrics из sklearn для загрузки и оценки набора данных, а также svm для обучения на支持向量机 (support vector machine).

import matplotlib.pyplot as plt
from sklearn import datasets, svm, metrics
from sklearn.model_selection import train_test_split

Загрузка и визуализация набора данных цифр

Мы загрузим набор данных цифр, состоящий из изображений цифр размером 8x8 пикселей. Мы будем использовать метод imshow() из matplotlib для визуализации первых 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))

Разделение набора данных

Мы разделим набор данных на обучающую и тестовую подмножества в соотношении 50% - 50% с использованием метода train_test_split() из sklearn.model_selection.

X_train, X_test, y_train, y_test = train_test_split(
    data, digits.target, test_size=0.5, shuffle=False
)

Обучение支持向量机 (support vector machine)

Мы обучим классификатор на основе支持向量机 (support vector machine) на обучающих примерах с использованием метода svm.SVC() из sklearn.

clf = svm.SVC(gamma=0.001)
clf.fit(X_train, y_train)

Предсказание и оценка модели

Мы будем использовать обученную модель для предсказания значений цифр для образцов в тестовой подмножестве. Затем мы оценим модель с использованием методов metrics.classification_report() и metrics.ConfusionMatrixDisplay.from_predictions() из sklearn.metrics.

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 с использованием support vector machine. Мы загрузили и визуализировали набор данных с цифрами, подготовили и разделили набор данных, обучили модель, предсказали и оценили модель с использованием отчета о классификации и матрицы ошибок.