соревнования по машинному обучению платформы
Kaggle для начинающего дата-сайентиста: соревноваться нельзя учиться
Мало нам питона и матана — есть ещё, оказывается, и какой-то Каггл. Разбираемся, что это и зачем нужно
Kaggle — популярная платформа для соревнований по Data Science от Google. Пользователи (люди и организации) могут публиковать на ней свои наборы данных, создавать и исследовать модели машинного обучения, соревноваться друг с другом.
Типичная схема Kaggle-соревнования: организатор конкурса (как правило, крупная компания) публикует свои данные и описание проблемы, сроки, критерии правильного решения и приз, который получит победитель. А участники пробуют применить к данным разные методы, модели и алгоритмы, чтобы решить проблему.
Автор лучшего решения получает приз. Остальные участники — баллы в зависимости от места в таблице с результатами. Из этих баллов складывается общий рейтинг на платформе. Денег за рейтинг никто не даст, зато в резюме он может смотреться красиво. Оценка работ прозрачна: платформа автоматически проверяет решения по критериям, выставленным компанией-организатором.
Формат участия в соревновании зависит от условий, которые задаёт автор проблемы. Обычно разрешают участвовать и сольно, и командой — у каждого способа есть свои преимущества.
В Kaggle всё очень непросто:
Кажется, шансов у новичка — ноль. Так зачем же соревноваться тому, кто только начал изучать науку о данных?
К тому же очищенные, подготовленные и хорошо документированные Kaggle-датасеты не имеют ничего общего с задачами и данными, над которыми ежедневно работают дата-сайентисты.
С некоторых пор утверждает, что он data scientist. В предыдущих сезонах выдавал себя за математика, звукорежиссёра, радиоведущего, переводчика, писателя. Кандидат наук, но не точных. Бесстрашно пишет о Data Science и программировании на Python.
Чем полезен Kaggle
Хотя вам вряд ли достанется приз, а задачи сильно отличаются от «промышленного» Data Science, соревнования — это отличный инструмент обучения. Многие вообще считают Kaggle лучшим способом изучить науку о данных.
Чтобы обучение проходило эффективно, нужно понимать особенности платформы:
На Kaggle вы исследуете продвинутые алгоритмы, фреймворки, библиотеки и прокачаете soft skills — упорство, настойчивость и умение работать в команде. Наконец, попробуете решить важные для всего человечества проблемы. Сплошные плюсы.
OK, Kaggle! Как начать?
Выберите язык программирования. Самые популярные языки в Data Science и Kaggle-сообществе — Python и R. Если вы начинаете с нуля, то выберите Python, это универсальный язык, он поможет в решении самых разных задач. Для начала можно прочитать нашу статью про Python-минимум для дата-сайентиста.
Изучите основы Data Analysis. А конкретно — так называемый исследовательский (разведочный) анализ данных. Пригодятся навыки загружать и визуализировать данные, свободно в них ориентироваться. Все необходимые инструменты есть в Python-библиотеках Pandas и Seaborn. А потренироваться в преобразовании данных из таблицы Excel в формат датафреймов Pandas можно с помощью нашей статьи.
Попробуйте обучить свою первую модель на несложном датасете. Например, модель Random Forest из библиотеки scikit-learn — у нас есть об этом хорошая статья. Так вы познакомитесь с основными инструментами машинного обучения, привыкнете делить датасет на обучающую и тестовую части, узнаете про кросс-валидацию и метрики работы модели.
Поучаствуйте в соревнованиях начального уровня. На Kaggle их можно найти в категории Getting Started. В таких соревнованиях нет призового фонда и ограничений по датам, но по структуре они аналогичны Kaggle-соревнованиям с призами. А ещё по ним написано множество подробных руководств — это бесценно для начинающего дата-сайентиста.
Не бойтесь трудностей и стремитесь к знаниям. Пора приступать к настоящим соревнованиям — они потребуют существенно больше времени и усилий. Поэтому выбирайте с умом: в выполнении задания должны быть задействованы интересные и нужные вам методы и технологии.
Призы — это здорово, но гораздо ценнее и надёжнее те знания и навыки, которые двинут вперёд вашу карьеру дата-сайентиста.
Сверяйтесь со своими планами. Современный Data Science практически необъятен, поэтому выбирайте состязания, релевантные вашим устремлениям. Например, если вы планируете стать специалистом по компьютерному зрению, то соревнования по обработке естественного языка скорее отвлекут вас, чем принесут пользу.
Kaggle и «настоящий» Data Science
Посмотрим, чем соревнования отличаются от ежедневных задач дата-сайентиста.
Соревнования Kaggle | Реальный Data Science | |
---|---|---|
Задачи | Всегда трудные | Могут быть лёгкими |
Решения | Должны быть новыми | Могут быть известными |
Эффективность | Только относительная | Может быть абсолютной |
Данные | Подготовленные | Придётся наводить порядок и чистить |
Задачи. Компании выкладывают на Kaggle самые сложные и запутанные проблемы, которые не решить за один день. В реальном Data Science они могут быть простыми, да и бизнес диктует требование выбирать более лёгкие задачи с быстрым результатом.
Решения. На Kaggle решения должны быть новыми: для победы, как правило, проводят дополнительное исследование, серьёзно улучшают алгоритм, разрабатывают продвинутую модель.
На практике в Data Science для большинства задач (исследовательский анализ, очистка данных, A/B-тестирование, классические алгоритмы) уже есть проверенные решения и фреймворки. Каждый раз выдумывать что-то сложное и новое не требуется.
Эффективность. В Kaggle достаточно опередить только своих соперников. В жизни приходится побеждать всех — включая самого себя и своё предыдущее решение.
В Kaggle главное — выполнить формальные требования и обойти всех по заданному критерию. А в реальном Data Science важнее себестоимость и бизнес-результат.
Данные. Датасеты на соревнованиях Kaggle очищены и готовы для работы: удобный формат, ясное описание, логичная структура. Именно на подготовку уходит до 80% рабочего времени обычного дата-сайентиста.
Советы опытных кагглеров
Вот семь советов для тех, кто хочет получить максимум пользы от соревнований на Kaggle:
Совет 1: достигайте целей постепенно.
В каждый момент времени следующая цель должна быть одновременно и достаточно трудной, и достижимой. Например:
Такая стратегия позволит измерить свой прогресс и сохранить высокую мотивацию.
Совет 2: исследуйте самые популярные решения.
Одна из важных фишек Kaggle — участники могут публиковать краткое описание своего решения, так называемое kernel («ядро»). Изучение чужих решений может натолкнуть на новые идеи.
Совет 3: спрашивайте участников на форумах.
Не бойтесь задавать «глупые» вопросы. В конце концов, ничего страшного не случится. Максимум, что вам грозит, — тишина в ответ. Но, скорее всего, вы получите советы и поддержку опытных дата-сайентистов.
Совет 4: работайте сольно — так эффективнее прокачивать ключевые навыки.
В начале пути лучше работать одному — это поможет внимательнее относиться к ключевым задачам, включая исследовательский анализ, очистку данных, разработку признаков и обучение модели.
Совет 5: работайте в команде, чтобы расширить свои возможности.
Работа в команде — отличный способ учиться у опытных дата-сайентистов. Найти «сообщников» можно в чатах, комьюнити и пабликах, посвящённых Data Science, среди одногруппников по курсам или прямо на форумах Kaggle. Нетворкинг — это сила.
А когда вы отточите общие навыки машинного обучения, будет важно поучиться у экспертов в конкретной отрасли — это увеличит вашу ценность.
Совет 6: помните, что Kaggle — это только этап.
Вы не обязаны провести всю жизнь, соревнуясь с другими кагглерами. И если вы вдруг поймёте, что Kaggle вам «не зашёл», — не проблема. Для многих платформа стала всего лишь первой ступенью перед запуском собственного проекта или трудоустройством.
Совет 7: не переживайте из-за низкого рейтинга.
Порой новички слишком сильно беспокоятся из-за рейтинга в своём профиле. Боязнь конкуренции — серьёзная проблема не только для Kaggle, она часто мешает и в обычной жизни. А если вам всё-таки стыдно показывать низкий рейтинг на платформе — заведите тайный учебный аккаунт kisulya666 и тренируйтесь в нём. Со временем можно переключиться на основной аккаунт gromoverzhec777 и начать охоту за трофеями и рейтингом.
Заключение
Обучение на практике — один из лучших методов освоить любую отрасль знаний. А Kaggle — это в первую очередь прекрасная возможность попрактиковаться в решении задач, и лишь во вторую — денежные призы.
На нашем курсе «Профессия Data Scientist» вы найдёте не только команду для участия в Kaggle-соревнованиях, но и поддержку опытных наставников, и помощь в трудоустройстве.
12 платформ соревнований по Data Science и искусственному интеллекту для развития ваших навыков в 2021 году
Data Science требует использования статистических методов и алгоритмов машинного обучения для работы с большим объёмом данных, и для того чтобы делать это эффективно, вам потребуется много практики. Отличная возможность попрактиковаться — соревнования по Data Science. Они служат платформой для изучения лучших практик, получения отзывов и повышения квалификации. Это также отличный способ расширить возможности творить и границы в области науки о данных. Я делал подобный список и в прошлом году, поэтому подумал, что это будет хорошее время, чтобы обновить его на 2021 год.
Большинство конкурсов данных предполагают, что участники решают реальную бизнес-задачу, используя методы геймификации, чтобы найти лучшее решение в короткие сроки. Быть хорошим специалистом по Data Science означает обладать знаниями в предметной области, поэтому соревнования — отличная возможность погрузиться в предметную область и понять, как использовать свои знания для решения бизнес-задач. Вот 10 соревнований по Data Science и искусственному интеллекту или платформ соревнований, на которых вы сможете вывести свои навыки на новый уровень в 2021 году. Если у вас есть предложения, что добавить в список, оставьте их в комментариях.
1. Numer.ai
Что это такое?
Numer.ai, согласно их веб-сайту, — «самый сложный турнир по науке о данных на планете», его поддерживает Union Square Ventures, соучредитель Renaissance и Coinbase. Основная идея турнира — создать мировой открытый хедж-фонд путём моделирования фондового рынка. На веб-сайте подробно описаны эти шаги:
Как это работает: ставка делается, чтобы заработать. Вы либо зарабатываете, либо сжигаете процент от своих акций в зависимости от производительности вашей модели. Прочитать об этом больше можно на веб-сайте.
Когда
Турнир питает хедж-фонд в режиме реального времени, поэтому должен продолжаться до тех пор, пока работает хедж-фонд. Чтобы узнать больше о Numer.ai, читайте их блог здесь.
2. IASC Data Analysis Competition 2021
Что это такое?
IASC — это ассоциация Международного статистического института (ISI), цель которой — продвижение теории, методов и практики статистических вычислений, а также развитие интереса и знаний в области эффективных и действенных статистических вычислений (с веб-сайта). Тема: анализ данных, связанных с качеством жизни.
Ваша презентация должна чётко описывать значимость ваших выводов как для отдельных людей, так и для общества. Первичный набор данных может поступать из одной или нескольких баз данных, но объединение информации из разных баз данных может помочь получить интересные и оригинальные выводы. Соревнование открыто для всех желающих представить свой плакат на выставке WSC 2021. Над вашим PDF можно работать лично или в небольшой группе (до 5 участников).
Когда — окончательные материалы (в формате PDF) должны быть представлены 30 апреля 2021 года.
3. TopCoder Open 2021
Что это такое?
Ежегодный TopCoder Open (ТСО), организованный TopCoder, — это запредельный турнир по программированию и дизайну.
В общей сложности 6 конкурсных треков, где первые соревнования проходят онлайн, победители накапливают баллы TCO на протяжении всего соревнования, а те, кто наберёт наибольшее количество баллов, выигрывают поездку в финал TCO. TCO также проводит небольшие региональные мероприятия, поощряя участников со всего мира.
Всего есть шесть конкурсных треков:
Когда — старт дан 1 января 2021 года!
4. Challenge Data 2021
Что это такое?
Хозяева Challenge Data — ENS и Collège de France. Организован сбор бизнес-задач Data Science с данными, предоставляемыми государственными службами, компаниями и лабораториями. Нужно решить следующие проблемы:
Когда — соревнование началось 4 января 2021 года.
5. Kaggle Competitions
Что это такое?
Kaggle не нуждается в представлении благодаря распространённости в сообществе Data Science. Это самая популярная платформа для проведения соревнований по Data Science с очень хорошими призами. Соревнования Kaggle созданы, чтобы бросать вызов конкурентам на всех этапах их карьеры в области машинного обучения. Существует обширный ряд типов соревнований (из документации):
6. CodaLab
Что это такое?
CodaLab — это платформа с открытым исходным кодом, которая даёт экосистему для проведения вычислительных исследований более эффективным, воспроизводимым и командным образом. В CodaLab есть два аспекта: рабочие листы и соревнования.
Рабочие листы позволяют воспроизводить сложные исследовательские программы и создавать «исполняемые статьи». Используйте любой формат данных или язык программирования — платформа отлично подходит для опытного пользователя! У рабочих листов Codalab есть открытые экземпляры, размещённые в Стэнфордском университете.
Сегодня соревнования объединяют всё сообщество в решении самых сложных проблем с данными и вычислениями. Вы можете выиграть призы, а также создать своё собственное соревнование.
Последние соревнования — 2020 Seu Video Caption Competition.
7. Driven Data
Что это такое?
DrivenData привносит передовые методы в области Data Science и краудсорсинга в некоторые из самых больших социальных проблем, а также организации, берущие эти проблемы на себя. Существует множество онлайн-задач, обычно длящихся 2-3 месяца, где глобальное сообщество специалистов Data Science соревнуется за лучшую статистическую модель для решения сложных, значимых прогностических задач.
Согласно веб-сайту:
8. DataHack
Что это такое?
«Последнее поле битвы Data Science», коллекция соревнований, чтобы сражаться, побеждать, практиковаться, учиться и создать своё портфолио Data Science! Хакатоны в области Data Science на DataHack позволяют конкурировать с ведущими исследователями данных и экспертами в области машинного обучения во всем мире. Это ваш шанс поработать над задачами науки на реальных данных, повысить мастерство, учиться у профессионалов в области информатики и машинного обучения, а также прорубить свой путь к вершине хакатона! У вас также есть шанс выиграть призы и устроиться на работу в компанию Data Science вашей мечты. Начните хакатон Data Science уже сегодня!
Последние соревнования — Loan Prediction.
9. Machine Hack
Что это такое?
Онлайновая платформа для проведения соревнований по машинному обучению. Здесь найдутся самые сложные бизнес-проблемы, которые теперь можно решить с помощью Data Science и ML. Соревнуйтесь с сотнями специалистов на хакатоне, созданном индустрией.
Последние соревнования — Buyer’s Time Prediction Challenge.
10. Zindi
Что это такое?
Zindi — первая платформа для проведения соревнований в области Data Science в Африке. На Zindi расположена целая научная экосистема данных, в которую входят учёные, инженеры, академики, компании, НПО, правительства и институты, сосредоточенные на решении самых насущных проблем Африки.
Для специалистов, от новичков до рок-звёзд, Zindi, — это место, где можно получить доступ к африканским наборам данных и решить проблемы Африки. Специалисты по работе с данными найдут на Zindi все необходимые инструменты, чтобы соревноваться, делиться идеями, оттачивать свои навыки, создавать свой профессиональный профиль, находить возможности карьерного роста и весело проводить время! Заметьте, что некоторые проблемы стоят только перед жителями Африки.
Последние соревнования — Uber Nairobi Ambulance Perambulation Challenge.
11. AIcrowd
Что это такое?
AIcrowd — это платформа для оптимизации рабочего процесса, связанного с искусственным интеллектом, как внутри компании, так и за её пределами путём выполнения задач, связанных с искусственным интеллектом, машинным обучением и другими задачами в области Data Science. Она помогает организациям — будь то предприятия, университеты, правительственные учреждения или НПО — разрабатывать, управлять и продвигать свои задачи. Она оптимизирует рабочий процесс машинного обучения и связывает ваши задачи со специалистами и энтузиастами в области машинного обучения и Data Science, которые совместно пытаются найти наиболее точные, эффективные и действенные решения.
Последние соревнования — Motor insurance market simulation.
12. Iron Viz 2021
Когда — будет объявлено позже.
Для учащихся
Если вы студент или если вы преподаватель, поощряющий студентов изучать Data Science и AI, посмотрите на эти задачи.
Идите в ногу с последними конкурсами с помощью этих ресурсов
ПРОФЕССИИ
No free lunch. Введение в участие в соревнованиях по анализу данных на платформе Kaggle
Цель статьи — познакомить широкую аудиторию с соревнованиями по анализу данных на Kaggle. Я расскажу о своем подходе к участию на примере Outbrain click prediction соревнования, в котором я принимал участие и занял 4ое место из 979 команд, закончив первым из выступающих в одиночку.
Для понимания материала желательны знания о машинном обучении, но не обязательны.
О себе — работаю в роли Data Scientist / Software Engineer в captify.co.uk. Это второе серьезное соревнование на Kaggle, предыдущий результат 24/2125, также соло. Машинным обучением занимаюсь около 5ти лет, программированием — 12. Linkedin profile.
О машинном обучении и платформе Kaggle
Основной задачей машинного обучения, является построение моделей, способных предсказывать результат на основе входных данных, отличающихся от обозреваемых ранее. Например, мы хотим предсказывать стоимость акций конкретной компании через заданное время, учитывая текущую стоимость, динамику рынка и финансовые новости.
Здесь будущая стоимость акций будет предсказанием, а текущая стоимость, динамика и новости — входными данными.
Мое последнее соревнование — Outbrain click prediction, задача — предсказать какую рекламу нажмет пользователь из показанных ему. Спонсор соревнования — компания Outbrain занимается промоушном различного контента, например блогов или новостей. Они размещают свои рекламные блоки на множестве разных ресуров, включая cnn.com, washingtonpost.com и другие. Так как компания которая получает деньги за клики пользователей, они заинтересованы показывать пользователям потенциально интересный им контент.
Формальное описание задачи — необходимо расположить показанную пользователю рекламу в данном блоке в ниспадающем порядке по вероятности нажатия на рекламу.
Количество предоставленных данных достаточно большое, например clicklog файл в районе 80ГБ. Точное описание входных данных можно получить на странице соревнования.
Предоставленные данные делятся на 2 части — те для которых участникам известно какой баннер нажмет пользователь (тренировочные данные), и данные для которых результат нужно предсказать — тестовые. При этом, Kaggle знает реальные результаты для тестовых данных.
Участники соревнования используют тренировочные данные для построения моделей, которые предсказывают результат для тестовых данных. В конце, эти предсказания загружаются обратно, где платформа, зная реальные результаты, показывает точность предсказаний.
Общий план участия в соревнованиях
Начало работы
Входные данные
Прежде всего, стоит разобраться с данными, которые доступны участникам соревнования. На странице Data как правило, есть описание структуры и семантики, а на странице Правил соревнования — описание, можно ли использовать внешние источники данных, и если да — стоит ли делится ими с остальными.
Первое что я обычно делаю — выкачиваю все данные и разбираюсь в структуре, зависимостях, с тем как они отвечают постановке задачи. Для этих целей удобно использовать Jupyter + Python. Строим различные графики, статистические метрики, смотрим на распределения данных — делаем все что поможет понять данные.
Например, построим распределение количества реклам в одном рекламном блоке:
Также, на Kaggle есть раздел Kernels, где код можно выполнять прямо в их ноутбуках и обычно находятся ребята, которые делают различные визуализации доступного датасета — так мы начинаем пользоваться чужими идеями.
Если есть вопросы к структуре, зависимостям или значениям данных — ответ можно поискать на форуме, а можно попробовать догадаться самому и получить преимущество над теми кто (еще) не догадался.
Также, часто в данных есть Утечки (Leaks) — зависимости, например временные, которые позволяют понять значение целевой переменной (предсказание) для подмножества поставленных задач.
Например, в Outbrain click prediction, из данных в клик-логе можно было понять что пользователь нажал на определенную рекламу. Информация о таких утечках может публиковаться на форуме, а может и использоваться участниками без огласки.
Анализ подходов к решению задачи
Когда с постановкой задачи и входными данными в целом все ясно, я начинаю сбор информации — чтение книг, изучение похожих соревнований, научных публикаций. Это замечательный период соревнования, когда удается в очень сжатые временные сроки, значительно расширить свои знания в решении задач подобных поставленной.
Изучая подобные соревнования, я пересматриваю его форум, где победители как правило описывают свои подходы + изучаю исходный код решений который доступен.
Чтение публикаций знакомит с лучшими на сейчас результатами и подходами. Тоже отлично когда можно найти изначальный или воссозданный исходный код.
Например, два последних соревнования по Click-Prediction, были выиграны одной и той же командой. Описание их решений + исходные коды + чтение форумов этих соревнований примерно дали представление о направлении с которого можно начинать работу.
Первый код
Контроль версий
Я всегда начинаю с инициализации репозитория контроля версий. Потерять важные куски кода можно даже в самом начале, очень неприятно его потом восстанавливать. Обычно использую Git + Bitbucket (бесплатные приватные репозитории)
Локальная (кросс) валидация
Валидация, или тестирование предсказаний, это оценка их точности на основании выбранной метрики.
Например, в Outbrain click prediction нужно предсказать, на какую рекламу из показанных нажмет пользователь. Предоставленные данные делятся на две части:
Тип данных | ID нажатой рекламы для каждого показа |
Тренировочные | Известно всем |
Тестовые | Известно только организаторам соревнования |
Обучения моделей происходит на тренировочных данных, в надежде что точность на тестовых данных также улучшится, при этом предполагается что тестовые и тренировочные данные взяты из одной выборки.
В процессе обучения, часто происходит момент, когда точность относительно тренировочных данных растет, но относительно тестовых — начинает падать. Так происходит потому что мощность (Capacity) модели позволяет запомнить или подстроится под тестовый набор.
Это явление называется переобучение (overfit), как с ним бороться мы поговорим ниже, пока достаточно понять что проверять точность необходимо на данных, которые модель не видела.
Несмотря на то что Kaggle дает возможность оценить точность решения (относительно тестовых данных) загрузив его на сайт, такой подход оценки имеет ряд недостатков:
Методов валидации есть много, также как и способов разделения данных, важно соблюдать несколько простых правил:
Строим модели
Введение
Модель можно представить как черный ящик или функцию, которая на входе получает данные и возвращает результат. Результаты могут быть разного типа, наиболее часто используемые:
Тип модели | Тип возвращаемого результата | Пример |
Регрессия | Вещественное число | Стоимость акции компании N через 1 минуту |
Классификация | Категория | Платежеспособный / Неплатежеспособный заемщик |
В Outbrain competition необходимо было ранжировать рекламу по вероятности нажатия пользователем на нее. Простой и действенный способ добится этого — использовать задачу классификации, предсказывать вероятность нажатия, и сортировать рекламу в блоке по выданным классификатором вероятностям:
Предсказания классификатора:
DisplayId | AdId | ClickProb |
5 | 55 | 0.001 |
5 | 56 | 0.03 |
5 | 57 | 0.05 |
5 | 58 | 0.002 |
Формат, в котором принимаются решения задачи:
DisplayId | AdIds |
5 | 57 56 58 55 |
Оценочная метрика (evaluation metric) — функция, показывающая насколько точно предсказание соответствует реальным данным. Для каждого типа задачи, существует много метрик — например для регрессии часто используется основанная на разнице квадратов значений. В соревновании использовалась MEAP (Mean Average Precision) — метрика учитывающая не только количество правильных ответов, но и разницу в порядке сортировки.
Входные параметры
Рассмотрим простейший алгоритм, когда мы считаем что скорее всего, пользователь нажмет на наиболее популярную рекламу — ту у которой соотношение количество нажатий / просмотров (Click-through Rate — CTR) максимальное. В данном случае, входными параметрами в модель у нас есть 2 значения — id рекламы и была ли реклама нажата. Особого машинного обучения здесь нет, обычная статистическая метрика.
Допустим, это наши тренировочные данные, пусть под displayId мы группируем рекламы, показанные одному пользователю в одном блоке:
displayId | adId | clicked |
1 | 1 | 0 |
1 | 2 | 1 |
2 | 1 | 1 |
2 | 3 | 0 |
Для формирования первого признака используем формулу adClicked = max adId sum(adId, clicked == 1) / sum(adId)
Входные значения удобно представлять в виде вектора для одного случая (часто называется feature vector), и матрицы для всего набора данных — обозначается X. Целевая переменная (в нашем случае Clicked) — y
displayId | adId | feature_1 |
1 | 1 | 0.5 |
1 | 2 | 1 |
2 | 1 | 0.5 |
2 | 3 | 0 |
Теперь, при формировании ответа, для каждого displayId, мы сортируем показанные рекламы по feature_1 и получим ответ в виде:
display_id,ad_id
1,2 1
2,1 3
Первое что нужно сделать, это проверить точность работы модели используя уже разработанный нами механизм валидации. Модель основанная на частоте со сглаживанием возвращает результат значительно лучше случайных предсказаний:
Model name | Result |
Random guess | 0.47793 |
Frequency with smoothing | 0.63380 |
Можно расширить модель, и считать CTR исходя также из региона пользователя, а статистику считать для всех встречаемых комбинаций adId * country * state:
adId | Country | State | clicked |
1 | US | CA | 0 |
2 | US | TX | 1 |
1 | UK | 1 | 1 |
adClicked = max adId sum(adId, clicked == 1, country==displayCountry, state==displayState) / sum(adId)
Важно строить признаки для обучения только из тренировочного набора данных, исключая валидационный и тестовый наборы, иначе мы не сможем адекватно оценить точность работы модели. Если используется k-fold cross validation — строить такие признаки придется k раз.
Другой подход — генерировать признаки таким образом, чтобы уменьшить переобучение модели. Например, я добавлял статистики по частоте нажатий только для тех реклам, где количество просмотров N > 10 (значение подбирается во время валидации). Мотивация — если добавляем частоты где количество просмотров рекламы == 1, алгоритм с достаточной сложностью (например дерево решений) определит возможность этого признака однозначно предсказать ответ и может использовать только ее для предсказания, при этом понятно, что решение это будет достаточно наивным.
Весь процесс генерирования признаков из входных данных часто называется Feature Engineering, и часто является решающим фактором успешного соревнования, так как алгоритмы и мета-алгоритмы обучения моделей как правило общедоступны.
Outbrain competition features
Я рассматривал несколько общих групп признаков, определяющих:
Пользовательские признаки
Используя тренировочный набор данных и лог просмотров страниц, можно выбрать много интересного о пользователе — какие рекламы\рекламные кампании нажимал а какие всегда игнорировал. Так как были предоставлена метаинформация о страницах на которую ведет реклама (landing page) можно выявить какие категории страниц или темы\сущности пользователю интересны — если landing page это sport.cnn, и пользователь читает новости спорта часто в это время дня или в этот день недели, это можно попробовать использовать как признак.
Такие и подобные признаки помогут позже найти пользователей с похожими предпочтениями и через них предсказать — нажмет ли пользователь на рекламу.
Отбор признаков я делал вручную — исходя из изменения точности оценки до\после добавления.
Признаки рекламодателя
Здесь стоит начать с простого перечисления мета-информации о рекламе/landing-page|рекламной кампании + CTR подобные признаки исходя из гео-локации, времени дня, дня недели — например stateCTRCamp: частота нажатий на рекламную кампанию (объединяет рекламы) в каком-то штате
Контекст
Под контекстом я понимаю как страницу на которой отображается реклама так и время показа + информация о пользователе: гео + тип устройства. Зная время, можно перечислить все рекламы и страницы, которые пользователь посетил\нажимал вчера\позавчера\за последний час. Можно определить контент, популярный на данный момент и тд.
Использованные признаки
country, state, platform, county, pageDocumentCategories, countryCTRAdv, campaignId, advertiserId, userDocsSeenFromLogYesterday, userClickedThisAdvertiserTimes, hourOfDay, userDocsClickedToday, lastAdvUserClicked
Общее количество признаков — около 120, абсолютное большинство — разработанные вручную, например userDocsSeenFromLogYesterday — документы из клик лога просмотренные пользователем вчера (относительно целевого показа рекламы). более расширенный (неполный) список в техническом описании решения на форуме соревнования.
Большинство из использованных признаков категоризационные — например country, и для превращения в бинарный признак используется one-hot-encoding. Некоторые числовые признаки также были превращены в бинарные посредством отнесениях к числовому интервалу, для сглаживания некоторых использовалась формула log(x+1).
Закодированные признаки, встречающиеся менее 10 раз, не учитывались. Общее число кодированных признаков > 5M, хеширование для уменьшения размерности не применялось.
Пример простейшей модели — логистическая регрессия
Построим модель логистической регрессии, которая получает на вход простые числовые признаки — частоту нажатий в стране и штате:
countryAdCTR = sum(adId, clicked == 1, country == displayCountry) / sum(adId)
stateAdCTR = sum(adId, clicked == 1, state == displayState) / sum(adId)
Формула вероятности нажатия на рекламу будет:
y* = f(z), z = w1 * countryAdCTR + w2 * stateAdCTR, f(z) = 1 / (1 + e(-z))
f(z) — логистическая функция, возвращает значения в интервале [0:1]. Алгоритм обучения подбирает коэффициенты w1 и w2 таким образом, чтобы уменьшить разницу между y* и y — т.е. добится максимальной схожести предсказаний и реальных значений.
Добавим категаризационные признаки advertiser и view_page_domain в модель, предварительно конвертировав их в бинарные при помощи метода one-hot-encoding, пример:
Categorical:
Sample | Advertiser |
1 | Adidas |
2 | Nike |
3 | BMW |
One-hot-encoded:
Sample | IsAdidas | IsNike | IsBMW |
1 | 1 | 0 | 0 |
2 | 0 | 1 | 0 |
3 | 0 | 0 | 1 |
Формула будет:
z = w1 * countryAdCTR + w2 * stateAdCTR + w3*advertiser + w4*view_page_domain
Так как advertiser и view_page это вектор, то и w3 и w4 тоже будут векторами
В CTR prediction очень важно учитывать взаимодействия признаков например страница на которой показывается реклама и advertiser — вероятность нажать на рекламу Gucci на страницу Vogue совершенно другая чем на рекламу Adidas., модель можно дополнить взаимодействием между advertiser и view_page:
z = w1 * countryAdCTR + w2 * stateAdCTR + w3*advertiser + w4*view_page_domain + w5*advertiser*view_page_domain
Мы уже знаем что advertiser и view_page это вектора, а значит размерность вектора w5 будет длина вектора advertiser * длина вектора view_page.
С этим связанно несколько проблем — во первый, это будет очень большой вектор — все возможные домены, на которых показывается реклама умноженные на количество всех возможных рекламодателей. Во вторых — он будет очень разреженным (sparse) и большинство значений никогда не примут значение 1 — большинство комбинаций мы никогда не встретим в реальной жизни.
Factorization Machines (FM)
FM прекрасно подходят для задач предсказания CTR, так как явно учитывают взаимодействие признаков, при этом решая проблему разреженности данных. Прекрасное описание можно найти в изначальной публикации, здесь я опишу основную идею — каждое значение признака получает целочисленный вектор длины k, а результат взаимодействия признаков — скалярное произведение (dot-product) векторов — формулу смотрите в публикации в разделе Model Equation.
Outbrain competition model
Field-aware Factorization Machines (FFM)
Во время анализа лучших моделей я обнаружил что последние 2 соревнования по CTR prediction выигрывали ребята с моделью (ансамблем) Field-aware Factorization Machines (FFM). Это продолжение FM, но теперь признаки делятся на n fields — своего рода группы признаков, как например группа признаков состоящая из документов просмотренных ранее, группа других рекламных объявлений в этом рекламном блоке и тд. Теперь каждый признак представлен в виде n векторов размерностью k — имеет разное представление в каждой другой группе признаков, что позволяет более точно учитывать взаимодействие между группами признаков. Описание и детали также смотрите в публикации.
Обучение FFM
FFM очень подвержены переобучению, для борьбы с этим используется ранняя остановка — после каждой итерации улучшения модели, происходит оценка точности на валидационном наборе. Если точность падает — обучение прекращается. Я внес несколько изменений в код стандартной библиотеки, главное из которых — добавил оценка качества на основании метрики MEAP которая использовалась для подсчета результата на Kaggle, вместо стандартной logloss.
Одна из команд, которая заняла место в топ-3 также добавила возможность попарной оптимизации в FFM.
Для возможности ранней остановки при обучении целой модели, я делил случайным образом тренировочный набор в распределении 95/5 и использовал 5% как валидационный.
Финальный результат это простое средние результатов работы 5 моделей на разных случайных распределениях со слегка разными наборами признаков.
Такой метод смешивания результатов на подвыборках тренировочного набора называется bagging (bootstrap aggregation) и часто позволяет уменьшить разброс (variance), что улучшает результат. Также, обычно он хорошо работает для смешения результатов моделей градиентного бустинга (xgboost/lightGBM)
Что не сработало
Модели основанные на градиентном бустинге, стабильно давали хуже результат (сравнимый с FM), попарная оптимизация ненамного улучшала картину. Также не сработала для меня генерация признаков для FFM на основании листьев деревьев от бустинга. Стек FFM → FFM или XGBOOST → FFM был стабильно хуже чем FFM на всем наборе данных.
Model name | Result |
My best single model result | 0.69665 |
My best result (mix of 5 models) | 0.69778 |
1st place best result | 0.70145 |
Финальные результаты
Код, инфраструктура и железо
Изначальное объединение файлов сделано при помощи Python, также я обычно использую Jupyter для целей исследования данных и анализа. Также отфильтровал клик-лог только для пользователей встречающихся в тренировочном\тестовом наборах, что позволило уменьшить его с 80 до 10GB.
Изначальный Feature engineering также был написан на Python, однако, учитывая огромное количество данных, а значит время необходимое на их обработку, я быстро перешел на Scala. Разница в скорости по примерной оценке составила около 40 раз.
Для быстрого итерирования и оценки улучшения точности, я использовал подмножество данных, примерно 1/10 от общего объема.
Это позволило получать результат примерно через 5-10 минут после запуска + модели помещались в памяти ноутбука.
Генерирование входных файлов для финальной модели занимает около 3х часов на 6-ти ядерной машине. Общий объем записанных файлов > 500GB. Примерное время обучения и предсказания составляло 10-12 часов, использование памяти — около 120GB.
Весь процесс автоматизирован при помощи скриптов.
Железо
БОльшая часть работы была проведена на ноутбуке Dell Alienware (32GB RAM). Последние несколько недель я также использовал рабочую станцию (i7-6800, 128GB RAM) и в последнюю неделю memory optimized x4large и x8large AWS машины, до 2х параллельно.
Благодарность
Статья посвящается моей дорогой жене, которой очень непросто переживать время когда муж находится дома, но в тоже время его нет.
Также спасибо Артему Заика за комментарии и рецензию.