Как бенчмарк попал в призы

Небольшая заметка о прошедшем недавно соревновании «Gazprom Neft SmartOil Contest», которое проходило на платформе Boosters, и решении, которое было получено за 40 минут.

neft

В рамках своего курса для магистров ВМК МГУ «ПЗАД = прикладные задачи анализа данных» (кстати, материалы доступны), как всегда, я даю задание участвовать в каком-то проходящем в настоящее время соревновании. В прошлом году я писал о подобном опыте.  В этом году после очередной неудачной веры в Kaggle (теперь уже понятно, что без ликов они не умеют организовывать соревнования, даже если лики невозможны — мы пострадали в Google Analytics) методом исключения было выбрано соревнование «Gazprom Neft SmartOil Contest».

В каждом подобном соревновании (обязательно надо, чтобы в нём не было частого публичного обмена кодом) я делаю бенчмарк — программу с простым алгоритмом, которое решает задачу. Один из критериев оценки студентов такой. Программу я пишу за 20 минут, их задача за 2 недели написать лучше (иначе задание не засчитывается). Именно к этому конкурсу программу я писал за 2 захода, т.е. за 20 + 20 минут, она попала в Тоp5 и выиграла денежный приз (награждали Top7 и, кстати, итоговый рейтинг участников заочного этапа второго тура немного неверный).

Магистры ВМК тоже успешно выступили. Отборочный этап состоял из двух задач, в табл. показаны лидеры скрытого лидерборда, выделены мои студенты. На очный этап из 10 участников было 5 МГУшников (могло бы быть и 6, если бы поехали все).

lb.png
Топ10 в двух подзадачах конкурса.

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

lb01
Рис 1. Распределение мест в обычном соревновании

На рис. 1 показаны распределения мест в соревновании «Rosbank ML Competition«, которое также проходило на платформе Boosters. По горизонтальной оси — место в публичной турнирной таблице, по вертикальной — в финальной (скрытой во время конкурса). Радиус круга пропорционален числу посылок решений, а интенсивность закраски — активности в конце соревнования (поскольку у меня не было подробных данных, я использовал время с момента последней посылки решения до конца соревнования).

Во-первых, мы видим большую корреляцию между местами в публичной и финальной таблице: из  почти 300 участников только 4 «прыгнули» более чем на 50 мест. Более того, места, по сути, разыгрывали самые активные участники — имеющие больше всех попыток и «сабмитящие» до самого конца.

Теперь давайте посмотрим на аналогичную иллюстрацию для нашего соревнования, рис. 2.

lb02.png
Рис. 2. Распределение мест в необычном соревновании

Корреляции между местами в публичной и финальной таблице уже не видно. Самые активные действительно оккупировали Топ-15 публичного лидерборда, но после объявления финальных результатов оказались «размазанными» от 7 до 61 места. Первые 6 мест были взяты совсем малыми усилиями… Это была статистика по первой задаче соревнования, по второй картина аналогичная, см. рис 3, разве что прыжков с 71 на 3 место тут нет.

lb03
Рис. 3. Распределение мест в необычном соревновании (другая задача)

Если посмотреть на распределения лучших результатов, то во всех задачах на публичной выборке это практически «колокольчик», см рис. 4 — красный цвет, а на финальной — смесь нескольких колокольчиков. Кстати, центр красного холма располагается в результате решения, выложенного одним из участников. Мы в рамках занятий устраивали обсуждение решений, и чтобы не нарушать элементарную этику соревнований, несколько магистров выложили коды своих решений, о которых рассказывали на занятиях (чтобы они были доступны всем участникам). Забавно, что эти решения стали центрами распределения всех решений…

g06
Рис. 4. Распределения лучших результатов участников в задаче 2.

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

neft1

Ниже серия размышлений для быстрого создания бенчмарка.

Что такое смена насоса?

В какой-то момент на нефтедобывающей скважине меняется насос. Если посмотреть на даты смен:

2010-01-14 10:00:00    3
2009-12-06 15:00:00    2
2008-09-29 00:00:00    2
2015-07-08 14:00:00    2
2014-08-08 14:01:00    2
2017-04-29 07:01:00    2
...

(тут указано, сколько раз такая дата встречается в обучении), то увидим, что даты разбросаны по разным годам. Самое важное — предсказывать надо «со следующего месяца». При этом насос мог меняться в первых числах этого (и целый месяц потом работал новый насос) или в последних числах. По идее, это очень важное наблюдение. На презентации решений выяснилось, что на это почти никто не обратил должного внимания, но никто из-за этого и не пострадал… поскольку использовать это как-то в модели не получалось.

В телеграм-канале много ключевых вопросов осталось без ответа. Например, как узнать модель нового насоса, почему у нас отмечена лишь последняя дата смены насоса (он мог меняться несколько раз) и т.п. Учитывая дефицит информации, не будем создавать сверх-сложное решение!

Сколько у нас полезных данных

Как часто бывает в реальных задачах, многие признаки были даны формально (они константные или почти константные), но была также и совсем другая картина. В табл. представлена несколько взятых наугад признаков, среди них 3 константные, а один — тип насоса — не очень информативный, т.к. на 100 скважинах используются 83 типа, т.е. информации не хватит, чтобы понять специфику каждого типа. Можно было из типа выцепить серию и ориентироваться на неё, но опять же, из-за ограничения по времени не будем этим заниматься.

feats2
Табл. Число уникальных значений у некоторых признаков.

Прогнозирование временных рядов

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

g01
Рис. 5. Дебит нефти на разных скважинах.
g04
Рис. 6. Средний дебит по месяцам.

На рис. 6. представлены два способа усреднения — обычное (в момент t усредняем дебит на всех скважинах в момент t) и с предварительной нормировкой (сначала нормируем все функции по максимальному дебиту). Для наглядности при использовании второго способа усреднения полученные значения были ещё умножены на 1000, чтобы две функции можно было сравнить в одном масштабе.

«Среднее поведение» дебита после смены насоса выглядит довольно просто: резкий скачок, затем почти линейное (по времени) падение.

Линейная модель

Почему бы для решения не использовать самую простую модель? Самая простая — константная. Именно она и использовалась как первый бенчмарк. Один из участников соревнования и слушатель ПЗАДа Сергей Иванов (про которого я уже писал в блоге в заметке про самый важный день нашей жизни) с помощью константы вышел даже на первое место — он использовал среднее арифметическое дебитов в месяц замены и в предыдущий месяц, умноженное на некоторый коэффициент.

Следующая по сложности модель — линейная:

formula2

Мы прогнозируем на 6 месяцев вперёд для каждой скважины. Для каждого месяца t используем свои коэффициенты. Дебит представляем в виде линейной комбинации дебитов за k месяцев до смены насоса. Регуляризация использовалась не в классической форме (L2 или L1), а в виде условий монотонности на коэффициенты: от ближайших месяцев зависимость должна быть больше, чем от удалённых по времени.

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

formula

Собственно, никаких библиотек машинного обучения не использовалось, задача решалась с помощью оптимизатора из scipy. И весь код занимал несколько строчек (большинство из которых служебные — для организации данных).

Сам код я, к сожалению, не могу выложить, т.к. призёры подписали передачу всех прав на код компании Газпромнефть (и теперь бенчмарковую линейную регрессию они могут использовать в проде;). Поэтому в конце сухие результаты: на обучающей выборке качество (MAE) — 67.1 (никакой специальной проверки по фолдам или на отложенной выборке не делалось), в публичной турнирной таблице — 66.6, в финальной — 66.5. Как я сказал на презентации в финале — «тут переобучаться нечему» (поэтому и результаты стабильны).

Плюсы и минусы соревнования

+) Соревнование сопровождалось вебинаром, на котором подробно рассказывали про добычу нефти. Если Вы с этим не сталкивались, то это жутко интересно! И вообще, это правильно, если заказчик объясняет, откуда задача, почему она важна, что полезного можно найти в данных.

+) Соревнование идеально подходит для учебного курса: данные не очень большие, нет большого числа публичных кернелов (кода других участников).

-) Результаты можно считать случайными. Когда мы со студентами собирались на соревнование, самой обсуждаемой темой было «а что рассказывать, если результат случаен». Собственно, я об этом и решил рассказать, но не я один. Участник очного этапа (не буду называть имени — вдруг нельзя) начал свой доклад с фразы «я эту задачу, вроде, не решил, но, на мой взгляд, её никто не решил».

-) В итоге Газпромнефть провела два конкурса, предложив DS-специалистам в общей сложности 4 задачи. Они были грамотно выбраны с точки зрения специалистов предметной области, но совсем бесполезны для DS-сообщества: во всех было «достаточно мало данных». К примеру, в приведённой выше — 400 прецедентов в обучении и 100 — в контроле (формально записей в таблице более 22000, но смен насоса только 400+100). По моим прикидкам, можно было бы сделать одну, но добротную задачу.

0) От очного этапа не зависело распределение мест. Это не плюс и не минус, это просто особенность, о которой не все участники задумывались.

В конце поздравляю победителей:

 

  • I место —  Павел Мазаев (ММП, ВМК, МГУ)
  • II место — Александр Ничипоренко
  • III место — Виктор Януш (ММП, ВМК, МГУ)

 

Спасибо платформе Boosters, на которой проходил заочный этап, Иннопрактике, которая организовывала очный, и НТЦ Газпромнефть за предоставленные ценные данные. Отдельное спасибо всем участникам!

 

 

 

Как бенчмарк попал в призы: 2 комментария

  1. […] Как видите, всё просто;) А вот и лучшие прохождения теста (см. табл.). Ясно, что тут три левых ника. Но Амир Мирас и Печёнкин Богдан всегда могут обратиться ко мне за рекомендациями. А если потенциальный работодатель читает эти строки, срочно связывайтесь с ними (первый — мой магистр, а второй — недавно был в призёрах Газпромнефти) […]

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s