{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Deep ensemble for ENSO-forecasting\n", "\n", "In this tutorial you learn how to use a neural network model called Deep Ensemble (DE) for the ENSO forecasting. This network architecture was initially developed [Lakshminarayanan et al. (2017)](https://papers.nips.cc/paper/7219-simple-and-scalable-predictive-uncertainty-estimation-using-deep-ensembles.pdf). \n", "\n", "DEs are feed foreword neural networks that predict the mean and the standard deviation of a Gaussian. Hence, their predicion comes with an uncertainty estimation which is a valuable feature for ENSO-forecasting." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Create a data pipe line\n", "\n", "At first, we define a data pipeline. This is in general quite useful to keep your code clean and also to reuse the pipeline for later purpose.\n", "\n", "The data pipeline generates returns:\n", "\n", "1. The feature array\n", "\n", "2. The label array\n", "\n", "3. The time array corresponding to the time of the label\n", "\n", "NOTE (again): Lead time is defined as the time that passed between the last observed and the first date of the target season. Hence, negative appear, e.g. if you compare the DJF season with the target season JFM, you have a lead time of -2 month (Last observed date: Feburary 28/29, First date of the target season January 1)." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "from sklearn.preprocessing import StandardScaler\n", "\n", "from ninolearn.utils import include_time_lag\n", "from ninolearn.IO.read_processed import data_reader\n", "\n", "def pipeline(lead_time):\n", " \"\"\"\n", " Data pipeline for the processing of the data before the Deep Ensemble\n", " is trained.\n", "\n", " :type lead_time: int\n", " :param lead_time: The lead time in month.\n", "\n", " :returns: The feature \"X\" (at observation time), the label \"y\" (at lead\n", " time), the target season \"timey\" (least month)\n", " \"\"\"\n", " reader = data_reader(startdate='1980-01', enddate='2018-12')\n", "\n", " # indeces\n", " oni = reader.read_csv('oni')\n", " iod = reader.read_csv('iod')\n", " wwv = reader.read_csv('wwv')\n", "\n", " # seasonal cycle\n", " sc = np.cos(np.arange(len(oni))/12*2*np.pi)\n", "\n", " # network metrics\n", " network_ssh = reader.read_statistic('network_metrics', variable='sst', dataset='ERSSTv5', processed=\"anom\")\n", " c2 = network_ssh['fraction_clusters_size_2']\n", " H = network_ssh['corrected_hamming_distance']\n", "\n", " # time lag\n", " time_lag = 12\n", "\n", " # shift such that lead time corresponds to the definition of lead time\n", " shift = 3\n", "\n", " # process features\n", " feature_unscaled = np.stack((oni, sc, wwv, iod,\n", " c2, H), axis=1)\n", "\n", " # scale each feature\n", " scalerX = StandardScaler()\n", " Xorg = scalerX.fit_transform(feature_unscaled)\n", "\n", " # set nans to 0.\n", " Xorg = np.nan_to_num(Xorg)\n", "\n", " # arange the feature array\n", " X = Xorg[:-lead_time-shift,:]\n", " X = include_time_lag(X, max_lag=time_lag)\n", "\n", " # arange label\n", " yorg = oni.values\n", " y = yorg[lead_time + time_lag + shift:]\n", "\n", " # get the time axis of the label\n", " timey = oni.index[lead_time + time_lag + shift:]\n", "\n", " return X, y, timey" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Split the data set\n", "\n", "For the training and testing of machine learning models it is crucial to split the data set into:\n", "\n", "1. __Train data set__ which is used to train the weights of the neural network\n", "\n", "2. __Validation data set__ which is used to check for overfitting (e.g. when using early stopping) and to optimize the hyperparameters \n", "\n", "3. __Test data set__ which is used to to evaluate the trained model. \n", "\n", "__NOTE:__ It is important to understand that hyperparamters must be tuned so that the result is best for the Validation data set and __not__ for the test data set. Otherwise you can not rule out the case that the specific hyperparameter setting just works good for the specific test data set but is not generally a good hyperparameter setting.\n", "\n", "In the following cell the train and the validation data set are still one data set, because this array will be later splitted into two arrays when th model is fitted." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "import keras.backend as K\n", "from ninolearn.learn.models.dem import DEM\n", "\n", "# clear memory from previous sessions\n", "K.clear_session()\n", "\n", "# define the lead time\n", "lead_time = 3\n", "\n", "# get the features (X), the label (y) and \n", "# the time axis of the label (timey)\n", "X, y, timey = pipeline(lead_time)\n", "\n", "# split the data set into \n", "test_indeces = (timey>='2001-01-01') & (timey<='2018-12-01')\n", "train_val_indeces = np.invert(test_indeces)\n", "\n", "train_val_X, train_val_y, train_val_timey = X[train_val_indeces,:], y[train_val_indeces], timey[train_val_indeces]\n", "testX, testy, testtimey = X[test_indeces,:], y[test_indeces], timey[test_indeces]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Fit the model\n", "\n", "Now it is time to train the model! For this a random search is used for all keyword arguments that are passed in a *list* to the DEM.set_parameters() method. " ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Search iteration Nr 1/20\n", "Train member Nr 1/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00052: early stopping\n", "46/46 [==============================] - 0s 84us/step\n", "Train member Nr 2/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00132: early stopping\n", "46/46 [==============================] - 0s 71us/step\n", "Train member Nr 3/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00059: early stopping\n", "46/46 [==============================] - 0s 50us/step\n", "Train member Nr 4/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00031: early stopping\n", "46/46 [==============================] - 0s 50us/step\n", "Train member Nr 5/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00096: early stopping\n", "46/46 [==============================] - 0s 46us/step\n", "Loss: 0.3823194860116296\n", "Computation time: 8.8s\n", "New best hyperparameters\n", "Mean loss: 0.3823194860116296\n", "{'layers': 1, 'neurons': 16, 'dropout': 0.41903529337320344, 'noise_in': 0.10347229433415084, 'noise_sigma': 0.2047585880842553, 'noise_mu': 0.49594753897933586, 'l1_hidden': 0.13152395470050957, 'l2_hidden': 0.08330581312568477, 'l1_mu': 0.15149749010743152, 'l2_mu': 0.11593669948708028, 'l1_sigma': 0.09967560356729449, 'l2_sigma': 0.1244877471669649, 'lr': 0.004634984622626636, 'batch_size': 100, 'epochs': 500, 'n_segments': 5, 'n_members_segment': 1, 'patience': 30, 'verbose': 0, 'pdf': 'normal', 'n_members': 5}\n", "Search iteration Nr 2/20\n", "Train member Nr 1/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00119: early stopping\n", "46/46 [==============================] - 0s 77us/step\n", "Train member Nr 2/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00071: early stopping\n", "46/46 [==============================] - 0s 44us/step\n", "Train member Nr 3/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00044: early stopping\n", "46/46 [==============================] - 0s 46us/step\n", "Train member Nr 4/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00031: early stopping\n", "46/46 [==============================] - 0s 91us/step\n", "Train member Nr 5/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00040: early stopping\n", "46/46 [==============================] - 0s 50us/step\n", "Loss: 0.536129170332266\n", "Computation time: 8.8s\n", "Search iteration Nr 3/20\n", "Train member Nr 1/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00054: early stopping\n", "46/46 [==============================] - 0s 73us/step\n", "Train member Nr 2/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00060: early stopping\n", "46/46 [==============================] - 0s 51us/step\n", "Train member Nr 3/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00041: early stopping\n", "46/46 [==============================] - 0s 46us/step\n", "Train member Nr 4/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00031: early stopping\n", "46/46 [==============================] - 0s 51us/step\n", "Train member Nr 5/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00150: early stopping\n", "46/46 [==============================] - 0s 83us/step\n", "Loss: 0.35812768055045086\n", "Computation time: 9.1s\n", "New best hyperparameters\n", "Mean loss: 0.35812768055045086\n", "{'layers': 1, 'neurons': 16, 'dropout': 0.4969969924220081, 'noise_in': 0.19616484546423987, 'noise_sigma': 0.19645462330381283, 'noise_mu': 0.3658885794233012, 'l1_hidden': 0.18712187452622892, 'l2_hidden': 0.06757120513272023, 'l1_mu': 0.030331377920337535, 'l2_mu': 0.053227700652674396, 'l1_sigma': 0.02411236317733605, 'l2_sigma': 0.040351529483836225, 'lr': 0.005768259463912277, 'batch_size': 100, 'epochs': 500, 'n_segments': 5, 'n_members_segment': 1, 'patience': 30, 'verbose': 0, 'pdf': 'normal', 'n_members': 5}\n", "Search iteration Nr 4/20\n", "Train member Nr 1/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00046: early stopping\n", "46/46 [==============================] - 0s 65us/step\n", "Train member Nr 2/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00031: early stopping\n", "46/46 [==============================] - 0s 60us/step\n", "Train member Nr 3/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00036: early stopping\n", "46/46 [==============================] - 0s 70us/step\n", "Train member Nr 4/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00057: early stopping\n", "46/46 [==============================] - 0s 48us/step\n", "Train member Nr 5/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00047: early stopping\n", "46/46 [==============================] - 0s 55us/step\n", "Loss: 0.3036035604774952\n", "Computation time: 8.5s\n", "New best hyperparameters\n", "Mean loss: 0.3036035604774952\n", "{'layers': 1, 'neurons': 16, 'dropout': 0.23004481921165137, 'noise_in': 0.46270830851367095, 'noise_sigma': 0.45638086691256086, 'noise_mu': 0.2680286780681471, 'l1_hidden': 0.07392628874726237, 'l2_hidden': 0.18280564143180358, 'l1_mu': 0.03358655835944029, 'l2_mu': 0.04964944019738571, 'l1_sigma': 0.1284721092428513, 'l2_sigma': 0.06915923429350067, 'lr': 0.007624401534440948, 'batch_size': 100, 'epochs': 500, 'n_segments': 5, 'n_members_segment': 1, 'patience': 30, 'verbose': 0, 'pdf': 'normal', 'n_members': 5}\n", "Search iteration Nr 5/20\n", "Train member Nr 1/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00081: early stopping\n", "46/46 [==============================] - 0s 75us/step\n", "Train member Nr 2/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00104: early stopping\n", "46/46 [==============================] - 0s 48us/step\n", "Train member Nr 3/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00065: early stopping\n", "46/46 [==============================] - 0s 53us/step\n", "Train member Nr 4/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00031: early stopping\n", "46/46 [==============================] - 0s 109us/step\n", "Train member Nr 5/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00092: early stopping\n", "46/46 [==============================] - 0s 53us/step\n", "Loss: 0.46464331263433334\n", "Computation time: 11.1s\n", "Search iteration Nr 6/20\n", "Train member Nr 1/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00067: early stopping\n", "46/46 [==============================] - 0s 48us/step\n", "Train member Nr 2/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00202: early stopping\n", "46/46 [==============================] - 0s 48us/step\n", "Train member Nr 3/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00058: early stopping\n", "46/46 [==============================] - 0s 78us/step\n", "Train member Nr 4/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00031: early stopping\n", "46/46 [==============================] - 0s 76us/step\n", "Train member Nr 5/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00145: early stopping\n", "46/46 [==============================] - 0s 54us/step\n", "Loss: 0.38047359326611396\n", "Computation time: 10.3s\n", "Search iteration Nr 7/20\n", "Train member Nr 1/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00044: early stopping\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "46/46 [==============================] - 0s 52us/step\n", "Train member Nr 2/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00048: early stopping\n", "46/46 [==============================] - 0s 49us/step\n", "Train member Nr 3/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00031: early stopping\n", "46/46 [==============================] - 0s 109us/step\n", "Train member Nr 4/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00031: early stopping\n", "46/46 [==============================] - 0s 68us/step\n", "Train member Nr 5/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00031: early stopping\n", "46/46 [==============================] - 0s 46us/step\n", "Loss: 0.5316211005915765\n", "Computation time: 9.0s\n", "Search iteration Nr 8/20\n", "Train member Nr 1/5\n", "--------------------------------------\n", "46/46 [==============================] - 0s 71us/step\n", "Train member Nr 2/5\n", "--------------------------------------\n", "46/46 [==============================] - 0s 72us/step\n", "Train member Nr 3/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00031: early stopping\n", "46/46 [==============================] - 0s 81us/step\n", "Train member Nr 4/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00031: early stopping\n", "46/46 [==============================] - 0s 85us/step\n", "Train member Nr 5/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00031: early stopping\n", "46/46 [==============================] - 0s 52us/step\n", "Loss: 0.5255566728503809\n", "Computation time: 12.6s\n", "Search iteration Nr 9/20\n", "Train member Nr 1/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00081: early stopping\n", "46/46 [==============================] - 0s 76us/step\n", "Train member Nr 2/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00083: early stopping\n", "46/46 [==============================] - 0s 54us/step\n", "Train member Nr 3/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00044: early stopping\n", "46/46 [==============================] - 0s 51us/step\n", "Train member Nr 4/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00031: early stopping\n", "46/46 [==============================] - 0s 74us/step\n", "Train member Nr 5/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00081: early stopping\n", "46/46 [==============================] - 0s 82us/step\n", "Loss: 0.27809078570293344\n", "Computation time: 9.2s\n", "New best hyperparameters\n", "Mean loss: 0.27809078570293344\n", "{'layers': 1, 'neurons': 16, 'dropout': 0.39958636593035646, 'noise_in': 0.2801139377909808, 'noise_sigma': 0.23157012188768117, 'noise_mu': 0.35653555105103407, 'l1_hidden': 0.09710335042994389, 'l2_hidden': 0.030661447903490638, 'l1_mu': 0.15575931599607082, 'l2_mu': 0.11771970888833305, 'l1_sigma': 0.1712642514949432, 'l2_sigma': 0.06606412633278731, 'lr': 0.0053689200750857225, 'batch_size': 100, 'epochs': 500, 'n_segments': 5, 'n_members_segment': 1, 'patience': 30, 'verbose': 0, 'pdf': 'normal', 'n_members': 5}\n", "Search iteration Nr 10/20\n", "Train member Nr 1/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00135: early stopping\n", "46/46 [==============================] - 0s 78us/step\n", "Train member Nr 2/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00111: early stopping\n", "46/46 [==============================] - 0s 39us/step\n", "Train member Nr 3/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00105: early stopping\n", "46/46 [==============================] - 0s 62us/step\n", "Train member Nr 4/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00031: early stopping\n", "46/46 [==============================] - 0s 80us/step\n", "Train member Nr 5/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00077: early stopping\n", "46/46 [==============================] - 0s 47us/step\n", "Loss: 0.22250935001217803\n", "Computation time: 11.0s\n", "New best hyperparameters\n", "Mean loss: 0.22250935001217803\n", "{'layers': 1, 'neurons': 16, 'dropout': 0.17954696328551784, 'noise_in': 0.48765233117205986, 'noise_sigma': 0.2344138299710665, 'noise_mu': 0.28641868136528587, 'l1_hidden': 0.07373889141305061, 'l2_hidden': 0.06504845804389796, 'l1_mu': 0.07739008026671873, 'l2_mu': 0.05793634510447043, 'l1_sigma': 0.07610942970011525, 'l2_sigma': 0.13103696054979164, 'lr': 0.004272988853087075, 'batch_size': 100, 'epochs': 500, 'n_segments': 5, 'n_members_segment': 1, 'patience': 30, 'verbose': 0, 'pdf': 'normal', 'n_members': 5}\n", "Search iteration Nr 11/20\n", "Train member Nr 1/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00053: early stopping\n", "46/46 [==============================] - 0s 71us/step\n", "Train member Nr 2/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00047: early stopping\n", "46/46 [==============================] - 0s 49us/step\n", "Train member Nr 3/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00039: early stopping\n", "46/46 [==============================] - 0s 54us/step\n", "Train member Nr 4/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00031: early stopping\n", "46/46 [==============================] - 0s 118us/step\n", "Train member Nr 5/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00071: early stopping\n", "46/46 [==============================] - 0s 68us/step\n", "Loss: 0.35565991032382716\n", "Computation time: 10.1s\n", "Search iteration Nr 12/20\n", "Train member Nr 1/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00082: early stopping\n", "46/46 [==============================] - 0s 82us/step\n", "Train member Nr 2/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00077: early stopping\n", "46/46 [==============================] - 0s 70us/step\n", "Train member Nr 3/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00034: early stopping\n", "46/46 [==============================] - 0s 104us/step\n", "Train member Nr 4/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00031: early stopping\n", "46/46 [==============================] - 0s 55us/step\n", "Train member Nr 5/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00121: early stopping\n", "46/46 [==============================] - 0s 53us/step\n", "Loss: 0.25811459438308426\n", "Computation time: 10.8s\n", "Search iteration Nr 13/20\n", "Train member Nr 1/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00115: early stopping\n", "46/46 [==============================] - 0s 61us/step\n", "Train member Nr 2/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00040: early stopping\n", "46/46 [==============================] - 0s 75us/step\n", "Train member Nr 3/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00042: early stopping\n", "46/46 [==============================] - 0s 49us/step\n", "Train member Nr 4/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00122: early stopping\n", "46/46 [==============================] - 0s 49us/step\n", "Train member Nr 5/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00042: early stopping\n", "46/46 [==============================] - 0s 66us/step\n", "Loss: 0.29950643440951474\n", "Computation time: 9.8s\n", "Search iteration Nr 14/20\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Train member Nr 1/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00107: early stopping\n", "46/46 [==============================] - 0s 96us/step\n", "Train member Nr 2/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00031: early stopping\n", "46/46 [==============================] - 0s 54us/step\n", "Train member Nr 3/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00058: early stopping\n", "46/46 [==============================] - 0s 168us/step\n", "Train member Nr 4/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00031: early stopping\n", "46/46 [==============================] - 0s 73us/step\n", "Train member Nr 5/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00032: early stopping\n", "46/46 [==============================] - 0s 123us/step\n", "Loss: 0.5440963976409124\n", "Computation time: 15.5s\n", "Search iteration Nr 15/20\n", "Train member Nr 1/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00032: early stopping\n", "46/46 [==============================] - 0s 152us/step\n", "Train member Nr 2/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00040: early stopping\n", "46/46 [==============================] - 0s 150us/step\n", "Train member Nr 3/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00054: early stopping\n", "46/46 [==============================] - 0s 103us/step\n", "Train member Nr 4/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00041: early stopping\n", "46/46 [==============================] - 0s 133us/step\n", "Train member Nr 5/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00059: early stopping\n", "46/46 [==============================] - 0s 150us/step\n", "Loss: 0.28715189351983694\n", "Computation time: 20.9s\n", "Search iteration Nr 16/20\n", "Train member Nr 1/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00095: early stopping\n", "46/46 [==============================] - 0s 193us/step\n", "Train member Nr 2/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00033: early stopping\n", "46/46 [==============================] - 0s 59us/step\n", "Train member Nr 3/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00105: early stopping\n", "46/46 [==============================] - 0s 146us/step\n", "Train member Nr 4/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00034: early stopping\n", "46/46 [==============================] - 0s 82us/step\n", "Train member Nr 5/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00045: early stopping\n", "46/46 [==============================] - 0s 95us/step\n", "Loss: 0.513937189883512\n", "Computation time: 21.3s\n", "Search iteration Nr 17/20\n", "Train member Nr 1/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00112: early stopping\n", "46/46 [==============================] - 0s 156us/step\n", "Train member Nr 2/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00088: early stopping\n", "46/46 [==============================] - 0s 67us/step\n", "Train member Nr 3/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00031: early stopping\n", "46/46 [==============================] - 0s 152us/step\n", "Train member Nr 4/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00031: early stopping\n", "46/46 [==============================] - 0s 89us/step\n", "Train member Nr 5/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00181: early stopping\n", "46/46 [==============================] - 0s 127us/step\n", "Loss: 0.3518007106755091\n", "Computation time: 21.9s\n", "Search iteration Nr 18/20\n", "Train member Nr 1/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00105: early stopping\n", "46/46 [==============================] - 0s 126us/step\n", "Train member Nr 2/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00128: early stopping\n", "46/46 [==============================] - 0s 66us/step\n", "Train member Nr 3/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00033: early stopping\n", "46/46 [==============================] - 0s 67us/step\n", "Train member Nr 4/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00031: early stopping\n", "46/46 [==============================] - 0s 155us/step\n", "Train member Nr 5/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00061: early stopping\n", "46/46 [==============================] - 0s 105us/step\n", "Loss: 0.38344535646231276\n", "Computation time: 22.7s\n", "Search iteration Nr 19/20\n", "Train member Nr 1/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00079: early stopping\n", "46/46 [==============================] - 0s 286us/step\n", "Train member Nr 2/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00073: early stopping\n", "46/46 [==============================] - 0s 169us/step\n", "Train member Nr 3/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00041: early stopping\n", "46/46 [==============================] - 0s 106us/step\n", "Train member Nr 4/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00033: early stopping\n", "46/46 [==============================] - 0s 67us/step\n", "Train member Nr 5/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00057: early stopping\n", "46/46 [==============================] - 0s 82us/step\n", "Loss: 0.32215388132178263\n", "Computation time: 20.3s\n", "Search iteration Nr 20/20\n", "Train member Nr 1/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00065: early stopping\n", "46/46 [==============================] - 0s 136us/step\n", "Train member Nr 2/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00084: early stopping\n", "46/46 [==============================] - 0s 96us/step\n", "Train member Nr 3/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00032: early stopping\n", "46/46 [==============================] - 0s 60us/step\n", "Train member Nr 4/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00031: early stopping\n", "46/46 [==============================] - 0s 246us/step\n", "Train member Nr 5/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00047: early stopping\n", "46/46 [==============================] - 0s 132us/step\n", "Loss: 0.4694813759430595\n", "Computation time: 20.6s\n", "Refit the model with best hyperparamters\n", "{'layers': 1, 'neurons': 16, 'dropout': 0.17954696328551784, 'noise_in': 0.48765233117205986, 'noise_sigma': 0.2344138299710665, 'noise_mu': 0.28641868136528587, 'l1_hidden': 0.07373889141305061, 'l2_hidden': 0.06504845804389796, 'l1_mu': 0.07739008026671873, 'l2_mu': 0.05793634510447043, 'l1_sigma': 0.07610942970011525, 'l2_sigma': 0.13103696054979164, 'lr': 0.004272988853087075, 'batch_size': 100, 'epochs': 500, 'n_segments': 5, 'n_members_segment': 1, 'patience': 30, 'verbose': 0, 'pdf': 'normal', 'n_members': 5}\n", "Train member Nr 1/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00067: early stopping\n", "46/46 [==============================] - 0s 71us/step\n", "Train member Nr 2/5\n", "--------------------------------------\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Restoring model weights from the end of the best epoch\n", "Epoch 00160: early stopping\n", "46/46 [==============================] - 0s 306us/step\n", "Train member Nr 3/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00061: early stopping\n", "46/46 [==============================] - 0s 276us/step\n", "Train member Nr 4/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00031: early stopping\n", "46/46 [==============================] - 0s 191us/step\n", "Train member Nr 5/5\n", "--------------------------------------\n", "Restoring model weights from the end of the best epoch\n", "Epoch 00047: early stopping\n", "46/46 [==============================] - 0s 178us/step\n", "Loss: 0.3001609052652898\n", "Computation time: 21.4s\n", "best loss search: 0.22250935001217803\n", "loss refitting : 0.3001609052652898\n" ] } ], "source": [ "# initiated an instance of the DEM (Deep Ensemble Model) class\n", "model = DEM()\n", "\n", "# Set parameters\n", "model.set_hyperparameters(layers=1, neurons=16, dropout=[0.1, 0.5], noise_in=[0.1,0.5], noise_sigma=[0.1,0.5],\n", " noise_mu=[0.1,0.5], l1_hidden=[0.0, 0.2], l2_hidden=[0., 0.2],\n", " l1_mu=[0.0, 0.2], l2_mu=[0.0, 0.2], l1_sigma=[0.0, 0.2],\n", " l2_sigma=[0.0, 0.2], lr=[0.0001,0.01], batch_size=100, epochs=500, n_segments=5,\n", " n_members_segment=1, patience=30, verbose=0, pdf='normal')\n", "\n", "\n", "\n", "# Use a random search to find the optimal hyperparamteres\n", "model.fit_RandomizedSearch(train_val_X, train_val_y, n_iter=20)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Make predictions for the test data set\n", "Now we can use the trained models to make predicitons on the test data set to evaluate how good the model perfoms on a data set that it never saw before." ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "pred_mean, pred_std = model.predict(testX)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Plot the prediction\n", "Let's see how the predicion is looking like" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "from ninolearn.plot.prediction import plot_prediction\n", "import pandas as pd\n", "\n", "plt.subplots(figsize=(15,3.5))\n", "plt.axhspan(-0.5,\n", " -6,\n", " facecolor='blue',\n", " alpha=0.1,zorder=0)\n", "\n", "plt.axhspan(0.5,\n", " 6,\n", " facecolor='red',\n", " alpha=0.1,zorder=0)\n", "\n", "plt.xlim(testtimey[0], testtimey[-1])\n", "plt.ylim(-3,3)\n", "\n", "# plot the prediction\n", "plot_prediction(testtimey, pred_mean, std=pred_std, facecolor='royalblue', line_color='navy')\n", "\n", "# plot the observation\n", "plt.plot(timey, y, \"k\")\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Evaluate the model\n", "\n", "We can evaluate the model a bit more quantitatively using the loss function that was used to train the model, namely the negative-log-likelihood of the Gaussian and the correlation between the predicted mean and the observed ONI index." ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Loss (Negative-Log-Likelihood): 0.19635278216131088\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from ninolearn.plot.evaluation import plot_correlation\n", "\n", "loss = model.evaluate(testy, pred_mean, pred_std)\n", "print(f\"Loss (Negative-Log-Likelihood): {loss}\")\n", "\n", "# make a plot of the seasonal correaltion\n", "# note: - pd.tseries.offsets.MonthBegin(1) appears to ensure that the correlations are plotted\n", "# agains the correct season\n", "plot_correlation(testy, pred_mean, testtimey - pd.tseries.offsets.MonthBegin(1), title=\"\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.7" } }, "nbformat": 4, "nbformat_minor": 2 }