Часть 1: От 0 до первых рекомендаций

Предыстория

Мне часто бывает трудно решить, куда я хочу поехать дальше. Я не хочу идти в места, которые я уже знаю, а места, которые я не знаю, — ну, я их не знаю. Кажется, лучше просто доверять тому, что рекомендуют мои друзья. Но я все еще часто думаю: нельзя ли решить эту проблему с помощью данных и машинного обучения?

Решите это с помощью данных, данных, данных, а не

Поэтому моей первой идеей было: я просто соберу кучу данных по разным городам:

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

Но я нутром чувствовал, что этот план не сработает. Почему?

  1. Данные недостаточно **человеческие**. Меня интересует, что город будет чувствовать поставить лайк мне. Действительно ли такая информация содержится в количественных городских данных?
  2. Когда я путешествую, я не ищу города, которые точно такие же, как города, в которых я был в прошлом. Поиск по сходству, вероятно, не даст удивительных рекомендаций, которые я ищу.

Так что я на время отложил эту идею.

Недостающая часть

В прошлом месяце я решил поехать в Кейптаун на несколько недель. Выбрать пункт назначения было непросто, и во время своих исследований я часто заглядывал в NomadList, чтобы черпать вдохновение. И я заметил кое-что, чего раньше не замечал: участники NomadList имеют общедоступные профили. И общедоступные профили включают их истории путешествий.

Актуальные подробные истории путешествий для тысяч цифровых кочевников!

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

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

Краткий обзор рекомендателей

2 основных типа алгоритмов рекомендаций

Рекомендатель — это программное обеспечение, которое Netflix или Spotify’s Discover Weekly используют для предоставления вам персонализированных рекомендаций. Он учится на том, что вы нажимали, лайкали, смотрели или слушали в прошлом, а затем рекомендует то, что соответствует вашему вкусу.

Существует множество различных алгоритмов рекомендаций, но большинство из них основано на следующих двух основных типах:

  1. Алгоритмы, использующие данные о предмете, по которому вы хотите получить рекомендации: Какие другие города имеют аналогичную подпись данных городам, которые мне нравятся? Вот как я сначала посмотрел на это, но я боялся, что такой подход приведет к очевидным скучным рекомендациям.
  2. Алгоритмы, основанные на что понравилось другим людям: на основе городов, которые посетили другие люди со схожими вкусами, какие города мне бы понравились?

Первый вид называется рекомендация на основе содержания, а второй — совместная фильтрация.

Красота совместной фильтрации

Алгоритмы совместной фильтрации такие элегантные! Почему?

  1. Это просто. Алгоритму совместной фильтрации нужен только один вход: места, которые понравились другим людям. Ему вообще не нужны данные о самих городах.
  2. Он использует знания, подразумеваемые в историях путешествий. Каждая история путешествий является результатом цепочки решений*, принятых человеком. Они использовали свой опыт, советы друзей, данные исследований и интуицию, чтобы прийти к этим решениям.
  3. Вот почему алгоритм совместной фильтрации может давать рекомендации, которые одновременно удивительны и точны. Я ищу такие рекомендации — города, которые мои, даже если они не похожи на места, где я был раньше, каким-либо очевидным образом.

Получение этих историй путешествий

Поэтому я просто просмотрел все страницы 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 городов в наборе данных.

Как рекомендатель дает рекомендации?:

  1. Он вычисляет сходство между моим вкусом и вкусами каждого члена NomadList в наборе данных на основе городов, в которых каждый из нас путешествовал.
  2. Уделяя больше внимания участникам со схожими вкусами и меньше внимания тем, у кого разные вкусы, я составил список городов, которые мне могут понравиться.
  3. Это дает каждому городу балл, который суммирует, как часто этот город рекомендовали бы кочевники с таким же вкусом, как у меня.

Это как если бы я попросил совета у двух тысяч друзей, а затем объединил их ответы, обращая больше внимания на советы друзей, которые разделяют мои вкусы.

Так что же рекомендовал мне рекомендатель? Вот топ-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