Розробка AI-системи прогнозування відмов обладнання

Проектуємо та впроваджуємо системи штучного інтелекту: від прототипу до production-ready рішення. Наша команда поєднує експертизу в машинному навчанні, дата-інжинірингу та MLOps, щоб AI працював не в лабораторії, а в реальному бізнесі.
Показано 1 з 1Усі 1564 послуг
Розробка AI-системи прогнозування відмов обладнання
Складний
~2-4 тижні
Часті запитання

Напрямки AI-розробки

Етапи розробки AI-рішення

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1348
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1247
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    949
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1183
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    642
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    921

Неочікувана відмова компресора о третій ночі — позаплановий простій, втрати мільйонів, зрив поставок. Традиційний пороговий моніторинг фіксує відхилення вже після виходу за межі, коли ремонт неминучий. Система прогнозування відмов (Failure Prediction) будує часову модель деградації та попереджає за 7–30 днів, вловлюючи приховані патерни в часових рядах сенсорів та обчислюючи залишковий ресурс (RUL).

Ми розробляємо такі системи під ключ: від збору та розмітки даних до інтеграції з CMMS та автоматичного призначення ТО. В основі — деградаційні моделі, оцінка RUL та машинне навчання з калібруванням ймовірностей, щоб алерти були точними, а не шумом.

Які проблеми вирішуємо

Дисбаланс класів. Типове співвідношення: 1 відмова на 50–200 днів нормальної роботи. Без спеціальних методів модель передбачатиме «все добре», ігноруючи рідкісні події. Ми використовуємо зважені функції втрат (scale_pos_weight у XGBoost), синтетичну аугментацію (SMOTE-Tomek) та cost-sensitive learning з матрицею, де пропуск відмови в 20 разів дорожчий за хибну тривогу.

Вибір горизонту прогнозу. Занадто короткий горизонт (1–3 дні) не дає часу на реакцію; занадто довгий (60+ днів) — висока невизначеність. Ми підбираємо горизонт за ROC-аналізом на історичних даних: зазвичай 7–30 днів — оптимум для промислового обладнання.

Калібрування ймовірностей. XGBoost та нейромережі часто видають некалібровані ймовірності. Модель може говорити «ймовірність відмови 70%», а на практиці відмова трапляється лише в 30% таких випадків. Ми застосовуємо Isotonic Regression (Platt Scaling рідше) на відкладеній вибірці — це знижує false alarm rate на 30–50%.

Як ми будуємо систему Failure Prediction

Деградаційна модель та RUL Estimator

Моделюємо процес погіршення стану через регресію на days_to_failure або аналіз виживаності. Ключовий прийом — навчати модель лише на вікні 90 днів до відмови, виключаючи тривалі періоди нормальної роботи.

import pandas as pd
import numpy as np
from sklearn.model_selection import TimeSeriesSplit
from xgboost import XGBRegressor

def train_rul_model(features_df, target_col='days_to_failure'):
    train_data = features_df[features_df[target_col] <= 90].dropna(subset=[target_col])
    X = train_data.drop(columns=[target_col, 'label', 'timestamp', 'asset_id'])
    y = np.log1p(train_data[target_col])
    tscv = TimeSeriesSplit(n_splits=5)
    model = XGBRegressor(n_estimators=300, learning_rate=0.05, max_depth=6, subsample=0.8)
    model.fit(X, y)
    return model

Для врахування цензурованих даних (актив ще працює) використовуємо Weibull AFT з бібліотеки lifelines — він коректно обробляє такі випадки та дає інтервальні прогнози.

Багатозадачна LSTM з attention

Зазначимо: коли накопичено достатньо історії (10+ циклів на актив), переходимо до LSTM. Одна модель одночасно передбачає RUL, ймовірність відмови на горизонтах 7/14/30 днів та стадію деградації (норма, початок, прогресуюча, критична). Для LSTM прогнозування відмов використовуємо архітектуру з механізмом уваги.

import torch.nn as nn

class FailurePredictionLSTM(nn.Module):
    def __init__(self, input_dim, hidden_dim=128, num_layers=2):
        super().__init__()
        self.lstm = nn.LSTM(input_dim, hidden_dim, num_layers,
                             batch_first=True, dropout=0.2)
        self.attention = nn.MultiheadAttention(hidden_dim, num_heads=4, batch_first=True)
        self.rul_head = nn.Sequential(nn.Linear(hidden_dim, 64), nn.ReLU(), nn.Linear(64, 1))
        self.failure_head = nn.Sequential(nn.Linear(hidden_dim, 64), nn.ReLU(), nn.Linear(64, 3), nn.Sigmoid())
        self.stage_head = nn.Linear(hidden_dim, 4)

    def forward(self, x):
        lstm_out, _ = self.lstm(x)
        attn_out, _ = self.attention(lstm_out, lstm_out, lstm_out)
        pooled = attn_out.mean(dim=1)
        return {'rul': self.rul_head(pooled),
                'failure_prob': self.failure_head(pooled),
                'stage': self.stage_head(pooled)}

XGBoost vs LSTM: на практиці XGBoost з часовими вікнами дає Precision@7 = 0.75–0.85, LSTM — 0.80–0.90, але потребує в 3–5 разів більше даних. XGBoost швидше в 5–7 разів у навчанні, що робить його кращим для старту. LSTM впроваджуємо на другому етапі, коли накопичено достатній обсяг історії.

Чому калібрування ймовірностей критичне?

Нескориговані ймовірності ведуть до лавини хибних спрацьовувань або пропущених відмов. Нижче — підсумкове калібрування через Isotonic Regression:

from sklearn.isotonic import IsotonicRegression

def calibrate_probabilities(raw_probs, true_labels):
    calibrator = IsotonicRegression(out_of_bounds='clip')
    calibrator.fit(raw_probs, true_labels)
    return calibrator

У реальному проекті для компресорної станції калібрування знизило false alarm rate з 12 до 4 подій на актив на місяць, а coverage (частка передбачених відмов) зросла з 60% до 87%. Це принесло замовнику значну економію за рахунок скорочення позапланових простоїв. В середньому за нашими проектами економія є значною на один критичний актив.

Як обрати поріг прийняття рішень?

Враховуємо вартість помилок: пропуск відмови — 100 умовних одиниць, зайва перевірка — 5. Поріг зміщується вниз, роблячи модель більш чутливою. Оптимальний поріг знаходимо на валідації за мінімальною сумарною вартістю.

def find_optimal_threshold(probs, labels, cost_fn=100, cost_fp=5):
    thresholds = np.arange(0.05, 0.95, 0.01)
    best = 0.5
    min_cost = float('inf')
    for t in thresholds:
        preds = (probs >= t).astype(int)
        total = np.sum((preds == 0) & (labels == 1)) * cost_fn + np.sum((preds == 1) & (labels == 0)) * cost_fp
        if total < min_cost:
            min_cost = total
            best = t
    return best

Процес впровадження

  1. Аналіз даних: розмічаємо відмови, будуємо часові вікна — датасет з мітками та ознаками.
  2. Baseline: XGBoost Failure Classifier + базовий RUL — точність 70–80%.
  3. Покращення: LSTM, калібрування, оптимізація порогів — точність 85–95%.
  4. Інтеграція: Webhook у CMMS, дашборд алертів — автоматичний розклад ТО.
  5. Моніторинг: Drift detection, перенавчання — система працює стабільно.
Етап Що робимо Результат
1. Аналіз даних Розмічаємо історію відмов, будуємо часові вікна Датасет з мітками та ознаками
2. Baseline XGBoost Failure Classifier + базовий RUL Точність 70–80%
3. Покращення LSTM, калібрування, оптимізація порогів Точність 85–95%
4. Інтеграція Webhook у CMMS, дашборд алертів Автоматичний розклад ТО
5. Моніторинг Drift detection, перенавчання Система працює стабільно

Порівняння методів прогнозування

Параметр XGBoost LSTM Survival Analysis
Точність (Precision@7) 0.75–0.85 0.80–0.90 0.65–0.75
Вимоги до даних 3–6 циклів 10+ циклів 20+ циклів
Швидкість навчання 5–15 хв 1–4 год 10–30 хв
Стійкість до шуму Середня Висока Низька
Типові помилки при впровадженні
  • Використовувати всю історію 1:1 — погіршує якість. Потрібно обмежувати вікно до відмови.
  • Не враховувати цензурування — Survival Analysis замість регресії.
  • Ставити єдиний поріг для всього парку — налаштовуємо під критичність кожного активу.
  • Забувати про калібрування — веде до недовіри операторів.

Строки та що ви отримаєте

  • Failure Classifier + базовий RUL + алерти — 4–5 тижнів.
  • LSTM, аналіз виживаності, повна інтеграція з розкладом ТО — 3–4 місяці.

Зазначимо: що входить: навчена модель, API для інтеграції, веб-дашборд з алертами та метриками, документація, навчання команди, підтримка 3 місяці після запуску.

Наш досвід: 5+ років у промисловому ML, 20+ проектів з predictive maintenance, інженери з сертифікатами з MLflow та Kubernetes. Ми гарантуємо якість — кожен етап закривається чек-листом.

Зв'яжіться з нами для попереднього аналізу ваших даних — підберемо архітектуру та оцінимо потенційну економію (до 30% витрат на ремонт). Замовте консультацію, щоб дізнатися, як наш підхід працює на вашому обладнанні.

Виявлення аномалій: автоенкодери, Isolation Forest, PyOD

Ми стикаємося з цим болем постійно: моніторинг сервера показує CPU 85%, пам'ять 91% — це норма в годину пік чи початок атаки? Класифікатор тут не допоможе: аномалії за визначенням рідкісні, різноманітні та заздалегідь не розмічені. Supervised learning потребує прикладів аномалій у навчальній вибірці — а значить, не працює для того, про що ви ще не знаєте. Наш досвід показує: без unsupervised-підходу виявлення перетворюється на гадання.

Чому виявлення аномалій потребує unsupervised підходу?

Головна проблема — відсутність розмітки та дисбаланс класів в екстремальній формі. Фрод-транзакції становлять 0.01–0.1% від загального об'єму. Виробничий дефект — 0.5–3%. При такому співвідношенні навіть наївний класифікатор «все нормально» дасть accuracy 99.9% і precision/recall для аномального класу, близькі до нуля. Supervised-моделі тут безсилі.

Друга проблема — «нормальність» завжди контекстна. Чи нормально, що користувач логіниться о 3 годині ночі? Залежить від його історії та часової зони. Чи нормальна вібрація підшипника 2.3 мм/с? Залежить від режиму роботи верстата та його віку. Тому ми вбудовуємо контекст у модель через feature engineering та часові вікна.

Третя — оцінка якості. Немає стандартного test set, AUC-ROC вважається тільки якщо є хоча б трохи розмічених прикладів. На повністю нерозмічених даних — тільки domain expert validation та непрямі метрики.

Як відрізнити аномалію від шуму в реальному часі?

Відповідь — адаптивні пороги та моніторинг статистик моделі. У розділі кейсу покажемо, як це працює.

Методи та інструменти

Метод Тип даних Швидкість навчання Типове застосування
Isolation Forest Табличні, категоріальні Висока Baseline для перших гіпотез
Autoencoder Зображення, часові ряди, логи Середня Неструктуровані дані
LSTM-AE Багатовимірні часові ряди Низька Промислова телеметрія
PyOD (ансамбль) Табличні Висока Швидке порівняння 40+ методів

Isolation Forest — стандартний baseline для табличних даних. Ідея: аномалії ізолюються швидше при випадковому розбитті простору ознак. Працює добре при contamination 0.01–0.1, стійкий до масштабу ознак, не потребує нормалізації. Реалізація в sklearn.ensemble.IsolationForest.

Типова помилка: ставити contamination='auto' без розуміння даних. Auto-режим передбачає поріг -0.5, що не завжди відповідає реальній частці аномалій. Краще: оцініть очікуваний відсоток аномалій через domain knowledge і задайте явно. Ми гарантуємо підбір contamination під ваш кейс.

PyOD (Python Outlier Detection) — бібліотека з 40+ алгоритмами під єдиним API. Включає: OCSVM, LOF, COPOD, ECOD, DeepSVDD, AutoEncoder. Зручно для швидкого порівняння методів на одних даних.

Автоенкодери — основний метод для неструктурованих даних (часові ряди, зображення, логи). Ідея: навчаємо мережу відновлювати нормальні дані, аномалії дають високу помилку реконструкції. Поріг аномальності — 95-й або 99-й процентиль помилки на validation set з нормальних даних.

Практична проблема автоенкодерів: переучування на «нормальних» паттернах, які все одно зустрічаються рідко. Якщо в train set є хоча б кілька аномалій, модель може навчитися їх добре відновлювати. Рішення: ретельне очищення training data або використання Variational Autoencoder (VAE), який краще узагальнює.

LSTMAE для часових рядів — LSTM-автоенкодер захоплює часові залежності краще, ніж звичайний AE. Особливо ефективний для мультиваріантних часових рядів (10+ сенсорів одночасно). Реалізація через PyTorch, навчання з MSELoss на ковзних вікнах.

Детально: виявлення аномалій у промислових часових рядах

Задача: вібраційні датчики на 12 насосах хімічного підприємства, 6 сенсорів на насос, частота 100 Гц. Потрібно попередити про наближену поломку за 4–24 години.

Архітектура рішення:

Сирові дані → feature extraction (RMS, куртозис, піковий фактор, FFT-амплітуди на резонансних частотах) → нормалізація по ковзному вікну 24 год → LSTMAE → reconstruction error → порогова логіка + алертинг.

Розмір вікна LSTM: 60 секунд (6000 точок на 100 Гц). Занадто мале вікно — не захоплює повільні паттерни. Занадто велике — втрачає чутливість до швидких змін.

Поріг аномальності: не фіксований, а адаптивний. threshold = mean(errors_last_7d) + 3 * std(errors_last_7d). При дрейфі нормального стану (плановий знос) поріг адаптується, уникаючи false positives.

Результат на 6-місячному пілоті: виявлено 4 з 5 реальних передвідмовних станів (recall 0.8), 2 хибні тривоги за 6 місяців (precision 0.67). До впровадження: 3 незаплановані зупинки зі значними збитками. Економія після впровадження — значна сума за півроку (звіт про пілот на об'єкті клієнта).

Фрод-детекція: специфіка фінансових даних

Фінансові транзакції мають кілька особливостей, що ускладнюють виявлення:

  • Concept drift: паттерни фроду змінюються швидше нормальної поведінки. Модель, навчена півроку тому, застаріває.
  • Adversarial adaptation: просунуті шахраї адаптуються до виявлення — роблять транзакції схожими на нормальні.
  • Часова залежність: серія нормальних транзакцій, а потім один незвичайний переказ — це аномалія послідовності, а не одиничної точки.

Практичний стек для фрод-детекції: LightGBM з SMOTE-oversampling для supervised частини (за відомими фрод-кейсами) + Isolation Forest для unsupervised (нові паттерни). Обидва сигнали об'єднуються в ансамбль, фінальне рішення — через пороги, налаштовані на прийнятний FPR (0.1–1% від транзакцій на ручну перевірку).

Як оцінити якість без розмітки?

Коли ground truth немає, для оцінки використовуємо:

  • Synthetic anomaly injection: додаємо штучні аномалії (spike, level shift, point outlier) і дивимося, чи виявляє їх модель
  • Expert validation: випадкова вибірка топ-K аномалій від моделі → review експерта → precision
  • Business metric: чи знизилася кількість пропущених інцидентів / хибних тривог після впровадження
Технічна деталь: налаштування адаптивного порогу

Поріг обчислюється як mean(errors) + k * std(errors) на ковзному вікні 7 днів. Коефіцієнт k підбирається на validation set з синтетичними аномаліями для досягнення FPR < 0.1%. При дрейфі ознак вікно автоматично зсувається.

Процес роботи

  1. Інтерв'ю з доменними експертами — розуміємо, що таке «нормальність» і які інциденти вже були.
  2. EDA та підготовка даних — очищення, створення ознак, часові вікна.
  3. Baseline (Isolation Forest) — швидка валідація на відомих інцидентах.
  4. Вибір та кастомізація моделі — Autoencoder / LSTM-AE / ансамбль.
  5. Навчання, валідація з синтетичними аномаліями.
  6. Розгортання в production — пайплайн на Kafka + Flink / Airflow, алертинг в Telegram/Slack, моніторинг дрифту.
  7. Post-deployment супровід — моніторинг метрик моделі, оновлення порогів.

Що входить у роботу

  • Аудит поточних даних та процесів
  • Розробка та навчання моделей (Isolation Forest / Autoencoder / LSTM-AE / ансамбль)
  • Налаштування адаптивних порогів та алертингу
  • Панель моніторингу аномалій (Grafana / Streamlit)
  • Документація model card та pipeline
  • Навчання вашої команди (2–3 сесії)
  • Гарантійна підтримка 3 місяці

Терміни: baseline-система з одним методом — 2–4 тижні. Production-система з адаптивними порогами, алертингом та моніторингом — 2–5 місяців. Вартість розраховується індивідуально під ваш кейс.

Наша команда має 8+ років досвіду в промисловій аналітиці та 15+ успішних проектів з виявлення аномалій в телеметрії, фінансах та IT-моніторингу. Отримайте консультацію — розкажемо, як вирішити вашу задачу.