Этот пост разработан, чтобы дать общее представление о классификаторе k-Neighbours и его применении с использованием python. Он ни в коем случае не претендует на исчерпывающий характер.

k-Nearest Neighbours (kNN) - это алгоритм, с помощью которого неклассифицированная точка данных классифицируется на основе ее расстояния от известных точек. Хотя он чаще всего используется в качестве классификатора, его также можно использовать для решения задач регрессии. В этом посте будет использован следующий пример:

В приведенном выше примитивном примере наша модель пытается предсказать, является ли автомобиль внедорожником или седаном, на основе всего двух факторов. Топливная эффективность (обозначенная как MPG) находится по оси x-, а вес транспортного средства - по оси y-. Красная звезда представляет собой неизвестную точку данных, фиолетовые точки - известные седаны, а желтые - известные внедорожники.

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

Если другие гиперпараметры не установлены, подсчитывается количество соседей из каждого класса, и классификация производится «голосованием», что означает, что для неизвестной точки выбирается класс, который наиболее часто встречается внутри круга.

Обратите внимание, что в приведенном выше примере меньший кружок представляет k = 3. Внутри этого круга есть 2 фиолетовые (седан) точки и 1 желтые (внедорожник) точки. Модель принимает голосование, и поскольку фиолетовых точек больше, неизвестная точка классифицируется как седан.

В большом круге, где k = 6, есть 4 желтые точки и 2 фиолетовые. Таким образом, если вы установите для параметра n_neighbors значение 6, неизвестный автомобиль будет классифицирован как внедорожник.

Использование kNN в Python

kNN следует тому же рабочему процессу, что и другие контролируемые модели, и является одной из самых простых в использовании моделей. Вы начинаете с установки X (функций) и y (цели) и выполняете train_test_split():

Далее, как и в большинстве других моделей, следует масштабировать данные. Помните, что существует очень мало ситуаций, когда данные не следует масштабировать. Если вы читаете этот пост в образовательных целях, велика вероятность, что у вас недостаточно опыта, чтобы принять решение не масштабироваться. Масштабирование - это простой процесс, который можно выполнить с помощью всего нескольких строк кода. После импорта создайте экземпляр StandardScaler(), fit_transform в наборе поездов и transform в набор тестов.

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

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

Обратите внимание, что, посмотрев на pred_proba (), вы можете сказать, сколько из окружающих соседей было классифицировано. Поскольку для n_neighbors установлено значение по умолчанию 5, каждый «голос» стоит 0,2. В приведенном выше примере за каждый балл, за который проголосовали [1. , 0. ], приходилось 5–0 голосов. Каждый голос [0.6, 0.4] равнялся 3–2 голосам.

kNN в GridSearchCV

Вот некоторые из наиболее распространенных гиперпараметров:
- n_neighbors,, о котором говорилось ранее
- weights, который может быть установлен либо на «равномерный», когда каждый сосед в пределах границы имеет одинаковый вес, либо на «расстояние», где более близкие точки будут иметь больший вес для принятия решения. Обратите внимание, что когда weights = 'distance' класс с наибольшим номером в границе может не «выиграть голосование»
- metric, который относится к тому, как расстояние между соседними точками выбирается от неизвестной точки. Поскольку моделирование обычно выполняется в более чем трех измерениях, это может быть трудно визуализировать.

Следующий код даст вам базовый формат создания GridSearchCV, который можно адаптировать для любой модели с небольшими изменениями:

Несколько замечаний об этом GridSearch. Прежде всего, обратите внимание, что n_neighbors всегда нечетное число. Вы можете выбрать четное число, но в случае равного количества голосов решение о том, какой класс назначить, будет приниматься случайным образом, если для weights установлено значение uniform. Выбрав нечетное число, нет ничьих. Еще одна важная вещь, на которую следует обратить внимание: когда вы выполняете GridSearch, вы запускаете гораздо больше моделей, чем когда вы просто подбираете и оцениваете. В приведенном выше GridSearch есть:

4 варианта для n_neighbors *
2 варианта для weights *
2 варианта для metric *
3 перекрестной проверки

Всего 4 * 2 * 2 * 3 = 48 запусков модели. Очень важно установить подробное описание, чтобы вы получили обратную связь о модели и знали, сколько времени может потребоваться на ее завершение. Для завершения kNN может потребоваться много времени, поскольку он измеряет индивидуальные расстояния для каждой точки в испытательном наборе.

Еще одна вещь, которую следует отметить в GridSearch, - это n_jobs = -1. Устанавливая для n_jobs значение -1, вы указываете компьютеру использовать все процессоры для выполнения модели. Обратите внимание, что распространенное заблуждение состоит в том, что -1 означает использование «всего процессоров -1» (т. Е. 4–1 = 3 процессора), но компьютер интерпретирует это как использование всех процессоров.

Подробнее о гиперпараметрах kNN

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

Я упомянул ранее, но хотел бы остановиться на том, что существует модель KNeighborsRegressor, которая работает путем агрегирования данных из соседних точек для непрерывного прогнозирования y variable. Она редко используется, но существует.

Следует ли использовать kNN?

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