Рекомендатель маршрута для горных велосипедов

Для тех, кто любит кататься на горных велосипедах, ходить по тропам, карабкаться по скалам, кататься (пилотировать? рулить?... я определенно не наездник) по конным тропам... вы были на моем месте.

«Я новичок в этой области… с чего мне начать?»

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

«Этот след выше моей головы/способностей/навыков?»

Так что же нам делать?

Что ж, к счастью, в наши дни подписчикам доступны комплексные приложения, которые могут помочь нам в этом выборе. Мы можем выбирать маршруты на основе указанных атрибутов, и обычно нам рекомендуют несколько других, которые, по мнению приложения, нам также нужны. Но как эти приложения достигают этого? И есть ли базовый инструмент, который я мог бы разработать, который давал бы аналогичные результаты (и некоторые бонусные «чистые» баллы от друзей)?

Входите, двигатели-рекомендаторы!

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

Итак, начнем с данных!

Для этого проекта я взял статистику маршрутов с MTBProject.com по 2000 маршрутам для горных велосипедов по всей Аризоне и Юте. В настоящее время мой скребок работает, чтобы получить соответствующие данные для остальной части страны. Но в этом проекте мы сосредоточимся на двух состояниях.

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

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

Перед вычислением подобия необходимо выполнить ряд шагов. В первую очередь… очистка данных. Данные, извлеченные из Интернета, редко будут готовы для импорта в модель. Для этого случая данные потребовали большой работы. Были специальные символы, лишние пробелы, несовместимые суффиксы, разные масштабы и много дублирующихся данных. Была разработана функция, которая быстро работала над этими модификациями.

Пустые значения (отсутствующие данные) были еще одной проблемой, с которой необходимо было разобраться. К сожалению, обычно нецелесообразно заполнять всеотсутствующие данные одной и той же информацией. Для категориальных столбцов вместо нулей было введено «неизвестно». «Неизвестное» уже было полем в этих категориях, и, стремясь быть консервативным, я использовал его для вменения. Другие отсутствующие данные требовали более надежного метода вменения. Для статистики, относящейся к трассе (общий подъем/спуск, перепады высот, уклоны тропы и т. д.), я использовал вменение KNN. Предполагается, что эта информация «отсутствует случайным образом». Поскольку эти отсутствующие данные систематически не отличались от других точек, и более вероятно, что пользовательские данные просто еще не были собраны. KNN Imputation должен отлично заменить отсутствующие данные. Этот метод будет использовать ближайшие следы к тем, у которых отсутствуют данные, и использовать среднее значение этих соседей (в расчетах я использовал пять соседей) для замены нулей. Как только несколько ненужных столбцов были удалены, я закончил очистку и был готов перейти к предварительной обработке и моделированию!

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

Теперь в трех шагах. Во-первых, очищенные данные будут преобразованы в двумерную разреженную матрицу. После того, как все 40 000 трейлов будут извлечены из Интернета, а категориальные столбцы подвергнуты горячему кодированию… в моем фрейме данных останется много «0». Разреженная матрица отлично справилась бы со сжатием всех этих нулей и ускорением обработки всех данных! После того, как моя матрица была разработана, я преобразовал каждое значение в попарные расстояния (вот где косинусное подобие вступает в игру!). Есть несколько различных «метрик» расстояния, которые можно использовать в этой функции, но я искал значение между 0 и 1, и косинус отвечал всем требованиям.

Затем полученная матрица была встроена во фрейм данных, где каждый след действовал как метка индекса иметка столбца. При таком представлении, чтобы найти сходство между трейлами, все, что нам нужно было сделать, это сослаться на столбец, содержащий его заголовок (в данном случае название трейла), и просмотреть строки! Каждое значение строки с меткой имени следа содержит значение от 0 до 1, которое представляет сходство со значением следа с именем столбца.

В приведенном выше примере входные данные возвращают отсортированный список значений, где «0» представляет собой след, наиболее похожий на этот ввод в код, а «1» представляет след, наиболее непохожий.

Теперь, когда рекомендатель работает, можно разработать пользовательский интерфейс вместе с контрольной панелью и развернуть его в Интернете для использования другими! Я расскажу об этом подробнее в следующем посте!

Для всех, кто интересуется кодом, лежащим в основе блога, или хочет связаться и поговорить о магазине/обмене идеями/сети, вы можете связаться со мной по ссылкам ниже!

Ознакомьтесь с проектом на GitHub!, Свяжитесь со мной в LinkedIn!, Посетите мой веб-сайт для получения дополнительных проектов и информации! И, иногда, я чирикаю!