{"id":14287,"url":"\/distributions\/14287\/click?bit=1&hash=1d1b6427c21936742162fc18778388fc58ebf8e17517414e1bfb1d3edd9b94c0","hash":"1d1b6427c21936742162fc18778388fc58ebf8e17517414e1bfb1d3edd9b94c0","title":"\u0412\u044b\u0440\u0430\u0441\u0442\u0438 \u0438\u0437 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0434\u043e \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044f \u0437\u0430 \u0433\u043e\u0434","buttonText":"","imageUuid":""}

Распознавание цифр, написанных от руки, с помощью Machine Learning

Каждый день люди сталкиваются с огромным количеством данных, но, несмотря на переход к электронному документообороту, встречаются документы, которые отсканированы человеком и содержат рукописный текст, в том числе цифры, даты, подписи и пр.

Распознавание рукописного текста – это огромная проблема, так как существует всего 10 цифр, а почерк человека может сильно варьироваться. И порой с задачей распознания рукописного текста не справляется даже сам человек, что уж говорить о почерке врача 😊

Классификация рукописного текста или цифр очень важна на практике, это поможет сократить время на разбор огромного количества данных.

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

Кратко о наборе данных digits

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

Для того чтобы работать с распознаванием рукописного текста, вам понадобятся следующие библиотеки: matplotlib, sklearn, scipy.

На примере встроенного набора данных библиотеки sklearn — digits рассмотрим выполнение распознавания цифр. Для этого импортируем его, чтобы начать использовать.

import sklearn.datasets dd = datasets.load_digits() print(dd.DESCR)

Область данных digits представляет собой словарь, в котором содержатся данные, целевые объекты, изображения, а также названия объектов и описание набора данных с названиями целевых объектов и пр.

Я ориентируюсь на наборе данных и целевой функции, извлечем два списка в две разные переменные.

m_d=dd['data'] tt=dd['target'] print(len(m_d)) import matplotlib.pyplot as pltt %matplotlib inline def show_cifr(index): pltt.imshow(dd.images[index],cmap=pltt.cm.gray_r, interpolation='nearest') pltt.title('Цифра: ' + str(dd.target[index])) pltt.show() show_cifr(8)

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

Классификатор опорных векторов

Задача этого алгоритма заключается в том, чтобы найти гиперплоскость в n-мерном пространстве, где n – это число признаков, чтобы проклассифицировать все точки данных.

from sklearn import svm svm = svm.SVC(gamma = 0.001, C=100.) svc.fit(m_d[:1790], tt[:1790]) pr = svc.predict(m_d[1791:]) pr, tt[1791:]

На выходе мы получили 100% совпадение, где 1791 значение используется для обучения, а 6 входных данных используются для тестирования.

Классификатор деревьев решений

В классификаторе дерева решений применяется простая идея решения задачи классифкации. Задается ряд тщательно продуманных вопросов об атрибутах тестовой записи. Каждый раз, когда будет задан вопрос – на выходе получаем ответ до тех пор, пока не будет сделан вывод о классовой метке записи.

from sklearn.tree import DecisionTreeClassifier dt = DecisionTreeClassifier(criterion = ‘gini’) dt.fit(m_d[:1550] , tt[:1550]) pr2 = dt.predict(m_d[1551:] import sklearn.metrics.accuracy_score import sklearn.metrics.confusion_matrix confusion_matrix(tt[1551:], pr2)
accuracy_score(tt[1551:], pr2)

Как можно видеть, классификатор дерева решений плохо работает с данными. Вы можете попробовать повысить точность путем настройки гиперпараметров DTC.

Классификатор случайного леса

Случайный лес – является контролируемым алгоритмом обучения. Его используют как для классификации, так и для регрессии.

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

import sklearn.ensemble.RandomForestClassifier rc = RandomForestClassifier(n_estimators = 150) rc.fit(m_d[:1400], tt[:1400]) pr3 = rc.predict(m_d[1401:]) accurace_store(tt[1401:], pr3)

Таким образом, мы можем увидеть, что случайный лес отлично работает на меньшем количестве данных в сравнении с деревом решений. Оценка точности составляет 92%.

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

Удачи в кодировании! 😊

0
1 комментарий
Олег Гафуров

А Вы не пробовали использовать PANN? Легкая сеть, которую можно настроить даже на распознавание цифр написанных рукой в воздухе. Я бы посмотрел, думаю это в Вашей теме.  

Ответить
Развернуть ветку
-2 комментариев
Раскрывать всегда