Проблема, которую видно в данных
Сравнение глобального модельного поля CAMS с физическими сенсорами по совпадающим часам
Данные: три источника, сшитые почасово
Ключ сшивки: город + локальная дата + локальный час; таймзоны выровнены и верифицированы по физике суточных циклов (пик озона CAMS и температуры BME280 — в 14:00 локального)
| Источник | Объём | Что берём |
|---|---|---|
| Sensor.Community (SDS011/PMS/SEN5x + BME280) | 709 770 минутных измерений с 9 сенсоров → 22 739 часов | PM2.5/PM10 (ground truth), влажность, температура |
| CAMS (Open-Meteo Air Quality API) | 23 города × 199 дней × 24 часа | PM2.5, PM10, CO, NO₂, SO₂, O₃ — глобальный прогноз |
| Бюллетени НМУ Казгидромета (ежедневные PPTX) | 22 города, 4 377 суток (пополняется ежедневно) | доли ПДК газов, НМУ-степени, официальный PM2.5, ветер (распарсен из текста прогнозов, 97.6% дней) |
Модель: локальная поправка, а не замена CAMS
Учим то, чего у CAMS по построению быть не может — локальную дельту
delta = log(PM2.5_сенсор + 1) − log(PM2.5_CAMS + 1)
HistGradientBoostingRegressor на признаках: сезон, час, влажность, температура, ветер и доли ПДК газов из бюллетеней, НМУ-степень, поля CAMS, город. Два квантиля дельты: q50 — уровень для карты и графиков, q90 — верхняя граница риска. Алерт = q90 > 35 мкг/м³: для родителя астматика пропущенный опасный час хуже лишнего предупреждения.
Валидация 1 — переносимость на незнакомую точку (LOSO)
Leave-one-sensor-out: модель предсказывает локацию, которую никогда не видела; среднее по 5 фолдам
| Модель | MAE, мкг/м³ | corr | F1 детекции часов >35 |
|---|---|---|---|
| CAMS as-is (что видит человек в погодном приложении) | 14.75 | 0.41 | 0.13 |
| CAMS + константа города | 14.22 | 0.41 | 0.20 |
| Наша модель: ML-поправка + квантильный алерт | 11.22 | 0.59 | 0.51 |
−24% ошибки к CAMS; recall опасных часов 0.78 при покрытии q90 0.81. Данные обновляются ежедневно, метрики пересчитываются — прогон 20.07.2026 на 22 739 часах
Валидация 2 — честный прогноз по времени
Rolling-origin бэктест: train — только прошлые месяцы, test — следующий месяц (5 фолдов, март–июль). Признаки, недоступные в момент выпуска прогноза, заменены лагами
| Горизонт | MAE наша | MAE CAMS | corr наша | corr CAMS | Alert F1 наша | Alert F1 CAMS |
|---|---|---|---|---|---|---|
| +1 час | 3.5 | 11.0 | 0.76 | 0.05 | 0.56 | 0.02 |
| +3 часа | 5.3 | 11.0 | 0.59 | 0.05 | 0.35 | 0.02 |
| +6 часов | 6.0 | 11.0 | 0.47 | 0.05 | 0.28 | 0.02 |
Деградация по горизонту — честная: на +6ч модель всё ещё на 45% точнее CAMS по MAE. Абляция: добавление почасового прогноза погоды Open-Meteo (ветер, T, RH, boundary layer height) поверх CAMS-полей меняет метрики <2% — метеорология уже ассимилирована в CAMS (проверено, 06_fetch_weather + вариант lags+weather в бэктесте)
Алерты по узлам (LOSO, q90)
Precision ниже на чистых локациях Алматы — принцип предосторожности; порог калибруется
| Локация | MAE q50 | precision | recall | F1 |
|---|---|---|---|---|
| 72099 · Алматы | 6.1 | 0.10 | 0.93 | 0.18 |
| 81020 · Караганда | 11.0 | 0.62 | 0.56 | 0.58 |
| 81039 · Караганда | 11.2 | 0.40 | 0.85 | 0.54 |
| 85666 · Алматы | 8.0 | 0.41 | 0.80 | 0.54 |
| 86036 · Караганда | 17.2 | 0.62 | 0.77 | 0.69 |
Что проверили и не взяли в модель
Отрицательные результаты — тоже результаты; обе гипотезы остались в продукте как слой объяснения, но не как входы прогноза
| Гипотеза | Что добавляли | Итог (LOSO / бэктест) |
|---|---|---|
| Прогноз погоды поверх CAMS | ветер, T, RH, осадки, давление, высота пограничного слоя (Open-Meteo, почасово) | изменение <2%: метеорология уже ассимилирована в CAMS |
| Близость к промзоне и перенос шлейфа ветром | 42 крупных источника (ТЭЦ, металлургия, цемент): экспозиция Σ E/d² и наветренный перенос E·e^(−d/30км)·cos²θ/(u+1) | MAE 10.71 → 11.15, F1 0.51 → 0.50: доли ПДК газов из бюллетеней уже несут измеренный след выбросов, а статическая экспозиция в LOSO работает как отпечаток локации |
Атрибуция источников осталась на экранах «Мой двор» и «Карта»: при текущем ветре видно, какие предприятия стоят с наветренной стороны и какова их доля в переносе — это объясняет картину, но в q50/q90 не входит.
Честные ограничения
- 5 сенсорных локаций в 2 городах: LOSO честный, но узкий; переносимость на другие города дополнительно проверяем по официальному PM2.5 бюллетеней (10 городов).
- Оценка «в точке двора» — IDW-интерполяция прогнозов узлов, а не физическая модель переноса; в роадмапе — инференс по фичам самой точки (близость к промзоне, дорогам).
- В прогнозном режиме входы заменены на доступные в момент выпуска лаги (см. валидацию 2); поля CAMS целевого часа легальны — CAMS сам прогнозный продукт.