{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load in \n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the \"../input/\" directory.\n# For example, running this (by clicking run or pressing Shift+Enter) will list the files in the input directory\n\nimport os\nDATADIR = \"../input/LANL-Earthquake-Prediction\"\n\nprint(os.listdir(DATADIR))\n\n# Any results you write to the current directory are saved as output.\n\ndev_mode = True","execution_count":1,"outputs":[{"output_type":"stream","text":"['test', 'sample_submission.csv', 'train.csv']\n","name":"stdout"}]},{"metadata":{"trusted":true},"cell_type":"code","source":"df = pd.read_csv(os.path.join(DATADIR, 'train.csv'),\n                 dtype={'acoustic_data': np.int16, 'time_to_failure': np.float64})","execution_count":2,"outputs":[]},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true},"cell_type":"code","source":"import lanl_generator_py as lanl_generator\n\nclasses = lanl_generator.get_lanl_classes()\ndf_segments = lanl_generator.classify_segments(df, classes)\nfolder = lanl_generator.FoldGenerator(df_segments)","execution_count":3,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class FeatureGenerator(object):\n    QUANTILES = [0.05, 0.95]\n    QUANTILE_MEAN = [-2.1, 11.2]\n    QUANTILE_STD = [2.3, 2.3]\n\n    FREQUENCY_MEAN = -2.4\n    FREQUENCY_STD = 0.9\n\n    STD_CLIP_MAX = 8\n\n    FREQUENCIES = [191, 198, 190, 211]\n\n    def shape(self):\n        return (1 + len(self.QUANTILES) + len(self.FREQUENCIES), )\n\n    def feature_names(self):\n        names = ['s_std']\n        for q in self.QUANTILES:\n            names.append('q{0}'.format(q))\n        for f in self.FREQUENCIES:\n            names.append('f{0}m'.format(f))\n        return names\n\n    @classmethod\n    def fft_analysis(cls, y_data):\n        yf = np.fft.fft(y_data)\n        # positive\n        yf = yf[:, : y_data.size // 2]\n        # top frequencies\n        yf = yf[:, 64:320]\n        yf = yf / y_data.size\n        epsilon = 1.0e-9\n        y_fft = np.log(np.abs(yf) + epsilon)\n\n        # normalize\n        y_fft = (y_fft - cls.FREQUENCY_MEAN) / cls.FREQUENCY_STD\n        return y_fft\n\n\n    def generate(self, df: pd.DataFrame, predict=False):\n        values = df['acoustic_data'].values\n\n        qdata = [np.quantile(values, q) for q in self.QUANTILES]\n        def q_clip(q, i, sigma=1):\n            m = self.QUANTILE_MEAN[i]\n            s = self.QUANTILE_STD[i]\n            return np.clip(q, m - sigma * s, m + sigma * s)\n    \n        qdata = [q_clip(q, i) for i, q in enumerate(qdata)]\n        Q = np.array(qdata)\n        \n        y = values.reshape(100, 1_500)\n        ys = np.std(y, axis=1)\n        Sx = np.array([\n            np.clip(np.mean(ys), None, self.STD_CLIP_MAX),\n        ])\n\n        steps = 150_000 // 4096\n        offset = 150_000 % 4096\n        y = values[offset:].reshape(steps, 4096)\n        F = self.fft_analysis(y)\n        Fm = np.mean(F, axis=0)\n        Fs = Fm[self.FREQUENCIES]\n    \n        X = np.concatenate([Sx, Q, Fs])\n        \n        if predict:\n            return X\n        y = df['time_to_failure'].iloc[-1]\n        return X, np.array([y])","execution_count":4,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from tqdm.autonotebook import tqdm\n\ndef generate_data(gen):\n    X_data = []\n    Y_data = []\n    for i in tqdm(range(len(gen))):\n        x, y = gen[i]\n        X_data.append(x)\n        Y_data.append(y)\n\n    return np.vstack(X_data), np.concatenate(Y_data)\n\ntrain_indices, eval_indices = folder[0]\ngen_train = lanl_generator.SegmentGenerator(\n        df, FeatureGenerator(), train_indices, rand_offset=0)\n\nX_train, Y_train = generate_data(gen_train)\n\n\n","execution_count":5,"outputs":[{"output_type":"stream","text":"/opt/conda/lib/python3.6/site-packages/tqdm/autonotebook/__init__.py:14: TqdmExperimentalWarning: Using `tqdm.autonotebook.tqdm` in notebook mode. Use `tqdm.tqdm` instead to force console mode (e.g. in jupyter console)\n  \" (e.g. in jupyter console)\", TqdmExperimentalWarning)\n","name":"stderr"},{"output_type":"display_data","data":{"text/plain":"HBox(children=(IntProgress(value=0, max=106), HTML(value='')))","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"23b915b8758b4ece967db1e706367b33"}},"metadata":{}},{"output_type":"stream","text":"\n","name":"stdout"}]},{"metadata":{"trusted":true},"cell_type":"code","source":"if dev_mode:\n    gen_eval = lanl_generator.SegmentGenerator(\n            df, FeatureGenerator(), eval_indices)\n    X_eval, Y_eval = generate_data(gen_eval)","execution_count":6,"outputs":[{"output_type":"display_data","data":{"text/plain":"HBox(children=(IntProgress(value=0, max=26), HTML(value='')))","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"cc366c9c8abf4e51b8a4bbe7e43fa7b0"}},"metadata":{}},{"output_type":"stream","text":"\n","name":"stdout"}]},{"metadata":{"trusted":true},"cell_type":"code","source":"def vcorrcoef(X,y):\n    \"\"\" Calculate the correlation coeficient between a matrix X and vector y.\n    \"\"\"\n    Xm = np.mean(X, axis=0)\n    ym = np.mean(y, axis=0)\n    r_num = np.sum((X-Xm)*(y-ym),axis=0)\n    r_den = np.sqrt(np.sum((X-Xm)**2,axis=0)*np.sum((y-ym)**2))\n    r = r_num/r_den\n    return r\n","execution_count":7,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"cr = vcorrcoef(X_train, Y_train)\n\n","execution_count":8,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"%matplotlib inline\nimport matplotlib.pyplot as plt\nfrom matplotlib import cm\n\nfig, ax = plt.subplots()\nx = np.arange(0, cr.size)\ncolors = cm.rainbow(np.linspace(0, 1, cr.size))\nax.bar(x, np.abs(cr), color=colors)\nax.set_xticks(x)\nax.set_xticklabels(FeatureGenerator().feature_names())\nplt.show()\n\n\n","execution_count":9,"outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 432x288 with 1 Axes>","image/png":"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\n"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"import seaborn as sns\ncorr = np.corrcoef(X_train, rowvar=False)\ncorr = np.abs(corr)\nmask = np.zeros_like(corr)\nmask[np.triu_indices_from(mask)] = True\nwith sns.axes_style(\"white\"):\n    ax = sns.heatmap(corr, mask=mask, vmax=.3, square=True)\nplt.show()","execution_count":10,"outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 432x288 with 2 Axes>","image/png":"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\n"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"import tensorflow as tf\nfrom tensorflow import keras\n\nfrom tensorflow.keras.layers import *\nfrom tensorflow.keras.models import Model, Sequential\nimport tensorflow.keras.backend as K\n\nclass range_initializer(keras.initializers.Initializer):\n    def __init__(self, vmax = 0.0, vmean = 0.0):\n        self.vmax = vmax\n        self.vmean = vmean\n\n    def get_config(self):\n        return {'vmax': self.vmax, 'vmean': self.vmean}\n\n    def __call__(self, shape, dtype=None, partition_info=None):\n        if len(shape) != 2 or shape[1] != 1:\n            raise ValueError('Expected shape (N, 1), got ', shape)\n        return np.arange(shape[0])[:, np.newaxis] / shape[0] * self.vmax - self.vmean\n\ndef make_model():\n    inp = Input(shape=FeatureGenerator().shape())\n    r = Dense(16, activation='relu')(inp)\n    out = Dense(1, name='ttf',\n                # kernel_initializer=range_initializer(16.0, 5.6),\n                bias_initializer=keras.initializers.Constant(5.6)\n                )(r)\n    model = Model(inp, out)\n    model.compile(optimizer=keras.optimizers.Adam(lr=0.001), loss='mae', metrics=['mae'])\n    return model\n\nK.clear_session()\ntf.set_random_seed(42)\nmodel = make_model()\nmodel.summary()\nmodel.save('model-features.h5')","execution_count":11,"outputs":[{"output_type":"stream","text":"WARNING:tensorflow:From /opt/conda/lib/python3.6/site-packages/tensorflow/python/ops/resource_variable_ops.py:435: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.\nInstructions for updating:\nColocations handled automatically by placer.\n_________________________________________________________________\nLayer (type)                 Output Shape              Param #   \n=================================================================\ninput_1 (InputLayer)         (None, 7)                 0         \n_________________________________________________________________\ndense (Dense)                (None, 16)                128       \n_________________________________________________________________\nttf (Dense)                  (None, 1)                 17        \n=================================================================\nTotal params: 145\nTrainable params: 145\nNon-trainable params: 0\n_________________________________________________________________\n","name":"stdout"}]},{"metadata":{"trusted":true},"cell_type":"code","source":"ckpt_filepath = 'sel-features.{0}.ckpt.hdf'\n\nif dev_mode:\n    fold = 0\n    cb_checkpoint = keras.callbacks.ModelCheckpoint(\n        ckpt_filepath.format(fold), monitor='val_mean_absolute_error', verbose=True,\n        save_best_only=True, mode='min')\n    cb_stop = keras.callbacks.EarlyStopping(monitor='val_loss', patience=5)\n\n\n    train_indices, _ = folder[fold]\n    gen_train = lanl_generator.SegmentGenerator(\n        df, FeatureGenerator(), train_indices, rand_offset=50_000)\n    history = model.fit_generator(\n        gen_train, validation_data=(X_eval, Y_eval),\n        callbacks=[cb_checkpoint, cb_stop],\n        verbose=True,\n        epochs=50)","execution_count":12,"outputs":[{"output_type":"stream","text":"WARNING:tensorflow:From /opt/conda/lib/python3.6/site-packages/tensorflow/python/ops/math_ops.py:3066: to_int32 (from tensorflow.python.ops.math_ops) is deprecated and will be removed in a future version.\nInstructions for updating:\nUse tf.cast instead.\nEpoch 1/50\n826/826 [==============================] - 0s 112us/sample - loss: 2.6079 - mean_absolute_error: 2.6078\n\nEpoch 00001: val_mean_absolute_error improved from inf to 2.60777, saving model to sel-features.0.ckpt.hdf\n106/106 [==============================] - 30s 279ms/step - loss: 2.8333 - mean_absolute_error: 2.8309 - val_loss: 2.6106 - val_mean_absolute_error: 2.6078\nEpoch 2/50\n826/826 [==============================] - 0s 52us/sample - loss: 2.3343 - mean_absolute_error: 2.3342\n\nEpoch 00002: val_mean_absolute_error improved from 2.60777 to 2.33423, saving model to sel-features.0.ckpt.hdf\n106/106 [==============================] - 29s 270ms/step - loss: 2.5253 - mean_absolute_error: 2.5234 - val_loss: 2.3365 - val_mean_absolute_error: 2.3342\nEpoch 3/50\n826/826 [==============================] - 0s 47us/sample - loss: 2.1718 - mean_absolute_error: 2.1717\n\nEpoch 00003: val_mean_absolute_error improved from 2.33423 to 2.17170, saving model to sel-features.0.ckpt.hdf\n106/106 [==============================] - 29s 271ms/step - loss: 2.2959 - mean_absolute_error: 2.2983 - val_loss: 2.1739 - val_mean_absolute_error: 2.1717\nEpoch 4/50\n826/826 [==============================] - 0s 60us/sample - loss: 2.1491 - mean_absolute_error: 2.1490\n\nEpoch 00004: val_mean_absolute_error improved from 2.17170 to 2.14903, saving model to sel-features.0.ckpt.hdf\n106/106 [==============================] - 28s 269ms/step - loss: 2.2198 - mean_absolute_error: 2.2129 - val_loss: 2.1511 - val_mean_absolute_error: 2.1490\nEpoch 5/50\n826/826 [==============================] - 0s 57us/sample - loss: 2.1358 - mean_absolute_error: 2.1357\n\nEpoch 00005: val_mean_absolute_error improved from 2.14903 to 2.13572, saving model to sel-features.0.ckpt.hdf\n106/106 [==============================] - 28s 268ms/step - loss: 2.1918 - mean_absolute_error: 2.1951 - val_loss: 2.1376 - val_mean_absolute_error: 2.1357\nEpoch 6/50\n826/826 [==============================] - 0s 41us/sample - loss: 2.1235 - mean_absolute_error: 2.1234\n\nEpoch 00006: val_mean_absolute_error improved from 2.13572 to 2.12344, saving model to sel-features.0.ckpt.hdf\n106/106 [==============================] - 28s 267ms/step - loss: 2.1852 - mean_absolute_error: 2.1888 - val_loss: 2.1254 - val_mean_absolute_error: 2.1234\nEpoch 7/50\n826/826 [==============================] - 0s 55us/sample - loss: 2.1232 - mean_absolute_error: 2.1231\n\nEpoch 00007: val_mean_absolute_error improved from 2.12344 to 2.12309, saving model to sel-features.0.ckpt.hdf\n106/106 [==============================] - 28s 268ms/step - loss: 2.1840 - mean_absolute_error: 2.1800 - val_loss: 2.1251 - val_mean_absolute_error: 2.1231\nEpoch 8/50\n826/826 [==============================] - 0s 59us/sample - loss: 2.1163 - mean_absolute_error: 2.1162\n\nEpoch 00008: val_mean_absolute_error improved from 2.12309 to 2.11622, saving model to sel-features.0.ckpt.hdf\n106/106 [==============================] - 29s 271ms/step - loss: 2.1699 - mean_absolute_error: 2.1692 - val_loss: 2.1182 - val_mean_absolute_error: 2.1162\nEpoch 9/50\n826/826 [==============================] - 0s 44us/sample - loss: 2.1152 - mean_absolute_error: 2.1151\n\nEpoch 00009: val_mean_absolute_error improved from 2.11622 to 2.11514, saving model to sel-features.0.ckpt.hdf\n106/106 [==============================] - 29s 270ms/step - loss: 2.1579 - mean_absolute_error: 2.1607 - val_loss: 2.1170 - val_mean_absolute_error: 2.1151\nEpoch 10/50\n826/826 [==============================] - 0s 48us/sample - loss: 2.1140 - mean_absolute_error: 2.1139\n\nEpoch 00010: val_mean_absolute_error improved from 2.11514 to 2.11393, saving model to sel-features.0.ckpt.hdf\n106/106 [==============================] - 30s 284ms/step - loss: 2.1543 - mean_absolute_error: 2.1594 - val_loss: 2.1159 - val_mean_absolute_error: 2.1139\nEpoch 11/50\n826/826 [==============================] - 0s 60us/sample - loss: 2.1077 - mean_absolute_error: 2.1077\n\nEpoch 00011: val_mean_absolute_error improved from 2.11393 to 2.10766, saving model to sel-features.0.ckpt.hdf\n106/106 [==============================] - 29s 278ms/step - loss: 2.1501 - mean_absolute_error: 2.1543 - val_loss: 2.1095 - val_mean_absolute_error: 2.1077\nEpoch 12/50\n826/826 [==============================] - 0s 48us/sample - loss: 2.1055 - mean_absolute_error: 2.1054\n\nEpoch 00012: val_mean_absolute_error improved from 2.10766 to 2.10545, saving model to sel-features.0.ckpt.hdf\n106/106 [==============================] - 29s 276ms/step - loss: 2.1674 - mean_absolute_error: 2.1598 - val_loss: 2.1072 - val_mean_absolute_error: 2.1054\nEpoch 13/50\n826/826 [==============================] - 0s 49us/sample - loss: 2.1060 - mean_absolute_error: 2.1060\n\nEpoch 00013: val_mean_absolute_error did not improve from 2.10545\n106/106 [==============================] - 29s 273ms/step - loss: 2.1627 - mean_absolute_error: 2.1514 - val_loss: 2.1076 - val_mean_absolute_error: 2.1060\nEpoch 14/50\n826/826 [==============================] - 0s 47us/sample - loss: 2.1061 - mean_absolute_error: 2.1061\n\nEpoch 00014: val_mean_absolute_error did not improve from 2.10545\n106/106 [==============================] - 29s 276ms/step - loss: 2.1446 - mean_absolute_error: 2.1503 - val_loss: 2.1077 - val_mean_absolute_error: 2.1061\nEpoch 15/50\n826/826 [==============================] - 0s 50us/sample - loss: 2.1108 - mean_absolute_error: 2.1108\n\nEpoch 00015: val_mean_absolute_error did not improve from 2.10545\n106/106 [==============================] - 29s 272ms/step - loss: 2.1549 - mean_absolute_error: 2.1511 - val_loss: 2.1123 - val_mean_absolute_error: 2.1108\nEpoch 16/50\n826/826 [==============================] - 0s 46us/sample - loss: 2.0985 - mean_absolute_error: 2.0984\n\nEpoch 00016: val_mean_absolute_error improved from 2.10545 to 2.09843, saving model to sel-features.0.ckpt.hdf\n106/106 [==============================] - 28s 266ms/step - loss: 2.1355 - mean_absolute_error: 2.1388 - val_loss: 2.1002 - val_mean_absolute_error: 2.0984\nEpoch 17/50\n826/826 [==============================] - 0s 46us/sample - loss: 2.1024 - mean_absolute_error: 2.1023\n\nEpoch 00017: val_mean_absolute_error did not improve from 2.09843\n106/106 [==============================] - 28s 269ms/step - loss: 2.1544 - mean_absolute_error: 2.1436 - val_loss: 2.1039 - val_mean_absolute_error: 2.1023\nEpoch 18/50\n826/826 [==============================] - 0s 53us/sample - loss: 2.0989 - mean_absolute_error: 2.0988\n\nEpoch 00018: val_mean_absolute_error did not improve from 2.09843\n106/106 [==============================] - 29s 272ms/step - loss: 2.1451 - mean_absolute_error: 2.1413 - val_loss: 2.1004 - val_mean_absolute_error: 2.0988\nEpoch 19/50\n826/826 [==============================] - 0s 42us/sample - loss: 2.1100 - mean_absolute_error: 2.1100\n\nEpoch 00019: val_mean_absolute_error did not improve from 2.09843\n106/106 [==============================] - 30s 281ms/step - loss: 2.1393 - mean_absolute_error: 2.1418 - val_loss: 2.1119 - val_mean_absolute_error: 2.1100\nEpoch 20/50\n826/826 [==============================] - 0s 46us/sample - loss: 2.0947 - mean_absolute_error: 2.0947\n\nEpoch 00020: val_mean_absolute_error improved from 2.09843 to 2.09467, saving model to sel-features.0.ckpt.hdf\n106/106 [==============================] - 29s 275ms/step - loss: 2.1307 - mean_absolute_error: 2.1366 - val_loss: 2.0964 - val_mean_absolute_error: 2.0947\nEpoch 21/50\n826/826 [==============================] - 0s 60us/sample - loss: 2.1091 - mean_absolute_error: 2.1091\n\nEpoch 00021: val_mean_absolute_error did not improve from 2.09467\n106/106 [==============================] - 29s 272ms/step - loss: 2.1405 - mean_absolute_error: 2.1430 - val_loss: 2.1104 - val_mean_absolute_error: 2.1091\nEpoch 22/50\n826/826 [==============================] - 0s 45us/sample - loss: 2.0939 - mean_absolute_error: 2.0938\n\nEpoch 00022: val_mean_absolute_error improved from 2.09467 to 2.09384, saving model to sel-features.0.ckpt.hdf\n106/106 [==============================] - 29s 278ms/step - loss: 2.1512 - mean_absolute_error: 2.1467 - val_loss: 2.0954 - val_mean_absolute_error: 2.0938\n","name":"stdout"},{"output_type":"stream","text":"Epoch 23/50\n826/826 [==============================] - 0s 48us/sample - loss: 2.0943 - mean_absolute_error: 2.0943\n\nEpoch 00023: val_mean_absolute_error did not improve from 2.09384\n106/106 [==============================] - 29s 278ms/step - loss: 2.1397 - mean_absolute_error: 2.1400 - val_loss: 2.0959 - val_mean_absolute_error: 2.0943\nEpoch 24/50\n826/826 [==============================] - 0s 47us/sample - loss: 2.0914 - mean_absolute_error: 2.0914\n\nEpoch 00024: val_mean_absolute_error improved from 2.09384 to 2.09136, saving model to sel-features.0.ckpt.hdf\n106/106 [==============================] - 29s 271ms/step - loss: 2.1320 - mean_absolute_error: 2.1374 - val_loss: 2.0931 - val_mean_absolute_error: 2.0914\nEpoch 25/50\n826/826 [==============================] - 0s 55us/sample - loss: 2.0923 - mean_absolute_error: 2.0923\n\nEpoch 00025: val_mean_absolute_error did not improve from 2.09136\n106/106 [==============================] - 29s 271ms/step - loss: 2.1291 - mean_absolute_error: 2.1229 - val_loss: 2.0939 - val_mean_absolute_error: 2.0923\nEpoch 26/50\n826/826 [==============================] - 0s 92us/sample - loss: 2.0920 - mean_absolute_error: 2.0920\n\nEpoch 00026: val_mean_absolute_error did not improve from 2.09136\n106/106 [==============================] - 30s 280ms/step - loss: 2.1333 - mean_absolute_error: 2.1339 - val_loss: 2.0937 - val_mean_absolute_error: 2.0920\nEpoch 27/50\n826/826 [==============================] - 0s 40us/sample - loss: 2.0918 - mean_absolute_error: 2.0918\n\nEpoch 00027: val_mean_absolute_error did not improve from 2.09136\n106/106 [==============================] - 29s 270ms/step - loss: 2.1437 - mean_absolute_error: 2.1438 - val_loss: 2.0933 - val_mean_absolute_error: 2.0918\nEpoch 28/50\n826/826 [==============================] - 0s 55us/sample - loss: 2.0896 - mean_absolute_error: 2.0896\n\nEpoch 00028: val_mean_absolute_error improved from 2.09136 to 2.08959, saving model to sel-features.0.ckpt.hdf\n106/106 [==============================] - 29s 272ms/step - loss: 2.1292 - mean_absolute_error: 2.1326 - val_loss: 2.0911 - val_mean_absolute_error: 2.0896\nEpoch 29/50\n826/826 [==============================] - 0s 48us/sample - loss: 2.0889 - mean_absolute_error: 2.0888\n\nEpoch 00029: val_mean_absolute_error improved from 2.08959 to 2.08881, saving model to sel-features.0.ckpt.hdf\n106/106 [==============================] - 30s 284ms/step - loss: 2.1317 - mean_absolute_error: 2.1346 - val_loss: 2.0904 - val_mean_absolute_error: 2.0888\nEpoch 30/50\n826/826 [==============================] - 0s 45us/sample - loss: 2.0902 - mean_absolute_error: 2.0902\n\nEpoch 00030: val_mean_absolute_error did not improve from 2.08881\n106/106 [==============================] - 29s 271ms/step - loss: 2.1366 - mean_absolute_error: 2.1349 - val_loss: 2.0918 - val_mean_absolute_error: 2.0902\nEpoch 31/50\n826/826 [==============================] - 0s 54us/sample - loss: 2.0898 - mean_absolute_error: 2.0898\n\nEpoch 00031: val_mean_absolute_error did not improve from 2.08881\n106/106 [==============================] - 29s 273ms/step - loss: 2.1412 - mean_absolute_error: 2.1446 - val_loss: 2.0913 - val_mean_absolute_error: 2.0898\nEpoch 32/50\n826/826 [==============================] - 0s 49us/sample - loss: 2.0886 - mean_absolute_error: 2.0885\n\nEpoch 00032: val_mean_absolute_error improved from 2.08881 to 2.08854, saving model to sel-features.0.ckpt.hdf\n106/106 [==============================] - 29s 270ms/step - loss: 2.1232 - mean_absolute_error: 2.1250 - val_loss: 2.0901 - val_mean_absolute_error: 2.0885\nEpoch 33/50\n826/826 [==============================] - 0s 46us/sample - loss: 2.0876 - mean_absolute_error: 2.0875\n\nEpoch 00033: val_mean_absolute_error improved from 2.08854 to 2.08751, saving model to sel-features.0.ckpt.hdf\n106/106 [==============================] - 29s 272ms/step - loss: 2.1347 - mean_absolute_error: 2.1309 - val_loss: 2.0891 - val_mean_absolute_error: 2.0875\nEpoch 34/50\n826/826 [==============================] - 0s 44us/sample - loss: 2.0864 - mean_absolute_error: 2.0863\n\nEpoch 00034: val_mean_absolute_error improved from 2.08751 to 2.08634, saving model to sel-features.0.ckpt.hdf\n106/106 [==============================] - 29s 271ms/step - loss: 2.1412 - mean_absolute_error: 2.1337 - val_loss: 2.0880 - val_mean_absolute_error: 2.0863\nEpoch 35/50\n826/826 [==============================] - 0s 43us/sample - loss: 2.0881 - mean_absolute_error: 2.0880\n\nEpoch 00035: val_mean_absolute_error did not improve from 2.08634\n106/106 [==============================] - 29s 274ms/step - loss: 2.1280 - mean_absolute_error: 2.1313 - val_loss: 2.0895 - val_mean_absolute_error: 2.0880\nEpoch 36/50\n826/826 [==============================] - 0s 54us/sample - loss: 2.0863 - mean_absolute_error: 2.0862\n\nEpoch 00036: val_mean_absolute_error improved from 2.08634 to 2.08621, saving model to sel-features.0.ckpt.hdf\n106/106 [==============================] - 29s 270ms/step - loss: 2.1223 - mean_absolute_error: 2.1238 - val_loss: 2.0877 - val_mean_absolute_error: 2.0862\nEpoch 37/50\n826/826 [==============================] - 0s 65us/sample - loss: 2.0968 - mean_absolute_error: 2.0967\n\nEpoch 00037: val_mean_absolute_error did not improve from 2.08621\n106/106 [==============================] - 28s 267ms/step - loss: 2.1415 - mean_absolute_error: 2.1274 - val_loss: 2.0985 - val_mean_absolute_error: 2.0967\nEpoch 38/50\n826/826 [==============================] - 0s 48us/sample - loss: 2.0849 - mean_absolute_error: 2.0849\n\nEpoch 00038: val_mean_absolute_error improved from 2.08621 to 2.08487, saving model to sel-features.0.ckpt.hdf\n106/106 [==============================] - 29s 272ms/step - loss: 2.1211 - mean_absolute_error: 2.1243 - val_loss: 2.0863 - val_mean_absolute_error: 2.0849\nEpoch 39/50\n826/826 [==============================] - 0s 67us/sample - loss: 2.0859 - mean_absolute_error: 2.0859\n\nEpoch 00039: val_mean_absolute_error did not improve from 2.08487\n106/106 [==============================] - 29s 269ms/step - loss: 2.1342 - mean_absolute_error: 2.1300 - val_loss: 2.0875 - val_mean_absolute_error: 2.0859\nEpoch 40/50\n826/826 [==============================] - 0s 63us/sample - loss: 2.0849 - mean_absolute_error: 2.0848\n\nEpoch 00040: val_mean_absolute_error improved from 2.08487 to 2.08484, saving model to sel-features.0.ckpt.hdf\n106/106 [==============================] - 29s 278ms/step - loss: 2.1258 - mean_absolute_error: 2.1270 - val_loss: 2.0863 - val_mean_absolute_error: 2.0848\nEpoch 41/50\n826/826 [==============================] - 0s 49us/sample - loss: 2.0839 - mean_absolute_error: 2.0838\n\nEpoch 00041: val_mean_absolute_error improved from 2.08484 to 2.08384, saving model to sel-features.0.ckpt.hdf\n106/106 [==============================] - 29s 271ms/step - loss: 2.1249 - mean_absolute_error: 2.1259 - val_loss: 2.0854 - val_mean_absolute_error: 2.0838\nEpoch 42/50\n826/826 [==============================] - 0s 66us/sample - loss: 2.0832 - mean_absolute_error: 2.0831\n\nEpoch 00042: val_mean_absolute_error improved from 2.08384 to 2.08312, saving model to sel-features.0.ckpt.hdf\n106/106 [==============================] - 29s 269ms/step - loss: 2.1255 - mean_absolute_error: 2.1298 - val_loss: 2.0846 - val_mean_absolute_error: 2.0831\nEpoch 43/50\n826/826 [==============================] - 0s 50us/sample - loss: 2.0825 - mean_absolute_error: 2.0824\n\nEpoch 00043: val_mean_absolute_error improved from 2.08312 to 2.08241, saving model to sel-features.0.ckpt.hdf\n106/106 [==============================] - 29s 269ms/step - loss: 2.1317 - mean_absolute_error: 2.1271 - val_loss: 2.0839 - val_mean_absolute_error: 2.0824\nEpoch 44/50\n826/826 [==============================] - 0s 59us/sample - loss: 2.0883 - mean_absolute_error: 2.0882\n\nEpoch 00044: val_mean_absolute_error did not improve from 2.08241\n106/106 [==============================] - 29s 277ms/step - loss: 2.1382 - mean_absolute_error: 2.1309 - val_loss: 2.0896 - val_mean_absolute_error: 2.0882\nEpoch 45/50\n826/826 [==============================] - 0s 44us/sample - loss: 2.0819 - mean_absolute_error: 2.0818\n\nEpoch 00045: val_mean_absolute_error improved from 2.08241 to 2.08184, saving model to sel-features.0.ckpt.hdf\n106/106 [==============================] - 29s 273ms/step - loss: 2.1384 - mean_absolute_error: 2.1339 - val_loss: 2.0833 - val_mean_absolute_error: 2.0818\n","name":"stdout"},{"output_type":"stream","text":"Epoch 46/50\n826/826 [==============================] - 0s 45us/sample - loss: 2.0814 - mean_absolute_error: 2.0814\n\nEpoch 00046: val_mean_absolute_error improved from 2.08184 to 2.08139, saving model to sel-features.0.ckpt.hdf\n106/106 [==============================] - 28s 269ms/step - loss: 2.1369 - mean_absolute_error: 2.1368 - val_loss: 2.0829 - val_mean_absolute_error: 2.0814\nEpoch 47/50\n826/826 [==============================] - 0s 59us/sample - loss: 2.0876 - mean_absolute_error: 2.0875\n\nEpoch 00047: val_mean_absolute_error did not improve from 2.08139\n106/106 [==============================] - 29s 273ms/step - loss: 2.1262 - mean_absolute_error: 2.1297 - val_loss: 2.0889 - val_mean_absolute_error: 2.0875\nEpoch 48/50\n826/826 [==============================] - 0s 42us/sample - loss: 2.0845 - mean_absolute_error: 2.0845\n\nEpoch 00048: val_mean_absolute_error did not improve from 2.08139\n106/106 [==============================] - 28s 268ms/step - loss: 2.1344 - mean_absolute_error: 2.1323 - val_loss: 2.0859 - val_mean_absolute_error: 2.0845\nEpoch 49/50\n826/826 [==============================] - 0s 49us/sample - loss: 2.0857 - mean_absolute_error: 2.0857\n\nEpoch 00049: val_mean_absolute_error did not improve from 2.08139\n106/106 [==============================] - 28s 265ms/step - loss: 2.1210 - mean_absolute_error: 2.1193 - val_loss: 2.0873 - val_mean_absolute_error: 2.0857\nEpoch 50/50\n826/826 [==============================] - 0s 54us/sample - loss: 2.0833 - mean_absolute_error: 2.0833\n\nEpoch 00050: val_mean_absolute_error did not improve from 2.08139\n106/106 [==============================] - 29s 275ms/step - loss: 2.1327 - mean_absolute_error: 2.1306 - val_loss: 2.0846 - val_mean_absolute_error: 2.0833\n","name":"stdout"}]},{"metadata":{"trusted":true},"cell_type":"code","source":"%matplotlib inline\nimport matplotlib.pyplot as plt\n\ndef show_history(hist, fold):\n    fig, ax1 = plt.subplots()\n    ax1.plot(hist.history['loss'], label='loss')\n    ax1.plot(hist.history['val_loss'], label='val_loss')\n    ax1.set_title('Model loss - {0}'.format(fold))\n    ax1.set_ylabel('Loss')\n    ax1.set_xlabel('Epoch')\n    if 'mean_absolute_error' in hist.history:\n        ax1.plot(hist.history['mean_absolute_error'], label='mae')\n        ax1.plot(hist.history['val_mean_absolute_error'], label='val_mae')\n    fig.legend()\n    plt.show()\n\nshow_history(history, 0)\n","execution_count":13,"outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 432x288 with 1 Axes>","image/png":"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\n"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"def prediction_error(model, classes, X_eval, Y_eval):\n    y_pred = model.predict(X_eval)\n    serr = (y_pred - Y_eval).reshape(-1)\n    \n    err = np.abs(serr)\n    bins = np.digitize(Y_eval, classes)\n    hist = np.bincount(bins.reshape(-1), minlength=classes.size)\n    errhist = np.zeros((classes.size))\n    for e, b in zip(err, bins):\n        errhist[b] += e\n    errhist /= (hist + 1.0e-9)\n\n    hdensity = hist / np.sum(hist)\n    return serr, errhist, hdensity\n","execution_count":14,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def show_measurements(measurements):\n    serr, errhist, hdensity = measurements\n    print(' ', '[0, 0.5)', np.mean(errhist[:1]),\n          '[0.5, 8.0)', np.mean(errhist[1:16]),\n          '[8.0, inf)', np.mean(errhist[16:]))\n    print(' ', '[2.0, 4.0)', np.mean(errhist[4:8]))\n\ndef show_mae_distribution(ax1, classes, measurements, fold):\n    _, errhist, hdensity = measurements\n    ax1.set_title('MAE per ttf class - {0}'.format(fold))\n    ax1.plot(classes, errhist, label='mae', c='r')\n    ax2 = ax1.twinx()\n    ax2.plot(classes, hdensity, label='density', c='b')\n\n\nif dev_mode:\n    measurements = prediction_error(model, classes, X_eval, Y_eval)\n    show_measurements(measurements)\n\n    fig, ax = plt.subplots(figsize=(4, 4), sharex=True, sharey=True)\n    show_mae_distribution(ax, classes, measurements, 0)\n    plt.show()\n\n    ","execution_count":16,"outputs":[{"output_type":"stream","text":"  [0, 0.5) 3.8168917806294904 [0.5, 8.0) 1.465461793235696 [8.0, inf) 4.333065537345689\n  [2.0, 4.0) 1.0659828493153338\n","name":"stdout"},{"output_type":"display_data","data":{"text/plain":"<Figure size 288x288 with 2 Axes>","image/png":"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\n"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.4","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}