Как сделать сабмит на kaggle

Обновлено: 05.07.2024

A Power Analyst Defeat

Вот уже 13 лет мои разработки математических моделей посвящены электроэнергетике: процессам выработки, потребления и, главное, торговле электроэнергии на оптовом рынке. Да-да, почти во всех развитых странах функционируют оптовые рынки электричества. На Kaggle почти нет соревнований, посвященных электроэнергетике. Мне удалось найти всего два:

    (проводилось в октябре-декабре 2019 года) (проводилось в 2012 году)

Соревнование ASHRAE шло, люди работали. В рамках соревнования нужно было сделать долгосрочный прогноз потребления 4 видов энергии (электроэнергия, пар, холодная и горячая вода) для 1500 зданий, расположенных на 16 территориях.

После долгих раздумий я ткнула join competition. Почему долгих? Потому что я понимала (со времен соревнования Яндекса по прогнозам пробок в 2010 году), что соревнования требуют колоссальных усилий, времени и упорства. Ткнула… и обалдела! С такими массивами данных в своей сфере мне сталкиваться еще не приходилось:

  • Таблица исходных данных ~20M x 16 значений
  • Результат вычислений столбец ~42M значений

Приложив, как мне тогда казалось, заметные усилия, чтобы реализовать простую регрессионную модель, мне удалось сделать 15 попыток загрузки результата и занять 2431 место из 3614 участников. Это поражение.

Моя итоговая позиция по итогам соревнования

Точнее, мои оценки выглядят так:

Работа над ошибками

В начале января 2020 были опубликованы итоговые результаты. Победители поразили меня и своей точностью, и свой открытостью: большинство победителей опубликовали описание своих алгоритмов/моделей. Я выделила день и внимательно прочитала описания основных решений, просмотрела десяток ключевых алгоритмов и поняла: учиться нужно у победителей. Для этого требуется найти время и самостоятельно реализовать алгоритмы, о которых я прочитала. Цель: сделать 200 загрузок и попасть в 10% лучших результатов.

С января по июнь 2020 года я упорно выделяла часы, когда занималась ASHRAE. Основной рывок пришелся на май и начало июня.

Моя история загрузок результатов

На странице соревнования есть кнопка late submission, которая позволяет загружать прогнозы даже после окончания соревнований. За 5 месяцев мне удалось сделать 158 late submission и добиться результатов, входящих в ~12%. Детали:

Итоговые оценки 158 загрузок

Разработанный фреймворк опубликован на моей git странице. Дальше продвинуться мне не удалось, поскольку в начале июня 2020 начался новый контракт и работы стало много. На сегодняшний день в моих планах задача ASHRAE отсутствует.

Урок 1: учиться нужно у лучших

Соревнование ASHRAE стало для меня издевательством над собой. Важным и полезным. После 12 лет работы в области разработки математических моделей для решения задач планирования и прогнозирования на оптовом рынке электроэнергии и мощности России я думала о себе высоко. За плечами несколько крупных успешно реализованных проектов, кандидатская диссертация в области математического моделирования, высокая зарплата, популярный блог, впечатляющая научная цитируемость и т.д. и т.п.

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

Пока я делала работу над ошибками, мне было тяжело, больно, хотелось бросить. Публикую кусочек из своего июньского письма моему другу профессору МГТУ им. Н.Э. Баумана А.П. Карпенко.

Талантливые ребята, опытные кагглеры, грозные команды-победители — словом, самые квалифицированные и смелые участники ASHRAE заставили меня начать с начала: почувствовать себя бестолковым первокурсником, смотреть на их работы как на методичку, думать, повторять, оценивать и добиваться приличных результатов. Это был самый отрезвляющий проект в моей профессиональной жизни.

Урок 2: data scientist должен уметь работать с множеством моделей

В рамках соревнования ASHRAE я впервые услышала о таких библиотеках, как LightGBM, CatBoost, Prophet. Про XGBoost я слышала раньше, но не имела опыта работы с этой библиотекой. Регрессию и Neural Network (Python/Keras/TensorFlow) я знала и использовала давно.

Так выглядит структура решения команды, занявшей второе место. Site обозначает территорию.

Структура решения одного из победителей

XGB: XGBoost
LGBM: LightGBM
CB: CatBoost
FFNN: Feed-forward Neural Network

Моя любимая команда, занявшая второе место, подробно описала решение: они создали около 20К моделей (да-да, 20 000 моделей!) и смешали их результаты. На Kaggle я узнала, что процесс смешивания или ансамблирования моделей называют блендинг (blending). Чтобы получить максимальный эффект от блендинга, нужны модели, с одной стороны, сопоставимого качества; с другой — обладающие важными отличиями и добавляющие разнообразия (diversity) в такую солянку. Разнообразие достигается в том числе за счет использования различных библиотек. Этим прекрасен Python: для него доступен грандиозный арсенал открытых математических библиотек. Насколько я поняла, невозможно выиграть соревнование на Kaggle без батареи точных моделей, грамотно сбленденных между собой.

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

Мой результат ~12% является прогнозом, полученным как арифметическое среднее 3-х наборов: первый набор содержит 56 моделей LightGBM, обученных по территориям; второй — 24 модели LightGBM, обученных по видам энергии; третий — 36 моделей XGBoost, обученных по территориям. Предварительная обработка (preprocessing): линейная интерполяция погодных данных, удаление постоянных значений (constant) из значений энергии для заданного списка зданий. Постобработка (postprocessing) отсутствует. Выглядит довольно просто, не так ли? Сравнив схему победителей и мои наработки, становится очевидным, каким образом мой результат следует улучшать.

Урок 3: экстенсивный опыт неизбежен

На этапе обучения различных моделей, таких как LightGBM, CatBoost, XGBoost, Neural Network, мы сталкиваемся с длинным списком гиперпараметров. Для wonder boostings мне пришлось изучать эти параметры с нуля.

Я изучала теоретическую часть деревьев StatQuest with Josh Starmer. Замечательный канал, посвященный анализу данных, всем рекомендую! В процессе работы читала описание гиперпараметра, устанавливала некое значение, думала, что понимаю, что делаю. На первом этапе результат получался плачевный: мои ожидания и реальность бежали в разных направлениях. Я корректировала свои ожидания, устанавливала новое значение гиперпараметра, снова считала. Важно при этом менять только один гиперпараметр, изменение двух и более одновременно существенно усложняет интерпретацию результата на первых порах.

В действительности я проделала прогнозов в 2-3 раза больше, чем 158. Лишь часть того, что я посчитала, я загружала для оценки на Kaggle; больше половины отметались на этапе обучения моделей. Таким образом, я вычислила 3 * 158 * 20M (обучение моделей) + 158 * 42M (прогнозирование для оценки на Kaggle) = ~16B прогнозных значений.

Такой опыт расчетов, когда на практике я начинаю понимать и даже чувствовать, как тот или иной гиперпараметр влияет на результат моделирования, называю экстенсивным. Когда решала задачу оптимизации работы ТЭЦ, то был момент, когда я с утра до вечера снова и снова оптимизировала, чтобы возникло чувство доверия к модели. Аналогичный опыт у меня был с прогнозированием, когда мне приходилось в день запускать сотню расчетов и оценивать их результаты.

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

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

kaggle competition

Участвовать в соревнованиях Kaggle весело и захватывающе! За последние пару лет я разработал несколько простых способов создания более совершенных моделей машинного обучения. Эти простые, но мощные методы помогли мне попасть в топ 2% соревнования Instacart Market Basket Analysis, и я также использую их вне Kaggle. Давайте рассмотрим методы поближе.

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

график признаков

Но проблема с этими графиками заключается в том, что они создаются с использованием обученной модели. Если бы мы могли напрямую создавать эти графики прямо по данным для обучения, это могло бы помочь нам лучше понять принципы работы нашей сети. Фактически, графики могут помочь вам в следующем:

  1. Понимание признаков;
  2. Поиск признаков с большими шумами (самая интересная часть!);
  3. Разработка признаков;
  4. Важность признаков;
  5. Отладка признаков;
  6. Обнаружение утечек;
  7. Мониторинг модели.

Чтобы вы легко могли попробовать сами, я решил включить эти методы в пакет featexp на Python, и в этой статье мы увидим, как их можно использовать для исследования признаков. Мы будем использовать датасет из соревнования Kaggle Home Credit Default Risk. Задача конкурса — предсказать неплательщиков по известным данным о клиентах.

Понимание признаков

понимание признаков - kaggle соревнование

График зависимости признака от цели ничего не дает

Если зависимая переменная (цель) является двоичной, строить графики бессмысленно, потому что все точки имеют значение либо 0, либо 1. Для цели с непрерывной областью значений большое количество точек затрудняет понимание взаимосвязи цели и признаки. Featexp создает более полезные графики. Посмотрим на них:

Зависимость признака от цели

Зависимость признака от цели — DAYS_BIRTH (возраст)

Featexp создает бины (ось X) признака. Затем он вычисляет среднее значение цели в каждом бине и отображает его на рисунке слева. Из графика следует, что у клиентов с высокими отрицательными значениями для DAYS_BIRTH (с большим возрастом) более низкие ставки. Это имеет смысл, поскольку молодые люди обычно чаще просрочивают платежи. Эти графики помогают нам понять, что свойство может сказать о клиентах и ​​как это повлияет на модель. Участок справа показывает количество клиентов в каждом бине.

Поиск признаков с большим шумом

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

решение для соревнований kaggle

Сравнение признака при обучении и при проверке

Featexp рассчитывает две метрики для отображения на этих графиках, которые помогают оценить шум:

Приведенная ниже функция имеет различный тренд и, следовательно, низкую корреляцию: 85%. Эти две метрики можно использовать для отключения признаков с большими шумами.


Пример функции с большими шумами

Используйте тестовые данные на другом интервале времени. Тогда вы будете уверены, что тренд не меняется со временем.

Функция get_trend_stats() в featexp возвращает таблицу с корреляцией тренда и изменением каждого признака.

участие в соревновании Kaggle

Результат, возвращаемый функцией get_trend_stats()

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

AUC при включении различных признаков с использованием корреляции тренда

Можно видеть: чем выше порог корреляции тренда, тем выше AUC. Не отключая важные признаки, можно добиться увеличения LB AUC до 0,74. Интересно, что AUC не меняется так сильно, как LB AUC. Важно правильно выбрать стратегию проверки: так, чтобы локальный тест AUC совпадал с LB AUC. Весь код можно найти в featexp_demo.

Разработка признаков

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

Зависимость признака от цели EXT_SOURCE_1

Зависимость признака от цели EXT_SOURCE_1

Клиенты с высоким значением EXT_SOURCE_1 имеют низкие ставки. Но первый бин (ставка ~ 8%) не соответствует тренду признака (идет вверх, а затем вниз). Он имеет только отрицательные значения вблизи -99.985 и большое количество единиц в бине. Это, вероятно, подразумевает, что это специальные значения. К счастью, нелинейные модели не будут испытывать проблемы с обучением этим связям. Но для линейных моделей, таких как логистическая регрессия, такие специальные значения и нули (которые будут показаны как отдельный бин) должны быть поданы в значение из бина с аналогичной ставкой вместо простой подачи со средним значением признака.

Важность признаков

Featexp также помогает определить относительную важность того или иного признака. DAYS_BIRTH и EXT_SOURCE_1 имеют хорошую линию тренда. Но большинство единиц EXT_SOURCE_1 сосредоточено в специальном бине значений, что означает, что признак почти одинаков для большинства клиентов и, следовательно, не может хорошо их дифференцировать. Это говорит о том, что признак может быть не так важен, как DAYS_BIRTH. Основываясь на модели важности признаков XGBoost, DAYS_BIRTH на самом деле важнее EXT_SOURCE_1.

Отладка признаков

Глядя на графики Featexp, можно находить ошибки в сложных кодах, делая следующие две вещи:

  1. Проверьте, что распределение клиентов для признака по бинам выглядит нормально. Я лично много раз сталкивался с такими случаями, как выше, из-за незначительных ошибок.
  2. Всегда выдвигайте гипотезу о том, как будет выглядеть тренд признака, прежде чем смотреть на графики. То, что тренд выглядит не так, как вы ожидали, может означать некоторые проблемы. И, откровенно говоря, этот процесс предсказания трендов делает создание моделей машинного обучения намного более захватывающим!

Обнаружение утечек

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

Признак с утечкой

Признак с утечкой

Мониторинг модели

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

Эти простые проверки часто помогали мне в создании лучших моделей в реальных задачах и в Kaggle. С featexp требуется 15 минут, чтобы посмотреть на графики, и это определенно стоит того.

Как подключить PySpark и Kaggle в Google Colab

Автор Роман Котюбеев Категория Spark, Статьи

Недавно мы рассказывали, что такое PySpark. Сегодня рассмотрим, как подключить PySpark в Google Colab, а также как скачать датасет из Kaggle прямо в Google Colab, без непосредственной загрузки программ и датасетов на локальный компьютер.

Google Colab

Google Colab — выполняемый документ, который позволяет писать, запускать и делиться своим Python-кодом через Google Drive. Это тот же самый Jupyter Notebook, только блокноты хранятся в Google Drive, а выполняются на сервере.

В отличие от традиционных инструментов разработки, Jupyter Notebook состоит из ячеек, где можно писать код (чаще всего на Python), запускать и сразу же смотреть результаты. Кроме того, ячейки блокнотов могут содержать не только код, но и текст, формулы, рисунки и видео.

Особенную популярность блокноты получили у Data Scientist’ов, поскольку позволяют мгновенно тестировать свои идеи. Но некоторые методы машинного обучения, например, глубокое обучение (Deep Learning), подразумевают большие вычислительные мощности, что не каждый может себе позволить. Поэтому Google Colab также предоставляет GPU, а также TPU — уникальная разработка Google специально для машинного обучения ( M achine L earning).

Все вычисления происходят на виртуальной машине с операционной системой Ubuntu. Все команды bash также доступны. Примечательно, в ячейках для запуска команд bash перед самой командой ставится восклицательный знак.

Установка PySpark в Google Colab

PySpark прежде всего требует установки самого Spark и платформы Java. Для нашего примера установим свободный JDK (Java development kit) версии 8. А Apache Spark скачаем версии 2.4.6 с Hadoop. Точная ссылка для скачивания доступна на главной странице Apache Software Foundation на вкладке Downloads. Скачанный архив нужно разархивировать командой tar . Вот как это выглядит в Colab:

После этого в окружение среды нужно указать пути JAVA_HOME и SPARK_HOME на скачанные программы. Поскольку мы напрямую загрузили Spark, то он находится в директории content. Чтобы их добавить воспользуемся модулем os , который предоставляет интерфейс для взаимодействия с файловой системой. Вот так будет выглядеть Python-код:

Вот и все . Осталось только проинициализировать PySpark. Для этого вызывается метод findspark.init() , а дальше создаём точку входа кластера. Следующий код на Python это иллюстрирует:

  • Об инициализации Spark-приложения через SparkSession читайте нашу предыдущую статью

Скачиваем датасет Kaggle

Многие Data Scientsist’ы работают с датасетами Kaggle — онлайн-площадке для соревнований по машинному обучению как в рамках конкурсов, так и для личных исследований. Обычно датасеты с Kaggle скачиваются напрямую на компьютер. Потом их загружают либо в Google Colab, либо в Google Drive. Причём если они загружаются с Drive, то придётся также их подгружать в Colab и вводить код доступа. Оба метода достаточно долгие, особенно если файлы большого размера. Поэтому рекомендуется загружать файлы напрямую с Kaggle в Colab через Kaggle API [1].

Для этого, прежде всего необходимо создать аккаунт Kaggle. А затем в настройках аккаунта нужно создать API Token. Рисунок ниже показывает соответствующий раздел. После этого скачается файл kaggle.json, который содержит ваш личный код доступа, поэтому им не стоит делиться со сторонними лицами.

Раздел в настройках Kaggle с созданием токена

Далее требуется загрузить kaggle.json в директорию root. Для этого мы создадим этот файл, а потом добавим содержимое файла. Ниже команды в Colab, где вам нужно будет вставить ваши поля с именем и ключом. Также, чтобы обезопасить свой ключ, мы используем команду chmod.

Осталось только скачать какой-нибудь датасет. Например, можно взять датасет с данными о домах Бруклина с 2003 по 2017 года, который весит 234 Мб. А затем скопировать API команду, как это показано на рисунке ниже.

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

А теперь можно приступать к работе со Spark в Google Colab. Так как файл в формате CSV, то мы может его прочитать и вывести первые строчки в Python:

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

График странам с участниками Kaggle-соревнований

Услуги и возможности Kaggle

  • Площадка для соревнований по Machine Learning. Со дня основания и по сей день основная цель Kaggle — дать возможность организациям устроить конкурс на лучшие модели и алгоритмы.
  • Kaggle Kernels — облачная среда разработки по типу Jupyter Notebook и является аналогом Google Colab. Также каждому пользователю дается использовать GPU на 30 часов в неделю бесплатно [3]. Своими разработками в Kernels можно делиться со всеми.
  • Публикация, хранение и использование датасетов. Сообщество и организации, которые проводят соревнования, делятся наборами данных. Здесь можно найти текстовые данные, изображения, аудио и видео всевозможных сфер деятельности.
  • Kaggle Learn — мини-курсы с использование Kernels для ознакомления с Data Science.
  • Job’s Board, в которой работодатели выкладывают списки вакансий.
  • User ranking, который включает список лучших конкурсантов, датасетов, блокнотов, а также лучших пользователей форума. Система делит пользователей на следующие категории:
    1. Grandmaster
    2. Master
    3. Expert
    4. Contributors
    5. Novices

Как происходят соревнования

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

  1. Организатор соревнований готовит данные и детальное описание к проблеме, которую нужно решить. Kaggle также предоставляет консультационные услуги по организации.
  2. Участники предоставляют свои решения, которые оцениваются через тесты организаторов.
  3. Рейтинги работ публикуются в реальном времени.
  4. По истечении установленного срока формируются списки победителей и выплачивается призовой фонд. Организаторы соревнований имеют интеллектуальные права на разработанный победителями алгоритм, модель или ПО.

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

Участие в соревнованиях может дать конкурсанту практический опыт в разработке моделей Machine Learning. Призовые места обеспечат не только денежным призом, но и всемирной известностью в сообществе Data Science.

Читайте также: