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

Главная инженерная проблема — размер данных. После очистки на каждую модель приходится от 250 до 400 записей о глушениях. На такой выборке стандартный подход «один train_test_split → fit → predict» ненадёжен: метрики скачут в зависимости от того, как именно случайно разделились данные. Чтобы побороть эту нестабильность, авторы построили многоступенчатый конвейер. Сначала запускают RandomizedSearchCV на 50 разных разбиениях и агрегируют результаты частотным методом — берут моду по каждому гиперпараметру. Логика проста: если в 48 из 50 запусков оптимальным оказывается learning_rate=0.05, а в двух — 0.5, значит, последние два переобучились под шум. Jaccard similarity между составами топ-20 лучших разбиений достигает 0.9 именно при 50 экспериментах — авторы проверяли это эмпирически.

МетрикаПлюсыМинусы
Оценивает объяснённую дисперсиюНечувствителен к систематическому сдвигу прогноза
MAEНапрямую показывает ошибку в кубометрахНе отражает структуру разброса ошибок
Композитный скор (0.4×R² + 0.6×MAE)Балансирует оба аспекта качестваВеса подобраны эмпирически, не универсальны

Отдельная задача — выбор таргета. Предсказывать абсолютный объём жидкости оказалось нестабильно: разброс между скважинами слишком велик. Вместо этого модель предсказывает дельту — изменение объёма относительно предыдущего глушения той же скважины. Исторически технологи сами опирались именно на предыдущий опыт с поправкой на текущее состояние пласта, так что такое преобразование отражает реальную логику принятия решений. Дополнительный бонус — распределение таргета становится ближе к нормальному. Для первичных глушений, где истории нет, модель переключается в режим предсказания абсолютного объёма.

Вместо одного train_test_split запускают 50 разбиений, отбирают топ-20 по композитной метрике R² + MAE.

Асимметрия стоимости ошибок потребовала нестандартной функции потерь. Перелить жидкость — потратить лишние деньги на состав. Недолить — риск незаглушённой скважины. Авторы внедрили K-method: асимметричный лосс, где штраф за недолив выше, чем за перелив. Это заставляет модель смещать прогнозы в сторону «лучше больше, чем меньше». Реализация выполнена как кастомная функция потерь для XGBoost и CatBoost — оба фреймворка поддерживают передачу пользовательского градиента и гессиана.

Между двумя библиотеками есть практическая разница. CatBoost принимает категориальные признаки напрямую, без предварительного кодирования — удобно, когда в данных есть строковые поля типа типа месторождения или конструкции скважины. XGBoost потребовал ручного кодирования категорий, но итоговые метрики оказались сопоставимы. Для оценки качества используется композитная метрика: 0.4 × R² + 0.6 × нормированный MAE. Вес MAE выше, потому что ошибка в кубометрах напрямую конвертируется в деньги.

Инфраструктурно весь пайплайн — от подбора параметров до финального отбора моделей — оркестрирован через Airflow, что обеспечивает воспроизводимость запусков. Эксперименты и метрики логируются в MLflow. Инференс реализован как лёгкий Flask-сервис: на вход приходят параметры скважины и предыдущего глушения, на выходе — рекомендованный объём. Такая двухконтурная архитектура — тяжёлое офлайн-обучение и лёгкий онлайн-инференс — типична для промышленных ML-систем, где переобучение модели происходит по расписанию, а не в реальном времени.

Авторы подчёркивают: все описанные паттерны — кастомные функции потерь для градиентного бустинга, частотное агрегирование гиперпараметров, отбор по Jaccard similarity — применимы к любой регрессионной задаче с асимметричной стоимостью ошибок. Нефтяная специфика скрыта за NDA, но инженерные решения переиспользуемы.