Часть 1: От 0 до первых рекомендаций
Предыстория
Мне часто бывает трудно решить, куда я хочу поехать дальше. Я не хочу идти в места, которые я уже знаю, а места, которые я не знаю, — ну, я их не знаю. Кажется, лучше просто доверять тому, что рекомендуют мои друзья. Но я все еще часто думаю: нельзя ли решить эту проблему с помощью данных и машинного обучения?
Решите это с помощью данных, данных, данных, а не
Поэтому моей первой идеей было: я просто соберу кучу данных по разным городам:
- Получить данные с Numbeo и других подобных сайтов;
- Проведите тематическое моделирование статей в Википедии и путеводителей по городам;
- Затем используйте алгоритмы кластеризации, чтобы сгруппировать похожие города вместе.
Таким образом, города, сгруппированные в те же кластеры, что и города, которые мне уже нравятся, — это города, в которые я должен отправиться в следующий раз.
Но я нутром чувствовал, что этот план не сработает. Почему?
- Данные недостаточно **человеческие**. Меня интересует, что город будет чувствовать поставить лайк мне. Действительно ли такая информация содержится в количественных городских данных?
- Когда я путешествую, я не ищу города, которые точно такие же, как города, в которых я был в прошлом. Поиск по сходству, вероятно, не даст удивительных рекомендаций, которые я ищу.
Так что я на время отложил эту идею.
Недостающая часть
В прошлом месяце я решил поехать в Кейптаун на несколько недель. Выбрать пункт назначения было непросто, и во время своих исследований я часто заглядывал в NomadList, чтобы черпать вдохновение. И я заметил кое-что, чего раньше не замечал: участники NomadList имеют общедоступные профили. И общедоступные профили включают их истории путешествий.
Актуальные подробные истории путешествий для тысяч цифровых кочевников!
Это я могу использовать! Это именно те данные, которые мне нужны. Я нахожу кочевников, чей вкус больше всего похож на мой, и просто смотрю, в какие города они ходили.
Но делать все это вручную немного натянуто — я не хочу вручную просматривать тысячи кочевников. Поэтому я буду использовать алгоритм совместной фильтрации.
Краткий обзор рекомендателей
2 основных типа алгоритмов рекомендаций
Рекомендатель — это программное обеспечение, которое Netflix или Spotify’s Discover Weekly используют для предоставления вам персонализированных рекомендаций. Он учится на том, что вы нажимали, лайкали, смотрели или слушали в прошлом, а затем рекомендует то, что соответствует вашему вкусу.
Существует множество различных алгоритмов рекомендаций, но большинство из них основано на следующих двух основных типах:
- Алгоритмы, использующие данные о предмете, по которому вы хотите получить рекомендации: Какие другие города имеют аналогичную подпись данных городам, которые мне нравятся? Вот как я сначала посмотрел на это, но я боялся, что такой подход приведет к очевидным скучным рекомендациям.
- Алгоритмы, основанные на что понравилось другим людям: на основе городов, которые посетили другие люди со схожими вкусами, какие города мне бы понравились?
Первый вид называется рекомендация на основе содержания, а второй — совместная фильтрация.
Красота совместной фильтрации
Алгоритмы совместной фильтрации такие элегантные! Почему?
- Это просто. Алгоритму совместной фильтрации нужен только один вход: места, которые понравились другим людям. Ему вообще не нужны данные о самих городах.
- Он использует знания, подразумеваемые в историях путешествий. Каждая история путешествий является результатом цепочки решений*, принятых человеком. Они использовали свой опыт, советы друзей, данные исследований и интуицию, чтобы прийти к этим решениям.
- Вот почему алгоритм совместной фильтрации может давать рекомендации, которые одновременно удивительны и точны. Я ищу такие рекомендации — города, которые мои, даже если они не похожи на места, где я был раньше, каким-либо очевидным образом.
Получение этих историй путешествий
Поэтому я просто просмотрел все страницы NomadList. Всякий раз, когда мое программное обеспечение сталкивалось со страницей участника, оно сохраняло историю их путешествий.
Я не могу гарантировать, что у меня есть все страницы участников, но я думаю, что да. Я нашел 3640.
Выглядит хорошо до сих пор!
Краткий обзор данных
На странице участника есть 1152 участника, у которых нет поездок. Включение их не поможет нашему рекомендателю, поэтому я их удаляю.
Теперь у меня осталось 2 488 кочевников, всего зарегистрировано 36 822 поездки. И в эти поездки включено 4247 уникальных городов.
Вот как сейчас выглядят данные:
╒═══════════════╤═════════════════════════════════════════════╕
│ username │ cities │
╞═══════════════╪═════════════════════════════════════════════╡
│ @evarehakova │ ['Cape Town South Africa', 'Czechia Czec... │
├───────────────┼─────────────────────────────────────────────┤
│ @nickdanforth │ ['Canggu, Bali Indonesia', 'Chiang Mai T... │
├───────────────┼─────────────────────────────────────────────┤
│ @kirkseton │ ['Phuket Thailand', 'Vientiane Laos', 'M... │
├───────────────┼─────────────────────────────────────────────┤
│ @askeertmann │ ['Miami, FL United States', 'Medellín Co... │
╘═══════════════╧═════════════════════════════════════════════╛
Давайте дадим несколько рекомендаций!
Теперь давайте обучим алгоритм совместной фильтрации данных. Я использую LightFM — мощную рекомендательную библиотеку на Python.
Запуск алгоритма и обучение модели занимает около 10 секунд. Теперь у меня есть рекомендатель, который готов дать несколько рекомендаций!
Давай попробуем!
Сначала я напишу несколько городов, которые мне нравятся, скажем, Берлин, Нюрнберг, Барселона и Кейптаун.
[‘Berlin Germany’, ‘Cape Town South Africa’, ‘Barcelona Spain’, ‘Nuremberg Germany’]
Я передаю эти данные в качестве входных данных рекомендателю, а затем он подсчитывает, насколько, по его мнению, мне понравится каждый из 4247 городов в наборе данных.
Как рекомендатель дает рекомендации?:
- Он вычисляет сходство между моим вкусом и вкусами каждого члена NomadList в наборе данных на основе городов, в которых каждый из нас путешествовал.
- Уделяя больше внимания участникам со схожими вкусами и меньше внимания тем, у кого разные вкусы, я составил список городов, которые мне могут понравиться.
- Это дает каждому городу балл, который суммирует, как часто этот город рекомендовали бы кочевники с таким же вкусом, как у меня.
Это как если бы я попросил совета у двух тысяч друзей, а затем объединил их ответы, обращая больше внимания на советы друзей, которые разделяют мои вкусы.
Так что же рекомендовал мне рекомендатель? Вот топ-10 городов:
| place | score |
|: — — — — — — — — — — — — — — — — | — — — — :|
| Bangkok Thailand | 2.40237 |
| Chiang Mai Thailand | 2.39515 |
| London United Kingdom | 2.31833 |
| Paris France | 2.29879 |
| San Francisco, CA United States | 2.28893 |
| Berlin Germany | 2.25758 |
| Barcelona Spain | 2.23082 |
| New York City, NY United States | 2.23009 |
| Lisbon Portugal | 2.13522 |
| Ubud, Bali Indonesia | 2.10587 |
Неплохо! Но мы еще не закончили. Одного тестового запуска недостаточно. Затем нам нужно убедиться, что наши рекомендации действительно хороши. Оставайтесь с нами для части 2: Улучшение рекомендаций.
Что мы знаем о рекомендателях?
Наша команда по машинному обучению в Data Revenue недавно потратила много времени на знакомство с рекомендательными системами. Мы построили:
- Элегантный рекомендатель тактики для Ladder.io — они даже опубликовали пост в блоге о проекте;
- Огромный рекомендатель фильмов для крупнейшего медиаконгломерата в Европе;
- рекомендатель отелей для крупного немецкого туристического сайта.
Сейчас мы довольно много знаем о рекомендателях — как их создавать, масштабировать и использовать в продакшене. Если у вас есть какие-либо вопросы, не стесняйтесь. Пишите мне на m.schmitt [at] datarevenue.de