├── README.md ├── LICENSE ├── .gitignore └── lstm_autoencoder_classifier.ipynb /README.md: -------------------------------------------------------------------------------- 1 | # lstm_autoencoder_classifier 2 | An LSTM Autoencoder for rare event classification 3 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 cran2367 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | logs/ 2 | 3 | data/ 4 | *.DS_Store 5 | # Byte-compiled / optimized / DLL files 6 | __pycache__/ 7 | *.py[cod] 8 | *$py.class 9 | 10 | # C extensions 11 | *.so 12 | 13 | # Distribution / packaging 14 | .Python 15 | build/ 16 | develop-eggs/ 17 | dist/ 18 | downloads/ 19 | eggs/ 20 | .eggs/ 21 | lib/ 22 | lib64/ 23 | parts/ 24 | sdist/ 25 | var/ 26 | wheels/ 27 | *.egg-info/ 28 | .installed.cfg 29 | *.egg 30 | MANIFEST 31 | 32 | # PyInstaller 33 | # Usually these files are written by a python script from a template 34 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 35 | *.manifest 36 | *.spec 37 | 38 | # Installer logs 39 | pip-log.txt 40 | pip-delete-this-directory.txt 41 | 42 | # Unit test / coverage reports 43 | htmlcov/ 44 | .tox/ 45 | .coverage 46 | .coverage.* 47 | .cache 48 | nosetests.xml 49 | coverage.xml 50 | *.cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | 63 | # Flask stuff: 64 | instance/ 65 | .webassets-cache 66 | 67 | # Scrapy stuff: 68 | .scrapy 69 | 70 | # Sphinx documentation 71 | docs/_build/ 72 | 73 | # PyBuilder 74 | target/ 75 | 76 | # Jupyter Notebook 77 | .ipynb_checkpoints 78 | 79 | # pyenv 80 | .python-version 81 | 82 | # celery beat schedule file 83 | celerybeat-schedule 84 | 85 | # SageMath parsed files 86 | *.sage.py 87 | 88 | # Environments 89 | .env 90 | .venv 91 | env/ 92 | venv/ 93 | ENV/ 94 | env.bak/ 95 | venv.bak/ 96 | 97 | # Spyder project settings 98 | .spyderproject 99 | .spyproject 100 | 101 | # Rope project settings 102 | .ropeproject 103 | 104 | # mkdocs documentation 105 | /site 106 | 107 | # mypy 108 | .mypy_cache/ 109 | -------------------------------------------------------------------------------- /lstm_autoencoder_classifier.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# LSTM Autoencoder for Rare Event Binary Classification\n", 8 | "\n", 9 | "This is a continuation of the regular autoencoder for rare event classification presented in\n", 10 | "https://towardsdatascience.com/extreme-rare-event-classification-using-autoencoders-in-keras-a565b386f098\n", 11 | "and code present in\n", 12 | "https://github.com/cran2367/autoencoder_classifier/blob/master/autoencoder_classifier.ipynb\n", 13 | "Here we will show an implementation of building a binary classifier using LSTM Autoencoders. \n", 14 | "Similar to the previous post, the purpose is to show the implementation steps. The Autoencoder tuning for performance improvement can be done.\n", 15 | "\n", 16 | "LSTM requires closer attention to preparing the data. Here we have all the steps, and few tests to validate the data preparation.\n", 17 | "\n", 18 | "The dataset used here is taken from here,\n", 19 | "\n", 20 | "**Dataset: Rare Event Classification in Multivariate Time Series** https://arxiv.org/abs/1809.10717 (please cite this article, if using the dataset)." 21 | ] 22 | }, 23 | { 24 | "cell_type": "code", 25 | "execution_count": 51, 26 | "metadata": {}, 27 | "outputs": [], 28 | "source": [ 29 | "%matplotlib inline\n", 30 | "import matplotlib.pyplot as plt\n", 31 | "import seaborn as sns\n", 32 | "\n", 33 | "import pandas as pd\n", 34 | "import numpy as np\n", 35 | "from pylab import rcParams\n", 36 | "\n", 37 | "import tensorflow as tf\n", 38 | "from keras import optimizers, Sequential\n", 39 | "from keras.models import Model\n", 40 | "from keras.utils import plot_model\n", 41 | "from keras.layers import Dense, LSTM, RepeatVector, TimeDistributed\n", 42 | "from keras.callbacks import ModelCheckpoint, TensorBoard\n", 43 | "\n", 44 | "from sklearn.preprocessing import StandardScaler\n", 45 | "from sklearn.model_selection import train_test_split\n", 46 | "from sklearn.metrics import confusion_matrix, precision_recall_curve\n", 47 | "from sklearn.metrics import recall_score, classification_report, auc, roc_curve\n", 48 | "from sklearn.metrics import precision_recall_fscore_support, f1_score\n", 49 | "\n", 50 | "from numpy.random import seed\n", 51 | "seed(7)\n", 52 | "from tensorflow import set_random_seed\n", 53 | "set_random_seed(11)\n", 54 | "\n", 55 | "from sklearn.model_selection import train_test_split\n", 56 | "\n", 57 | "SEED = 123 #used to help randomly select the data points\n", 58 | "DATA_SPLIT_PCT = 0.2\n", 59 | "\n", 60 | "rcParams['figure.figsize'] = 8, 6\n", 61 | "LABELS = [\"Normal\",\"Break\"]" 62 | ] 63 | }, 64 | { 65 | "cell_type": "markdown", 66 | "metadata": {}, 67 | "source": [ 68 | "## Reading and preparing data" 69 | ] 70 | }, 71 | { 72 | "cell_type": "markdown", 73 | "metadata": {}, 74 | "source": [ 75 | "The data is taken from https://arxiv.org/abs/1809.10717. Please use this source for any citation." 76 | ] 77 | }, 78 | { 79 | "cell_type": "code", 80 | "execution_count": 52, 81 | "metadata": {}, 82 | "outputs": [ 83 | { 84 | "data": { 85 | "text/html": [ 86 | "
\n", 87 | "\n", 100 | "\n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | " \n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " \n", 128 | " \n", 129 | " \n", 130 | " \n", 131 | " \n", 132 | " \n", 133 | " \n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " \n", 138 | " \n", 139 | " \n", 140 | " \n", 141 | " \n", 142 | " \n", 143 | " \n", 144 | " \n", 145 | " \n", 146 | " \n", 147 | " \n", 148 | " \n", 149 | " \n", 150 | " \n", 151 | " \n", 152 | " \n", 153 | " \n", 154 | " \n", 155 | " \n", 156 | " \n", 157 | " \n", 158 | " \n", 159 | " \n", 160 | " \n", 161 | " \n", 162 | " \n", 163 | " \n", 164 | " \n", 165 | " \n", 166 | " \n", 167 | " \n", 168 | " \n", 169 | " \n", 170 | " \n", 171 | " \n", 172 | " \n", 173 | " \n", 174 | " \n", 175 | " \n", 176 | " \n", 177 | " \n", 178 | " \n", 179 | " \n", 180 | " \n", 181 | " \n", 182 | " \n", 183 | " \n", 184 | " \n", 185 | " \n", 186 | " \n", 187 | " \n", 188 | " \n", 189 | " \n", 190 | " \n", 191 | " \n", 192 | " \n", 193 | " \n", 194 | " \n", 195 | " \n", 196 | " \n", 197 | " \n", 198 | " \n", 199 | " \n", 200 | " \n", 201 | " \n", 202 | " \n", 203 | " \n", 204 | " \n", 205 | " \n", 206 | " \n", 207 | " \n", 208 | " \n", 209 | " \n", 210 | " \n", 211 | " \n", 212 | " \n", 213 | " \n", 214 | " \n", 215 | " \n", 216 | " \n", 217 | " \n", 218 | " \n", 219 | " \n", 220 | " \n", 221 | " \n", 222 | " \n", 223 | " \n", 224 | " \n", 225 | " \n", 226 | " \n", 227 | " \n", 228 | " \n", 229 | " \n", 230 | " \n", 231 | " \n", 232 | " \n", 233 | " \n", 234 | " \n", 235 | " \n", 236 | " \n", 237 | " \n", 238 | " \n", 239 | " \n", 240 | " \n", 241 | " \n", 242 | " \n", 243 | " \n", 244 | " \n", 245 | " \n", 246 | " \n", 247 | " \n", 248 | " \n", 249 | "
timeyx1x2x3x4x5x6x7x8...x52x53x54x55x56x57x58x59x60x61
05/1/99 0:0000.376665-4.596435-4.09575613.497687-0.118830-20.6698830.000732-0.061114...10.0917210.053279-4.936434-24.59014618.5154363.4734000.0334440.9532190.0060760
15/1/99 0:0200.475720-4.542502-4.01835916.230659-0.128733-18.7580790.000732-0.061114...10.0958710.062801-4.937179-32.41326622.7600652.6829330.0335361.0905020.0060830
25/1/99 0:0400.363848-4.681394-4.35314714.127998-0.138636-17.8366320.010803-0.061114...10.1002650.072322-4.937924-34.18377427.0046633.5374870.0336291.8405400.0060900
35/1/99 0:0600.301590-4.758934-4.02361213.161567-0.148142-18.5176010.002075-0.061114...10.1046600.081600-4.938669-35.95428121.6724493.9860950.0337212.5548800.0060970
45/1/99 0:0800.265578-4.749928-4.33315015.267340-0.155314-17.5059130.000732-0.061114...10.1090540.091121-4.939414-37.72478921.9072513.6015730.0337771.4104940.0061050
\n", 250 | "

5 rows × 63 columns

\n", 251 | "
" 252 | ], 253 | "text/plain": [ 254 | " time y x1 x2 x3 x4 x5 \\\n", 255 | "0 5/1/99 0:00 0 0.376665 -4.596435 -4.095756 13.497687 -0.118830 \n", 256 | "1 5/1/99 0:02 0 0.475720 -4.542502 -4.018359 16.230659 -0.128733 \n", 257 | "2 5/1/99 0:04 0 0.363848 -4.681394 -4.353147 14.127998 -0.138636 \n", 258 | "3 5/1/99 0:06 0 0.301590 -4.758934 -4.023612 13.161567 -0.148142 \n", 259 | "4 5/1/99 0:08 0 0.265578 -4.749928 -4.333150 15.267340 -0.155314 \n", 260 | "\n", 261 | " x6 x7 x8 ... x52 x53 x54 \\\n", 262 | "0 -20.669883 0.000732 -0.061114 ... 10.091721 0.053279 -4.936434 \n", 263 | "1 -18.758079 0.000732 -0.061114 ... 10.095871 0.062801 -4.937179 \n", 264 | "2 -17.836632 0.010803 -0.061114 ... 10.100265 0.072322 -4.937924 \n", 265 | "3 -18.517601 0.002075 -0.061114 ... 10.104660 0.081600 -4.938669 \n", 266 | "4 -17.505913 0.000732 -0.061114 ... 10.109054 0.091121 -4.939414 \n", 267 | "\n", 268 | " x55 x56 x57 x58 x59 x60 x61 \n", 269 | "0 -24.590146 18.515436 3.473400 0.033444 0.953219 0.006076 0 \n", 270 | "1 -32.413266 22.760065 2.682933 0.033536 1.090502 0.006083 0 \n", 271 | "2 -34.183774 27.004663 3.537487 0.033629 1.840540 0.006090 0 \n", 272 | "3 -35.954281 21.672449 3.986095 0.033721 2.554880 0.006097 0 \n", 273 | "4 -37.724789 21.907251 3.601573 0.033777 1.410494 0.006105 0 \n", 274 | "\n", 275 | "[5 rows x 63 columns]" 276 | ] 277 | }, 278 | "execution_count": 52, 279 | "metadata": {}, 280 | "output_type": "execute_result" 281 | } 282 | ], 283 | "source": [ 284 | "'''\n", 285 | "Download data here:\n", 286 | "https://docs.google.com/forms/d/e/1FAIpQLSdyUk3lfDl7I5KYK_pw285LCApc-_RcoC0Tf9cnDnZ_TWzPAw/viewform\n", 287 | "'''\n", 288 | "df = pd.read_csv(\"data/processminer-rare-event-mts - data.csv\") \n", 289 | "df.head(n=5) # visualize the data." 290 | ] 291 | }, 292 | { 293 | "cell_type": "markdown", 294 | "metadata": {}, 295 | "source": [ 296 | "### Shift the data\n", 297 | "\n", 298 | "This is a timeseries data in which we have to predict the event (y = 1) ahead in time. In this data, consecutive rows are 2 minutes apart. We will shift the labels in column `y` by 2 rows to do a 4 minute ahead prediction." 299 | ] 300 | }, 301 | { 302 | "cell_type": "code", 303 | "execution_count": 53, 304 | "metadata": {}, 305 | "outputs": [], 306 | "source": [ 307 | "sign = lambda x: (1, -1)[x < 0]\n", 308 | "\n", 309 | "def curve_shift(df, shift_by):\n", 310 | " '''\n", 311 | " This function will shift the binary labels in a dataframe.\n", 312 | " The curve shift will be with respect to the 1s. \n", 313 | " For example, if shift is -2, the following process\n", 314 | " will happen: if row n is labeled as 1, then\n", 315 | " - Make row (n+shift_by):(n+shift_by-1) = 1.\n", 316 | " - Remove row n.\n", 317 | " i.e. the labels will be shifted up to 2 rows up.\n", 318 | " \n", 319 | " Inputs:\n", 320 | " df A pandas dataframe with a binary labeled column. \n", 321 | " This labeled column should be named as 'y'.\n", 322 | " shift_by An integer denoting the number of rows to shift.\n", 323 | " \n", 324 | " Output\n", 325 | " df A dataframe with the binary labels shifted by shift.\n", 326 | " '''\n", 327 | "\n", 328 | " vector = df['y'].copy()\n", 329 | " for s in range(abs(shift_by)):\n", 330 | " tmp = vector.shift(sign(shift_by))\n", 331 | " tmp = tmp.fillna(0)\n", 332 | " vector += tmp\n", 333 | " labelcol = 'y'\n", 334 | " # Add vector to the df\n", 335 | " df.insert(loc=0, column=labelcol+'tmp', value=vector)\n", 336 | " # Remove the rows with labelcol == 1.\n", 337 | " df = df.drop(df[df[labelcol] == 1].index)\n", 338 | " # Drop labelcol and rename the tmp col as labelcol\n", 339 | " df = df.drop(labelcol, axis=1)\n", 340 | " df = df.rename(columns={labelcol+'tmp': labelcol})\n", 341 | " # Make the labelcol binary\n", 342 | " df.loc[df[labelcol] > 0, labelcol] = 1\n", 343 | "\n", 344 | " return df" 345 | ] 346 | }, 347 | { 348 | "cell_type": "code", 349 | "execution_count": 54, 350 | "metadata": {}, 351 | "outputs": [ 352 | { 353 | "name": "stdout", 354 | "output_type": "stream", 355 | "text": [ 356 | "Before shifting\n" 357 | ] 358 | }, 359 | { 360 | "data": { 361 | "text/html": [ 362 | "
\n", 363 | "\n", 376 | "\n", 377 | " \n", 378 | " \n", 379 | " \n", 380 | " \n", 381 | " \n", 382 | " \n", 383 | " \n", 384 | " \n", 385 | " \n", 386 | " \n", 387 | " \n", 388 | " \n", 389 | " \n", 390 | " \n", 391 | " \n", 392 | " \n", 393 | " \n", 394 | " \n", 395 | " \n", 396 | " \n", 397 | " \n", 398 | " \n", 399 | " \n", 400 | " \n", 401 | " \n", 402 | " \n", 403 | " \n", 404 | " \n", 405 | " \n", 406 | " \n", 407 | " \n", 408 | " \n", 409 | " \n", 410 | " \n", 411 | " \n", 412 | " \n", 413 | " \n", 414 | " \n", 415 | " \n", 416 | " \n", 417 | " \n", 418 | " \n", 419 | " \n", 420 | " \n", 421 | " \n", 422 | " \n", 423 | " \n", 424 | " \n", 425 | " \n", 426 | " \n", 427 | " \n", 428 | " \n", 429 | "
timeyx1x2x3
2565/1/99 8:3201.016235-4.058394-1.097158
2575/1/99 8:3401.005602-3.876199-1.074373
2585/1/99 8:3600.933933-3.868467-1.249954
2595/1/99 8:3810.892311-13.332664-10.006578
2605/1/99 10:5000.020062-3.987897-1.248529
\n", 430 | "
" 431 | ], 432 | "text/plain": [ 433 | " time y x1 x2 x3\n", 434 | "256 5/1/99 8:32 0 1.016235 -4.058394 -1.097158\n", 435 | "257 5/1/99 8:34 0 1.005602 -3.876199 -1.074373\n", 436 | "258 5/1/99 8:36 0 0.933933 -3.868467 -1.249954\n", 437 | "259 5/1/99 8:38 1 0.892311 -13.332664 -10.006578\n", 438 | "260 5/1/99 10:50 0 0.020062 -3.987897 -1.248529" 439 | ] 440 | }, 441 | "metadata": {}, 442 | "output_type": "display_data" 443 | }, 444 | { 445 | "name": "stdout", 446 | "output_type": "stream", 447 | "text": [ 448 | "After shifting\n" 449 | ] 450 | }, 451 | { 452 | "data": { 453 | "text/html": [ 454 | "
\n", 455 | "\n", 468 | "\n", 469 | " \n", 470 | " \n", 471 | " \n", 472 | " \n", 473 | " \n", 474 | " \n", 475 | " \n", 476 | " \n", 477 | " \n", 478 | " \n", 479 | " \n", 480 | " \n", 481 | " \n", 482 | " \n", 483 | " \n", 484 | " \n", 485 | " \n", 486 | " \n", 487 | " \n", 488 | " \n", 489 | " \n", 490 | " \n", 491 | " \n", 492 | " \n", 493 | " \n", 494 | " \n", 495 | " \n", 496 | " \n", 497 | " \n", 498 | " \n", 499 | " \n", 500 | " \n", 501 | " \n", 502 | " \n", 503 | " \n", 504 | " \n", 505 | " \n", 506 | " \n", 507 | " \n", 508 | " \n", 509 | " \n", 510 | " \n", 511 | " \n", 512 | " \n", 513 | " \n", 514 | " \n", 515 | " \n", 516 | " \n", 517 | " \n", 518 | " \n", 519 | " \n", 520 | " \n", 521 | "
ytimex1x2x3
2550.05/1/99 8:300.997107-3.865720-1.133779
2560.05/1/99 8:321.016235-4.058394-1.097158
2571.05/1/99 8:341.005602-3.876199-1.074373
2581.05/1/99 8:360.933933-3.868467-1.249954
2600.05/1/99 10:500.020062-3.987897-1.248529
\n", 522 | "
" 523 | ], 524 | "text/plain": [ 525 | " y time x1 x2 x3\n", 526 | "255 0.0 5/1/99 8:30 0.997107 -3.865720 -1.133779\n", 527 | "256 0.0 5/1/99 8:32 1.016235 -4.058394 -1.097158\n", 528 | "257 1.0 5/1/99 8:34 1.005602 -3.876199 -1.074373\n", 529 | "258 1.0 5/1/99 8:36 0.933933 -3.868467 -1.249954\n", 530 | "260 0.0 5/1/99 10:50 0.020062 -3.987897 -1.248529" 531 | ] 532 | }, 533 | "metadata": {}, 534 | "output_type": "display_data" 535 | } 536 | ], 537 | "source": [ 538 | "'''\n", 539 | "Shift the data by 2 units, equal to 4 minutes.\n", 540 | "\n", 541 | "Test: Testing whether the shift happened correctly.\n", 542 | "'''\n", 543 | "print('Before shifting') # Positive labeled rows before shifting.\n", 544 | "one_indexes = df.index[df['y'] == 1]\n", 545 | "display(df.iloc[(one_indexes[0]-3):(one_indexes[0]+2), 0:5].head(n=5))\n", 546 | "\n", 547 | "# Shift the response column y by 2 rows to do a 4-min ahead prediction.\n", 548 | "df = curve_shift(df, shift_by = -2)\n", 549 | "\n", 550 | "print('After shifting') # Validating if the shift happened correctly.\n", 551 | "display(df.iloc[(one_indexes[0]-4):(one_indexes[0]+1), 0:5].head(n=5)) " 552 | ] 553 | }, 554 | { 555 | "cell_type": "markdown", 556 | "metadata": {}, 557 | "source": [ 558 | "If we note here, we moved the positive label at 5/1/99 8:38 to t-1 and t-2 timestamps, and dropped row t. There is a time difference of more than 2 minutes between a break row and the next row because in the data consecutive break rows are deleted. This was done to prevent a classification model learn predicting a break after the break has happened. Refer https://arxiv.org/abs/1809.10717 for details." 559 | ] 560 | }, 561 | { 562 | "cell_type": "code", 563 | "execution_count": 55, 564 | "metadata": {}, 565 | "outputs": [], 566 | "source": [ 567 | "# Remove time column, and the categorical columns\n", 568 | "df = df.drop(['time', 'x28', 'x61'], axis=1)" 569 | ] 570 | }, 571 | { 572 | "cell_type": "markdown", 573 | "metadata": {}, 574 | "source": [ 575 | "# Prepare data for LSTM models" 576 | ] 577 | }, 578 | { 579 | "cell_type": "markdown", 580 | "metadata": {}, 581 | "source": [ 582 | "LSTM is a bit more demanding than other models. Significant amount of time and attention goes in preparing the data that fits an LSTM.\n", 583 | "\n", 584 | "First, we will create the 3-dimensional arrays of shape: (samples x timesteps x features). Samples mean the number of data points. Timesteps is the number of time steps we look back at any time t to make a prediction. This is also referred to as lookback period. The features is the number of features the data has, in other words, the number of predictors in a multivariate data." 585 | ] 586 | }, 587 | { 588 | "cell_type": "code", 589 | "execution_count": 56, 590 | "metadata": {}, 591 | "outputs": [], 592 | "source": [ 593 | "input_X = df.loc[:, df.columns != 'y'].values # converts the df to a numpy array\n", 594 | "input_y = df['y'].values\n", 595 | "\n", 596 | "n_features = input_X.shape[1] # number of features" 597 | ] 598 | }, 599 | { 600 | "cell_type": "code", 601 | "execution_count": 57, 602 | "metadata": {}, 603 | "outputs": [], 604 | "source": [ 605 | "def temporalize(X, y, lookback):\n", 606 | " output_X = []\n", 607 | " output_y = []\n", 608 | " for i in range(len(X)-lookback-1):\n", 609 | " t = []\n", 610 | " for j in range(1,lookback+1):\n", 611 | " # Gather past records upto the lookback period\n", 612 | " t.append(X[[(i+j+1)], :])\n", 613 | " output_X.append(t)\n", 614 | " output_y.append(y[i+lookback+1])\n", 615 | " return output_X, output_y" 616 | ] 617 | }, 618 | { 619 | "cell_type": "markdown", 620 | "metadata": {}, 621 | "source": [ 622 | "In LSTM, to make prediction at any time t, we will look at data from (t-lookback):t. In the following, we have an example to show how the input data are transformed with the `temporalize` function with `lookback=5`. For the modeling, we may use a longer lookback." 623 | ] 624 | }, 625 | { 626 | "cell_type": "code", 627 | "execution_count": 58, 628 | "metadata": {}, 629 | "outputs": [ 630 | { 631 | "name": "stdout", 632 | "output_type": "stream", 633 | "text": [ 634 | "First instance of y = 1 in the original data\n" 635 | ] 636 | }, 637 | { 638 | "data": { 639 | "text/html": [ 640 | "
\n", 641 | "\n", 654 | "\n", 655 | " \n", 656 | " \n", 657 | " \n", 658 | " \n", 659 | " \n", 660 | " \n", 661 | " \n", 662 | " \n", 663 | " \n", 664 | " \n", 665 | " \n", 666 | " \n", 667 | " \n", 668 | " \n", 669 | " \n", 670 | " \n", 671 | " \n", 672 | " \n", 673 | " \n", 674 | " \n", 675 | " \n", 676 | " \n", 677 | " \n", 678 | " \n", 679 | " \n", 680 | " \n", 681 | " \n", 682 | " \n", 683 | " \n", 684 | " \n", 685 | " \n", 686 | " \n", 687 | " \n", 688 | " \n", 689 | " \n", 690 | " \n", 691 | " \n", 692 | " \n", 693 | " \n", 694 | " \n", 695 | " \n", 696 | " \n", 697 | " \n", 698 | " \n", 699 | " \n", 700 | " \n", 701 | " \n", 702 | " \n", 703 | " \n", 704 | " \n", 705 | " \n", 706 | " \n", 707 | " \n", 708 | " \n", 709 | " \n", 710 | " \n", 711 | " \n", 712 | " \n", 713 | " \n", 714 | " \n", 715 | " \n", 716 | " \n", 717 | " \n", 718 | " \n", 719 | " \n", 720 | " \n", 721 | " \n", 722 | " \n", 723 | " \n", 724 | " \n", 725 | " \n", 726 | " \n", 727 | " \n", 728 | " \n", 729 | " \n", 730 | " \n", 731 | " \n", 732 | " \n", 733 | " \n", 734 | " \n", 735 | " \n", 736 | " \n", 737 | " \n", 738 | " \n", 739 | " \n", 740 | " \n", 741 | " \n", 742 | " \n", 743 | " \n", 744 | " \n", 745 | " \n", 746 | " \n", 747 | " \n", 748 | " \n", 749 | " \n", 750 | " \n", 751 | " \n", 752 | " \n", 753 | " \n", 754 | " \n", 755 | " \n", 756 | " \n", 757 | " \n", 758 | " \n", 759 | " \n", 760 | " \n", 761 | " \n", 762 | " \n", 763 | " \n", 764 | " \n", 765 | " \n", 766 | " \n", 767 | " \n", 768 | " \n", 769 | " \n", 770 | " \n", 771 | " \n", 772 | " \n", 773 | " \n", 774 | " \n", 775 | " \n", 776 | " \n", 777 | " \n", 778 | " \n", 779 | " \n", 780 | " \n", 781 | " \n", 782 | " \n", 783 | " \n", 784 | " \n", 785 | " \n", 786 | " \n", 787 | " \n", 788 | " \n", 789 | " \n", 790 | " \n", 791 | " \n", 792 | " \n", 793 | " \n", 794 | " \n", 795 | " \n", 796 | " \n", 797 | " \n", 798 | " \n", 799 | " \n", 800 | " \n", 801 | " \n", 802 | " \n", 803 | " \n", 804 | " \n", 805 | " \n", 806 | " \n", 807 | " \n", 808 | " \n", 809 | " \n", 810 | " \n", 811 | " \n", 812 | " \n", 813 | " \n", 814 | " \n", 815 | " \n", 816 | " \n", 817 | " \n", 818 | " \n", 819 | " \n", 820 | " \n", 821 | " \n", 822 | " \n", 823 | " \n", 824 | " \n", 825 | " \n", 826 | " \n", 827 | "
yx1x2x3x4x5x6x7x8x9...x51x52x53x54x55x56x57x58x59x60
2520.00.987078-4.025989-1.2102050.8996030.45033814.0988540.000732-0.051043-0.059966...29.98462411.248703-0.752385-5.014893-67.45403766.2325684.1142690.0337264.8450870.007776
2530.00.921726-3.728572-1.230373-1.5987180.22717814.5946120.000061-0.051043-0.040129...29.98462411.253342-0.752385-5.014987-58.02947766.3100223.5374870.0325184.9695000.007760
2540.00.975947-3.913736-1.3046820.5619870.00403414.6305320.000732-0.051043-0.040129...29.98462411.257736-0.752385-5.015081-61.78374971.9173523.4734000.0313102.9814320.007743
2550.00.997107-3.865720-1.1337790.377295-0.21912614.6664200.000732-0.061114-0.040129...29.98462411.262375-0.752385-5.015176-70.15179173.8769773.4734000.0307762.5635930.007727
2560.01.016235-4.058394-1.0971582.327307-0.44228614.7023090.000732-0.061114-0.040129...29.98462411.267013-0.752385-5.015270-60.88470172.1889284.1142690.0311862.9824540.007711
2571.01.005602-3.876199-1.0743730.844397-0.55305014.7382280.000732-0.061114-0.030057...29.98462411.271652-0.752385-5.015364-69.55389170.5008794.0501820.0315963.7467140.007695
\n", 828 | "

6 rows × 60 columns

\n", 829 | "
" 830 | ], 831 | "text/plain": [ 832 | " y x1 x2 x3 x4 x5 x6 \\\n", 833 | "252 0.0 0.987078 -4.025989 -1.210205 0.899603 0.450338 14.098854 \n", 834 | "253 0.0 0.921726 -3.728572 -1.230373 -1.598718 0.227178 14.594612 \n", 835 | "254 0.0 0.975947 -3.913736 -1.304682 0.561987 0.004034 14.630532 \n", 836 | "255 0.0 0.997107 -3.865720 -1.133779 0.377295 -0.219126 14.666420 \n", 837 | "256 0.0 1.016235 -4.058394 -1.097158 2.327307 -0.442286 14.702309 \n", 838 | "257 1.0 1.005602 -3.876199 -1.074373 0.844397 -0.553050 14.738228 \n", 839 | "\n", 840 | " x7 x8 x9 ... x51 x52 x53 \\\n", 841 | "252 0.000732 -0.051043 -0.059966 ... 29.984624 11.248703 -0.752385 \n", 842 | "253 0.000061 -0.051043 -0.040129 ... 29.984624 11.253342 -0.752385 \n", 843 | "254 0.000732 -0.051043 -0.040129 ... 29.984624 11.257736 -0.752385 \n", 844 | "255 0.000732 -0.061114 -0.040129 ... 29.984624 11.262375 -0.752385 \n", 845 | "256 0.000732 -0.061114 -0.040129 ... 29.984624 11.267013 -0.752385 \n", 846 | "257 0.000732 -0.061114 -0.030057 ... 29.984624 11.271652 -0.752385 \n", 847 | "\n", 848 | " x54 x55 x56 x57 x58 x59 x60 \n", 849 | "252 -5.014893 -67.454037 66.232568 4.114269 0.033726 4.845087 0.007776 \n", 850 | "253 -5.014987 -58.029477 66.310022 3.537487 0.032518 4.969500 0.007760 \n", 851 | "254 -5.015081 -61.783749 71.917352 3.473400 0.031310 2.981432 0.007743 \n", 852 | "255 -5.015176 -70.151791 73.876977 3.473400 0.030776 2.563593 0.007727 \n", 853 | "256 -5.015270 -60.884701 72.188928 4.114269 0.031186 2.982454 0.007711 \n", 854 | "257 -5.015364 -69.553891 70.500879 4.050182 0.031596 3.746714 0.007695 \n", 855 | "\n", 856 | "[6 rows x 60 columns]" 857 | ] 858 | }, 859 | "metadata": {}, 860 | "output_type": "display_data" 861 | }, 862 | { 863 | "name": "stdout", 864 | "output_type": "stream", 865 | "text": [ 866 | "For the same instance of y = 1, we are keeping past 5 samples in the 3D predictor array, X.\n" 867 | ] 868 | }, 869 | { 870 | "data": { 871 | "text/html": [ 872 | "
\n", 873 | "\n", 886 | "\n", 887 | " \n", 888 | " \n", 889 | " \n", 890 | " \n", 891 | " \n", 892 | " \n", 893 | " \n", 894 | " \n", 895 | " \n", 896 | " \n", 897 | " \n", 898 | " \n", 899 | " \n", 900 | " \n", 901 | " \n", 902 | " \n", 903 | " \n", 904 | " \n", 905 | " \n", 906 | " \n", 907 | " \n", 908 | " \n", 909 | " \n", 910 | " \n", 911 | " \n", 912 | " \n", 913 | " \n", 914 | " \n", 915 | " \n", 916 | " \n", 917 | " \n", 918 | " \n", 919 | " \n", 920 | " \n", 921 | " \n", 922 | " \n", 923 | " \n", 924 | " \n", 925 | " \n", 926 | " \n", 927 | " \n", 928 | " \n", 929 | " \n", 930 | " \n", 931 | " \n", 932 | " \n", 933 | " \n", 934 | " \n", 935 | " \n", 936 | " \n", 937 | " \n", 938 | " \n", 939 | " \n", 940 | " \n", 941 | " \n", 942 | " \n", 943 | " \n", 944 | " \n", 945 | " \n", 946 | " \n", 947 | " \n", 948 | " \n", 949 | " \n", 950 | " \n", 951 | " \n", 952 | " \n", 953 | " \n", 954 | " \n", 955 | " \n", 956 | " \n", 957 | " \n", 958 | " \n", 959 | " \n", 960 | " \n", 961 | " \n", 962 | " \n", 963 | " \n", 964 | " \n", 965 | " \n", 966 | " \n", 967 | " \n", 968 | " \n", 969 | " \n", 970 | " \n", 971 | " \n", 972 | " \n", 973 | " \n", 974 | " \n", 975 | " \n", 976 | " \n", 977 | " \n", 978 | " \n", 979 | " \n", 980 | " \n", 981 | " \n", 982 | " \n", 983 | " \n", 984 | " \n", 985 | " \n", 986 | " \n", 987 | " \n", 988 | " \n", 989 | " \n", 990 | " \n", 991 | " \n", 992 | " \n", 993 | " \n", 994 | " \n", 995 | " \n", 996 | " \n", 997 | " \n", 998 | " \n", 999 | " \n", 1000 | " \n", 1001 | " \n", 1002 | " \n", 1003 | " \n", 1004 | " \n", 1005 | " \n", 1006 | " \n", 1007 | " \n", 1008 | " \n", 1009 | " \n", 1010 | " \n", 1011 | " \n", 1012 | " \n", 1013 | " \n", 1014 | " \n", 1015 | " \n", 1016 | " \n", 1017 | " \n", 1018 | " \n", 1019 | " \n", 1020 | " \n", 1021 | " \n", 1022 | " \n", 1023 | " \n", 1024 | " \n", 1025 | " \n", 1026 | " \n", 1027 | " \n", 1028 | " \n", 1029 | " \n", 1030 | " \n", 1031 | " \n", 1032 | " \n", 1033 | " \n", 1034 | " \n", 1035 | "
0123456789...49505152535455565758
00.921726-3.728572-1.230373-1.5987180.22717814.5946120.000061-0.051043-0.0401290.001791...29.98462411.253342-0.752385-5.014987-58.02947766.3100223.5374870.0325184.9695000.007760
10.975947-3.913736-1.3046820.5619870.00403414.6305320.000732-0.051043-0.0401290.001791...29.98462411.257736-0.752385-5.015081-61.78374971.9173523.4734000.0313102.9814320.007743
20.997107-3.865720-1.1337790.377295-0.21912614.6664200.000732-0.061114-0.0401290.001791...29.98462411.262375-0.752385-5.015176-70.15179173.8769773.4734000.0307762.5635930.007727
31.016235-4.058394-1.0971582.327307-0.44228614.7023090.000732-0.061114-0.0401290.001791...29.98462411.267013-0.752385-5.015270-60.88470172.1889284.1142690.0311862.9824540.007711
41.005602-3.876199-1.0743730.844397-0.55305014.7382280.000732-0.061114-0.0300570.001791...29.98462411.271652-0.752385-5.015364-69.55389170.5008794.0501820.0315963.7467140.007695
\n", 1036 | "

5 rows × 59 columns

\n", 1037 | "
" 1038 | ], 1039 | "text/plain": [ 1040 | " 0 1 2 3 4 5 6 \\\n", 1041 | "0 0.921726 -3.728572 -1.230373 -1.598718 0.227178 14.594612 0.000061 \n", 1042 | "1 0.975947 -3.913736 -1.304682 0.561987 0.004034 14.630532 0.000732 \n", 1043 | "2 0.997107 -3.865720 -1.133779 0.377295 -0.219126 14.666420 0.000732 \n", 1044 | "3 1.016235 -4.058394 -1.097158 2.327307 -0.442286 14.702309 0.000732 \n", 1045 | "4 1.005602 -3.876199 -1.074373 0.844397 -0.553050 14.738228 0.000732 \n", 1046 | "\n", 1047 | " 7 8 9 ... 49 50 51 \\\n", 1048 | "0 -0.051043 -0.040129 0.001791 ... 29.984624 11.253342 -0.752385 \n", 1049 | "1 -0.051043 -0.040129 0.001791 ... 29.984624 11.257736 -0.752385 \n", 1050 | "2 -0.061114 -0.040129 0.001791 ... 29.984624 11.262375 -0.752385 \n", 1051 | "3 -0.061114 -0.040129 0.001791 ... 29.984624 11.267013 -0.752385 \n", 1052 | "4 -0.061114 -0.030057 0.001791 ... 29.984624 11.271652 -0.752385 \n", 1053 | "\n", 1054 | " 52 53 54 55 56 57 58 \n", 1055 | "0 -5.014987 -58.029477 66.310022 3.537487 0.032518 4.969500 0.007760 \n", 1056 | "1 -5.015081 -61.783749 71.917352 3.473400 0.031310 2.981432 0.007743 \n", 1057 | "2 -5.015176 -70.151791 73.876977 3.473400 0.030776 2.563593 0.007727 \n", 1058 | "3 -5.015270 -60.884701 72.188928 4.114269 0.031186 2.982454 0.007711 \n", 1059 | "4 -5.015364 -69.553891 70.500879 4.050182 0.031596 3.746714 0.007695 \n", 1060 | "\n", 1061 | "[5 rows x 59 columns]" 1062 | ] 1063 | }, 1064 | "metadata": {}, 1065 | "output_type": "display_data" 1066 | } 1067 | ], 1068 | "source": [ 1069 | "'''\n", 1070 | "Test: The 3D tensors (arrays) for LSTM are forming correctly.\n", 1071 | "'''\n", 1072 | "print('First instance of y = 1 in the original data')\n", 1073 | "display(df.iloc[(np.where(np.array(input_y) == 1)[0][0]-5):(np.where(np.array(input_y) == 1)[0][0]+1), ])\n", 1074 | "\n", 1075 | "lookback = 5 # Equivalent to 10 min of past data.\n", 1076 | "# Temporalize the data\n", 1077 | "X, y = temporalize(X = input_X, y = input_y, lookback = lookback)\n", 1078 | "\n", 1079 | "print('For the same instance of y = 1, we are keeping past 5 samples in the 3D predictor array, X.')\n", 1080 | "display(pd.DataFrame(np.concatenate(X[np.where(np.array(y) == 1)[0][0]], axis=0 ))) " 1081 | ] 1082 | }, 1083 | { 1084 | "cell_type": "markdown", 1085 | "metadata": {}, 1086 | "source": [ 1087 | "The two tables are the same. This testifies that we are correctly taking 5 samples (= lookback), X(t):X(t-5) to predict y(t)." 1088 | ] 1089 | }, 1090 | { 1091 | "cell_type": "markdown", 1092 | "metadata": {}, 1093 | "source": [ 1094 | "### Divide the data into train, valid, and test" 1095 | ] 1096 | }, 1097 | { 1098 | "cell_type": "code", 1099 | "execution_count": 59, 1100 | "metadata": {}, 1101 | "outputs": [], 1102 | "source": [ 1103 | "X_train, X_test, y_train, y_test = train_test_split(np.array(X), np.array(y), test_size=DATA_SPLIT_PCT, random_state=SEED)\n", 1104 | "X_train, X_valid, y_train, y_valid = train_test_split(X_train, y_train, test_size=DATA_SPLIT_PCT, random_state=SEED)" 1105 | ] 1106 | }, 1107 | { 1108 | "cell_type": "code", 1109 | "execution_count": 60, 1110 | "metadata": {}, 1111 | "outputs": [ 1112 | { 1113 | "data": { 1114 | "text/plain": [ 1115 | "(11691, 5, 1, 59)" 1116 | ] 1117 | }, 1118 | "execution_count": 60, 1119 | "metadata": {}, 1120 | "output_type": "execute_result" 1121 | } 1122 | ], 1123 | "source": [ 1124 | "X_train.shape" 1125 | ] 1126 | }, 1127 | { 1128 | "cell_type": "code", 1129 | "execution_count": 61, 1130 | "metadata": {}, 1131 | "outputs": [], 1132 | "source": [ 1133 | "X_train_y0 = X_train[y_train==0]\n", 1134 | "X_train_y1 = X_train[y_train==1]\n", 1135 | "\n", 1136 | "X_valid_y0 = X_valid[y_valid==0]\n", 1137 | "X_valid_y1 = X_valid[y_valid==1]" 1138 | ] 1139 | }, 1140 | { 1141 | "cell_type": "code", 1142 | "execution_count": 62, 1143 | "metadata": {}, 1144 | "outputs": [ 1145 | { 1146 | "data": { 1147 | "text/plain": [ 1148 | "(11536, 5, 1, 59)" 1149 | ] 1150 | }, 1151 | "execution_count": 62, 1152 | "metadata": {}, 1153 | "output_type": "execute_result" 1154 | } 1155 | ], 1156 | "source": [ 1157 | "X_train_y0.shape" 1158 | ] 1159 | }, 1160 | { 1161 | "cell_type": "markdown", 1162 | "metadata": {}, 1163 | "source": [ 1164 | "#### Reshaping the data\n", 1165 | "The tensors we have here are 4-dimensional. We will reshape them into the desired 3-dimensions corresponding to sample x lookback x features." 1166 | ] 1167 | }, 1168 | { 1169 | "cell_type": "code", 1170 | "execution_count": 63, 1171 | "metadata": {}, 1172 | "outputs": [], 1173 | "source": [ 1174 | "X_train = X_train.reshape(X_train.shape[0], lookback, n_features)\n", 1175 | "X_train_y0 = X_train_y0.reshape(X_train_y0.shape[0], lookback, n_features)\n", 1176 | "X_train_y1 = X_train_y1.reshape(X_train_y1.shape[0], lookback, n_features)\n", 1177 | "\n", 1178 | "X_test = X_test.reshape(X_test.shape[0], lookback, n_features)\n", 1179 | "\n", 1180 | "X_valid = X_valid.reshape(X_valid.shape[0], lookback, n_features)\n", 1181 | "X_valid_y0 = X_valid_y0.reshape(X_valid_y0.shape[0], lookback, n_features)\n", 1182 | "X_valid_y1 = X_valid_y1.reshape(X_valid_y1.shape[0], lookback, n_features)" 1183 | ] 1184 | }, 1185 | { 1186 | "cell_type": "markdown", 1187 | "metadata": {}, 1188 | "source": [ 1189 | "### Standardize the data\n", 1190 | "It is usually better to use a standardized data (transformed to Gaussian, mean 0 and sd 1) for autoencoders.\n", 1191 | "\n", 1192 | "One common mistake is: we normalize the entire data and then split into train-test. This is not correct. Test data should be completely unseen to anything during the modeling. We should normalize the test data using the feature summary statistics computed from the training data. For normalization, these statistics are the mean and variance for each feature. \n", 1193 | "\n", 1194 | "The same logic should be used for the validation set. This makes the model more stable for a test data.\n", 1195 | "\n", 1196 | "To do this, we will require two UDFs.\n", 1197 | "\n", 1198 | "- `flatten`: This function will re-create the original 2D array from which the 3D arrays were created. This function is the inverse of `temporalize`, meaning `X = flatten(temporalize(X))`.\n", 1199 | "- `scale`: This function will scale a 3D array that we created as inputs to the LSTM." 1200 | ] 1201 | }, 1202 | { 1203 | "cell_type": "code", 1204 | "execution_count": 64, 1205 | "metadata": {}, 1206 | "outputs": [], 1207 | "source": [ 1208 | "def flatten(X):\n", 1209 | " '''\n", 1210 | " Flatten a 3D array.\n", 1211 | " \n", 1212 | " Input\n", 1213 | " X A 3D array for lstm, where the array is sample x timesteps x features.\n", 1214 | " \n", 1215 | " Output\n", 1216 | " flattened_X A 2D array, sample x features.\n", 1217 | " '''\n", 1218 | " flattened_X = np.empty((X.shape[0], X.shape[2])) # sample x features array.\n", 1219 | " for i in range(X.shape[0]):\n", 1220 | " flattened_X[i] = X[i, (X.shape[1]-1), :]\n", 1221 | " return(flattened_X)\n", 1222 | "\n", 1223 | "def scale(X, scaler):\n", 1224 | " '''\n", 1225 | " Scale 3D array.\n", 1226 | "\n", 1227 | " Inputs\n", 1228 | " X A 3D array for lstm, where the array is sample x timesteps x features.\n", 1229 | " scaler A scaler object, e.g., sklearn.preprocessing.StandardScaler, sklearn.preprocessing.normalize\n", 1230 | " \n", 1231 | " Output\n", 1232 | " X Scaled 3D array.\n", 1233 | " '''\n", 1234 | " for i in range(X.shape[0]):\n", 1235 | " X[i, :, :] = scaler.transform(X[i, :, :])\n", 1236 | " \n", 1237 | " return X" 1238 | ] 1239 | }, 1240 | { 1241 | "cell_type": "code", 1242 | "execution_count": 65, 1243 | "metadata": {}, 1244 | "outputs": [], 1245 | "source": [ 1246 | "# Initialize a scaler using the training data.\n", 1247 | "scaler = StandardScaler().fit(flatten(X_train_y0))" 1248 | ] 1249 | }, 1250 | { 1251 | "cell_type": "code", 1252 | "execution_count": 66, 1253 | "metadata": {}, 1254 | "outputs": [], 1255 | "source": [ 1256 | "X_train_y0_scaled = scale(X_train_y0, scaler)\n", 1257 | "X_train_y1_scaled = scale(X_train_y1, scaler)\n", 1258 | "X_train_scaled = scale(X_train, scaler)" 1259 | ] 1260 | }, 1261 | { 1262 | "cell_type": "code", 1263 | "execution_count": 67, 1264 | "metadata": {}, 1265 | "outputs": [ 1266 | { 1267 | "name": "stdout", 1268 | "output_type": "stream", 1269 | "text": [ 1270 | "colwise mean [ 0. -0. 0. 0. 0. -0. 0. 0. 0. 0. -0. -0. -0. -0. -0. 0. -0. -0.\n", 1271 | " -0. -0. 0. 0. -0. -0. 0. 0. -0. 0. -0. 0. 0. 0. -0. -0. -0. 0.\n", 1272 | " 0. 0. -0. 0. 0. 0. -0. -0. 0. 0. 0. 0. 0. 0. 0. -0. -0. 0.\n", 1273 | " 0. -0. -0. 0. 0.]\n", 1274 | "colwise variance [1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.\n", 1275 | " 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.\n", 1276 | " 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]\n" 1277 | ] 1278 | } 1279 | ], 1280 | "source": [ 1281 | "'''\n", 1282 | "Test: Check if the scaling is correct.\n", 1283 | "\n", 1284 | "The test succeeds if all the column means \n", 1285 | "and variances are 0 and 1, respectively, after\n", 1286 | "flattening.\n", 1287 | "'''\n", 1288 | "a = flatten(X_train_y0_scaled)\n", 1289 | "print('colwise mean', np.mean(a, axis=0).round(6))\n", 1290 | "print('colwise variance', np.var(a, axis=0))" 1291 | ] 1292 | }, 1293 | { 1294 | "cell_type": "markdown", 1295 | "metadata": {}, 1296 | "source": [ 1297 | "The test succeeded. Now we will _scale_ the validation and test sets." 1298 | ] 1299 | }, 1300 | { 1301 | "cell_type": "code", 1302 | "execution_count": 68, 1303 | "metadata": {}, 1304 | "outputs": [], 1305 | "source": [ 1306 | "X_valid_scaled = scale(X_valid, scaler)\n", 1307 | "X_valid_y0_scaled = scale(X_valid_y0, scaler)\n", 1308 | "\n", 1309 | "X_test_scaled = scale(X_test, scaler)" 1310 | ] 1311 | }, 1312 | { 1313 | "cell_type": "markdown", 1314 | "metadata": {}, 1315 | "source": [ 1316 | "## LSTM Autoencoder training" 1317 | ] 1318 | }, 1319 | { 1320 | "cell_type": "markdown", 1321 | "metadata": {}, 1322 | "source": [ 1323 | "First we will initialize the Autoencoder architecture. We are building a simple autoencoder. More complex architectures and other configurations should be explored." 1324 | ] 1325 | }, 1326 | { 1327 | "cell_type": "code", 1328 | "execution_count": 69, 1329 | "metadata": {}, 1330 | "outputs": [], 1331 | "source": [ 1332 | "timesteps = X_train_y0_scaled.shape[1] # equal to the lookback\n", 1333 | "n_features = X_train_y0_scaled.shape[2] # 59\n", 1334 | "\n", 1335 | "epochs = 200\n", 1336 | "batch = 64\n", 1337 | "lr = 0.0001" 1338 | ] 1339 | }, 1340 | { 1341 | "cell_type": "code", 1342 | "execution_count": 93, 1343 | "metadata": {}, 1344 | "outputs": [ 1345 | { 1346 | "name": "stdout", 1347 | "output_type": "stream", 1348 | "text": [ 1349 | "_________________________________________________________________\n", 1350 | "Layer (type) Output Shape Param # \n", 1351 | "=================================================================\n", 1352 | "lstm_23 (LSTM) (None, 5, 32) 11776 \n", 1353 | "_________________________________________________________________\n", 1354 | "lstm_24 (LSTM) (None, 16) 3136 \n", 1355 | "_________________________________________________________________\n", 1356 | "repeat_vector_7 (RepeatVecto (None, 5, 16) 0 \n", 1357 | "_________________________________________________________________\n", 1358 | "lstm_25 (LSTM) (None, 5, 16) 2112 \n", 1359 | "_________________________________________________________________\n", 1360 | "lstm_26 (LSTM) (None, 5, 32) 6272 \n", 1361 | "_________________________________________________________________\n", 1362 | "time_distributed_6 (TimeDist (None, 5, 59) 1947 \n", 1363 | "=================================================================\n", 1364 | "Total params: 25,243\n", 1365 | "Trainable params: 25,243\n", 1366 | "Non-trainable params: 0\n", 1367 | "_________________________________________________________________\n" 1368 | ] 1369 | } 1370 | ], 1371 | "source": [ 1372 | "lstm_autoencoder = Sequential()\n", 1373 | "# Encoder\n", 1374 | "lstm_autoencoder.add(LSTM(32, activation='relu', input_shape=(timesteps, n_features), return_sequences=True))\n", 1375 | "lstm_autoencoder.add(LSTM(16, activation='relu', return_sequences=False))\n", 1376 | "lstm_autoencoder.add(RepeatVector(timesteps))\n", 1377 | "# Decoder\n", 1378 | "lstm_autoencoder.add(LSTM(16, activation='relu', return_sequences=True))\n", 1379 | "lstm_autoencoder.add(LSTM(32, activation='relu', return_sequences=True))\n", 1380 | "lstm_autoencoder.add(TimeDistributed(Dense(n_features)))\n", 1381 | "\n", 1382 | "lstm_autoencoder.summary()" 1383 | ] 1384 | }, 1385 | { 1386 | "cell_type": "markdown", 1387 | "metadata": {}, 1388 | "source": [ 1389 | "As a rule-of-thumb, look at the number of parameters. If not using any regularization, keep this less than the number of samples. If using regularization, depending on the degree of regularization you can let more parameters in the model that is greater than the sample size. For example, if using dropout with 0.5, you can have up to double the sample size (loosely speaking)." 1390 | ] 1391 | }, 1392 | { 1393 | "cell_type": "code", 1394 | "execution_count": 94, 1395 | "metadata": {}, 1396 | "outputs": [ 1397 | { 1398 | "name": "stdout", 1399 | "output_type": "stream", 1400 | "text": [ 1401 | "Train on 11536 samples, validate on 2880 samples\n", 1402 | "Epoch 1/200\n", 1403 | " - 6s - loss: 0.9916 - val_loss: 1.0049\n", 1404 | "Epoch 2/200\n", 1405 | " - 2s - loss: 0.9459 - val_loss: 0.9127\n", 1406 | "Epoch 3/200\n", 1407 | " - 2s - loss: 0.8240 - val_loss: 0.7706\n", 1408 | "Epoch 4/200\n", 1409 | " - 2s - loss: 0.7041 - val_loss: 0.6567\n", 1410 | "Epoch 5/200\n", 1411 | " - 2s - loss: 0.6128 - val_loss: 0.5740\n", 1412 | "Epoch 6/200\n", 1413 | " - 2s - loss: 0.5494 - val_loss: 0.5183\n", 1414 | "Epoch 7/200\n", 1415 | " - 2s - loss: 0.5029 - val_loss: 0.4769\n", 1416 | "Epoch 8/200\n", 1417 | " - 2s - loss: 0.4679 - val_loss: 0.4460\n", 1418 | "Epoch 9/200\n", 1419 | " - 2s - loss: 0.4420 - val_loss: 0.4227\n", 1420 | "Epoch 10/200\n", 1421 | " - 2s - loss: 0.4210 - val_loss: 0.4055\n", 1422 | "Epoch 11/200\n", 1423 | " - 2s - loss: 0.4037 - val_loss: 0.3896\n", 1424 | "Epoch 12/200\n", 1425 | " - 2s - loss: 0.3890 - val_loss: 0.3752\n", 1426 | "Epoch 13/200\n", 1427 | " - 2s - loss: 0.3759 - val_loss: 0.3637\n", 1428 | "Epoch 14/200\n", 1429 | " - 2s - loss: 0.3644 - val_loss: 0.3539\n", 1430 | "Epoch 15/200\n", 1431 | " - 2s - loss: 0.3546 - val_loss: 0.3450\n", 1432 | "Epoch 16/200\n", 1433 | " - 2s - loss: 0.3462 - val_loss: 0.3374\n", 1434 | "Epoch 17/200\n", 1435 | " - 2s - loss: 0.3388 - val_loss: 0.3309\n", 1436 | "Epoch 18/200\n", 1437 | " - 2s - loss: 0.3320 - val_loss: 0.3249\n", 1438 | "Epoch 19/200\n", 1439 | " - 2s - loss: 0.3261 - val_loss: 0.3194\n", 1440 | "Epoch 20/200\n", 1441 | " - 2s - loss: 0.3206 - val_loss: 0.3146\n", 1442 | "Epoch 21/200\n", 1443 | " - 2s - loss: 0.3154 - val_loss: 0.3095\n", 1444 | "Epoch 22/200\n", 1445 | " - 2s - loss: 0.3105 - val_loss: 0.3051\n", 1446 | "Epoch 23/200\n", 1447 | " - 2s - loss: 0.3060 - val_loss: 0.3012\n", 1448 | "Epoch 24/200\n", 1449 | " - 2s - loss: 0.3012 - val_loss: 0.2966\n", 1450 | "Epoch 25/200\n", 1451 | " - 2s - loss: 0.2970 - val_loss: 0.2926\n", 1452 | "Epoch 26/200\n", 1453 | " - 2s - loss: 0.2928 - val_loss: 0.2895\n", 1454 | "Epoch 27/200\n", 1455 | " - 2s - loss: 0.2893 - val_loss: 0.2852\n", 1456 | "Epoch 28/200\n", 1457 | " - 2s - loss: 0.2858 - val_loss: 0.2818\n", 1458 | "Epoch 29/200\n", 1459 | " - 2s - loss: 0.2817 - val_loss: 0.2784\n", 1460 | "Epoch 30/200\n", 1461 | " - 2s - loss: 0.2782 - val_loss: 0.2753\n", 1462 | "Epoch 31/200\n", 1463 | " - 2s - loss: 0.2749 - val_loss: 0.2723\n", 1464 | "Epoch 32/200\n", 1465 | " - 2s - loss: 0.2720 - val_loss: 0.2694\n", 1466 | "Epoch 33/200\n", 1467 | " - 2s - loss: 0.2686 - val_loss: 0.2674\n", 1468 | "Epoch 34/200\n", 1469 | " - 2s - loss: 0.2658 - val_loss: 0.2643\n", 1470 | "Epoch 35/200\n", 1471 | " - 2s - loss: 0.2644 - val_loss: 0.2622\n", 1472 | "Epoch 36/200\n", 1473 | " - 2s - loss: 0.2620 - val_loss: 0.2600\n", 1474 | "Epoch 37/200\n", 1475 | " - 2s - loss: 0.2586 - val_loss: 0.2583\n", 1476 | "Epoch 38/200\n", 1477 | " - 2s - loss: 0.2565 - val_loss: 0.2559\n", 1478 | "Epoch 39/200\n", 1479 | " - 2s - loss: 0.2539 - val_loss: 0.2532\n", 1480 | "Epoch 40/200\n", 1481 | " - 2s - loss: 0.2514 - val_loss: 0.2514\n", 1482 | "Epoch 41/200\n", 1483 | " - 2s - loss: 0.2494 - val_loss: 0.2496\n", 1484 | "Epoch 42/200\n", 1485 | " - 2s - loss: 0.2472 - val_loss: 0.2468\n", 1486 | "Epoch 43/200\n", 1487 | " - 2s - loss: 0.2452 - val_loss: 0.2453\n", 1488 | "Epoch 44/200\n", 1489 | " - 2s - loss: 0.2434 - val_loss: 0.2437\n", 1490 | "Epoch 45/200\n", 1491 | " - 2s - loss: 0.2414 - val_loss: 0.2413\n", 1492 | "Epoch 46/200\n", 1493 | " - 2s - loss: 0.2395 - val_loss: 0.2396\n", 1494 | "Epoch 47/200\n", 1495 | " - 2s - loss: 0.2380 - val_loss: 0.2383\n", 1496 | "Epoch 48/200\n", 1497 | " - 2s - loss: 0.2362 - val_loss: 0.2362\n", 1498 | "Epoch 49/200\n", 1499 | " - 2s - loss: 0.2344 - val_loss: 0.2347\n", 1500 | "Epoch 50/200\n", 1501 | " - 2s - loss: 0.2328 - val_loss: 0.2333\n", 1502 | "Epoch 51/200\n", 1503 | " - 2s - loss: 0.2312 - val_loss: 0.2318\n", 1504 | "Epoch 52/200\n", 1505 | " - 2s - loss: 0.2297 - val_loss: 0.2305\n", 1506 | "Epoch 53/200\n", 1507 | " - 2s - loss: 0.2283 - val_loss: 0.2293\n", 1508 | "Epoch 54/200\n", 1509 | " - 2s - loss: 0.2269 - val_loss: 0.2278\n", 1510 | "Epoch 55/200\n", 1511 | " - 2s - loss: 0.2255 - val_loss: 0.2264\n", 1512 | "Epoch 56/200\n", 1513 | " - 2s - loss: 0.2245 - val_loss: 0.2250\n", 1514 | "Epoch 57/200\n", 1515 | " - 2s - loss: 0.2231 - val_loss: 0.2237\n", 1516 | "Epoch 58/200\n", 1517 | " - 2s - loss: 0.2216 - val_loss: 0.2227\n", 1518 | "Epoch 59/200\n", 1519 | " - 2s - loss: 0.2203 - val_loss: 0.2212\n", 1520 | "Epoch 60/200\n", 1521 | " - 2s - loss: 0.2188 - val_loss: 0.2203\n", 1522 | "Epoch 61/200\n", 1523 | " - 2s - loss: 0.2177 - val_loss: 0.2192\n", 1524 | "Epoch 62/200\n", 1525 | " - 2s - loss: 0.2166 - val_loss: 0.2186\n", 1526 | "Epoch 63/200\n", 1527 | " - 2s - loss: 0.2158 - val_loss: 0.2165\n", 1528 | "Epoch 64/200\n", 1529 | " - 2s - loss: 0.2143 - val_loss: 0.2154\n", 1530 | "Epoch 65/200\n", 1531 | " - 2s - loss: 0.2134 - val_loss: 0.2142\n", 1532 | "Epoch 66/200\n", 1533 | " - 2s - loss: 0.2122 - val_loss: 0.2136\n", 1534 | "Epoch 67/200\n", 1535 | " - 2s - loss: 0.2110 - val_loss: 0.2128\n", 1536 | "Epoch 68/200\n", 1537 | " - 2s - loss: 0.2098 - val_loss: 0.2121\n", 1538 | "Epoch 69/200\n", 1539 | " - 2s - loss: 0.2088 - val_loss: 0.2108\n", 1540 | "Epoch 70/200\n", 1541 | " - 2s - loss: 0.2080 - val_loss: 0.2102\n", 1542 | "Epoch 71/200\n", 1543 | " - 2s - loss: 0.2066 - val_loss: 0.2083\n", 1544 | "Epoch 72/200\n", 1545 | " - 2s - loss: 0.2058 - val_loss: 0.2080\n", 1546 | "Epoch 73/200\n", 1547 | " - 2s - loss: 0.2056 - val_loss: 0.2067\n", 1548 | "Epoch 74/200\n", 1549 | " - 2s - loss: 0.2039 - val_loss: 0.2059\n", 1550 | "Epoch 75/200\n", 1551 | " - 2s - loss: 0.2028 - val_loss: 0.2051\n", 1552 | "Epoch 76/200\n", 1553 | " - 2s - loss: 0.2018 - val_loss: 0.2041\n", 1554 | "Epoch 77/200\n", 1555 | " - 2s - loss: 0.2009 - val_loss: 0.2033\n", 1556 | "Epoch 78/200\n", 1557 | " - 2s - loss: 0.2001 - val_loss: 0.2025\n", 1558 | "Epoch 79/200\n", 1559 | " - 2s - loss: 0.1991 - val_loss: 0.2020\n", 1560 | "Epoch 80/200\n", 1561 | " - 2s - loss: 0.1986 - val_loss: 0.2007\n", 1562 | "Epoch 81/200\n", 1563 | " - 2s - loss: 0.1976 - val_loss: 0.2001\n", 1564 | "Epoch 82/200\n", 1565 | " - 2s - loss: 0.1967 - val_loss: 0.1992\n", 1566 | "Epoch 83/200\n", 1567 | " - 2s - loss: 0.1963 - val_loss: 0.1989\n", 1568 | "Epoch 84/200\n", 1569 | " - 2s - loss: 0.1952 - val_loss: 0.1977\n", 1570 | "Epoch 85/200\n", 1571 | " - 2s - loss: 0.1947 - val_loss: 0.1969\n", 1572 | "Epoch 86/200\n", 1573 | " - 2s - loss: 0.1935 - val_loss: 0.1963\n", 1574 | "Epoch 87/200\n", 1575 | " - 2s - loss: 0.1927 - val_loss: 0.1956\n", 1576 | "Epoch 88/200\n", 1577 | " - 2s - loss: 0.1922 - val_loss: 0.1952\n", 1578 | "Epoch 89/200\n", 1579 | " - 2s - loss: 0.1915 - val_loss: 0.1944\n", 1580 | "Epoch 90/200\n", 1581 | " - 2s - loss: 0.1914 - val_loss: 0.1938\n", 1582 | "Epoch 91/200\n", 1583 | " - 2s - loss: 0.1903 - val_loss: 0.1931\n", 1584 | "Epoch 92/200\n", 1585 | " - 2s - loss: 0.1894 - val_loss: 0.1926\n", 1586 | "Epoch 93/200\n", 1587 | " - 2s - loss: 0.1887 - val_loss: 0.1924\n", 1588 | "Epoch 94/200\n", 1589 | " - 2s - loss: 0.1881 - val_loss: 0.1910\n", 1590 | "Epoch 95/200\n", 1591 | " - 2s - loss: 0.1874 - val_loss: 0.1904\n", 1592 | "Epoch 96/200\n", 1593 | " - 2s - loss: 0.1871 - val_loss: 0.1906\n", 1594 | "Epoch 97/200\n", 1595 | " - 2s - loss: 0.1867 - val_loss: 0.1897\n", 1596 | "Epoch 98/200\n", 1597 | " - 2s - loss: 0.1860 - val_loss: 0.1891\n", 1598 | "Epoch 99/200\n", 1599 | " - 2s - loss: 0.1852 - val_loss: 0.1890\n", 1600 | "Epoch 100/200\n", 1601 | " - 2s - loss: 0.1847 - val_loss: 0.1882\n", 1602 | "Epoch 101/200\n", 1603 | " - 2s - loss: 0.1840 - val_loss: 0.1879\n", 1604 | "Epoch 102/200\n", 1605 | " - 2s - loss: 0.1836 - val_loss: 0.1869\n", 1606 | "Epoch 103/200\n", 1607 | " - 2s - loss: 0.1829 - val_loss: 0.1864\n", 1608 | "Epoch 104/200\n", 1609 | " - 2s - loss: 0.1825 - val_loss: 0.1864\n", 1610 | "Epoch 105/200\n", 1611 | " - 2s - loss: 0.1822 - val_loss: 0.1853\n", 1612 | "Epoch 106/200\n", 1613 | " - 2s - loss: 0.1818 - val_loss: 0.1851\n", 1614 | "Epoch 107/200\n", 1615 | " - 2s - loss: 0.1810 - val_loss: 0.1846\n", 1616 | "Epoch 108/200\n", 1617 | " - 2s - loss: 0.1804 - val_loss: 0.1847\n", 1618 | "Epoch 109/200\n", 1619 | " - 2s - loss: 0.1803 - val_loss: 0.1838\n", 1620 | "Epoch 110/200\n", 1621 | " - 2s - loss: 0.1799 - val_loss: 0.1837\n", 1622 | "Epoch 111/200\n", 1623 | " - 2s - loss: 0.1793 - val_loss: 0.1829\n", 1624 | "Epoch 112/200\n", 1625 | " - 2s - loss: 0.1790 - val_loss: 0.1819\n", 1626 | "Epoch 113/200\n", 1627 | " - 2s - loss: 0.1781 - val_loss: 0.1816\n", 1628 | "Epoch 114/200\n", 1629 | " - 2s - loss: 0.1784 - val_loss: 0.1811\n", 1630 | "Epoch 115/200\n", 1631 | " - 2s - loss: 0.1771 - val_loss: 0.1813\n", 1632 | "Epoch 116/200\n", 1633 | " - 2s - loss: 0.1768 - val_loss: 0.1804\n", 1634 | "Epoch 117/200\n", 1635 | " - 2s - loss: 0.1764 - val_loss: 0.1800\n", 1636 | "Epoch 118/200\n", 1637 | " - 2s - loss: 0.1761 - val_loss: 0.1798\n", 1638 | "Epoch 119/200\n", 1639 | " - 2s - loss: 0.1756 - val_loss: 0.1795\n", 1640 | "Epoch 120/200\n", 1641 | " - 2s - loss: 0.1751 - val_loss: 0.1790\n", 1642 | "Epoch 121/200\n", 1643 | " - 2s - loss: 0.1746 - val_loss: 0.1789\n", 1644 | "Epoch 122/200\n", 1645 | " - 2s - loss: 0.1743 - val_loss: 0.1785\n", 1646 | "Epoch 123/200\n", 1647 | " - 2s - loss: 0.1742 - val_loss: 0.1783\n", 1648 | "Epoch 124/200\n", 1649 | " - 2s - loss: 0.1737 - val_loss: 0.1778\n", 1650 | "Epoch 125/200\n", 1651 | " - 2s - loss: 0.1734 - val_loss: 0.1775\n", 1652 | "Epoch 126/200\n", 1653 | " - 2s - loss: 0.1739 - val_loss: 0.1774\n", 1654 | "Epoch 127/200\n", 1655 | " - 2s - loss: 0.1732 - val_loss: 0.1768\n", 1656 | "Epoch 128/200\n", 1657 | " - 2s - loss: 0.1722 - val_loss: 0.1768\n", 1658 | "Epoch 129/200\n", 1659 | " - 2s - loss: 0.1717 - val_loss: 0.1763\n", 1660 | "Epoch 130/200\n", 1661 | " - 2s - loss: 0.1713 - val_loss: 0.1757\n", 1662 | "Epoch 131/200\n", 1663 | " - 2s - loss: 0.1711 - val_loss: 0.1751\n", 1664 | "Epoch 132/200\n", 1665 | " - 2s - loss: 0.1710 - val_loss: 0.1750\n", 1666 | "Epoch 133/200\n", 1667 | " - 2s - loss: 0.1706 - val_loss: 0.1746\n", 1668 | "Epoch 134/200\n", 1669 | " - 2s - loss: 0.1703 - val_loss: 0.1745\n", 1670 | "Epoch 135/200\n", 1671 | " - 2s - loss: 0.1699 - val_loss: 0.1745\n", 1672 | "Epoch 136/200\n", 1673 | " - 2s - loss: 0.1695 - val_loss: 0.1742\n", 1674 | "Epoch 137/200\n", 1675 | " - 2s - loss: 0.1691 - val_loss: 0.1740\n", 1676 | "Epoch 138/200\n", 1677 | " - 2s - loss: 0.1688 - val_loss: 0.1734\n", 1678 | "Epoch 139/200\n", 1679 | " - 2s - loss: 0.1687 - val_loss: 0.1733\n", 1680 | "Epoch 140/200\n", 1681 | " - 2s - loss: 0.1686 - val_loss: 0.1730\n", 1682 | "Epoch 141/200\n", 1683 | " - 2s - loss: 0.1687 - val_loss: 0.1733\n", 1684 | "Epoch 142/200\n", 1685 | " - 2s - loss: 0.1682 - val_loss: 0.1729\n", 1686 | "Epoch 143/200\n", 1687 | " - 2s - loss: 0.1675 - val_loss: 0.1723\n", 1688 | "Epoch 144/200\n", 1689 | " - 2s - loss: 0.1671 - val_loss: 0.1719\n", 1690 | "Epoch 145/200\n", 1691 | " - 2s - loss: 0.1670 - val_loss: 0.1716\n", 1692 | "Epoch 146/200\n", 1693 | " - 2s - loss: 0.1668 - val_loss: 0.1714\n", 1694 | "Epoch 147/200\n", 1695 | " - 2s - loss: 0.1664 - val_loss: 0.1709\n", 1696 | "Epoch 148/200\n", 1697 | " - 2s - loss: 0.1660 - val_loss: 0.1709\n", 1698 | "Epoch 149/200\n", 1699 | " - 2s - loss: 0.1661 - val_loss: 0.1703\n", 1700 | "Epoch 150/200\n", 1701 | " - 2s - loss: 0.1656 - val_loss: 0.1704\n", 1702 | "Epoch 151/200\n", 1703 | " - 2s - loss: 0.1659 - val_loss: 0.1705\n", 1704 | "Epoch 152/200\n", 1705 | " - 2s - loss: 0.1655 - val_loss: 0.1704\n", 1706 | "Epoch 153/200\n", 1707 | " - 2s - loss: 0.1651 - val_loss: 0.1701\n" 1708 | ] 1709 | }, 1710 | { 1711 | "name": "stdout", 1712 | "output_type": "stream", 1713 | "text": [ 1714 | "Epoch 154/200\n", 1715 | " - 2s - loss: 0.1645 - val_loss: 0.1696\n", 1716 | "Epoch 155/200\n", 1717 | " - 2s - loss: 0.1643 - val_loss: 0.1694\n", 1718 | "Epoch 156/200\n", 1719 | " - 2s - loss: 0.1641 - val_loss: 0.1690\n", 1720 | "Epoch 157/200\n", 1721 | " - 2s - loss: 0.1638 - val_loss: 0.1690\n", 1722 | "Epoch 158/200\n", 1723 | " - 2s - loss: 0.1636 - val_loss: 0.1690\n", 1724 | "Epoch 159/200\n", 1725 | " - 2s - loss: 0.1640 - val_loss: 0.1684\n", 1726 | "Epoch 160/200\n", 1727 | " - 2s - loss: 0.1651 - val_loss: 0.1688\n", 1728 | "Epoch 161/200\n", 1729 | " - 2s - loss: 0.1633 - val_loss: 0.1681\n", 1730 | "Epoch 162/200\n", 1731 | " - 2s - loss: 0.1629 - val_loss: 0.1683\n", 1732 | "Epoch 163/200\n", 1733 | " - 2s - loss: 0.1625 - val_loss: 0.1681\n", 1734 | "Epoch 164/200\n", 1735 | " - 2s - loss: 0.1623 - val_loss: 0.1679\n", 1736 | "Epoch 165/200\n", 1737 | " - 2s - loss: 0.1622 - val_loss: 0.1673\n", 1738 | "Epoch 166/200\n", 1739 | " - 2s - loss: 0.1619 - val_loss: 0.1675\n", 1740 | "Epoch 167/200\n", 1741 | " - 2s - loss: 0.1617 - val_loss: 0.1669\n", 1742 | "Epoch 168/200\n", 1743 | " - 2s - loss: 0.1615 - val_loss: 0.1669\n", 1744 | "Epoch 169/200\n", 1745 | " - 2s - loss: 0.1614 - val_loss: 0.1667\n", 1746 | "Epoch 170/200\n", 1747 | " - 2s - loss: 0.1612 - val_loss: 0.1664\n", 1748 | "Epoch 171/200\n", 1749 | " - 2s - loss: 0.1616 - val_loss: 0.1669\n", 1750 | "Epoch 172/200\n", 1751 | " - 2s - loss: 0.1613 - val_loss: 0.1670\n", 1752 | "Epoch 173/200\n", 1753 | " - 2s - loss: 0.1609 - val_loss: 0.1658\n", 1754 | "Epoch 174/200\n", 1755 | " - 2s - loss: 0.1603 - val_loss: 0.1661\n", 1756 | "Epoch 175/200\n", 1757 | " - 2s - loss: 0.1601 - val_loss: 0.1658\n", 1758 | "Epoch 176/200\n", 1759 | " - 2s - loss: 0.1600 - val_loss: 0.1661\n", 1760 | "Epoch 177/200\n", 1761 | " - 2s - loss: 0.1596 - val_loss: 0.1653\n", 1762 | "Epoch 178/200\n", 1763 | " - 2s - loss: 0.1603 - val_loss: 0.1654\n", 1764 | "Epoch 179/200\n", 1765 | " - 2s - loss: 0.1598 - val_loss: 0.1656\n", 1766 | "Epoch 180/200\n", 1767 | " - 2s - loss: 0.1593 - val_loss: 0.1655\n", 1768 | "Epoch 181/200\n", 1769 | " - 2s - loss: 0.1590 - val_loss: 0.1648\n", 1770 | "Epoch 182/200\n", 1771 | " - 2s - loss: 0.1587 - val_loss: 0.1647\n", 1772 | "Epoch 183/200\n", 1773 | " - 2s - loss: 0.1586 - val_loss: 0.1650\n", 1774 | "Epoch 184/200\n", 1775 | " - 2s - loss: 0.1588 - val_loss: 0.1642\n", 1776 | "Epoch 185/200\n", 1777 | " - 2s - loss: 0.1585 - val_loss: 0.1643\n", 1778 | "Epoch 186/200\n", 1779 | " - 2s - loss: 0.1584 - val_loss: 0.1642\n", 1780 | "Epoch 187/200\n", 1781 | " - 2s - loss: 0.1579 - val_loss: 0.1644\n", 1782 | "Epoch 188/200\n", 1783 | " - 2s - loss: 0.1576 - val_loss: 0.1642\n", 1784 | "Epoch 189/200\n", 1785 | " - 2s - loss: 0.1575 - val_loss: 0.1644\n", 1786 | "Epoch 190/200\n", 1787 | " - 2s - loss: 0.1577 - val_loss: 0.1642\n", 1788 | "Epoch 191/200\n", 1789 | " - 2s - loss: 0.1627 - val_loss: 0.1636\n", 1790 | "Epoch 192/200\n", 1791 | " - 2s - loss: 0.1592 - val_loss: 0.1646\n", 1792 | "Epoch 193/200\n", 1793 | " - 2s - loss: 0.1578 - val_loss: 0.1635\n", 1794 | "Epoch 194/200\n", 1795 | " - 2s - loss: 0.1573 - val_loss: 0.1631\n", 1796 | "Epoch 195/200\n", 1797 | " - 2s - loss: 0.1569 - val_loss: 0.1632\n", 1798 | "Epoch 196/200\n", 1799 | " - 2s - loss: 0.1568 - val_loss: 0.1631\n", 1800 | "Epoch 197/200\n", 1801 | " - 2s - loss: 0.1564 - val_loss: 0.1627\n", 1802 | "Epoch 198/200\n", 1803 | " - 2s - loss: 0.1561 - val_loss: 0.1622\n", 1804 | "Epoch 199/200\n", 1805 | " - 2s - loss: 0.1560 - val_loss: 0.1626\n", 1806 | "Epoch 200/200\n", 1807 | " - 2s - loss: 0.1559 - val_loss: 0.1625\n" 1808 | ] 1809 | } 1810 | ], 1811 | "source": [ 1812 | "adam = optimizers.Adam(lr)\n", 1813 | "lstm_autoencoder.compile(loss='mse', optimizer=adam)\n", 1814 | "\n", 1815 | "cp = ModelCheckpoint(filepath=\"lstm_autoencoder_classifier.h5\",\n", 1816 | " save_best_only=True,\n", 1817 | " verbose=0)\n", 1818 | "\n", 1819 | "tb = TensorBoard(log_dir='./logs',\n", 1820 | " histogram_freq=0,\n", 1821 | " write_graph=True,\n", 1822 | " write_images=True)\n", 1823 | "\n", 1824 | "lstm_autoencoder_history = lstm_autoencoder.fit(X_train_y0_scaled, X_train_y0_scaled, \n", 1825 | " epochs=epochs, \n", 1826 | " batch_size=batch, \n", 1827 | " validation_data=(X_valid_y0_scaled, X_valid_y0_scaled),\n", 1828 | " verbose=2).history" 1829 | ] 1830 | }, 1831 | { 1832 | "cell_type": "code", 1833 | "execution_count": 95, 1834 | "metadata": {}, 1835 | "outputs": [ 1836 | { 1837 | "data": { 1838 | "image/png": "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\n", 1839 | "text/plain": [ 1840 | "
" 1841 | ] 1842 | }, 1843 | "metadata": { 1844 | "needs_background": "light" 1845 | }, 1846 | "output_type": "display_data" 1847 | } 1848 | ], 1849 | "source": [ 1850 | "plt.plot(lstm_autoencoder_history['loss'], linewidth=2, label='Train')\n", 1851 | "plt.plot(lstm_autoencoder_history['val_loss'], linewidth=2, label='Valid')\n", 1852 | "plt.legend(loc='upper right')\n", 1853 | "plt.title('Model loss')\n", 1854 | "plt.ylabel('Loss')\n", 1855 | "plt.xlabel('Epoch')\n", 1856 | "plt.show()" 1857 | ] 1858 | }, 1859 | { 1860 | "cell_type": "markdown", 1861 | "metadata": {}, 1862 | "source": [ 1863 | "### Sanity check\n", 1864 | "Doing a sanity check by validating the reconstruction error \n", 1865 | "on the train data. Here we will reconstruct the entire train \n", 1866 | "data with both 0 and 1 labels.\n", 1867 | "\n", 1868 | "**Expectation**: the reconstruction error of 0 labeled data should\n", 1869 | "be smaller than 1.\n", 1870 | "\n", 1871 | "**Caution**: do not use this result for model evaluation. It may\n", 1872 | "result into overfitting issues." 1873 | ] 1874 | }, 1875 | { 1876 | "cell_type": "code", 1877 | "execution_count": 96, 1878 | "metadata": {}, 1879 | "outputs": [ 1880 | { 1881 | "data": { 1882 | "image/png": "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\n", 1883 | "text/plain": [ 1884 | "
" 1885 | ] 1886 | }, 1887 | "metadata": { 1888 | "needs_background": "light" 1889 | }, 1890 | "output_type": "display_data" 1891 | } 1892 | ], 1893 | "source": [ 1894 | "train_x_predictions = lstm_autoencoder.predict(X_train_scaled)\n", 1895 | "mse = np.mean(np.power(flatten(X_train_scaled) - flatten(train_x_predictions), 2), axis=1)\n", 1896 | "\n", 1897 | "error_df = pd.DataFrame({'Reconstruction_error': mse,\n", 1898 | " 'True_class': y_train.tolist()})\n", 1899 | "\n", 1900 | "groups = error_df.groupby('True_class')\n", 1901 | "fig, ax = plt.subplots()\n", 1902 | "\n", 1903 | "for name, group in groups:\n", 1904 | " ax.plot(group.index, group.Reconstruction_error, marker='o', ms=3.5, linestyle='',\n", 1905 | " label= \"Break\" if name == 1 else \"Normal\")\n", 1906 | "ax.legend()\n", 1907 | "plt.title(\"Reconstruction error for different classes\")\n", 1908 | "plt.ylabel(\"Reconstruction error\")\n", 1909 | "plt.xlabel(\"Data point index\")\n", 1910 | "plt.show();" 1911 | ] 1912 | }, 1913 | { 1914 | "cell_type": "markdown", 1915 | "metadata": {}, 1916 | "source": [ 1917 | "## Predictions using the Autoencoder" 1918 | ] 1919 | }, 1920 | { 1921 | "cell_type": "code", 1922 | "execution_count": 97, 1923 | "metadata": {}, 1924 | "outputs": [ 1925 | { 1926 | "data": { 1927 | "image/png": "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\n", 1928 | "text/plain": [ 1929 | "
" 1930 | ] 1931 | }, 1932 | "metadata": { 1933 | "needs_background": "light" 1934 | }, 1935 | "output_type": "display_data" 1936 | } 1937 | ], 1938 | "source": [ 1939 | "valid_x_predictions = lstm_autoencoder.predict(X_valid_scaled)\n", 1940 | "mse = np.mean(np.power(flatten(X_valid_scaled) - flatten(valid_x_predictions), 2), axis=1)\n", 1941 | "\n", 1942 | "error_df = pd.DataFrame({'Reconstruction_error': mse,\n", 1943 | " 'True_class': y_valid.tolist()})\n", 1944 | "\n", 1945 | "precision_rt, recall_rt, threshold_rt = precision_recall_curve(error_df.True_class, error_df.Reconstruction_error)\n", 1946 | "plt.plot(threshold_rt, precision_rt[1:], label=\"Precision\",linewidth=5)\n", 1947 | "plt.plot(threshold_rt, recall_rt[1:], label=\"Recall\",linewidth=5)\n", 1948 | "plt.title('Precision and recall for different threshold values')\n", 1949 | "plt.xlabel('Threshold')\n", 1950 | "plt.ylabel('Precision/Recall')\n", 1951 | "plt.legend()\n", 1952 | "plt.show()" 1953 | ] 1954 | }, 1955 | { 1956 | "cell_type": "code", 1957 | "execution_count": 107, 1958 | "metadata": {}, 1959 | "outputs": [ 1960 | { 1961 | "data": { 1962 | "image/png": "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\n", 1963 | "text/plain": [ 1964 | "
" 1965 | ] 1966 | }, 1967 | "metadata": { 1968 | "needs_background": "light" 1969 | }, 1970 | "output_type": "display_data" 1971 | } 1972 | ], 1973 | "source": [ 1974 | "test_x_predictions = lstm_autoencoder.predict(X_test_scaled)\n", 1975 | "mse = np.mean(np.power(flatten(X_test_scaled) - flatten(test_x_predictions), 2), axis=1)\n", 1976 | "\n", 1977 | "error_df = pd.DataFrame({'Reconstruction_error': mse,\n", 1978 | " 'True_class': y_test.tolist()})\n", 1979 | "\n", 1980 | "threshold_fixed = 0.3\n", 1981 | "groups = error_df.groupby('True_class')\n", 1982 | "fig, ax = plt.subplots()\n", 1983 | "\n", 1984 | "for name, group in groups:\n", 1985 | " ax.plot(group.index, group.Reconstruction_error, marker='o', ms=3.5, linestyle='',\n", 1986 | " label= \"Break\" if name == 1 else \"Normal\")\n", 1987 | "ax.hlines(threshold_fixed, ax.get_xlim()[0], ax.get_xlim()[1], colors=\"r\", zorder=100, label='Threshold')\n", 1988 | "ax.legend()\n", 1989 | "plt.title(\"Reconstruction error for different classes\")\n", 1990 | "plt.ylabel(\"Reconstruction error\")\n", 1991 | "plt.xlabel(\"Data point index\")\n", 1992 | "plt.show();" 1993 | ] 1994 | }, 1995 | { 1996 | "cell_type": "code", 1997 | "execution_count": 108, 1998 | "metadata": {}, 1999 | "outputs": [], 2000 | "source": [ 2001 | "pred_y = [1 if e > threshold_fixed else 0 for e in error_df.Reconstruction_error.values]" 2002 | ] 2003 | }, 2004 | { 2005 | "cell_type": "code", 2006 | "execution_count": 109, 2007 | "metadata": {}, 2008 | "outputs": [ 2009 | { 2010 | "data": { 2011 | "image/png": "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\n", 2012 | "text/plain": [ 2013 | "
" 2014 | ] 2015 | }, 2016 | "metadata": { 2017 | "needs_background": "light" 2018 | }, 2019 | "output_type": "display_data" 2020 | } 2021 | ], 2022 | "source": [ 2023 | "conf_matrix = confusion_matrix(error_df.True_class, pred_y)\n", 2024 | "\n", 2025 | "plt.figure(figsize=(6, 6))\n", 2026 | "sns.heatmap(conf_matrix, xticklabels=LABELS, yticklabels=LABELS, annot=True, fmt=\"d\");\n", 2027 | "plt.title(\"Confusion matrix\")\n", 2028 | "plt.ylabel('True class')\n", 2029 | "plt.xlabel('Predicted class')\n", 2030 | "plt.show()" 2031 | ] 2032 | }, 2033 | { 2034 | "cell_type": "code", 2035 | "execution_count": 78, 2036 | "metadata": {}, 2037 | "outputs": [ 2038 | { 2039 | "data": { 2040 | "image/png": "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\n", 2041 | "text/plain": [ 2042 | "
" 2043 | ] 2044 | }, 2045 | "metadata": { 2046 | "needs_background": "light" 2047 | }, 2048 | "output_type": "display_data" 2049 | } 2050 | ], 2051 | "source": [ 2052 | "false_pos_rate, true_pos_rate, thresholds = roc_curve(error_df.True_class, error_df.Reconstruction_error)\n", 2053 | "roc_auc = auc(false_pos_rate, true_pos_rate,)\n", 2054 | "\n", 2055 | "plt.plot(false_pos_rate, true_pos_rate, linewidth=5, label='AUC = %0.3f'% roc_auc)\n", 2056 | "plt.plot([0,1],[0,1], linewidth=5)\n", 2057 | "\n", 2058 | "plt.xlim([-0.01, 1])\n", 2059 | "plt.ylim([0, 1.01])\n", 2060 | "plt.legend(loc='lower right')\n", 2061 | "plt.title('Receiver operating characteristic curve (ROC)')\n", 2062 | "plt.ylabel('True Positive Rate')\n", 2063 | "plt.xlabel('False Positive Rate')\n", 2064 | "plt.show()" 2065 | ] 2066 | } 2067 | ], 2068 | "metadata": { 2069 | "kernelspec": { 2070 | "display_name": "Python 3", 2071 | "language": "python", 2072 | "name": "python3" 2073 | }, 2074 | "language_info": { 2075 | "codemirror_mode": { 2076 | "name": "ipython", 2077 | "version": 3 2078 | }, 2079 | "file_extension": ".py", 2080 | "mimetype": "text/x-python", 2081 | "name": "python", 2082 | "nbconvert_exporter": "python", 2083 | "pygments_lexer": "ipython3", 2084 | "version": "3.7.1" 2085 | } 2086 | }, 2087 | "nbformat": 4, 2088 | "nbformat_minor": 2 2089 | } 2090 | --------------------------------------------------------------------------------