Основы науки о данных

K-Ближайшие соседи объяснили

Узнайте, как работают эти контролируемые алгоритмы машинного обучения

K-Nearest Neighbours (здесь и далее KNN) - это интуитивно понятный и простой для понимания алгоритм машинного обучения. Этот пост представляет собой краткое введение в KNN. Сначала мы узнаем, как алгоритм работает концептуально на простом примере, а затем реализуем алгоритм с нуля на Python, чтобы закрепить концептуальные знания.

📗 1. Краткое изложение того, как работает алгоритм

📍 1.1 Обучение

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

📍 1.2. Прогноз

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

1️⃣ Найдите k-ближайшие обучающие примеры (то есть соседи).
2️⃣ Назначьте типичное целевое значение среди k-ближайших соседей. Это означает наиболее распространенный целевой класс для классификации и среднее целевое значение для регрессии.

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

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

📍 1.3. Пример

Представим, что у нас есть следующий обучающий набор данных с тремя функциями: от x1 до x3 и двоичной меткой: y.

И у нас был следующий тестовый набор данных:

Мы будем использовать евклидово расстояние, популярную метрику расстояния, чтобы найти ближайших соседей, и установим k = 2. Теперь давайте предскажем класс для тестового примера h.

1️⃣ Найдите его евклидово расстояние до всех обучающих примеров.
Сначала давайте найдем его расстояние до a, первого обучающего примера:

Поскольку оба имеют одинаковые значения характеристик, расстояние до a равно 0. Теперь давайте вычислим расстояние до следующего примера, b:

Расстояние до b составляет 2,24. Если повторить тот же расчет для остальных обучающих примеров, мы получим следующие расстояния:

2️⃣ Найдите его k-ближайших соседей (т. е. обучающие примеры с кратчайшим расстоянием).
Мы видим, что двумя ближайшими соседями являются a и d .

3️⃣ Найдите наиболее распространенную метку среди k-ближайших соседей.
Если мы посмотрим на данные обучения, мы обнаружим, что и a, и d принадлежат к отрицательному классу. Поэтому прогнозируйте h как отрицательное, поскольку наиболее распространенный класс среди 2-х ближайших соседей - отрицательный.

Теперь давайте найдем k-ближайших соседей для двух других тестовых примеров:

И i, и j наиболее близки к e и f. Поскольку общий класс между e и f является положительным, t модель предсказывает тестовые примеры i и j быть положительным.

Полезно интуитивно понимать значение масштаба функции и значения k.
◼️ Масштаб объекта: хотя объекты в примере изначально не имели одинакового масштаба, они были довольно близки. Представьте, что функция x3 была в 10 раз больше:

Расстояния и k-ближайшие соседи меняются для каждого примера:

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

◼️ Значение k: в нашем примере мы установили k равным 2. Но что произойдет, если мы изменим k на 7?

У нас есть 7 примеров в наборе обучающих данных, и самый распространенный класс - положительный. При k = 7 модель будет предсказывать любую запись как положительную, как основной класс в обучающих данных. Этот сценарий представлен правым спектром на следующей диаграмме:

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

Как вы думаете, какой будет точность обучения, если k = 1 и в данных обучения нет повторяющейся комбинации функций? Ответ точен на 100%, потому что каждый будет своим ближайшим соседом.

Теперь мы переведем то, что мы узнали в этом разделе, в код.

💻 2. Простая реализация на Python

Давайте импортируем библиотеки и создадим тот же набор данных игрушек:

Создаем KNNClassifier, подгоняем его и делаем прогнозы:

Ура, мы только что создали очень простой классификатор KNN с нуля на Python. Хотя в этом посте мы сосредоточились на классификации, создать регрессор KNN просто. Чтобы создать регрессор, переименуйте KNNClassifier в KNNRegressor в строке 1 и измените строку 29 на: y.append(np.mean(targets)) в приведенном выше коде.

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

В этой статье мы рассмотрели основы KNN. Спасибо, что прочитали мою статью. Если вам интересно, вот ссылки на другие мои сообщения:
◼️️ Сравнение случайного леса и градиентного усиления
◼️️ Как строятся деревья решений?
◼️️ Объяснение Pipeline, ColumnTransformer и FeatureUnion
◼️️ FeatureUnion, ColumnTransformer и Pipeline для предварительной обработки текстовых данных

Пока пока 🏃 💨