2025-06-15_ml_resultat#

1.1 Weather Ingest–modulen#

  • Källtabell: weather_observations i PostgreSQL/SQLite via SQLAlchemy.

  • Primära kolumner:

    • timestamp (DateTime) – tidsstämpel för observationen

    • latitude, longitude (Float) – koordinater för varje mätpunkt

    • Fyra feature-kolumner:

      • air_temperature

      • wind_speed

      • wind_direction

      • precipitation_amount

    • is_imputed (Boolean) – flagga som markerar om raden är imputerad eller verklig mätdata

1.2 Tidsupplösning#

  • Ursprunglig frekvens: varierande rådata, men vi resamplerar till fasta 5-minutersintervall.

  • Horisontskift: definierade som

    HORIZON_SHIFTS = {
      "5min": 1,    # 1 steg = 5 minuter
      "1h":   12,   # 12 steg = 1 timme
      "12h": 144,   # 144 steg = 12 timmar
      "24h": 288    # 288 steg = 24 timmar
    }
    
    

2 Imputation av saknade värden#

2.1 Varför imputation?#

  • Rådata innehåller luckor; en komplett tidsserie med fasta intervall krävs för tidsserie-split och ML-träning.

  • Endast rader med is_imputed=False används för träning, vilket säkerställer att vi endast tränar på verkliga mätningar.

2.2 Metodik#

  1. Tidsindex: alla rader per koordinat gruppas och reindexeras till 5-minutersintervall.

  2. Identifiering av luckor: de tidspunkter där air_temperature är NaN och is_imputed=False.

  3. Två imputationstekniker:

    • Viktat medelvärde (om de tre senaste verkliga observationerna finns):

      x^t=∑i=13wixt−iΔ∑i=13wi,w=[0.6, 0.3, 0.1] \hat x_t = \frac{\sum_{i=1}^3 w_i x_{t - i\Delta}}{\sum_{i=1}^3 w_i},\quad w = [0.6,\,0.3,\,0.1]x^t​=∑i=13​wi​∑i=13​wi​xt−iΔ​​,w=[0.6,0.3,0.1]

    • Linjär interpolation (om färre än tre tidigare mätningar finns): Tidsbaserad pandas.Series.interpolate(method="time")

  4. Markering: imputerade rader sätts is_imputed=True och sparas tillbaka (med session.merge).

3 Egna datamodellen för ML-träning#

3.1 Förberedelse#

  • Laddning: endast is_imputed=False.

  • Sortering på timestamp och skapande av kolumn future_air_temperature_<horizon>.

  • Bortfall av rader där någon feature eller framtida mål är NaN.

3.2 Split och trösklar#

  • Train/test-split: 80 % träning / 20 % test, utan shuffle (behåller tidsordning).

  • Minsta datapunkter:

    • För 5min: minst max(5, MIN_DATA_POINTS * 0.2) (lägre tröskel)

    • Övriga horisonter: minst MIN_DATA_POINTS_FOR_TRAINING (som standard 50)

4 Databegränsningar#

Begränsning

Konsekvens

Endast några dygns data

Låg volym → små testset → stora R²-fluktuationer

Obalanserad dag/natt-varians

Dygnscykler i temperatur → R² skenar vid låg varians (natt)

Spatialt fokus

En eller få koordinater (t.ex. en centralpunkt) → ingen generalisering över geografi

Enkla features

Saknar lufttryck, strålning, molntäcke etc. → begränsad prediktionskraft

Imputation

Introducerar artificiell ”smörjning” av luckor; imputerade värden kan dölja verkliga cykliska beteenden

5 Effekter på modellprestanda#

  1. Initialt höga R² på 5 min → lätt att prediktera korta skift med närbelägna observationer.

  2. Stora dippar i PyTorch-spår → slumpmässig initiering + små batchstorlekar ger instabil träning.

  3. Rullande testfönster → modellen möter nya dag-/natt-skift, vilket syns som dynamiska svängningar i R² över dagen.

  4. Långa horisonter (12–24 h) → exponentiellt större osäkerhet → lägre och mer varierande R².

6 Projektets syfte och tolkning#

  • Proof of Concept för arkitektur:

    • Docker + Kubernetes/Slurm-integration

    • Automatisk omträning via UI/REST

    • Versionshantering av modeller och loggning i databas

  • Inte en produktionstrogen vädermodell.

  • Tillräckligt “rätt”: alla kodflöden är implementerade korrekt, beteendet följer naturlagarna för tidsseriedata och små datamängder.