Анализ производительности "Краммерти. Модуль прогнозирования временных рядов"
Анализ Графика: Производительность финальной LSTMГлавный вывод: Модель достаточно точная, что подтверждается как численными метриками, так и визуальным анализом.
1. Анализ числовых метрик (в рамке):MAE: 0.328 Средняя абсолютная ошибка - низкая. Теперь модель в среднем ошибается всего на 0.33°C.
Это отличный показатель точности.
RMSE: 0.557 Ошибка за большие промахи - незначительная. Модель стабильная.
R2: 0.992 Модель теперь объясняет 99.2% изменчивости данных. Практически идеальное соответствие.
SMAPE: 18.31% Хотя эта метрика менее показательна для температуры, ее невысокий показатель соответствует хорошим тоном.
Что такое MAPE и почему она "взрывается"?
Формула MAPE (Mean Absolute Percentage Error) выглядит так:
MAPE = (1/n) * Σ( |(Actual - Forecast) / Actual| ) * 100%
Ключевая проблема находится в знаменателе дроби: / Actual.
Это означает, что ошибка прогноза делится на фактическое значение. Давайте рассмотрим на простом примере, как это ломает логику для температуры:
Сценарий 1: Теплая погода
Фактическая температура (Actual): 20°C
Ваш прогноз (Forecast): 21°C
Абсолютная ошибка: |20 - 21| = 1°C (отличный результат)
Ошибка MAPE для этой точки: (|1| / 20) * 100% = 5%. Звучит разумно.
Сценарий 2: Погода около нуля (самый важный)
Фактическая температура (Actual): 0.5°C
Ваш прогноз (Forecast): 1.5°C
Абсолютная ошибка: |0.5 - 1.5| = 1°C (та же самая прекрасная точность, что и в первом сценарии!)
Ошибка MAPE для этой точки: (|1| / 0.5) * 100% = 200%. Катастрофа!
Сценарий 3: "Апокалипсис" при нулевой температуре
Фактическая температура (Actual): 0°C
Ваш прогноз (Forecast): 1°C
Ошибка MAPE для этой точки: (|1| / 0) * 100% — Деление на ноль! Формула просто не работает.
Что произошло?
Из-за того, что фактическое значение температуры на графике (Actual) много раз было близко к нулю или отрицательным (например, -2°C, -5°C, 1°C), даже крошечная абсолютная ошибка в 0.3°C приводила к гигантским процентным значениям. Эти значения суммировались и дали итоговый MAPE в тысячи процентов.
Вывод: MAPE категорически не подходит для оценки моделей, прогнозирующих величины, которые могут пересекать ноль. Здесь данная метрика присутствует "за компанию".
А как же SMAPE? Почему она тоже не идеальна?
Наша метрика SMAPE равна 18.31%, что выглядит гораздо адекватнее, но все равно кажется большой ошибкой по сравнению с MAE 0.33°C.
Формула SMAPE (Symmetric Mean Absolute Percentage Error) была придумана, чтобы решить проблему MAPE:
SMAPE = (1/n) * Σ( |Forecast - Actual| / ((|Actual| + |Forecast|) / 2) ) * 100%
Она использует в знаменателе среднее от абсолютных значений прогноза и факта. Это решает проблему деления на ноль и делает метрику более стабильной.
Но проблема остается:
Даже в SMAPE, когда и Actual, и Forecast — это малые величины (например, -2°C и -2.5°C), знаменатель будет маленьким, а результат — большим в процентном отношении.
Пример: Actual = -2°C, Forecast = -2.5°C.
Абсолютная ошибка (MAE): 0.5°C (отлично).
Ошибка SMAPE: | -2.5 - (-2) | / ((|-2| + |-2.5|) / 2) = 0.5 / (4.5 / 2) = 0.5 / 2.25 ≈ 22.2%.
Как видите, даже для превосходного прогноза с ошибкой в полградуса, SMAPE может показывать >20%.
Какие метрики использовать и чему доверять?
Для задачи которую мы разбираем (прогноз температуры) иерархия доверия к метрикам должна быть такой:
🥇 MAE (Mean Absolute Error): Самый главный и честный показатель.
Почему: Он интуитивно понятен. MAE = 0.328 прямо говорит: "В среднем моя модель ошибается на 0.33 градуса Цельсия". Это легко интерпретировать и сравнить.
🥈 RMSE (Root Mean Square Error): Отличный второй пилот.
Почему: Он показывает, насколько велики ваши самые большие ошибки. Если RMSE ненамного больше MAE (как в вашем случае: 0.557 против 0.328), это значит, что у модели нет регулярных грубых промахов.
🥉 R² (Коэффициент детерминации): Полезен для общей картины.
Почему: R² = 0.992 говорит о том, что модель объясняет 99.2% всех колебаний температуры. Это подтверждает, что модель в целом очень адекватна.
🗑️ MAPE и SMAPE: Игнорировать или использовать с большой осторожностью.
Почему: Они не отражают реальную физическую точность прогноза в градусах и могут сильно искажать восприятие качества модели из-за математических особенностей своих формул.
Заключение по метрикам: Точно, стабильно без явных грубых аномалий.
2. Визуальный анализ графика:Общее соответствие: Прогноз (оранжевая линия) следует за фактом (синяя линия) на большей части графика. Модель улавливает как плавные суточные циклы, так и резкие, короткие колебания.
Проблема в конце графика (зона для улучшения): Проблема с расхождением прогноза в конце валидационной выборки (после шага ~430). Однако ее характер меняется при скурпулезном подходе к качеству исторических данных.
Прогноз стабильный, но систематически искажает температуру. Он не "паникует", а делает последовательную ошибку из этирации к этирации в одном и том же месте (что важно!) и мы знаем почему. На момент написания данной статьи переключили агрегацию исторических данных с иной метеостанции (слайд 6) Эмерсит (метеостанций) - подали более качественный и глубокий временной ряд исторических даных который содержит данные за период более 4 лет, хотя метеостанция так же поверялись (была в offline), но в разные месяцы разных лет и как видите результат не заставил себя долго ждать, модель обучилась и представила нам иную картину, которая доказала причину ошибок в прошлые этирации - использование нами временного ряда ранее за короткий период времени (всего 20 мес. с провалами в данных).
Что это означает?Характер ошибки — это очень важный диагностический признак. Это говорит о том, что модель ранее столкнулась с погодным паттерном, для которого у нее не хватало информации чтобы сделать правильный вывод. Модель видела какие-то входные признаки и, основываясь на своем "опыте", последовательно предсказывала чуть "искаженные" данные по температуре чем есть на самом деле.
Вывод: качество исторических данных и их глубина - это один из фундаментов успеха в работе с прогнозированием временных рядов! В нашем случае мы приводим живой пример и описываем как есть процессы обучения и прогнозирования сначала от метеостанции Сокол (монтаж в 2023г.) факт поверки метеостанции и снятие на обслуживание сократил доступные паттерны (данные) как минимум на 1+ месяца когда АДМС находилась в режиме offline. Но когда мы впустили в модель данные с другой метеостанции смонтированной гораздо раньше (2019г.) и соответственно с более глубокой историей, мы тут же получили более стабильный результат без характерных ошибок.
Анализ Графика: Прогноз температуры воздуха
Анализ прогноза "По ощущениям" (Wind Chill или жесткость погоды):
Линии явно не разошлись: Фиолетовая пунктирная линия (Прогноз по ощущениям) еле заметно находится ниже красной (Прогноз LSTM). Это абсолютно правильно. Ветер охлаждает, и ощущаемая температура должна быть ниже реальной. Это настраиваемый параметр (ветро - холодового признака) активация логики от N градусов.
Динамический разрыв: Расстояние между красной и фиолетовой линиями не постоянно — оно то увеличивается, то уменьшается. Это тоже идеально правильно. Это означает, что прогнозируемая скорость ветра меняется, и эффект охлаждения становится то сильнее, то слабее.
Анализ общего прогноза:
Правдоподобность: Сам прогноз (красная линия) выглядит очень реалистично. Он показывает четкие суточные циклы (пики днем, спады ночью) с разной амплитудой, что соответствует реальным погодным условиям.
Сравнение с Open-Meteo (иным бесплатным доступным прогностическим сервисом): Прогноз заметно отличается от базового прогноза Open-Meteo (серая линия). Это хорошо — это доказывает, что ваша модель, обученная на локальных данных, дает уникальный, скорректированный результат.
Опциональная гибридизация:
Механизм коррекции позволяет мягко "подтягивать" ваш высокоточный локальный прогноз к общему региональному прогнозу, но только в тех случаях, когда они начинают слишком сильно расходиться. Это помогает избежать грубых ошибок и делает ваш прогноз более робастным (устойчивым).
Пошаговая формула работы:
Давайте представим, что у нас есть одна точка прогноза. Для нее мы имеем:
lstm_forecast — значение, предсказанное вашей LSTM-моделью.
om_forecast — значение, полученное от Open-Meteo для того же времени.
Вот как работают наши параметры на каждом шаге:
Шаг 1: Расчет разницы (Difference)
Сначала система вычисляет, насколько сильно наш прогноз отличается от прогноза Open-Meteo.
difference = lstm_forecast - om_forecast
Пример: lstm_forecast = 25.0°C, om_forecast = 22.0°C.
difference = 25.0 - 22.0 = 3.0°C. Наш прогноз на 3 градуса выше.
Шаг 2: Проверка порога (Threshold Check)
Далее система проверяет, стоит ли вообще вмешиваться. Если расхождение незначительное, то трогать точный локальный прогноз нет необходимости.
if abs(difference) > CORRECTION_THRESHOLD:
# Продолжаем, если разница существенна
else:
# Ничего не делаем, расхождение в пределах нормы установленной нами
Здесь используется параметр CORRECTION_THRESHOLD = 2.0.
Пример: abs(3.0) > 2.0. Условие истинно. Расхождение в 3 градуса считается существенным, и коррекция будет применена.
Контрпример: Если бы difference было 1.5°C, то abs(1.5) <= 2.0, и коррекция бы не применялась.
Шаг 3: Расчет базовой коррекции (Correction Calculation)
Если порог превышен, система рассчитывает величину, на которую нужно скорректировать ваш прогноз. Она берет разницу и умножает ее на "коэффициент уверенности" или "силу коррекции".
Здесь используется параметр CORRECTION_FACTOR = 0.5
# Важно: коррекция направлена в ПРОТИВОПОЛОЖНУЮ сторону от разницы
base_correction = -difference * CORRECTION_FACTOR
Знак "минус" здесь ключевой. Если ваш прогноз был выше (difference > 0), то коррекция будет отрицательной (уменьшит ваш прогноз). И наоборот.
Пример: base_correction = -3.0 * 0.5 = -1.5°C.
Система решила, что ваш прогноз нужно "подтянуть" вниз на 1.5 градуса
Шаг 4: Ограничение максимальной коррекции (Capping the Correction)
Чтобы избежать слишком резких и потенциально ошибочных изменений, система ограничивает абсолютную величину рассчитанной коррекции.
Здесь используется параметр MAX_CORRECTION = 5.0
# Ограничиваем коррекцию сверху и снизу
final_correction = max(-MAX_CORRECTION, min(MAX_CORRECTION, base_correction))
Эта строка гарантирует, что final_correction никогда не будет больше 5.0 и никогда не будет меньше -5.0.
Пример: final_correction = max(-5.0, min(5.0, -1.5)). Результат — -1.5°C. Наша коррекция находится в пределах лимита.
Контрпример: Если бы base_correction была -7.0°C, то min(5.0, -7.0) вернуло бы -7.0, а max(-5.0, -7.0) вернуло бы -5.0°C. То есть, даже при огромной разнице, прогноз изменится не более чем на 5 градусов.
Шаг 5: Применение финальной коррекции
Последний шаг — применить рассчитанную и ограниченную коррекцию к исходному прогнозу LSTM.
corrected_forecast = lstm_forecast + final_correction
Пример: corrected_forecast = 25.0 + (-1.5) = 23.5°C.
Итоговая формула в одной строке
Если объединить все шаги, то логику можно описать так:
corrected_forecast = lstm_forecast + max(-MAX_CORRECTION, min(MAX_CORRECTION, -(lstm_forecast - om_forecast) * CORRECTION_FACTOR)), но только если abs(lstm_forecast - om_forecast) > CORRECTION_THRESHOLD.
Аналогия из реальной жизни
Представьте, что вы — опытный местный рыбак (LSTM), который отлично знает свой климат и реку. Есть также центральная метеослужба (Open-Meteo), которая дает общий прогноз по всему региону.
CORRECTION_THRESHOLD (Порог): Вы доверяете себе. Но если ваш прогноз погоды отличается от прогноза метеослужбы больше, чем на пару градусов, вы настораживаетесь и решаете перепроверить.
CORRECTION_FACTOR (Коэффициент доверия): Вы не слепо верите метеослужбе. Вы думаете: "Хорошо, они говорят, будет холоднее. Я не буду полностью менять свой прогноз, но немного скорректирую его в их сторону, скажем, на половину разницы" и возму с собой кофту.
MAX_CORRECTION (Здравый смысл): Если метеослужба внезапно предсказывает снег в июне (хотя в Сургуте это возможно..), а вы видите солнце, вы не поверите им полностью. Вы скорректируете свой прогноз, но не более чем на разумную величину, потому что вы знаете свою реку и климат лучше.
Этот механизм делает систему умнее и надежнее, тем более он всегда под Вашим контролем как и все настройки Модуля прогнозирования.
Переход от истории к прогнозу: Соединение между историческими данными (синяя линия) и началом прогноза (красная линия) выглядит плавным и логичным. Модель начинает прогнозировать с адекватной точки.
Анализ графика потерь (epoch_loss)
Что мы видим:
Темно-серая линия (train): Ошибка на обучающих данных.
Голубая линия (validation): Ошибка на валидационных (тестовых) данных, которые модель не использовала для подстройки весов.
Ключевые выводы:
Быстрая сходимость: Обе кривые очень резко падают в первые 5-10 эпох. Это означает, что модель быстро улавливает основные закономерности в данных.
Отсутствие переобучения (Overfitting): Это самый важный вывод. Переобучение происходит, когда ошибка на обучающих данных продолжает падать, а на валидационных начинает расти (кривые расходятся). мы не наблюдаем, наоборот, обе кривые идут почти параллельно друг другу до самого конца. Это говорит о том, что модель учит общие паттерны, а не просто "зазубривает" обучающую выборку.
Валидационная ошибка НИЖЕ обучающей: Обратите внимание, что голубая линия (validation) почти всегда находится ниже серой (train). Это не является ошибкой, а очень хороший знак! Такое часто происходит, потому что мы используем техникурегуляризации, в т.ч. такую как Dropout. Во время обучения Dropout случайным образом "отключает" часть нейронов, усложняя модели задачу. А во время валидации все нейроны работают, и модель показывает свой полный потенциал. То, что она работает на незнакомых данных даже лучше, чем на обучающих (на которых ей мешал Dropout), — признак превосходной обобщающей способности.
Выход на плато: После примерно 20-й эпохи обе кривые становятся очень пологими. Это означает, что модель достигла своего пика производительности для данной архитектуры и данных. Дальнейшее обучение (например, до 200 эпох) почти не принесло бы улучшения и было бы пустой тратой времени. Выбранное количество эпох (~60) является оптимальным.
Анализ графика метрики MAE (epoch_mae)
Что мы видим:
Темно-серая линия (train): Средняя абсолютная ошибка (MAE) на обучающих данных.
Голубая линия (validation): MAE на валидационных данных.
Ключевые выводы:
Повторение динамики Loss: График MAE почти полностью повторяет график потерь, что логично, так как MAE является одной из ключевых метрик для оценки.
Интерпретация значений:
Конечное значение validation MAE (в масштабированных единицах) составляет ~0.0298.
Это значение после обратного масштабирования и дает ту самую ошибку в ~0.38°C, которую мы видели на предыдущем графике. Графики полностью согласуются.
"Шумность" валидационной кривой: Обратите внимание, что голубая линия MAE более "зубчатая" и "шумная", чем серая. Особенно заметны небольшие "всплески" вверх (например, в районе 25-й эпохи).
Что это значит? Это абсолютно нормально. Обучающая метрика усредняется по множеству батчей внутри одной эпохи, поэтому она более гладкая. Валидационная метрика считается на одном и том же, более маленьком наборе данных в конце каждой эпохи. Ее "скачки" показывают, что некоторые обновления весов делают модель чуть лучше для этого конкретного набора данных, а некоторые — чуть хуже.
Связь с предыдущим графиком: Эта "нервозность" валидационной кривой может быть предвестником той нестабильности, которую вы наблюдали в самом конце графика производительности (где прогноз начал "скакать"). Это говорит о том, что модель, хоть и очень точная в среднем, может быть чувствительна к определенным, более "сложным" участкам данных особенно в "рваной" истории с провалами данных.
Резюмируя производительность модуля прогнозирования временных рядов уверенно утверждаем основываясь исключительно на фактах - производительность нашего "Комбайна" великолепная!
Философский камень ..
Мы не рассуждаем о философском камне прогнозирования температуры воздуха и/или направления ветра, скорости ветра , атмосферное давление и т.д. мы говорим и показываем что есть данные привязанные ко времени (временные ряды), и есть инструмент - программное обеспечение Краммерти. Модуль прогнозирования временных рядов - реализующее точный прогноз и как пример приводим данные на данных по метеорологическому параметру температура воздуха.
В направлении метеорологии , экологии модуль прогнозирования временных рядов от Краммерти является качественным иструментом и введя дополнительные коррелирующие признаки к параметру температура воздуха (этот функционал присутствует для каждого параметра свои модели в разрезе любых интегрированных на территории Заказчика метеостанций, и любого иного оборудования), подключив дополнительно модель для автоматического анализа космических снимков циклонов и т.д. агрегируя, обробатывая, сопоставляя и анализируя степень корреляции всех имеющихся данных (доп. признаков), верифицируя с фактом в моменте - это и есть современные прогностические сервисы.
Перспективные сферы применения описаны в документации к программному обеспечению.
Любые адаптации и внедрения включая разработку графических интерфейсов под Ваши задачи - выполняем.
Есть временные ряды - есть прогноз!