Comments 16
Ну на вскидку... химическая кинетика: а мы точно знаем все константы скорости (энергии активации и предэкспоненты)? судя по приведенному сниппету кода ("if stage == 'oxidation':") вы задались кинетикой нулевого порядка. Макрокинетика и тепломассообмен: у вас нольмерная, одномерная, двумерная постановка? О трехмерной постановке в задаче такого уровня можно только мечтать... Теплоотдача на стенки учтена? Диффузия и конвекция, теплопроводность и вязкость? Случайные изменения электропроводности и стохастика как отражены? Хотелось бы подробнее про модель Спрашиваю из личного любопытства, как физик работающий в близкой области)
Да, сниппет в статье намеренно упрощен для читабельности (никто не хочет видеть систему диффуров в середине лонгрида). В реальности там не чистый нулевой порядок. Скорость окисления завязана на доступность кислорода и текущую температуру, но да - это феноменологическая модель, а не фундаментальная кинетика с расчетом всех констант Аррениуса. Цель была - создать физически правдоподобный тренд для обучения ML-моделей, а не рассчитать плавку до микрона. Постановка нульмерная. Для генерации временных рядов этого достаточно. Теплоотдача на стенки учтена через балансовый метод и коэффициент теплопередачи, который «деградирует» по мере износа футеровки. Это как раз одна из ключевых фишек датасета для обучения моделей прогнозирования ресурса. Случайные изменения электропроводности и шумы в токах реализованы через наложение розового шума и введение событийных аномалий (обрывы дуги, обвалы шихты).
Картинки с матом режут глаз
Классный специфический сет, такое встретишь нечасто. Жаль что не видно "кучи грязной логики" и самого кода генерации датасета, а то мог бы добавить горсть своих правил с трех заводов. Получился бы, наверно, хороший симулятор. А кинетику, диффузию итд - все это можно прикрутить потом, причем опционально, в стиле df.col.apply(add_weather_factor)
Чуйка говорит что в датасет к 72-м полям можно добавить еще как минимум с пару десятков, включая вторую химию, погоду, условные ФИО сталеваров, высокоуровневую экономику (курс USD, цеховую себестоимость, цены с LME итд), ну чтобы сблизить позиции ИТР и аналитиков, а также получить оценку "любого чиха" в деньгах.
Я пока причесываю код, чтобы его не стыдно было выложить в опенсорс (там сейчас столько "костылей" и магии, что даже мне иногда страшно). Но идея с df.col.apply(add_weather_factor) - тот путь, по которому я иду: модульность прежде всего.
Про "пару десятков полей" и экономику.
LME и Себестоимость: Это был бы киллер-фича. Если прикрутить стоимость электроэнергии по часовым тарифам и цену электродов, то ML-модель будет оптимизировать не абстрактный КПД, а реальную маржу с тонны. Это сразу переводит диалог из плоскости "инженерной забавы" в плоскость "бизнес-кейса".
ФИО и Человеческий фактор: В текущем сете это скрыто за crew_experience и shift, но добавить конкретные профили "бригад-профи" и "бригад-прогульщиков" - да, хорошая мысль для обучения моделей HR-аналитики на производстве.
А как вы определили насколько сильно crew_experience (опыт бригады) влияет на время плавки (tap_to_tap_time) или насколько эффективнее 1 смена?
Про смены: Я заложил в модель коэффициент циркадных ритмов. В металлургии (как и везде, где есть 12-часовые смены) эффективность 3-й смены (ночной) статистически на 3-7% ниже не из-за того, что люди плохие, а из-за биологии. В модели это реализовано через множитель к arc_stability (стабильность дуги). 1-я смена — это "золотой стандарт" после утренней планерки и кофе.
Про опыт и Tap-to-Tap: Тут я использовал кривую обучения. Опыт в датасете - это не просто стаж, а способность бригады держать процесс в "сладкой зоне". Низкий опыт (<0.4): Бригада чаще допускает перегрев ванны (лишние минуты на охлаждение) или перевдув кислорода. Высокий опыт (>0.8): Они попадают в нужную температуру и химию с первого раза. У них минимальное количество подварок и додувок.
На своём примере, при анализе неисправностей за 6 мес по скада логам, в среднем аварийность/простои возрастали в ночное время начиная с 18:00 ( после ухода начальства) и в выходные дни ( без начальства). Пики: 18:00-22:00, 00:00 - 03:00.
Наглядно интерпретировалось на линейной диаграмме.
Интересные наблюдения
Это тот самый Heavy Digital, который мы заслужили
Как название аниме прям
Трое суток экспериментов и выводы ))) :
Идея прекрасная, это меня и зацепило. Промышленных датасетов да ещё и с разметкой в свободном доступе практически нет. Но я потратил трое суток, пытаясь построить на вашем датасете модель предиктивного обслуживания , и уперся в предел.
Главная проблема аномалии без причинно-следственной структуры. Вы пишете про каузальные цепочки: «сначала растёт вибрация → потом скачок импеданса → ток на одной фазе падает в ноль». Я проверил это на данных, сравнив предаварийную зону (3–12 шагов до аномалии) с нормой по всем ключевым сенсорам.
Результат: Все дельты < 0.11σ. Предаварийная зона статистически неотличима от нормы. Аномалия появляется мгновенно вибрация, давление, ток скачут только в самой точке is_anomaly=1, без предвестников. Это значит, что задача предсказать аварию за 5 минут на этом датасете математически нерешаема сигнала просто нет.
Что пробовал
Классический ML (XGBoost): Корректный Time-Series Split (без заглядывания в будущее), Feature Selection (Recursive Feature Elimination, Feature Importance).
Результат: F1 ≈ 0.65. Модель работает как триггер (детектирует факт свершившейся аварии), но не предсказывает её.
Физическое моделирование (Physics-based):
Рассчитывал реальные физические параметры: Импеданс дуги (Z = U/I), Активное/Реактивное сопротивление, Дисбаланс фаз, Стабильность дуги (Variance).
Вывод: Даже фундаментальные физические показатели не показывают деградации перед событием.
Unsupervised Learning (Поиск аномалий без учителя):
Геометрия: KMeans, Cosine Distance, One-Class SVM. Пытался найти облако нормы и вылеты из него.
Deep Learning: Autoencoders (PyTorch) для поиска ошибки реконструкции.
Вывод: Нормальный режим высокой мощности для моделей выглядит так же хаотично, как и авария. У аномалий нет уникальной сигнатуры, отличной от шума.
Signal Processing (Фильтрация):
Методы сглаживания: Leaky Bucket (Интегратор), Hysteresis Loop (Триггер Шмитта), Rolling Statistics.
Вывод: Помогает убрать шум пост-фактум, но не помогает найти сигнал до события.
Статистические артефакты
~89% аномалий — одиночные точки. Не кластеры, не развивающиеся процессы. Это выглядит как if random() > 0.99: anomaly = 1, а не как реальный отказ оборудования.
Равномерное распределение: ~2% по всем стадиям, сменам, выходным, печам. На реальном заводе Melting опаснее Charging, ночная смена хуже утренней, а изношенная футеровка дает больше аварий. Здесь контекст не влияет на вероятность.
Отсутствие типов: Electrode break и Water leak описаны в статье, но в данных все аномалии выглядят одинаково — нет колонки anomaly_type, нет разных паттернов поведения датчиков.
Чего не хватает, вшить реальную предаварийную динамику (Degradation Curves): За 6–12 шагов до аномалии сенсоры должны начинать отклоняться (плавно, не скачком). Нужен P-F Interval (интервал между потенциальным и функциональным отказом).
Разные сигнатуры аномалий:
Обрыв электрода: Резкий рост импеданса, падение тока, дисбаланс фаз.
Утечка воды: Плавное падение температуры, изменение состава газов (CO/H2), специфический шум.
Корреляция с контекстом: Вероятность аварии должна расти с номером плавки (износ футеровки) или зависеть от агрессивности режима работы.
«Почти-аварии» (Near-misses): Ситуации, которые выглядят опасно, но не привели к is_anomaly=1. Именно на таких пограничных случаях модель учится различать шум и сигнал.
Итог: Датасет в текущем виде хорош для обучения Pandas и визуализации (Dashboarding), но ему не хватает каузальной структуры (Causality). Без неё любая ML-модель упирается в потолок детекции событий, которые уже произошли.
Лучший результат (каскадная модель с Hard Negative Mining): Из каждых 100 тревог модели — 95 реальных аварий и 5 ложных (Precision 95%). Модель ловит примерно 2 из 3 аварий — 36 из 100 реальных событий проходят мимо (Recall 64%). F1-score ≈ 0.77.
В абсолютных числах на тестовой выборке (~11 300 точек, ~254 аномалии): модель правильно поймала 162 аварии, пропустила 92, и подняла всего 8 ложных тревог.
Попытки сдвинуть баланс упираются в стену: снижаешь порог, чтобы ловить больше аварий лавинообразно растут ложные тревоги. Повышаешь порог ради точности, пропускаешь ещё больше реальных событий. Оптимальной точки нет, потому что распределения нормы и аномалии в предаварийной зоне перекрываются полностью, модель различает их только в момент самого события, когда предсказывать уже поздно.
Буду рад, если этот разбор поможет в развитии проекта! Если я не прав, то буду очень рад услышать возражения. И да, я использовал микросети, но большая модель точно также столкнется с отсутствием казуальности.
)) Пошёл в экзотику:
🌀 ЗАПУСК АНАЛИЗА КОГЕРЕНТНОСТИ РОЯ (KURAMOTO)...
Анализируем связь между: ['electrode_current_1_ka', 'electrode_current_2_ka', 'electrode_current_3_ka', 'arc_voltage_v']
Вычисляем преобразование Гильберта...
📊 СТАТИСТИКА КОГЕРЕНТНОСТИ (ПОРЯДКА):
Норма (Mean ± Std): 0.9377 ± 0.0182
Предавария (Mean ± Std): 0.9378 ± 0.0190
Аномалия (Mean ± Std): 0.9363 ± 0.0191
Δ (Norm - Pre): -0.0001
💀 ВЕРДИКТ: РОЙ МЕРТВ.
Фазовая связь не меняется перед аварией.
Датасет = Набор независимых шумов с вклейками.
📈 График сохранен: reports/swarm_coherence.png
(venv) C:\Users\admin\Desktop\PGHM\EAF_Project>
И всё таки решил добить. Курамото на 64 агентах (8 показателей) показал, что датчики когерентны вплоть до момента аварии (и в момент аварии). То есть в датасет программно врезана авария, но она причинно не обусловлена предыдущими показаниями. Нейросеть, к сожалению, в таких условиях нормально работать не сможет.
Предположительно:
Генератор делает примерно следующее (реконструкция по данным):
if is_anomaly:
vibration = 1.5 # +50%
pressure += 5 # сдвиг к нулю
current = 0.8 # -20%
harmonics *= 1.25 # +25%
XGBoost прекрасно ловит эту комбинацию, высокая вибрация, низкий ток и давление аномальное - аномалия. То есть это распознавание подкрученных значений. Модель учит рецепт генератора.
Но эти же значения встречаются и в норме высокая вибрация бывает при melting, низкий ток при charging, высокое давление при oxidation. Пересечение распределений создаёт зону неразличимости (36% аномалий попадают в неё). Нейросеть этого не понимает, поскольку в отклонениях нет физической реальности (инвариантов) которую можно было бы выделить
Прекрасная работа, в точку и в тему! Проблема с подобными датасетами имеет место быть, а создать датасет таким образом не у всех хватает решимости!
Обсуждаем вашу работу в чате https://t.me/agitopics/27471/69815 и приглашаем выступить с вашей работой, в ее развитии, у наc на семинаре https://agirussia.org/ !
Я устал выпрашивать логи у завода, поэтому написал свой симулятор сталеплавильной печи