├── .gitattributes ├── README.md ├── plot_showing_the_train_and_test_loss_during_training.ipynb └── Air_Quality_Forecasting_Outlier_Detection_in_Multivariate_Time_Series_Data.ipynb /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Air-Quality-Forecasting--Outlier-Detection-in-Multivariate-Time-Series-Data 2 | This is a dataset that reports on the weather and the level of pollution each hour for five years at the US embassy in Beijing, China. 3 | 4 | The data includes the date-time, the pollution called PM2.5 concentration, and the weather information including dew point, temperature, pressure, wind direction, wind speed and the cumulative number of hours of snow and rain. The complete feature list in the raw data is as follows: 5 | 6 | No: row number 7 | year: year of data in this row 8 | month: month of data in this row 9 | day: day of data in this row 10 | hour: hour of data in this row 11 | pm2.5: PM2.5 concentration 12 | DEWP: Dew Point 13 | TEMP: Temperature 14 | PRES: Pressure 15 | cbwd: Combined wind direction 16 | Iws: Cumulated wind speed 17 | Is: Cumulated hours of snow 18 | Ir: Cumulated hours of rain 19 | 20 | We can use this data and frame a forecasting problem where, given the weather conditions and pollution for prior hours, we forecast the pollution at the next hour. 21 | 22 | This dataset can be used to frame other forecasting problems. -------------------------------------------------------------------------------- /plot_showing_the_train_and_test_loss_during_training.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "name": "plot showing the train and test loss during training.ipynb", 7 | "version": "0.3.2", 8 | "provenance": [], 9 | "include_colab_link": true 10 | }, 11 | "kernelspec": { 12 | "name": "python3", 13 | "display_name": "Python 3" 14 | } 15 | }, 16 | "cells": [ 17 | { 18 | "cell_type": "markdown", 19 | "metadata": { 20 | "id": "view-in-github", 21 | "colab_type": "text" 22 | }, 23 | "source": [ 24 | "\"Open" 25 | ] 26 | }, 27 | { 28 | "metadata": { 29 | "id": "sSVoxDMlVzqW", 30 | "colab_type": "code", 31 | "colab": { 32 | "base_uri": "https://localhost:8080/", 33 | "height": 35 34 | }, 35 | "outputId": "9f09eef8-15b6-4757-c84a-7fbe2af64bbd" 36 | }, 37 | "cell_type": "code", 38 | "source": [ 39 | "from math import sqrt\n", 40 | "from numpy import concatenate\n", 41 | "from matplotlib import pyplot\n", 42 | "from pandas import read_csv\n", 43 | "from pandas import DataFrame\n", 44 | "from pandas import concat\n", 45 | "from sklearn.preprocessing import MinMaxScaler\n", 46 | "from sklearn.preprocessing import LabelEncoder\n", 47 | "from sklearn.metrics import mean_squared_error\n", 48 | "from keras.models import Sequential\n", 49 | "from keras.layers import Dense\n", 50 | "from keras.layers import LSTM\n", 51 | " \n", 52 | "# convert series to supervised learning\n", 53 | "def series_to_supervised(data, n_in=1, n_out=1, dropnan=True):\n", 54 | "\tn_vars = 1 if type(data) is list else data.shape[1]\n", 55 | "\tdf = DataFrame(data)\n", 56 | "\tcols, names = list(), list()\n", 57 | "\t# input sequence (t-n, ... t-1)\n", 58 | "\tfor i in range(n_in, 0, -1):\n", 59 | "\t\tcols.append(df.shift(i))\n", 60 | "\t\tnames += [('var%d(t-%d)' % (j+1, i)) for j in range(n_vars)]\n", 61 | "\t# forecast sequence (t, t+1, ... t+n)\n", 62 | "\tfor i in range(0, n_out):\n", 63 | "\t\tcols.append(df.shift(-i))\n", 64 | "\t\tif i == 0:\n", 65 | "\t\t\tnames += [('var%d(t)' % (j+1)) for j in range(n_vars)]\n", 66 | "\t\telse:\n", 67 | "\t\t\tnames += [('var%d(t+%d)' % (j+1, i)) for j in range(n_vars)]\n", 68 | "\t# put it all together\n", 69 | "\tagg = concat(cols, axis=1)\n", 70 | "\tagg.columns = names\n", 71 | "\t# drop rows with NaN values\n", 72 | "\tif dropnan:\n", 73 | "\t\tagg.dropna(inplace=True)\n", 74 | "\treturn agg" 75 | ], 76 | "execution_count": 1, 77 | "outputs": [ 78 | { 79 | "output_type": "stream", 80 | "text": [ 81 | "Using TensorFlow backend.\n" 82 | ], 83 | "name": "stderr" 84 | } 85 | ] 86 | }, 87 | { 88 | "metadata": { 89 | "id": "A2A9vUdkWmV6", 90 | "colab_type": "code", 91 | "colab": { 92 | "base_uri": "https://localhost:8080/", 93 | "height": 254 94 | }, 95 | "outputId": "3f5fbcac-731f-49c1-dd6a-c53cd9a7fece" 96 | }, 97 | "cell_type": "code", 98 | "source": [ 99 | "# load dataset\n", 100 | "dataset = read_csv('pollution.csv', header=0, index_col=0)\n", 101 | "values = dataset.values\n", 102 | "# integer encode direction\n", 103 | "encoder = LabelEncoder()\n", 104 | "values[:,4] = encoder.fit_transform(values[:,4])\n", 105 | "# ensure all data is float\n", 106 | "values = values.astype('float32')\n", 107 | "# normalize features\n", 108 | "scaler = MinMaxScaler(feature_range=(0, 1))\n", 109 | "scaled = scaler.fit_transform(values)\n", 110 | "# frame as supervised learning\n", 111 | "reframed = series_to_supervised(scaled, 1, 1)\n", 112 | "# drop columns we don't want to predict\n", 113 | "reframed.drop(reframed.columns[[9,10,11,12,13,14,15]], axis=1, inplace=True)\n", 114 | "print(reframed.head())" 115 | ], 116 | "execution_count": 2, 117 | "outputs": [ 118 | { 119 | "output_type": "stream", 120 | "text": [ 121 | " var1(t-1) var2(t-1) var3(t-1) var4(t-1) var5(t-1) var6(t-1) \\\n", 122 | "1 0.129779 0.352941 0.245902 0.527273 0.666667 0.002290 \n", 123 | "2 0.148893 0.367647 0.245902 0.527273 0.666667 0.003811 \n", 124 | "3 0.159960 0.426471 0.229508 0.545454 0.666667 0.005332 \n", 125 | "4 0.182093 0.485294 0.229508 0.563637 0.666667 0.008391 \n", 126 | "5 0.138833 0.485294 0.229508 0.563637 0.666667 0.009912 \n", 127 | "\n", 128 | " var7(t-1) var8(t-1) var1(t) \n", 129 | "1 0.000000 0.0 0.148893 \n", 130 | "2 0.000000 0.0 0.159960 \n", 131 | "3 0.000000 0.0 0.182093 \n", 132 | "4 0.037037 0.0 0.138833 \n", 133 | "5 0.074074 0.0 0.109658 \n" 134 | ], 135 | "name": "stdout" 136 | } 137 | ] 138 | }, 139 | { 140 | "metadata": { 141 | "id": "XUtvaLLdWq-j", 142 | "colab_type": "code", 143 | "colab": { 144 | "base_uri": "https://localhost:8080/", 145 | "height": 35 146 | }, 147 | "outputId": "4e03eb8c-59eb-4cbe-c19c-b96fa0174060" 148 | }, 149 | "cell_type": "code", 150 | "source": [ 151 | "# split into train and test sets\n", 152 | "values = reframed.values\n", 153 | "n_train_hours = 365 * 24\n", 154 | "train = values[:n_train_hours, :]\n", 155 | "test = values[n_train_hours:, :]\n", 156 | "# split into input and outputs\n", 157 | "train_X, train_y = train[:, :-1], train[:, -1]\n", 158 | "test_X, test_y = test[:, :-1], test[:, -1]\n", 159 | "# reshape input to be 3D [samples, timesteps, features]\n", 160 | "train_X = train_X.reshape((train_X.shape[0], 1, train_X.shape[1]))\n", 161 | "test_X = test_X.reshape((test_X.shape[0], 1, test_X.shape[1]))\n", 162 | "print(train_X.shape, train_y.shape, test_X.shape, test_y.shape)" 163 | ], 164 | "execution_count": 3, 165 | "outputs": [ 166 | { 167 | "output_type": "stream", 168 | "text": [ 169 | "(8760, 1, 8) (8760,) (35039, 1, 8) (35039,)\n" 170 | ], 171 | "name": "stdout" 172 | } 173 | ] 174 | }, 175 | { 176 | "metadata": { 177 | "id": "EfLp4JJ0WuE2", 178 | "colab_type": "code", 179 | "colab": { 180 | "base_uri": "https://localhost:8080/", 181 | "height": 92 182 | }, 183 | "outputId": "5554fabe-7c91-41c6-d498-a310f713b69a" 184 | }, 185 | "cell_type": "code", 186 | "source": [ 187 | "# design network\n", 188 | "model = Sequential()\n", 189 | "model.add(LSTM(50, input_shape=(train_X.shape[1], train_X.shape[2])))\n", 190 | "model.add(Dense(1))\n", 191 | "model.compile(loss='mae', optimizer='adam')" 192 | ], 193 | "execution_count": 4, 194 | "outputs": [ 195 | { 196 | "output_type": "stream", 197 | "text": [ 198 | "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/op_def_library.py:263: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.\n", 199 | "Instructions for updating:\n", 200 | "Colocations handled automatically by placer.\n" 201 | ], 202 | "name": "stdout" 203 | } 204 | ] 205 | }, 206 | { 207 | "metadata": { 208 | "id": "_vbbbcr-Wwer", 209 | "colab_type": "code", 210 | "colab": { 211 | "base_uri": "https://localhost:8080/", 212 | "height": 1928 213 | }, 214 | "outputId": "8a8aa612-d2c8-4b8a-9376-ced1efe1ac52" 215 | }, 216 | "cell_type": "code", 217 | "source": [ 218 | "# fit network\n", 219 | "history = model.fit(train_X, train_y, epochs=50, batch_size=72, validation_data=(test_X, test_y), verbose=2, shuffle=False)" 220 | ], 221 | "execution_count": 5, 222 | "outputs": [ 223 | { 224 | "output_type": "stream", 225 | "text": [ 226 | "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-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.\n", 227 | "Instructions for updating:\n", 228 | "Use tf.cast instead.\n", 229 | "Train on 8760 samples, validate on 35039 samples\n", 230 | "Epoch 1/50\n", 231 | " - 1s - loss: 0.0620 - val_loss: 0.0532\n", 232 | "Epoch 2/50\n", 233 | " - 1s - loss: 0.0422 - val_loss: 0.0593\n", 234 | "Epoch 3/50\n", 235 | " - 1s - loss: 0.0256 - val_loss: 0.0513\n", 236 | "Epoch 4/50\n", 237 | " - 1s - loss: 0.0177 - val_loss: 0.0432\n", 238 | "Epoch 5/50\n", 239 | " - 1s - loss: 0.0160 - val_loss: 0.0302\n", 240 | "Epoch 6/50\n", 241 | " - 1s - loss: 0.0152 - val_loss: 0.0218\n", 242 | "Epoch 7/50\n", 243 | " - 1s - loss: 0.0149 - val_loss: 0.0183\n", 244 | "Epoch 8/50\n", 245 | " - 1s - loss: 0.0148 - val_loss: 0.0177\n", 246 | "Epoch 9/50\n", 247 | " - 1s - loss: 0.0148 - val_loss: 0.0168\n", 248 | "Epoch 10/50\n", 249 | " - 1s - loss: 0.0146 - val_loss: 0.0157\n", 250 | "Epoch 11/50\n", 251 | " - 1s - loss: 0.0147 - val_loss: 0.0155\n", 252 | "Epoch 12/50\n", 253 | " - 1s - loss: 0.0146 - val_loss: 0.0148\n", 254 | "Epoch 13/50\n", 255 | " - 1s - loss: 0.0146 - val_loss: 0.0146\n", 256 | "Epoch 14/50\n", 257 | " - 1s - loss: 0.0146 - val_loss: 0.0144\n", 258 | "Epoch 15/50\n", 259 | " - 1s - loss: 0.0145 - val_loss: 0.0143\n", 260 | "Epoch 16/50\n", 261 | " - 1s - loss: 0.0146 - val_loss: 0.0140\n", 262 | "Epoch 17/50\n", 263 | " - 1s - loss: 0.0145 - val_loss: 0.0139\n", 264 | "Epoch 18/50\n", 265 | " - 1s - loss: 0.0146 - val_loss: 0.0138\n", 266 | "Epoch 19/50\n", 267 | " - 1s - loss: 0.0145 - val_loss: 0.0140\n", 268 | "Epoch 20/50\n", 269 | " - 1s - loss: 0.0146 - val_loss: 0.0138\n", 270 | "Epoch 21/50\n", 271 | " - 1s - loss: 0.0146 - val_loss: 0.0138\n", 272 | "Epoch 22/50\n", 273 | " - 1s - loss: 0.0146 - val_loss: 0.0138\n", 274 | "Epoch 23/50\n", 275 | " - 1s - loss: 0.0146 - val_loss: 0.0140\n", 276 | "Epoch 24/50\n", 277 | " - 1s - loss: 0.0146 - val_loss: 0.0136\n", 278 | "Epoch 25/50\n", 279 | " - 1s - loss: 0.0144 - val_loss: 0.0138\n", 280 | "Epoch 26/50\n", 281 | " - 1s - loss: 0.0145 - val_loss: 0.0137\n", 282 | "Epoch 27/50\n", 283 | " - 1s - loss: 0.0146 - val_loss: 0.0141\n", 284 | "Epoch 28/50\n", 285 | " - 1s - loss: 0.0147 - val_loss: 0.0138\n", 286 | "Epoch 29/50\n", 287 | " - 1s - loss: 0.0146 - val_loss: 0.0137\n", 288 | "Epoch 30/50\n", 289 | " - 1s - loss: 0.0145 - val_loss: 0.0137\n", 290 | "Epoch 31/50\n", 291 | " - 1s - loss: 0.0144 - val_loss: 0.0137\n", 292 | "Epoch 32/50\n", 293 | " - 1s - loss: 0.0144 - val_loss: 0.0136\n", 294 | "Epoch 33/50\n", 295 | " - 1s - loss: 0.0145 - val_loss: 0.0136\n", 296 | "Epoch 34/50\n", 297 | " - 1s - loss: 0.0144 - val_loss: 0.0137\n", 298 | "Epoch 35/50\n", 299 | " - 1s - loss: 0.0145 - val_loss: 0.0136\n", 300 | "Epoch 36/50\n", 301 | " - 1s - loss: 0.0144 - val_loss: 0.0136\n", 302 | "Epoch 37/50\n", 303 | " - 1s - loss: 0.0144 - val_loss: 0.0135\n", 304 | "Epoch 38/50\n", 305 | " - 1s - loss: 0.0144 - val_loss: 0.0135\n", 306 | "Epoch 39/50\n", 307 | " - 1s - loss: 0.0146 - val_loss: 0.0136\n", 308 | "Epoch 40/50\n", 309 | " - 1s - loss: 0.0144 - val_loss: 0.0136\n", 310 | "Epoch 41/50\n", 311 | " - 1s - loss: 0.0145 - val_loss: 0.0135\n", 312 | "Epoch 42/50\n", 313 | " - 1s - loss: 0.0145 - val_loss: 0.0136\n", 314 | "Epoch 43/50\n", 315 | " - 1s - loss: 0.0144 - val_loss: 0.0135\n", 316 | "Epoch 44/50\n", 317 | " - 1s - loss: 0.0144 - val_loss: 0.0135\n", 318 | "Epoch 45/50\n", 319 | " - 1s - loss: 0.0144 - val_loss: 0.0135\n", 320 | "Epoch 46/50\n", 321 | " - 1s - loss: 0.0144 - val_loss: 0.0137\n", 322 | "Epoch 47/50\n", 323 | " - 1s - loss: 0.0146 - val_loss: 0.0136\n", 324 | "Epoch 48/50\n", 325 | " - 1s - loss: 0.0144 - val_loss: 0.0136\n", 326 | "Epoch 49/50\n", 327 | " - 1s - loss: 0.0143 - val_loss: 0.0136\n", 328 | "Epoch 50/50\n", 329 | " - 1s - loss: 0.0144 - val_loss: 0.0135\n" 330 | ], 331 | "name": "stdout" 332 | } 333 | ] 334 | }, 335 | { 336 | "metadata": { 337 | "id": "4iHKXi02WzGs", 338 | "colab_type": "code", 339 | "colab": { 340 | "base_uri": "https://localhost:8080/", 341 | "height": 269 342 | }, 343 | "outputId": "9b1b2965-dd68-431b-b0e3-f270f55d54e1" 344 | }, 345 | "cell_type": "code", 346 | "source": [ 347 | "# plot history\n", 348 | "pyplot.plot(history.history['loss'], label='train')\n", 349 | "pyplot.plot(history.history['val_loss'], label='test')\n", 350 | "pyplot.legend()\n", 351 | "pyplot.show()" 352 | ], 353 | "execution_count": 6, 354 | "outputs": [ 355 | { 356 | "output_type": "display_data", 357 | "data": { 358 | "image/png": "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\nTkSuQmCC\n", 359 | "text/plain": [ 360 | "
" 361 | ] 362 | }, 363 | "metadata": { 364 | "tags": [] 365 | } 366 | } 367 | ] 368 | }, 369 | { 370 | "metadata": { 371 | "id": "oFAojwrBW9fn", 372 | "colab_type": "code", 373 | "colab": {} 374 | }, 375 | "cell_type": "code", 376 | "source": [ 377 | "\n", 378 | "# make a prediction\n", 379 | "yhat = model.predict(test_X)\n", 380 | "test_X = test_X.reshape((test_X.shape[0], test_X.shape[2]))" 381 | ], 382 | "execution_count": 0, 383 | "outputs": [] 384 | }, 385 | { 386 | "metadata": { 387 | "id": "mKuBjWBsXAj6", 388 | "colab_type": "code", 389 | "colab": {} 390 | }, 391 | "cell_type": "code", 392 | "source": [ 393 | "# invert scaling for forecast\n", 394 | "inv_yhat = concatenate((yhat, test_X[:, 1:]), axis=1)\n", 395 | "inv_yhat = scaler.inverse_transform(inv_yhat)\n", 396 | "inv_yhat = inv_yhat[:,0]" 397 | ], 398 | "execution_count": 0, 399 | "outputs": [] 400 | }, 401 | { 402 | "metadata": { 403 | "id": "1vGPo-7NXCns", 404 | "colab_type": "code", 405 | "colab": {} 406 | }, 407 | "cell_type": "code", 408 | "source": [ 409 | "# invert scaling for actual\n", 410 | "test_y = test_y.reshape((len(test_y), 1))\n", 411 | "inv_y = concatenate((test_y, test_X[:, 1:]), axis=1)\n", 412 | "inv_y = scaler.inverse_transform(inv_y)\n", 413 | "inv_y = inv_y[:,0]" 414 | ], 415 | "execution_count": 0, 416 | "outputs": [] 417 | }, 418 | { 419 | "metadata": { 420 | "id": "MotEwUTPXE2R", 421 | "colab_type": "code", 422 | "colab": { 423 | "base_uri": "https://localhost:8080/", 424 | "height": 35 425 | }, 426 | "outputId": "fed06c82-4c16-4c39-cc02-13223bf3d133" 427 | }, 428 | "cell_type": "code", 429 | "source": [ 430 | "# calculate RMSE\n", 431 | "rmse = sqrt(mean_squared_error(inv_y, inv_yhat))\n", 432 | "print('Test RMSE: %.3f' % rmse)" 433 | ], 434 | "execution_count": 10, 435 | "outputs": [ 436 | { 437 | "output_type": "stream", 438 | "text": [ 439 | "Test RMSE: 26.531\n" 440 | ], 441 | "name": "stdout" 442 | } 443 | ] 444 | } 445 | ] 446 | } -------------------------------------------------------------------------------- /Air_Quality_Forecasting_Outlier_Detection_in_Multivariate_Time_Series_Data.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "name": "Air-Quality-Forecasting--Outlier-Detection-in-Multivariate-Time-Series-Data.ipynb", 7 | "version": "0.3.2", 8 | "provenance": [], 9 | "include_colab_link": true 10 | }, 11 | "kernelspec": { 12 | "name": "python3", 13 | "display_name": "Python 3" 14 | } 15 | }, 16 | "cells": [ 17 | { 18 | "cell_type": "markdown", 19 | "metadata": { 20 | "id": "view-in-github", 21 | "colab_type": "text" 22 | }, 23 | "source": [ 24 | "\"Open" 25 | ] 26 | }, 27 | { 28 | "metadata": { 29 | "id": "g7uDTklaeAYU", 30 | "colab_type": "code", 31 | "colab": {} 32 | }, 33 | "cell_type": "code", 34 | "source": [ 35 | "from pandas import read_csv\n", 36 | "from datetime import datetime" 37 | ], 38 | "execution_count": 0, 39 | "outputs": [] 40 | }, 41 | { 42 | "metadata": { 43 | "id": "86Td17FmeFSO", 44 | "colab_type": "code", 45 | "colab": { 46 | "base_uri": "https://localhost:8080/", 47 | "height": 145 48 | }, 49 | "outputId": "41683e30-2fca-494c-8a73-fcb01fd1dcff" 50 | }, 51 | "cell_type": "code", 52 | "source": [ 53 | "# load data\n", 54 | "def parse(x):\n", 55 | "\treturn datetime.strptime(x, '%Y %m %d %H')\n", 56 | "dataset = read_csv('raw.csv', parse_dates = [['year', 'month', 'day', 'hour']], index_col=0, date_parser=parse)\n", 57 | "dataset.drop('No', axis=1, inplace=True)\n", 58 | "# manually specify column names\n", 59 | "dataset.columns = ['pollution', 'dew', 'temp', 'press', 'wnd_dir', 'wnd_spd', 'snow', 'rain']\n", 60 | "dataset.index.name = 'date'\n", 61 | "# mark all NA values with 0\n", 62 | "dataset['pollution'].fillna(0, inplace=True)\n", 63 | "# drop the first 24 hours\n", 64 | "dataset = dataset[24:]\n", 65 | "# summarize first 5 rows\n", 66 | "print(dataset.head(5))\n", 67 | "# save to file\n", 68 | "dataset.to_csv('pollution.csv')" 69 | ], 70 | "execution_count": 21, 71 | "outputs": [ 72 | { 73 | "output_type": "stream", 74 | "text": [ 75 | " pollution dew temp press wnd_dir wnd_spd snow rain\n", 76 | "date \n", 77 | "2010-01-02 00:00:00 129.0 -16 -4.0 1020.0 SE 1.79 0 0\n", 78 | "2010-01-02 01:00:00 148.0 -15 -4.0 1020.0 SE 2.68 0 0\n", 79 | "2010-01-02 02:00:00 159.0 -11 -5.0 1021.0 SE 3.57 0 0\n", 80 | "2010-01-02 03:00:00 181.0 -7 -5.0 1022.0 SE 5.36 1 0\n", 81 | "2010-01-02 04:00:00 138.0 -7 -5.0 1022.0 SE 6.25 2 0\n" 82 | ], 83 | "name": "stdout" 84 | } 85 | ] 86 | }, 87 | { 88 | "metadata": { 89 | "id": "Q724jN-te5Fu", 90 | "colab_type": "code", 91 | "colab": { 92 | "base_uri": "https://localhost:8080/", 93 | "height": 269 94 | }, 95 | "outputId": "f9abdc1c-f114-4d24-8243-2b75a5ece61b" 96 | }, 97 | "cell_type": "code", 98 | "source": [ 99 | "from pandas import read_csv\n", 100 | "from matplotlib import pyplot\n", 101 | "# load dataset\n", 102 | "dataset = read_csv('pollution.csv', header=0, index_col=0)\n", 103 | "values = dataset.values\n", 104 | "# specify columns to plot\n", 105 | "groups = [0, 1, 2, 3, 5, 6, 7]\n", 106 | "i = 1\n", 107 | "# plot each column\n", 108 | "pyplot.figure()\n", 109 | "for group in groups:\n", 110 | "\tpyplot.subplot(len(groups), 1, i)\n", 111 | "\tpyplot.plot(values[:, group])\n", 112 | "\tpyplot.title(dataset.columns[group], y=0.5, loc='right')\n", 113 | "\ti += 1\n", 114 | "pyplot.show()" 115 | ], 116 | "execution_count": 20, 117 | "outputs": [ 118 | { 119 | "output_type": "display_data", 120 | "data": { 121 | "image/png": "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\n09BozWRlZZGXl8eAAQMAiImJoU2bNvTvr8z2Pn78OAMGDOD06dP07t2b9PR09Ho9HTt2pFcvZRKl\nlJKUlBSysrLw9PSka9euJCUlMXbs2CorotleOy0tDb1ej5eXFyEhIXTq1ImsrCyysrLw9/cnOzsb\nb29vevfuTWCgEtWgvLychIQESkpKaNu2LX5+fhgMBvr27cuRI0eyHPUOcniyWHV/KGGkTwBRqBMU\nUCaGbQXOqf87qOkCWAzEAceBsbWdv6lOFmtqfLIzTvZ5fp383/pTjV0UDY1mx/nz52VQUJA0GAwy\nJSVF9u7dW/bo0cO8r3379tJgMEhAzp07V+bm5sqLFy/K4OBguXHjRimllJ9++qkcPHiwTExMlNnZ\n2XLq1KkSkDpd9RNFi4qKZLt27WRsbKyUUsrU1FQZExMjpZTym2++kZ6ennLRokWyoqJCLl++XAYG\nBsrs7GwppZRXXnmlfPbZZ2VZWZkMDw+XAQEB8t5775VS1m2ymLO6jNOklKNlpduUKcz0QGC7+hus\nw0w/ihJmWsMJmOLbeDfDAFYaGo1Nv379aNeuHVFRUURERDBr1ixCQkKIjY0lPDycyZMn4+GhfFvz\n58+nffv29O7dm2nTphEVpawkt3LlSp555hl69epFx44deeGFFxy6toeHBzExMZSWltK9e3eGDRtm\n3telSxeeeeYZvL29ufPOOxk8eDDr168nMTGRQ4cO8frrr+Pr68uUKVO44YYb6nXvrmoxbkIJL436\n/2aL9O9VIXgAMIWZ1mggOk0IaGg0iLCwMHbt2kVERARhYWFMnTqV8PBwwsPDCQurXOuiW7fKtTD8\n/f0pKlKCRKamptKrV2XcpT59+tR6zbZt27JixQo+++wzunfvzty5c4mNjTXv79Gjh5UqqU+fPqSm\nppKamkqHDh1o27at1b764IwWQwJbhBBHhBCPqml1DTNthTtCSbc0KgyKbcfbqymtTquhUTdGLNjM\nxzvjGuXaJiGwe/duwsLCCAsLsysEqqN79+4kJVU2b4mJiTXkrmTWrFls3bqVtLQ0hgwZwiOPPGLe\nl5KSYlK7m88ZEhJC9+7dyc3Npbi42GpffXCGELhaSjkWRdXzhBBiiuVOVT9VJ+uzlHKplHK8lHJ8\n585NPyRtU8A0EjAam7ahX6N6zlwqJPJCTmMXo1EpLNfzzuYzjXLtsLAwdu7cSWlpKT179mTy5Mls\n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\nlecCUYUMpgAAAABJRU5ErkJggg==\n", 122 | "text/plain": [ 123 | "
" 124 | ] 125 | }, 126 | "metadata": { 127 | "tags": [] 128 | } 129 | } 130 | ] 131 | }, 132 | { 133 | "metadata": { 134 | "id": "dVHV0OS5e-NY", 135 | "colab_type": "code", 136 | "colab": { 137 | "base_uri": "https://localhost:8080/", 138 | "height": 35 139 | }, 140 | "outputId": "36a4532e-3c42-447f-8980-0000e2276e47" 141 | }, 142 | "cell_type": "code", 143 | "source": [ 144 | "from math import sqrt\n", 145 | "from numpy import concatenate\n", 146 | "from matplotlib import pyplot\n", 147 | "from pandas import read_csv\n", 148 | "from pandas import DataFrame\n", 149 | "from pandas import concat\n", 150 | "from sklearn.preprocessing import MinMaxScaler\n", 151 | "from sklearn.preprocessing import LabelEncoder\n", 152 | "from sklearn.metrics import mean_squared_error\n", 153 | "from keras.models import Sequential\n", 154 | "from keras.layers import Dense\n", 155 | "from keras.layers import LSTM\n", 156 | "\n", 157 | "# convert series to supervised learning\n", 158 | "def series_to_supervised(data, n_in=1, n_out=1, dropnan=True):\n", 159 | "\tn_vars = 1 if type(data) is list else data.shape[1]\n", 160 | "\tdf = DataFrame(data)\n", 161 | "\tcols, names = list(), list()\n", 162 | "\t# input sequence (t-n, ... t-1)\n", 163 | "\tfor i in range(n_in, 0, -1):\n", 164 | "\t\tcols.append(df.shift(i))\n", 165 | "\t\tnames += [('var%d(t-%d)' % (j+1, i)) for j in range(n_vars)]\n", 166 | "\t# forecast sequence (t, t+1, ... t+n)\n", 167 | "\tfor i in range(0, n_out):\n", 168 | "\t\tcols.append(df.shift(-i))\n", 169 | "\t\tif i == 0:\n", 170 | "\t\t\tnames += [('var%d(t)' % (j+1)) for j in range(n_vars)]\n", 171 | "\t\telse:\n", 172 | "\t\t\tnames += [('var%d(t+%d)' % (j+1, i)) for j in range(n_vars)]\n", 173 | "\t# put it all together\n", 174 | "\tagg = concat(cols, axis=1)\n", 175 | "\tagg.columns = names\n", 176 | "\t# drop rows with NaN values\n", 177 | "\tif dropnan:\n", 178 | "\t\tagg.dropna(inplace=True)\n", 179 | "\treturn agg\n", 180 | "\n", 181 | "# load dataset\n", 182 | "dataset = read_csv('pollution.csv', header=0, index_col=0)\n", 183 | "values = dataset.values\n", 184 | "# integer encode direction\n", 185 | "encoder = LabelEncoder()\n", 186 | "values[:,4] = encoder.fit_transform(values[:,4])\n", 187 | "# ensure all data is float\n", 188 | "values = values.astype('float32')\n", 189 | "# normalize features\n", 190 | "scaler = MinMaxScaler(feature_range=(0, 1))\n", 191 | "scaled = scaler.fit_transform(values)\n", 192 | "# specify the number of lag hours\n", 193 | "n_hours = 3\n", 194 | "n_features = 8\n", 195 | "# frame as supervised learning\n", 196 | "reframed = series_to_supervised(scaled, n_hours, 1)\n", 197 | "print(reframed.shape)\n", 198 | "\n" 199 | ], 200 | "execution_count": 19, 201 | "outputs": [ 202 | { 203 | "output_type": "stream", 204 | "text": [ 205 | "(43797, 32)\n" 206 | ], 207 | "name": "stdout" 208 | } 209 | ] 210 | }, 211 | { 212 | "metadata": { 213 | "id": "cBU9yCPSQUlT", 214 | "colab_type": "code", 215 | "colab": { 216 | "base_uri": "https://localhost:8080/", 217 | "height": 2142 218 | }, 219 | "outputId": "c1a4e0f5-7de0-4278-fc35-bcaf5ee4c9c4" 220 | }, 221 | "cell_type": "code", 222 | "source": [ 223 | "# split into train and test sets\n", 224 | "values = reframed.values\n", 225 | "n_train_hours = 365 * 24\n", 226 | "train = values[:n_train_hours, :]\n", 227 | "test = values[n_train_hours:, :]\n", 228 | "# split into input and outputs\n", 229 | "n_obs = n_hours * n_features\n", 230 | "train_X, train_y = train[:, :n_obs], train[:, -n_features]\n", 231 | "test_X, test_y = test[:, :n_obs], test[:, -n_features]\n", 232 | "print(train_X.shape, len(train_X), train_y.shape)\n", 233 | "# reshape input to be 3D [samples, timesteps, features]\n", 234 | "train_X = train_X.reshape((train_X.shape[0], n_hours, n_features))\n", 235 | "test_X = test_X.reshape((test_X.shape[0], n_hours, n_features))\n", 236 | "print(train_X.shape, train_y.shape, test_X.shape, test_y.shape)\n", 237 | "\n", 238 | "# design network\n", 239 | "model = Sequential()\n", 240 | "model.add(LSTM(50, input_shape=(train_X.shape[1], train_X.shape[2])))\n", 241 | "model.add(Dense(1))\n", 242 | "model.compile(loss='mae', optimizer='adam')\n", 243 | "# fit network\n", 244 | "history = model.fit(train_X, train_y, epochs=50, batch_size=72, validation_data=(test_X, test_y), verbose=2, shuffle=False)\n", 245 | "# plot history\n", 246 | "pyplot.plot(history.history['loss'], label='train')\n", 247 | "pyplot.plot(history.history['val_loss'], label='test')\n", 248 | "pyplot.legend()\n", 249 | "pyplot.show()" 250 | ], 251 | "execution_count": 18, 252 | "outputs": [ 253 | { 254 | "output_type": "stream", 255 | "text": [ 256 | "(8760, 24) 8760 (8760,)\n", 257 | "(8760, 3, 8) (8760,) (35037, 3, 8) (35037,)\n", 258 | "Train on 8760 samples, validate on 35037 samples\n", 259 | "Epoch 1/50\n", 260 | " - 2s - loss: 0.0603 - val_loss: 0.0432\n", 261 | "Epoch 2/50\n", 262 | " - 1s - loss: 0.0283 - val_loss: 0.0284\n", 263 | "Epoch 3/50\n", 264 | " - 1s - loss: 0.0218 - val_loss: 0.0211\n", 265 | "Epoch 4/50\n", 266 | " - 1s - loss: 0.0207 - val_loss: 0.0201\n", 267 | "Epoch 5/50\n", 268 | " - 1s - loss: 0.0206 - val_loss: 0.0190\n", 269 | "Epoch 6/50\n", 270 | " - 1s - loss: 0.0198 - val_loss: 0.0192\n", 271 | "Epoch 7/50\n", 272 | " - 1s - loss: 0.0193 - val_loss: 0.0188\n", 273 | "Epoch 8/50\n", 274 | " - 1s - loss: 0.0192 - val_loss: 0.0183\n", 275 | "Epoch 9/50\n", 276 | " - 1s - loss: 0.0185 - val_loss: 0.0177\n", 277 | "Epoch 10/50\n", 278 | " - 1s - loss: 0.0182 - val_loss: 0.0174\n", 279 | "Epoch 11/50\n", 280 | " - 1s - loss: 0.0176 - val_loss: 0.0165\n", 281 | "Epoch 12/50\n", 282 | " - 1s - loss: 0.0176 - val_loss: 0.0166\n", 283 | "Epoch 13/50\n", 284 | " - 1s - loss: 0.0169 - val_loss: 0.0169\n", 285 | "Epoch 14/50\n", 286 | " - 1s - loss: 0.0168 - val_loss: 0.0164\n", 287 | "Epoch 15/50\n", 288 | " - 1s - loss: 0.0161 - val_loss: 0.0164\n", 289 | "Epoch 16/50\n", 290 | " - 1s - loss: 0.0161 - val_loss: 0.0163\n", 291 | "Epoch 17/50\n", 292 | " - 1s - loss: 0.0155 - val_loss: 0.0157\n", 293 | "Epoch 18/50\n", 294 | " - 1s - loss: 0.0156 - val_loss: 0.0163\n", 295 | "Epoch 19/50\n", 296 | " - 1s - loss: 0.0151 - val_loss: 0.0165\n", 297 | "Epoch 20/50\n", 298 | " - 1s - loss: 0.0151 - val_loss: 0.0164\n", 299 | "Epoch 21/50\n", 300 | " - 1s - loss: 0.0148 - val_loss: 0.0159\n", 301 | "Epoch 22/50\n", 302 | " - 1s - loss: 0.0149 - val_loss: 0.0163\n", 303 | "Epoch 23/50\n", 304 | " - 1s - loss: 0.0150 - val_loss: 0.0161\n", 305 | "Epoch 24/50\n", 306 | " - 1s - loss: 0.0150 - val_loss: 0.0155\n", 307 | "Epoch 25/50\n", 308 | " - 1s - loss: 0.0147 - val_loss: 0.0166\n", 309 | "Epoch 26/50\n", 310 | " - 1s - loss: 0.0148 - val_loss: 0.0154\n", 311 | "Epoch 27/50\n", 312 | " - 1s - loss: 0.0146 - val_loss: 0.0155\n", 313 | "Epoch 28/50\n", 314 | " - 1s - loss: 0.0146 - val_loss: 0.0154\n", 315 | "Epoch 29/50\n", 316 | " - 1s - loss: 0.0144 - val_loss: 0.0153\n", 317 | "Epoch 30/50\n", 318 | " - 1s - loss: 0.0146 - val_loss: 0.0147\n", 319 | "Epoch 31/50\n", 320 | " - 1s - loss: 0.0145 - val_loss: 0.0149\n", 321 | "Epoch 32/50\n", 322 | " - 1s - loss: 0.0145 - val_loss: 0.0149\n", 323 | "Epoch 33/50\n", 324 | " - 1s - loss: 0.0144 - val_loss: 0.0152\n", 325 | "Epoch 34/50\n", 326 | " - 1s - loss: 0.0145 - val_loss: 0.0150\n", 327 | "Epoch 35/50\n", 328 | " - 1s - loss: 0.0144 - val_loss: 0.0150\n", 329 | "Epoch 36/50\n", 330 | " - 1s - loss: 0.0144 - val_loss: 0.0151\n", 331 | "Epoch 37/50\n", 332 | " - 1s - loss: 0.0145 - val_loss: 0.0147\n", 333 | "Epoch 38/50\n", 334 | " - 1s - loss: 0.0145 - val_loss: 0.0156\n", 335 | "Epoch 39/50\n", 336 | " - 1s - loss: 0.0145 - val_loss: 0.0144\n", 337 | "Epoch 40/50\n", 338 | " - 1s - loss: 0.0144 - val_loss: 0.0144\n", 339 | "Epoch 41/50\n", 340 | " - 1s - loss: 0.0144 - val_loss: 0.0141\n", 341 | "Epoch 42/50\n", 342 | " - 1s - loss: 0.0144 - val_loss: 0.0139\n", 343 | "Epoch 43/50\n", 344 | " - 1s - loss: 0.0144 - val_loss: 0.0143\n", 345 | "Epoch 44/50\n", 346 | " - 1s - loss: 0.0145 - val_loss: 0.0141\n", 347 | "Epoch 45/50\n", 348 | " - 1s - loss: 0.0145 - val_loss: 0.0141\n", 349 | "Epoch 46/50\n", 350 | " - 1s - loss: 0.0145 - val_loss: 0.0139\n", 351 | "Epoch 47/50\n", 352 | " - 1s - loss: 0.0145 - val_loss: 0.0140\n", 353 | "Epoch 48/50\n", 354 | " - 1s - loss: 0.0144 - val_loss: 0.0139\n", 355 | "Epoch 49/50\n", 356 | " - 1s - loss: 0.0144 - val_loss: 0.0139\n", 357 | "Epoch 50/50\n", 358 | " - 1s - loss: 0.0144 - val_loss: 0.0138\n" 359 | ], 360 | "name": "stdout" 361 | }, 362 | { 363 | "output_type": "display_data", 364 | "data": { 365 | "image/png": "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\nTkSuQmCC\n", 366 | "text/plain": [ 367 | "
" 368 | ] 369 | }, 370 | "metadata": { 371 | "tags": [] 372 | } 373 | } 374 | ] 375 | }, 376 | { 377 | "metadata": { 378 | "id": "vt79qJkTfFkF", 379 | "colab_type": "code", 380 | "colab": {} 381 | }, 382 | "cell_type": "code", 383 | "source": [ 384 | "# make a prediction\n", 385 | "yhat = model.predict(test_X)\n", 386 | "test_X = test_X.reshape((test_X.shape[0], n_hours*n_features))\n", 387 | "# invert scaling for forecast\n", 388 | "inv_yhat = concatenate((yhat, test_X[:, -7:]), axis=1)\n", 389 | "inv_yhat = scaler.inverse_transform(inv_yhat)\n", 390 | "inv_yhat = inv_yhat[:,0]\n", 391 | "# invert scaling for actual\n", 392 | "test_y = test_y.reshape((len(test_y), 1))\n", 393 | "inv_y = concatenate((test_y, test_X[:, -7:]), axis=1)\n", 394 | "inv_y = scaler.inverse_transform(inv_y)\n", 395 | "inv_y = inv_y[:,0]\n", 396 | "# calculate RMSE\n", 397 | "rmse = sqrt(mean_squared_error(inv_y, inv_yhat))\n" 398 | ], 399 | "execution_count": 0, 400 | "outputs": [] 401 | }, 402 | { 403 | "metadata": { 404 | "id": "cuuni1UIQTFN", 405 | "colab_type": "code", 406 | "colab": { 407 | "base_uri": "https://localhost:8080/", 408 | "height": 35 409 | }, 410 | "outputId": "115f5741-11a4-456e-df0a-a1039930525e" 411 | }, 412 | "cell_type": "code", 413 | "source": [ 414 | "rmse" 415 | ], 416 | "execution_count": 24, 417 | "outputs": [ 418 | { 419 | "output_type": "execute_result", 420 | "data": { 421 | "text/plain": [ 422 | "26.440986998541323" 423 | ] 424 | }, 425 | "metadata": { 426 | "tags": [] 427 | }, 428 | "execution_count": 24 429 | } 430 | ] 431 | } 432 | ] 433 | } --------------------------------------------------------------------------------