Этот пост разработан, чтобы дать общее представление о классификаторе 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 прост в использовании и может давать очень точные и значимые результаты. Он также имеет тенденцию быть дорогостоящим с точки зрения вычислений, поэтому он может быть не лучшим выбором для больших наборов данных. Если у вас есть больший набор данных с двоичной классификацией, простая логистическая регрессия может быть лучшим выбором. В других случаях лучшим выбором может быть случайный классификатор лесов. Если у вас есть время, всегда полезно опробовать как можно больше моделей, чтобы получать наиболее точные прогнозы в машинном обучении.