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