— Если вы такие умные, то можете сказать, какой вагон когда сойдёт с рельсов?
Задача была сформулирована одним из операторов железной дороги примерно вот в таком духе, но более русским и более железнодорожным языком. Первоначальная логика была в том, чтобы предсказывать, какой вагон по какому пути в какую погоду не надо пускать. Естественно, в реальности мы решили её не так, но вот таких случаев станет в итоге меньше:
Едет вагон. Он может быть в составе пассажирского или грузового поезда. В какой-то момент он одной парой колёс теряет сцепление с рельсом. Это состояние схода. На практике это значит, что останавливается всё движение на участке, выдвигается бригада с краном, чтобы этот вагон поднять. В совсем плохом случае экологическая или техногенная катастрофа. Естественно, это проблема для компании.
Естественно, есть стандарт на регламенты и обслуживание вагонов, есть стандарт на допустимую скорость, есть стандарт на допустимый радиус дуги, уклон и так далее. Но вагоны время от времени сходят. Похоже, это зависит от их состояния, груза, степени трезвости обходчиков, давления машиниста и ещё каких-то факторов, и часть из них можно оценить заранее.
Первое, что мы исследовали, — это известные случаи сходов, чтобы понять, что же влияет на вагоны. И параллельно начали искать все доступные данные, которые мог дать нам перевозчик.
Сход вагона с этанолом с рельсов в США и его последствия.
Задача
После предварительного изучения стало понятно, что мы создаём модель, которая предскажет условия схода вагона на участке пути.
Источники данных
Начали с построения простого дерева решений. Здесь основной момент, который отдаляет от идеальной модели и по сей день, — проблема с данными. Нам интересно состояние вагона, состояние полотна (в динамике, а не в статике), как обслуживался вагон, хорошо бы знать погоду, описание локомотивной бригады, груз, который везёт вагон. На первом этапе были доступны только характеристики вагона.
Чтобы было понятнее, почему получить данные так сложно, скажу, что много ещё делается на бумаге. Например, в момент нашего прихода за выгрузкой базы данных (как нам казалось) мы застали потрясающую картину. Оператор распечатал пачку листов с данными по вагонам за месяц, выложили их на предыдущие так, чтобы предыдущие торчали на одну гранку в сторону… и начали записывать на них разницу. Но это не единственная проблема, ещё есть море согласований и прочие особенности крупных систем с привкусом бюрократии.
У нас были данные по перегонам (их уклоны, последнее известное состояние), но получать оперативную сводку от обходчиков мы не можем. Поэтому все данные по перегонам — это статика по последним известным таблицам + погода.
По бригадам, обходчикам и другому персоналу данных просто нет.
По вагонам данные интереснее, по ним как раз есть очень хороший датасет:
Сразу скажу, что получить даже такой набор данных на реальной задаче в таких условиях — большая удача. Практика сводится к тому, что нужно показать хоть какой-то результат на этих данных, а потом уже компания будет задумываться о подключении к модели каких-то других источников.
Исследование известных сходов
В наших ограниченных наборах данных выстроилась следующая иерархия весовых коэффициентов:
Естественно, это отражает только часть реальной картины, но уже этих данных достаточно для первичной модели.
Эти сходы описывают только те ситуации, которые произошли без влияния внешних факторов, то есть по техническим причинам и из-за человеческого фактора. Это примерно две трети известных нам сходов вагонов. К примеру, речь про излом боковой рамы из-за сочетания усталости металла и неудовлетворительного содержания путей. Или путь был отмечен как чистый, бригада отчиталась про это, но по факту ничего не сделала. Нашёлся даже производитель, который два года подряд выпускал бракованные рамы, судя по статистическому анализу.
Оставшаяся треть случаев схода — это ДТП с выездом автотранспорта на пути, крупный рогатый скот (коровы обладают достаточно большой инерцией), оползни, пожары рядом с путями и другие стихийные бедствия.
Заказчик, естественно, хотел решение в виде «этот сойдёт, надо ремонтировать или не пускать», «а этот не сойдёт». Но модели работают не так, мы оперируем вероятностями. И здесь начались сложности работы с неполными данными. Нам нужно было придумывать что-то, что покажет эффективность даже на них.
Практическая суть задачи
Для каждого вагона и каждого участка пути мы прогнозируем вероятность схода. На практике в условиях недостатка данных это означает очень много ложноположительных срабатываний, и наш клиент, естественно, не бросался рассматривать каждый вагон как потенциально опасный во время обкатки модели. Тем не менее к наиболее высоким вероятностям присматривались и над вагонами уже сознательно думали, бригаду предупреждали.
Обученная на известных сходах модель плохо прогнозировала новые сходы, но зато давала возможность разобраться, как уменьшить вероятность этого схода, то есть, например, по какому перегону пускать данный конкретный поезд с данными конкретными вагонами и с данным конкретным грузом. Вот пример задачи и решения:
Эта же модель позволяет давать на каждый перегон новые рекомендации в зависимости от погоды, сезона и конкретного вагона. То есть можно выбрать другой режим движения, например.
В этой модели сейчас, по сути, оценивается в основном состояние вагона. Его ремонты, паспорт вагона (кто произвёл, когда), тип вагона и дополнительно — описание груза на текущей перевозке. Интуитивно понятно, что дополнительные проверки модель должна была назначать на полные старые вагоны, но это оказалось не так: почти каждый вагон латаный-перелатаный после капитального ремонта. Наибольшее число срабатываний даёт именно сочетание состояния вагона и состояние пути.
После доказательства какой-то полезности модели заказчик начал тщательнее присматриваться к «подсвечиваемым» вагонам и ситуациям. По сути, сейчас они тратят куда больше усилий на ремонты и осмотры, чем раньше, но при этом должны накопить статистику по большей безопасности движения. И если так будет, это будет означать полный успех, потому что даже один статистически предотвращённый случай схода вполне окупает всю эту паранойю.
Что ещё выяснилось по мере решения
Одна из важных магических констант, которую использовали на железной дороге, — это длина состава в 65 вагонов. Грузоперевозчик, естественно, хочет комплектовать больше, а оператор железной дороги говорит: «Нет, 65 — это максимум». Почему? Потому что больше не принято. Прям на уровне «деды советовали» и «есть такая примета». Поскольку модель подходит для факторного анализа, мы погоняли составы с большим числом вагонов и убедились, что константа вполне обоснованная. Больше не надо. Но теперь есть доказательство. То есть уже исходных данных хватило, чтобы начать искать какие-то неизвестные зависимости и подтверждать или опровергать известные заказчикам факты.
А ещё мы узнали, зачем возят лес в цистернах. Поначалу нас это смутило, но оказалось, что есть такой способ оптимизации расходов в мошеннических целях. Сначала всё логично: есть вагон-цистерна. Когда она ломается в интеграционной части, возить жидкость в ней уже сложно. Всё остальное у вагона хорошо, только «наливайка» сломалась. Дальше ей срезают верх и получают полувагон, куда можно грузить лес. Но дело в том, что это меняет провозную плату. В итоге был период, когда возили по документам лес в цистерне, а по факту — ГСМ. Но показывали в отчёте, что это лес. И платили как за лес. В какой-то момент стали возить слишком много, и это стало заметно.
Ну и мы видели повторение байки про скорость света. Подключали один из источников данных и вдруг увидели, как в какой-то момент отвалилась половина пользователей, причём именно тех, кто рассчитывал экономику дополнительных регламентных ремонтов против рисков схода. Выяснилось, что на одной из машин переставили AIX, а группы пользователей были вписаны в конфигурационный файл. Длина строки этого файла была прописана константой в конфиге уже самой AIX. При переустановке она сбросилась в дефолт. Соответственно, файл распарсился до первой длинной строки, дальше его обработка прекратилась. А именно ниже этой строки были наши пользователи.
Что в итоге с проектом?
Теперь мы ждём развития ситуации. Нам нужно больше данных, чтобы продолжить работы. Иногда подключение к источникам в кровавом энтерпрайзе затягивается на годы, но мы тоже кровавый энтерпрайз и умеем ждать.
И да, как говорят тут, дороги у нас железные, а люди золотые. Так что всё с проектом будет хорошо.