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

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

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

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

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

Существует несколько подходов к поиску K ближайших соседей, таких как K-мерное дерево, в котором для классификации точек данных используется прямоугольная граница решения, Ball-tree, в котором используется сферическая граница решения и т. д. В этой статье мы реализуем подход грубой силы к KNN с использованием Python с нуля.

Алгоритм

Итак, шаги по созданию модели KNN следующие:

  1. Для начала нам нужно оптимальное значение K.
  2. Рассчитайте расстояние между каждой точкой данных в тестовом наборе и каждой точкой в ​​обучающем наборе.
  3. Отсортируйте рассчитанные расстояния вместе с соответствующими целевыми значениями из обучающих данных в порядке возрастания.
  4. Из этих отсортированных значений выберите K верхних значений.
  5. Для задач классификации режим точек данных, соответствующих K верхним строкам, будет прогнозируемым результатом, а для задач регрессии прогнозируемым результатом будет среднее/медиана.

Реализация с нуля

Давайте создадим базовую структуру нашего алгоритма KNN. Мы будем следовать подходу Scikit-learn и определим класс с методом подгонки и прогнозирования.

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

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

На данный момент мы назначим тип проблемы 0 для регрессии и 1 для классификации. И метрика 0 для евклидова расстояния и 1 для манхэттенского расстояния.

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

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

  • Сначала рассчитаем расстояния.
  • Затем вычисляем соседей.
  • Наконец, мы делаем прогноз.

Код говорит сам за себя.

Собрав все вместе, у нас есть алгоритм BruteForceKNN.

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

Тестирование с реализацией Scikit-learn

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

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

Теперь нам нужно найти оптимальное значение «k».

Для этого мы создадим экземпляр базового классификатора KNN с настройками по умолчанию и сделаем прогнозы для значений «k» в диапазоне от 1 до 31.

Затем мы рассчитаем ошибки поезда и теста и построим кривую ошибок. С помощью кривой ошибок мы найдем оптимальное значение «k».

Из кривой ошибок мы находим, что k=14 хорошо подходит для наших данных. Итак, мы создаем экземпляр объекта KNN с k = 14, подбираем обучающие данные и прогнозируем, используя тестовые данные.

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

Тестирование с использованием нашего Brute Force KNN

Теперь мы создадим экземпляр нашего класса BruteForceKNN и будем делать прогнозы с теми же данными.

Отлично. Точность нашей модели соответствует реализации Scikit-learn. Теперь давайте проверим матрицу путаницы.

Мы обнаружили, что производительность нашей модели BruteForceKNN точно соответствует реализации классификатора KNN, разработанной Scikit-learn.

На этом мы подошли к концу этой статьи.

Надеюсь, вам понравилось изучать и реализовывать алгоритм KNN с нуля в Python и сравнивать производительность модели с API Scikit-learn.

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