2025-06-15_ml_resultat#
1.1 Weather Ingest–modulen#
Källtabell:
weather_observationsi PostgreSQL/SQLite via SQLAlchemy.Primära kolumner:
timestamp(DateTime) – tidsstämpel för observationenlatitude,longitude(Float) – koordinater för varje mätpunktFyra feature-kolumner:
air_temperaturewind_speedwind_directionprecipitation_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=Falseanvänds för träning, vilket säkerställer att vi endast tränar på verkliga mätningar.
2.2 Metodik#
Tidsindex: alla rader per koordinat gruppas och reindexeras till 5-minutersintervall.
Identifiering av luckor: de tidspunkter där
air_temperatureärNaNochis_imputed=False.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=13wi∑i=13wixt−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")
Markering: imputerade rader sätts
is_imputed=Trueoch sparas tillbaka (medsession.merge).
3 Egna datamodellen för ML-träning#
3.1 Förberedelse#
Laddning: endast
is_imputed=False.Sortering på
timestampoch skapande av kolumnfuture_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#
Initialt höga R² på 5 min → lätt att prediktera korta skift med närbelägna observationer.
Stora dippar i PyTorch-spår → slumpmässig initiering + små batchstorlekar ger instabil träning.
Rullande testfönster → modellen möter nya dag-/natt-skift, vilket syns som dynamiska svängningar i R² över dagen.
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.