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

Распознавание рукописного текста — это проблема, которая восходит к первым автоматическим машинам, которым нужно было распознавать отдельные символы в рукописных документах. Подумайте, например, о почтовых индексах на письмах в почтовом отделении и об автоматизации, необходимой для распознавания этих пяти цифр. Безупречное распознавание этих кодов необходимо для автоматической и эффективной сортировки почты. В число других приложений, которые могут прийти на ум, входит программное обеспечение OCR (оптическое распознавание символов). Программное обеспечение OCR должно читать рукописный текст или страницы печатных книг для обычных электронных документов, в которых каждый символ четко определен. Но проблема распознавания почерка восходит еще дальше, а точнее к началу 20 века (1920-е годы), когда Эмануэль Гольдберг (1881–1970) начал свои исследования по этому вопросу и предположил, что статистический подход был бы оптимальным выбором.

В этом проекте наша цель — начать работу с машинным обучением для распознавания этого рукописного текста, поэтому сейчас я дам вам только упрощенное объяснение.

Сеть последовательного обучения

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

Сначала нейронная сеть обрабатывает первое изображение и выдает ответ: это 9. Соединения нейронов в сети устанавливаются случайным образом и дают что-то полезное, просто случайный ответ.

Ответ сравнивается с этикеткой. Здесь значение (9) на самом деле отличается от метки, то есть значение (3). Возвращается некоторая обратная связь, чтобы сеть могла улучшиться, предпочитая, как правило, давать правильный ответ.

Затем рассматривается следующий пример, и нейронная сеть обучается таким итерационным способом.

Цель:

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

Гипотеза:

Набор данных Digits библиотеки scikit-learn предоставляет многочисленные наборы данных, которые полезны для тестирования многих задач анализа данных и прогнозирования результатов. Некоторые ученые утверждают, что он точно предсказывает цифру в 95% случаев. Выполните анализ данных, чтобы принять или отклонить эту гипотезу.

Здесь я буду использовать Anaconda Kernel Interpreted VS Code Environment и библиотеки Python, такие как Matplotlib, Seaborn, Scikit-Learn.

Набор цифр:

Библиотека scikit-learn предоставляет множество наборов данных, полезных для тестирования многих задач анализа данных и прогнозирования результатов. Также в этом случае имеется набор изображений с названием Digits. Этот набор данных содержит 1797 изображений размером 8x8 пикселей. Каждое изображение представляет собой рукописную цифру в оттенках серого.

Импорт набора данных

Импортируйте модуль наборов данных из библиотеки sklearn и загрузите набор данных с помощью функции load_digits().

from sklearn import datasets
digits = datasets.load_digits()

Описание набора данных

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

print(digits.DESCR)

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

Вывод функции DESCR

Каждый набор данных в библиотеке scikit-learn имеет поле, содержащее всю информацию.

Цели

Числовые значения, представленные изображениями, т. е. цели, содержатся в массиве digit.targets.

digits.targetOutput:
array([0, 1, 2, ..., 8, 9, 8])

Форма набора данных

Размеры набора данных можно получить с помощью функции data.shape().

digits.data.shapeOutput:
(1797, 64)

Вывод показывает, что набор данных содержит 1797 изображений размером 8x8 (т. е. 8 * 8 = 64 пикселя). Другими словами, этот массив можно представить в 3D как стопку изображений размером 8x8 пикселей каждое.

Изображения рукописных цифр

Изображения рукописных цифр содержатся в массиве. Каждый элемент этого массива представляет собой изображение, представленное матрицей 8x8 числовых значений, соответствующих оттенкам серого от белого со значением 0 до черного со значением 15.

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

digits.images[0]

Массив количества черного в изображении 8x8

Визуализация массива

Мы можем визуально проверить содержимое этого результата. Следующие шаги могут сделать это

  1. Импортируйте модуль pyplot, который находится в matplotlib, как plt.
  2. Функция imshow() используется для отображения данных в виде изображения; то есть на обычном двумерном растре.
  3. cmap = gray_rотображает изображение в градациях серого.
  4. interpolation= ‘nearest’ отображает изображение без попытки интерполяции между пикселями, если разрешение экрана не совпадает с разрешением изображения.
  5. Функция title() используется для отображения заголовка на графике.
import matplotlib.pyplot as plt
plt.imshow(digits.images[0], cmap=plt.cm.gray_r, interpolation='nearest')
plt.title('one of the 1797 handwritten digits')
plt.savefig('plot1.png', dpi=100, bbox_inches='tight')

Выполнив эту команду, мы получим изображение в градациях серого следующим образом:

Визуализация 10 цифр

Используя библиотеки NumPy и matplotlib, мы можем отображать каждую цифру от 0 до 9 в виде массива в виде изображений.

  1. Функция figure() в модуле pyplot библиотеки matplotlib используется для создания нового figure заданного размера (15,4).
  2. subplots_adjust(hspace=0.8) используется для настройки расстояния между строками подграфиков.
  3. Объедините два списка с помощью функции zip() для упрощения обработки внутри цикла построения.
  4. Метод enumerate() добавляет счетчик к итерируемому объекту и возвращает его. Возвращаемый объект является объектом enumerate.
  5. Функция subplot() используется для добавления подграфика к текущей фигуре в указанной позиции сетки.
import numpy as np 
plt.figure(figsize=(15,4))
plt.subplots_adjust(hspace=0.8)images_and_labels = list(zip(digits.images, digits.target)) for index, (image, label) in enumerate(images_and_labels[:10]):                                    
    plt.subplot(2, 5, index + 1)    
    plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest') 
    plt.title('Training: %i' % label, fontsize =12)plt.savefig('plot2.png', dpi=300, bbox_inches='tight')

Тренировочное изображение каждой цифры

Свести входные изображения

Входные данные представляют собой изображения в градациях серого 8x8. мы можем создать плоский массив из 64-пиксельных значений, чтобы каждый пиксель соответствовал столбцу для классификатора.

  1. Функция len() возвращает количество изображений в наборе данных.
  2. Функция reshape() возвращает массив, содержащий те же данные с новой формой.
n = len(digits.images)
print(n)
data = digits.images.reshape((n, -1))Output:
1797

Сообщалось, что набор данных представляет собой обучающий набор, состоящий из 1797 изображений. Мы определили, что это правда.

Модель машинного обучения

В этом случае полезен оценщик sklearn.svm.SVC, в котором используется метод классификации опорных векторов (SVC).

«Машина опорных векторов» (SVM) – это контролируемый алгоритм машинного обучения, который в основном используется в задачах классификации.

Импортируйте модуль SVM из библиотеки scikit-learn и создайте средство оценки типа SVC, а затем выберите начальную настройку, назначив значения C и общие значения гаммы.

#import svm model
from sklearn import svm#Create a SVMClassifier
svc = svm.SVC(gamma=0.001, C=100.)

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

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

Импортируйте функцию train_test_split(), которая используется для разделения массивов данных на два подмножества, т. е. на обучающие и тестовые наборы.

Здесь мы разделили данные, назначив 0,01 в качестве размера теста.

from sklearn.model_selection import train_test_splitx_train, x_test, y_train, y_test = train_test_split(data, digits.target, test_size=0.01, random_state=0)

Обучите модель

мы можем обучить оценщик svc, который мы определили ранее, с помощью функции fit().

Через некоторое время появится обученный оценщик с текстовым выводом.

svc.fit(x_train, y_train)Output:
SVC(C=100.0, gamma=0.001)

Протестируйте модель

мы можем проверить наш оценщик, заставив его интерпретировать цифры тестового набора с помощью функции predict().

y_pred = svc.predict(x_test)
y_pred Output:
array([2, 8, 2, 6, 6, 7, 1, 9, 8, 5, 2, 8, 6, 6, 6, 6, 1, 0])

Получаем результаты в виде массива.

Визуализируйте тестовые изображения

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

images_and_predictions = list(zip(x_test,y_pred))plt.figure(figsize=(18,5))for index, (image, prediction) in enumerate(images_and_predictions[:19]):
     plt.subplot(2, 9, index + 1)
     image = image.reshape(8, 8)
     plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest')
     plt.title('Prediction: %i' % prediction)# save the figure
plt.savefig('plot3.png', dpi=300, bbox_inches='tight')

Тестовые изображения и их прогнозируемые значения

Он способен распознавать рукописные цифры и правильно интерпретировать все цифры проверочного набора.

Точность модели

Оценку точности модели можно получить с помощью функции score().

score = svm.score(x_test, y_test)Output:
Accuracy Score: 1.0

Матрица путаницы

Матрица путаницы – это таблица, которая часто используется для описания эффективности модели классификации (или "классификатора") на наборе тестовых данных, для которых известны истинные значения.

#For Confusion Matrix
from sklearn.metrics import confusion_matrix
import pandas as pd
import seaborn as sn data = confusion_matrix(y_test, y_pred)
df_cm = pd.DataFrame(data, columns=np.unique(y_test), index = np.unique(y_test))
df_cm.index.name = 'Actual'
df_cm.columns.name = 'Predicted' plt.figure(figsize = (10,10))
sn.set(font_scale=1.4)#for label size
plt.title('Confusion Matrix')
sn.heatmap(df_cm, annot=True,annot_kws={"size": 12})# font size

Отчет о классификации используется для измерения качества прогнозов по алгоритму классификации.

Отчет о классификации для обучающего набора с размером теста 0,01

Заключение

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

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

Тестировал модель с 3-мя разными диапазонами

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

Исходный код: GitHub

Я благодарен наставникам на https://internship.suvenconsultants.com за отличные формулировки задач и за то, что многие из нас получили опыт стажировки по программированию. Спасибо www.suvenconsultants.com.