Radar Sinic (model otwarty): ryzyko zakwitu sinic z Sentinel-2
Modele LightGBM przewidujące, czy na kąpielisku wystąpią sinice (dziś, jutro, w ciągu 3 dni), wyłącznie z dwóch cech zdjęcia Sentinel-2 L2A (wycinek 2 x 2 km wokół kąpieliska):
s2_ndci_p90- 90. percentyl NDCI = (B5 - B4) / (B5 + B4) na pikselach wody: jak zielona jest woda;s2_scum_frac- odsetek pikseli wody z kożuchem (FVI = (B8 - B4) / (B8 + B4) > 0,2 i B8 > 0,03).
Bez pogody, Sentinel-3 i położenia kąpieliska. Cechy liczy model/features.py projektu
„Radar Sinic” (Analiza Danych Przestrzennych). Etykieta uczenia: oceny wody sanepidu
(zamknięcia kąpielisk z powodu zakwitu sinic).
- Walidacja „w przód”: uczenie na sezonach 2023–2025, test na sezonie 2026.
- Pliki:
model_<cel>_open_S2.txt, celey_cyano_0(dziś),y_cyano_1(jutro),y_cyano_3d(3 dni).
Użycie
import lightgbm as lgb
from huggingface_hub import hf_hub_download
path = hf_hub_download("lustachowicz/radar-sinic-open", "model_y_cyano_0_open_S2.txt")
model = lgb.Booster(model_file=path)
p = model.predict([[0.12, 0.03]]) # s2_ndci_p90, s2_scum_frac
Ograniczenia
- Słabszy od modelu pełnego (satelity, pogoda, położenie) i od rankingu „historia” (kąpieliska z największą liczbą zamknięć w poprzednich latach) - tabela niżej.
- Bez bezchmurnego zdjęcia (ostatnie 10 dni) cechy są puste - model widzi tylko brak danych.
- Bez temperatury wody: poza sezonem może dawać fałszywe alarmy.
- Etykieta sanepidu jest rzadka i „post factum”: zakwity, których nikt nie zbadał, nie są w danych.
- Model nie zastępuje komunikatów sanepidu.
Wyniki (raport z treningu)
Model otwarty: tylko Sentinel-2
Cechy (2): s2_ndci_p90, s2_scum_frac. Bez pogody, Sentinel-3, dryfu i położenia. Sanepid tylko jako etykieta. Uczenie: [2023, 2024, 2025], test: [2026], protokół jak w train.py.
Cel: y_cyano_0
41901 wierszy testu, 590 z sinicami. 28 drzew, próg 0.04, ROC-AUC w CV 0.729.
| Wariant | ROC-AUC | PR-AUC | precyzja | czułość | F1 | top 10 | top 20 | top 50 |
|---|---|---|---|---|---|---|---|---|
| losowo | 0.496 | 0.014 | – | – | – | 3% | 6% | 11% |
| historia | 0.881 | 0.294 | – | – | – | 35% | 42% | 60% |
| open: S2 | 0.82 | 0.094 | 0.077 | 0.425 | 0.13 | 18% | 28% | 44% |
| v1: S2 (closed) | 0.905 | 0.335 | 0.335 | 0.436 | 0.378 | 43% | 53% | 67% |
| v3: S2 + S3 + dryf (closed) | 0.905 | 0.34 | 0.426 | 0.412 | 0.419 | 43% | 55% | 68% |
Cel: y_cyano_1
41305 wierszy testu, 587 z sinicami. 17 drzew, próg 0.02, ROC-AUC w CV 0.708.
| Wariant | ROC-AUC | PR-AUC | precyzja | czułość | F1 | top 10 | top 20 | top 50 |
|---|---|---|---|---|---|---|---|---|
| losowo | 0.501 | 0.015 | – | – | – | 3% | 6% | 12% |
| historia | 0.881 | 0.294 | – | – | – | 35% | 42% | 60% |
| open: S2 | 0.817 | 0.103 | 0.052 | 0.678 | 0.097 | 21% | 27% | 48% |
| v1: S2 (closed) | 0.904 | 0.34 | 0.518 | 0.342 | 0.412 | 43% | 54% | 69% |
| v3: S2 + S3 + dryf (closed) | 0.905 | 0.336 | 0.494 | 0.373 | 0.425 | 44% | 56% | 67% |
Cel: y_cyano_3d
41305 wierszy testu, 763 z sinicami. 31 drzew, próg 0.04, ROC-AUC w CV 0.679.
| Wariant | ROC-AUC | PR-AUC | precyzja | czułość | F1 | top 10 | top 20 | top 50 |
|---|---|---|---|---|---|---|---|---|
| losowo | 0.507 | 0.019 | – | – | – | 3% | 5% | 11% |
| historia | 0.874 | 0.277 | – | – | – | 29% | 38% | 57% |
| open: S2 | 0.777 | 0.09 | 0.079 | 0.515 | 0.137 | 16% | 23% | 41% |
| v1: S2 (closed) | 0.884 | 0.317 | 0.495 | 0.312 | 0.383 | 35% | 46% | 62% |
| v3: S2 + S3 + dryf (closed) | 0.88 | 0.325 | 0.486 | 0.303 | 0.373 | 35% | 46% | 62% |