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

Классификация может быть бинарной или мультиклассовой. Бинарная классификация состоит из двух значений: истинного или ложного, т. е. бинарный классификатор различает только два класса. В то время как бинарные классификаторы работают между двумя классами, мультиклассовые классификаторы могут различать более двух классов. Эта модель может быть построена с использованием алгоритмов мультиклассовой классификации, таких как деревья решений, случайный лес, SVM, логистическая регрессия, KNN, наивный байеровский алгоритм и т. д. Для этой модели мы используем алгоритм машины опорных векторов (SVM).

Первоначально нам нужно загрузить набор данных для работы. Scikit-learn предоставляет множество функций для загрузки популярных наборов данных. Здесь мы используем набор данных MNIST.

Что такое МНИСТ?

Набор данных MNIST представляет собой набор из 70 000 небольших изображений цифр, написанных от руки школьниками и сотрудниками Центрального бюро США. Каждое из этих изображений имеет свои соответствующие метки в наборе данных.

Итак, теперь у вас есть представление о наборе данных MNIST. Давайте сначала получим набор данных.

#loading the dataset
from sklearn.datasets import fetch_openml
mnist = fetch_openml('mnist_784',version=1
mnist.keys()

Загруженный набор данных обычно имеет аналогичную структуру словаря, включая:

  • Ключ DESCR, описывающий набор данных.
  • Ключ данных состоит из массива с одной строкой на экземпляр и одним столбцом на функцию.
  • Целевой ключ содержит массив соответствующих меток в виде строк.
mnist['data']

output:
array([[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
...,
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.]])

mnist['target']
output:
array(['5', '0', '4', ..., '4', '5', '6'], dtype=object)

X, y = mnist['data'], mnist['target']
X.shape
(70000, 784)
y.shape
(70000, )

Набор данных mnist_784 версии 1. Этот набор данных содержит 70 000 изображений, каждое из которых содержит 784 функции, поскольку каждое изображение имеет размер 28 x 28 пикселей, и каждая функция представляет интенсивность одного пикселя.

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

import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.image as img
some_digit = X[0]
some_digit_image = some_digit.reshape(28, 28)
plt.imshow(some_digit_image, cmap=mpl.cm.binary, interpolation='nearest')
plt.axis("off")
plt.show()

Разделение данных поезда и теста

X_train, X_test, y_train, y_test = X[:60000], X[60000:], y[:60000], y[60000:]

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

Обучение классификатора SVM

# Training the SVM classifier
from sklearn.svm import SVC
svm_clf = SVC(decision_function_shape = 'ovo')
svm_clf.fit(X_train, y_train)
SVC(decision_function_shape='ovo')

Делать прогнозы на тренировках

# Prediction in training
training_prediction = svm_clf.predict(X_train[:5])
print("Prediction in training:",training_prediction)
print("Actual values:",y_train[:5])

output:
Prediction in training: [5 0 4 1 9]
Actual values: [5, 0, 4, 1, 9]

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

Тестирование классификатора SVM

# Prediction in testing
testing_prediction = svm_clf.predict(X_test[:5])
print("Prediction in testing:",test_prediction)
print("Actual values:",y_test[:5])

output:
Prediction in testing: [7 2 1 0 4]
Actual values: [7, 2, 1, 0, 4]

Хм! неплохо, модель способна предсказывать точные значения, когда мы тестировали первые 5 значений в наборе данных. Но подождите, пока нам нужны более точные измерения для проверки производительности модели.

Оценка классификатора

Лучший способ оценить производительность классификатора — посмотреть на матрицу путаницы. Основное использование матрицы путаницы состоит в том, чтобы определить, сколько классов неправильно классифицировано классификатором. Например, чтобы узнать, сколько раз классификатор неправильно классифицирует 1 и 7, вы можете посмотреть на 7-ю строку и 1-й столбец матрицы путаницы.

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

y_train_5 = (y_train==5)
y_test_5 = (y_test==5)
from sklearn.model_selection import cross_val_predict
y_train_predict = cross_val_predict(svm_clf, X_train, y_train_5, cv=3)
from sklearn.metrics import confusion_matrix
confusion_matrix(y_train_5, y_train_predict)

output:
array([[54497,    82],
[  312,  5109]], dtype=int64)

Функция cross_val_predict() выполняет перекрестную проверку в K-кратном порядке и возвращает прогнозы, сделанные классификатором для каждой тестовой складки. В матрице путаницы каждая строка представляет фактические значения, а каждый столбец представляет прогнозируемый класс. Здесь мы собираемся предсказать 5, первая строка матрицы представляет изображения, отличные от 5 (отрицательный класс), 54497 были правильно классифицированы как отличные от 5 (настоящие негативы ), а остальные 82 ошибочно классифицируются как 5s (ложные срабатывания). Вторая строка в матрице представляет изображения 5s (положительный класс), 312 были ошибочно классифицированы как отличные от 5s (ложноотрицательные), а остальные 5109 были правильно классифицированы как 5s. (настоящие положительные результаты). Таким образом, идеальный классификатор имеет только истинные положительные и истинные отрицательные стороны.

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

Точность = TP / TP + FP

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

Отзыв = ТП / ТП + FN

Объединение точности и отзыва в одну метрику называется оценкой F1. Оценка F1 представляет собой гармоническое среднее точности и полноты.

F1score = TP / TP + (FN + FP / 2)

from sklearn.metrics import precision_score, recall_score, f1_score
precision = precision_score(y_train_5, y_train_predict)
recall = recall_score(y_train_5, y_train_predict)
f1score = f1_score(y_train_5, y_train_pred)
print("Precision:",precision)
print("Recall:", recall)
print("f1_score:",f1score)

output:
Precision: 0.9842034290117511
Recall: 0.9424460431654677
f1_score: 0.9628722201281568

Бинарный классификатор SVM имеет хорошую точность, полноту, а также оценку f1. Точность модели составляет 98,4%, когда она заявляет, что изображение равно 5, и обнаруживает 94,2% пятерок от общего числа изображений. Классификатор получит высокий балл f1, если его точность и полнота будут высокими.