03 — Методологія
Як побудовано оцінку
Формальний опис: означення, відсічка, схема валідації, метрики, результати й межі застосовності.
1. Одиниця спостереження
Одиниця — доба нальоту (raid day), визначена як інтервал від 12:00 до 12:00 наступної календарної доби за київським часом і підписана датою початку:
Вибір зумовлений тим, що типовий наліт має нічний профіль (22:00–05:00) і календарна північ розділяє одну подію на дві доби, штучно створюючи дві спостережні одиниці з половинними значеннями. Нічним вікном скрізь вважається 22:00–06:00.
2. Цільова змінна
Визначено порядкову шкалу тяжкості S ∈ {0,1,2,3} для міста Києва:
| Рівень | Назва | Операційна ознака |
|---|---|---|
| 0 | тиша | тривог не було або сумарно < 30 хв |
| 1 | тривога без удару | тривога ≥ 30 хв, ознак цілей над містом немає |
| 2 | атака | цілі на місто: супровід курсом на Київ, робота ППО, влучання |
| 3 | масована атака | цілі над містом і при цьому ≥ 8 год тривоги за добу нальоту або ≥ 15 треків |
Пороги рівня 3 — апріорні константи (480 хвилин, 15 треків), а не квантилі. Причина: кількість треків залежить від того, наскільки докладно канал описує повітряну обстановку, і її квантиль дрейфує (у добу атаки: 5 у 2024, 5 у 2025, 9 у 2026). Поріг, знятий з одного року, наступного означав би інше. Тривалість тривог надходить із реєстру КМДА — тракту, незалежного від каналу. Рівень 3 трапляється 5 / 14 / 14 разів на рік.
Замість однієї 4-класової задачі розв'язується три вкладені бінарні: P(S ≥ 1), P(S ≥ 2), P(S ≥ 3). Рівень S ≥ 2 тотожний мітці «атака» за побудовою, тому окремої моделі під нього немає. Публікується P(S ≥ 2) як «ймовірність повітряної атаки», P(S ≥ 3) як «масована атака», P(S ≥ 1) як «тривога понад 30 хвилин».
Бінарне «був / не був» втрачає різницю між одним дроном і 300 цілями, а саме вона визначає практичні наслідки. Водночас точна кількість засобів по Києву не публікується жодним джерелом, тому вигадане число дало б модель, навчену на шумі.
3. Відсічка прогнозу й витік
Прогноз формується о 12:00 київського часу доби d. Ознака вважається допустимою, якщо існувала до цього моменту. Оскільки відсічка збігається з початком вікна, правило зводиться до зсуву:
горизонт 2 («завтра»): ознаки = f( raid_day ≤ d−2 )
Для горизонту 2 доба d−1 на момент відсічки ще триває, тому її підсумки недоступні. Це найпоширеніше джерело прихованого витоку в задачах такого типу: модель, що бачить d−1 при прогнозі на d+1, показує неправдоподібно високу якість.
Окремий випадок — погода. Прогноз погоди на ніч є допустимою ознакою (о 12:00
він уже виданий), фактична погода тієї ночі — витік. У поточній версії блок
погоди вимкнено повністю: у базі поки накопичена лише фактична погода
(ERA5), а прогнозні зрізи з власним issued_at збираються з
07.09.2026. Ціна вимкнення виміряна: log-loss 0.4643 з погодою проти 0.4742 без
неї, і перше число некоректне.
4. Простір ознак
58 ознак, згрупованих у блоки:
- A. Стан за d−lag (8): кількість і тривалість тривог, дрон- і ракетні треки на Київ, національні числа запусків, зльоти носіїв.
- B. Історичні вікна (42): для кожного з чотирьох рядів — лаги 1–3, ковзні середні за 3, 7, 14, 30 діб, ковзне стандартне відхилення й максимум за 7 діб, експоненційне згладжування (α = 0.3), довжина поточної серії, кількість діб від останньої сильної доби.
- C. Календар (8): день тижня й місяць у циклічному поданні (sin/cos), тривалість темного часу, опалювальний сезон, ваги українських і російських свят окремими колонками.
- D. Погода (4) — вимкнено, див. §3.
Абляція блоків (горизонт 1, XGBoost, log-loss): A — 0.4659; C — 0.6366; A+C — 0.5001; A+B+C — 0.4836. Історичні вікна дають найбільший приріст серед допустимих блоків; календар сам по собі не несе майже нічого.
5. Схема валідації
Розбиття виключно хронологічне; перемішування неприпустиме, оскільки сусідні доби сильно корельовані:
train_fit : перші 80% train — добір гіперпараметрів (CV)
train_val : останні 20% train — вибір K, корекції частки і того, що взагалі публікувати
test : 2026-03-08 … 2026-09-07 (184 доби, 20%)
Гіперпараметри добираються всередині train процедурою
TimeSeriesSplit(n_splits=5) (forward chaining) за критерієм log-loss.
Тестова частина не бере участі ні у відборі гіперпараметрів, ні у відборі
моделей, ні у визначенні порогів лейбла.
Це важливо, бо в попередній версії роботи сім рішень (ансамбль замість
одиночної моделі, K, медіана проти середнього, вікно навчання, поріг, набір
блоків ознак) приймалися за таблицями на тесті — після чого тест перестав бути
оцінкою узагальнення. Тепер усі вони ухвалюються на train_val,
і тест повідомляє лише підсумок.
6. Специфікація моделі
Розглянуто десять сімейств із програми курсу машинного навчання: kNN, логістична регресія з L1 і L2 регуляризацією, PCA + логістична регресія, дерево рішень, беггінг, випадковий ліс, градієнтний бустинг (HistGB), XGBoost, багатошаровий перцептрон. Додатково — стекінг, блендинг, ізотонічне калібрування.
Підсумкова специфікація:
де {1…5} — п'ять моделей з найменшим CV-log-loss усередині train
Обґрунтування ансамблю: рейтинг за крос-валідацією не переноситься на майбутнє. На горизонті 1 CV поставила LogReg L1 на перше місце, тоді як на тесті найкращою виявилась XGBoost, восьма за CV із десяти. Медіана п'яти не гірша за одиночну модель, обрану за CV, у жодному з двох зрізів, і краща на тесті. Медіана, а не середнє: одна модель з аномальним виходом (MLP, CV = 1.12) зміщує середнє й не зміщує медіану.
Склад ансамблю не фіксується: при кожному дотренуванні п'ять моделей відбираються заново й записуються разом із прогнозом.
Відхилені варіанти, з підставами: стекінг і блендинг (гірші за медіану на 760 рядках); ізотонічне калібрування (0.4956 проти 0.4643); обрізання вікна навчання до 365 і 180 діб (0.4764 і 0.5511 проти 0.4581); експоненційна вага за свіжістю (0.4647–0.5142); регресія на тривалість тривог (R² ≤ 0 в усіх моделях, тобто гірше за константу).
7. Метрики
Основні — власні (proper) правила оцінювання, оскільки предметом є ймовірність, а не мітка:
Brier = (1/n) Σ ( pi − yi )²
Додатково: ROC-AUC і PR-AUC для оцінки ранжування, матриця плутанини за порогом рішення.
Accuracy свідомо не використовується. Базова частка позитивів на тесті — 45.7%, у train 39.5%; при такому дрейфі та незбалансованості точність відображає передусім співвідношення класів, а не якість прогнозу. Крім того, на 184 добах різниця в кілька відсотків log-loss не відрізняється від нуля — тому кожне число подано з довірчим інтервалом.
8. Результати
Тестова вибірка — 184 доби (2026-03-08 … 2026-09-07), навчальна — 732. Частка позитивів: 0.395 у train, 0.457 у test. Конфігурація без блоку погоди. Довірчі інтервали — рухомий блоковий бутстреп (блок 7 діб, 5000 реплік) для різниці поточкових втрат відносно кліматології.
| Горизонт / ціль | Оцінка | log-loss | Brier | ROC-AUC | Δ до кліматології | 95% ДІ |
|---|---|---|---|---|---|---|
| сьогодні / атака | модель | 0.6920 | 0.2464 | 0.606 | -0.0169 | [-0.042, +0.016] |
| сьогодні / атака | константа | 0.6972 | 0.2519 | 0.500 | -0.0116 | [-0.042, +0.019] |
| сьогодні / атака | персистенція | 0.7089 | 0.2571 | 0.512 | +0.0000 | [+0.000, +0.000] |
| сьогодні / атака | кліматологія 30 | 0.6798 | 0.2428 | 0.570 | -0.0290 | [-0.061, +0.010] |
| сьогодні / тривога ≥30 хв | модель | 0.5981 | 0.2038 | 0.495 | +0.0325 | [-0.022, +0.084] |
| сьогодні / тривога ≥30 хв | константа | 0.5727 | 0.1912 | 0.500 | +0.0070 | [-0.043, +0.052] |
| сьогодні / тривога ≥30 хв | персистенція | 0.5680 | 0.1893 | 0.518 | +0.0024 | [-0.049, +0.044] |
| сьогодні / тривога ≥30 хв | кліматологія 30 | 0.5656 | 0.1861 | 0.449 | +0.0000 | [+0.000, +0.000] |
| сьогодні / масована | модель | 0.2353 | 0.0568 | 0.719 | -0.0044 | [-0.010, +0.010] |
| сьогодні / масована | константа | 0.2397 | 0.0572 | 0.500 | +0.0000 | [+0.000, +0.000] |
| сьогодні / масована | персистенція | 0.2295 | 0.0564 | 0.664 | -0.0102 | [-0.023, +0.001] |
| сьогодні / масована | кліматологія 30 | 0.1837 | 0.0491 | 0.774 | -0.0560 | [-0.117, +0.006] |
| завтра / атака | модель | 0.9539 | 0.3188 | 0.542 | +0.2483 | [+0.126, +0.404] |
| завтра / атака | константа | 0.6972 | 0.2519 | 0.500 | -0.0084 | [-0.037, +0.019] |
| завтра / атака | персистенція | 0.7056 | 0.2556 | 0.518 | +0.0000 | [+0.000, +0.000] |
| завтра / атака | кліматологія 30 | 0.6782 | 0.2422 | 0.585 | -0.0274 | [-0.064, +0.014] |
| завтра / тривога ≥30 хв | модель | 0.9836 | 0.3415 | 0.529 | +0.4123 | [+0.188, +0.675] |
| завтра / тривога ≥30 хв | константа | 0.5727 | 0.1912 | 0.500 | +0.0014 | [-0.056, +0.050] |
| завтра / тривога ≥30 хв | персистенція | 0.5739 | 0.1922 | 0.476 | +0.0026 | [-0.052, +0.045] |
| завтра / тривога ≥30 хв | кліматологія 30 | 0.5713 | 0.1874 | 0.434 | +0.0000 | [+0.000, +0.000] |
| завтра / масована | модель | 0.2411 | 0.0572 | 0.676 | +0.0014 | [-0.008, +0.012] |
| завтра / масована | константа | 0.2397 | 0.0572 | 0.500 | +0.0000 | [+0.000, +0.000] |
| завтра / масована | персистенція | 0.2324 | 0.0567 | 0.616 | -0.0072 | [-0.018, +0.001] |
| завтра / масована | кліматологія 30 | 0.1908 | 0.0502 | 0.757 | -0.0489 | [-0.104, +0.007] |
Кліматологія — ковзне середнє за 30 діб — перевершує модель на всіх трьох цілях і обох горизонтах. Жодна різниця на горизонті «сьогодні» не є статистично значущою: усі довірчі інтервали накривають нуль. На горизонті «завтра» модель значущо гірша за базові лінії.
ROC-AUC моделі для головної цілі — 0.606, тобто певна здатність ранжувати є, але вона не конвертується в кращі ймовірності. Для рівня 3 найкраще ранжування дає та сама кліматологія (0.774).
Відповідно до §6 публікується кліматологічна оцінка, а вихід ансамблю зберігається в базі тінню для подальшого вимірювання. Рішення про це ухвалює внутрішня валідація всередині train, а не тестова вибірка.
9. Обмеження
- Домінування інерції. Вісім із десяти найвагоміших ознак — автокореляція власного ряду. Модель відтворює режим, а не механізм ухвалення рішень противником, і принципово не здатна передбачити зміну режиму.
- Нестаціонарність. Частка позитивів зросла з 53% (2024) до 81% (2026). Частина зростання пояснюється не інтенсивністю, а щільністю публікацій джерел: формат супроводу цілей став регулярним лише з 2024 року, тому дані до 2024 у навчанні не використовуються.
- Режимний зсув вересня 2026. З 05.09.2026 середні хвилини тривог у Києві впали з 553 до 179. Ознак, що описують цю зміну, у моделі немає; якщо режим триває, оцінки будуть систематично завищеними.
- Відсутність погодинного контуру. Сигнали з випередженням у години (зліт МіГ-31К, пуски з носіїв) на добовому горизонті не працюють: перевірено, 61% проти 61%. Для горизонту 1–2 години вони були б найінформативнішими, але такої моделі поки немає.
- Одне місто. Оцінка стосується лише Києва. Перенесення на інші міста потребує окремої розмітки, оскільки джерела й формат оголошення тривог відрізняються.
- Не є системою оповіщення. Оцінка описує добу цілком і не локалізує ні час, ні район, ні тип засобу.
Відтворюваність
Кожен виданий прогноз зберігається з часом видачі, складом ансамблю й розміром навчальної вибірки; рядки не перезаписуються. Порівняння прогнозів із фактом доступне у вивантаженні predictions.csv, вхідні дані — у daily_features.csv.