Телеметрия с битыми датчиками

Industrial telemetry data quality

Кейс про слой, которого не видно в учебниках: между сырым потоком с оборудования и обучающей выборкой стоит валидация, и именно она определяет, будет модель работать или нет.

Middle 5 шагов разбора · 3 развилки · 5 поломок из прода

Вводная

Завод: 3 000 датчиков на насосном оборудовании отдают показания раз в секунду — давление, температура, вибрация, ток.

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

Первый прототип показал AUC 0.94 на исторических данных и не поймал ни одного реального отказа.

Требования и ограничения
ЧтоЗначениеОткуда
Поток3 000 точек/сОколо 260 млн записей в сутки.
Горизонтпредупреждение за 24 часаМеньше — ремонт не успевают спланировать.
Цена ошибкипропуск ×50Останов по ложной тревоге — часы; отказ насоса — сутки простоя.
История3 года архиваВ нём же — периоды обслуживания и замены датчиков.
Отказыоколо 40 случаев за 3 годаКрайне несбалансированная выборка.
Задержкарешение раз в 5 минутРеального времени не требуется — это батч.

Прежде чем читать разбор, попробуйте спроектировать систему сами — по этим требованиям. Дальше будет видно, что вы учли, а что нет.

Разбор по шагам

Почему прототип с AUC 0.94 не поймал ни одного отказа

Разбор начинается не с модели, а с того, что попало в выборку.

  • Утечка через обслуживание: перед каждым отказом оборудование останавливали, и датчики выдавали характерные нули. Модель выучила «нули → отказ» — сигнал, которого в предсказания ещё нет.
  • Пропуски заполнены средним: у датчика давления среднее по всем режимам — физически невозможное значение, которого не бывает ни при одном режиме работы.
  • Залипшие датчики отдавали одну и ту же константу неделями; для модели это стабильный нормальный режим.
  • Разные единицы: часть датчиков после замены отдавала бары вместо килопаскалей — те же числа, другой физический смысл.
На практике

Все четыре причины — не про модель. Ни одна не лечится сменой архитектуры, и все четыре видны в данных, если их проверять.

Контракт на источник: физика как проверка

У промышленных данных есть то, чего нет у веб-логов, — физические границы.

ПроверкаПример правилаЧто делать при нарушении
Физический диапазонДавление ∈ [0, 25] барОтбросить точку, поднять счётчик
Скорость измененияТемпература меняется не быстрее 5 °C/минПометить как , не удалять
Единицы измеренияДатчик объявляет единицы в схемеОстановить приём с источника
ЧастотаНе более 2 с между точкамиПометить как неполное
ЗалипаниеКонстанта дольше 10 минут при работающем насосеПометить датчик неисправным

Проверки ставятся на границе приёма, а не перед обучением: чем позже поймана поломка, тем больше витрин и моделей успело её впитать. Инструменты вроде Great Expectations, Soda или dbt tests описывают такие правила декларативно.

На практике

Правило приёмки: должен падать при нарушении контракта, а не тихо писать мусор дальше. Молчаливое «пропустим и почистим потом» и приводит к моделям с 0.94, которые ничего не ловят.

Типы дефектов и что с каждым делать

«Пропуск» — это пять разных ситуаций, и лечатся они по-разному.

ДефектКак выглядитОбработка
Короткий пропуск (< 5 с)Потеря пакетаЛинейная интерполяция плюс флаг
Длинный пропуск (минуты)Обрыв связиНе восстанавливать: исключается из выборки
Залипание (stuck-at)Идеально постоянное значениеПомечать датчик неисправным, не использовать
Одиночный Скачок на порядок и возвратМедианный фильтр по короткому окну
Медленный уход среднего распределения по датчику, перекалибровка
ОбслуживаниеНули или шум при остановкеРазметить и исключить: это не рабочий режим

Ключевой приём — маска пропуска как отдельный признак. Сам факт «датчик молчал 40 минут» несёт информацию об оборудовании, и её нельзя терять при восстановлении значений.

На практике

Заполнение средним допустимо для табличных данных, но не для физического процесса: среднее давление по всем режимам не соответствует ни одному реальному режиму работы. Для временных рядов честнее интерполяция на коротких промежутках и исключение — на длинных.

Признаки: только то, что известно в момент предсказания

Каждый признак проверяется вопросом «а он существовал за 24 часа до отказа?».

  • Окна назад: агрегаты за 1, 6, 24 часа — медиана, квантили, размах. Медиана и квантили устойчивы к остаточным выбросам, среднее — нет.
  • Только прошлое: интерполяция сплайном или скользящее среднее с центрированием смотрят в будущее. На обучении это даёт прекрасные метрики, в проде — ничего.
  • Доля валидных точек в окне как качества измерения.
  • Отношения между датчиками: ток при данном давлении — физически осмысленная связь, которая ломается раньше, чем любой отдельный показатель.

Валидация — только по времени: обучение на прошлом, проверка на будущем, разрыв между ними не меньше горизонта предсказания. Случайное разбиение здесь даёт утечку автоматически, потому что соседние секунды почти идентичны.

В проде: те же проверки плюс наблюдение за датчиками

Данные ломаются постоянно, и это нормальный режим работы, а не инцидент.

  • Те же правила контракта применяются к потоку в проде — иначе модель получит на вход то, чего не видела при обучении.
  • Мониторинг по датчикам, а не только по модели: доля валидных точек, доля залипаний, распределение значений. Замена датчика видна как резкий сдвиг распределения.
  • Дрейф: сравнение распределений с обучающим окном; сработавший тест — повод для расследования, а не автоматического .
  • Идемпотентность: ретраи и дозагрузки не должны порождать дубликаты — иначе агрегаты в окнах поедут.
На практике

Отдельный дашборд «здоровье источника» окупается быстрее модели: большинство инцидентов оказываются поломкой датчика или обновлением прошивки, а не деградацией алгоритма.

Развилки и выбор

На собеседовании ценится не сам выбор, а объяснение, почему отклонены остальные варианты.

Чинить битые значения или выбрасывать окна?

Чинить только короткие пропуски, длинные — выбрасывать

Три года истории дают достаточно данных, чтобы позволить себе выбрасывать сомнительные окна. Восстановленные значения на длинных промежутках — это выдумка, на которой модель учится уверенности там, где данных не было.

Что отклонено и почему
  • Заполнять всё интерполяциейМодель получает гладкие правдоподобные ряды и учится на них как на измерениях.
  • Выбрасывать любое окно с дефектомПри 3 000 датчиков хотя бы один почти всегда неисправен — выборка схлопнется.

Где ставить проверки качества?

На границе приёма, до записи в хранилище

Пойманная на входе поломка стоит одного алерта; она же, найденная через месяц в витрине, стоит переобучения всех моделей, которые её впитали.

Что отклонено и почему
  • Перед обучениемК этому моменту мусор уже разошёлся по витринам и дашбордам.
  • В коде моделиПроверки дублируются в каждом проекте и расходятся между собой.

Как валидировать модель при 40 отказах за 3 года?

Разбиение по времени плюс оценка по стоимости, а не по AUC

При такой редкости события AUC почти не отличает хорошую модель от бесполезной. Считается ожидаемая экономия: пойманные отказы против стоимости ложных остановов.

Что отклонено и почему
  • Случайная кросс-валидацияСоседние секунды почти идентичны — утечка гарантирована, метрика бессмысленна.
  • Оценка по accuracyПредсказание «отказа не будет» даёт точность около 99.99 % и нулевую пользу.

Что ломается в проде

Утечка через режим обслуживания

Состояния оборудования, сопровождающие остановку, коррелируют с отказом идеально — и недоступны за 24 часа до него. Периоды обслуживания нужно размечать явно и исключать.

Замена датчика меняет распределение

Новый датчик может отдавать другие единицы, другую точность или другое смещение. Без журнала замен это выглядит как дрейф процесса и приводит к переобучению на артефакте.

Дубликаты после ретраев

Повторная загрузка без ключа идемпотентности удваивает точки в окне: агрегаты уезжают, а в логе всё выглядит успешно.

Время не там, где кажется

Локальное время, переход на летнее время и часы датчика, ушедшие на минуты, ломают выравнивание рядов между источниками. Хранить и считать надо в UTC, а расхождение часов — мониторить.

Метрика считается на очищенных данных

Если валидационная выборка прошла ту же ручную чистку, что и обучающая, метрика описывает лабораторию, а не прод. В валидации должны остаться те дефекты, которые будут в реальном потоке.

По чему видно, что система здорова

МетрикаЗначениеЗачем
Доля валидных точекпо каждому датчикуОсновной индикатор здоровья источника.
Нарушения контрактачисло за сутки по правиламРост — поломка источника, а не модели.
Пойманные отказыrecall при фиксированной частоте тревогСчитается на разбиении по времени.
Стоимость ошибокэкономия от ремонта минус потери от ложных останововМетрика, по которой принимается решение о внедрении.
Дрейф признаковPSI или KS относительно обучающего окнаСигнал к расследованию.

Что спрашивают по этому кейсу

  1. Модель показала AUC 0.94 и не поймала ни одного отказа. Ваши гипотезы по порядку проверки.
  2. Датчик отдаёт одно и то же значение три дня. Как это поймать автоматически и что дальше?
  3. Чем заполнять пропуски в показаниях давления и почему не средним?
  4. Как построить валидацию при 40 положительных примерах за три года?
  5. Где в этом пайплайне поставить проверки качества и почему именно там?

Проверить себя: тест «Классический ML», тест «Временные ряды», тест «Речь: ASR и TTS». Открытые задачи там же — под тестом.

Темы атласа, из которых собран кейс

Data Quality

Качество данныхиз «Инженерия данных»

Автоматические проверки и инструменты для них.

Data Contracts

Контракты данныхиз «Инженерия данных»

Контракт с источником: схема, единицы, SLA.

Idempotency & Exactly-once

Идемпотентность и гарантии доставкииз «Инженерия данных»

Почему ретраи порождают дубликаты и как это лечить.

Missing values

Пропущенные значенияиз «Данные»

Механизмы пропусков и допустимые способы восстановления.

Outliers

Выбросыиз «Данные»

Выбросы: обнаружение и устойчивые агрегаты.

Anomaly detection

Поиск аномалий во временииз «Временные ряды»

Аномалии в рядах: что считать поломкой процесса.

Data leakage

Утечка данныхиз «Практика ML»

Утечка через будущее и через режим обслуживания.

Drift Detection

Детекция дрейфаиз «MLOps»

Мониторинг распределений после замены датчиков.

Cross-validation

Кросс-валидацияиз «Оценка моделей»

Почему здесь работает только разбиение по времени.