Что такое классификация?

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

Примеры классификации:

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

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

k-Ближайшие соседи:

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

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

Для точек данных X и Y с n функциями:

Формула расстояния Минковского:

Расстояние Минковского при p = 1 - манхэттенское расстояние, когда p = 2 - евклидово расстояние, а при p = ∞ - расстояние Чебычева. Расстояние Минковского - это обобщенная форма евклидова расстояния.

Используя метрику расстояния, мы создаем окрестность n ближайших соседей к новой точке данных.

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

Давайте попробуем разобраться в этом лучше на примере.

Пример:

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

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

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

Если мы используем 3 соседа, и мы используем равные веса для каждой точки данных, тогда у нас есть 2 красные точки и 1 синяя точка в окрестности и зеленая точка, то есть новая точка данных классифицируется как красная.

Если мы используем 5 соседей, и мы используем равные веса для каждой точки данных, тогда у нас есть 3 синих точки и 2 красные точки в окрестности, а зеленая точка классифицируется как синяя.

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

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

Сумма весов для красного класса:

1/3 + 1/4 = 0.5833

Сумма весов для синего класса:

1/5 + 1/8 + 1/6 = 0.4912

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

kNN с использованием Scikit-learn:

kNN гиперпараметры:

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

  • n_neighbors: количество соседей в районе.
  • weights: Если установлено значение uniform, все точки в каждой окрестности имеют одинаковое влияние на класс прогнозирования, т.е. прогнозируемый класс - это класс с наибольшим количеством точек в окрестности. Если установлено значение distance, более близкие соседи будут иметь большее влияние, чем соседи дальше, то есть класс с большим количеством точек, близких к новой точке данных, становится прогнозируемым классом, и для этого мы обратим расстояние при вычислении весов, чтобы более близкие точки имели более высокий вес.
  • metric: метрика расстояния, которую нужно использовать, если для weights установлено значение distance. Значение по умолчанию - minkowski, что является одним из методов расчета расстояния между двумя точками данных. Мы можем изменить значение по умолчанию, чтобы использовать другие метрики расстояния.
  • p: Это параметр мощности для minkowski метрики. Если p = 1, то метрика расстояния равна manhattan_distance. Если p = 2, то метрика расстояния равна euclidean_distance. Мы можем поэкспериментировать с более высокими значениями p, если захотим.
# kNN hyper-parametrs
sklearn.neighbors.KNeighborsClassifier(n_neighbors, weights, metric, p)

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

Классификатор kNN:

Мы будем создавать классификатор для классификации рукописных цифр в один из классов от 0 до 9. Данные, которые мы будем использовать, получены из базы данных MNIST, которая представляет собой набор из 60 000 черно-белых изображений 28 × 28 пикселей отдельных рукописных цифр. от 0 до 9.

Импорт библиотек:

# To load MNIST image data
from sklearn.datasets import load_digits
# kNN Classifier
from sklearn.neighbors import KNeighborsClassifier
# Confusion matrix to check model performance
from sklearn.metrics import confusion_matrix
# To split data into training and testing set
from sklearn.model_selection import train_test_split
# For plotting digit
import matplotlib.pyplot as plt

Загрузка данных MNIST цифр:

digits = load_digits()

Преобразование данных для использования с классификатором kNN:

# Number of images
n_samples = len(digits.images)
# Changing shape from 28x28 pixel values to a sequence of values
X = digits.images.reshape((n_samples, -1))
# Getting the already known targets for each image
y = digits.target

Создание наших обучающих и тестовых наборов:

# Splitting data to train and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)

Создание и обучение модели:

# Creating model
clf = KNeighborsClassifier(n_neighbors=3)
# Training model
clf.fit(X_train, y_train)

Получение прогнозов для тестовых данных:

# Predictions for test data
predicted = clf.predict(X_test)

Сравнение фактических и прогнозируемых целевых значений с использованием матрицы неточностей:

# Print confusion matrix
confusion_matrix(y_test, predicted)

В матрице строки представляют собой фактические целевые значения, где первая строка предназначена для 0 меток, вторая - для 1 метки и так далее. Точно так же столбцы представляют прогнозы, где первый столбец предназначен для 0 меток, второй - для 1 метки и так далее.

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

Рассмотрим значение, выделенное синим цветом, это 4-й столбец и 9-я строка. Это ошибка. Наша модель ошибочно классифицировала 3 как 8.

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

Глядя на первые 10 изображений и прогнозов:

# Zip image with prediction
image_with_prediction = list(zip(digits.images, clf.predict(X)))
# for first 10 images
for pos, (image, prediction) in enumerate(image_with_prediction[:10]):
    plt.subplot(3, 4, pos+1) # Create 3x4 grid
    plt.axis('off') # no axis
    plt.imshow(image, cmap=plt.cm.gray_r) # show image in gray scale
    plt.title("Prediction: %i" % prediction) # set title to predicted value
plt.show() # show plot

Все прогнозы выглядят хорошо, за исключением 6-го изображения, которое больше похоже на 5, но наша модель считает его 9.

Вывод:

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

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

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

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

Надеюсь, это помогло вам понять kNN.

Спасибо за чтение.