Простой подход к системе распознавания рукописных цифр с использованием машинного обучения (SVM и KNN)

Распознавание рукописного ввода

Распознавание рукописного текста — это проблема, которая восходит к первым автоматическим машинам, которым нужно было распознавать отдельные символы в рукописных документах. Подумайте, например, о почтовых индексах на письмах в почтовом отделении и об автоматизации, необходимой для распознавания этих пяти цифр. Безупречное распознавание этих кодов необходимо для автоматической и эффективной сортировки почты. В число других приложений, которые могут прийти на ум, входит программное обеспечение OCR (оптическое распознавание символов). Программное обеспечение OCR должно читать рукописный текст или страницы печатных книг для обычных электронных документов, в которых каждый символ четко определен.

Набор данных MNIST

Набор данных MNIST — это аббревиатура, обозначающая модифицированный набор данных Национального института стандартов и технологий.

Это набор данных из 70 000 небольших квадратных изображений 28×28 пикселей в градациях серого, состоящих из рукописных одиночных цифр от 0 до 9.

Постановка задачи

Задача состоит в том, чтобы классифицировать заданное изображение рукописной цифры в один из 10 классов, представляющих целые числа от 0 до 9 включительно.

Пошаговый процесс распознавания рукописных цифр

Шаг 1. Импортируйте необходимые библиотеки.

  1. sklearn.datasets содержит множество различных наборов данных для создания и тестирования моделей машинного обучения.
  2. sklearn.metrics для расчета точности и достоверности
  3. sklearn.neighboursдля алгоритма KNN
  4. sklearnдля алгоритма SVM
  5. numpy для числовых расчетов
from sklearn.datasets import fetch_openml
from sklearn.metrics import accuracy_score,classification_report
from sklearn.neighbors import KNeighborsClassifier
import numpy as np
from sklearn import svm

Шаг 2. Получение данных из наборов данных Sklearn

mnist = fetch_openml(‘mnist_784’)

Шаг 3: понимание данных

После загрузки набора данных вы можете проанализировать содержимое. Во-первых, вы можете прочитать много информации о наборах данных, вызвав атрибут DESCR.

print(digits.DESCR)

Для текстового описания набора данных появятся авторы, принимавшие участие в его создании, и ссылки.

mnist.data

mnist.target.shape

Шаг 4: Использование Matplotlib для визуализации рукописных цифр

mnist.data содержит все данные в одномерном массиве. Мы должны преобразовать фрейм данных в массив NumPy, а затем преобразовать его в 28x28.

image= mnist.data.to_numpy()
plt.subplot(431)
plt.imshow((image[0].reshape(28,28)), cmap=plt.cm.gray_r, 
interpolation=’nearest’)
plt.subplot(432)
plt.imshow(image[1].reshape(28,28), cmap=plt.cm.gray_r, 
interpolation=’nearest’)
plt.subplot(433)
plt.imshow(image[3].reshape(28,28), cmap=plt.cm.gray_r, 
interpolation=’nearest’)
plt.subplot(434)
plt.imshow(image[4].reshape(28,28), cmap=plt.cm.gray_r, 
interpolation=’nearest’)
plt.subplot(435)
plt.imshow(image[5].reshape(28,28), cmap=plt.cm.gray_r, 
interpolation=’nearest’)
plt.subplot(436)
plt.imshow(image[6].reshape(28,28), cmap=plt.cm.gray_r, 
interpolation=’nearest’)

Шаг 5: Разделение набора данных на обучающие данные и тестовые данные.

index_number= np.random.permutation(70000)
x1,y1=mnist.data.loc[index_number],mnist.target.loc[index_number]
x1.reset_index(drop=True,inplace=True)
y1.reset_index(drop=True,inplace=True)
x_train , x_test = x1[:55000], x1[55000:]
y_train , y_test = y1[:55000], y1[55000:]

Шаг 6: Реализация алгоритма SVM и расчет его точности.

svc = svm.SVC(gamma=’scale’,class_weight=’balanced’,C=100)
svc.fit(x_train,y_train)
result=svc.predict(x_test)
print('Accuracy :',accuracy_score(y_test,result))
print(classification_report(y_test,result))

Шаг 6. Реализация алгоритма KNN и расчет его точности.

knn = KNeighborsClassifier(n_neighbors=6,weights=’distance’)
knn.fit(x_train, y_train)
# Predict on dataset which model has not seen before
result=knn.predict(x_test)
print('Accuracy :',accuracy_score(y_test,result))
print(classification_report(y_test,result))

Вывод:

В этом блоге мы создаем простой алгоритм для обнаружения рукописных цифр с использованием алгоритмов машинного обучения (SVM и KNN). KNN дает точность 97,34%, а SVM (ядро RBF) дает точность 98,52%. Алгоритм KNN быстрее, чем SVM, хотя точность SVM ниже.