In [34]:
# Imports
from importlib import reload
import utils; reload(utils)
from utils import *
import losses; reload(losses)
from losses import approx_crps_cat, approx_crps_cat, crps_cost_function
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from collections import OrderedDict
import keras
from keras.layers import Input, Dense, merge, Embedding, Flatten, Dropout
from keras.layers.merge import Concatenate
from keras.models import Model
import keras.backend as K
from keras.callbacks import EarlyStopping
from keras.optimizers import SGD, Adam
from scipy.stats import binned_statistic
In [2]:
# Setup
# DATA_DIR = '/Volumes/STICK/data/ppnn_data/' # Mac
DATA_DIR = '/project/meteo/w2w/C7/ppnn_data/' # LMU
fclt = 48
In [3]:
train_dates = ['2010-01-01', '2016-01-01']
test_dates = ['2016-01-01', '2017-01-01']
train_set, test_set = get_train_test_sets(DATA_DIR, train_dates, test_dates)
In [4]:
# Define the bins
bin_width = 0.5
bin_edges = np.arange(-30, 35 + bin_width, bin_width)
bin_edges.shape
Out[4]:
In [5]:
def convert_targets(targets, bin_edges):
bin_idxs = binned_statistic(targets, targets, bins=bin_edges)[-1]
return keras.utils.to_categorical(bin_idxs, num_classes=bin_edges.shape[0]-1)
In [6]:
train_cat_targets = convert_targets(train_set.targets, bin_edges)
test_cat_targets = convert_targets(test_set.targets, bin_edges)
In [7]:
print('Obs:', test_set.targets[0])
plt.bar(bin_edges[:-1] + 0.25, test_cat_targets[0], width=0.5, zorder=0.1)
plt.axvline(test_set.targets[0], c='r')
plt.show()
In [8]:
def build_cat_model(n_features, hidden_nodes, n_bins):
inp = Input(shape=(n_features,))
x = Dense(hidden_nodes[0], activation='relu')(inp)
if len(hidden_nodes) > 1:
for h in hidden_nodes[1:]:
x = Dense(h, activation='relu')(x)
x = Dense(n_bins, activation='softmax')(x)
return Model(inputs=inp, outputs=x)
In [18]:
model = build_cat_model(2, [50], bin_edges.shape[0]-1)
In [19]:
model.compile(optimizer=Adam(0.01), loss=approx_crps_cat(bin_width))
In [20]:
model.summary()
In [21]:
model.fit(train_set.features, train_cat_targets, epochs=5, batch_size=4096,
validation_data=[test_set.features, test_cat_targets])
Out[21]:
In [24]:
preds = model.predict(test_set.features, batch_size=4096)
In [35]:
# Get correct CRPS
maybe_correct_cat_crps(preds, test_set.targets, bin_edges)
Out[35]:
In [26]:
i = 10
plt.bar(bin_edges[:-1] + 0.25, preds[i], width=0.5, alpha=0.8)
plt.bar(bin_edges[:-1] + 0.25, test_cat_targets[i], width=0.5, zorder=0.1)
plt.axvline(test_set.targets[i], c='r')
plt.show()
In [36]:
def convert_targets_nearest(targets, bin_edges):
mat_bin_edges = np.repeat(np.atleast_2d(bin_edges), targets.shape[0], axis=0).T
bin_idxs = np.argmin(np.abs(mat_bin_edges - targets),axis=0)
return keras.utils.to_categorical(bin_idxs, num_classes=bin_edges.shape[0]-1)
In [37]:
train_cat_targets_nearest = convert_targets_nearest(train_set.targets, bin_edges)
test_cat_targets_nearest = convert_targets_nearest(test_set.targets, bin_edges)
In [38]:
model = build_cat_model(2, [50], bin_edges.shape[0]-1)
In [39]:
model.compile(optimizer=Adam(0.01), loss=approx_crps_cat(bin_width))
In [40]:
model.fit(train_set.features, train_cat_targets_nearest, epochs=5, batch_size=1024,
validation_data=[test_set.features, test_cat_targets_nearest])
Out[40]:
In [43]:
model.optimizer.lr = 1e-3
In [44]:
model.fit(train_set.features, train_cat_targets_nearest, epochs=5, batch_size=1024,
validation_data=[test_set.features, test_cat_targets_nearest])
Out[44]:
In [45]:
preds = model.predict(test_set.features)
In [46]:
maybe_correct_cat_crps(preds, test_set.targets, bin_edges)
Out[46]:
In [103]:
for i in np.random.randint(0, 182218, 10):
plt.bar(bin_edges[:-1] + 0.25, preds[i], width=0.5, alpha=0.8)
plt.bar(bin_edges[:-1] + 0.25, test_cat_targets_nearest[i], width=0.5, zorder=0.1)
plt.axvline(test_set.targets[i], c='r')
plt.axvline(test_set.features[i, 0] * test_set.scale_factors[0], c='g')
plt.show()
In [101]:
plt.hist(test_set.targets, bins = 50);
In [43]:
model = build_cat_model(2, [50], bin_edges.shape[0]-1)
model.compile(optimizer=Adam(0.01), loss=approx_crps_cat(bin_width))
In [45]:
model.fit(train_set.features, train_cat_targets_nearest, epochs=5, batch_size=1024,
validation_split=0.2)
Out[45]:
Only at the end, try a more complex model.
In [49]:
model = build_cat_model(2, [500, 500], bin_edges.shape[0]-1)
model.compile(optimizer=Adam(0.01), loss=approx_crps_cat(bin_width))
In [50]:
model.fit(train_set.features, train_cat_targets_nearest, epochs=5, batch_size=1024,
validation_split=0.2)
Out[50]:
In [241]:
wide_bin_width = 1.5
wide_bin_edges = np.arange(-30, 35 + wide_bin_width, wide_bin_width)
In [242]:
wide_train_cat_targets = convert_targets_nearest(train_set.targets, wide_bin_edges)
wide_test_cat_targets = convert_targets_nearest(test_set.targets, wide_bin_edges)
In [243]:
model = build_cat_model(2, [50], wide_bin_edges.shape[0]-1)
In [244]:
model.summary()
In [253]:
model.compile(optimizer=Adam(0.0001), loss=approx_crps)
In [254]:
model.fit(train_set.features, wide_train_cat_targets, epochs=5, batch_size=1024,
validation_data=[test_set.features, wide_test_cat_targets])
Out[254]:
In [255]:
preds = model.predict(test_set.features)
In [69]:
i = 100447
plt.bar(wide_bin_edges[:-1] + 0.75, preds[i], width=1.5, alpha=0.8)
plt.bar(wide_bin_edges[:-1] + 0.75, wide_test_cat_targets[i], width=1.5, zorder=0.1)
plt.axvline(test_set.targets[i], c='r')
plt.show()
In [257]:
maybe_correct_cat_crps(preds, test_set.targets, wide_bin_edges)
Out[257]:
In [54]:
preds[:, 1].mean()
Out[54]:
In [57]:
# Create dummy dataset of means and stds
dummy_means = np.random.rand(100000) * 40. + 5
dummy_std = np.random.rand(100000) * 3.
In [58]:
# Create the corresponding PDFs in bins
dummy_bin_edges = np.arange(0, 50 + bin_width, bin_width)
In [ ]:
In [114]:
mean_error = test_set.features[:, 0] * test_set.scale_factors[0] - test_set.targets
In [115]:
mean_error.min(), mean_error.max()
Out[115]:
In [116]:
mean_error.argmin()
Out[116]:
In [117]:
np.mean(np.abs(mean_error))
Out[117]:
In [118]:
train_conv_targets = train_set.targets - train_set.features[:, 0] * train_set.scale_factors[0]
test_conv_targets = test_set.targets - test_set.features[:, 0] * test_set.scale_factors[0]
In [120]:
train_conv_targets.min(), train_conv_targets.max()
Out[120]:
In [121]:
conv_bin_edges = np.arange(-15, 20 + bin_width, bin_width)
In [122]:
conv_train_cat_targets_nearest = convert_targets_nearest(train_conv_targets, conv_bin_edges)
conv_test_cat_targets_nearest = convert_targets_nearest(test_conv_targets, conv_bin_edges)
In [123]:
model = build_cat_model(2, [50], conv_bin_edges.shape[0]-1)
model.compile(optimizer=Adam(0.01), loss=approx_crps_cat(bin_width))
In [124]:
model.fit(train_set.features, conv_train_cat_targets_nearest, epochs=5, batch_size=1024,
validation_data=[test_set.features, conv_test_cat_targets_nearest])
Out[124]:
In [125]:
preds = model.predict(test_set.features)
In [126]:
maybe_correct_cat_crps(preds, test_conv_targets, conv_bin_edges)
Out[126]:
In [128]:
for i in np.random.randint(0, 182218, 10):
print(i)
print(test_set.targets[i], test_set.features[i, 0] * test_set.scale_factors[0])
plt.bar(conv_bin_edges[:-1] + 0.25, preds[i], width=0.5, alpha=0.8)
plt.bar(conv_bin_edges[:-1] + 0.25, conv_test_cat_targets_nearest[i], width=0.5, zorder=0.1)
plt.axvline(test_conv_targets[i], c='r')
plt.show()
In [62]:
train_set_full_ens, test_set_full_ens = get_train_test_sets(DATA_DIR, train_dates, test_dates,
full_ensemble_t=True)
In [64]:
train_set_full_ens.features.shape
Out[64]:
In [181]:
model = build_cat_model(50, [50], bin_edges.shape[0]-1)
In [182]:
model.summary()
In [185]:
model.compile(optimizer=Adam(0.0001), loss=approx_crps)
In [186]:
model.fit(train_set_full_ens.features, train_cat_targets_nearest, epochs=10, batch_size=1024,
validation_data=[test_set_full_ens.features, test_cat_targets_nearest])
Out[186]:
In [187]:
preds = model.predict(test_set_full_ens.features)
In [188]:
maybe_correct_cat_crps(preds, test_set.targets, bin_edges)
Out[188]:
In [189]:
i = 10
plt.bar(bin_edges[:-1] + 0.25, preds[i], width=0.5, alpha=0.8)
plt.bar(bin_edges[:-1] + 0.25, test_cat_targets[i], width=0.5, zorder=0.1)
plt.axvline(test_set.targets[i], c='r')
plt.show()
In [190]:
def build_cat_conv_model(hidden_nodes, feature_size, n_bins, maps):
features_in = Input(shape=(feature_size, 1))
conv = Conv1D(maps, feature_size)(features_in)
conv = Flatten()(conv)
x = Dense(hidden_nodes, activation='relu')(conv)
x = Dense(n_bins, activation='softmax')(x)
model = Model(inputs=features_in, outputs=x)
return model
In [200]:
model = build_cat_conv_model(50, 50, bin_edges.shape[0]-1, 10)
In [201]:
model.summary()
In [204]:
model.compile(optimizer=Adam(0.0001), loss=approx_crps)
In [205]:
model.fit(np.atleast_3d(train_set_full_ens.features), train_cat_targets_nearest,
epochs=10, batch_size=1024,
validation_data=[np.atleast_3d(test_set_full_ens.features), test_cat_targets_nearest])
Out[205]:
In [ ]:
In [113]:
def build_hidden_model(hidden_nodes, feature_size=2):
inp = Input(shape=(feature_size,))
x = Dense(hidden_nodes, activation='relu')(inp)
x = Dense(2, activation='linear')(x)
return Model(inputs=inp, outputs=x)
In [114]:
model = build_hidden_model(50, 50)
model.compile(optimizer=Adam(0.01), loss=crps_cost_function)
In [115]:
model.fit(train_set_full_ens.features, train_set_full_ens.targets, epochs=5,
batch_size=1024,
validation_data=[test_set_full_ens.features, test_set_full_ens.targets])
Out[115]:
In [116]:
preds = model.predict(test_set_full_ens.features)
In [118]:
preds[10], test_set_full_ens.targets[10]
Out[118]:
In [129]:
def build_cat_emb_model(hidden_nodes, emb_size, max_id, feature_size, n_bins):
features_in = Input(shape=(feature_size,))
id_in = Input(shape=(1,))
emb = Embedding(max_id + 1, emb_size)(id_in)
emb = Flatten()(emb)
x = Concatenate()([features_in, emb])
x = Dense(hidden_nodes, activation='relu')(x)
x = Dense(n_bins, activation='softmax')(x)
model = Model(inputs=[features_in, id_in], outputs=x)
return model
In [130]:
emb_size = 5
max_id = int(np.max([train_set.cont_ids.max(), test_set.cont_ids.max()]))
max_id
Out[130]:
In [131]:
model = build_cat_emb_model(100, emb_size, max_id, 2, conv_bin_edges.shape[0]-1)
In [132]:
model.compile(optimizer=Adam(0.001), loss=approx_crps_cat(bin_width))
In [133]:
model.fit([train_set.features, train_set.cont_ids], conv_train_cat_targets_nearest,
epochs=5, batch_size=1024,
validation_data=[[test_set.features, test_set.cont_ids], conv_test_cat_targets_nearest])
Out[133]:
In [134]:
preds = model.predict([test_set.features, test_set.cont_ids])
In [135]:
maybe_correct_cat_crps(preds, test_conv_targets, conv_bin_edges)
Out[135]:
In [136]:
for i in np.random.randint(0, 182218, 10):
print(i)
print(test_set.targets[i], test_set.features[i, 0] * test_set.scale_factors[0])
plt.bar(conv_bin_edges[:-1] + 0.25, preds[i], width=0.5, alpha=0.8)
plt.bar(conv_bin_edges[:-1] + 0.25, conv_test_cat_targets_nearest[i], width=0.5, zorder=0.1)
plt.axvline(test_conv_targets[i], c='r')
plt.show()
In [137]:
train_set_full_ens, test_set_full_ens = get_train_test_sets(DATA_DIR, train_dates, test_dates,
full_ensemble_t=True)
In [138]:
model = build_cat_emb_model(100, emb_size, max_id, 50, conv_bin_edges.shape[0]-1)
In [139]:
model.compile(optimizer=Adam(0.001), loss=approx_crps_cat(bin_width))
In [141]:
model.fit([train_set_full_ens.features, train_set_full_ens.cont_ids], conv_train_cat_targets_nearest,
epochs=3, batch_size=1024,
validation_data=[[test_set_full_ens.features, test_set_full_ens.cont_ids],
conv_test_cat_targets_nearest])
Out[141]:
In [142]:
preds = model.predict([test_set_full_ens.features, test_set_full_ens.cont_ids])
In [143]:
maybe_correct_cat_crps(preds, test_conv_targets, conv_bin_edges)
Out[143]:
In [144]:
for i in np.random.randint(0, 182218, 10):
plt.bar(conv_bin_edges[:-1] + 0.25, preds[i], width=0.5, alpha=0.8)
plt.bar(conv_bin_edges[:-1] + 0.25, conv_test_cat_targets_nearest[i], width=0.5, zorder=0.1)
plt.axvline(test_conv_targets[i], c='r')
plt.show()
In [ ]:
In [135]:
model = build_cat_emb_model(100, emb_size, max_id, 2, bin_edges.shape[0]-1)
In [147]:
model.compile(optimizer=Adam(0.00001), loss=approx_crps)
In [148]:
model.fit([train_set.features, train_set.cont_ids], train_cat_targets_nearest,
epochs=10, batch_size=4096,
validation_data=[[test_set.features, test_set.cont_ids], test_cat_targets_nearest])
Out[148]:
In [149]:
preds = model.predict([test_set.features, test_set.cont_ids])
In [150]:
maybe_correct_cat_crps(preds, test_set.targets, bin_edges)
Out[150]:
In [151]:
i = 10
plt.bar(bin_edges[:-1] + 0.25, preds[i], width=0.5, alpha=0.8)
plt.bar(bin_edges[:-1] + 0.25, test_cat_targets[i], width=0.5, zorder=0.1)
plt.axvline(test_set.targets[i], c='r')
plt.show()
In [153]:
from keras.layers import Conv1D
In [158]:
def build_cat_emb_conv_model(hidden_nodes, emb_size, max_id, feature_size, n_bins, maps):
features_in = Input(shape=(feature_size, 1))
id_in = Input(shape=(1,))
emb = Embedding(max_id + 1, emb_size)(id_in)
emb = Flatten()(emb)
conv = Conv1D(maps, feature_size)(features_in)
conv = Flatten()(conv)
x = Concatenate()([conv, emb])
x = Dense(hidden_nodes, activation='relu')(x)
x = Dense(n_bins, activation='softmax')(x)
model = Model(inputs=[features_in, id_in], outputs=x)
return model
In [161]:
model = build_cat_emb_conv_model(100, emb_size, max_id, 50, bin_edges.shape[0]-1, 2)
In [162]:
model.summary()
In [166]:
model.compile(optimizer=Adam(0.0001), loss=approx_crps)
In [167]:
model.fit([np.atleast_3d(train_set_full_ens.features), train_set_full_ens.cont_ids],
train_cat_targets_nearest,
epochs=10, batch_size=4096,
validation_data=[[np.atleast_3d(test_set_full_ens.features), test_set_full_ens.cont_ids],
test_cat_targets_nearest])
Out[167]:
In [208]:
aux_dict = OrderedDict()
aux_dict['data_aux_geo_interpolated.nc'] = ['orog',
'station_alt',
'station_lat',
'station_lon']
aux_dict['data_aux_pl500_interpolated_00UTC.nc'] = ['u_pl500_fc',
'v_pl500_fc',
'gh_pl500_fc']
aux_dict['data_aux_pl850_interpolated_00UTC.nc'] = ['u_pl850_fc',
'v_pl850_fc',
'q_pl850_fc']
aux_dict['data_aux_surface_interpolated_00UTC.nc'] = ['cape_fc',
'sp_fc',
'tcc_fc']
In [212]:
train_set_aux, test_set_aux = get_train_test_sets(DATA_DIR, train_dates, test_dates,
aux_dict=aux_dict)
In [214]:
model = build_cat_model(train_set_aux.features.shape[1], [50], bin_edges.shape[0]-1)
In [215]:
model.summary()
In [223]:
model.compile(optimizer=Adam(0.0001), loss=approx_crps)
In [224]:
model.fit(train_set_aux.features, train_cat_targets_nearest, epochs=5, batch_size=1024,
validation_data=[test_set_aux.features, test_cat_targets_nearest])
Out[224]:
In [267]:
model = build_cat_emb_model(100, emb_size, max_id, train_set_aux.features.shape[1],
bin_edges.shape[0]-1)
In [268]:
model.summary()
In [274]:
model.compile(optimizer=Adam(0.00001), loss=approx_crps)
In [275]:
model.fit([train_set_aux.features, train_set_aux.cont_ids], train_cat_targets_nearest,
epochs=10, batch_size=4096,
validation_data=[[test_set_aux.features, test_set_aux.cont_ids],
test_cat_targets_nearest])
Out[275]:
In [226]:
train_set_aux_ens, test_set_aux_ens = get_train_test_sets(DATA_DIR, train_dates, test_dates,
aux_dict=aux_dict,
full_ensemble_t=True)
In [276]:
train_set_aux_ens.features.shape
Out[276]:
In [280]:
model = build_cat_emb_model(100, emb_size, max_id, train_set_aux_ens.features.shape[1],
bin_edges.shape[0]-1)
In [285]:
model.compile(optimizer=Adam(0.0001), loss=approx_crps)
In [286]:
model.fit([train_set_aux_ens.features, train_set_aux_ens.cont_ids], train_cat_targets_nearest,
epochs=10, batch_size=4096,
validation_data=[[test_set_aux_ens.features, test_set_aux_ens.cont_ids],
test_cat_targets_nearest])
Out[286]:
In [287]:
preds = model.predict([test_set_aux_ens.features, test_set_aux_ens.cont_ids])
In [288]:
maybe_correct_cat_crps(preds, test_set_aux_ens.targets, bin_edges)
Out[288]:
In [145]:
import xgboost as xgb
In [154]:
def convert_targets_nearest_idxs(targets, bin_edges):
mat_bin_edges = np.repeat(np.atleast_2d(bin_edges), targets.shape[0], axis=0).T
return np.argmin(np.abs(mat_bin_edges - targets),axis=0)
In [155]:
xgb_train_targets = convert_targets_nearest_idxs(train_conv_targets, conv_bin_edges)
xgb_test_targets = convert_targets_nearest_idxs(test_conv_targets, conv_bin_edges)
In [160]:
xgb_train_targets[:5]
Out[160]:
In [156]:
dtrain = xgb.DMatrix(train_set.features, xgb_train_targets,
feature_names=train_set.feature_names)
dtest = xgb.DMatrix(test_set.features, xgb_test_targets,
feature_names=test_set.feature_names)
In [169]:
our_params={
'eta':0.2,
'subsample':0.8,
'objective':'multi:softprob',
'eval_metric': 'mlogloss',
'num_class': conv_bin_edges.shape[0]-1
}
watchlist = [(dtest,'eval'), (dtrain,'train')]
In [170]:
bst=xgb.train(our_params, dtrain, 15, watchlist)
In [171]:
preds_xgb = bst.predict(dtest)
In [172]:
maybe_correct_cat_crps(preds_xgb, test_conv_targets, conv_bin_edges)
Out[172]:
In [175]:
for i in np.random.randint(0, 182218, 10):
print(i)
print(test_set.targets[i], test_set.features[i, 0] * test_set.scale_factors[0])
plt.bar(conv_bin_edges[:-1] + 0.25, preds_xgb[i], width=0.5, alpha=0.8, color='navy')
plt.bar(conv_bin_edges[:-1] + 0.25, preds[i], width=0.5, alpha=0.8, color='lightblue')
plt.bar(conv_bin_edges[:-1] + 0.25, conv_test_cat_targets_nearest[i], width=0.5, zorder=0.1)
plt.axvline(test_conv_targets[i], c='r')
plt.show()
In [ ]: