Maj 2026, ažurirano nakon uvođenja 11-modelskog ansambla

Tačnije vremenske prognoze za Budvu

Korigovana prognoza za narednih 48 sati, satni detalji i grafovi su dostupni na stranici za live prognozu.

Ovo je lokalni sistem za korekciju vremenske prognoze za Budvu. Ne pokušavam da zamijenim ECMWF, GFS, ICON ili regionalne modele. Ideja je drugačija: uzeti njihove prognoze, uporediti ih sa stvarnim mjerenjima u Budvi, naučiti gdje sistematski griješe, pa napraviti korekciju za jednu konkretnu lokaciju.

Budva je nezgodna tačka za modele. More je odmah ispred stanice, planine su odmah iza grada, a lokalni pljuskovi i bura često zavise od detalja koje globalna mreža ne vidi. Zato sirova prognoza može biti odlična za opšti region, ali promašiti temperaturu, vjetar ili završetak kiše baš u Budvi.

Sistem danas koristi 11 modela, mjerenja sa Weather Underground stanice IBUDVA5, istorijske bias tabele, prethodne runs, temperaturu mora i XGBoost korekciju po parametru. Rezultat se zapisuje u forecast_48h.json, a sajt ga prikazuje kao live prognozu.

Šta se zapravo radi

Svaki run prolazi kroz isti tok: preuzimanje prognoza, spajanje modela, kreiranje feature-a, primjena korekcionih modela i izvoz rezultata za sajt. Najvažnije je da se sve radi u lokalnom vremenu Europe/Podgorica. Bez toga se lako desi da gledaš 17:00 u UTC, a misliš da gledaš 17:00 u Budvi.

  1. Open-Meteo se poziva za 11 modela na koordinatama Budve: 42.2864, 18.84.
  2. Svi satni podaci se poravnavaju u Europe/Podgorica vremenu.
  3. Računaju se ansambl statistike: prosjek, medijan, raspon, standardna devijacija i slaganje modela.
  4. Dodaju se lokalni feature-i: mjesec, sat, sezona, more, prethodni runs, istorijski bias i cross-parameter signali.
  5. Za svaki parametar se primjenjuje trenirani model korekcije.
  6. Weather code se usklađuje sa korigovanom kišom i oblačnošću, da sajt ne prikaže kišu ako finalni model kaže suvo.

Problem

Globalni meteorološki modeli rade ogroman posao: simuliraju atmosferu za cijelu planetu ili veliki region. Ali nijedan od njih nije treniran za jednu tačku između Jadrana i Lovćena. Ako model ima grid od 9, 13 ili 25 kilometara, Budva nije samo Budva, nego prosjek ćelije koja uključuje more, obalu i planinu.

Tu nastaje sistematska greška, odnosno bias. Neki modeli Budvu hlade previše noću, neki precjenjuju vjetar, neki kasne sa završetkom padavina, a neki od 0.10 mm naprave utisak da će sigurno padati kiša. Poenta ovog projekta je da te ponavljajuće greške ne ignorišemo, nego da ih izmjerimo i iskoristimo.

Metodologija

Mean Absolute Error (MAE)

Najvažnija metrika je MAE, srednja apsolutna greška. Za svaki sat uzmem razliku između prognoze i stvarnog mjerenja, uklonim znak, pa izračunam prosjek.

\[ MAE = \frac{1}{n}\sum_{i=1}^{n}\left|y_{\text{pred},i} - y_{\text{true},i}\right| \]

Ako je MAE temperature 0.86°C, to znači da korigovana prognoza u prosjeku promašuje temperaturu za manje od jednog stepena. To je metrika koja se lako čita jer ostaje u istoj jedinici kao originalna varijabla: °C, m/s, hPa, %, mm.

MSE i RMSE

MSE kvadrira grešku, pa velike promašaje kažnjava mnogo jače. RMSE je korijen iz MSE-a i vraća rezultat u originalnu jedinicu.

\[ MSE = \frac{1}{n}\sum_{i=1}^{n}\left(y_{\text{pred},i} - y_{\text{true},i}\right)^2 \]
\[ RMSE = \sqrt{\frac{1}{n}\sum_{i=1}^{n}\left(y_{\text{pred},i} - y_{\text{true},i}\right)^2} \]

Ako su MAE i RMSE blizu, greške su uglavnom stabilne veličine. Ako je RMSE mnogo veći od MAE, to znači da model povremeno napravi velike promašaje.

Bias

Bias mjeri smjer greške. Pozitivan bias znači da model precjenjuje vrijednost, negativan da je potcjenjuje.

\[ Bias = \frac{1}{n}\sum_{i=1}^{n}\left(y_{\text{pred},i} - y_{\text{true},i}\right) \]

Ovo je posebno korisno za Budvu jer su greške često sistematske. Ako jedan model stalno pothlađuje obalnu temperaturu uveče, XGBoost može naučiti da ga u tim uslovima pomjeri naviše.

Modeli koji ulaze

Trenutna produkcija koristi 11 izvora. Neki su globalni, neki regionalni, neki bolje hvataju sinoptičku sliku, a neki lokalnije obalne i planinske efekte.

Za većinu parametara ansambl koristi sve modele. Za padavine trenutno eksperimentišem sa jednim trusted signalom: ItaliaMeteo. KNMI i DMI ostaju u ansamblu i feature-ima, ali za sada ne mogu sami otvoriti rain gate. Ako ItaliaMeteo ne vidi barem 0.10 mm, korekcioni model prikazuje suvo.

Kako XGBoost popravlja prognozu

XGBoost je ansambl stabala odlučivanja. Konačna predikcija je suma doprinosa mnogo malih stabala. Svako novo stablo pokušava da popravi greške prethodnih.

\[ \hat{y}_i = \sum_{k=1}^{K} f_k(x_i), \qquad f_k \in \mathcal{F} \]

U praksi, model ne dobija samo jednu sirovu prognozu. Dobija više od hiljadu feature-a: vrijednosti svih modela, njihove razlike, ansambl statistike, sat i sezonu, istorijski bias, SST, prethodne runs i interakcije između parametara.

Trening minimizira loss funkciju uz regularizaciju. Prvi dio kaže koliko model griješi, a drugi dio kažnjava previše kompleksna stabla.

\[ \mathcal{L} = \sum_{i=1}^{n}\ell(\hat{y}_i, y_i) + \sum_{k=1}^{K}\Omega(f_k) \]
\[ \Omega(f) = \gamma T + \frac{1}{2}\lambda\sum_{j=1}^{T}w_j^2 + \alpha\sum_{j=1}^{T}|w_j| \]

Kada XGBoost odlučuje da li da podijeli čvor u stablu, računa dobitak za split. Split se pravi samo ako je gain dovoljno koristan.

\[ Gain = \frac{1}{2}\left[ \frac{G_L^2}{H_L+\lambda} + \frac{G_R^2}{H_R+\lambda} - \frac{G^2}{H+\lambda} \right] - \gamma \]

Residual, direct i blend

Za neke parametre model direktno predviđa finalnu vrijednost. Za neke je bolje da predviđa rezidual, odnosno koliko ansambl treba pomjeriti. Za neke parametre se koristi blend: dio XGBoost, dio sirovi ansambl.

Rezidualni pristup je često prirodniji za temperaturu, tačku rose i pritisak, jer sirovi modeli već imaju dobru fiziku. XGBoost tada ne izmišlja atmosferu od nule, nego uči lokalnu korekciju: plus 0.6°C u jednom režimu, minus 0.4°C u drugom.

Huber loss

Huber loss je kompromis između MSE i MAE. Male greške tretira glatko kao MSE, a velike greške tretira robusnije kao MAE. To pomaže da rijetki ekstremi ne preuzmu cijeli trening.

\[ L_\delta(a)= \begin{cases} \frac{1}{2}a^2, & |a|\leq\delta \\ \delta\left(|a|-\frac{1}{2}\delta\right), & |a|>\delta \end{cases} \]

Padavine su poseban slučaj

Kiša nije kao temperatura. Većina sati je potpuno suva, a kada padavine postoje, često su lokalne i kratke. Zato običan prosjek svih modela može razvodniti signal, ali i jedan sitan model signal može napraviti lažnu kišu.

Trenutno pravilo za prikaz je strože nego prije: ako je korigovana padavina ispod 0.20 mm, sajt je tretira kao 0.0. To direktno rješava situacije gdje se prikazivala ikonica kiše zbog 0.10 ili 0.15 mm, iako modeli praktično govore da je suvo.

\[ rain_{\text{shown}} = \left(precip_{\text{corrected}} \geq 0.20\text{ mm}\right) \land \left(ItaliaMeteo \geq 0.10\text{ mm}\right) \]
Bitno: ako ItaliaMeteo vidi makar 0.10 mm, korekcioni model ne smije to ignorisati. Ali KNMI i DMI su za sada samo inputi ansambla i korekcionog modela; ne pale trusted rain gate dok ne uporedimo rezultate.

Rezultati

Na osnovu validacionog seta, XGBoost korekcija najviše pomaže na parametrima koji imaju stabilan bias: temperaturi, pritisku, vjetru, oblačnosti i vlažnosti. Padavine se čitaju opreznije, jer su često lokalne, nelinearne i vremenski pomjerene za sat-dva.

Učitavanje podataka o tačnosti...

Šta sajt dobija

Na kraju, sve ovo postoji da bi live stranica bila korisnija. Korisnik ne mora da zna XGBoost, gain ili Huber loss. On treba da vidi: koliko će biti stepeni, da li ima realne kiše, kakav je vjetar, i koliko se korigovana prognoza razlikuje od sirovog ansambla.

Ograničenja

Ovo nije novi fizički vremenski model. Ovo je korekcija postojećih modela. Ako nijedan ulazni model ne vidi pljusak, XGBoost može prepoznati uslove koji favorizuju padavine, ali ne može pouzdano odrediti tačan položaj, početak i kraj lokalne konvektivne ćelije.

Najveća poboljšanja su tamo gdje postoji stabilan, ponavljajući bias. Najveći rizik ostaje kod konvektivnih padavina, kratkih pljuskova i situacija kada je granica kiše baš preko Budve. Zato je za padavine važno čuvati i raw signale, trusted modele i lokalni nowcast kada je dostupan.

Još grafika iz stare analize

Ove slike ostaju korisne jer pokazuju zašto je korekcija uopšte potrebna.

Sistematski bias temperature i vjetra Heatmap sezonskog biasa Ukupno rangiranje modela

Zaključak

Najbolja prognoza za Budvu ne dolazi iz slijepog vjerovanja jednom modelu. Dolazi iz mjerenja, poređenja, učenja grešaka i stalnog provjeravanja. Modeli daju fiziku atmosfere; lokalna stanica daje istinu na terenu; XGBoost povezuje jedno i drugo.

Produkcijska verzija je dostupna na live prognozi. Kod je otvoren na GitHubu.