Каждый день люди сталкиваются с огромным количеством данных, но, несмотря на переход к электронному документообороту, встречаются документы, которые отсканированы человеком и содержат рукописный текст, в том числе цифры, даты, подписи и пр.Распознавание рукописного текста – это огромная проблема, так как существует всего 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% точности распознавания рукописного набора данных. Но прежде необходимо убедиться, что тестовые данные будут хорошими, иначе модель может быть перегружена.Удачи в кодировании! 😊
А Вы не пробовали использовать PANN? Легкая сеть, которую можно настроить даже на распознавание цифр написанных рукой в воздухе. Я бы посмотрел, думаю это в Вашей теме.