Регрессоры ближайших соседей — визуальное руководство

Визуальное понимание моделей и влияние гиперпараметров

K ближайших соседей или KNN — одна из самых простых моделей машинного обучения. На самом деле модели в какой-то степени нет, потому что для предсказания нового наблюдения она будет использовать весь обучающий набор данных для поиска «ближайших соседей» по расстоянию (обычно евклидову расстоянию). А затем в случае задачи регрессии значение прогноза вычисляется путем усреднения значений целевых переменных этих соседей.

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

Стоит также отметить, что значение целевой переменной не используется для поиска соседей.

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

Одна непрерывная функция

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

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

Мы можем создать и подогнать модель KNeighborsRegressor с помощью KNeighborsRegressor(n_neighbors = 3), а затем «подогнать» модель с помощью model.fit(X, y).

Для того, чтобы процесс примерки был одинаковым для всех моделей, вы можете заметить, что модель «подгоняется» классическим методом подгонки. Но для KNeighborsRegressor процесс подгонки — это просто сохранение набора данных X и y, и ничего более. Да, это самая быстрая примерка! и модель также является самой большой когда-либо!

Теперь мы можем проверить «модель» для одного наблюдения. В следующем коде мы будем использовать одну точку. Классический прогноз заключается в вычислении прогноза, а метод kneighbours позволяет нам получить соседей.

Затем мы можем построить соседей. Я покажу вам графики для x = 10 и x = 20. Пожалуйста, не стесняйтесь делать больше тестов.

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

Вот результирующий график из предыдущего кода. Для каждой точки на красном сегменте значение y представляет собой среднее значение k ближайших соседей (здесь k = 3).

Давайте теперь создадим прогнозы модели для разных значений k.

Мы также можем сравнить с моделью регрессора дерева решений

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

Две непрерывные функции

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

Затем мы можем использовать plotly для создания интерактивных 3D-графиков. На изображении ниже мы видим трехмерный график с разными значениями k.

Здесь снова мы можем сравнить их с моделью регрессора дерева решений. Мы можем ВИДЕТЬ и ЧУВСТВОВАТЬ разницу в поведении этих двух моделей.

Влияние масштабирования

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

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

Визуально можно сделать вывод, что две серии моделей сильно отличаются. Мы можем рассчитать обычную производительность модели, чтобы сравнить их. Но здесь мой подход заключается в том, чтобы наглядно продемонстрировать, как модель ведет себя по-разному. Ты можешь почувствовать это? Расстояния изменены, потому что изменены масштабы признаков. И в итоге соседи меняются.

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

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

Только представьте, что в модели линейной регрессии ключом является нахождение коэффициентов для каждой функции. А при расчете расстояния k NN все признаки учитываются с одинаковой важностью. Интуитивно мы можем ЧУВСТВОВАТЬ, что эта модель kNN не может быть такой эффективной!

Радиус Соседи

В модуле scikit-learn neighbors есть менее известная модель под названием RadiusNeighborsRegressor, и вы можете легко понять из ее названия, что вместо того, чтобы брать фиксированное количество соседей (в случае k ближайших соседей), мы используем круг фиксированный радиус вокруг нового наблюдения для поиска его соседей.

Теперь, когда модель Radius Neighbours может быть интереснее? Давайте возьмем пример набора данных с выбросом. Мы видим, как две модели ведут себя по-разному. Поскольку этот выброс находится «далеко», в случае knn число соседей фиксировано, поэтому соседи также находятся далеко друг от друга. Но для соседей по радиусу более важен эффект выброса.

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

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

Вы можете заметить что-то странное на изображении выше, когда радиус слишком мал. Да, в этом случае для некоторых точек нет соседей. Затем присваивается огромное отрицательное число. Правда в этом случае решения нет. Но я все же думаю, что это ошибка, которую нужно исправить в scikit-learn. Выдавать ошибку лучше, чем давать это значение по умолчанию.

Прежде чем закончить с Radius Neighbours, когда это может быть действительно интересно? Представьте себе случай, когда у вас много данных по району в городе, а по соседнему району у вас не так много данных, но вы знаете, что могли бы собрать больше. Тогда соседи по радиусу могут оказаться более актуальными.

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

Подробнее о расстоянии

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

Вы наверняка уже знаете, но ВИДЕТЬ всегда лучше. На изображении ниже красный круг — это «истинный круг» для центрального местоположения, который представляет собой красный цвет, образованный местоположениями с одинаковым географическим расстоянием от центрального местоположения. Синий «круг» получается путем вычисления евклидова расстояния по широте и долготе. В районе экватора эти два круга почти одинаковы. Но они совсем другие, когда речь идет о местах, удаленных от экватора. Так что в следующий раз, когда у вас будет широта и долгота в вашем наборе данных, и вы будете использовать модели ближайших соседей, вы должны подумать об этом.

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

Также можно взвешивать соседей. Вы можете сделать это с помощью аргумента weights. А вот описание этого аргумента из официальной документации:

веса:{‘uniform’, ‘distance’}, callable или None, default=’uniform’

Весовая функция, используемая в прогнозировании. Возможные значения:

- «унифицированный»: однородные веса. Все точки в каждой окрестности имеют одинаковый вес.

- «расстояние»: взвешивание точек обратно пропорционально их расстоянию. в этом случае более близкие соседи точки запроса будут иметь большее влияние, чем соседи, которые находятся дальше.

- [вызываемый]: определяемая пользователем функция, которая принимает массив расстояний и возвращает массив той же формы, содержащий веса.

Единые веса используются по умолчанию.

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

Заключение

Я пишу серию подобных статей, чтобы продемонстрировать, как визуализация помогает нам лучше понять, как модели машинного обучения работают без математики. Пожалуйста, следуйте за мной по ссылке ниже и получите полный доступ к моим статьям: https://medium.com/@angela.shi/membership

Если вы хотите получить код для создания графики в этой статье, вы можете поддержать меня здесь: https://ko-fi.com/s/4cc6555852

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

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

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