Skip to content
Snippets Groups Projects
02-DNN-Regression-Premium.ipynb 187 KiB
Newer Older
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
    "<img width=\"800px\" src=\"../fidle/img/00-Fidle-header-01.svg\"></img>\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
    "\n",
    "# <!-- TITLE --> [BHP2] - Regression with a Dense Network (DNN) - Advanced code\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
    "  <!-- DESC -->  More advanced example of DNN network code - BHPD dataset\n",
    "  <!-- AUTHOR : Jean-Luc Parouty (CNRS/SIMaP) -->\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
    "\n",
    "## Objectives :\n",
    " - Predicts **housing prices** from a set of house features. \n",
    " - Understanding the principle and the architecture of a regression with a dense neural network with backup and restore of the trained model. \n",
    "\n",
    "The **[Boston Housing Dataset](https://www.cs.toronto.edu/~delve/data/boston/bostonDetail.html)** consists of price of houses in various places in Boston.  \n",
    "Alongside with price, the dataset also provide these information :\n",
    "\n",
    " - CRIM: This is the per capita crime rate by town\n",
    " - ZN: This is the proportion of residential land zoned for lots larger than 25,000 sq.ft\n",
    " - INDUS: This is the proportion of non-retail business acres per town\n",
    " - CHAS: This is the Charles River dummy variable (this is equal to 1 if tract bounds river; 0 otherwise)\n",
    " - NOX: This is the nitric oxides concentration (parts per 10 million)\n",
    " - RM: This is the average number of rooms per dwelling\n",
    " - AGE: This is the proportion of owner-occupied units built prior to 1940\n",
    " - DIS: This is the weighted distances to five Boston employment centers\n",
    " - RAD: This is the index of accessibility to radial highways\n",
    " - TAX: This is the full-value property-tax rate per 10,000 dollars\n",
    " - PTRATIO: This is the pupil-teacher ratio by town\n",
    " - B: This is calculated as 1000(Bk — 0.63)^2, where Bk is the proportion of people of African American descent by town\n",
    " - LSTAT: This is the percentage lower status of the population\n",
    " - MEDV: This is the median value of owner-occupied homes in 1000 dollars\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
    "\n",
    "## What we're going to do :\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
    "\n",
    " - (Retrieve data)\n",
    " - (Preparing the data)\n",
    " - (Build a model)\n",
    " - Train and save the model\n",
    " - Restore saved model\n",
    " - Evaluate the model\n",
    " - Make some predictions\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Step 1 - Import and init"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>\n",
       "\n",
       "div.warn {    \n",
       "    background-color: #fcf2f2;\n",
       "    border-color: #dFb5b4;\n",
       "    border-left: 5px solid #dfb5b4;\n",
       "    padding: 0.5em;\n",
       "    font-weight: bold;\n",
       "    font-size: 1.1em;;\n",
       "    }\n",
       "\n",
       "\n",
       "\n",
       "div.nota {    \n",
       "    background-color: #DAFFDE;\n",
       "    border-left: 5px solid #92CC99;\n",
       "    padding: 0.5em;\n",
       "    }\n",
       "\n",
       "div.todo:before { content:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1My44OTEyIiBoZWlnaHQ9IjE0My4zOTAyIiB2aWV3Qm94PSIwIDAgNTMuODkxMiAxNDMuMzkwMiI+PHRpdGxlPjAwLUJvYi10b2RvPC90aXRsZT48cGF0aCBkPSJNMjMuNDU2OCwxMTQuMzAxNmExLjgwNjMsMS44MDYzLDAsMSwxLDEuODE1NywxLjgyNEExLjgyMDksMS44MjA5LDAsMCwxLDIzLjQ1NjgsMTE0LjMwMTZabS0xMC42NjEyLDEuODIyQTEuODI3MiwxLjgyNzIsMCwxLDAsMTAuOTgsMTE0LjMsMS44MiwxLjgyLDAsMCwwLDEyLjc5NTYsMTE2LjEyMzZabS03LjcwNyw0LjU4NzR2LTVzLjQ4NjMtOS4xMjIzLDguMDIxNS0xMS45Njc1YTE5LjIwODIsMTkuMjA4MiwwLDAsMSw2LjA0ODYtMS4yNDU0LDE5LjE3NzgsMTkuMTc3OCwwLDAsMSw2LjA0ODcsMS4yNDc1YzcuNTM1MSwyLjgzNDcsOC4wMTc0LDExLjk2NzQsOC4wMTc0LDExLjk2NzR2NS4wMjM0bC4wMDQyLDcuNjgydjIuNGMuMDE2Ny4xOTkyLjAzMzYuMzkyMS4wMzM2LjU4NzEsMCwuMjEzOC0uMDE2OC40MTA5LS4wMzM2LjYzMzJ2LjA1ODdoLS4wMDg0YTguMzcxOSw4LjM3MTksMCwwLDEtNy4zNzM4LDcuNjU0N3MtLjk5NTMsMy42MzgtNi42OTMzLDMuNjM4LTYuNjkzNC0zLjYzOC02LjY5MzQtMy42MzhhOC4zNyw4LjM3LDAsMCwxLTcuMzcxNi03LjY1NDdINS4wODQzdi0uMDU4N2MtLjAxODktLjIyLS4wMjk0LS40MTk0LS4wMjk0LS42MzMyLDAtLjE5MjkuMDE2Ny0uMzgzNy4wMjk0LS41ODcxdi0yLjRtMTguMDkzNy00LjA0YTEuMTU2NSwxLjE1NjUsMCwxLDAtMi4zMTI2LDAsMS4xNTY0LDEuMTU2NCwwLDEsMCwyLjMxMjYsMFptNC4wODM0LDBhMS4xNTk1LDEuMTU5NSwwLDEsMC0xLjE2MzYsMS4xN0ExLjE3NSwxLjE3NSwwLDAsMCwyNy4yNjE0LDEyNC4zNzc5Wk05LjM3MzksMTE0LjYzNWMwLDMuMTA5MywyLjQxMzIsMy4zMSwyLjQxMzIsMy4zMWExMzMuOTI0MywxMzMuOTI0MywwLDAsMCwxNC43MzQ4LDBzMi40MTExLS4xOTI5LDIuNDExMS0zLjMxYTguMDc3Myw4LjA3NzMsMCwwLDAtMi40MTExLTUuNTUxOWMtNC41LTMuNTAzMy05LjkxMjYtMy41MDMzLTE0Ljc0MTEsMEE4LjA4NTEsOC4wODUxLDAsMCwwLDkuMzczOSwxMTQuNjM1WiIgc3R5bGU9ImZpbGw6IzAxMDEwMSIvPjxjaXJjbGUgY3g9IjMzLjE0MzYiIGN5PSIxMjQuNTM0IiByPSIzLjgzNjMiIHN0eWxlPSJmaWxsOiMwMTAxMDEiLz48cmVjdCB4PSIzNS42NjU5IiB5PSIxMTIuOTYyNSIgd2lkdGg9IjIuMDc3IiBoZWlnaHQ9IjEwLjU0NTgiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIxLjYgMjQxLjExMjEpIHJvdGF0ZSgtMTU1Ljc0NikiIHN0eWxlPSJmaWxsOiMwMTAxMDEiLz48Y2lyY2xlIGN4PSIzOC44NzA0IiBjeT0iMTEzLjQyNzkiIHI9IjIuNDA4NSIgc3R5bGU9ImZpbGw6IzAxMDEwMSIvPjxjaXJjbGUgY3g9IjUuMjI0OCIgY3k9IjEyNC41MzQiIHI9IjMuODM2MyIgc3R5bGU9ImZpbGw6IzAxMDEwMSIvPjxyZWN0IHg9IjEuNDE2NCIgeT0iMTI0LjYzMDEiIHdpZHRoPSIyLjA3NyIgaGVpZ2h0PSIxMC41NDU4IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg0LjkwOTcgMjU5LjgwNikgcm90YXRlKC0xODApIiBzdHlsZT0iZmlsbDojMDEwMTAxIi8+PGNpcmNsZSBjeD0iMi40MDkxIiBjeT0iMTM3LjA5OTYiIHI9IjIuNDA4NSIgc3R5bGU9ImZpbGw6IzAxMDEwMSIvPjxwYXRoIGQ9Ik0xOC4wNTExLDEwMC4xMDY2aC0uMDE0NlYxMDIuNjFoMi4zdi0yLjQyNzlhMi40MjI5LDIuNDIyOSwwLDEsMC0yLjI4NTQtLjA3NTVaIiBzdHlsZT0iZmlsbDojMDEwMTAxIi8+PHBhdGggZD0iTTM5LjQyMTQsMjcuMjU4djEuMDVBMTEuOTQ1MiwxMS45NDUyLDAsMCwwLDQ0LjU5NTQsNS43OWEuMjQ0OS4yNDQ5LDAsMCwxLS4wMjM1LS40MjI3TDQ2Ljc1LDMuOTUxNWEuMzg5Mi4zODkyLDAsMCwxLC40MjYyLDAsMTQuODQ0MiwxNC44NDQyLDAsMCwxLTcuNzU0MywyNy4yNTkxdjEuMDY3YS40NS40NSwwLDAsMS0uNzA0Ny4zNzU4bC0zLjg0MTktMi41MWEuNDUuNDUsMCwwLDEsMC0uNzUxNmwzLjg0MTktMi41MWEuNDUuNDUsMCwwLDEsLjY5NDYuMzc1OFpNNDMuMjMsMi41ODkyLDM5LjM4NzguMDc5NGEuNDUuNDUsMCwwLDAtLjcwNDYuMzc1OHYxLjA2N2ExNC44NDQyLDE0Ljg0NDIsMCwwLDAtNy43NTQzLDI3LjI1OTEuMzg5LjM4OSwwLDAsMCwuNDI2MSwwbDIuMTc3Ny0xLjQxOTNhLjI0NS4yNDUsMCwwLDAtLjAyMzUtLjQyMjgsMTEuOTQ1MSwxMS45NDUxLDAsMCwxLDUuMTc0LTIyLjUxNDZ2MS4wNWEuNDUuNDUsMCwwLDAsLjcwNDYuMzc1OGwzLjg1NTMtMi41MWEuNDUuNDUsMCwwLDAsMC0uNzUxNlpNMzkuMDUyMywxNC4yNDU4YTIuMTIwNiwyLjEyMDYsMCwxLDAsMi4xMjA2LDIuMTIwNmgwQTIuMTI0LDIuMTI0LDAsMCwwLDM5LjA1MjMsMTQuMjQ1OFptNi4wNzMyLTQuNzc4MS44MjU0LjgyNTVhMS4wNTY4LDEuMDU2OCwwLDAsMSwuMTE3NSwxLjM0MjFsLS44MDIsMS4xNDQyYTcuMTAxOCw3LjEwMTgsMCwwLDEsLjcxMTQsMS43MTEybDEuMzc1Ny4yNDE2YTEuMDU2OSwxLjA1NjksMCwwLDEsLjg3NTcsMS4wNHYxLjE2NDNhMS4wNTY5LDEuMDU2OSwwLDAsMS0uODc1NywxLjA0bC0xLjM3MjQuMjQxNkE3LjExLDcuMTEsMCwwLDEsNDUuMjcsMTkuOTNsLjgwMTksMS4xNDQyYTEuMDU3LDEuMDU3LDAsMCwxLS4xMTc0LDEuMzQyMmwtLjgyODguODQ4OWExLjA1NywxLjA1NywwLDAsMS0xLjM0MjEuMTE3NGwtMS4xNDQyLS44MDE5YTcuMTMzOCw3LjEzMzgsMCwwLDEtMS43MTEzLjcxMTNsLS4yNDE2LDEuMzcyNGExLjA1NjgsMS4wNTY4LDAsMCwxLTEuMDQuODc1N0gzOC40Njg0YTEuMDU2OCwxLjA1NjgsMCwwLDEtMS4wNC0uODc1N2wtLjI0MTYtMS4zNzI0YTcuMTM1NSw3LjEzNTUsMCwwLDEtMS43MTEzLS43MTEzbC0xLjE0NDEuODAxOWExLjA1NzEsMS4wNTcxLDAsMCwxLTEuMzQyMi0uMTE3NGwtLjgzNTUtLjgyNTVhMS4wNTcsMS4wNTcsMCwwLDEtLjExNzQtMS4zNDIxbC44MDE5LTEuMTQ0MmE3LjEyMSw3LjEyMSwwLDAsMS0uNzExMy0xLjcxMTJsLTEuMzcyNC0uMjQxNmExLjA1NjksMS4wNTY5LDAsMCwxLS44NzU3LTEuMDRWMTUuNzgyNmExLjA1NjksMS4wNTY5LDAsMCwxLC44NzU3LTEuMDRsMS4zNzU3LS4yNDE2YTcuMTEsNy4xMSwwLDAsMSwuNzExNC0xLjcxMTJsLS44MDItMS4xNDQyYTEuMDU3LDEuMDU3LDAsMCwxLC4xMTc1LTEuMzQyMmwuODI1NC0uODI1NEExLjA1NjgsMS4wNTY4LDAsMCwxLDM0LjMyNDUsOS4zNmwxLjE0NDIuODAxOUE3LjEzNTUsNy4xMzU1LDAsMCwxLDM3LjE4LDkuNDUxbC4yNDE2LTEuMzcyNGExLjA1NjgsMS4wNTY4LDAsMCwxLDEuMDQtLjg3NTdoMS4xNjc3YTEuMDU2OSwxLjA1NjksMCwwLDEsMS4wNC44NzU3bC4yNDE2LDEuMzcyNGE3LjEyNSw3LjEyNSwwLDAsMSwxLjcxMTIuNzExM0w0My43NjY2LDkuMzZBMS4wNTY5LDEuMDU2OSwwLDAsMSw0NS4xMjU1LDkuNDY3N1ptLTIuMDMsNi44OTg3QTQuMDQzMyw0LjA0MzMsMCwxLDAsMzkuMDUyMywyMC40MWgwQTQuMDQ2NSw0LjA0NjUsMCwwLDAsNDMuMDk1NSwxNi4zNjY0WiIgc3R5bGU9ImZpbGw6I2UxMjIyOSIvPjxwb2x5Z29uIHBvaW50cz0iMzkuNDEzIDM0Ljc1NyAzOS41MzcgMzQuNzU3IDM5LjY3NSAzNC43NTcgMzkuNjc1IDEwOS41MSAzOS41MzcgMTA5LjUxIDM5LjQxMyAxMDkuNTEgMzkuNDEzIDM0Ljc1NyAzOS40MTMgMzQuNzU3IiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojOTk5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZS13aWR0aDowLjMwODg1NDQ1MDU2MDE2MThweDtmaWxsLXJ1bGU6ZXZlbm9kZCIvPjwvc3ZnPg==);\n",
       "    float:left;\n",
       "    margin-right:20px;\n",
       "    margin-top:-20px;\n",
       "    margin-bottom:20px;\n",
       "}\n",
       "div.todo{\n",
       "    font-weight: bold;\n",
       "    font-size: 1.1em;\n",
       "    margin-top:40px;\n",
       "}\n",
       "div.todo ul{\n",
       "    margin: 0.2em;\n",
       "}\n",
       "div.todo li{\n",
       "    margin-left:60px;\n",
       "    margin-top:0;\n",
       "    margin-bottom:0;\n",
       "}\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
       "\n",
       "\n",
       "</style>\n",
       "\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "FIDLE 2020 - Practical Work Module\n",
      "Version              : 0.5.4\n",
      "Run time             : Tuesday 8 September 2020, 19:03:13\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "TensorFlow version   : 2.0.0\n",
      "Keras version        : 2.2.4-tf\n",
      "Current place        : Fidle at HOME\n",
      "Dataset dir          : /home/pjluc/datasets\n",
      "Update keras cache   : Yes\n"
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
     ]
    }
   ],
   "source": [
    "import tensorflow as tf\n",
    "from tensorflow import keras\n",
    "\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import pandas as pd\n",
    "import os,sys\n",
    "\n",
    "from IPython.display import Markdown\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
    "from importlib import reload\n",
    "\n",
    "sys.path.append('..')\n",
    "import fidle.pwk as ooo\n",
    "\n",
    "place, dataset_dir = ooo.init(places={'MyLaptop':'/path/to/datasets'})"
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Step 2 - Retrieve data\n",
    "\n",
    "### 2.1 - Option 1  : From Keras\n",
    "Boston housing is a famous historic dataset, so we can get it directly from [Keras datasets](https://www.tensorflow.org/api_docs/python/tf/keras/datasets)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
   "metadata": {},
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
   "source": [
    "# (x_train, y_train), (x_test, y_test) = keras.datasets.boston_housing.load_data(test_split=0.2, seed=113)"
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2.2 - Option 2 : From a csv file\n",
    "More fun !"
   ]
  },
  {
   "cell_type": "code",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style  type=\"text/css\" >\n",
       "</style><table id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08\" ><thead>    <tr>        <th class=\"blank level0\" ></th>        <th class=\"col_heading level0 col0\" >crim</th>        <th class=\"col_heading level0 col1\" >zn</th>        <th class=\"col_heading level0 col2\" >indus</th>        <th class=\"col_heading level0 col3\" >chas</th>        <th class=\"col_heading level0 col4\" >nox</th>        <th class=\"col_heading level0 col5\" >rm</th>        <th class=\"col_heading level0 col6\" >age</th>        <th class=\"col_heading level0 col7\" >dis</th>        <th class=\"col_heading level0 col8\" >rad</th>        <th class=\"col_heading level0 col9\" >tax</th>        <th class=\"col_heading level0 col10\" >ptratio</th>        <th class=\"col_heading level0 col11\" >b</th>        <th class=\"col_heading level0 col12\" >lstat</th>        <th class=\"col_heading level0 col13\" >medv</th>    </tr></thead><tbody>\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
       "                <tr>\n",
       "                        <th id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08level0_row0\" class=\"row_heading level0 row0\" >0</th>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row0_col0\" class=\"data row0 col0\" >0.01</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row0_col1\" class=\"data row0 col1\" >18.00</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row0_col2\" class=\"data row0 col2\" >2.31</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row0_col3\" class=\"data row0 col3\" >0.00</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row0_col4\" class=\"data row0 col4\" >0.54</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row0_col5\" class=\"data row0 col5\" >6.58</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row0_col6\" class=\"data row0 col6\" >65.20</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row0_col7\" class=\"data row0 col7\" >4.09</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row0_col8\" class=\"data row0 col8\" >1.00</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row0_col9\" class=\"data row0 col9\" >296.00</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row0_col10\" class=\"data row0 col10\" >15.30</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row0_col11\" class=\"data row0 col11\" >396.90</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row0_col12\" class=\"data row0 col12\" >4.98</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row0_col13\" class=\"data row0 col13\" >24.00</td>\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08level0_row1\" class=\"row_heading level0 row1\" >1</th>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row1_col0\" class=\"data row1 col0\" >0.03</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row1_col1\" class=\"data row1 col1\" >0.00</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row1_col2\" class=\"data row1 col2\" >7.07</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row1_col3\" class=\"data row1 col3\" >0.00</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row1_col4\" class=\"data row1 col4\" >0.47</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row1_col5\" class=\"data row1 col5\" >6.42</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row1_col6\" class=\"data row1 col6\" >78.90</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row1_col7\" class=\"data row1 col7\" >4.97</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row1_col8\" class=\"data row1 col8\" >2.00</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row1_col9\" class=\"data row1 col9\" >242.00</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row1_col10\" class=\"data row1 col10\" >17.80</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row1_col11\" class=\"data row1 col11\" >396.90</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row1_col12\" class=\"data row1 col12\" >9.14</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row1_col13\" class=\"data row1 col13\" >21.60</td>\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08level0_row2\" class=\"row_heading level0 row2\" >2</th>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row2_col0\" class=\"data row2 col0\" >0.03</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row2_col1\" class=\"data row2 col1\" >0.00</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row2_col2\" class=\"data row2 col2\" >7.07</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row2_col3\" class=\"data row2 col3\" >0.00</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row2_col4\" class=\"data row2 col4\" >0.47</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row2_col5\" class=\"data row2 col5\" >7.18</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row2_col6\" class=\"data row2 col6\" >61.10</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row2_col7\" class=\"data row2 col7\" >4.97</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row2_col8\" class=\"data row2 col8\" >2.00</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row2_col9\" class=\"data row2 col9\" >242.00</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row2_col10\" class=\"data row2 col10\" >17.80</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row2_col11\" class=\"data row2 col11\" >392.83</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row2_col12\" class=\"data row2 col12\" >4.03</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row2_col13\" class=\"data row2 col13\" >34.70</td>\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08level0_row3\" class=\"row_heading level0 row3\" >3</th>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row3_col0\" class=\"data row3 col0\" >0.03</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row3_col1\" class=\"data row3 col1\" >0.00</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row3_col2\" class=\"data row3 col2\" >2.18</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row3_col3\" class=\"data row3 col3\" >0.00</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row3_col4\" class=\"data row3 col4\" >0.46</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row3_col5\" class=\"data row3 col5\" >7.00</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row3_col6\" class=\"data row3 col6\" >45.80</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row3_col7\" class=\"data row3 col7\" >6.06</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row3_col8\" class=\"data row3 col8\" >3.00</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row3_col9\" class=\"data row3 col9\" >222.00</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row3_col10\" class=\"data row3 col10\" >18.70</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row3_col11\" class=\"data row3 col11\" >394.63</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row3_col12\" class=\"data row3 col12\" >2.94</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row3_col13\" class=\"data row3 col13\" >33.40</td>\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08level0_row4\" class=\"row_heading level0 row4\" >4</th>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row4_col0\" class=\"data row4 col0\" >0.07</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row4_col1\" class=\"data row4 col1\" >0.00</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row4_col2\" class=\"data row4 col2\" >2.18</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row4_col3\" class=\"data row4 col3\" >0.00</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row4_col4\" class=\"data row4 col4\" >0.46</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row4_col5\" class=\"data row4 col5\" >7.15</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row4_col6\" class=\"data row4 col6\" >54.20</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row4_col7\" class=\"data row4 col7\" >6.06</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row4_col8\" class=\"data row4 col8\" >3.00</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row4_col9\" class=\"data row4 col9\" >222.00</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row4_col10\" class=\"data row4 col10\" >18.70</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row4_col11\" class=\"data row4 col11\" >396.90</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row4_col12\" class=\"data row4 col12\" >5.33</td>\n",
       "                        <td id=\"T_2e2c9e06_f1f5_11ea_9e87_677b8e0bcd08row4_col13\" class=\"data row4 col13\" >36.20</td>\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
       "            </tr>\n",
       "    </tbody></table>"
      ],
      "text/plain": [
       "<pandas.io.formats.style.Styler at 0x7ffe29c64d10>"
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Missing Data :  0   Shape is :  (506, 14)\n"
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
     ]
    }
   ],
   "source": [
    "data = pd.read_csv(f'{dataset_dir}/BHPD/BostonHousing.csv', header=0)\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
    "\n",
    "display(data.head(5).style.format(\"{0:.2f}\"))\n",
    "print('Missing Data : ',data.isna().sum().sum(), '  Shape is : ', data.shape)"
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Step 3 - Preparing the data\n",
    "### 3.1 - Split data\n",
    "We will use 80% of the data for training and 20% for validation.  \n",
    "x will be input data and y the expected output"
   ]
  },
  {
   "cell_type": "code",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Original data shape was :  (506, 14)\n",
      "x_train :  (354, 13) y_train :  (354,)\n",
      "x_test  :  (152, 13) y_test  :  (152,)\n"
     ]
    }
   ],
   "source": [
    "# ---- Split => train, test\n",
    "#\n",
    "data_train = data.sample(frac=0.7, axis=0)\n",
    "data_test  = data.drop(data_train.index)\n",
    "\n",
    "# ---- Split => x,y (medv is price)\n",
    "#\n",
    "x_train = data_train.drop('medv',  axis=1)\n",
    "y_train = data_train['medv']\n",
    "x_test  = data_test.drop('medv',   axis=1)\n",
    "y_test  = data_test['medv']\n",
    "\n",
    "print('Original data shape was : ',data.shape)\n",
    "print('x_train : ',x_train.shape, 'y_train : ',y_train.shape)\n",
    "print('x_test  : ',x_test.shape,  'y_test  : ',y_test.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.2 - Data normalization\n",
    "**Note :** \n",
    " - All input data must be normalized, train and test.  \n",
    " - To do this we will subtract the mean and divide by the standard deviation.  \n",
    " - But test data should not be used in any way, even for normalization.  \n",
    " - The mean and the standard deviation will therefore only be calculated with the train data."
   ]
  },
  {
   "cell_type": "code",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style  type=\"text/css\" >\n",
       "</style><table id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08\" ><caption>Before normalization :</caption><thead>    <tr>        <th class=\"blank level0\" ></th>        <th class=\"col_heading level0 col0\" >crim</th>        <th class=\"col_heading level0 col1\" >zn</th>        <th class=\"col_heading level0 col2\" >indus</th>        <th class=\"col_heading level0 col3\" >chas</th>        <th class=\"col_heading level0 col4\" >nox</th>        <th class=\"col_heading level0 col5\" >rm</th>        <th class=\"col_heading level0 col6\" >age</th>        <th class=\"col_heading level0 col7\" >dis</th>        <th class=\"col_heading level0 col8\" >rad</th>        <th class=\"col_heading level0 col9\" >tax</th>        <th class=\"col_heading level0 col10\" >ptratio</th>        <th class=\"col_heading level0 col11\" >b</th>        <th class=\"col_heading level0 col12\" >lstat</th>    </tr></thead><tbody>\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
       "                <tr>\n",
       "                        <th id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08level0_row0\" class=\"row_heading level0 row0\" >count</th>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row0_col0\" class=\"data row0 col0\" >354.00</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row0_col1\" class=\"data row0 col1\" >354.00</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row0_col2\" class=\"data row0 col2\" >354.00</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row0_col3\" class=\"data row0 col3\" >354.00</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row0_col4\" class=\"data row0 col4\" >354.00</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row0_col5\" class=\"data row0 col5\" >354.00</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row0_col6\" class=\"data row0 col6\" >354.00</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row0_col7\" class=\"data row0 col7\" >354.00</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row0_col8\" class=\"data row0 col8\" >354.00</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row0_col9\" class=\"data row0 col9\" >354.00</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row0_col10\" class=\"data row0 col10\" >354.00</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row0_col11\" class=\"data row0 col11\" >354.00</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row0_col12\" class=\"data row0 col12\" >354.00</td>\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08level0_row1\" class=\"row_heading level0 row1\" >mean</th>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row1_col0\" class=\"data row1 col0\" >3.32</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row1_col1\" class=\"data row1 col1\" >12.33</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row1_col2\" class=\"data row1 col2\" >11.39</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row1_col3\" class=\"data row1 col3\" >0.07</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row1_col4\" class=\"data row1 col4\" >0.55</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row1_col5\" class=\"data row1 col5\" >6.27</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row1_col6\" class=\"data row1 col6\" >67.04</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row1_col7\" class=\"data row1 col7\" >3.83</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row1_col8\" class=\"data row1 col8\" >9.43</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row1_col9\" class=\"data row1 col9\" >408.21</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row1_col10\" class=\"data row1 col10\" >18.45</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row1_col11\" class=\"data row1 col11\" >356.12</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row1_col12\" class=\"data row1 col12\" >12.41</td>\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08level0_row2\" class=\"row_heading level0 row2\" >std</th>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row2_col0\" class=\"data row2 col0\" >7.78</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row2_col1\" class=\"data row2 col1\" >24.49</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row2_col2\" class=\"data row2 col2\" >7.06</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row2_col3\" class=\"data row2 col3\" >0.26</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row2_col4\" class=\"data row2 col4\" >0.12</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row2_col5\" class=\"data row2 col5\" >0.67</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row2_col6\" class=\"data row2 col6\" >29.01</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row2_col7\" class=\"data row2 col7\" >2.10</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row2_col8\" class=\"data row2 col8\" >8.75</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row2_col9\" class=\"data row2 col9\" >170.18</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row2_col10\" class=\"data row2 col10\" >2.17</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row2_col11\" class=\"data row2 col11\" >94.01</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row2_col12\" class=\"data row2 col12\" >6.77</td>\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08level0_row3\" class=\"row_heading level0 row3\" >min</th>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row3_col0\" class=\"data row3 col0\" >0.01</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row3_col1\" class=\"data row3 col1\" >0.00</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row3_col2\" class=\"data row3 col2\" >0.46</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row3_col3\" class=\"data row3 col3\" >0.00</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row3_col4\" class=\"data row3 col4\" >0.39</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row3_col5\" class=\"data row3 col5\" >3.56</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row3_col6\" class=\"data row3 col6\" >6.00</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row3_col7\" class=\"data row3 col7\" >1.17</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row3_col8\" class=\"data row3 col8\" >1.00</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row3_col9\" class=\"data row3 col9\" >188.00</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row3_col10\" class=\"data row3 col10\" >12.60</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row3_col11\" class=\"data row3 col11\" >2.52</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row3_col12\" class=\"data row3 col12\" >1.92</td>\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08level0_row4\" class=\"row_heading level0 row4\" >25%</th>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row4_col0\" class=\"data row4 col0\" >0.08</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row4_col1\" class=\"data row4 col1\" >0.00</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row4_col2\" class=\"data row4 col2\" >5.19</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row4_col3\" class=\"data row4 col3\" >0.00</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row4_col4\" class=\"data row4 col4\" >0.45</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row4_col5\" class=\"data row4 col5\" >5.88</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row4_col6\" class=\"data row4 col6\" >41.20</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row4_col7\" class=\"data row4 col7\" >2.09</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row4_col8\" class=\"data row4 col8\" >4.00</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row4_col9\" class=\"data row4 col9\" >277.00</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row4_col10\" class=\"data row4 col10\" >17.00</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row4_col11\" class=\"data row4 col11\" >376.60</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row4_col12\" class=\"data row4 col12\" >7.12</td>\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08level0_row5\" class=\"row_heading level0 row5\" >50%</th>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row5_col0\" class=\"data row5 col0\" >0.25</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row5_col1\" class=\"data row5 col1\" >0.00</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row5_col2\" class=\"data row5 col2\" >9.90</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row5_col3\" class=\"data row5 col3\" >0.00</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row5_col4\" class=\"data row5 col4\" >0.54</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row5_col5\" class=\"data row5 col5\" >6.21</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row5_col6\" class=\"data row5 col6\" >76.50</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row5_col7\" class=\"data row5 col7\" >3.27</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row5_col8\" class=\"data row5 col8\" >5.00</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row5_col9\" class=\"data row5 col9\" >330.00</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row5_col10\" class=\"data row5 col10\" >19.10</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row5_col11\" class=\"data row5 col11\" >392.28</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row5_col12\" class=\"data row5 col12\" >11.38</td>\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08level0_row6\" class=\"row_heading level0 row6\" >75%</th>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row6_col0\" class=\"data row6 col0\" >3.52</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row6_col1\" class=\"data row6 col1\" >20.00</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row6_col2\" class=\"data row6 col2\" >18.10</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row6_col3\" class=\"data row6 col3\" >0.00</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row6_col4\" class=\"data row6 col4\" >0.62</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row6_col5\" class=\"data row6 col5\" >6.60</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row6_col6\" class=\"data row6 col6\" >94.07</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row6_col7\" class=\"data row6 col7\" >5.23</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row6_col8\" class=\"data row6 col8\" >24.00</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row6_col9\" class=\"data row6 col9\" >666.00</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row6_col10\" class=\"data row6 col10\" >20.20</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row6_col11\" class=\"data row6 col11\" >396.78</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row6_col12\" class=\"data row6 col12\" >16.82</td>\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08level0_row7\" class=\"row_heading level0 row7\" >max</th>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row7_col0\" class=\"data row7 col0\" >73.53</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row7_col1\" class=\"data row7 col1\" >100.00</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row7_col2\" class=\"data row7 col2\" >27.74</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row7_col3\" class=\"data row7 col3\" >1.00</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row7_col4\" class=\"data row7 col4\" >0.87</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row7_col5\" class=\"data row7 col5\" >8.78</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row7_col6\" class=\"data row7 col6\" >100.00</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row7_col7\" class=\"data row7 col7\" >10.71</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row7_col8\" class=\"data row7 col8\" >24.00</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row7_col9\" class=\"data row7 col9\" >711.00</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row7_col10\" class=\"data row7 col10\" >22.00</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row7_col11\" class=\"data row7 col11\" >396.90</td>\n",
       "                        <td id=\"T_2e34d652_f1f5_11ea_9e87_677b8e0bcd08row7_col12\" class=\"data row7 col12\" >34.77</td>\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
       "            </tr>\n",
       "    </tbody></table>"
      ],
      "text/plain": [
       "<pandas.io.formats.style.Styler at 0x7ffea457afd0>"
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<style  type=\"text/css\" >\n",
       "</style><table id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08\" ><caption>After normalization :</caption><thead>    <tr>        <th class=\"blank level0\" ></th>        <th class=\"col_heading level0 col0\" >crim</th>        <th class=\"col_heading level0 col1\" >zn</th>        <th class=\"col_heading level0 col2\" >indus</th>        <th class=\"col_heading level0 col3\" >chas</th>        <th class=\"col_heading level0 col4\" >nox</th>        <th class=\"col_heading level0 col5\" >rm</th>        <th class=\"col_heading level0 col6\" >age</th>        <th class=\"col_heading level0 col7\" >dis</th>        <th class=\"col_heading level0 col8\" >rad</th>        <th class=\"col_heading level0 col9\" >tax</th>        <th class=\"col_heading level0 col10\" >ptratio</th>        <th class=\"col_heading level0 col11\" >b</th>        <th class=\"col_heading level0 col12\" >lstat</th>    </tr></thead><tbody>\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
       "                <tr>\n",
       "                        <th id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08level0_row0\" class=\"row_heading level0 row0\" >count</th>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row0_col0\" class=\"data row0 col0\" >354.00</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row0_col1\" class=\"data row0 col1\" >354.00</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row0_col2\" class=\"data row0 col2\" >354.00</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row0_col3\" class=\"data row0 col3\" >354.00</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row0_col4\" class=\"data row0 col4\" >354.00</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row0_col5\" class=\"data row0 col5\" >354.00</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row0_col6\" class=\"data row0 col6\" >354.00</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row0_col7\" class=\"data row0 col7\" >354.00</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row0_col8\" class=\"data row0 col8\" >354.00</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row0_col9\" class=\"data row0 col9\" >354.00</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row0_col10\" class=\"data row0 col10\" >354.00</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row0_col11\" class=\"data row0 col11\" >354.00</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row0_col12\" class=\"data row0 col12\" >354.00</td>\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08level0_row1\" class=\"row_heading level0 row1\" >mean</th>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row1_col0\" class=\"data row1 col0\" >0.00</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row1_col1\" class=\"data row1 col1\" >-0.00</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row1_col2\" class=\"data row1 col2\" >-0.00</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row1_col3\" class=\"data row1 col3\" >0.00</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row1_col4\" class=\"data row1 col4\" >-0.00</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row1_col5\" class=\"data row1 col5\" >0.00</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row1_col6\" class=\"data row1 col6\" >0.00</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row1_col7\" class=\"data row1 col7\" >0.00</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row1_col8\" class=\"data row1 col8\" >-0.00</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row1_col9\" class=\"data row1 col9\" >0.00</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row1_col10\" class=\"data row1 col10\" >0.00</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row1_col11\" class=\"data row1 col11\" >-0.00</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row1_col12\" class=\"data row1 col12\" >0.00</td>\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08level0_row2\" class=\"row_heading level0 row2\" >std</th>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row2_col0\" class=\"data row2 col0\" >1.00</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row2_col1\" class=\"data row2 col1\" >1.00</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row2_col2\" class=\"data row2 col2\" >1.00</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row2_col3\" class=\"data row2 col3\" >1.00</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row2_col4\" class=\"data row2 col4\" >1.00</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row2_col5\" class=\"data row2 col5\" >1.00</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row2_col6\" class=\"data row2 col6\" >1.00</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row2_col7\" class=\"data row2 col7\" >1.00</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row2_col8\" class=\"data row2 col8\" >1.00</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row2_col9\" class=\"data row2 col9\" >1.00</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row2_col10\" class=\"data row2 col10\" >1.00</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row2_col11\" class=\"data row2 col11\" >1.00</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row2_col12\" class=\"data row2 col12\" >1.00</td>\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08level0_row3\" class=\"row_heading level0 row3\" >min</th>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row3_col0\" class=\"data row3 col0\" >-0.43</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row3_col1\" class=\"data row3 col1\" >-0.50</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row3_col2\" class=\"data row3 col2\" >-1.55</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row3_col3\" class=\"data row3 col3\" >-0.28</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row3_col4\" class=\"data row3 col4\" >-1.44</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row3_col5\" class=\"data row3 col5\" >-4.04</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row3_col6\" class=\"data row3 col6\" >-2.10</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row3_col7\" class=\"data row3 col7\" >-1.27</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row3_col8\" class=\"data row3 col8\" >-0.96</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row3_col9\" class=\"data row3 col9\" >-1.29</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row3_col10\" class=\"data row3 col10\" >-2.69</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row3_col11\" class=\"data row3 col11\" >-3.76</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row3_col12\" class=\"data row3 col12\" >-1.55</td>\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08level0_row4\" class=\"row_heading level0 row4\" >25%</th>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row4_col0\" class=\"data row4 col0\" >-0.42</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row4_col1\" class=\"data row4 col1\" >-0.50</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row4_col2\" class=\"data row4 col2\" >-0.88</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row4_col3\" class=\"data row4 col3\" >-0.28</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row4_col4\" class=\"data row4 col4\" >-0.90</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row4_col5\" class=\"data row4 col5\" >-0.59</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row4_col6\" class=\"data row4 col6\" >-0.89</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row4_col7\" class=\"data row4 col7\" >-0.83</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row4_col8\" class=\"data row4 col8\" >-0.62</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row4_col9\" class=\"data row4 col9\" >-0.77</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row4_col10\" class=\"data row4 col10\" >-0.67</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row4_col11\" class=\"data row4 col11\" >0.22</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row4_col12\" class=\"data row4 col12\" >-0.78</td>\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08level0_row5\" class=\"row_heading level0 row5\" >50%</th>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row5_col0\" class=\"data row5 col0\" >-0.39</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row5_col1\" class=\"data row5 col1\" >-0.50</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row5_col2\" class=\"data row5 col2\" >-0.21</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row5_col3\" class=\"data row5 col3\" >-0.28</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row5_col4\" class=\"data row5 col4\" >-0.13</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row5_col5\" class=\"data row5 col5\" >-0.09</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row5_col6\" class=\"data row5 col6\" >0.33</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row5_col7\" class=\"data row5 col7\" >-0.26</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row5_col8\" class=\"data row5 col8\" >-0.51</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row5_col9\" class=\"data row5 col9\" >-0.46</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row5_col10\" class=\"data row5 col10\" >0.30</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row5_col11\" class=\"data row5 col11\" >0.38</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row5_col12\" class=\"data row5 col12\" >-0.15</td>\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08level0_row6\" class=\"row_heading level0 row6\" >75%</th>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row6_col0\" class=\"data row6 col0\" >0.03</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row6_col1\" class=\"data row6 col1\" >0.31</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row6_col2\" class=\"data row6 col2\" >0.95</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row6_col3\" class=\"data row6 col3\" >-0.28</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row6_col4\" class=\"data row6 col4\" >0.60</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row6_col5\" class=\"data row6 col5\" >0.49</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row6_col6\" class=\"data row6 col6\" >0.93</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row6_col7\" class=\"data row6 col7\" >0.67</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row6_col8\" class=\"data row6 col8\" >1.66</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row6_col9\" class=\"data row6 col9\" >1.51</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row6_col10\" class=\"data row6 col10\" >0.81</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row6_col11\" class=\"data row6 col11\" >0.43</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row6_col12\" class=\"data row6 col12\" >0.65</td>\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08level0_row7\" class=\"row_heading level0 row7\" >max</th>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row7_col0\" class=\"data row7 col0\" >9.02</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row7_col1\" class=\"data row7 col1\" >3.58</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row7_col2\" class=\"data row7 col2\" >2.32</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row7_col3\" class=\"data row7 col3\" >3.55</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row7_col4\" class=\"data row7 col4\" >2.71</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row7_col5\" class=\"data row7 col5\" >3.74</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row7_col6\" class=\"data row7 col6\" >1.14</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row7_col7\" class=\"data row7 col7\" >3.29</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row7_col8\" class=\"data row7 col8\" >1.66</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row7_col9\" class=\"data row7 col9\" >1.78</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row7_col10\" class=\"data row7 col10\" >1.64</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row7_col11\" class=\"data row7 col11\" >0.43</td>\n",
       "                        <td id=\"T_2e3c00da_f1f5_11ea_9e87_677b8e0bcd08row7_col12\" class=\"data row7 col12\" >3.30</td>\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
       "            </tr>\n",
       "    </tbody></table>"
      ],
      "text/plain": [
       "<pandas.io.formats.style.Styler at 0x7ffea452d1d0>"
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "display(x_train.describe().style.format(\"{0:.2f}\").set_caption(\"Before normalization :\"))\n",
    "\n",
    "mean = x_train.mean()\n",
    "std  = x_train.std()\n",
    "x_train = (x_train - mean) / std\n",
    "x_test  = (x_test  - mean) / std\n",
    "\n",
    "display(x_train.describe().style.format(\"{0:.2f}\").set_caption(\"After normalization :\"))\n",
    "\n",
    "x_train, y_train = np.array(x_train), np.array(y_train)\n",
    "x_test,  y_test  = np.array(x_test),  np.array(y_test)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Step 4 - Build a model\n",
    "More informations about : \n",
    " - [Optimizer](https://www.tensorflow.org/api_docs/python/tf/keras/optimizers)\n",
    " - [Activation](https://www.tensorflow.org/api_docs/python/tf/keras/activations)\n",
    " - [Loss](https://www.tensorflow.org/api_docs/python/tf/keras/losses)\n",
    " - [Metrics](https://www.tensorflow.org/api_docs/python/tf/keras/metrics)"
   ]
  },
  {
   "cell_type": "code",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
   "metadata": {},
   "outputs": [],
   "source": [
    "  def get_model_v1(shape):\n",
    "    \n",
    "    model = keras.models.Sequential()\n",
    "    model.add(keras.layers.Input(shape, name=\"InputLayer\"))\n",
    "    model.add(keras.layers.Dense(64, activation='relu', name='Dense_n1'))\n",
    "    model.add(keras.layers.Dense(64, activation='relu', name='Dense_n2'))\n",
    "    model.add(keras.layers.Dense(1, name='Output'))\n",
    "    \n",
    "    model.compile(optimizer = 'rmsprop',\n",
    "                  loss      = 'mse',\n",
    "                  metrics   = ['mae', 'mse'] )\n",
    "    return model"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 5 - Train the model\n",
    "### 5.1 - Get it"
   ]
  },
  {
   "cell_type": "code",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "Dense_n1 (Dense)             (None, 64)                896       \n",
      "_________________________________________________________________\n",
      "Dense_n2 (Dense)             (None, 64)                4160      \n",
      "_________________________________________________________________\n",
      "Output (Dense)               (None, 1)                 65        \n",
      "=================================================================\n",
      "Total params: 5,121\n",
      "Trainable params: 5,121\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
    }
   ],
   "source": [
    "model=get_model_v1( (13,) )\n",
    "\n",
    "model.summary()\n",
    "img=keras.utils.plot_model( model, to_file='./run/model.png', show_shapes=True, show_layer_names=True, dpi=96)\n",
    "display(img)"
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 5.2 - Add callback"
   ]
  },
  {
   "cell_type": "code",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
   "metadata": {},
   "outputs": [],
   "source": [
    "os.makedirs('./run/models',   mode=0o750, exist_ok=True)\n",
    "save_dir = \"./run/models/best_model.h5\"\n",
    "\n",
    "savemodel_callback = tf.keras.callbacks.ModelCheckpoint(filepath=save_dir, verbose=0, save_best_only=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 5.3 - Train it"
   ]
  },
  {
   "cell_type": "code",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 354 samples, validate on 152 samples\n",
      "Epoch 1/100\n",
      "354/354 [==============================] - 1s 2ms/sample - loss: 429.1682 - mae: 18.8468 - mse: 429.1683 - val_loss: 352.0686 - val_mae: 16.2867 - val_mse: 352.0686\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 2/100\n",
      "354/354 [==============================] - 0s 220us/sample - loss: 187.3996 - mae: 11.6919 - mse: 187.3996 - val_loss: 124.8861 - val_mae: 8.8280 - val_mse: 124.8861\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 3/100\n",
      "354/354 [==============================] - 0s 226us/sample - loss: 60.9587 - mae: 6.1852 - mse: 60.9587 - val_loss: 64.7766 - val_mae: 5.7120 - val_mse: 64.7766\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 4/100\n",
      "354/354 [==============================] - 0s 215us/sample - loss: 33.4901 - mae: 4.3295 - mse: 33.4901 - val_loss: 42.7490 - val_mae: 4.3789 - val_mse: 42.7490\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 5/100\n",
      "354/354 [==============================] - 0s 218us/sample - loss: 23.7739 - mae: 3.5450 - mse: 23.7739 - val_loss: 35.5486 - val_mae: 3.8631 - val_mse: 35.5486\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 6/100\n",
      "354/354 [==============================] - 0s 224us/sample - loss: 18.6308 - mae: 3.0728 - mse: 18.6308 - val_loss: 31.7546 - val_mae: 3.6386 - val_mse: 31.7546\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 7/100\n",
      "354/354 [==============================] - 0s 219us/sample - loss: 16.3552 - mae: 2.8485 - mse: 16.3552 - val_loss: 29.6702 - val_mae: 3.5472 - val_mse: 29.6702\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 8/100\n",
      "354/354 [==============================] - 0s 225us/sample - loss: 15.0688 - mae: 2.7065 - mse: 15.0688 - val_loss: 27.7940 - val_mae: 3.4281 - val_mse: 27.7940\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 9/100\n",
      "354/354 [==============================] - 0s 219us/sample - loss: 13.7102 - mae: 2.5252 - mse: 13.7102 - val_loss: 25.8524 - val_mae: 3.3030 - val_mse: 25.8524\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 10/100\n",
      "354/354 [==============================] - 0s 214us/sample - loss: 13.0620 - mae: 2.4623 - mse: 13.0620 - val_loss: 24.1970 - val_mae: 3.2497 - val_mse: 24.1970\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 11/100\n",
      "354/354 [==============================] - 0s 181us/sample - loss: 12.3652 - mae: 2.4164 - mse: 12.3652 - val_loss: 25.3418 - val_mae: 3.2958 - val_mse: 25.3418\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 12/100\n",
      "354/354 [==============================] - 0s 209us/sample - loss: 11.8866 - mae: 2.3633 - mse: 11.8866 - val_loss: 23.2097 - val_mae: 3.1934 - val_mse: 23.2097\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 13/100\n",
      "354/354 [==============================] - 0s 175us/sample - loss: 11.5238 - mae: 2.2892 - mse: 11.5238 - val_loss: 23.2434 - val_mae: 3.1315 - val_mse: 23.2434\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 14/100\n",
      "354/354 [==============================] - 0s 208us/sample - loss: 11.1692 - mae: 2.2504 - mse: 11.1692 - val_loss: 22.5373 - val_mae: 3.0818 - val_mse: 22.5373\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 15/100\n",
      "354/354 [==============================] - 0s 215us/sample - loss: 10.8398 - mae: 2.2416 - mse: 10.8398 - val_loss: 21.5891 - val_mae: 3.0361 - val_mse: 21.5891\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 16/100\n",
      "354/354 [==============================] - 0s 171us/sample - loss: 10.7131 - mae: 2.2010 - mse: 10.7131 - val_loss: 22.0238 - val_mae: 3.0444 - val_mse: 22.0238\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 17/100\n",
      "354/354 [==============================] - 0s 207us/sample - loss: 10.4554 - mae: 2.2160 - mse: 10.4554 - val_loss: 20.3310 - val_mae: 3.0210 - val_mse: 20.3310\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 18/100\n",
      "354/354 [==============================] - 0s 215us/sample - loss: 10.1969 - mae: 2.1522 - mse: 10.1969 - val_loss: 19.8989 - val_mae: 3.0406 - val_mse: 19.8989\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 19/100\n",
      "354/354 [==============================] - 0s 231us/sample - loss: 9.8782 - mae: 2.1273 - mse: 9.8782 - val_loss: 19.5894 - val_mae: 3.0204 - val_mse: 19.5894\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 20/100\n",
      "354/354 [==============================] - 0s 179us/sample - loss: 9.6757 - mae: 2.1045 - mse: 9.6757 - val_loss: 20.2566 - val_mae: 2.9530 - val_mse: 20.2566\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 21/100\n",
      "354/354 [==============================] - 0s 209us/sample - loss: 9.7305 - mae: 2.1052 - mse: 9.7305 - val_loss: 19.3397 - val_mae: 2.9417 - val_mse: 19.3397\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 22/100\n",
      "354/354 [==============================] - 0s 173us/sample - loss: 9.3255 - mae: 2.0713 - mse: 9.3255 - val_loss: 20.6716 - val_mae: 2.9769 - val_mse: 20.6716\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 23/100\n",
      "354/354 [==============================] - 0s 174us/sample - loss: 9.4971 - mae: 2.0784 - mse: 9.4971 - val_loss: 19.5308 - val_mae: 2.8951 - val_mse: 19.5308\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 24/100\n",
      "354/354 [==============================] - 0s 171us/sample - loss: 9.3786 - mae: 2.0279 - mse: 9.3786 - val_loss: 20.0007 - val_mae: 2.9042 - val_mse: 20.0007\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 25/100\n",
      "354/354 [==============================] - 0s 164us/sample - loss: 9.2494 - mae: 2.0473 - mse: 9.2494 - val_loss: 19.8543 - val_mae: 2.9153 - val_mse: 19.8543\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 26/100\n",
      "354/354 [==============================] - 0s 178us/sample - loss: 8.8924 - mae: 1.9611 - mse: 8.8924 - val_loss: 20.1059 - val_mae: 3.0175 - val_mse: 20.1059\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 27/100\n",
      "354/354 [==============================] - 0s 211us/sample - loss: 8.8493 - mae: 1.9850 - mse: 8.8493 - val_loss: 19.0924 - val_mae: 2.9133 - val_mse: 19.0924\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 28/100\n",
      "354/354 [==============================] - 0s 222us/sample - loss: 8.7235 - mae: 1.9539 - mse: 8.7235 - val_loss: 18.8848 - val_mae: 2.8254 - val_mse: 18.8848\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 29/100\n",
      "354/354 [==============================] - 0s 212us/sample - loss: 8.4714 - mae: 1.9410 - mse: 8.4714 - val_loss: 18.6757 - val_mae: 2.8632 - val_mse: 18.6757\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 30/100\n",
      "354/354 [==============================] - 0s 213us/sample - loss: 8.5340 - mae: 1.9305 - mse: 8.5340 - val_loss: 17.5472 - val_mae: 2.9041 - val_mse: 17.5472\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 31/100\n",
      "354/354 [==============================] - 0s 173us/sample - loss: 8.2329 - mae: 1.9490 - mse: 8.2329 - val_loss: 18.3023 - val_mae: 2.8256 - val_mse: 18.3023\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 32/100\n",
      "354/354 [==============================] - 0s 179us/sample - loss: 8.2141 - mae: 1.8936 - mse: 8.2141 - val_loss: 19.1499 - val_mae: 2.9304 - val_mse: 19.1499\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 33/100\n",
      "354/354 [==============================] - 0s 168us/sample - loss: 8.1556 - mae: 1.8934 - mse: 8.1556 - val_loss: 17.6018 - val_mae: 2.7829 - val_mse: 17.6018\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 34/100\n",
      "354/354 [==============================] - 0s 213us/sample - loss: 8.0088 - mae: 1.8932 - mse: 8.0088 - val_loss: 17.0437 - val_mae: 2.7469 - val_mse: 17.0437\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 35/100\n",
      "354/354 [==============================] - 0s 233us/sample - loss: 7.7964 - mae: 1.8813 - mse: 7.7964 - val_loss: 16.5385 - val_mae: 2.7644 - val_mse: 16.5385\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 36/100\n",
      "354/354 [==============================] - 0s 172us/sample - loss: 7.9428 - mae: 1.9060 - mse: 7.9428 - val_loss: 17.1548 - val_mae: 2.8017 - val_mse: 17.1548\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 37/100\n",
      "354/354 [==============================] - 0s 166us/sample - loss: 7.8799 - mae: 1.8151 - mse: 7.8798 - val_loss: 18.0839 - val_mae: 2.7838 - val_mse: 18.0839\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 38/100\n",
      "354/354 [==============================] - 0s 166us/sample - loss: 7.9034 - mae: 1.8507 - mse: 7.9034 - val_loss: 16.7612 - val_mae: 2.7060 - val_mse: 16.7612\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 39/100\n",
      "354/354 [==============================] - 0s 171us/sample - loss: 7.6441 - mae: 1.8198 - mse: 7.6441 - val_loss: 16.7067 - val_mae: 2.7185 - val_mse: 16.7067\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 40/100\n",
      "354/354 [==============================] - 0s 173us/sample - loss: 7.7784 - mae: 1.8554 - mse: 7.7784 - val_loss: 16.5735 - val_mae: 2.6828 - val_mse: 16.5735\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 41/100\n",
      "354/354 [==============================] - 0s 222us/sample - loss: 7.4901 - mae: 1.8260 - mse: 7.4901 - val_loss: 16.4810 - val_mae: 2.6926 - val_mse: 16.4810\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 42/100\n",
      "354/354 [==============================] - 0s 171us/sample - loss: 7.4583 - mae: 1.7847 - mse: 7.4583 - val_loss: 16.6520 - val_mae: 2.6816 - val_mse: 16.6520\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 43/100\n",
      "354/354 [==============================] - 0s 213us/sample - loss: 7.1234 - mae: 1.8169 - mse: 7.1234 - val_loss: 16.1394 - val_mae: 2.8231 - val_mse: 16.1394\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 44/100\n",
      "354/354 [==============================] - 0s 176us/sample - loss: 7.3209 - mae: 1.8194 - mse: 7.3209 - val_loss: 17.1395 - val_mae: 2.7080 - val_mse: 17.1395\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 45/100\n",
      "354/354 [==============================] - 0s 175us/sample - loss: 7.2618 - mae: 1.7858 - mse: 7.2618 - val_loss: 16.5276 - val_mae: 2.6765 - val_mse: 16.5276\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 46/100\n",
      "354/354 [==============================] - 0s 174us/sample - loss: 7.0747 - mae: 1.7662 - mse: 7.0747 - val_loss: 16.8039 - val_mae: 2.7428 - val_mse: 16.8039\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 47/100\n",
      "354/354 [==============================] - 0s 205us/sample - loss: 6.9520 - mae: 1.7333 - mse: 6.9520 - val_loss: 15.9968 - val_mae: 2.6659 - val_mse: 15.9968\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 48/100\n",
      "354/354 [==============================] - 0s 178us/sample - loss: 6.9232 - mae: 1.7301 - mse: 6.9232 - val_loss: 16.2660 - val_mae: 2.6494 - val_mse: 16.2660\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 49/100\n",
      "354/354 [==============================] - 0s 207us/sample - loss: 7.0229 - mae: 1.7404 - mse: 7.0229 - val_loss: 15.6720 - val_mae: 2.6691 - val_mse: 15.6720\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 50/100\n",
      "354/354 [==============================] - 0s 184us/sample - loss: 6.7251 - mae: 1.7580 - mse: 6.7251 - val_loss: 17.0077 - val_mae: 2.7250 - val_mse: 17.0077\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 51/100\n",
      "354/354 [==============================] - 0s 185us/sample - loss: 6.8393 - mae: 1.7131 - mse: 6.8393 - val_loss: 16.5671 - val_mae: 2.6707 - val_mse: 16.5671\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 52/100\n",
      "354/354 [==============================] - 0s 175us/sample - loss: 6.6647 - mae: 1.6831 - mse: 6.6647 - val_loss: 16.2175 - val_mae: 2.6816 - val_mse: 16.2175\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 53/100\n",
      "354/354 [==============================] - 0s 174us/sample - loss: 6.5925 - mae: 1.7133 - mse: 6.5925 - val_loss: 16.8129 - val_mae: 2.6882 - val_mse: 16.8129\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 54/100\n",
      "354/354 [==============================] - 0s 211us/sample - loss: 6.5071 - mae: 1.6980 - mse: 6.5071 - val_loss: 15.6172 - val_mae: 2.7470 - val_mse: 15.6172\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 55/100\n",
      "354/354 [==============================] - 0s 237us/sample - loss: 6.4762 - mae: 1.7064 - mse: 6.4762 - val_loss: 15.1044 - val_mae: 2.6354 - val_mse: 15.1044\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 56/100\n",
      "354/354 [==============================] - 0s 173us/sample - loss: 6.2826 - mae: 1.6902 - mse: 6.2826 - val_loss: 17.5892 - val_mae: 2.8422 - val_mse: 17.5892\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 57/100\n",
      "354/354 [==============================] - 0s 162us/sample - loss: 6.5736 - mae: 1.7001 - mse: 6.5736 - val_loss: 15.5415 - val_mae: 2.6102 - val_mse: 15.5415\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 58/100\n",
      "354/354 [==============================] - 0s 158us/sample - loss: 6.3667 - mae: 1.6807 - mse: 6.3667 - val_loss: 15.3699 - val_mae: 2.6143 - val_mse: 15.3699\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 59/100\n",
      "354/354 [==============================] - 0s 175us/sample - loss: 6.3116 - mae: 1.6672 - mse: 6.3116 - val_loss: 15.1690 - val_mae: 2.6191 - val_mse: 15.1690\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 60/100\n",
      "354/354 [==============================] - 0s 166us/sample - loss: 6.0480 - mae: 1.6076 - mse: 6.0480 - val_loss: 15.4159 - val_mae: 2.5666 - val_mse: 15.4159\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 61/100\n",
      "354/354 [==============================] - 0s 168us/sample - loss: 5.9372 - mae: 1.6170 - mse: 5.9372 - val_loss: 16.3723 - val_mae: 2.7008 - val_mse: 16.3723\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 62/100\n",
      "354/354 [==============================] - 0s 209us/sample - loss: 6.2295 - mae: 1.6809 - mse: 6.2295 - val_loss: 14.4432 - val_mae: 2.5659 - val_mse: 14.4432\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 63/100\n",
      "354/354 [==============================] - 0s 173us/sample - loss: 6.0430 - mae: 1.6175 - mse: 6.0430 - val_loss: 15.7230 - val_mae: 2.6120 - val_mse: 15.7230\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 64/100\n",
      "354/354 [==============================] - 0s 165us/sample - loss: 5.8128 - mae: 1.5988 - mse: 5.8128 - val_loss: 15.3515 - val_mae: 2.6344 - val_mse: 15.3515\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 65/100\n",
      "354/354 [==============================] - 0s 163us/sample - loss: 6.0937 - mae: 1.6535 - mse: 6.0937 - val_loss: 15.0359 - val_mae: 2.6071 - val_mse: 15.0359\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 66/100\n",
      "354/354 [==============================] - 0s 175us/sample - loss: 5.9493 - mae: 1.6212 - mse: 5.9493 - val_loss: 14.5079 - val_mae: 2.5570 - val_mse: 14.5079\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 67/100\n",
      "354/354 [==============================] - 0s 167us/sample - loss: 5.7467 - mae: 1.5815 - mse: 5.7467 - val_loss: 15.6834 - val_mae: 2.6418 - val_mse: 15.6834\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 68/100\n",
      "354/354 [==============================] - 0s 175us/sample - loss: 5.7754 - mae: 1.5822 - mse: 5.7754 - val_loss: 15.3485 - val_mae: 2.6661 - val_mse: 15.3485\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 69/100\n",
      "354/354 [==============================] - 0s 166us/sample - loss: 5.8671 - mae: 1.6219 - mse: 5.8671 - val_loss: 14.7226 - val_mae: 2.5691 - val_mse: 14.7226\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 70/100\n",
      "354/354 [==============================] - 0s 161us/sample - loss: 5.5371 - mae: 1.5618 - mse: 5.5371 - val_loss: 15.4694 - val_mae: 2.7397 - val_mse: 15.4694\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 71/100\n",
      "354/354 [==============================] - 0s 184us/sample - loss: 5.7798 - mae: 1.6298 - mse: 5.7798 - val_loss: 14.9847 - val_mae: 2.5864 - val_mse: 14.9847\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 72/100\n",
      "354/354 [==============================] - 0s 215us/sample - loss: 5.6852 - mae: 1.5909 - mse: 5.6852 - val_loss: 14.4344 - val_mae: 2.5542 - val_mse: 14.4344\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 73/100\n",
      "354/354 [==============================] - 0s 226us/sample - loss: 5.4654 - mae: 1.5450 - mse: 5.4654 - val_loss: 13.7925 - val_mae: 2.5750 - val_mse: 13.7925\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 74/100\n",
      "354/354 [==============================] - 0s 174us/sample - loss: 5.4204 - mae: 1.5595 - mse: 5.4204 - val_loss: 14.3083 - val_mae: 2.5919 - val_mse: 14.3083\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 75/100\n",
      "354/354 [==============================] - 0s 170us/sample - loss: 5.3183 - mae: 1.5827 - mse: 5.3183 - val_loss: 14.8913 - val_mae: 2.6033 - val_mse: 14.8913\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 76/100\n",
      "354/354 [==============================] - 0s 162us/sample - loss: 5.4595 - mae: 1.5874 - mse: 5.4595 - val_loss: 14.0410 - val_mae: 2.6021 - val_mse: 14.0410\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 77/100\n",
      "354/354 [==============================] - 0s 165us/sample - loss: 5.3295 - mae: 1.5586 - mse: 5.3295 - val_loss: 14.4499 - val_mae: 2.6315 - val_mse: 14.4499\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 78/100\n",
      "354/354 [==============================] - 0s 170us/sample - loss: 5.3187 - mae: 1.5144 - mse: 5.3187 - val_loss: 14.8048 - val_mae: 2.6123 - val_mse: 14.8048\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 79/100\n",
      "354/354 [==============================] - 0s 163us/sample - loss: 5.0078 - mae: 1.5458 - mse: 5.0078 - val_loss: 16.8855 - val_mae: 2.7085 - val_mse: 16.8855\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 80/100\n",
      "354/354 [==============================] - 0s 165us/sample - loss: 5.2642 - mae: 1.5158 - mse: 5.2642 - val_loss: 14.1548 - val_mae: 2.5029 - val_mse: 14.1548\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 81/100\n",
      "354/354 [==============================] - 0s 157us/sample - loss: 5.1865 - mae: 1.5163 - mse: 5.1865 - val_loss: 14.0614 - val_mae: 2.5335 - val_mse: 14.0614\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 82/100\n",
      "354/354 [==============================] - 0s 185us/sample - loss: 5.0460 - mae: 1.5366 - mse: 5.0460 - val_loss: 14.5370 - val_mae: 2.5429 - val_mse: 14.5370\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 83/100\n",
      "354/354 [==============================] - 0s 174us/sample - loss: 4.9748 - mae: 1.5005 - mse: 4.9748 - val_loss: 14.7812 - val_mae: 2.6546 - val_mse: 14.7812\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 84/100\n",
      "354/354 [==============================] - 0s 173us/sample - loss: 5.1114 - mae: 1.5233 - mse: 5.1114 - val_loss: 14.6264 - val_mae: 2.5917 - val_mse: 14.6264\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 85/100\n",
      "354/354 [==============================] - 0s 173us/sample - loss: 4.9709 - mae: 1.4471 - mse: 4.9709 - val_loss: 14.4156 - val_mae: 2.5713 - val_mse: 14.4156\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 86/100\n",
      "354/354 [==============================] - 0s 218us/sample - loss: 4.7742 - mae: 1.4547 - mse: 4.7742 - val_loss: 13.4703 - val_mae: 2.6523 - val_mse: 13.4703\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 87/100\n",
      "354/354 [==============================] - 0s 176us/sample - loss: 5.0550 - mae: 1.4842 - mse: 5.0550 - val_loss: 13.4970 - val_mae: 2.5958 - val_mse: 13.4970\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 88/100\n",
      "354/354 [==============================] - 0s 167us/sample - loss: 4.6993 - mae: 1.5044 - mse: 4.6993 - val_loss: 13.9216 - val_mae: 2.5554 - val_mse: 13.9216\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 89/100\n",
      "354/354 [==============================] - 0s 164us/sample - loss: 4.7660 - mae: 1.4815 - mse: 4.7660 - val_loss: 13.6762 - val_mae: 2.5521 - val_mse: 13.6762\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 90/100\n",
      "354/354 [==============================] - 0s 166us/sample - loss: 4.6544 - mae: 1.4618 - mse: 4.6544 - val_loss: 14.6759 - val_mae: 2.5828 - val_mse: 14.6759\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 91/100\n",
      "354/354 [==============================] - 0s 240us/sample - loss: 4.7288 - mae: 1.4415 - mse: 4.7288 - val_loss: 13.2609 - val_mae: 2.6077 - val_mse: 13.2609\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 92/100\n",
      "354/354 [==============================] - 0s 177us/sample - loss: 4.6730 - mae: 1.4331 - mse: 4.6730 - val_loss: 13.4463 - val_mae: 2.7238 - val_mse: 13.4463\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 93/100\n",
      "354/354 [==============================] - 0s 163us/sample - loss: 4.4141 - mae: 1.4512 - mse: 4.4141 - val_loss: 13.6472 - val_mae: 2.5763 - val_mse: 13.6472\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 94/100\n",
      "354/354 [==============================] - 0s 165us/sample - loss: 4.5136 - mae: 1.4138 - mse: 4.5136 - val_loss: 15.7465 - val_mae: 2.7020 - val_mse: 15.7465\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 95/100\n",
      "354/354 [==============================] - 0s 168us/sample - loss: 4.6733 - mae: 1.4679 - mse: 4.6733 - val_loss: 13.3843 - val_mae: 2.5652 - val_mse: 13.3843\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 96/100\n",
      "354/354 [==============================] - 0s 174us/sample - loss: 4.6895 - mae: 1.4674 - mse: 4.6895 - val_loss: 13.7346 - val_mae: 2.5467 - val_mse: 13.7346\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 97/100\n",
      "354/354 [==============================] - 0s 166us/sample - loss: 4.3689 - mae: 1.4277 - mse: 4.3689 - val_loss: 13.6955 - val_mae: 2.5702 - val_mse: 13.6955\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 98/100\n",
      "354/354 [==============================] - 0s 167us/sample - loss: 4.3953 - mae: 1.3996 - mse: 4.3953 - val_loss: 13.6977 - val_mae: 2.5888 - val_mse: 13.6977\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 99/100\n",
      "354/354 [==============================] - 0s 160us/sample - loss: 4.3799 - mae: 1.4405 - mse: 4.3799 - val_loss: 15.0689 - val_mae: 2.6300 - val_mse: 15.0689\n",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
      "Epoch 100/100\n",
      "354/354 [==============================] - 0s 205us/sample - loss: 4.3640 - mae: 1.4099 - mse: 4.3640 - val_loss: 12.8820 - val_mae: 2.5248 - val_mse: 12.8820\n"
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
     ]
    }
   ],
   "source": [
    "history = model.fit(x_train,\n",
    "                    y_train,\n",
    "                    epochs          = 100,\n",
    "                    batch_size      = 10,\n",
    "                    verbose         = 1,\n",
    "                    validation_data = (x_test, y_test),\n",
    "                    callbacks       = [savemodel_callback])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Step 6 - Evaluate\n",
    "### 6.1 - Model evaluation\n",
    "MAE =  Mean Absolute Error (between the labels and predictions)  \n",
    "A mae equal to 3 represents an average error in prediction of $3k."
   ]
  },
  {
   "cell_type": "code",
Jean-Luc Parouty's avatar
Jean-Luc Parouty committed
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",