Commit 2da32f66 authored by Aaron Spring's avatar Aaron Spring 🚼
Browse files

write rps loss function

parent 7ddae19b
Pipeline #208313 passed with stage
in 9 minutes and 11 seconds
%% Cell type:markdown id: tags:
# Train ML model to correct predictions of week 3-4 & 5-6
This notebook create a Machine Learning `ML_model` to predict weeks 3-4 & 5-6 based on `S2S` weeks 3-4 & 5-6 forecasts and is compared to `CPC` observations for the [`s2s-ai-challenge`](https://s2s-ai-challenge.github.io/).
%% Cell type:markdown id: tags:
# Synopsis
%% Cell type:markdown id: tags:
## Method: `ML-based mean bias reduction`
- calculate the ML-based bias from 2000-2019 deterministic ensemble mean forecast
- remove that the ML-based bias from 2020 forecast deterministic ensemble mean forecast
%% Cell type:markdown id: tags:
## Data used
type: renku datasets
Training-input for Machine Learning model:
- hindcasts of models:
- ECMWF: `ecmwf_hindcast-input_2000-2019_biweekly_deterministic.zarr`
Forecast-input for Machine Learning model:
- real-time 2020 forecasts of models:
- ECMWF: `ecmwf_forecast-input_2020_biweekly_deterministic.zarr`
Compare Machine Learning model forecast against against ground truth:
- `CPC` observations:
- `hindcast-like-observations_biweekly_deterministic.zarr`
- `forecast-like-observations_2020_biweekly_deterministic.zarr`
%% Cell type:markdown id: tags:
## Resources used
for training, details in reproducibility
- platform: renku
- memory: 8 GB
- processors: 2 CPU
- storage required: 10 GB
%% Cell type:markdown id: tags:
## Safeguards
All points have to be [x] checked. If not, your submission is invalid.
Changes to the code after submissions are not possible, as the `commit` before the `tag` will be reviewed.
(Only in exceptions and if previous effort in reproducibility can be found, it may be allowed to improve readability and reproducibility after November 1st 2021.)
%% Cell type:markdown id: tags:
### Safeguards to prevent [overfitting](https://en.wikipedia.org/wiki/Overfitting?wprov=sfti1)
If the organizers suspect overfitting, your contribution can be disqualified.
- [x] We did not use 2020 observations in training (explicit overfitting and cheating)
- [x] We did not repeatedly verify my model on 2020 observations and incrementally improved my RPSS (implicit overfitting)
- [x] We provide RPSS scores for the training period with script `print_RPS_per_year`, see in section 6.3 `predict`.
- [x] We tried our best to prevent [data leakage](https://en.wikipedia.org/wiki/Leakage_(machine_learning)?wprov=sfti1).
- [x] We honor the `train-validate-test` [split principle](https://en.wikipedia.org/wiki/Training,_validation,_and_test_sets). This means that the hindcast data is split into `train` and `validate`, whereas `test` is withheld.
- [x] We did not use `test` explicitly in training or implicitly in incrementally adjusting parameters.
- [x] We considered [cross-validation](https://en.wikipedia.org/wiki/Cross-validation_(statistics)).
%% Cell type:markdown id: tags:
### Safeguards for Reproducibility
Notebook/code must be independently reproducible from scratch by the organizers (after the competition), if not possible: no prize
- [x] All training data is publicly available (no pre-trained private neural networks, as they are not reproducible for us)
- [x] Code is well documented, readable and reproducible.
- [x] Code to reproduce training and predictions is preferred to run within a day on the described architecture. If the training takes longer than a day, please justify why this is needed. Please do not submit training piplelines, which take weeks to train.
%% Cell type:markdown id: tags:
# Todos to improve template
This is just a demo.
- [ ] use multiple predictor variables and two predicted variables
- [ ] for both `lead_time`s in one go
- [ ] consider seasonality, for now all `forecast_time` months are mixed
- [ ] make probabilistic predictions with `category` dim, for now works deterministic
%% Cell type:markdown id: tags:
# Imports
%% Cell type:code id: tags:
``` python
from tensorflow.keras.layers import Input, Dense, Flatten
from tensorflow.keras.models import Sequential
from tensorflow import keras
import matplotlib.pyplot as plt
import xarray as xr
xr.set_options(display_style='text')
import numpy as np
from dask.utils import format_bytes
import xskillscore as xs
%load_ext tensorboard
```
%%%% Output: stream
/opt/conda/lib/python3.8/site-packages/xarray/backends/cfgrib_.py:27: UserWarning: Failed to load cfgrib - most likely there is a problem accessing the ecCodes library. Try `import cfgrib` to get the full error message
warnings.warn(
%% Cell type:markdown id: tags:
# Get training data
preprocessing of input data may be done in separate notebook/script
%% Cell type:markdown id: tags:
## Hindcast
get weekly initialized hindcasts
%% Cell type:code id: tags:
``` python
v='t2m'
```
%% Cell type:code id: tags:
``` python
# preprocessed as renku dataset
!renku storage pull ../data/ecmwf_hindcast-input_2000-2019_biweekly_deterministic.zarr
```
%%%% Output: stream
Warning: Run CLI commands only from project's root directory.

%% Cell type:code id: tags:
``` python
hind_2000_2019 = xr.open_zarr("../data/ecmwf_hindcast-input_2000-2019_biweekly_deterministic.zarr", consolidated=True)
```
%%%% Output: stream
/opt/conda/lib/python3.8/site-packages/xarray/backends/plugins.py:61: RuntimeWarning: Engine 'cfgrib' loading failed:
/opt/conda/lib/python3.8/site-packages/gribapi/_bindings.cpython-38-x86_64-linux-gnu.so: undefined symbol: codes_bufr_key_is_header
warnings.warn(f"Engine {name!r} loading failed:\n{ex}", RuntimeWarning)
%% Cell type:markdown id: tags:
## Forecast
%% Cell type:code id: tags:
``` python
# preprocessed as renku dataset
!renku storage pull ../data/ecmwf_forecast-input_2020_biweekly_deterministic.zarr
```
%%%% Output: stream
Warning: Run CLI commands only from project's root directory.

%% Cell type:code id: tags:
``` python
fct_2020 = xr.open_zarr("../data/ecmwf_forecast-input_2020_biweekly_deterministic.zarr", consolidated=True)
```
%% Cell type:markdown id: tags:
## Observations
corresponding to hindcasts
%% Cell type:code id: tags:
``` python
# preprocessed as renku dataset
#!renku storage pull ../data/hindcast-like-observations_2000-2019_biweekly_deterministic.zarr
```
%% Cell type:code id: tags:
``` python
#obs_2000_2019 = xr.open_zarr("../data/hindcast-like-observations_2000-2019_biweekly_deterministic.zarr", consolidated=True)#[v]
```
%% Cell type:code id: tags:
``` python
# preprocessed as renku dataset
#!renku storage pull ../data/forecast-like-observations_2020_biweekly_deterministic.zarr
```
%% Cell type:code id: tags:
``` python
#obs_2020 = xr.open_zarr("../data/forecast-like-observations_2020_biweekly_deterministic.zarr", consolidated=True)#[v]
```
%% Cell type:code id: tags:
``` python
```
categorized in terciles corresponding to hindcasts/forecasts
%% Cell type:code id: tags:
``` python
!renku storage pull ../data/hindcast-like-observations_2000-2019_biweekly_terciled.zarr
```
%%%% Output: stream
Warning: Run CLI commands only from project's root directory.

%% Cell type:code id: tags:
``` python
obs_2000_2019_p = xr.open_dataset(f'../data/hindcast-like-observations_2000-2019_biweekly_terciled.zarr', engine='zarr')
obs_2000_2019_p.sizes
```
%%%% Output: execute_result
Frozen(SortedKeysDict({'category': 3, 'forecast_time': 1060, 'latitude': 121, 'lead_time': 2, 'longitude': 240}))
%% Cell type:code id: tags:
``` python
obs_2000_2019_p = obs_2000_2019_p.assign_coords(category=[0,1,2])
obs_2000_2019_p = (obs_2000_2019_p * obs_2000_2019_p.category).sum('category', skipna=False).compute()
obs_2000_2019_p2 = obs_2000_2019_p.assign_coords(category=[0,1,2])
obs_2000_2019_p2 = (obs_2000_2019_p2 * obs_2000_2019_p2.category).sum('category', skipna=False).compute()
#obs_2000_2019_p.isel(forecast_time=[2,4]).t2m.plot(col='lead_time', row='forecast_time')
#obs_2000_2019_p2.isel(forecast_time=[2,4]).t2m.plot(col='lead_time', row='forecast_time')
```
%% Cell type:code id: tags:
``` python
obs_2000_2019_p[v].isel(lead_time=1,forecast_time=2).plot()
obs_2020_p = xr.open_dataset(f'../data/forecast-like-observations_2020_biweekly_terciled.nc')
obs_2020_p2 = obs_2020_p.assign_coords(category=[0,1,2])
obs_2020_p2 = (obs_2020_p2 * obs_2020_p2.category).sum('category', skipna=False).compute()
```
%%%% Output: execute_result
<matplotlib.collections.QuadMesh at 0x7f6937fce400>
%%%% Output: display_data
![](data:image/png;base64,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)
%% Cell type:markdown id: tags:
# ML model
%% Cell type:markdown id: tags:
based on [Weatherbench](https://github.com/pangeo-data/WeatherBench/blob/master/quickstart.ipynb)
%% Cell type:code id: tags:
``` python
# run once only and dont commit
!git clone https://github.com/pangeo-data/WeatherBench/
```
%%%% Output: stream
fatal: destination path 'WeatherBench' already exists and is not an empty directory.
%% Cell type:code id: tags:
``` python
import sys
sys.path.insert(1, 'WeatherBench')
from WeatherBench.src.train_nn import DataGenerator, PeriodicConv2D, create_predictions
import tensorflow.keras as keras
```
%% Cell type:code id: tags:
``` python
bs=32
import numpy as np
class DataGenerator(keras.utils.Sequence):
def __init__(self, fct, verif, lead_time, batch_size=bs, shuffle=True, load=True,
mean=None, std=None):
def __init__(self, fct, verif, lead_time, batch_size=bs, shuffle=True, load=True):
"""
Data generator for WeatherBench data.
Template from https://stanford.edu/~shervine/blog/keras-how-to-generate-data-on-the-fly
Args:
fct: forecasts from S2S models: xr.DataArray (xr.Dataset doesnt work properly)
verif: observations with same dimensionality (xr.Dataset doesnt work properly)
lead_time: Lead_time as in model
batch_size: Batch size
shuffle: bool. If True, data is shuffled.
load: bool. If True, datadet is loaded into RAM.
mean: If None, compute mean from data.
std: If None, compute standard deviation from data.
Todo:
- use number in a better way, now uses only ensemble mean forecast
- dont use .sel(lead_time=lead_time) to train over all lead_time at once
- be sensitive with forecast_time, pool a few around the weekofyear given
- use more variables as predictors
- predict more variables
"""
if isinstance(fct, xr.Dataset):
print('convert fct to array')
fct = fct.to_array().transpose(...,'variable')
self.fct_dataset=True
else:
self.fct_dataset=False
if isinstance(verif, xr.Dataset):
print('convert verif to array')
verif = verif.to_array().transpose(...,'variable')
self.verif_dataset=True
else:
self.verif_dataset=False
#self.fct = fct
self.batch_size = batch_size
self.shuffle = shuffle
self.lead_time = lead_time
self.fct_data = fct.transpose('forecast_time', ...).sel(lead_time=lead_time)
self.fct_mean = self.fct_data.mean('forecast_time').compute() if mean is None else mean
self.fct_std = self.fct_data.std('forecast_time').compute() if std is None else std
self.fct_mean = self.fct_data.mean('forecast_time').compute()
self.fct_std = self.fct_data.std('forecast_time').compute()
self.verif_data = verif.transpose('forecast_time', ...).sel(lead_time=lead_time)
self.verif_mean = self.verif_data.mean('forecast_time').compute() if mean is None else mean
self.verif_std = self.verif_data.std('forecast_time').compute() if std is None else std
#self.verif_mean = self.verif_data.mean('forecast_time').compute() if mean is None else mean
#self.verif_std = self.verif_data.std('forecast_time').compute() if std is None else std
# Normalize
self.fct_data = (self.fct_data - self.fct_mean) / self.fct_std
# self.verif_data = (self.verif_data - self.verif_mean) / self.verif_std
#self.verif_data = (self.verif_data - self.verif_mean) / self.verif_std
#self.verif_data = self.verif_data.astype('int32')
self.n_samples = self.fct_data.forecast_time.size
self.forecast_time = self.fct_data.forecast_time
self.on_epoch_end()
# For some weird reason calling .load() earlier messes up the mean and std computations
if load:
# print('Loading data into RAM')
self.fct_data.load()
def __len__(self):
'Denotes the number of batches per epoch'
return int(np.ceil(self.n_samples / self.batch_size))
def __getitem__(self, i):
'Generate one batch of data'
idxs = self.idxs[i * self.batch_size:(i + 1) * self.batch_size]
# got all nan if nans not masked
X = self.fct_data.isel(forecast_time=idxs).fillna(0.).values
y = self.verif_data.isel(forecast_time=idxs).fillna(0.).values
X = self.fct_data.isel(forecast_time=idxs).values
y = self.verif_data.isel(forecast_time=idxs).values
return X, y
def on_epoch_end(self):
'Updates indexes after each epoch'
self.idxs = np.arange(self.n_samples)
if self.shuffle == True:
np.random.shuffle(self.idxs)
```
%% Cell type:code id: tags:
``` python
# 2 bi-weekly `lead_time`: week 3-4
lead = hind_2000_2019.isel(lead_time=0).lead_time
lead
```
%%%% Output: execute_result
<xarray.DataArray 'lead_time' ()>
array(1209600000000000, dtype='timedelta64[ns]')
Coordinates:
lead_time timedelta64[ns] 14 days
Attributes:
comment: lead_time describes bi-weekly aggregates. The pd.Timedelta corr...
%% Cell type:code id: tags:
``` python
# mask, needed?
hind_2000_2019 = hind_2000_2019.where(obs_2000_2019_p.isel(forecast_time=0, lead_time=0,drop=True).notnull())
```
%% Cell type:code id: tags:
``` python
mask = obs_2000_2019_p.isel(forecast_time=0, lead_time=0,drop=True).notnull()
mask = obs_2000_2019_p2.isel(forecast_time=0, lead_time=0,drop=True).notnull()
```
%% Cell type:markdown id: tags:
## data prep: train, valid, test
[Use the hindcast period to split train and valid.](https://en.wikipedia.org/wiki/Training,_validation,_and_test_sets) Do not use the 2020 data for testing!
%% Cell type:code id: tags:
``` python
# time is the forecast_time
time_train_start,time_train_end='2000','2015' # train
time_valid_start,time_valid_end='2016','2019' # valid
time_train_start,time_train_end='2000','2017' # train
time_valid_start,time_valid_end='2018','2019' # valid
time_test = '2020' # test
```
%% Cell type:code id: tags:
``` python
# Jan only
season='DJF'
tattr='month'
tattr_label=1
attr='seaon'
attr_label='DJF'
bs=16
hind_2000_2019 = hind_2000_2019.sel(forecast_time=hind_2000_2019.forecast_time.dt.season==season)#.sel(forecast_time=hind_2000_2019.forecast_time.dt.day==2)
obs_2000_2019_p = obs_2000_2019_p.sel(forecast_time=obs_2000_2019_p.forecast_time.dt.season==season)#.sel(obs_2000_2019_p=hind_2000_2019.forecast_time.dt.day==2)
hind_2000_2019 = hind_2000_2019.sel(forecast_time=getattr(hind_2000_2019.forecast_time.dt, tattr)==tattr_label)
obs_2000_2019_p2 = obs_2000_2019_p2.sel(forecast_time=getattr(obs_2000_2019_p2.forecast_time.dt, tattr)==tattr_label)
```
%% Cell type:code id: tags:
``` python
dg_train = DataGenerator(
hind_2000_2019.mean('realization').sel(forecast_time=slice(time_train_start,time_train_end))[v],
obs_2000_2019_p.sel(forecast_time=slice(time_train_start,time_train_end))[v],
obs_2000_2019_p2.sel(forecast_time=slice(time_train_start,time_train_end))[v],
lead_time=lead, batch_size=bs, shuffle=True, load=True)
```
%%%% Output: stream
/opt/conda/lib/python3.8/site-packages/dask/array/numpy_compat.py:40: RuntimeWarning: invalid value encountered in true_divide
x = np.divide(x1, x2, out)
/opt/conda/lib/python3.8/site-packages/dask/array/numpy_compat.py:40: RuntimeWarning: invalid value encountered in true_divide
x = np.divide(x1, x2, out)
/opt/conda/lib/python3.8/site-packages/dask/array/numpy_compat.py:40: RuntimeWarning: invalid value encountered in true_divide
x = np.divide(x1, x2, out)
/opt/conda/lib/python3.8/site-packages/dask/array/numpy_compat.py:40: RuntimeWarning: invalid value encountered in true_divide
x = np.divide(x1, x2, out)
%% Cell type:code id: tags:
``` python
dg_valid = DataGenerator(
hind_2000_2019.mean('realization').sel(forecast_time=slice(time_valid_start,time_valid_end))[v],
obs_2000_2019_p.sel(forecast_time=slice(time_valid_start,time_valid_end))[v],
obs_2000_2019_p2.sel(forecast_time=slice(time_valid_start,time_valid_end))[v],
lead_time=lead, batch_size=bs, shuffle=False, load=True)
```
%%%% Output: stream
/opt/conda/lib/python3.8/site-packages/dask/array/numpy_compat.py:40: RuntimeWarning: invalid value encountered in true_divide
x = np.divide(x1, x2, out)
/opt/conda/lib/python3.8/site-packages/dask/array/numpy_compat.py:40: RuntimeWarning: invalid value encountered in true_divide
x = np.divide(x1, x2, out)
/opt/conda/lib/python3.8/site-packages/dask/array/numpy_compat.py:40: RuntimeWarning: invalid value encountered in true_divide
x = np.divide(x1, x2, out)
/opt/conda/lib/python3.8/site-packages/dask/array/numpy_compat.py:40: RuntimeWarning: invalid value encountered in true_divide
x = np.divide(x1, x2, out)
%% Cell type:code id: tags:
``` python
# do not use, delete?
#dg_test = DataGenerator(
# fct_2020.mean('realization').sel(forecast_time=time_test)[v],
# obs_2020.sel(forecast_time=time_test)[v],
# lead_time=lead, batch_size=bs, load=True, mean=dg_train.fct_mean, std=dg_train.fct_std, shuffle=False)
dg_test = DataGenerator(
fct_2020.mean('realization').sel(forecast_time=time_test)[v],
obs_2020_p2.sel(forecast_time=time_test)[v],
lead_time=lead, batch_size=bs, shuffle=False, load=True)
```
%% Cell type:code id: tags:
``` python
X, y = dg_train[0]
X.shape, y.shape
```
%%%% Output: execute_result
((16, 121, 240), (16, 121, 240))
%% Cell type:code id: tags:
``` python
X, y = dg_valid[0]
X.shape, y.shape
```
%%%% Output: execute_result
((16, 121, 240), (16, 121, 240))
((10, 121, 240), (10, 121, 240))
%% Cell type:code id: tags:
``` python
# short look into training data
# any problem from normalizing?
i=4
xr.DataArray(np.vstack([X[i],y[i]])).plot(yincrease=False, robust=True)
#xr.DataArray(np.vstack([X[i],y[i]])).plot(yincrease=False, robust=True)
```
%%%% Output: execute_result
<matplotlib.collections.QuadMesh at 0x7f69544ffbb0>
%%%% Output: display_data
![](data:image/png;base64,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)
%% Cell type:markdown id: tags:
## `fit`
%% Cell type:code id: tags:
``` python
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Convolution2D, MaxPooling2D, Flatten, Dense
from tensorflow.keras.layers import Convolution2D, MaxPooling2D, Flatten, Dense, Dropout
```
%% Cell type:code id: tags:
``` python
y.shape
```
%%%% Output: execute_result
(16, 121, 240)
%% Cell type:code id: tags:
``` python
dr=.01
cnn = keras.models.Sequential([
PeriodicConv2D(filters=32, kernel_size=5, conv_kwargs={'activation':'elu'},