Как мы провели хакатон по рекомендациям мемов с валидацией на живых юзерах

@marinakav_ из твиттера
@marinakav_ из твиттера

Проблема хакатонов: в течение двух дней ты делаешь проект, который потом выбросишь. Живые пользователи его увидят максимум в соцсетях, когда организаторы расскажут о проектах-победителях. А если твоя команда не выиграла, шанс, что вы доведете проект до первых пользователей, ничтожно мал. Короче, грустно это все. Я так выбросил проектов десять.

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

Даниил Охлопков, Заядлый хакатонщик и создатель FFmemesbot

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

Нам это удалось сделать

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

Организация хакатона

T; DR

  1. Сделали опрос среди юзеров бота: «кто хочет, чтобы ему порекомендовали мемы участники хакатона».
  2. Согласившихся попросили зайти в бота в воскресенье в 16:00.
  3. Согласившихся поделили между участниками хакатона.
  4. Участникам выдали данные о юзерах, мемах и их взаимодействиях.
  5. Участники сгенерили своим алгоритмом мем-рекомендации для своих юзеров и загрузили их в спец. бота.
  6. Согласившиеся юзеры зашли в бота и посмотрели мемы.
  7. Мы замерили % лайков, послушали презы и наградили победителей.

На ком будем тестить?

Представим, что участники хакатона отгрузили рекомендации мемов. Теперь надо, чтобы живые пользователи их посмотрели. Чтобы не ждать результатов несколько дней, мы заранее спросили у наших пользователей, кто готов зайти в 16:00 в воскресенье в бота и посмотреть 20 мемов. Важно, чтобы в то время, пока участники «защищают» свои решения (1-2 часа), живые пользователи оценили рекомендации.

Конечно, не все согласившиеся пользователи зайдут вовремя в бота. Мы им, конечно же, напомним об этом несколько раз через бота, но он может быть замьючен. Нужен еще один канал связи. Пришла идея создать событие в календаре, экспортнуть его в файлик и разослать его пользователям: один клик -- и сам телефон напомнит вам: пора зайти в бота и смотреть мемы. Замерить конверсию, к сожалению, не удалось.

Данные для участников

Участникам мы выдали три таблички:

  • Анонимизированные мета-данные о русскоязычных пользователях (9к строк),
  • Мета-данные о мемах без ссылок на контент (50к строк),
  • Реакции пользователей на мемы (2.7M строк).

А что если никто не посмотрит мемы?

Если вдруг все пойдет не по плану и вовремя никто из пользователей не посмотрит рекомендованные мемы, нам нужно хоть как-то оценить решения участников. Поэтому выгрузка данных производилась за несколько дней до хакатона с расчетом на то, что за это время пользователи посмотрят мемы, которые частично совпадут с рекомендациями участников. По факту пересечение «просмотренные мемы после выгрузки и до хакатона» и «порекомендованные участниками мемы» оказалось 6%.

Бот для участников

Для хакатона мы разработали специального телеграм бота, который раздавал командам списки пользователям, кому рекомендовать мемы и через которого они загружали свом рекомендации (csv файлик как на Kaggle). Бот проверял, что команда порекомендовала существующие мемы выданным пользователям, которые они еще не видели (с учетом даты выгрузки данных).

Как делили пользователей по командам

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

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

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

Результаты

В 16:00 люди зашли в бота и стали яро смотреть мемы. Наша BI
В 16:00 люди зашли в бота и стали яро смотреть мемы. Наша BI

Числа

  • Пользователи, согласившиеся посмотреть рекомендации участников: 987 (~10% русскоязычной аудитории на тот момент)
  • Из них зашли вовремя в бота посмотреть мемы: 630 (64%)
  • За нужный час они посмотрели 26к мемов (6500 уникальных)
  • Средняя доля лайков решений: 59%

Больше чисел и графиков можно найти у меня в Телеграм канале.

Решения участников

Основные направления алгоритма рекомендаций, затронутые участниками хакатона:

  1. Коллаборативная фильтрация
  2. Бинарная классификация: 👍/👎 по признакам пользователя и мема
  3. Эвристики: «любовь юзера к источнику мема» ✖ «крутость мема»
  4. «Отобрать лучшие мемы и показать их всех без персонализации»

К сожалению, участников хакатона было немного и в основном это были люди без опыта — у большинства наш хакатон был первым. Поэтому ничего прорывного на выходе не получилось, однако некоторые идеи из презентаций участников мы все-такие подрезали себе. 😇 Лучше всего пользователям зашли алгоритмы 2. и 4.

Спасибо ребятам из Phystech.Genesis за организацию хакатона.

Заключение

Цель хакатона была не улучшить наш алгоритм рекомендаций и не привлечь внимание к проекту. Хотелось попробовать подключить живых пользователей в оценивание команд. Я считаю, что у нас это получилось! Участники в восторге, юзеры бота горды, организаторы счастливы. Можем повторить!

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

1919
7 комментариев

Это вам не хакатон "кто лучше всего придумает применение для нашего API".

5
Ответить

когда следующий хак?

1
Ответить

Спасибо за вопрос. Часто компании платят организаторам хакатона за возможность сделать свой трек (задание, стенд и призовые). У нас нет таких бюджетов, поэтому будем ждать приглашения организаторов. В этот раз нас пригласили ребята из Phystech.Genesis

1
Ответить

прикольно

А заходит что-нибудь лучше эвристики с источником мема?

1
Ответить

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

Очень хочется сделать ML/нейронку, но пока не получалось ее приготовить так, чтобы это прям лучше стало. 

Ответить

"Таксист пассажиру"

Общался на неделе с другом. Егойный знакомый в реанимашке. Понятно, с чем. Перед тем, как попасть в реанимашку - весь день отработал в тындекс.такси.

Ответить

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

Ответить