Ошибка классификации руды — отправить богатую руду в отвал или пустую породу на фабрику — стоит миллионы долларов ежегодно. Мы сталкивались с этим на золоторудном месторождении в Казахстане: ординарный кригинг давал misclassification 35%. После внедрения ML-модели на XGBoost с пространственными признаками misclassification упал до 13%, что сэкономило предприятию ~$4 млн в год. Проблема кригинга: он требует стационарности и не учитывает литологию, геофизику, геохимию. ML (градиентный бустинг, случайный лес, 3D сверточные сети) строит нелинейные зависимости и использует все доступные данные.
Почему ML точнее кригинга?
Кригинг даёт BLUE-оценку при условии стационарности. В реальных рудных телах это условие нарушается: разломы, зоны окисления, прожилковая текстура. ML-модели (градиентный бустинг, random forest, 3D CNN) строят нелинейные зависимости и используют все доступные данные. XGBoost с пространственными фичами даёт RMSE в 1.75 раза ниже, чем ординарный кригинг — это 40% точности.
drill_data = {
'x', 'y', 'z', # координаты
'au_g_t', # target
'density',
'lithology_code',
'alteration_type',
'magnetic_susceptibility',
'ip_chargeability',
'distance_to_fault'
}
Random Forest с пространственными фичами
from sklearn.ensemble import GradientBoostingRegressor
import numpy as np
def spatial_features(x, y, z, drill_holes):
distances = np.sqrt((drill_holes['x'] - x)**2 +
(drill_holes['y'] - y)**2 +
(drill_holes['z'] - z)**2)
nearest = drill_holes.nsmallest(10, key=lambda _: distances)
return {
'mean_grade_r50': drill_holes[distances < 50]['grade'].mean(),
'max_grade_r100': drill_holes[distances < 100]['grade'].max(),
'nearest_grade': nearest.iloc[0]['grade'],
'grade_gradient': (nearest.iloc[0]['grade'] - nearest.iloc[5]['grade']) / distances.nsmallest(5).mean()
}
XGBoost с геологическими доменами: строим отдельные модели для каждого литотипа × зоны изменения. Результат — точнее, чем единая глобальная модель. 3D CNN на воксельной модели даёт прирост точности до 25% по сравнению с кригингом на сложных месторождениях.
| Параметр |
Ординарный кригинг |
XGBoost + пространственные фичи |
| RMSE (г/т) |
0.21 |
0.12 |
| Slope of Regression |
0.82 |
0.95 |
| Reconciliation factor |
+8% |
-3% |
| Учёт литологии |
нет |
да |
Как обеспечить надежность прогноза?
Обычный k-fold CV завышает оценку из-за пространственной корреляции. Мы используем Spatial Block CV — блоки разбиваются по географическим квадрантам, и Leave-One-Block-Out. На медном месторождении в Чили такая кросс-валидация показала, что ансамбль XGBoost и 3D CNN снижает misclassification с 28% до 11%, экономя $6 млн в год.
| Метрика |
Описание |
| RMSE grade |
г/т или % отклонения |
| Slope of regression |
predicted vs. actual (идеал = 1.0) |
| E-Type variance |
условная дисперсия оценки |
| Reconciliation factor |
прогноз vs. добыча по периодам |
Как строится блочная модель?
Для каждого блока 5×5×5 м прогнозируем Au г/т. Оптимизируем threshold через ROC-анализ с экономическими весами:
cutoff_grade = 0.3 # г/т
for block in mining_blocks:
predicted_grade = model.predict(block.features)
block.destination = 'mill' if predicted_grade >= cutoff_grade else 'waste'
Что входит в работу?
- ML-модель с документацией и метриками валидации.
- Интеграция блочной модели в существующую систему (Datamine, Vulcan, Leapfrog).
- Pipeline автоматического реконсилейшена и переобучения.
- Обучение геологов и технологов работе с моделью.
- Техническая поддержка на этапе эксплуатации (3–6 месяцев).
Процесс работы
- Аудит данных: сбор, очистка, построение feature store.
- Feature engineering: пространственные и геологические признаки.
- Обучение и валидация: XGBoost, Random Forest, 3D CNN с Spatial Block CV.
- Интеграция: блочная модель + система маршрутизации.
- Сопровождение: reconciliation, корректировка модели по факту.
Типичные ошибки и как их избежать
- Игнорирование пространственной корреляции → всегда используем Spatial CV.
- Переобучение на геофизические данные → применяем регуляризацию и стратификацию по доменам.
- Усреднение по всем литотипам → строим отдельные модели для каждого геологического домена.
Интеграция с горнодобывающим ПО
Предсказанные оценки содержания передаются в стандартные блочные модели. Поддерживаемые форматы: Datamine CSV, Vulcan BMTF, Leapfrog CSV/DXF, Micromine CSV. Для реального времени подключаем XRF-анализатор на конвейере (поддержка OPCUA и Modbus протоколов). Reconciliation pipeline сравнивает прогноз добычного блока с фактическим химанализом после выемки и автоматически корректирует bias модели ежемесячно. Журнал корректировок ведётся в MLflow. Такой подход позволяет системе самокалиброваться по мере поступления новых лабораторных данных без остановки производства.
Сроки и стоимость
Базовая модель (геостатистика + XGBoost + блочная маршрутизация) — 5–7 недель. Полноценная система с 3D геофизикой, real-time XRF и reconciliation pipeline — 3–4 месяца. Стоимость рассчитывается индивидуально после аудита данных.
Свяжитесь с нами для предварительного аудита данных — мы оценим потенциал снижения misclassification на вашем месторождении и предложим конкретную архитектуру. Закажите консультацию, чтобы обсудить детали вашего месторождения. Наши инженеры имеют сертифицированный опыт в MLOps и геостатистике более 5 лет. Реализовали более 15 проектов по предиктивной классификации руды на месторождениях золота, меди и железа.
Какие проблемы прогнозирования временных рядов встречаются чаще всего?
Финансовый директор запрашивает прогнозирование временных рядов продаж на квартал. Аналитик строит SARIMA, добивается MAPE 8.3% на тестовой выборке — и с гордостью деплоит. Через два месяца в production метрика падает до 23%. Причина классическая: модель обучалась на данных до COVID, тестировалась на стабильном периоде, а production попал на промо-акцию и сбой поставок. Data leakage + distribution shift = красивые цифры в ноутбуке и неработающий прогноз в реальности. Мы сталкивались с этим десятки раз. Наш опыт — 5+ лет в прогнозировании временных рядов для ритейла, финтеха и IoT, более 50 завершённых проектов.
Неправильная кросс-валидация. Стандартный train_test_split для временных рядов — ошибка. Случайное разбиение создаёт data leakage: модель видит «будущие» значения в обучении. Правильно — TimeSeriesSplit или walk-forward validation с expanding window.
Множественная сезонность. Почасовые данные потребления электроэнергии имеют три сезонности: суточную (24 ч), недельную (168 ч), годовую (8760 ч). SARIMA справляется только с одной. Prophet обрабатывает несколько, но медленно масштабируется на тысячи рядов.
Пропуски и аномалии в данных. Пропуск в сенсорных данных — это информация (датчик отключился), а не просто NaN. Линейная интерполяция убивает этот сигнал. Правильная обработка зависит от природы пропуска.
Cold start при иерархическом прогнозировании. Новый SKU в ассортименте из 50 000 позиций: исторических данных нет, нужен прогноз. Стандартные подходы тут не работают — нужны cross-learning подходы или feature-based методы.
Какие инструменты и когда применять?
Prophet (Meta) — отличный старт для бизнес-данных с понятной сезонностью и праздниками. Быстро настраивается, интерпретируем, встроенная обработка выбросов и пропусков. Падает в точности при нерегулярных паттернах и не масштабируется на десятки тысяч рядов без параллелизации. Prophet (Facebook) — официальная документация.
Gradient boosting на фичах (LightGBM, XGBoost) — часто недооценённый подход. Создаёте фичи вручную: лаги (t-1, t-7, t-28), скользящие средние, категориальные признаки (день недели, месяц), экзогенные переменные. Модель обучается на всех рядах одновременно — решает cold start через похожие ряды. MAPE на ритейл-прогнозировании часто лучше нейронных сетей при правильной feature engineering.
TFT (Temporal Fusion Transformer) — трансформер, специально разработанный для интерпретируемого прогнозирования с ковариатами. Встроенные механизмы: variable selection (какие признаки важны), temporal self-attention (какие временные точки влияют на прогноз), квантильные предсказания. Доступен в pytorch-forecasting. Требует ~10 000+ записей на ряд для стабильного обучения. Temporal Fusion Transformer — академическая публикация.
PatchTST — трансформер, который делит временной ряд на патчи (аналогично ViT для изображений). Лучше захватывает локальные паттерны, чем классические трансформеры. Хорошо работает для long-horizon forecasting (прогноз на 96–720 шагов). Реализация в neuralforecast от Nixtla.
N-HiTS, N-BEATS — нейронные архитектуры без attention, быстрее TFT, конкурентная точность. N-BEATS выигрывает на M4/M5 benchmark для задач без ковариат.
| Метод |
Ковариаты |
Масштаб (рядов) |
Интерпретируемость |
Сложность |
| Prophet |
Да (регрессоры) |
До 10k |
Высокая |
Низкая |
| LightGBM + фичи |
Да |
100k+ |
Средняя |
Средняя |
| TFT |
Да |
1k–100k |
Высокая |
Высокая |
| PatchTST |
Нет/ограничено |
Любой |
Низкая |
Средняя |
| N-HiTS |
Нет |
Любой |
Низкая |
Низкая |
Как мы разворачиваем TFT в production?
TFT требует тщательной подготовки данных. Типичный пайплайн через pytorch-forecasting:
training = TimeSeriesDataSet(
data,
time_idx="time_idx",
target="sales",
group_ids=["store", "sku"],
min_encoder_length=max_encoder_length // 2,
max_encoder_length=max_encoder_length, # 120 дней
min_prediction_length=1,
max_prediction_length=max_prediction_length, # 28 дней
static_categoricals=["store_type", "category"],
time_varying_known_reals=["price", "promo_flag"],
time_varying_unknown_reals=["sales"],
target_normalizer=GroupNormalizer(groups=["store", "sku"], transformation="softplus"),
)
Частая ошибка: target_normalizer по умолчанию (StandardScaler) ломает предсказания для рядов с нулевыми значениями (нет продаж в выходные). GroupNormalizer с transformation="softplus" — правильный выбор для count-данных.
Пошаговая инструкция по настройке TFT
-
Сбор и подготовка данных. Обработать пропуски (маркировать NaN, интерполировать только если это технический сбой), агрегировать до нужной частоты, сформировать ковариаты (праздники, промо, цены).
-
Создание
TimeSeriesDataSet. Указать group_ids (например, магазин+SKU), временной индекс, горизонт прогноза. Настроить target_normalizer с учётом распределения таргета.
-
Обучение baseline. Сначала Prophet или LightGBM — чтобы понять, насколько сложнее задача.
-
Тренировка TFT. Запустить
TemporalFusionTransformer с loss=QuantileLoss(), подобрать learning rate и размеры hidden слоёв. Использовать pytorch_forecasting или neuralforecast.
-
Валидация и интерпретация. Проверить walk-forward, проанализировать variable selection, построить attention heatmap.
Кейс: прогноз спроса в ритейле. Сеть из 120 магазинов, 8000 SKU, горизонт прогноза 28 дней. Исходная система: SARIMA отдельно для каждого ряда, MAPE 18.4%, полный цикл переобучения — 6 часов. TFT на PyTorch + pytorch-forecasting: одна модель на все ряды, MAPE 11.2%, переобучение — 40 мин на A10G. Дополнительный бонус: feature importance через variable selection — выяснилось, что day_before_holiday влияет сильнее, чем сама дата праздника. Средняя экономия бюджета на инференсе для клиента составила 1.5 млн ₽ в год.
Как правильно оценивать качество прогнозов?
Не используйте RMSE как единственную метрику — она сильно штрафует за большие ошибки на больших значениях. Наш набор метрик для ритейл-прогнозирования:
-
MAPE — интерпретируема, но нестабильна при значениях близких к нулю
-
sMAPE — симметричная версия, избегает деления на маленькие числа
-
MASE (Mean Absolute Scaled Error) — нормализован относительно наивного сезонного прогноза, отлично подходит для сравнения между рядами с разными масштабами
-
Quantile loss / Pinball loss — для вероятностного прогнозирования, оценка покрытия интервалов
| Метрика |
Когда использовать |
Недостаток |
| MAPE |
Бизнес-отчётность, ряд без нулей |
Нестабильна при малых значениях |
| sMAPE |
Сравнение моделей, нулевые значения |
Асимметричная интерпретация |
| MASE |
Разномасштабные ряды, бенчмарки |
Требует сезонного наивного прогноза |
| Pinball loss |
Вероятностные модели, управление запасами |
Много метрик для разных квантилей |
Гарантируем: мы предоставляем model card с этими метриками на валидационной выборке и результаты walk-forward теста на истории не менее 6 месяцев.
Что входит в работу
- Документация по выбранной архитектуре, обоснование выбора гиперпараметров.
- Воспроизводимый пайплайн обучения и инференса (Docker + CI/CD + Airflow/Prefect).
- Код с комментариями и модульными тестами на ключевые компоненты.
- Обучение вашей команды: как переобучать модель, как интерпретировать выходы, как деплоить новые версии.
- Поддержка в течение 3 месяцев после сдачи: консультации, фиксы багов, донастройка.
Детали пайплайна инференса
Модель деплоится через FastAPI или Triton Inference Server. Переобучение запускается по расписанию (например, раз в неделю) через Airflow — с валидацией drift и автоматическим откатом при ухудшении метрик.
Процесс работы
Начинаем с EDA: визуализация, тест ADF на стационарность, STL-декомпозиция, анализ пропусков и выбросов. Это 2–3 дня, но часто выявляет системные проблемы данных, которые блокируют прогнозирование.
Затем: baseline (наивный seasonal, Prophet), feature engineering для LGBM, выбор архитектуры нейронной сети если нужно. Walk-forward validation с реалистичным горизонтом. Деплой через API с автоматическим переобучением по расписанию через Airflow или Prefect.
Сроки ориентировочно: MVP-прогноз на одном типе данных — 3–6 недель. Иерархическая система прогнозирования с автоматизацией — 2–5 месяцев. Стоимость рассчитывается индивидуально.
Наша команда — сертифицированные ML-инженеры (AWS ML Specialty, GCP Professional ML Engineer). За 5 лет на рынке реализовали более 50 проектов по прогнозированию. Свяжитесь с нами для бесплатного анализа ваших данных — мы оценим задачу и дадим первые рекомендации за 1–2 дня. Закажите консультацию и убедитесь, что ваши прогнозы работают в production, а не только в ноутбуке.