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

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

В машинном обучении есть 4 основных типа классификации:

  1. Бинарная классификация: две метки класса; дает ответ "да" или "нет" - например: определение спама
  2. Многоклассовая классификация: более двух ярлыков класса - например: классификация лиц или видов растений.
  3. Классификация по нескольким меткам: две или более метки классов, где прогнозируется одна или несколько меток - например, классификация фотографий.
  4. Несбалансированная классификация: неравномерное распределение - например: выявление мошенничества или медицинский диагноз

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

  • K-ближайший сосед
  • Логистическая регрессия
  • Искусственные нейронные сети / Глубокое обучение
  • Машины опорных векторов

Я буду обсуждать один из самых фундаментальных и хорошо известных алгоритмов машинного обучения, используемых при классификации: алгоритм K-ближайших соседей (KNN).

Классификатор K-ближайших соседей

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

Этот алгоритм используется многими в отрасли из-за его небольшого времени расчета и его непараметрического характера (что означает, что он не делает никаких предположений относительно данных). Типичное применение KNN можно увидеть в Концептуальном поиске. Это программные пакеты, которые помогают компаниям находить похожие документы, например, в почтовом ящике. Другой пример - Рекомендательные системы, где алгоритм может рекомендовать продукты, средства массовой информации или рекламные объявления для отдельных лиц на основе их предыдущих покупок или обязательств.

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

При внедрении классификатора KNN специалисты по данным также должны решить, сколько соседей следует учитывать. Другими словами, нам нужно учитывать оптимальное количество соседей и то, как это влияет на наш классификатор. Оптимальное значение K (количество рассматриваемых соседей) повлияет на модель прогнозирования. К разным наборам данных предъявляются разные требования. Согласно datacamp.com, в случае небольшого количества соседей шум будет иметь большее влияние на результат, а большое количество соседей делает его вычислительно затратным. Исследования также показали, что небольшое количество соседей является наиболее гибкой подгонкой, которая будет иметь низкое смещение, но высокую дисперсию, а большое количество соседей будет иметь более гладкую границу решения, что означает меньшую дисперсию, но более высокую смещение.

Когда и зачем использовать KNN?

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

Математика, лежащая в основе KNN

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

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

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

Когда пространство состоит из n измерений, для вычисления евклидова расстояния можно использовать следующее:

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

Вычисление евклидова расстояния в Python

#import the library
from scipy.spacial import distance
#initialize points
p1 = (10, 15, 20)
p2 = (25, 30, 35)
#calculate euclidean distance
euclidean_distance = distance.euclidean(p1, p2)
print('The Euclidean distance b/w', p1, 'and', p2, 'is: ', euclidean_distance)

Простой пример использования K-ближайших соседей (KNN) - Iris Data

В следующем примере будут использоваться данные из набора данных Iris Flower, часто известного как набор данных Fisher’s Iris, к которому я получил доступ из Репозитория машинного обучения UCI. Этот многовариантный набор данных содержит измерения 50 образцов трех различных видов ирисов: Iris Setosa, Iris virginica и Iris versicolor. Каждый образец включал четыре характеристики, измеренные в сантиметрах: длину и ширину чашелистиков и лепестков. Всего в этом наборе 150 записей с 5 признаками (4 измерения и классификация / вид).

Я начал с импорта библиотек, используемых во всей программе. Библиотека sklearn.model_selection - популярная библиотека машинного обучения, которую я буду использовать для классификации.

import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt 
from sklearn.model_selection import train_test_split

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

#read csv file into a data frame
iris = pd.read_csv('iris.csv')
#display initial rows of data frame 
iris.head()

iris_species = {'setosa': 0, 'versicolor': 1, 'virginica': 2}
iris['species_num'] = iris.apply(lambda x: iris_species[x.species], axis=1) # axis=1 - applies to each row

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

iris_number = dict(zip(iris.species_num.unique(), iris.species.unique()))

Вот отображение:

X = iris[['sepal_length', 'sepal_width', 'petal_length']]
y = iris['species_num']
# default is 75% / 25% train-test split
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)

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

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

# plotting a 3D scatter plot
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
fig = plt.figure()
ax = fig.add_subplot(111, projection = '3d')
ax.scatter(X_train['sepal_length'], X_train['sepal_width'], X_train['petal_length'], c = y_train, marker = 'o', s=100)
ax.set_xlabel('sepal_length')
ax.set_ylabel('sepal_width')
ax.set_zlabel('petal_length')
plt.show()

from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors = 5)

После создания объекта-классификатора я определил значение K или количество учитываемых соседей.

knn.fit(X_train, y_train)

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

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

knn.score(X_test, y_test)

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