Если вы когда-либо искали фразу «Искусственный интеллект», возможно, вы также наткнулись на алгоритм K-ближайших соседей и задались вопросом, что означает этот термин и почему он полезен. В рамках искусственного интеллекта алгоритм kNN представляет собой «нелинейную» модель, используемую в обучении с учителем. Хотя технически kNN называется алгоритмом классификации, он может легко справляться как с проблемами классификации, так и с проблемами регрессии. В Python есть несколько библиотек, предназначенных для машинного обучения, и в этом руководстве мы рассмотрим три наиболее часто используемых; Панды, NumPy и Scikit-Learn.
Кратко об основах машинного обучения:
В более простой терминологии машинное обучение — это задача обучения алгоритмов на данных для изучения тенденций в данных. После обучения модель должна воспроизводить те же тенденции на новых данных. Чтобы описать немного дальше, модель — это математическая формула, используемая для описания данных. Существует множество различных моделей, разработанных для решения множества задач. Алгоритмы модели уже разработаны, и это здорово. Ваша задача — найти правильный алгоритм для задачи, которую вам предстоит выполнить. Надеюсь, это дало вам некоторое представление о том, что будет дальше… давайте обсудим kNN.
Алгоритм kNN
Алгоритм kNN построен на идее, что можно предсказать информацию о фрагменте данных на основе информации о его соседних (похожих) данных. Он основан на обучении с учителем, где у нас есть исторические (известные) данные для изучения. В обучении с учителем есть как минимум две переменные: зависимая (целевая) переменная и независимая переменная. Независимая переменная основана на исторических данных, а зависимая переменная — это переменная, которую мы еще не знаем. Мы можем использовать алгоритм kNN для прогнозирования нашей целевой переменной, используя независимые переменные в качестве нашего начального набора данных.
Предположим, у нас есть многообещающий бизнес по производству костюмов для собак и приближается сезон Хэллоуина. Мы не хотим тратить время и деньги, поэтому нам нужно заказывать костюмы для собак нужных размеров для наших клиентов. У нас есть данные за прошлый сезон, которые включают рост, вес и размер собачьего костюма для нескольких наших клиентов. Мы можем использовать алгоритм kNN, чтобы предсказать размер костюма для любых новых клиентов, учитывая только имеющуюся у нас информацию о весе и росте. Данные показаны ниже.
Для начала мы можем использовать функцию расстояния для вычисления сходства. Наиболее распространенным является евклидово расстояние. Хотя обратите внимание, что доступны и другие уравнения. Манхэттенское расстояние, расстояние Минковси и расстояние Хэмминга — вот лишь некоторые из них. Ниже приведено уравнение евклидова расстояния.
Мы найдем расстояние (сходство) между любыми новыми данными и обучающими/историческими данными, чтобы затем найти, какая предыдущая информация о клиенте соответствует нашей новой информации о клиенте. Например, у нас есть новый клиент с собакой по кличке Стрела. Стрела около 10 дюймов в высоту и весит 16 фунтов. Евклидово расстояние от первого клиента до самого нового клиента (стрелка):
=КОРЕНЬ((10–8)²+(16–6)²
Далее мы вычисляем расстояние всех наших данных с новыми данными для вычисления «ранга». Ближайшие соседние данные будут иметь ранг 1.
Если мы допустим k = 5, мы ищем 5 клиентов с атрибутами, наиболее близкими к Arrow, и выясняем, к каким категориям они относятся.
Взглянув на нашу таблицу размеров, мы, вероятно, могли бы сделать вывод, что собаке ростом 10 дюймов и весом 16 фунтов понадобится костюм среднего размера. Чтобы увидеть это с помощью кода Python, мы реализуем несколько библиотек Python для обработки этих функций. Как только программа будет завершена, мы сможем прогнозировать в большем масштабе с гораздо большей точностью по мере роста нашего бизнеса.
Чтобы написать это в приложении Python, мы начнем с импорта необходимых библиотек. Pandas для управления нашим фреймворком данных. NumPy для расчетов. SkLearn для нашей модели машинного обучения.
Теперь мы можем считать данные клиента. Мне всегда нравится печатать первые пять записей на терминал. Просто чтобы убедиться, что мой импорт правильный.
Затем мы разделяем наши данные на функции и целевые массивы. Ожидается, что признаки (X) будут многомерными, но для наших целей мы сосредоточимся на одном измерении — весе собаки. Мы извлечем этот столбец из нашего DataFrame для правильной загрузки и обучения. Ожидается, что массив Target(y) будет одномерным, в нашем случае это размер костюма.
Теперь мы разделим данные на данные обучения и тестирования, чтобы помочь оценить точность нашей модели. Для этой задачи мы используем функцию train_test_split() в sklearn.
Ранее мы говорили о формуле евклидова расстояния. На следующем шаге мы будем использовать эту формулу в нашем KNeighborsClassifier.
Мы просто меняем параметр metric= на «евклидово». Поскольку у нас небольшой набор данных, я собираюсь установить для ближайших соседей значение 3 вместо параметра по умолчанию 5. Как только это будет сделано, наш классификатор настроен и готов к передаче наших обучающих данных. Мы «подгоняем» модель под наши данные. Итак, алгоритм готов! Несмотря на то, что понимание алгоритмов — отличная идея, к счастью, SkLearn позаботится обо всей сложной математике под капотом.
Теперь самое интересное! Время предсказаний! Мы будем использовать метод .predict() и передадим нашу функцию тестирования.
Выход:
Кроме того, если бы мы хотели найти размер костюма на основе одного параметра, мы могли бы передать список, содержащий это одно значение. Допустим, у нас есть собака весом 20 фунтов. Код, который мы напишем:
Выход:
Отлично! Мы сделали прогноз. Но насколько точен этот прогноз? Давай выясним.
Проверка алгоритма kNN
Мы можем легко измерить точность нашей модели, поскольку мы разделяем наши данные на данные обучения и тестирования. Это отличная практика для оценки производительности модели с использованием данных тестирования. Поскольку это данные, которые модель еще не видела, мы можем быть уверены, что эффективность модели на новых данных можно точно проверить. Оценка точности — это показатель эффективности модели. В задачах классификации это показывает, сколько точных прогнозов из всех сделанных прогнозов. Используя функцию SkLearn, precision_score(), мы возвращаем процент от 1, который измеряет уровень эффективности нашего алгоритма.
Выход:
Наша модель имеет точность 80%. Это означает, что он возвращал положительные результаты 8/10 раз. Привет! Это не так уж плохо! Конечно, мы можем немного поиграть с кодом и алгоритмом, чтобы повысить уровень эффективности, но это отличный вводный пример.
Краткое резюме:
В этой статье мы рассмотрели введение в важный алгоритм машинного обучения, K-ближайшие соседи. Мы немного поговорили о функции евклидова расстояния и увидели, что это отличный выбор для начинающих. Затем мы прошли сквозной проект, чтобы увидеть модель в действии. Мы смогли спрогнозировать отличный выбор размера костюма для наших новых клиентов-собак и поддержать рост нашего бизнеса.
Хотите узнать больше?
Если вам понравился этот краткий урок, подписывайтесь на меня, Z. Myricks, чтобы узнать больше о Python. Не забудьте подписаться на Простое простое программное обеспечение для получения дополнительных статей о программном обеспечении!