Введение
Всем привет, меня зовут Богдан. В ML я начал свое посвящение осенью 2023 года и за этот год успел поработать над таким неоднозначным проектом как "Предсказание выбытия насосов". На данную тему на Хабре уже есть несколько статей, которые я в своё время нашел и опыт которых я пытался перенести в свой учебный big data пет проект :)
ссылки на других ребят тут: ссылка 1 и ссылка 2
Хочу сказать что в данной статье не будет кода, она будет посвящена размышлениям, неудачам и иногда смешным попыткам решить данную проблему. Ну а также наверное где-то я буду кидать ссылки на совершенно разные вещи и немного похвастаюсь нашим финальным решением и тем, к чему меня привело участие во всем этом.
Если вы хотите посмотреть на то как это реализовано под капотом, то добро пожаловать в репу на гитхабе
Здесь расписано множество вещей, которые я успел попробовать пока работал над этой задачей в них входят как удачные решения, так и не очень.
В общем и целом такие насосы используют для добычи нефти и на них установлены датчики, которые замеряют текущие показатели телеметрии. Суммарно в зависимости от комплектации количество датчиков меняется до 40+ параметров.
Таким образом в идеале хотелось бы смотреть на эти датчики и по ним предсказывать ожидаемую наработку на отказ.
Когда я попал в небольшую команду ребят, которым выпало удовольствие 18 карат невезения заниматься в рамках нашей учебной программы этой темой, я и подумать не мог что через пару месяцев начну жестко погружаться в ML и осваивать базу. Плюсом было то, что эти ребята к моему приходу в проект уже выиграли конкурс и получили небольшую поддержку на реализацию стартапа, которую по умному реализовали в покупку курса по ML.
Датасет представляет из себя набор исторических данных на 80 гб. 800+ фичей и почти десяток тысяч скважин. Временной шаг- 1 день. Среди фичей можно выделить ту самую телеметрию, заметки работников на промысле о причинах выбытия и осложнениях, а также расчет геологов и замеры, которые недропользователь делает "ручками". Например такой параметр как дебит нефти не замеряется напрямую, поскольку при добыче нефти добывается и вода. По факту для расчета дебита нефти надо:
Естественно в нашем датасете был и дебит нефти, который отмечался как показатель телеметрии, однако по факту замеры ведутся только для всей жидкости. Тем более нужно понимать что такая фича будет сильно скоррелирована и скорее всего будет вносить лишний шум в модель. Подобная история была актуальной еще для нескольких фичей.
Когда catboost не all the things
Поговорим немного о всех подходах которые были рассмотрены и я сюда добавлю немного критики в свою сторону, потому что финальное решение хоть и действительно является чем-то новым в рамках данной задачи как минимум в РФ, однако есть другие подходы, которые возможно у кого то сработают из коробки, занижая интерпретируемость, но зато дешево и быстро работая. Перед тем как строить финальную модель из датасета была выбрана идеализированная выжимка, по которой минимум пропусков в данных и замеры велись почти по всем датчикам. Так решалась проблема большого объема данных. А идея заключалась в том, что если на это кусочке данных модель выдаст хороший score, то можно её масштабировать дальше.
Регрессия.
Здесь были рассмотрены дефолтные алгоритмы деревьев решений от обычных до ансамблей и проблема заключается вот в чем: временные ряды данных идействительнаяразмеченная наработка на отказ скоррелированы очень слабо и подбор таких гиперпараметров, при которых условный catboost выдаст вам хороший score по MSE, MAE и MSLE (логарифмическая ошибка) на train и test сложная и для меня оказалась невыполнимая задача. Есть гипотеза о том, что можно поставить Gridsearch на неделю и возможно достичь заветных 70% на условном R2 по test и train и надеяться, что это не будет переобучением, но ставку я на это делать не стал.
В реальности же проблема заключалась в том что нужно логарифмировать целевую переменную и сделать overfitting по MSLE, что выдавало по ней относительно неплохой score, но всегда повышая качество одной из метрик, другая значительно страдала. Попытка добавить фичи из TS Fresh внесла доп шум и снизила итак плохие метрики.Классификация
Аналогичая история, но уже лучше. Accuracy иногда выдавала высокий score, но большее внимание уделялось метрикам F1 и Roc auc, поскольку дисбаланс классов был значительным. Классификатор строился как и на несколько последних дней работы скважины, для большего баланса, так и суммарно на весь цикл жизни. F1 был низкий, порядка 0.03, что говорило о том, что catboost и его собратья меньшие тут не помогут.-
Поиск аномалий во временных рядах.
Перед тем как что то говорить дальше надо отметить, что аномалия в данной задаче- это не просто выброс или что то непонятное в данных, а некоторое временное окно, в котором можно заметить некоторые паттерны, предвещающие выбытие.Ищем Аномалии
Переходя к этой задаче я попробовал такой метод как cusum и получил интересный результат. Аномалии явно происходят чаще чем в день выбытия, что объясняло то, почему классификатор не работал. На протяжении всего цикла жизни скважины можно заметить, резкие падения амплитуды, они вызваны геолого-техническими мероприятиями, сменой режима работы скважины и рядом других процессов в ходе эксплуатации.Иногда эта смена режима и есть то самое выбытие и пройзойти оно может действительно заранее.
В итоге попробовав isolation forest я убедился в том, что аномалий много и надо с этим что то делать.
В действительности для данной выборки аномалий было порядка 200 (реальное выбытие), обнаружено в 6 раза больше.
Здесь начинается самое интересное. Нужно было найти такую модель, которая минимизирует аномалии пока скважина работает и поймет, что с ней что то не так перед выбытием и желательно заранее.
То есть надо выбрать некоторое временно окно, когда явно есть эти аномалии. Изначально была гипотеза о том, что это окно составляет 15 дней до выбытия, но затем оно сдвинулось на 30 дней до выбытия.
Посмотрим на несколько графиков
Как видно из графиков качество временных рядов оставляет желать лучшего.
По факту очистка данных от выбросов, шумов и заполнение пропусков это большая часть технической работы, которую необходимо провести.
Автоэнкодер all the things
Изучив другие варианты того, как решить данную задачу я решил попробовать реализовать такую структуру как Автоэнкодер. Суть его достаточно проста: мы обучаем его на данных которые аномалией не считаем и ингорируем действительные аномалии (временное окно перед выбытием, равное 30 дням).
Вдохновлением к переходу к Автоэнкодеру стало это видео. Как оказалось позже такой подход у Арабов и Индусов уже реализован и они даже написали статью ;D
В качестве финальной модели был выбран LSTM- Автоэнкодер. LSTM- хороший вариант когда речь идет о временных рядах. Также данную структуру называют рекуррентным автоэнкодером по понятным причинам.
Аномальность будет фиксироваться на основе ошибки MSE. Если наша модель смогла выучить и может обобщаться на новых данных, то это хорошо, если они нормальные. Если они аномальные на них она обобщаться не должна, значит это аномалия и значит насос скоро сломается. Вишенкой на торте является возможность построить графики оригинальных и восстановленных фичей, что введет в восторг нефтяников с их любовью к интерпретируемости.
На графике видно что чувствительность модели можно крутить, а значит выбирать некоторый оптимальный сценарий, при котором оператор на месторождении спит спокойно и не бегает от каждого сигнала, а также не пропускает то самое аномальное окно.
Действительно такой результат явно можно назвать неплохим, однако можно лучше, правда?
Есть мнение что лучше построить такую модель, которая будет реагировать на любое отклонение, чтобы точно уследить за скважиной. Если скважин мало такой подход действительно может иметь право на жизнь, но если у оператора 100+ скважин дали тревогу, то скорее всего он просто пойдет пить чай :D (шутка)
Он просто физически не успеет за один день оббежать такое количество скважин и алгоритм будет бесполезен, потому что вера в него будет под вопросом.
Значит надо использовать методы предобработки даннных, причем такие, которые можно будет объяснить бизнесу.
Сюда изначально рассматривался метод SVD на 2-х и 3-х мерное представление, однако затем выбор пал на быстрое преобразование Фурье. Это заметно повысило качество временных рядов с одной стороны и минимализировало непонимание с другой.
Объединение оригинальных фичей и FFT фичей дало значительный прирост метрик в принципе, однако при единичной проверке по нескольким скважинам оказалось пустышкой, причина снова же те прекрасные оригинальные временные ряды.
При обучении Автоэнкодера только на FFT фичах получился заметный прирост метрик, а на единичных проверках был получен также вполне хороший результат. Посмотрим на графики ниже.
О чудо, модель практически идеально смогла уловить суть нормальных данных, при разделении: train=0.5, val=0.25 и test=0.25.
В идеале действительно можно предсказать эту поломку вплоть до 30 дней до отказа, ведь аномалии видны заранее.
Аномалии в первые дни работы называются приработкой скважины, когда поломки тоже имеют место быть по причине брака оборудования.
По сути в финале пользователь получает интеллектуальный апгрейд старой интенсивности отказов для каждой скважины отдельно, которая по сути была некоторым средним по палате скважинам на месторождении.
Типичная зависимость интенсивности отказов от времени:
— ? период приработки и отказов некачественных изделий;
— ?? период нормальной эксплуатации, интенсивность отказов приблизительно постоянна;
— ??? период старения (отказы вызваны износом деталей и/или старением материалов)
ссылка на источник
Данное сходство было замечено мной случайно, однако оно прибавляет к предложенному решению некоторую адекватность и интерпретируемость.
Как было сказано выше решающий плюс автоэкнодера - возможность изучить проблемные параметры.
Действительно в данных есть расхождение между тем, что ожидает увидеть модель и тем, что происходит в реальности. На основе набора этих расхождений (а именно MSE по всем фичам) делается вывод об аномальности данных.
В итоге я завернул все это решение в приложение на streamlit и закинул на облако того же стримлита.
Добавил пару фичей и возможность покрутить порог детектирования, а также дополнительно добавил топ 3 возможных осложнения, которые строились с помощью классификатора на catboost.
Таким образом можно сказать что эта задача с точки зрения ML решена.
Заключение
Для себя по итогу я увидел в этой задаче хороший pet проект, который позволил мне поступить в совместную магистратуру AI Talent Hub и ИТМО, а также получить первый серьезный оффер, выступить на Data Fest и показать там себя, пусть и в онлайн формате.
Оглядываясь назад в самое начало я и представить не мог, что захочу пойти в ML, связать с этим свою жизнь и что это будет действительно интересно и увлекательно.
Станет ли когда нибудь это решение частью системы мониторинга на месторождении или нет по прежнему загадка, однако лично для меня тех преимуществ, которые я получил от него уже достаточно, поскольку останавливаться на этой задаче и бесконечно работать над ней, даже если это выстрелит как стартап, кажется мне не очень интересным выбором, где я теряю возможность погрузиться в другие более сложные темы и проекты, которые будут интересны как мне, так и интегрируются в бизнес, а не останутся висеть на Github и в качестве поста на Хабре.
Комментарии (10)
maxmydoc
08.07.2024 21:07+3Так вышло что я инженер гидравлик.
Как правило отказ насоса предсказывают исходя из статистики и фактическим отклонения которые указывают на износ.
Почему бы просто не спросить у того кто в курсе.
Например по росту тока без роста давления можно понять что движок подыхает.
У вас только на одном кусте до 15 насосов. На одном месторождении больше сотни насосов, вы даже можете отказ насоса предсказать данных.
Bogdan_m01 Автор
08.07.2024 21:07+1Лет 5 назад эту историю с насосами пытались решить в некоторых нефтегазовых компаниях, тогда хайп по машинному обучению не был таким высоким как сейчас, да и разнообразия выбора алгоритмов тоже не было.
В итоге у кого то это решение сейчас в тестовом режиме, большинство от него просто отказались и остались на старом износе, его проблема в том, что вы просто статистику насоса считаете , а хотелось бы посмотреть на датчик и сказать что скоро произойдет поломка, как вы и сказали.
Мечта для недропользователя - это знать количество дней через которое насос сломается (задача регрессии), однако у нас такое не получилось провернуть, поэтому перешли к задаче поиска аномалий
Эта модель как раз таки строит некоторое мат ожидание относительно параметра телеметрии, например того же ток пэд, дебита жидкости, температуры на входе в уэцн и сопротивления изоляции. Ещё есть такой прекрасный параметр как частота самого тока, но в наших данных его было очень мало, поэтому от данного параметра пришлось оказаться, хотя он своего рода killer feature.
Так вот построив мат ожидание мы смотрим на разницу между тем что выдала модель и что происходит в реальности, на основе этой разницы, если разница небольшая, то все окей, если она превышает установленный порог, то скорее всего это аномалия и скорее всего скоро произойдет поломка.
Тех кто в курсе насколько это возможно мы спрашивали, на сам промысел нас, естественно, никто не звал.
В принципе те параметры которые были выбраны исходили как раз таки из экспертного мнения разработчиков и это тоже была отдельная история по тому как подобрать модель чтоб что-то заработало с одной стороны и с другой было адекватным
grigorym
08.07.2024 21:07уже выиграли конкурс и получили небольшую поддержку на реализацию стартапа, которую по умному реализовали в покупку курса по ML
Красавцы ребята!
imageman
с какими параметрами? Лес, надеюсь, строился по одному насосу? (Хотя для группы тоже можно пробовать.) А другие методы поиска аномалий (LOF) пробовали?
Не увидел как вы нормализуете данные? По отдельным фичам делали разведочный анализ (построение гистограммы, к примеру)?
Gridsearch? Этот метод кто-то серьезно использует? Он ужасно расточительный и может применяться либо а) для жадного поиска либо б) когда переменных 2-3. В остальных случаях слишком долго.
Bogdan_m01 Автор
1)Строить лес по одному насосу отдельно на самом деле процесс сомнительный, по крайней мере в рамках нашего датасета. 1 цикл жизни это от 200 до 1000 дней (иногда больше, иногда меньше), временной шаг 1 день, насосов суммарно 9 тысяч, выжимка на которой он изначально строился это около 100 скважин (насосов) в одной группе.
Ясное дело что метрики будут выше и алгоритм заработает, вопрос эффективно ли делать на каждый насос на большом месторождении отдельную модель?
Если у вас 20 насосов, естественно можно навесить изолирующий лес на каждый, или вообще взять авто ML в виде Etna или Prophet для каждого из них и спокойно пить чай.
Собственно поэтому переход к Автоэнкодеру и был произведен.
Наверное лучше 6 часов один раз потратить на train одной модели (автоэнкодера) и фиксировать её эффективность, чем плодить множество моделей и думать как это все объеденять потом.
LOF не пробовал и вряд-ли снова же его результат будет значительно отличаться от его собратьев. Аномалий в данных много и если алгоритм реагирует на любой чих, то это приводит к ложному срабатыванию, если оно произошло, а условный оператор заказал новый насос, потому что поверил, то этот насос просто будет стоять на складе впустую еще какое-то время до действительной поломки, что не очень хорошо, потому что эти насосы берут в аренду, как правило. Тогда оператор просто перестанет верить в алгоритм и он станет просто не нужным.
Также к этому я приводил пример с cusum на единичной скважине, решение выдает ложные срабатывания:
2) Нормализация данных перед обучением Автоэнкодера это Min Max scaler, естественно, а разведочный анализ проводился суммарно сначала на наличие выбросов и пропусков, которых было много, поэтому финальный датасет это уже не 9, а примерно 5,8 тыс. скважин. Потом проводились поиски коррелирующих параметров относительно целевой наработки на отказ, или же самого отказа (F-test, Pearson, Mutual info). Также на единичных скважинах чтобы лучше понять данные и как меняется амплитуда какого-либо параметра перед выбытием
3) Gridsearch в данной задаче это единственный возможный вариант найти оптимальные гиперпараметры, потому что наугад тут не подкрутишь. Естественно набор гиперпараметров был не настолько большим, чтобы проводить его в несколько дней, поэтому как я отметил есть вероятность, что человек со стремлением решить эту задачу через classic ML, запустив gridsearch на много времени получит какой-то адекватный результат.
Задавшись вопросом нужен ли мне такой gridsearch я и перешел к Автоэнкодеру. На удивление обучить нейронку просто быстрее, чем перебирать оптимальные гиперпараметры, а еще эмбеддинги от автоэнкодера можно использовать дальше и перейти от них к более простым решениям, что в принципе тоже должно сработать, возможно тот же LOF тут будет к месту.
imageman
Ага, значит до contamination вы не добрались?
Hidden text
contamination‘auto’ or float, default=’auto’
The amount of contamination of the data set, i.e. the proportion of outliers in the data set. Used when fitting to define the threshold on the scores of the samples.
А (к примеру) LOF имеет детектор новизны (Novelty detection) и позволяет самостоятельно решить что будет новизной/аномалией.
https://habr.com/ru/articles/704432/ Optuna. Подбор гиперпараметров для вашей модели
Помня, что у нас есть выбросы это не самое мудрое решение. Нужно было смотреть в сторону StandardScaler или RobustScaler. А может даже PowerTransformer и дальше по списку (QuantileTransformer с Gaussian output) https://scikit-learn.org/stable/auto_examples/preprocessing/plot_all_scaling.html. Возможно выбросы нужно как-то корректировать. В остальном хорошо.
sunsexsurf
Кажется, что сейчас использовать гридсерч (ну ок, можно рандом серч, если уж так хочется sklearn) - это странная затея про том, что Оптуна - де-факто стандарт для таких оптимизаций. Вам - плюс, автору - сомнения