You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@madlib.apache.org by fm...@apache.org on 2021/05/14 23:24:40 UTC

[madlib-site] branch asf-site updated: change http to https in various links

This is an automated email from the ASF dual-hosted git repository.

fmcquillan pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/madlib-site.git


The following commit(s) were added to refs/heads/asf-site by this push:
     new 8ba4112  change http to https in various links
8ba4112 is described below

commit 8ba41129ba8621769f45f29a5a02d758868afd18
Author: Frank McQuillan <fm...@pivotal.io>
AuthorDate: Fri May 14 16:24:05 2021 -0700

    change http to https in various links
---
 ...b-Keras-model-selection-MLP-v1-checkpoint.ipynb | 2448 ++++++++++
 .../MADlib-Keras-MLP-v2-checkpoint.ipynb           | 5025 ++++++++++++++++++++
 ...MADlib-e2e-ds-workflow-abalone-checkpoint.ipynb | 4574 ++++++++++++++++++
 .../.ipynb_checkpoints/APSP-v1-checkpoint.ipynb    | 1727 +++++++
 .../Breadth-first-search-v1-checkpoint.ipynb       | 1158 +++++
 .../Graph-measures-v1-checkpoint.ipynb             | 2203 +++++++++
 .../.ipynb_checkpoints/HITS-v1-checkpoint.ipynb    |  878 ++++
 .../PageRank-v2-checkpoint.ipynb                   |  864 ++++
 .../.ipynb_checkpoints/SSSP-v2-checkpoint.ipynb    | 1065 +++++
 .../Weakly-connected-cpts-v2-checkpoint.ipynb      |  907 ++++
 .../MLP-mnist-v3-checkpoint.ipynb                  | 1278 +++++
 community.html                                     |   40 +-
 documentation.html                                 |    6 +-
 download.html                                      |   12 +-
 index.html                                         |    6 +-
 product.html                                       |    6 +-
 16 files changed, 22162 insertions(+), 35 deletions(-)

diff --git a/community-artifacts/Deep-learning/Train-multiple-models/.ipynb_checkpoints/MADlib-Keras-model-selection-MLP-v1-checkpoint.ipynb b/community-artifacts/Deep-learning/Train-multiple-models/.ipynb_checkpoints/MADlib-Keras-model-selection-MLP-v1-checkpoint.ipynb
new file mode 100644
index 0000000..d564043
--- /dev/null
+++ b/community-artifacts/Deep-learning/Train-multiple-models/.ipynb_checkpoints/MADlib-Keras-model-selection-MLP-v1-checkpoint.ipynb
@@ -0,0 +1,2448 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# Model Selection for Multilayer Perceptron Using Keras and MADlib\n",
+    "\n",
+    "E2E classification example using MADlib calling a Keras MLP for different hyperparameters and model architectures.\n",
+    "\n",
+    "Deep learning works best on very large datasets, but that is not convenient for a quick introduction to the syntax.  So in this workbook we use the well known iris data set from https://archive.ics.uci.edu/ml/datasets/iris to help get you started.  It is similar to the example in user docs http://madlib.apache.org/docs/latest/index.html\n",
+    "\n",
+    "For more realistic examples please refer to the deep learning notebooks at https://github.com/apache/madlib-site/tree/asf-site/community-artifacts\n",
+    "\n",
+    "## Table of contents\n",
+    "\n",
+    "<a href=\"#class\">Classification</a>\n",
+    "\n",
+    "* <a href=\"#create_input_data\">1. Create input data</a>\n",
+    "\n",
+    "* <a href=\"#pp\">2. Call preprocessor for deep learning</a>\n",
+    "\n",
+    "* <a href=\"#load\">3. Define and load model architecture</a>\n",
+    "\n",
+    "* <a href=\"#def_mst\">4. Define and load model selection tuples</a>\n",
+    "\n",
+    "* <a href=\"#train\">5. Train</a>\n",
+    "\n",
+    "* <a href=\"#eval\">6. Evaluate</a>\n",
+    "\n",
+    "* <a href=\"#pred\">7. Predict</a>\n",
+    "\n",
+    "<a href=\"#class2\">Classification with Other Parameters</a>\n",
+    "\n",
+    "* <a href=\"#val_dataset\">1. Validation dataset</a>\n",
+    "\n",
+    "* <a href=\"#pred_prob\">2. Predict probabilities</a>\n",
+    "\n",
+    "* <a href=\"#warm_start\">3. Warm start</a>"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {
+    "scrolled": false
+   },
+   "outputs": [],
+   "source": [
+    "%load_ext sql"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# Greenplum Database 5.x on GCP - via tunnel\n",
+    "%sql postgresql://gpadmin@localhost:8000/madlib\n",
+    "        \n",
+    "# PostgreSQL local\n",
+    "#%sql postgresql://fmcquillan@localhost:5432/madlib"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "1 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <tr>\n",
+       "        <th>version</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>MADlib version: 1.18.0, git revision: rel/v1.17.0-102-g42d51bc, cmake configuration time: Sun Apr 18 20:26:28 UTC 2021, build type: release, build system: Linux-3.10.0-1160.24.1.el7.x86_64, C compiler: gcc 4.8.5, C++ compiler: g++ 4.8.5</td>\n",
+       "    </tr>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[(u'MADlib version: 1.18.0, git revision: rel/v1.17.0-102-g42d51bc, cmake configuration time: Sun Apr 18 20:26:28 UTC 2021, build type: release, build system: Linux-3.10.0-1160.24.1.el7.x86_64, C compiler: gcc 4.8.5, C++ compiler: g++ 4.8.5',)]"
+      ]
+     },
+     "execution_count": 3,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%sql select madlib.version();\n",
+    "#%sql select version();"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "<a id=\"class\"></a>\n",
+    "# Classification\n",
+    "\n",
+    "<a id=\"create_input_data\"></a>\n",
+    "# 1.  Create input data\n",
+    "\n",
+    "Load iris data set."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Done.\n",
+      "Done.\n",
+      "150 rows affected.\n",
+      "150 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <tr>\n",
+       "        <th>id</th>\n",
+       "        <th>attributes</th>\n",
+       "        <th>class_text</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>1</td>\n",
+       "        <td>[Decimal('5.1'), Decimal('3.5'), Decimal('1.4'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>2</td>\n",
+       "        <td>[Decimal('4.9'), Decimal('3.0'), Decimal('1.4'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>3</td>\n",
+       "        <td>[Decimal('4.7'), Decimal('3.2'), Decimal('1.3'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>4</td>\n",
+       "        <td>[Decimal('4.6'), Decimal('3.1'), Decimal('1.5'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>5</td>\n",
+       "        <td>[Decimal('5.0'), Decimal('3.6'), Decimal('1.4'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>6</td>\n",
+       "        <td>[Decimal('5.4'), Decimal('3.9'), Decimal('1.7'), Decimal('0.4')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>7</td>\n",
+       "        <td>[Decimal('4.6'), Decimal('3.4'), Decimal('1.4'), Decimal('0.3')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>8</td>\n",
+       "        <td>[Decimal('5.0'), Decimal('3.4'), Decimal('1.5'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>9</td>\n",
+       "        <td>[Decimal('4.4'), Decimal('2.9'), Decimal('1.4'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>10</td>\n",
+       "        <td>[Decimal('4.9'), Decimal('3.1'), Decimal('1.5'), Decimal('0.1')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>11</td>\n",
+       "        <td>[Decimal('5.4'), Decimal('3.7'), Decimal('1.5'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>12</td>\n",
+       "        <td>[Decimal('4.8'), Decimal('3.4'), Decimal('1.6'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>13</td>\n",
+       "        <td>[Decimal('4.8'), Decimal('3.0'), Decimal('1.4'), Decimal('0.1')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>14</td>\n",
+       "        <td>[Decimal('4.3'), Decimal('3.0'), Decimal('1.1'), Decimal('0.1')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>15</td>\n",
+       "        <td>[Decimal('5.8'), Decimal('4.0'), Decimal('1.2'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>16</td>\n",
+       "        <td>[Decimal('5.7'), Decimal('4.4'), Decimal('1.5'), Decimal('0.4')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>17</td>\n",
+       "        <td>[Decimal('5.4'), Decimal('3.9'), Decimal('1.3'), Decimal('0.4')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>18</td>\n",
+       "        <td>[Decimal('5.1'), Decimal('3.5'), Decimal('1.4'), Decimal('0.3')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>19</td>\n",
+       "        <td>[Decimal('5.7'), Decimal('3.8'), Decimal('1.7'), Decimal('0.3')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>20</td>\n",
+       "        <td>[Decimal('5.1'), Decimal('3.8'), Decimal('1.5'), Decimal('0.3')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>21</td>\n",
+       "        <td>[Decimal('5.4'), Decimal('3.4'), Decimal('1.7'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>22</td>\n",
+       "        <td>[Decimal('5.1'), Decimal('3.7'), Decimal('1.5'), Decimal('0.4')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>23</td>\n",
+       "        <td>[Decimal('4.6'), Decimal('3.6'), Decimal('1.0'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>24</td>\n",
+       "        <td>[Decimal('5.1'), Decimal('3.3'), Decimal('1.7'), Decimal('0.5')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>25</td>\n",
+       "        <td>[Decimal('4.8'), Decimal('3.4'), Decimal('1.9'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>26</td>\n",
+       "        <td>[Decimal('5.0'), Decimal('3.0'), Decimal('1.6'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>27</td>\n",
+       "        <td>[Decimal('5.0'), Decimal('3.4'), Decimal('1.6'), Decimal('0.4')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>28</td>\n",
+       "        <td>[Decimal('5.2'), Decimal('3.5'), Decimal('1.5'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>29</td>\n",
+       "        <td>[Decimal('5.2'), Decimal('3.4'), Decimal('1.4'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>30</td>\n",
+       "        <td>[Decimal('4.7'), Decimal('3.2'), Decimal('1.6'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>31</td>\n",
+       "        <td>[Decimal('4.8'), Decimal('3.1'), Decimal('1.6'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>32</td>\n",
+       "        <td>[Decimal('5.4'), Decimal('3.4'), Decimal('1.5'), Decimal('0.4')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>33</td>\n",
+       "        <td>[Decimal('5.2'), Decimal('4.1'), Decimal('1.5'), Decimal('0.1')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>34</td>\n",
+       "        <td>[Decimal('5.5'), Decimal('4.2'), Decimal('1.4'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>35</td>\n",
+       "        <td>[Decimal('4.9'), Decimal('3.1'), Decimal('1.5'), Decimal('0.1')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>36</td>\n",
+       "        <td>[Decimal('5.0'), Decimal('3.2'), Decimal('1.2'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>37</td>\n",
+       "        <td>[Decimal('5.5'), Decimal('3.5'), Decimal('1.3'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>38</td>\n",
+       "        <td>[Decimal('4.9'), Decimal('3.1'), Decimal('1.5'), Decimal('0.1')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>39</td>\n",
+       "        <td>[Decimal('4.4'), Decimal('3.0'), Decimal('1.3'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>40</td>\n",
+       "        <td>[Decimal('5.1'), Decimal('3.4'), Decimal('1.5'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>41</td>\n",
+       "        <td>[Decimal('5.0'), Decimal('3.5'), Decimal('1.3'), Decimal('0.3')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>42</td>\n",
+       "        <td>[Decimal('4.5'), Decimal('2.3'), Decimal('1.3'), Decimal('0.3')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>43</td>\n",
+       "        <td>[Decimal('4.4'), Decimal('3.2'), Decimal('1.3'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>44</td>\n",
+       "        <td>[Decimal('5.0'), Decimal('3.5'), Decimal('1.6'), Decimal('0.6')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>45</td>\n",
+       "        <td>[Decimal('5.1'), Decimal('3.8'), Decimal('1.9'), Decimal('0.4')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>46</td>\n",
+       "        <td>[Decimal('4.8'), Decimal('3.0'), Decimal('1.4'), Decimal('0.3')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>47</td>\n",
+       "        <td>[Decimal('5.1'), Decimal('3.8'), Decimal('1.6'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>48</td>\n",
+       "        <td>[Decimal('4.6'), Decimal('3.2'), Decimal('1.4'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>49</td>\n",
+       "        <td>[Decimal('5.3'), Decimal('3.7'), Decimal('1.5'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>50</td>\n",
+       "        <td>[Decimal('5.0'), Decimal('3.3'), Decimal('1.4'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>51</td>\n",
+       "        <td>[Decimal('7.0'), Decimal('3.2'), Decimal('4.7'), Decimal('1.4')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>52</td>\n",
+       "        <td>[Decimal('6.4'), Decimal('3.2'), Decimal('4.5'), Decimal('1.5')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>53</td>\n",
+       "        <td>[Decimal('6.9'), Decimal('3.1'), Decimal('4.9'), Decimal('1.5')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>54</td>\n",
+       "        <td>[Decimal('5.5'), Decimal('2.3'), Decimal('4.0'), Decimal('1.3')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>55</td>\n",
+       "        <td>[Decimal('6.5'), Decimal('2.8'), Decimal('4.6'), Decimal('1.5')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>56</td>\n",
+       "        <td>[Decimal('5.7'), Decimal('2.8'), Decimal('4.5'), Decimal('1.3')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>57</td>\n",
+       "        <td>[Decimal('6.3'), Decimal('3.3'), Decimal('4.7'), Decimal('1.6')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>58</td>\n",
+       "        <td>[Decimal('4.9'), Decimal('2.4'), Decimal('3.3'), Decimal('1.0')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>59</td>\n",
+       "        <td>[Decimal('6.6'), Decimal('2.9'), Decimal('4.6'), Decimal('1.3')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>60</td>\n",
+       "        <td>[Decimal('5.2'), Decimal('2.7'), Decimal('3.9'), Decimal('1.4')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>61</td>\n",
+       "        <td>[Decimal('5.0'), Decimal('2.0'), Decimal('3.5'), Decimal('1.0')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>62</td>\n",
+       "        <td>[Decimal('5.9'), Decimal('3.0'), Decimal('4.2'), Decimal('1.5')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>63</td>\n",
+       "        <td>[Decimal('6.0'), Decimal('2.2'), Decimal('4.0'), Decimal('1.0')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>64</td>\n",
+       "        <td>[Decimal('6.1'), Decimal('2.9'), Decimal('4.7'), Decimal('1.4')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>65</td>\n",
+       "        <td>[Decimal('5.6'), Decimal('2.9'), Decimal('3.6'), Decimal('1.3')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>66</td>\n",
+       "        <td>[Decimal('6.7'), Decimal('3.1'), Decimal('4.4'), Decimal('1.4')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>67</td>\n",
+       "        <td>[Decimal('5.6'), Decimal('3.0'), Decimal('4.5'), Decimal('1.5')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>68</td>\n",
+       "        <td>[Decimal('5.8'), Decimal('2.7'), Decimal('4.1'), Decimal('1.0')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>69</td>\n",
+       "        <td>[Decimal('6.2'), Decimal('2.2'), Decimal('4.5'), Decimal('1.5')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>70</td>\n",
+       "        <td>[Decimal('5.6'), Decimal('2.5'), Decimal('3.9'), Decimal('1.1')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>71</td>\n",
+       "        <td>[Decimal('5.9'), Decimal('3.2'), Decimal('4.8'), Decimal('1.8')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>72</td>\n",
+       "        <td>[Decimal('6.1'), Decimal('2.8'), Decimal('4.0'), Decimal('1.3')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>73</td>\n",
+       "        <td>[Decimal('6.3'), Decimal('2.5'), Decimal('4.9'), Decimal('1.5')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>74</td>\n",
+       "        <td>[Decimal('6.1'), Decimal('2.8'), Decimal('4.7'), Decimal('1.2')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>75</td>\n",
+       "        <td>[Decimal('6.4'), Decimal('2.9'), Decimal('4.3'), Decimal('1.3')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>76</td>\n",
+       "        <td>[Decimal('6.6'), Decimal('3.0'), Decimal('4.4'), Decimal('1.4')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>77</td>\n",
+       "        <td>[Decimal('6.8'), Decimal('2.8'), Decimal('4.8'), Decimal('1.4')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>78</td>\n",
+       "        <td>[Decimal('6.7'), Decimal('3.0'), Decimal('5.0'), Decimal('1.7')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>79</td>\n",
+       "        <td>[Decimal('6.0'), Decimal('2.9'), Decimal('4.5'), Decimal('1.5')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>80</td>\n",
+       "        <td>[Decimal('5.7'), Decimal('2.6'), Decimal('3.5'), Decimal('1.0')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>81</td>\n",
+       "        <td>[Decimal('5.5'), Decimal('2.4'), Decimal('3.8'), Decimal('1.1')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>82</td>\n",
+       "        <td>[Decimal('5.5'), Decimal('2.4'), Decimal('3.7'), Decimal('1.0')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>83</td>\n",
+       "        <td>[Decimal('5.8'), Decimal('2.7'), Decimal('3.9'), Decimal('1.2')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>84</td>\n",
+       "        <td>[Decimal('6.0'), Decimal('2.7'), Decimal('5.1'), Decimal('1.6')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>85</td>\n",
+       "        <td>[Decimal('5.4'), Decimal('3.0'), Decimal('4.5'), Decimal('1.5')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>86</td>\n",
+       "        <td>[Decimal('6.0'), Decimal('3.4'), Decimal('4.5'), Decimal('1.6')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>87</td>\n",
+       "        <td>[Decimal('6.7'), Decimal('3.1'), Decimal('4.7'), Decimal('1.5')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>88</td>\n",
+       "        <td>[Decimal('6.3'), Decimal('2.3'), Decimal('4.4'), Decimal('1.3')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>89</td>\n",
+       "        <td>[Decimal('5.6'), Decimal('3.0'), Decimal('4.1'), Decimal('1.3')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>90</td>\n",
+       "        <td>[Decimal('5.5'), Decimal('2.5'), Decimal('4.0'), Decimal('1.3')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>91</td>\n",
+       "        <td>[Decimal('5.5'), Decimal('2.6'), Decimal('4.4'), Decimal('1.2')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>92</td>\n",
+       "        <td>[Decimal('6.1'), Decimal('3.0'), Decimal('4.6'), Decimal('1.4')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>93</td>\n",
+       "        <td>[Decimal('5.8'), Decimal('2.6'), Decimal('4.0'), Decimal('1.2')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>94</td>\n",
+       "        <td>[Decimal('5.0'), Decimal('2.3'), Decimal('3.3'), Decimal('1.0')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>95</td>\n",
+       "        <td>[Decimal('5.6'), Decimal('2.7'), Decimal('4.2'), Decimal('1.3')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>96</td>\n",
+       "        <td>[Decimal('5.7'), Decimal('3.0'), Decimal('4.2'), Decimal('1.2')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>97</td>\n",
+       "        <td>[Decimal('5.7'), Decimal('2.9'), Decimal('4.2'), Decimal('1.3')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>98</td>\n",
+       "        <td>[Decimal('6.2'), Decimal('2.9'), Decimal('4.3'), Decimal('1.3')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>99</td>\n",
+       "        <td>[Decimal('5.1'), Decimal('2.5'), Decimal('3.0'), Decimal('1.1')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>100</td>\n",
+       "        <td>[Decimal('5.7'), Decimal('2.8'), Decimal('4.1'), Decimal('1.3')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>101</td>\n",
+       "        <td>[Decimal('6.3'), Decimal('3.3'), Decimal('6.0'), Decimal('2.5')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>102</td>\n",
+       "        <td>[Decimal('5.8'), Decimal('2.7'), Decimal('5.1'), Decimal('1.9')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>103</td>\n",
+       "        <td>[Decimal('7.1'), Decimal('3.0'), Decimal('5.9'), Decimal('2.1')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>104</td>\n",
+       "        <td>[Decimal('6.3'), Decimal('2.9'), Decimal('5.6'), Decimal('1.8')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>105</td>\n",
+       "        <td>[Decimal('6.5'), Decimal('3.0'), Decimal('5.8'), Decimal('2.2')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>106</td>\n",
+       "        <td>[Decimal('7.6'), Decimal('3.0'), Decimal('6.6'), Decimal('2.1')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>107</td>\n",
+       "        <td>[Decimal('4.9'), Decimal('2.5'), Decimal('4.5'), Decimal('1.7')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>108</td>\n",
+       "        <td>[Decimal('7.3'), Decimal('2.9'), Decimal('6.3'), Decimal('1.8')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>109</td>\n",
+       "        <td>[Decimal('6.7'), Decimal('2.5'), Decimal('5.8'), Decimal('1.8')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>110</td>\n",
+       "        <td>[Decimal('7.2'), Decimal('3.6'), Decimal('6.1'), Decimal('2.5')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>111</td>\n",
+       "        <td>[Decimal('6.5'), Decimal('3.2'), Decimal('5.1'), Decimal('2.0')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>112</td>\n",
+       "        <td>[Decimal('6.4'), Decimal('2.7'), Decimal('5.3'), Decimal('1.9')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>113</td>\n",
+       "        <td>[Decimal('6.8'), Decimal('3.0'), Decimal('5.5'), Decimal('2.1')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>114</td>\n",
+       "        <td>[Decimal('5.7'), Decimal('2.5'), Decimal('5.0'), Decimal('2.0')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>115</td>\n",
+       "        <td>[Decimal('5.8'), Decimal('2.8'), Decimal('5.1'), Decimal('2.4')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>116</td>\n",
+       "        <td>[Decimal('6.4'), Decimal('3.2'), Decimal('5.3'), Decimal('2.3')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>117</td>\n",
+       "        <td>[Decimal('6.5'), Decimal('3.0'), Decimal('5.5'), Decimal('1.8')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>118</td>\n",
+       "        <td>[Decimal('7.7'), Decimal('3.8'), Decimal('6.7'), Decimal('2.2')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>119</td>\n",
+       "        <td>[Decimal('7.7'), Decimal('2.6'), Decimal('6.9'), Decimal('2.3')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>120</td>\n",
+       "        <td>[Decimal('6.0'), Decimal('2.2'), Decimal('5.0'), Decimal('1.5')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>121</td>\n",
+       "        <td>[Decimal('6.9'), Decimal('3.2'), Decimal('5.7'), Decimal('2.3')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>122</td>\n",
+       "        <td>[Decimal('5.6'), Decimal('2.8'), Decimal('4.9'), Decimal('2.0')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>123</td>\n",
+       "        <td>[Decimal('7.7'), Decimal('2.8'), Decimal('6.7'), Decimal('2.0')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>124</td>\n",
+       "        <td>[Decimal('6.3'), Decimal('2.7'), Decimal('4.9'), Decimal('1.8')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>125</td>\n",
+       "        <td>[Decimal('6.7'), Decimal('3.3'), Decimal('5.7'), Decimal('2.1')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>126</td>\n",
+       "        <td>[Decimal('7.2'), Decimal('3.2'), Decimal('6.0'), Decimal('1.8')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>127</td>\n",
+       "        <td>[Decimal('6.2'), Decimal('2.8'), Decimal('4.8'), Decimal('1.8')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>128</td>\n",
+       "        <td>[Decimal('6.1'), Decimal('3.0'), Decimal('4.9'), Decimal('1.8')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>129</td>\n",
+       "        <td>[Decimal('6.4'), Decimal('2.8'), Decimal('5.6'), Decimal('2.1')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>130</td>\n",
+       "        <td>[Decimal('7.2'), Decimal('3.0'), Decimal('5.8'), Decimal('1.6')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>131</td>\n",
+       "        <td>[Decimal('7.4'), Decimal('2.8'), Decimal('6.1'), Decimal('1.9')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>132</td>\n",
+       "        <td>[Decimal('7.9'), Decimal('3.8'), Decimal('6.4'), Decimal('2.0')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>133</td>\n",
+       "        <td>[Decimal('6.4'), Decimal('2.8'), Decimal('5.6'), Decimal('2.2')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>134</td>\n",
+       "        <td>[Decimal('6.3'), Decimal('2.8'), Decimal('5.1'), Decimal('1.5')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>135</td>\n",
+       "        <td>[Decimal('6.1'), Decimal('2.6'), Decimal('5.6'), Decimal('1.4')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>136</td>\n",
+       "        <td>[Decimal('7.7'), Decimal('3.0'), Decimal('6.1'), Decimal('2.3')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>137</td>\n",
+       "        <td>[Decimal('6.3'), Decimal('3.4'), Decimal('5.6'), Decimal('2.4')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>138</td>\n",
+       "        <td>[Decimal('6.4'), Decimal('3.1'), Decimal('5.5'), Decimal('1.8')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>139</td>\n",
+       "        <td>[Decimal('6.0'), Decimal('3.0'), Decimal('4.8'), Decimal('1.8')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>140</td>\n",
+       "        <td>[Decimal('6.9'), Decimal('3.1'), Decimal('5.4'), Decimal('2.1')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>141</td>\n",
+       "        <td>[Decimal('6.7'), Decimal('3.1'), Decimal('5.6'), Decimal('2.4')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>142</td>\n",
+       "        <td>[Decimal('6.9'), Decimal('3.1'), Decimal('5.1'), Decimal('2.3')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>143</td>\n",
+       "        <td>[Decimal('5.8'), Decimal('2.7'), Decimal('5.1'), Decimal('1.9')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>144</td>\n",
+       "        <td>[Decimal('6.8'), Decimal('3.2'), Decimal('5.9'), Decimal('2.3')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>145</td>\n",
+       "        <td>[Decimal('6.7'), Decimal('3.3'), Decimal('5.7'), Decimal('2.5')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>146</td>\n",
+       "        <td>[Decimal('6.7'), Decimal('3.0'), Decimal('5.2'), Decimal('2.3')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>147</td>\n",
+       "        <td>[Decimal('6.3'), Decimal('2.5'), Decimal('5.0'), Decimal('1.9')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>148</td>\n",
+       "        <td>[Decimal('6.5'), Decimal('3.0'), Decimal('5.2'), Decimal('2.0')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>149</td>\n",
+       "        <td>[Decimal('6.2'), Decimal('3.4'), Decimal('5.4'), Decimal('2.3')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>150</td>\n",
+       "        <td>[Decimal('5.9'), Decimal('3.0'), Decimal('5.1'), Decimal('1.8')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[(1, [Decimal('5.1'), Decimal('3.5'), Decimal('1.4'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (2, [Decimal('4.9'), Decimal('3.0'), Decimal('1.4'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (3, [Decimal('4.7'), Decimal('3.2'), Decimal('1.3'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (4, [Decimal('4.6'), Decimal('3.1'), Decimal('1.5'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (5, [Decimal('5.0'), Decimal('3.6'), Decimal('1.4'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (6, [Decimal('5.4'), Decimal('3.9'), Decimal('1.7'), Decimal('0.4')], u'Iris-setosa'),\n",
+       " (7, [Decimal('4.6'), Decimal('3.4'), Decimal('1.4'), Decimal('0.3')], u'Iris-setosa'),\n",
+       " (8, [Decimal('5.0'), Decimal('3.4'), Decimal('1.5'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (9, [Decimal('4.4'), Decimal('2.9'), Decimal('1.4'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (10, [Decimal('4.9'), Decimal('3.1'), Decimal('1.5'), Decimal('0.1')], u'Iris-setosa'),\n",
+       " (11, [Decimal('5.4'), Decimal('3.7'), Decimal('1.5'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (12, [Decimal('4.8'), Decimal('3.4'), Decimal('1.6'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (13, [Decimal('4.8'), Decimal('3.0'), Decimal('1.4'), Decimal('0.1')], u'Iris-setosa'),\n",
+       " (14, [Decimal('4.3'), Decimal('3.0'), Decimal('1.1'), Decimal('0.1')], u'Iris-setosa'),\n",
+       " (15, [Decimal('5.8'), Decimal('4.0'), Decimal('1.2'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (16, [Decimal('5.7'), Decimal('4.4'), Decimal('1.5'), Decimal('0.4')], u'Iris-setosa'),\n",
+       " (17, [Decimal('5.4'), Decimal('3.9'), Decimal('1.3'), Decimal('0.4')], u'Iris-setosa'),\n",
+       " (18, [Decimal('5.1'), Decimal('3.5'), Decimal('1.4'), Decimal('0.3')], u'Iris-setosa'),\n",
+       " (19, [Decimal('5.7'), Decimal('3.8'), Decimal('1.7'), Decimal('0.3')], u'Iris-setosa'),\n",
+       " (20, [Decimal('5.1'), Decimal('3.8'), Decimal('1.5'), Decimal('0.3')], u'Iris-setosa'),\n",
+       " (21, [Decimal('5.4'), Decimal('3.4'), Decimal('1.7'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (22, [Decimal('5.1'), Decimal('3.7'), Decimal('1.5'), Decimal('0.4')], u'Iris-setosa'),\n",
+       " (23, [Decimal('4.6'), Decimal('3.6'), Decimal('1.0'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (24, [Decimal('5.1'), Decimal('3.3'), Decimal('1.7'), Decimal('0.5')], u'Iris-setosa'),\n",
+       " (25, [Decimal('4.8'), Decimal('3.4'), Decimal('1.9'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (26, [Decimal('5.0'), Decimal('3.0'), Decimal('1.6'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (27, [Decimal('5.0'), Decimal('3.4'), Decimal('1.6'), Decimal('0.4')], u'Iris-setosa'),\n",
+       " (28, [Decimal('5.2'), Decimal('3.5'), Decimal('1.5'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (29, [Decimal('5.2'), Decimal('3.4'), Decimal('1.4'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (30, [Decimal('4.7'), Decimal('3.2'), Decimal('1.6'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (31, [Decimal('4.8'), Decimal('3.1'), Decimal('1.6'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (32, [Decimal('5.4'), Decimal('3.4'), Decimal('1.5'), Decimal('0.4')], u'Iris-setosa'),\n",
+       " (33, [Decimal('5.2'), Decimal('4.1'), Decimal('1.5'), Decimal('0.1')], u'Iris-setosa'),\n",
+       " (34, [Decimal('5.5'), Decimal('4.2'), Decimal('1.4'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (35, [Decimal('4.9'), Decimal('3.1'), Decimal('1.5'), Decimal('0.1')], u'Iris-setosa'),\n",
+       " (36, [Decimal('5.0'), Decimal('3.2'), Decimal('1.2'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (37, [Decimal('5.5'), Decimal('3.5'), Decimal('1.3'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (38, [Decimal('4.9'), Decimal('3.1'), Decimal('1.5'), Decimal('0.1')], u'Iris-setosa'),\n",
+       " (39, [Decimal('4.4'), Decimal('3.0'), Decimal('1.3'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (40, [Decimal('5.1'), Decimal('3.4'), Decimal('1.5'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (41, [Decimal('5.0'), Decimal('3.5'), Decimal('1.3'), Decimal('0.3')], u'Iris-setosa'),\n",
+       " (42, [Decimal('4.5'), Decimal('2.3'), Decimal('1.3'), Decimal('0.3')], u'Iris-setosa'),\n",
+       " (43, [Decimal('4.4'), Decimal('3.2'), Decimal('1.3'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (44, [Decimal('5.0'), Decimal('3.5'), Decimal('1.6'), Decimal('0.6')], u'Iris-setosa'),\n",
+       " (45, [Decimal('5.1'), Decimal('3.8'), Decimal('1.9'), Decimal('0.4')], u'Iris-setosa'),\n",
+       " (46, [Decimal('4.8'), Decimal('3.0'), Decimal('1.4'), Decimal('0.3')], u'Iris-setosa'),\n",
+       " (47, [Decimal('5.1'), Decimal('3.8'), Decimal('1.6'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (48, [Decimal('4.6'), Decimal('3.2'), Decimal('1.4'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (49, [Decimal('5.3'), Decimal('3.7'), Decimal('1.5'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (50, [Decimal('5.0'), Decimal('3.3'), Decimal('1.4'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (51, [Decimal('7.0'), Decimal('3.2'), Decimal('4.7'), Decimal('1.4')], u'Iris-versicolor'),\n",
+       " (52, [Decimal('6.4'), Decimal('3.2'), Decimal('4.5'), Decimal('1.5')], u'Iris-versicolor'),\n",
+       " (53, [Decimal('6.9'), Decimal('3.1'), Decimal('4.9'), Decimal('1.5')], u'Iris-versicolor'),\n",
+       " (54, [Decimal('5.5'), Decimal('2.3'), Decimal('4.0'), Decimal('1.3')], u'Iris-versicolor'),\n",
+       " (55, [Decimal('6.5'), Decimal('2.8'), Decimal('4.6'), Decimal('1.5')], u'Iris-versicolor'),\n",
+       " (56, [Decimal('5.7'), Decimal('2.8'), Decimal('4.5'), Decimal('1.3')], u'Iris-versicolor'),\n",
+       " (57, [Decimal('6.3'), Decimal('3.3'), Decimal('4.7'), Decimal('1.6')], u'Iris-versicolor'),\n",
+       " (58, [Decimal('4.9'), Decimal('2.4'), Decimal('3.3'), Decimal('1.0')], u'Iris-versicolor'),\n",
+       " (59, [Decimal('6.6'), Decimal('2.9'), Decimal('4.6'), Decimal('1.3')], u'Iris-versicolor'),\n",
+       " (60, [Decimal('5.2'), Decimal('2.7'), Decimal('3.9'), Decimal('1.4')], u'Iris-versicolor'),\n",
+       " (61, [Decimal('5.0'), Decimal('2.0'), Decimal('3.5'), Decimal('1.0')], u'Iris-versicolor'),\n",
+       " (62, [Decimal('5.9'), Decimal('3.0'), Decimal('4.2'), Decimal('1.5')], u'Iris-versicolor'),\n",
+       " (63, [Decimal('6.0'), Decimal('2.2'), Decimal('4.0'), Decimal('1.0')], u'Iris-versicolor'),\n",
+       " (64, [Decimal('6.1'), Decimal('2.9'), Decimal('4.7'), Decimal('1.4')], u'Iris-versicolor'),\n",
+       " (65, [Decimal('5.6'), Decimal('2.9'), Decimal('3.6'), Decimal('1.3')], u'Iris-versicolor'),\n",
+       " (66, [Decimal('6.7'), Decimal('3.1'), Decimal('4.4'), Decimal('1.4')], u'Iris-versicolor'),\n",
+       " (67, [Decimal('5.6'), Decimal('3.0'), Decimal('4.5'), Decimal('1.5')], u'Iris-versicolor'),\n",
+       " (68, [Decimal('5.8'), Decimal('2.7'), Decimal('4.1'), Decimal('1.0')], u'Iris-versicolor'),\n",
+       " (69, [Decimal('6.2'), Decimal('2.2'), Decimal('4.5'), Decimal('1.5')], u'Iris-versicolor'),\n",
+       " (70, [Decimal('5.6'), Decimal('2.5'), Decimal('3.9'), Decimal('1.1')], u'Iris-versicolor'),\n",
+       " (71, [Decimal('5.9'), Decimal('3.2'), Decimal('4.8'), Decimal('1.8')], u'Iris-versicolor'),\n",
+       " (72, [Decimal('6.1'), Decimal('2.8'), Decimal('4.0'), Decimal('1.3')], u'Iris-versicolor'),\n",
+       " (73, [Decimal('6.3'), Decimal('2.5'), Decimal('4.9'), Decimal('1.5')], u'Iris-versicolor'),\n",
+       " (74, [Decimal('6.1'), Decimal('2.8'), Decimal('4.7'), Decimal('1.2')], u'Iris-versicolor'),\n",
+       " (75, [Decimal('6.4'), Decimal('2.9'), Decimal('4.3'), Decimal('1.3')], u'Iris-versicolor'),\n",
+       " (76, [Decimal('6.6'), Decimal('3.0'), Decimal('4.4'), Decimal('1.4')], u'Iris-versicolor'),\n",
+       " (77, [Decimal('6.8'), Decimal('2.8'), Decimal('4.8'), Decimal('1.4')], u'Iris-versicolor'),\n",
+       " (78, [Decimal('6.7'), Decimal('3.0'), Decimal('5.0'), Decimal('1.7')], u'Iris-versicolor'),\n",
+       " (79, [Decimal('6.0'), Decimal('2.9'), Decimal('4.5'), Decimal('1.5')], u'Iris-versicolor'),\n",
+       " (80, [Decimal('5.7'), Decimal('2.6'), Decimal('3.5'), Decimal('1.0')], u'Iris-versicolor'),\n",
+       " (81, [Decimal('5.5'), Decimal('2.4'), Decimal('3.8'), Decimal('1.1')], u'Iris-versicolor'),\n",
+       " (82, [Decimal('5.5'), Decimal('2.4'), Decimal('3.7'), Decimal('1.0')], u'Iris-versicolor'),\n",
+       " (83, [Decimal('5.8'), Decimal('2.7'), Decimal('3.9'), Decimal('1.2')], u'Iris-versicolor'),\n",
+       " (84, [Decimal('6.0'), Decimal('2.7'), Decimal('5.1'), Decimal('1.6')], u'Iris-versicolor'),\n",
+       " (85, [Decimal('5.4'), Decimal('3.0'), Decimal('4.5'), Decimal('1.5')], u'Iris-versicolor'),\n",
+       " (86, [Decimal('6.0'), Decimal('3.4'), Decimal('4.5'), Decimal('1.6')], u'Iris-versicolor'),\n",
+       " (87, [Decimal('6.7'), Decimal('3.1'), Decimal('4.7'), Decimal('1.5')], u'Iris-versicolor'),\n",
+       " (88, [Decimal('6.3'), Decimal('2.3'), Decimal('4.4'), Decimal('1.3')], u'Iris-versicolor'),\n",
+       " (89, [Decimal('5.6'), Decimal('3.0'), Decimal('4.1'), Decimal('1.3')], u'Iris-versicolor'),\n",
+       " (90, [Decimal('5.5'), Decimal('2.5'), Decimal('4.0'), Decimal('1.3')], u'Iris-versicolor'),\n",
+       " (91, [Decimal('5.5'), Decimal('2.6'), Decimal('4.4'), Decimal('1.2')], u'Iris-versicolor'),\n",
+       " (92, [Decimal('6.1'), Decimal('3.0'), Decimal('4.6'), Decimal('1.4')], u'Iris-versicolor'),\n",
+       " (93, [Decimal('5.8'), Decimal('2.6'), Decimal('4.0'), Decimal('1.2')], u'Iris-versicolor'),\n",
+       " (94, [Decimal('5.0'), Decimal('2.3'), Decimal('3.3'), Decimal('1.0')], u'Iris-versicolor'),\n",
+       " (95, [Decimal('5.6'), Decimal('2.7'), Decimal('4.2'), Decimal('1.3')], u'Iris-versicolor'),\n",
+       " (96, [Decimal('5.7'), Decimal('3.0'), Decimal('4.2'), Decimal('1.2')], u'Iris-versicolor'),\n",
+       " (97, [Decimal('5.7'), Decimal('2.9'), Decimal('4.2'), Decimal('1.3')], u'Iris-versicolor'),\n",
+       " (98, [Decimal('6.2'), Decimal('2.9'), Decimal('4.3'), Decimal('1.3')], u'Iris-versicolor'),\n",
+       " (99, [Decimal('5.1'), Decimal('2.5'), Decimal('3.0'), Decimal('1.1')], u'Iris-versicolor'),\n",
+       " (100, [Decimal('5.7'), Decimal('2.8'), Decimal('4.1'), Decimal('1.3')], u'Iris-versicolor'),\n",
+       " (101, [Decimal('6.3'), Decimal('3.3'), Decimal('6.0'), Decimal('2.5')], u'Iris-virginica'),\n",
+       " (102, [Decimal('5.8'), Decimal('2.7'), Decimal('5.1'), Decimal('1.9')], u'Iris-virginica'),\n",
+       " (103, [Decimal('7.1'), Decimal('3.0'), Decimal('5.9'), Decimal('2.1')], u'Iris-virginica'),\n",
+       " (104, [Decimal('6.3'), Decimal('2.9'), Decimal('5.6'), Decimal('1.8')], u'Iris-virginica'),\n",
+       " (105, [Decimal('6.5'), Decimal('3.0'), Decimal('5.8'), Decimal('2.2')], u'Iris-virginica'),\n",
+       " (106, [Decimal('7.6'), Decimal('3.0'), Decimal('6.6'), Decimal('2.1')], u'Iris-virginica'),\n",
+       " (107, [Decimal('4.9'), Decimal('2.5'), Decimal('4.5'), Decimal('1.7')], u'Iris-virginica'),\n",
+       " (108, [Decimal('7.3'), Decimal('2.9'), Decimal('6.3'), Decimal('1.8')], u'Iris-virginica'),\n",
+       " (109, [Decimal('6.7'), Decimal('2.5'), Decimal('5.8'), Decimal('1.8')], u'Iris-virginica'),\n",
+       " (110, [Decimal('7.2'), Decimal('3.6'), Decimal('6.1'), Decimal('2.5')], u'Iris-virginica'),\n",
+       " (111, [Decimal('6.5'), Decimal('3.2'), Decimal('5.1'), Decimal('2.0')], u'Iris-virginica'),\n",
+       " (112, [Decimal('6.4'), Decimal('2.7'), Decimal('5.3'), Decimal('1.9')], u'Iris-virginica'),\n",
+       " (113, [Decimal('6.8'), Decimal('3.0'), Decimal('5.5'), Decimal('2.1')], u'Iris-virginica'),\n",
+       " (114, [Decimal('5.7'), Decimal('2.5'), Decimal('5.0'), Decimal('2.0')], u'Iris-virginica'),\n",
+       " (115, [Decimal('5.8'), Decimal('2.8'), Decimal('5.1'), Decimal('2.4')], u'Iris-virginica'),\n",
+       " (116, [Decimal('6.4'), Decimal('3.2'), Decimal('5.3'), Decimal('2.3')], u'Iris-virginica'),\n",
+       " (117, [Decimal('6.5'), Decimal('3.0'), Decimal('5.5'), Decimal('1.8')], u'Iris-virginica'),\n",
+       " (118, [Decimal('7.7'), Decimal('3.8'), Decimal('6.7'), Decimal('2.2')], u'Iris-virginica'),\n",
+       " (119, [Decimal('7.7'), Decimal('2.6'), Decimal('6.9'), Decimal('2.3')], u'Iris-virginica'),\n",
+       " (120, [Decimal('6.0'), Decimal('2.2'), Decimal('5.0'), Decimal('1.5')], u'Iris-virginica'),\n",
+       " (121, [Decimal('6.9'), Decimal('3.2'), Decimal('5.7'), Decimal('2.3')], u'Iris-virginica'),\n",
+       " (122, [Decimal('5.6'), Decimal('2.8'), Decimal('4.9'), Decimal('2.0')], u'Iris-virginica'),\n",
+       " (123, [Decimal('7.7'), Decimal('2.8'), Decimal('6.7'), Decimal('2.0')], u'Iris-virginica'),\n",
+       " (124, [Decimal('6.3'), Decimal('2.7'), Decimal('4.9'), Decimal('1.8')], u'Iris-virginica'),\n",
+       " (125, [Decimal('6.7'), Decimal('3.3'), Decimal('5.7'), Decimal('2.1')], u'Iris-virginica'),\n",
+       " (126, [Decimal('7.2'), Decimal('3.2'), Decimal('6.0'), Decimal('1.8')], u'Iris-virginica'),\n",
+       " (127, [Decimal('6.2'), Decimal('2.8'), Decimal('4.8'), Decimal('1.8')], u'Iris-virginica'),\n",
+       " (128, [Decimal('6.1'), Decimal('3.0'), Decimal('4.9'), Decimal('1.8')], u'Iris-virginica'),\n",
+       " (129, [Decimal('6.4'), Decimal('2.8'), Decimal('5.6'), Decimal('2.1')], u'Iris-virginica'),\n",
+       " (130, [Decimal('7.2'), Decimal('3.0'), Decimal('5.8'), Decimal('1.6')], u'Iris-virginica'),\n",
+       " (131, [Decimal('7.4'), Decimal('2.8'), Decimal('6.1'), Decimal('1.9')], u'Iris-virginica'),\n",
+       " (132, [Decimal('7.9'), Decimal('3.8'), Decimal('6.4'), Decimal('2.0')], u'Iris-virginica'),\n",
+       " (133, [Decimal('6.4'), Decimal('2.8'), Decimal('5.6'), Decimal('2.2')], u'Iris-virginica'),\n",
+       " (134, [Decimal('6.3'), Decimal('2.8'), Decimal('5.1'), Decimal('1.5')], u'Iris-virginica'),\n",
+       " (135, [Decimal('6.1'), Decimal('2.6'), Decimal('5.6'), Decimal('1.4')], u'Iris-virginica'),\n",
+       " (136, [Decimal('7.7'), Decimal('3.0'), Decimal('6.1'), Decimal('2.3')], u'Iris-virginica'),\n",
+       " (137, [Decimal('6.3'), Decimal('3.4'), Decimal('5.6'), Decimal('2.4')], u'Iris-virginica'),\n",
+       " (138, [Decimal('6.4'), Decimal('3.1'), Decimal('5.5'), Decimal('1.8')], u'Iris-virginica'),\n",
+       " (139, [Decimal('6.0'), Decimal('3.0'), Decimal('4.8'), Decimal('1.8')], u'Iris-virginica'),\n",
+       " (140, [Decimal('6.9'), Decimal('3.1'), Decimal('5.4'), Decimal('2.1')], u'Iris-virginica'),\n",
+       " (141, [Decimal('6.7'), Decimal('3.1'), Decimal('5.6'), Decimal('2.4')], u'Iris-virginica'),\n",
+       " (142, [Decimal('6.9'), Decimal('3.1'), Decimal('5.1'), Decimal('2.3')], u'Iris-virginica'),\n",
+       " (143, [Decimal('5.8'), Decimal('2.7'), Decimal('5.1'), Decimal('1.9')], u'Iris-virginica'),\n",
+       " (144, [Decimal('6.8'), Decimal('3.2'), Decimal('5.9'), Decimal('2.3')], u'Iris-virginica'),\n",
+       " (145, [Decimal('6.7'), Decimal('3.3'), Decimal('5.7'), Decimal('2.5')], u'Iris-virginica'),\n",
+       " (146, [Decimal('6.7'), Decimal('3.0'), Decimal('5.2'), Decimal('2.3')], u'Iris-virginica'),\n",
+       " (147, [Decimal('6.3'), Decimal('2.5'), Decimal('5.0'), Decimal('1.9')], u'Iris-virginica'),\n",
+       " (148, [Decimal('6.5'), Decimal('3.0'), Decimal('5.2'), Decimal('2.0')], u'Iris-virginica'),\n",
+       " (149, [Decimal('6.2'), Decimal('3.4'), Decimal('5.4'), Decimal('2.3')], u'Iris-virginica'),\n",
+       " (150, [Decimal('5.9'), Decimal('3.0'), Decimal('5.1'), Decimal('1.8')], u'Iris-virginica')]"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql \n",
+    "DROP TABLE IF EXISTS iris_data;\n",
+    "\n",
+    "CREATE TABLE iris_data(\n",
+    "    id serial,\n",
+    "    attributes numeric[],\n",
+    "    class_text varchar\n",
+    ");\n",
+    "\n",
+    "INSERT INTO iris_data(id, attributes, class_text) VALUES\n",
+    "(1,ARRAY[5.1,3.5,1.4,0.2],'Iris-setosa'),\n",
+    "(2,ARRAY[4.9,3.0,1.4,0.2],'Iris-setosa'),\n",
+    "(3,ARRAY[4.7,3.2,1.3,0.2],'Iris-setosa'),\n",
+    "(4,ARRAY[4.6,3.1,1.5,0.2],'Iris-setosa'),\n",
+    "(5,ARRAY[5.0,3.6,1.4,0.2],'Iris-setosa'),\n",
+    "(6,ARRAY[5.4,3.9,1.7,0.4],'Iris-setosa'),\n",
+    "(7,ARRAY[4.6,3.4,1.4,0.3],'Iris-setosa'),\n",
+    "(8,ARRAY[5.0,3.4,1.5,0.2],'Iris-setosa'),\n",
+    "(9,ARRAY[4.4,2.9,1.4,0.2],'Iris-setosa'),\n",
+    "(10,ARRAY[4.9,3.1,1.5,0.1],'Iris-setosa'),\n",
+    "(11,ARRAY[5.4,3.7,1.5,0.2],'Iris-setosa'),\n",
+    "(12,ARRAY[4.8,3.4,1.6,0.2],'Iris-setosa'),\n",
+    "(13,ARRAY[4.8,3.0,1.4,0.1],'Iris-setosa'),\n",
+    "(14,ARRAY[4.3,3.0,1.1,0.1],'Iris-setosa'),\n",
+    "(15,ARRAY[5.8,4.0,1.2,0.2],'Iris-setosa'),\n",
+    "(16,ARRAY[5.7,4.4,1.5,0.4],'Iris-setosa'),\n",
+    "(17,ARRAY[5.4,3.9,1.3,0.4],'Iris-setosa'),\n",
+    "(18,ARRAY[5.1,3.5,1.4,0.3],'Iris-setosa'),\n",
+    "(19,ARRAY[5.7,3.8,1.7,0.3],'Iris-setosa'),\n",
+    "(20,ARRAY[5.1,3.8,1.5,0.3],'Iris-setosa'),\n",
+    "(21,ARRAY[5.4,3.4,1.7,0.2],'Iris-setosa'),\n",
+    "(22,ARRAY[5.1,3.7,1.5,0.4],'Iris-setosa'),\n",
+    "(23,ARRAY[4.6,3.6,1.0,0.2],'Iris-setosa'),\n",
+    "(24,ARRAY[5.1,3.3,1.7,0.5],'Iris-setosa'),\n",
+    "(25,ARRAY[4.8,3.4,1.9,0.2],'Iris-setosa'),\n",
+    "(26,ARRAY[5.0,3.0,1.6,0.2],'Iris-setosa'),\n",
+    "(27,ARRAY[5.0,3.4,1.6,0.4],'Iris-setosa'),\n",
+    "(28,ARRAY[5.2,3.5,1.5,0.2],'Iris-setosa'),\n",
+    "(29,ARRAY[5.2,3.4,1.4,0.2],'Iris-setosa'),\n",
+    "(30,ARRAY[4.7,3.2,1.6,0.2],'Iris-setosa'),\n",
+    "(31,ARRAY[4.8,3.1,1.6,0.2],'Iris-setosa'),\n",
+    "(32,ARRAY[5.4,3.4,1.5,0.4],'Iris-setosa'),\n",
+    "(33,ARRAY[5.2,4.1,1.5,0.1],'Iris-setosa'),\n",
+    "(34,ARRAY[5.5,4.2,1.4,0.2],'Iris-setosa'),\n",
+    "(35,ARRAY[4.9,3.1,1.5,0.1],'Iris-setosa'),\n",
+    "(36,ARRAY[5.0,3.2,1.2,0.2],'Iris-setosa'),\n",
+    "(37,ARRAY[5.5,3.5,1.3,0.2],'Iris-setosa'),\n",
+    "(38,ARRAY[4.9,3.1,1.5,0.1],'Iris-setosa'),\n",
+    "(39,ARRAY[4.4,3.0,1.3,0.2],'Iris-setosa'),\n",
+    "(40,ARRAY[5.1,3.4,1.5,0.2],'Iris-setosa'),\n",
+    "(41,ARRAY[5.0,3.5,1.3,0.3],'Iris-setosa'),\n",
+    "(42,ARRAY[4.5,2.3,1.3,0.3],'Iris-setosa'),\n",
+    "(43,ARRAY[4.4,3.2,1.3,0.2],'Iris-setosa'),\n",
+    "(44,ARRAY[5.0,3.5,1.6,0.6],'Iris-setosa'),\n",
+    "(45,ARRAY[5.1,3.8,1.9,0.4],'Iris-setosa'),\n",
+    "(46,ARRAY[4.8,3.0,1.4,0.3],'Iris-setosa'),\n",
+    "(47,ARRAY[5.1,3.8,1.6,0.2],'Iris-setosa'),\n",
+    "(48,ARRAY[4.6,3.2,1.4,0.2],'Iris-setosa'),\n",
+    "(49,ARRAY[5.3,3.7,1.5,0.2],'Iris-setosa'),\n",
+    "(50,ARRAY[5.0,3.3,1.4,0.2],'Iris-setosa'),\n",
+    "(51,ARRAY[7.0,3.2,4.7,1.4],'Iris-versicolor'),\n",
+    "(52,ARRAY[6.4,3.2,4.5,1.5],'Iris-versicolor'),\n",
+    "(53,ARRAY[6.9,3.1,4.9,1.5],'Iris-versicolor'),\n",
+    "(54,ARRAY[5.5,2.3,4.0,1.3],'Iris-versicolor'),\n",
+    "(55,ARRAY[6.5,2.8,4.6,1.5],'Iris-versicolor'),\n",
+    "(56,ARRAY[5.7,2.8,4.5,1.3],'Iris-versicolor'),\n",
+    "(57,ARRAY[6.3,3.3,4.7,1.6],'Iris-versicolor'),\n",
+    "(58,ARRAY[4.9,2.4,3.3,1.0],'Iris-versicolor'),\n",
+    "(59,ARRAY[6.6,2.9,4.6,1.3],'Iris-versicolor'),\n",
+    "(60,ARRAY[5.2,2.7,3.9,1.4],'Iris-versicolor'),\n",
+    "(61,ARRAY[5.0,2.0,3.5,1.0],'Iris-versicolor'),\n",
+    "(62,ARRAY[5.9,3.0,4.2,1.5],'Iris-versicolor'),\n",
+    "(63,ARRAY[6.0,2.2,4.0,1.0],'Iris-versicolor'),\n",
+    "(64,ARRAY[6.1,2.9,4.7,1.4],'Iris-versicolor'),\n",
+    "(65,ARRAY[5.6,2.9,3.6,1.3],'Iris-versicolor'),\n",
+    "(66,ARRAY[6.7,3.1,4.4,1.4],'Iris-versicolor'),\n",
+    "(67,ARRAY[5.6,3.0,4.5,1.5],'Iris-versicolor'),\n",
+    "(68,ARRAY[5.8,2.7,4.1,1.0],'Iris-versicolor'),\n",
+    "(69,ARRAY[6.2,2.2,4.5,1.5],'Iris-versicolor'),\n",
+    "(70,ARRAY[5.6,2.5,3.9,1.1],'Iris-versicolor'),\n",
+    "(71,ARRAY[5.9,3.2,4.8,1.8],'Iris-versicolor'),\n",
+    "(72,ARRAY[6.1,2.8,4.0,1.3],'Iris-versicolor'),\n",
+    "(73,ARRAY[6.3,2.5,4.9,1.5],'Iris-versicolor'),\n",
+    "(74,ARRAY[6.1,2.8,4.7,1.2],'Iris-versicolor'),\n",
+    "(75,ARRAY[6.4,2.9,4.3,1.3],'Iris-versicolor'),\n",
+    "(76,ARRAY[6.6,3.0,4.4,1.4],'Iris-versicolor'),\n",
+    "(77,ARRAY[6.8,2.8,4.8,1.4],'Iris-versicolor'),\n",
+    "(78,ARRAY[6.7,3.0,5.0,1.7],'Iris-versicolor'),\n",
+    "(79,ARRAY[6.0,2.9,4.5,1.5],'Iris-versicolor'),\n",
+    "(80,ARRAY[5.7,2.6,3.5,1.0],'Iris-versicolor'),\n",
+    "(81,ARRAY[5.5,2.4,3.8,1.1],'Iris-versicolor'),\n",
+    "(82,ARRAY[5.5,2.4,3.7,1.0],'Iris-versicolor'),\n",
+    "(83,ARRAY[5.8,2.7,3.9,1.2],'Iris-versicolor'),\n",
+    "(84,ARRAY[6.0,2.7,5.1,1.6],'Iris-versicolor'),\n",
+    "(85,ARRAY[5.4,3.0,4.5,1.5],'Iris-versicolor'),\n",
+    "(86,ARRAY[6.0,3.4,4.5,1.6],'Iris-versicolor'),\n",
+    "(87,ARRAY[6.7,3.1,4.7,1.5],'Iris-versicolor'),\n",
+    "(88,ARRAY[6.3,2.3,4.4,1.3],'Iris-versicolor'),\n",
+    "(89,ARRAY[5.6,3.0,4.1,1.3],'Iris-versicolor'),\n",
+    "(90,ARRAY[5.5,2.5,4.0,1.3],'Iris-versicolor'),\n",
+    "(91,ARRAY[5.5,2.6,4.4,1.2],'Iris-versicolor'),\n",
+    "(92,ARRAY[6.1,3.0,4.6,1.4],'Iris-versicolor'),\n",
+    "(93,ARRAY[5.8,2.6,4.0,1.2],'Iris-versicolor'),\n",
+    "(94,ARRAY[5.0,2.3,3.3,1.0],'Iris-versicolor'),\n",
+    "(95,ARRAY[5.6,2.7,4.2,1.3],'Iris-versicolor'),\n",
+    "(96,ARRAY[5.7,3.0,4.2,1.2],'Iris-versicolor'),\n",
+    "(97,ARRAY[5.7,2.9,4.2,1.3],'Iris-versicolor'),\n",
+    "(98,ARRAY[6.2,2.9,4.3,1.3],'Iris-versicolor'),\n",
+    "(99,ARRAY[5.1,2.5,3.0,1.1],'Iris-versicolor'),\n",
+    "(100,ARRAY[5.7,2.8,4.1,1.3],'Iris-versicolor'),\n",
+    "(101,ARRAY[6.3,3.3,6.0,2.5],'Iris-virginica'),\n",
+    "(102,ARRAY[5.8,2.7,5.1,1.9],'Iris-virginica'),\n",
+    "(103,ARRAY[7.1,3.0,5.9,2.1],'Iris-virginica'),\n",
+    "(104,ARRAY[6.3,2.9,5.6,1.8],'Iris-virginica'),\n",
+    "(105,ARRAY[6.5,3.0,5.8,2.2],'Iris-virginica'),\n",
+    "(106,ARRAY[7.6,3.0,6.6,2.1],'Iris-virginica'),\n",
+    "(107,ARRAY[4.9,2.5,4.5,1.7],'Iris-virginica'),\n",
+    "(108,ARRAY[7.3,2.9,6.3,1.8],'Iris-virginica'),\n",
+    "(109,ARRAY[6.7,2.5,5.8,1.8],'Iris-virginica'),\n",
+    "(110,ARRAY[7.2,3.6,6.1,2.5],'Iris-virginica'),\n",
+    "(111,ARRAY[6.5,3.2,5.1,2.0],'Iris-virginica'),\n",
+    "(112,ARRAY[6.4,2.7,5.3,1.9],'Iris-virginica'),\n",
+    "(113,ARRAY[6.8,3.0,5.5,2.1],'Iris-virginica'),\n",
+    "(114,ARRAY[5.7,2.5,5.0,2.0],'Iris-virginica'),\n",
+    "(115,ARRAY[5.8,2.8,5.1,2.4],'Iris-virginica'),\n",
+    "(116,ARRAY[6.4,3.2,5.3,2.3],'Iris-virginica'),\n",
+    "(117,ARRAY[6.5,3.0,5.5,1.8],'Iris-virginica'),\n",
+    "(118,ARRAY[7.7,3.8,6.7,2.2],'Iris-virginica'),\n",
+    "(119,ARRAY[7.7,2.6,6.9,2.3],'Iris-virginica'),\n",
+    "(120,ARRAY[6.0,2.2,5.0,1.5],'Iris-virginica'),\n",
+    "(121,ARRAY[6.9,3.2,5.7,2.3],'Iris-virginica'),\n",
+    "(122,ARRAY[5.6,2.8,4.9,2.0],'Iris-virginica'),\n",
+    "(123,ARRAY[7.7,2.8,6.7,2.0],'Iris-virginica'),\n",
+    "(124,ARRAY[6.3,2.7,4.9,1.8],'Iris-virginica'),\n",
+    "(125,ARRAY[6.7,3.3,5.7,2.1],'Iris-virginica'),\n",
+    "(126,ARRAY[7.2,3.2,6.0,1.8],'Iris-virginica'),\n",
+    "(127,ARRAY[6.2,2.8,4.8,1.8],'Iris-virginica'),\n",
+    "(128,ARRAY[6.1,3.0,4.9,1.8],'Iris-virginica'),\n",
+    "(129,ARRAY[6.4,2.8,5.6,2.1],'Iris-virginica'),\n",
+    "(130,ARRAY[7.2,3.0,5.8,1.6],'Iris-virginica'),\n",
+    "(131,ARRAY[7.4,2.8,6.1,1.9],'Iris-virginica'),\n",
+    "(132,ARRAY[7.9,3.8,6.4,2.0],'Iris-virginica'),\n",
+    "(133,ARRAY[6.4,2.8,5.6,2.2],'Iris-virginica'),\n",
+    "(134,ARRAY[6.3,2.8,5.1,1.5],'Iris-virginica'),\n",
+    "(135,ARRAY[6.1,2.6,5.6,1.4],'Iris-virginica'),\n",
+    "(136,ARRAY[7.7,3.0,6.1,2.3],'Iris-virginica'),\n",
+    "(137,ARRAY[6.3,3.4,5.6,2.4],'Iris-virginica'),\n",
+    "(138,ARRAY[6.4,3.1,5.5,1.8],'Iris-virginica'),\n",
+    "(139,ARRAY[6.0,3.0,4.8,1.8],'Iris-virginica'),\n",
+    "(140,ARRAY[6.9,3.1,5.4,2.1],'Iris-virginica'),\n",
+    "(141,ARRAY[6.7,3.1,5.6,2.4],'Iris-virginica'),\n",
+    "(142,ARRAY[6.9,3.1,5.1,2.3],'Iris-virginica'),\n",
+    "(143,ARRAY[5.8,2.7,5.1,1.9],'Iris-virginica'),\n",
+    "(144,ARRAY[6.8,3.2,5.9,2.3],'Iris-virginica'),\n",
+    "(145,ARRAY[6.7,3.3,5.7,2.5],'Iris-virginica'),\n",
+    "(146,ARRAY[6.7,3.0,5.2,2.3],'Iris-virginica'),\n",
+    "(147,ARRAY[6.3,2.5,5.0,1.9],'Iris-virginica'),\n",
+    "(148,ARRAY[6.5,3.0,5.2,2.0],'Iris-virginica'),\n",
+    "(149,ARRAY[6.2,3.4,5.4,2.3],'Iris-virginica'),\n",
+    "(150,ARRAY[5.9,3.0,5.1,1.8],'Iris-virginica');\n",
+    "\n",
+    "SELECT * FROM iris_data ORDER BY id;"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Create a test/validation dataset from the training data"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Done.\n",
+      "1 rows affected.\n",
+      "1 rows affected.\n",
+      "1 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <tr>\n",
+       "        <th>count</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>120</td>\n",
+       "    </tr>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[(120L,)]"
+      ]
+     },
+     "execution_count": 5,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "DROP TABLE IF EXISTS iris_train, iris_test;\n",
+    "\n",
+    "-- Set seed so results are reproducible\n",
+    "SELECT setseed(0);\n",
+    "\n",
+    "SELECT madlib.train_test_split('iris_data',     -- Source table\n",
+    "                               'iris',          -- Output table root name\n",
+    "                                0.8,            -- Train proportion\n",
+    "                                NULL,           -- Test proportion (0.2)\n",
+    "                                NULL,           -- Strata definition\n",
+    "                                NULL,           -- Output all columns\n",
+    "                                NULL,           -- Sample without replacement\n",
+    "                                TRUE            -- Separate output tables\n",
+    "                              );\n",
+    "\n",
+    "SELECT COUNT(*) FROM iris_train;"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "<a id=\"pp\"></a>\n",
+    "# 2. Call preprocessor for deep learning\n",
+    "Training dataset (uses training preprocessor):"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Done.\n",
+      "1 rows affected.\n",
+      "2 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <tr>\n",
+       "        <th>attributes_shape</th>\n",
+       "        <th>class_text_shape</th>\n",
+       "        <th>buffer_id</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>[60, 4]</td>\n",
+       "        <td>[60, 3]</td>\n",
+       "        <td>0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>[60, 4]</td>\n",
+       "        <td>[60, 3]</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[([60, 4], [60, 3], 0), ([60, 4], [60, 3], 1)]"
+      ]
+     },
+     "execution_count": 6,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "DROP TABLE IF EXISTS iris_train_packed, iris_train_packed_summary;\n",
+    "\n",
+    "SELECT madlib.training_preprocessor_dl('iris_train',         -- Source table\n",
+    "                                       'iris_train_packed',  -- Output table\n",
+    "                                       'class_text',        -- Dependent variable\n",
+    "                                       'attributes'         -- Independent variable\n",
+    "                                        ); \n",
+    "\n",
+    "SELECT attributes_shape, class_text_shape, buffer_id FROM iris_train_packed ORDER BY buffer_id;"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "1 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <tr>\n",
+       "        <th>source_table</th>\n",
+       "        <th>output_table</th>\n",
+       "        <th>dependent_varname</th>\n",
+       "        <th>independent_varname</th>\n",
+       "        <th>dependent_vartype</th>\n",
+       "        <th>class_text_class_values</th>\n",
+       "        <th>buffer_size</th>\n",
+       "        <th>normalizing_const</th>\n",
+       "        <th>num_classes</th>\n",
+       "        <th>distribution_rules</th>\n",
+       "        <th>__internal_gpu_config__</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>iris_train</td>\n",
+       "        <td>iris_train_packed</td>\n",
+       "        <td>[u'class_text']</td>\n",
+       "        <td>[u'attributes']</td>\n",
+       "        <td>[u'character varying']</td>\n",
+       "        <td>[u'Iris-setosa', u'Iris-versicolor', u'Iris-virginica']</td>\n",
+       "        <td>60</td>\n",
+       "        <td>1.0</td>\n",
+       "        <td>[3]</td>\n",
+       "        <td>all_segments</td>\n",
+       "        <td>all_segments</td>\n",
+       "    </tr>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[(u'iris_train', u'iris_train_packed', [u'class_text'], [u'attributes'], [u'character varying'], [u'Iris-setosa', u'Iris-versicolor', u'Iris-virginica'], 60, 1.0, [3], 'all_segments', 'all_segments')]"
+      ]
+     },
+     "execution_count": 7,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "SELECT * FROM iris_train_packed_summary;"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Validation dataset (uses validation preprocessor):"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Done.\n",
+      "1 rows affected.\n",
+      "2 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <tr>\n",
+       "        <th>attributes_shape</th>\n",
+       "        <th>class_text_shape</th>\n",
+       "        <th>buffer_id</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>[15, 4]</td>\n",
+       "        <td>[15, 3]</td>\n",
+       "        <td>0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>[15, 4]</td>\n",
+       "        <td>[15, 3]</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[([15, 4], [15, 3], 0), ([15, 4], [15, 3], 1)]"
+      ]
+     },
+     "execution_count": 8,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "DROP TABLE IF EXISTS iris_test_packed, iris_test_packed_summary;\n",
+    "\n",
+    "SELECT madlib.validation_preprocessor_dl('iris_test',          -- Source table\n",
+    "                                         'iris_test_packed',   -- Output table\n",
+    "                                         'class_text',         -- Dependent variable\n",
+    "                                         'attributes',         -- Independent variable\n",
+    "                                         'iris_train_packed'   -- From training preprocessor step\n",
+    "                                          ); \n",
+    "\n",
+    "SELECT attributes_shape, class_text_shape, buffer_id FROM iris_test_packed ORDER BY buffer_id;"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "1 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <tr>\n",
+       "        <th>source_table</th>\n",
+       "        <th>output_table</th>\n",
+       "        <th>dependent_varname</th>\n",
+       "        <th>independent_varname</th>\n",
+       "        <th>dependent_vartype</th>\n",
+       "        <th>class_text_class_values</th>\n",
+       "        <th>buffer_size</th>\n",
+       "        <th>normalizing_const</th>\n",
+       "        <th>num_classes</th>\n",
+       "        <th>distribution_rules</th>\n",
+       "        <th>__internal_gpu_config__</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>iris_test</td>\n",
+       "        <td>iris_test_packed</td>\n",
+       "        <td>[u'class_text']</td>\n",
+       "        <td>[u'attributes']</td>\n",
+       "        <td>[u'character varying']</td>\n",
+       "        <td>[u'Iris-setosa', u'Iris-versicolor', u'Iris-virginica']</td>\n",
+       "        <td>15</td>\n",
+       "        <td>1.0</td>\n",
+       "        <td>[3]</td>\n",
+       "        <td>all_segments</td>\n",
+       "        <td>all_segments</td>\n",
+       "    </tr>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[(u'iris_test', u'iris_test_packed', [u'class_text'], [u'attributes'], [u'character varying'], [u'Iris-setosa', u'Iris-versicolor', u'Iris-virginica'], 15, 1.0, [3], 'all_segments', 'all_segments')]"
+      ]
+     },
+     "execution_count": 9,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "SELECT * FROM iris_test_packed_summary;"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "<a id=\"load\"></a>\n",
+    "# 3. Define and load model architecture\n",
+    "Import Keras libraries"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from tensorflow import keras\n",
+    "from tensorflow.keras.models import Sequential\n",
+    "from tensorflow.keras.layers import Dense"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Define model architecture with 1 hidden layer:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 11,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:From /Users/fmcquillan/Library/Python/2.7/lib/python/site-packages/tensorflow/python/ops/init_ops.py:1251: calling __init__ (from tensorflow.python.ops.init_ops) with dtype is deprecated and will be removed in a future version.\n",
+      "Instructions for updating:\n",
+      "Call initializer instance with the dtype argument instead of passing it to the constructor\n",
+      "Model: \"sequential\"\n",
+      "_________________________________________________________________\n",
+      "Layer (type)                 Output Shape              Param #   \n",
+      "=================================================================\n",
+      "dense (Dense)                (None, 10)                50        \n",
+      "_________________________________________________________________\n",
+      "dense_1 (Dense)              (None, 10)                110       \n",
+      "_________________________________________________________________\n",
+      "dense_2 (Dense)              (None, 3)                 33        \n",
+      "=================================================================\n",
+      "Total params: 193\n",
+      "Trainable params: 193\n",
+      "Non-trainable params: 0\n",
+      "_________________________________________________________________\n"
+     ]
+    }
+   ],
+   "source": [
+    "model1 = Sequential()\n",
+    "model1.add(Dense(10, activation='relu', input_shape=(4,)))\n",
+    "model1.add(Dense(10, activation='relu'))\n",
+    "model1.add(Dense(3, activation='softmax'))\n",
+    "    \n",
+    "model1.summary()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 12,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'{\"class_name\": \"Sequential\", \"keras_version\": \"2.2.4-tf\", \"config\": {\"layers\": [{\"class_name\": \"Dense\", \"config\": {\"kernel_initializer\": {\"class_name\": \"GlorotUniform\", \"config\": {\"dtype\": \"float32\", \"seed\": null}}, \"name\": \"dense\", \"kernel_constraint\": null, \"bias_regularizer\": null, \"bias_constraint\": null, \"dtype\": \"float32\", \"activation\": \"relu\", \"trainable\": true, \"kernel_regularizer\": null, \"bias_initializer\": {\"clas [...]
+      ]
+     },
+     "execution_count": 12,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "model1.to_json()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Define model architecture with 2 hidden layers:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 13,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Model: \"sequential_1\"\n",
+      "_________________________________________________________________\n",
+      "Layer (type)                 Output Shape              Param #   \n",
+      "=================================================================\n",
+      "dense_3 (Dense)              (None, 10)                50        \n",
+      "_________________________________________________________________\n",
+      "dense_4 (Dense)              (None, 10)                110       \n",
+      "_________________________________________________________________\n",
+      "dense_5 (Dense)              (None, 10)                110       \n",
+      "_________________________________________________________________\n",
+      "dense_6 (Dense)              (None, 3)                 33        \n",
+      "=================================================================\n",
+      "Total params: 303\n",
+      "Trainable params: 303\n",
+      "Non-trainable params: 0\n",
+      "_________________________________________________________________\n"
+     ]
+    }
+   ],
+   "source": [
+    "model2 = Sequential()\n",
+    "model2.add(Dense(10, activation='relu', input_shape=(4,)))\n",
+    "model2.add(Dense(10, activation='relu'))\n",
+    "model2.add(Dense(10, activation='relu'))\n",
+    "model2.add(Dense(3, activation='softmax'))\n",
+    "    \n",
+    "model2.summary()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 14,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'{\"class_name\": \"Sequential\", \"keras_version\": \"2.2.4-tf\", \"config\": {\"layers\": [{\"class_name\": \"Dense\", \"config\": {\"kernel_initializer\": {\"class_name\": \"GlorotUniform\", \"config\": {\"dtype\": \"float32\", \"seed\": null}}, \"name\": \"dense_3\", \"kernel_constraint\": null, \"bias_regularizer\": null, \"bias_constraint\": null, \"dtype\": \"float32\", \"activation\": \"relu\", \"trainable\": true, \"kernel_regularizer\": null, \"bias_initializer\": {\"cl [...]
+      ]
+     },
+     "execution_count": 14,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "model2.to_json()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Load into model architecture table"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 15,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Done.\n",
+      "1 rows affected.\n",
+      "1 rows affected.\n",
+      "2 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <tr>\n",
+       "        <th>model_id</th>\n",
+       "        <th>model_arch</th>\n",
+       "        <th>model_weights</th>\n",
+       "        <th>name</th>\n",
+       "        <th>description</th>\n",
+       "        <th>__internal_madlib_id__</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>1</td>\n",
+       "        <td>{u'class_name': u'Sequential', u'keras_version': u'2.1.6', u'config': [{u'class_name': u'Dense', u'config': {u'kernel_initializer': {u'class_name': u'VarianceScaling', u'config': {u'distribution': u'uniform', u'scale': 1.0, u'seed': None, u'mode': u'fan_avg'}}, u'name': u'dense_1', u'kernel_constraint': None, u'bias_regularizer': None, u'bias_constraint': None, u'dtype': u'float32', u'activation': u'relu', u'trainable': True, u'kernel_regularizer': None, u'bias_initia [...]
+       "        <td>None</td>\n",
+       "        <td>Sophie</td>\n",
+       "        <td>MLP with 1 hidden layer</td>\n",
+       "        <td>__madlib_temp_35802275_1618939978_34805566__</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>2</td>\n",
+       "        <td>{u'class_name': u'Sequential', u'keras_version': u'2.1.6', u'config': [{u'class_name': u'Dense', u'config': {u'kernel_initializer': {u'class_name': u'VarianceScaling', u'config': {u'distribution': u'uniform', u'scale': 1.0, u'seed': None, u'mode': u'fan_avg'}}, u'name': u'dense_4', u'kernel_constraint': None, u'bias_regularizer': None, u'bias_constraint': None, u'dtype': u'float32', u'activation': u'relu', u'trainable': True, u'kernel_regularizer': None, u'bias_initia [...]
+       "        <td>None</td>\n",
+       "        <td>Maria</td>\n",
+       "        <td>MLP with 2 hidden layers</td>\n",
+       "        <td>__madlib_temp_24727075_1618939978_30269401__</td>\n",
+       "    </tr>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[(1, {u'class_name': u'Sequential', u'keras_version': u'2.1.6', u'config': [{u'class_name': u'Dense', u'config': {u'kernel_initializer': {u'class_name': u' ... (1340 characters truncated) ... s_initializer': {u'class_name': u'Zeros', u'config': {}}, u'units': 3, u'use_bias': True, u'activity_regularizer': None}}], u'backend': u'tensorflow'}, None, u'Sophie', u'MLP with 1 hidden layer', u'__madlib_temp_35802275_1618939978_34805566__'),\n",
+       " (2, {u'class_name': u'Sequential', u'keras_version': u'2.1.6', u'config': [{u'class_name': u'Dense', u'config': {u'kernel_initializer': {u'class_name': u' ... (1835 characters truncated) ... s_initializer': {u'class_name': u'Zeros', u'config': {}}, u'units': 3, u'use_bias': True, u'activity_regularizer': None}}], u'backend': u'tensorflow'}, None, u'Maria', u'MLP with 2 hidden layers', u'__madlib_temp_24727075_1618939978_30269401__')]"
+      ]
+     },
+     "execution_count": 15,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "DROP TABLE IF EXISTS model_arch_library;\n",
+    "\n",
+    "SELECT madlib.load_keras_model('model_arch_library',  -- Output table,\n",
+    "                               \n",
+    "$$\n",
+    "{\"class_name\": \"Sequential\", \"keras_version\": \"2.1.6\", \"config\": [{\"class_name\": \"Dense\", \"config\": {\"kernel_initializer\": {\"class_name\": \"VarianceScaling\", \"config\": {\"distribution\": \"uniform\", \"scale\": 1.0, \"seed\": null, \"mode\": \"fan_avg\"}}, \"name\": \"dense_1\", \"kernel_constraint\": null, \"bias_regularizer\": null, \"bias_constraint\": null, \"dtype\": \"float32\", \"activation\": \"relu\", \"trainable\": true, \"kernel_regularizer\": null, [...]
+    "$$\n",
+    "::json,         -- JSON blob\n",
+    "                               NULL,                  -- Weights\n",
+    "                               'Sophie',              -- Name\n",
+    "                               'MLP with 1 hidden layer'       -- Descr\n",
+    ");\n",
+    "\n",
+    "SELECT madlib.load_keras_model('model_arch_library',  -- Output table,\n",
+    "                               \n",
+    "$$\n",
+    "{\"class_name\": \"Sequential\", \"keras_version\": \"2.1.6\", \"config\": [{\"class_name\": \"Dense\", \"config\": {\"kernel_initializer\": {\"class_name\": \"VarianceScaling\", \"config\": {\"distribution\": \"uniform\", \"scale\": 1.0, \"seed\": null, \"mode\": \"fan_avg\"}}, \"name\": \"dense_4\", \"kernel_constraint\": null, \"bias_regularizer\": null, \"bias_constraint\": null, \"dtype\": \"float32\", \"activation\": \"relu\", \"trainable\": true, \"kernel_regularizer\": null, [...]
+    "$$\n",
+    "::json,         -- JSON blob\n",
+    "                               NULL,                  -- Weights\n",
+    "                               'Maria',               -- Name\n",
+    "                               'MLP with 2 hidden layers'       -- Descr\n",
+    ");\n",
+    "\n",
+    "SELECT * FROM model_arch_library ORDER BY model_id;"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "<a id=\"def_mst\"></a>\n",
+    "# 4.  Define and load model selection tuples"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Generate model configurations using grid search. The output table for grid search contains the unique combinations of model architectures, compile and fit parameters."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 16,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Done.\n",
+      "1 rows affected.\n",
+      "12 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <tr>\n",
+       "        <th>mst_key</th>\n",
+       "        <th>model_id</th>\n",
+       "        <th>compile_params</th>\n",
+       "        <th>fit_params</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>1</td>\n",
+       "        <td>1</td>\n",
+       "        <td>optimizer='Adam(lr=0.001)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
+       "        <td>epochs=1,batch_size=4</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>2</td>\n",
+       "        <td>1</td>\n",
+       "        <td>optimizer='Adam(lr=0.001)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
+       "        <td>epochs=1,batch_size=8</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>3</td>\n",
+       "        <td>1</td>\n",
+       "        <td>optimizer='Adam(lr=0.01)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
+       "        <td>epochs=1,batch_size=4</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>4</td>\n",
+       "        <td>1</td>\n",
+       "        <td>optimizer='Adam(lr=0.01)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
+       "        <td>epochs=1,batch_size=8</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>5</td>\n",
+       "        <td>1</td>\n",
+       "        <td>optimizer='Adam(lr=0.1)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
+       "        <td>epochs=1,batch_size=4</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>6</td>\n",
+       "        <td>1</td>\n",
+       "        <td>optimizer='Adam(lr=0.1)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
+       "        <td>epochs=1,batch_size=8</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>7</td>\n",
+       "        <td>2</td>\n",
+       "        <td>optimizer='Adam(lr=0.001)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
+       "        <td>epochs=1,batch_size=4</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>8</td>\n",
+       "        <td>2</td>\n",
+       "        <td>optimizer='Adam(lr=0.001)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
+       "        <td>epochs=1,batch_size=8</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>9</td>\n",
+       "        <td>2</td>\n",
+       "        <td>optimizer='Adam(lr=0.01)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
+       "        <td>epochs=1,batch_size=4</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>10</td>\n",
+       "        <td>2</td>\n",
+       "        <td>optimizer='Adam(lr=0.01)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
+       "        <td>epochs=1,batch_size=8</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>11</td>\n",
+       "        <td>2</td>\n",
+       "        <td>optimizer='Adam(lr=0.1)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
+       "        <td>epochs=1,batch_size=4</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>12</td>\n",
+       "        <td>2</td>\n",
+       "        <td>optimizer='Adam(lr=0.1)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
+       "        <td>epochs=1,batch_size=8</td>\n",
+       "    </tr>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[(1, 1, u\"optimizer='Adam(lr=0.001)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=4'),\n",
+       " (2, 1, u\"optimizer='Adam(lr=0.001)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=8'),\n",
+       " (3, 1, u\"optimizer='Adam(lr=0.01)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=4'),\n",
+       " (4, 1, u\"optimizer='Adam(lr=0.01)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=8'),\n",
+       " (5, 1, u\"optimizer='Adam(lr=0.1)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=4'),\n",
+       " (6, 1, u\"optimizer='Adam(lr=0.1)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=8'),\n",
+       " (7, 2, u\"optimizer='Adam(lr=0.001)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=4'),\n",
+       " (8, 2, u\"optimizer='Adam(lr=0.001)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=8'),\n",
+       " (9, 2, u\"optimizer='Adam(lr=0.01)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=4'),\n",
+       " (10, 2, u\"optimizer='Adam(lr=0.01)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=8'),\n",
+       " (11, 2, u\"optimizer='Adam(lr=0.1)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=4'),\n",
+       " (12, 2, u\"optimizer='Adam(lr=0.1)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=8')]"
+      ]
+     },
+     "execution_count": 16,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "DROP TABLE IF EXISTS mst_table, mst_table_summary;\n",
+    "\n",
+    "SELECT madlib.generate_model_configs(\n",
+    "                                        'model_arch_library', -- model architecture table\n",
+    "                                        'mst_table',          -- model selection table output\n",
+    "                                         ARRAY[1,2],          -- model ids from model architecture table\n",
+    "                                         $$\n",
+    "                                            {'loss': ['categorical_crossentropy'],\n",
+    "                                             'optimizer_params_list': [ {'optimizer': ['Adam'], 'lr': [0.001, 0.01, 0.1]} ],\n",
+    "                                             'metrics': ['accuracy']}\n",
+    "                                         $$,                  -- compile_param_grid\n",
+    "                                         $$\n",
+    "                                         { 'batch_size': [4, 8],\n",
+    "                                           'epochs': [1]\n",
+    "                                         }\n",
+    "                                         $$,                  -- fit_param_grid\n",
+    "                                         'grid'               -- search_type\n",
+    "                                         );\n",
+    "\n",
+    "SELECT * FROM mst_table ORDER BY mst_key;"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "This is the name of the model architecture table that corresponds to the model selection table:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 17,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "1 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <tr>\n",
+       "        <th>model_arch_table</th>\n",
+       "        <th>object_table</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>model_arch_library</td>\n",
+       "        <td>None</td>\n",
+       "    </tr>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[(u'model_arch_library', None)]"
+      ]
+     },
+     "execution_count": 17,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "SELECT * FROM mst_table_summary;"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "<a id=\"train\"></a>\n",
+    "# 5.  Train\n",
+    "Train multiple models:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Done.\n"
+     ]
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "DROP TABLE IF EXISTS iris_multi_model, iris_multi_model_summary, iris_multi_model_info;\n",
+    "\n",
+    "SELECT madlib.madlib_keras_fit_multiple_model('iris_train_packed',    -- source_table\n",
+    "                                              'iris_multi_model',     -- model_output_table\n",
+    "                                              'mst_table',            -- model_selection_table\n",
+    "                                              10,                     -- num_iterations\n",
+    "                                              FALSE                   -- use gpus\n",
+    "                                             );"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "View the model summary:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "%%sql\n",
+    "SELECT * FROM iris_multi_model_summary;"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "View results for each model:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "%%sql\n",
+    "SELECT * FROM iris_multi_model_info ORDER BY training_metrics_final DESC, training_loss_final;"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "<a id=\"eval\"></a>\n",
+    "# 6. Evaluate\n",
+    "\n",
+    "Now run evaluate using model we built above:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "%%sql\n",
+    "DROP TABLE IF EXISTS iris_validate;\n",
+    "SELECT madlib.madlib_keras_evaluate('iris_multi_model',  -- model\n",
+    "                                    'iris_test_packed',  -- test table\n",
+    "                                    'iris_validate',     -- output table\n",
+    "                                     NULL,               -- use gpus\n",
+    "                                     9                   -- mst_key to use\n",
+    "                                   );\n",
+    "\n",
+    "SELECT * FROM iris_validate;"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "<a id=\"pred\"></a>\n",
+    "# 7. Predict\n",
+    "\n",
+    "Now predict using model we built.  We will use the validation data set for prediction as well, which is not usual but serves to show the syntax. The prediction is in the estimated_class_text column:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "%%sql\n",
+    "DROP TABLE IF EXISTS iris_predict;\n",
+    "\n",
+    "SELECT madlib.madlib_keras_predict('iris_multi_model', -- model\n",
+    "                                   'iris_test',        -- test_table\n",
+    "                                   'id',               -- id column\n",
+    "                                   'attributes',       -- independent var\n",
+    "                                   'iris_predict',     -- output table\n",
+    "                                    'response',        -- prediction type\n",
+    "                                    FALSE,             -- use gpus\n",
+    "                                    9                  -- mst_key to use\n",
+    "                                   );\n",
+    "\n",
+    "SELECT * FROM iris_predict ORDER BY id;"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Count missclassifications"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "%%sql\n",
+    "SELECT COUNT(*) FROM iris_predict JOIN iris_test USING (id) \n",
+    "WHERE iris_predict.class_value != iris_test.class_text;"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Percent missclassifications"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "%%sql\n",
+    "SELECT round(count(*)*100/(150*0.2),2) as test_accuracy_percent from\n",
+    "    (select iris_test.class_text as actual, iris_predict.class_value as estimated\n",
+    "     from iris_predict inner join iris_test\n",
+    "     on iris_test.id=iris_predict.id) q\n",
+    "WHERE q.actual=q.estimated;"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "<a id=\"class2\"></a>\n",
+    "# Classification with Other Parameters\n",
+    "\n",
+    "<a id=\"val_dataset\"></a>\n",
+    "# 1.  Validation dataset\n",
+    "\n",
+    "Now use a validation dataset and compute metrics every 2nd iteration using the 'metrics_compute_frequency' parameter.  This can help reduce run time if you do not need metrics computed at every iteration."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "%%sql\n",
+    "DROP TABLE IF EXISTS iris_multi_model, iris_multi_model_summary, iris_multi_model_info;\n",
+    "\n",
+    "SELECT madlib.madlib_keras_fit_multiple_model('iris_train_packed',    -- source_table\n",
+    "                                              'iris_multi_model',     -- model_output_table\n",
+    "                                              'mst_table',            -- model_selection_table\n",
+    "                                               10,                     -- num_iterations\n",
+    "                                               FALSE,                 -- use gpus\n",
+    "                                              'iris_test_packed',     -- validation dataset\n",
+    "                                               3,                     -- metrics compute frequency\n",
+    "                                               FALSE,                 -- warm start\n",
+    "                                              'Sophie L.',            -- name\n",
+    "                                              'Model selection for iris dataset'  -- description\n",
+    "                                             );"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "View the model summary:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "%%sql\n",
+    "SELECT * FROM iris_multi_model_summary;"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "View performance of each model:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "%%sql\n",
+    "SELECT * FROM iris_multi_model_info ORDER BY validation_metrics_final DESC;"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Plot validation results"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "%matplotlib notebook\n",
+    "import matplotlib.pyplot as plt\n",
+    "from matplotlib.ticker import MaxNLocator\n",
+    "from collections import defaultdict\n",
+    "import pandas as pd\n",
+    "import seaborn as sns\n",
+    "sns.set_palette(sns.color_palette(\"hls\", 20))\n",
+    "plt.rcParams.update({'font.size': 12})\n",
+    "pd.set_option('display.max_colwidth', -1)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "scrolled": false
+   },
+   "outputs": [],
+   "source": [
+    "df_results = %sql SELECT * FROM iris_multi_model_info ORDER BY validation_loss ASC LIMIT 7;\n",
+    "df_results = df_results.DataFrame()\n",
+    "\n",
+    "df_summary = %sql SELECT * FROM iris_multi_model_summary;\n",
+    "df_summary = df_summary.DataFrame()\n",
+    "\n",
+    "#set up plots\n",
+    "fig, axs = plt.subplots(nrows=1, ncols=2, figsize=(10,5))\n",
+    "fig.legend(ncol=4)\n",
+    "fig.tight_layout()\n",
+    "\n",
+    "ax_metric = axs[0]\n",
+    "ax_loss = axs[1]\n",
+    "\n",
+    "ax_metric.xaxis.set_major_locator(MaxNLocator(integer=True))\n",
+    "ax_metric.set_xlabel('Iteration')\n",
+    "ax_metric.set_ylabel('Metric')\n",
+    "ax_metric.set_title('Validation metric curve')\n",
+    "\n",
+    "ax_loss.xaxis.set_major_locator(MaxNLocator(integer=True))\n",
+    "ax_loss.set_xlabel('Iteration')\n",
+    "ax_loss.set_ylabel('Loss')\n",
+    "ax_loss.set_title('Validation loss curve')\n",
+    "\n",
+    "iters = df_summary['metrics_iters'][0]\n",
+    "\n",
+    "for mst_key in df_results['mst_key']:\n",
+    "    df_output_info = %sql SELECT validation_metrics,validation_loss FROM iris_multi_model_info WHERE mst_key = $mst_key\n",
+    "    df_output_info = df_output_info.DataFrame()\n",
+    "    validation_metrics = df_output_info['validation_metrics'][0]\n",
+    "    validation_loss = df_output_info['validation_loss'][0]\n",
+    "    \n",
+    "    ax_metric.plot(iters, validation_metrics, label=mst_key, marker='o')\n",
+    "    ax_loss.plot(iters, validation_loss, label=mst_key, marker='o')\n",
+    "\n",
+    "plt.legend();\n",
+    "# fig.savefig('./lc_keras_fit.png', dpi = 300)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "<a id=\"pred_prob\"></a>\n",
+    "# 2.  Predict probabilities\n",
+    "\n",
+    "Predict with probabilities for each class:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "%%sql\n",
+    "DROP TABLE IF EXISTS iris_predict;\n",
+    "\n",
+    "SELECT madlib.madlib_keras_predict('iris_multi_model', -- model\n",
+    "                                   'iris_test',        -- test_table\n",
+    "                                   'id',               -- id column\n",
+    "                                   'attributes',       -- independent var\n",
+    "                                   'iris_predict',     -- output table\n",
+    "                                    'prob',            -- prediction type\n",
+    "                                    FALSE,             -- use gpus\n",
+    "                                    3                  -- mst_key to use\n",
+    "                                   );\n",
+    "\n",
+    "SELECT * FROM iris_predict ORDER BY id, rank;"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "<a id=\"warm_start\"></a>\n",
+    "# 3.  Warm start\n",
+    "\n",
+    "Next, use the warm_start parameter to continue learning, using the coefficients from the run above. Note that we don't drop the model table or model summary table:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "%%sql\n",
+    "SELECT madlib.madlib_keras_fit_multiple_model('iris_train_packed',    -- source_table\n",
+    "                                              'iris_multi_model',     -- model_output_table\n",
+    "                                              'mst_table',            -- model_selection_table\n",
+    "                                               3,                     -- num_iterations\n",
+    "                                               FALSE,                 -- use gpus\n",
+    "                                              'iris_test_packed',     -- validation dataset\n",
+    "                                               1,                     -- metrics compute frequency\n",
+    "                                               TRUE,                  -- warm start\n",
+    "                                              'Sophie L.',            -- name\n",
+    "                                              'Simple MLP for iris dataset'  -- description\n",
+    "                                             );"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "View summary:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "%%sql\n",
+    "SELECT * FROM iris_multi_model_summary;"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "View performance of each model:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "%%sql\n",
+    "SELECT * FROM iris_multi_model_info ORDER BY validation_metrics_final DESC;"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Plot validation results:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "df_results = %sql SELECT * FROM iris_multi_model_info ORDER BY validation_loss ASC LIMIT 7;\n",
+    "df_results = df_results.DataFrame()\n",
+    "\n",
+    "df_summary = %sql SELECT * FROM iris_multi_model_summary;\n",
+    "df_summary = df_summary.DataFrame()\n",
+    "\n",
+    "#set up plots\n",
+    "fig, axs = plt.subplots(nrows=1, ncols=2, figsize=(10,5))\n",
+    "fig.legend(ncol=4)\n",
+    "fig.tight_layout()\n",
+    "\n",
+    "ax_metric = axs[0]\n",
+    "ax_loss = axs[1]\n",
+    "\n",
+    "ax_metric.xaxis.set_major_locator(MaxNLocator(integer=True))\n",
+    "ax_metric.set_xlabel('Iteration')\n",
+    "ax_metric.set_ylabel('Metric')\n",
+    "ax_metric.set_title('Validation metric curve')\n",
+    "\n",
+    "ax_loss.xaxis.set_major_locator(MaxNLocator(integer=True))\n",
+    "ax_loss.set_xlabel('Iteration')\n",
+    "ax_loss.set_ylabel('Loss')\n",
+    "ax_loss.set_title('Validation loss curve')\n",
+    "\n",
+    "iters = df_summary['metrics_iters'][0]\n",
+    "\n",
+    "for mst_key in df_results['mst_key']:\n",
+    "    df_output_info = %sql SELECT validation_metrics,validation_loss FROM iris_multi_model_info WHERE mst_key = $mst_key\n",
+    "    df_output_info = df_output_info.DataFrame()\n",
+    "    validation_metrics = df_output_info['validation_metrics'][0]\n",
+    "    validation_loss = df_output_info['validation_loss'][0]\n",
+    "    \n",
+    "    ax_metric.plot(iters, validation_metrics, label=mst_key, marker='o')\n",
+    "    ax_loss.plot(iters, validation_loss, label=mst_key, marker='o')\n",
+    "\n",
+    "plt.legend();\n",
+    "# fig.savefig('./lc_keras_fit.png', dpi = 300)"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 2",
+   "language": "python",
+   "name": "python2"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 2
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython2",
+   "version": "2.7.16"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 1
+}
diff --git a/community-artifacts/Deep-learning/Train-single-model/.ipynb_checkpoints/MADlib-Keras-MLP-v2-checkpoint.ipynb b/community-artifacts/Deep-learning/Train-single-model/.ipynb_checkpoints/MADlib-Keras-MLP-v2-checkpoint.ipynb
new file mode 100644
index 0000000..b49330f
--- /dev/null
+++ b/community-artifacts/Deep-learning/Train-single-model/.ipynb_checkpoints/MADlib-Keras-MLP-v2-checkpoint.ipynb
@@ -0,0 +1,5025 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# Multilayer Perceptron Using Keras and MADlib\n",
+    "\n",
+    "E2E classification example using MADlib calling a Keras MLP.\n",
+    "\n",
+    "Deep learning works best on very large datasets, but that is not convenient for a quick introduction to the syntax.  So in this workbook we use the well known iris data set from https://archive.ics.uci.edu/ml/datasets/iris to help get you started.  It is similar to the example in user docs http://madlib.apache.org/docs/latest/index.html\n",
+    "\n",
+    "For more realistic examples with images please refer to the deep learning notebooks at\n",
+    "https://github.com/apache/madlib-site/tree/asf-site/community-artifacts\n",
+    "\n",
+    "## Table of contents\n",
+    "\n",
+    "<a href=\"#class\">Classification</a>\n",
+    "\n",
+    "* <a href=\"#create_input_data\">1. Create input data</a>\n",
+    "\n",
+    "* <a href=\"#pp\">2. Call preprocessor for deep learning</a>\n",
+    "\n",
+    "* <a href=\"#load\">3. Define and load model architecture</a>\n",
+    "\n",
+    "* <a href=\"#train\">4. Train</a>\n",
+    "\n",
+    "* <a href=\"#eval\">5. Evaluate</a>\n",
+    "\n",
+    "* <a href=\"#pred\">6. Predict</a>\n",
+    "\n",
+    "* <a href=\"#pred_byom\">7. Predict BYOM</a>\n",
+    "\n",
+    "<a href=\"#class2\">Classification with Other Parameters</a>\n",
+    "\n",
+    "* <a href=\"#val_dataset\">1. Validation dataset</a>\n",
+    "\n",
+    "* <a href=\"#pred_prob\">2. Predict probabilities</a>\n",
+    "\n",
+    "* <a href=\"#warm_start\">3. Warm start</a>\n",
+    "\n",
+    "<a href=\"#transfer_learn\">Transfer learning</a>\n",
+    "\n",
+    "* <a href=\"#load2\">1. Define and load model architecture with some layers frozen</a>\n",
+    "\n",
+    "* <a href=\"#train2\">2. Train transfer model</a>"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {
+    "scrolled": false
+   },
+   "outputs": [],
+   "source": [
+    "%load_ext sql"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# Greenplum Database 5.x on GCP - via tunnel\n",
+    "%sql postgresql://gpadmin@localhost:8000/madlib\n",
+    "        \n",
+    "# PostgreSQL local\n",
+    "#%sql postgresql://fmcquillan@localhost:5432/madlib"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "1 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <tr>\n",
+       "        <th>version</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>MADlib version: 1.18.0, git revision: rel/v1.17.0-102-g42d51bc, cmake configuration time: Sun Apr 18 20:26:28 UTC 2021, build type: release, build system: Linux-3.10.0-1160.24.1.el7.x86_64, C compiler: gcc 4.8.5, C++ compiler: g++ 4.8.5</td>\n",
+       "    </tr>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[(u'MADlib version: 1.18.0, git revision: rel/v1.17.0-102-g42d51bc, cmake configuration time: Sun Apr 18 20:26:28 UTC 2021, build type: release, build system: Linux-3.10.0-1160.24.1.el7.x86_64, C compiler: gcc 4.8.5, C++ compiler: g++ 4.8.5',)]"
+      ]
+     },
+     "execution_count": 3,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%sql select madlib.version();\n",
+    "#%sql select version();"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "<a id=\"class\"></a>\n",
+    "# Classification\n",
+    "\n",
+    "<a id=\"create_input_data\"></a>\n",
+    "# 1.  Create input data\n",
+    "\n",
+    "Load iris data set."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Done.\n",
+      "Done.\n",
+      "150 rows affected.\n",
+      "150 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <tr>\n",
+       "        <th>id</th>\n",
+       "        <th>attributes</th>\n",
+       "        <th>class_text</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>1</td>\n",
+       "        <td>[Decimal('5.1'), Decimal('3.5'), Decimal('1.4'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>2</td>\n",
+       "        <td>[Decimal('4.9'), Decimal('3.0'), Decimal('1.4'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>3</td>\n",
+       "        <td>[Decimal('4.7'), Decimal('3.2'), Decimal('1.3'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>4</td>\n",
+       "        <td>[Decimal('4.6'), Decimal('3.1'), Decimal('1.5'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>5</td>\n",
+       "        <td>[Decimal('5.0'), Decimal('3.6'), Decimal('1.4'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>6</td>\n",
+       "        <td>[Decimal('5.4'), Decimal('3.9'), Decimal('1.7'), Decimal('0.4')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>7</td>\n",
+       "        <td>[Decimal('4.6'), Decimal('3.4'), Decimal('1.4'), Decimal('0.3')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>8</td>\n",
+       "        <td>[Decimal('5.0'), Decimal('3.4'), Decimal('1.5'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>9</td>\n",
+       "        <td>[Decimal('4.4'), Decimal('2.9'), Decimal('1.4'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>10</td>\n",
+       "        <td>[Decimal('4.9'), Decimal('3.1'), Decimal('1.5'), Decimal('0.1')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>11</td>\n",
+       "        <td>[Decimal('5.4'), Decimal('3.7'), Decimal('1.5'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>12</td>\n",
+       "        <td>[Decimal('4.8'), Decimal('3.4'), Decimal('1.6'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>13</td>\n",
+       "        <td>[Decimal('4.8'), Decimal('3.0'), Decimal('1.4'), Decimal('0.1')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>14</td>\n",
+       "        <td>[Decimal('4.3'), Decimal('3.0'), Decimal('1.1'), Decimal('0.1')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>15</td>\n",
+       "        <td>[Decimal('5.8'), Decimal('4.0'), Decimal('1.2'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>16</td>\n",
+       "        <td>[Decimal('5.7'), Decimal('4.4'), Decimal('1.5'), Decimal('0.4')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>17</td>\n",
+       "        <td>[Decimal('5.4'), Decimal('3.9'), Decimal('1.3'), Decimal('0.4')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>18</td>\n",
+       "        <td>[Decimal('5.1'), Decimal('3.5'), Decimal('1.4'), Decimal('0.3')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>19</td>\n",
+       "        <td>[Decimal('5.7'), Decimal('3.8'), Decimal('1.7'), Decimal('0.3')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>20</td>\n",
+       "        <td>[Decimal('5.1'), Decimal('3.8'), Decimal('1.5'), Decimal('0.3')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>21</td>\n",
+       "        <td>[Decimal('5.4'), Decimal('3.4'), Decimal('1.7'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>22</td>\n",
+       "        <td>[Decimal('5.1'), Decimal('3.7'), Decimal('1.5'), Decimal('0.4')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>23</td>\n",
+       "        <td>[Decimal('4.6'), Decimal('3.6'), Decimal('1.0'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>24</td>\n",
+       "        <td>[Decimal('5.1'), Decimal('3.3'), Decimal('1.7'), Decimal('0.5')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>25</td>\n",
+       "        <td>[Decimal('4.8'), Decimal('3.4'), Decimal('1.9'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>26</td>\n",
+       "        <td>[Decimal('5.0'), Decimal('3.0'), Decimal('1.6'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>27</td>\n",
+       "        <td>[Decimal('5.0'), Decimal('3.4'), Decimal('1.6'), Decimal('0.4')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>28</td>\n",
+       "        <td>[Decimal('5.2'), Decimal('3.5'), Decimal('1.5'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>29</td>\n",
+       "        <td>[Decimal('5.2'), Decimal('3.4'), Decimal('1.4'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>30</td>\n",
+       "        <td>[Decimal('4.7'), Decimal('3.2'), Decimal('1.6'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>31</td>\n",
+       "        <td>[Decimal('4.8'), Decimal('3.1'), Decimal('1.6'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>32</td>\n",
+       "        <td>[Decimal('5.4'), Decimal('3.4'), Decimal('1.5'), Decimal('0.4')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>33</td>\n",
+       "        <td>[Decimal('5.2'), Decimal('4.1'), Decimal('1.5'), Decimal('0.1')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>34</td>\n",
+       "        <td>[Decimal('5.5'), Decimal('4.2'), Decimal('1.4'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>35</td>\n",
+       "        <td>[Decimal('4.9'), Decimal('3.1'), Decimal('1.5'), Decimal('0.1')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>36</td>\n",
+       "        <td>[Decimal('5.0'), Decimal('3.2'), Decimal('1.2'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>37</td>\n",
+       "        <td>[Decimal('5.5'), Decimal('3.5'), Decimal('1.3'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>38</td>\n",
+       "        <td>[Decimal('4.9'), Decimal('3.1'), Decimal('1.5'), Decimal('0.1')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>39</td>\n",
+       "        <td>[Decimal('4.4'), Decimal('3.0'), Decimal('1.3'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>40</td>\n",
+       "        <td>[Decimal('5.1'), Decimal('3.4'), Decimal('1.5'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>41</td>\n",
+       "        <td>[Decimal('5.0'), Decimal('3.5'), Decimal('1.3'), Decimal('0.3')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>42</td>\n",
+       "        <td>[Decimal('4.5'), Decimal('2.3'), Decimal('1.3'), Decimal('0.3')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>43</td>\n",
+       "        <td>[Decimal('4.4'), Decimal('3.2'), Decimal('1.3'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>44</td>\n",
+       "        <td>[Decimal('5.0'), Decimal('3.5'), Decimal('1.6'), Decimal('0.6')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>45</td>\n",
+       "        <td>[Decimal('5.1'), Decimal('3.8'), Decimal('1.9'), Decimal('0.4')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>46</td>\n",
+       "        <td>[Decimal('4.8'), Decimal('3.0'), Decimal('1.4'), Decimal('0.3')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>47</td>\n",
+       "        <td>[Decimal('5.1'), Decimal('3.8'), Decimal('1.6'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>48</td>\n",
+       "        <td>[Decimal('4.6'), Decimal('3.2'), Decimal('1.4'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>49</td>\n",
+       "        <td>[Decimal('5.3'), Decimal('3.7'), Decimal('1.5'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>50</td>\n",
+       "        <td>[Decimal('5.0'), Decimal('3.3'), Decimal('1.4'), Decimal('0.2')]</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>51</td>\n",
+       "        <td>[Decimal('7.0'), Decimal('3.2'), Decimal('4.7'), Decimal('1.4')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>52</td>\n",
+       "        <td>[Decimal('6.4'), Decimal('3.2'), Decimal('4.5'), Decimal('1.5')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>53</td>\n",
+       "        <td>[Decimal('6.9'), Decimal('3.1'), Decimal('4.9'), Decimal('1.5')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>54</td>\n",
+       "        <td>[Decimal('5.5'), Decimal('2.3'), Decimal('4.0'), Decimal('1.3')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>55</td>\n",
+       "        <td>[Decimal('6.5'), Decimal('2.8'), Decimal('4.6'), Decimal('1.5')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>56</td>\n",
+       "        <td>[Decimal('5.7'), Decimal('2.8'), Decimal('4.5'), Decimal('1.3')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>57</td>\n",
+       "        <td>[Decimal('6.3'), Decimal('3.3'), Decimal('4.7'), Decimal('1.6')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>58</td>\n",
+       "        <td>[Decimal('4.9'), Decimal('2.4'), Decimal('3.3'), Decimal('1.0')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>59</td>\n",
+       "        <td>[Decimal('6.6'), Decimal('2.9'), Decimal('4.6'), Decimal('1.3')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>60</td>\n",
+       "        <td>[Decimal('5.2'), Decimal('2.7'), Decimal('3.9'), Decimal('1.4')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>61</td>\n",
+       "        <td>[Decimal('5.0'), Decimal('2.0'), Decimal('3.5'), Decimal('1.0')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>62</td>\n",
+       "        <td>[Decimal('5.9'), Decimal('3.0'), Decimal('4.2'), Decimal('1.5')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>63</td>\n",
+       "        <td>[Decimal('6.0'), Decimal('2.2'), Decimal('4.0'), Decimal('1.0')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>64</td>\n",
+       "        <td>[Decimal('6.1'), Decimal('2.9'), Decimal('4.7'), Decimal('1.4')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>65</td>\n",
+       "        <td>[Decimal('5.6'), Decimal('2.9'), Decimal('3.6'), Decimal('1.3')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>66</td>\n",
+       "        <td>[Decimal('6.7'), Decimal('3.1'), Decimal('4.4'), Decimal('1.4')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>67</td>\n",
+       "        <td>[Decimal('5.6'), Decimal('3.0'), Decimal('4.5'), Decimal('1.5')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>68</td>\n",
+       "        <td>[Decimal('5.8'), Decimal('2.7'), Decimal('4.1'), Decimal('1.0')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>69</td>\n",
+       "        <td>[Decimal('6.2'), Decimal('2.2'), Decimal('4.5'), Decimal('1.5')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>70</td>\n",
+       "        <td>[Decimal('5.6'), Decimal('2.5'), Decimal('3.9'), Decimal('1.1')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>71</td>\n",
+       "        <td>[Decimal('5.9'), Decimal('3.2'), Decimal('4.8'), Decimal('1.8')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>72</td>\n",
+       "        <td>[Decimal('6.1'), Decimal('2.8'), Decimal('4.0'), Decimal('1.3')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>73</td>\n",
+       "        <td>[Decimal('6.3'), Decimal('2.5'), Decimal('4.9'), Decimal('1.5')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>74</td>\n",
+       "        <td>[Decimal('6.1'), Decimal('2.8'), Decimal('4.7'), Decimal('1.2')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>75</td>\n",
+       "        <td>[Decimal('6.4'), Decimal('2.9'), Decimal('4.3'), Decimal('1.3')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>76</td>\n",
+       "        <td>[Decimal('6.6'), Decimal('3.0'), Decimal('4.4'), Decimal('1.4')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>77</td>\n",
+       "        <td>[Decimal('6.8'), Decimal('2.8'), Decimal('4.8'), Decimal('1.4')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>78</td>\n",
+       "        <td>[Decimal('6.7'), Decimal('3.0'), Decimal('5.0'), Decimal('1.7')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>79</td>\n",
+       "        <td>[Decimal('6.0'), Decimal('2.9'), Decimal('4.5'), Decimal('1.5')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>80</td>\n",
+       "        <td>[Decimal('5.7'), Decimal('2.6'), Decimal('3.5'), Decimal('1.0')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>81</td>\n",
+       "        <td>[Decimal('5.5'), Decimal('2.4'), Decimal('3.8'), Decimal('1.1')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>82</td>\n",
+       "        <td>[Decimal('5.5'), Decimal('2.4'), Decimal('3.7'), Decimal('1.0')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>83</td>\n",
+       "        <td>[Decimal('5.8'), Decimal('2.7'), Decimal('3.9'), Decimal('1.2')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>84</td>\n",
+       "        <td>[Decimal('6.0'), Decimal('2.7'), Decimal('5.1'), Decimal('1.6')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>85</td>\n",
+       "        <td>[Decimal('5.4'), Decimal('3.0'), Decimal('4.5'), Decimal('1.5')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>86</td>\n",
+       "        <td>[Decimal('6.0'), Decimal('3.4'), Decimal('4.5'), Decimal('1.6')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>87</td>\n",
+       "        <td>[Decimal('6.7'), Decimal('3.1'), Decimal('4.7'), Decimal('1.5')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>88</td>\n",
+       "        <td>[Decimal('6.3'), Decimal('2.3'), Decimal('4.4'), Decimal('1.3')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>89</td>\n",
+       "        <td>[Decimal('5.6'), Decimal('3.0'), Decimal('4.1'), Decimal('1.3')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>90</td>\n",
+       "        <td>[Decimal('5.5'), Decimal('2.5'), Decimal('4.0'), Decimal('1.3')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>91</td>\n",
+       "        <td>[Decimal('5.5'), Decimal('2.6'), Decimal('4.4'), Decimal('1.2')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>92</td>\n",
+       "        <td>[Decimal('6.1'), Decimal('3.0'), Decimal('4.6'), Decimal('1.4')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>93</td>\n",
+       "        <td>[Decimal('5.8'), Decimal('2.6'), Decimal('4.0'), Decimal('1.2')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>94</td>\n",
+       "        <td>[Decimal('5.0'), Decimal('2.3'), Decimal('3.3'), Decimal('1.0')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>95</td>\n",
+       "        <td>[Decimal('5.6'), Decimal('2.7'), Decimal('4.2'), Decimal('1.3')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>96</td>\n",
+       "        <td>[Decimal('5.7'), Decimal('3.0'), Decimal('4.2'), Decimal('1.2')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>97</td>\n",
+       "        <td>[Decimal('5.7'), Decimal('2.9'), Decimal('4.2'), Decimal('1.3')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>98</td>\n",
+       "        <td>[Decimal('6.2'), Decimal('2.9'), Decimal('4.3'), Decimal('1.3')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>99</td>\n",
+       "        <td>[Decimal('5.1'), Decimal('2.5'), Decimal('3.0'), Decimal('1.1')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>100</td>\n",
+       "        <td>[Decimal('5.7'), Decimal('2.8'), Decimal('4.1'), Decimal('1.3')]</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>101</td>\n",
+       "        <td>[Decimal('6.3'), Decimal('3.3'), Decimal('6.0'), Decimal('2.5')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>102</td>\n",
+       "        <td>[Decimal('5.8'), Decimal('2.7'), Decimal('5.1'), Decimal('1.9')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>103</td>\n",
+       "        <td>[Decimal('7.1'), Decimal('3.0'), Decimal('5.9'), Decimal('2.1')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>104</td>\n",
+       "        <td>[Decimal('6.3'), Decimal('2.9'), Decimal('5.6'), Decimal('1.8')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>105</td>\n",
+       "        <td>[Decimal('6.5'), Decimal('3.0'), Decimal('5.8'), Decimal('2.2')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>106</td>\n",
+       "        <td>[Decimal('7.6'), Decimal('3.0'), Decimal('6.6'), Decimal('2.1')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>107</td>\n",
+       "        <td>[Decimal('4.9'), Decimal('2.5'), Decimal('4.5'), Decimal('1.7')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>108</td>\n",
+       "        <td>[Decimal('7.3'), Decimal('2.9'), Decimal('6.3'), Decimal('1.8')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>109</td>\n",
+       "        <td>[Decimal('6.7'), Decimal('2.5'), Decimal('5.8'), Decimal('1.8')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>110</td>\n",
+       "        <td>[Decimal('7.2'), Decimal('3.6'), Decimal('6.1'), Decimal('2.5')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>111</td>\n",
+       "        <td>[Decimal('6.5'), Decimal('3.2'), Decimal('5.1'), Decimal('2.0')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>112</td>\n",
+       "        <td>[Decimal('6.4'), Decimal('2.7'), Decimal('5.3'), Decimal('1.9')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>113</td>\n",
+       "        <td>[Decimal('6.8'), Decimal('3.0'), Decimal('5.5'), Decimal('2.1')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>114</td>\n",
+       "        <td>[Decimal('5.7'), Decimal('2.5'), Decimal('5.0'), Decimal('2.0')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>115</td>\n",
+       "        <td>[Decimal('5.8'), Decimal('2.8'), Decimal('5.1'), Decimal('2.4')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>116</td>\n",
+       "        <td>[Decimal('6.4'), Decimal('3.2'), Decimal('5.3'), Decimal('2.3')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>117</td>\n",
+       "        <td>[Decimal('6.5'), Decimal('3.0'), Decimal('5.5'), Decimal('1.8')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>118</td>\n",
+       "        <td>[Decimal('7.7'), Decimal('3.8'), Decimal('6.7'), Decimal('2.2')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>119</td>\n",
+       "        <td>[Decimal('7.7'), Decimal('2.6'), Decimal('6.9'), Decimal('2.3')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>120</td>\n",
+       "        <td>[Decimal('6.0'), Decimal('2.2'), Decimal('5.0'), Decimal('1.5')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>121</td>\n",
+       "        <td>[Decimal('6.9'), Decimal('3.2'), Decimal('5.7'), Decimal('2.3')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>122</td>\n",
+       "        <td>[Decimal('5.6'), Decimal('2.8'), Decimal('4.9'), Decimal('2.0')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>123</td>\n",
+       "        <td>[Decimal('7.7'), Decimal('2.8'), Decimal('6.7'), Decimal('2.0')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>124</td>\n",
+       "        <td>[Decimal('6.3'), Decimal('2.7'), Decimal('4.9'), Decimal('1.8')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>125</td>\n",
+       "        <td>[Decimal('6.7'), Decimal('3.3'), Decimal('5.7'), Decimal('2.1')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>126</td>\n",
+       "        <td>[Decimal('7.2'), Decimal('3.2'), Decimal('6.0'), Decimal('1.8')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>127</td>\n",
+       "        <td>[Decimal('6.2'), Decimal('2.8'), Decimal('4.8'), Decimal('1.8')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>128</td>\n",
+       "        <td>[Decimal('6.1'), Decimal('3.0'), Decimal('4.9'), Decimal('1.8')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>129</td>\n",
+       "        <td>[Decimal('6.4'), Decimal('2.8'), Decimal('5.6'), Decimal('2.1')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>130</td>\n",
+       "        <td>[Decimal('7.2'), Decimal('3.0'), Decimal('5.8'), Decimal('1.6')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>131</td>\n",
+       "        <td>[Decimal('7.4'), Decimal('2.8'), Decimal('6.1'), Decimal('1.9')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>132</td>\n",
+       "        <td>[Decimal('7.9'), Decimal('3.8'), Decimal('6.4'), Decimal('2.0')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>133</td>\n",
+       "        <td>[Decimal('6.4'), Decimal('2.8'), Decimal('5.6'), Decimal('2.2')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>134</td>\n",
+       "        <td>[Decimal('6.3'), Decimal('2.8'), Decimal('5.1'), Decimal('1.5')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>135</td>\n",
+       "        <td>[Decimal('6.1'), Decimal('2.6'), Decimal('5.6'), Decimal('1.4')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>136</td>\n",
+       "        <td>[Decimal('7.7'), Decimal('3.0'), Decimal('6.1'), Decimal('2.3')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>137</td>\n",
+       "        <td>[Decimal('6.3'), Decimal('3.4'), Decimal('5.6'), Decimal('2.4')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>138</td>\n",
+       "        <td>[Decimal('6.4'), Decimal('3.1'), Decimal('5.5'), Decimal('1.8')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>139</td>\n",
+       "        <td>[Decimal('6.0'), Decimal('3.0'), Decimal('4.8'), Decimal('1.8')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>140</td>\n",
+       "        <td>[Decimal('6.9'), Decimal('3.1'), Decimal('5.4'), Decimal('2.1')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>141</td>\n",
+       "        <td>[Decimal('6.7'), Decimal('3.1'), Decimal('5.6'), Decimal('2.4')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>142</td>\n",
+       "        <td>[Decimal('6.9'), Decimal('3.1'), Decimal('5.1'), Decimal('2.3')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>143</td>\n",
+       "        <td>[Decimal('5.8'), Decimal('2.7'), Decimal('5.1'), Decimal('1.9')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>144</td>\n",
+       "        <td>[Decimal('6.8'), Decimal('3.2'), Decimal('5.9'), Decimal('2.3')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>145</td>\n",
+       "        <td>[Decimal('6.7'), Decimal('3.3'), Decimal('5.7'), Decimal('2.5')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>146</td>\n",
+       "        <td>[Decimal('6.7'), Decimal('3.0'), Decimal('5.2'), Decimal('2.3')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>147</td>\n",
+       "        <td>[Decimal('6.3'), Decimal('2.5'), Decimal('5.0'), Decimal('1.9')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>148</td>\n",
+       "        <td>[Decimal('6.5'), Decimal('3.0'), Decimal('5.2'), Decimal('2.0')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>149</td>\n",
+       "        <td>[Decimal('6.2'), Decimal('3.4'), Decimal('5.4'), Decimal('2.3')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>150</td>\n",
+       "        <td>[Decimal('5.9'), Decimal('3.0'), Decimal('5.1'), Decimal('1.8')]</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "    </tr>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[(1, [Decimal('5.1'), Decimal('3.5'), Decimal('1.4'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (2, [Decimal('4.9'), Decimal('3.0'), Decimal('1.4'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (3, [Decimal('4.7'), Decimal('3.2'), Decimal('1.3'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (4, [Decimal('4.6'), Decimal('3.1'), Decimal('1.5'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (5, [Decimal('5.0'), Decimal('3.6'), Decimal('1.4'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (6, [Decimal('5.4'), Decimal('3.9'), Decimal('1.7'), Decimal('0.4')], u'Iris-setosa'),\n",
+       " (7, [Decimal('4.6'), Decimal('3.4'), Decimal('1.4'), Decimal('0.3')], u'Iris-setosa'),\n",
+       " (8, [Decimal('5.0'), Decimal('3.4'), Decimal('1.5'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (9, [Decimal('4.4'), Decimal('2.9'), Decimal('1.4'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (10, [Decimal('4.9'), Decimal('3.1'), Decimal('1.5'), Decimal('0.1')], u'Iris-setosa'),\n",
+       " (11, [Decimal('5.4'), Decimal('3.7'), Decimal('1.5'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (12, [Decimal('4.8'), Decimal('3.4'), Decimal('1.6'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (13, [Decimal('4.8'), Decimal('3.0'), Decimal('1.4'), Decimal('0.1')], u'Iris-setosa'),\n",
+       " (14, [Decimal('4.3'), Decimal('3.0'), Decimal('1.1'), Decimal('0.1')], u'Iris-setosa'),\n",
+       " (15, [Decimal('5.8'), Decimal('4.0'), Decimal('1.2'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (16, [Decimal('5.7'), Decimal('4.4'), Decimal('1.5'), Decimal('0.4')], u'Iris-setosa'),\n",
+       " (17, [Decimal('5.4'), Decimal('3.9'), Decimal('1.3'), Decimal('0.4')], u'Iris-setosa'),\n",
+       " (18, [Decimal('5.1'), Decimal('3.5'), Decimal('1.4'), Decimal('0.3')], u'Iris-setosa'),\n",
+       " (19, [Decimal('5.7'), Decimal('3.8'), Decimal('1.7'), Decimal('0.3')], u'Iris-setosa'),\n",
+       " (20, [Decimal('5.1'), Decimal('3.8'), Decimal('1.5'), Decimal('0.3')], u'Iris-setosa'),\n",
+       " (21, [Decimal('5.4'), Decimal('3.4'), Decimal('1.7'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (22, [Decimal('5.1'), Decimal('3.7'), Decimal('1.5'), Decimal('0.4')], u'Iris-setosa'),\n",
+       " (23, [Decimal('4.6'), Decimal('3.6'), Decimal('1.0'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (24, [Decimal('5.1'), Decimal('3.3'), Decimal('1.7'), Decimal('0.5')], u'Iris-setosa'),\n",
+       " (25, [Decimal('4.8'), Decimal('3.4'), Decimal('1.9'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (26, [Decimal('5.0'), Decimal('3.0'), Decimal('1.6'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (27, [Decimal('5.0'), Decimal('3.4'), Decimal('1.6'), Decimal('0.4')], u'Iris-setosa'),\n",
+       " (28, [Decimal('5.2'), Decimal('3.5'), Decimal('1.5'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (29, [Decimal('5.2'), Decimal('3.4'), Decimal('1.4'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (30, [Decimal('4.7'), Decimal('3.2'), Decimal('1.6'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (31, [Decimal('4.8'), Decimal('3.1'), Decimal('1.6'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (32, [Decimal('5.4'), Decimal('3.4'), Decimal('1.5'), Decimal('0.4')], u'Iris-setosa'),\n",
+       " (33, [Decimal('5.2'), Decimal('4.1'), Decimal('1.5'), Decimal('0.1')], u'Iris-setosa'),\n",
+       " (34, [Decimal('5.5'), Decimal('4.2'), Decimal('1.4'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (35, [Decimal('4.9'), Decimal('3.1'), Decimal('1.5'), Decimal('0.1')], u'Iris-setosa'),\n",
+       " (36, [Decimal('5.0'), Decimal('3.2'), Decimal('1.2'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (37, [Decimal('5.5'), Decimal('3.5'), Decimal('1.3'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (38, [Decimal('4.9'), Decimal('3.1'), Decimal('1.5'), Decimal('0.1')], u'Iris-setosa'),\n",
+       " (39, [Decimal('4.4'), Decimal('3.0'), Decimal('1.3'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (40, [Decimal('5.1'), Decimal('3.4'), Decimal('1.5'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (41, [Decimal('5.0'), Decimal('3.5'), Decimal('1.3'), Decimal('0.3')], u'Iris-setosa'),\n",
+       " (42, [Decimal('4.5'), Decimal('2.3'), Decimal('1.3'), Decimal('0.3')], u'Iris-setosa'),\n",
+       " (43, [Decimal('4.4'), Decimal('3.2'), Decimal('1.3'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (44, [Decimal('5.0'), Decimal('3.5'), Decimal('1.6'), Decimal('0.6')], u'Iris-setosa'),\n",
+       " (45, [Decimal('5.1'), Decimal('3.8'), Decimal('1.9'), Decimal('0.4')], u'Iris-setosa'),\n",
+       " (46, [Decimal('4.8'), Decimal('3.0'), Decimal('1.4'), Decimal('0.3')], u'Iris-setosa'),\n",
+       " (47, [Decimal('5.1'), Decimal('3.8'), Decimal('1.6'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (48, [Decimal('4.6'), Decimal('3.2'), Decimal('1.4'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (49, [Decimal('5.3'), Decimal('3.7'), Decimal('1.5'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (50, [Decimal('5.0'), Decimal('3.3'), Decimal('1.4'), Decimal('0.2')], u'Iris-setosa'),\n",
+       " (51, [Decimal('7.0'), Decimal('3.2'), Decimal('4.7'), Decimal('1.4')], u'Iris-versicolor'),\n",
+       " (52, [Decimal('6.4'), Decimal('3.2'), Decimal('4.5'), Decimal('1.5')], u'Iris-versicolor'),\n",
+       " (53, [Decimal('6.9'), Decimal('3.1'), Decimal('4.9'), Decimal('1.5')], u'Iris-versicolor'),\n",
+       " (54, [Decimal('5.5'), Decimal('2.3'), Decimal('4.0'), Decimal('1.3')], u'Iris-versicolor'),\n",
+       " (55, [Decimal('6.5'), Decimal('2.8'), Decimal('4.6'), Decimal('1.5')], u'Iris-versicolor'),\n",
+       " (56, [Decimal('5.7'), Decimal('2.8'), Decimal('4.5'), Decimal('1.3')], u'Iris-versicolor'),\n",
+       " (57, [Decimal('6.3'), Decimal('3.3'), Decimal('4.7'), Decimal('1.6')], u'Iris-versicolor'),\n",
+       " (58, [Decimal('4.9'), Decimal('2.4'), Decimal('3.3'), Decimal('1.0')], u'Iris-versicolor'),\n",
+       " (59, [Decimal('6.6'), Decimal('2.9'), Decimal('4.6'), Decimal('1.3')], u'Iris-versicolor'),\n",
+       " (60, [Decimal('5.2'), Decimal('2.7'), Decimal('3.9'), Decimal('1.4')], u'Iris-versicolor'),\n",
+       " (61, [Decimal('5.0'), Decimal('2.0'), Decimal('3.5'), Decimal('1.0')], u'Iris-versicolor'),\n",
+       " (62, [Decimal('5.9'), Decimal('3.0'), Decimal('4.2'), Decimal('1.5')], u'Iris-versicolor'),\n",
+       " (63, [Decimal('6.0'), Decimal('2.2'), Decimal('4.0'), Decimal('1.0')], u'Iris-versicolor'),\n",
+       " (64, [Decimal('6.1'), Decimal('2.9'), Decimal('4.7'), Decimal('1.4')], u'Iris-versicolor'),\n",
+       " (65, [Decimal('5.6'), Decimal('2.9'), Decimal('3.6'), Decimal('1.3')], u'Iris-versicolor'),\n",
+       " (66, [Decimal('6.7'), Decimal('3.1'), Decimal('4.4'), Decimal('1.4')], u'Iris-versicolor'),\n",
+       " (67, [Decimal('5.6'), Decimal('3.0'), Decimal('4.5'), Decimal('1.5')], u'Iris-versicolor'),\n",
+       " (68, [Decimal('5.8'), Decimal('2.7'), Decimal('4.1'), Decimal('1.0')], u'Iris-versicolor'),\n",
+       " (69, [Decimal('6.2'), Decimal('2.2'), Decimal('4.5'), Decimal('1.5')], u'Iris-versicolor'),\n",
+       " (70, [Decimal('5.6'), Decimal('2.5'), Decimal('3.9'), Decimal('1.1')], u'Iris-versicolor'),\n",
+       " (71, [Decimal('5.9'), Decimal('3.2'), Decimal('4.8'), Decimal('1.8')], u'Iris-versicolor'),\n",
+       " (72, [Decimal('6.1'), Decimal('2.8'), Decimal('4.0'), Decimal('1.3')], u'Iris-versicolor'),\n",
+       " (73, [Decimal('6.3'), Decimal('2.5'), Decimal('4.9'), Decimal('1.5')], u'Iris-versicolor'),\n",
+       " (74, [Decimal('6.1'), Decimal('2.8'), Decimal('4.7'), Decimal('1.2')], u'Iris-versicolor'),\n",
+       " (75, [Decimal('6.4'), Decimal('2.9'), Decimal('4.3'), Decimal('1.3')], u'Iris-versicolor'),\n",
+       " (76, [Decimal('6.6'), Decimal('3.0'), Decimal('4.4'), Decimal('1.4')], u'Iris-versicolor'),\n",
+       " (77, [Decimal('6.8'), Decimal('2.8'), Decimal('4.8'), Decimal('1.4')], u'Iris-versicolor'),\n",
+       " (78, [Decimal('6.7'), Decimal('3.0'), Decimal('5.0'), Decimal('1.7')], u'Iris-versicolor'),\n",
+       " (79, [Decimal('6.0'), Decimal('2.9'), Decimal('4.5'), Decimal('1.5')], u'Iris-versicolor'),\n",
+       " (80, [Decimal('5.7'), Decimal('2.6'), Decimal('3.5'), Decimal('1.0')], u'Iris-versicolor'),\n",
+       " (81, [Decimal('5.5'), Decimal('2.4'), Decimal('3.8'), Decimal('1.1')], u'Iris-versicolor'),\n",
+       " (82, [Decimal('5.5'), Decimal('2.4'), Decimal('3.7'), Decimal('1.0')], u'Iris-versicolor'),\n",
+       " (83, [Decimal('5.8'), Decimal('2.7'), Decimal('3.9'), Decimal('1.2')], u'Iris-versicolor'),\n",
+       " (84, [Decimal('6.0'), Decimal('2.7'), Decimal('5.1'), Decimal('1.6')], u'Iris-versicolor'),\n",
+       " (85, [Decimal('5.4'), Decimal('3.0'), Decimal('4.5'), Decimal('1.5')], u'Iris-versicolor'),\n",
+       " (86, [Decimal('6.0'), Decimal('3.4'), Decimal('4.5'), Decimal('1.6')], u'Iris-versicolor'),\n",
+       " (87, [Decimal('6.7'), Decimal('3.1'), Decimal('4.7'), Decimal('1.5')], u'Iris-versicolor'),\n",
+       " (88, [Decimal('6.3'), Decimal('2.3'), Decimal('4.4'), Decimal('1.3')], u'Iris-versicolor'),\n",
+       " (89, [Decimal('5.6'), Decimal('3.0'), Decimal('4.1'), Decimal('1.3')], u'Iris-versicolor'),\n",
+       " (90, [Decimal('5.5'), Decimal('2.5'), Decimal('4.0'), Decimal('1.3')], u'Iris-versicolor'),\n",
+       " (91, [Decimal('5.5'), Decimal('2.6'), Decimal('4.4'), Decimal('1.2')], u'Iris-versicolor'),\n",
+       " (92, [Decimal('6.1'), Decimal('3.0'), Decimal('4.6'), Decimal('1.4')], u'Iris-versicolor'),\n",
+       " (93, [Decimal('5.8'), Decimal('2.6'), Decimal('4.0'), Decimal('1.2')], u'Iris-versicolor'),\n",
+       " (94, [Decimal('5.0'), Decimal('2.3'), Decimal('3.3'), Decimal('1.0')], u'Iris-versicolor'),\n",
+       " (95, [Decimal('5.6'), Decimal('2.7'), Decimal('4.2'), Decimal('1.3')], u'Iris-versicolor'),\n",
+       " (96, [Decimal('5.7'), Decimal('3.0'), Decimal('4.2'), Decimal('1.2')], u'Iris-versicolor'),\n",
+       " (97, [Decimal('5.7'), Decimal('2.9'), Decimal('4.2'), Decimal('1.3')], u'Iris-versicolor'),\n",
+       " (98, [Decimal('6.2'), Decimal('2.9'), Decimal('4.3'), Decimal('1.3')], u'Iris-versicolor'),\n",
+       " (99, [Decimal('5.1'), Decimal('2.5'), Decimal('3.0'), Decimal('1.1')], u'Iris-versicolor'),\n",
+       " (100, [Decimal('5.7'), Decimal('2.8'), Decimal('4.1'), Decimal('1.3')], u'Iris-versicolor'),\n",
+       " (101, [Decimal('6.3'), Decimal('3.3'), Decimal('6.0'), Decimal('2.5')], u'Iris-virginica'),\n",
+       " (102, [Decimal('5.8'), Decimal('2.7'), Decimal('5.1'), Decimal('1.9')], u'Iris-virginica'),\n",
+       " (103, [Decimal('7.1'), Decimal('3.0'), Decimal('5.9'), Decimal('2.1')], u'Iris-virginica'),\n",
+       " (104, [Decimal('6.3'), Decimal('2.9'), Decimal('5.6'), Decimal('1.8')], u'Iris-virginica'),\n",
+       " (105, [Decimal('6.5'), Decimal('3.0'), Decimal('5.8'), Decimal('2.2')], u'Iris-virginica'),\n",
+       " (106, [Decimal('7.6'), Decimal('3.0'), Decimal('6.6'), Decimal('2.1')], u'Iris-virginica'),\n",
+       " (107, [Decimal('4.9'), Decimal('2.5'), Decimal('4.5'), Decimal('1.7')], u'Iris-virginica'),\n",
+       " (108, [Decimal('7.3'), Decimal('2.9'), Decimal('6.3'), Decimal('1.8')], u'Iris-virginica'),\n",
+       " (109, [Decimal('6.7'), Decimal('2.5'), Decimal('5.8'), Decimal('1.8')], u'Iris-virginica'),\n",
+       " (110, [Decimal('7.2'), Decimal('3.6'), Decimal('6.1'), Decimal('2.5')], u'Iris-virginica'),\n",
+       " (111, [Decimal('6.5'), Decimal('3.2'), Decimal('5.1'), Decimal('2.0')], u'Iris-virginica'),\n",
+       " (112, [Decimal('6.4'), Decimal('2.7'), Decimal('5.3'), Decimal('1.9')], u'Iris-virginica'),\n",
+       " (113, [Decimal('6.8'), Decimal('3.0'), Decimal('5.5'), Decimal('2.1')], u'Iris-virginica'),\n",
+       " (114, [Decimal('5.7'), Decimal('2.5'), Decimal('5.0'), Decimal('2.0')], u'Iris-virginica'),\n",
+       " (115, [Decimal('5.8'), Decimal('2.8'), Decimal('5.1'), Decimal('2.4')], u'Iris-virginica'),\n",
+       " (116, [Decimal('6.4'), Decimal('3.2'), Decimal('5.3'), Decimal('2.3')], u'Iris-virginica'),\n",
+       " (117, [Decimal('6.5'), Decimal('3.0'), Decimal('5.5'), Decimal('1.8')], u'Iris-virginica'),\n",
+       " (118, [Decimal('7.7'), Decimal('3.8'), Decimal('6.7'), Decimal('2.2')], u'Iris-virginica'),\n",
+       " (119, [Decimal('7.7'), Decimal('2.6'), Decimal('6.9'), Decimal('2.3')], u'Iris-virginica'),\n",
+       " (120, [Decimal('6.0'), Decimal('2.2'), Decimal('5.0'), Decimal('1.5')], u'Iris-virginica'),\n",
+       " (121, [Decimal('6.9'), Decimal('3.2'), Decimal('5.7'), Decimal('2.3')], u'Iris-virginica'),\n",
+       " (122, [Decimal('5.6'), Decimal('2.8'), Decimal('4.9'), Decimal('2.0')], u'Iris-virginica'),\n",
+       " (123, [Decimal('7.7'), Decimal('2.8'), Decimal('6.7'), Decimal('2.0')], u'Iris-virginica'),\n",
+       " (124, [Decimal('6.3'), Decimal('2.7'), Decimal('4.9'), Decimal('1.8')], u'Iris-virginica'),\n",
+       " (125, [Decimal('6.7'), Decimal('3.3'), Decimal('5.7'), Decimal('2.1')], u'Iris-virginica'),\n",
+       " (126, [Decimal('7.2'), Decimal('3.2'), Decimal('6.0'), Decimal('1.8')], u'Iris-virginica'),\n",
+       " (127, [Decimal('6.2'), Decimal('2.8'), Decimal('4.8'), Decimal('1.8')], u'Iris-virginica'),\n",
+       " (128, [Decimal('6.1'), Decimal('3.0'), Decimal('4.9'), Decimal('1.8')], u'Iris-virginica'),\n",
+       " (129, [Decimal('6.4'), Decimal('2.8'), Decimal('5.6'), Decimal('2.1')], u'Iris-virginica'),\n",
+       " (130, [Decimal('7.2'), Decimal('3.0'), Decimal('5.8'), Decimal('1.6')], u'Iris-virginica'),\n",
+       " (131, [Decimal('7.4'), Decimal('2.8'), Decimal('6.1'), Decimal('1.9')], u'Iris-virginica'),\n",
+       " (132, [Decimal('7.9'), Decimal('3.8'), Decimal('6.4'), Decimal('2.0')], u'Iris-virginica'),\n",
+       " (133, [Decimal('6.4'), Decimal('2.8'), Decimal('5.6'), Decimal('2.2')], u'Iris-virginica'),\n",
+       " (134, [Decimal('6.3'), Decimal('2.8'), Decimal('5.1'), Decimal('1.5')], u'Iris-virginica'),\n",
+       " (135, [Decimal('6.1'), Decimal('2.6'), Decimal('5.6'), Decimal('1.4')], u'Iris-virginica'),\n",
+       " (136, [Decimal('7.7'), Decimal('3.0'), Decimal('6.1'), Decimal('2.3')], u'Iris-virginica'),\n",
+       " (137, [Decimal('6.3'), Decimal('3.4'), Decimal('5.6'), Decimal('2.4')], u'Iris-virginica'),\n",
+       " (138, [Decimal('6.4'), Decimal('3.1'), Decimal('5.5'), Decimal('1.8')], u'Iris-virginica'),\n",
+       " (139, [Decimal('6.0'), Decimal('3.0'), Decimal('4.8'), Decimal('1.8')], u'Iris-virginica'),\n",
+       " (140, [Decimal('6.9'), Decimal('3.1'), Decimal('5.4'), Decimal('2.1')], u'Iris-virginica'),\n",
+       " (141, [Decimal('6.7'), Decimal('3.1'), Decimal('5.6'), Decimal('2.4')], u'Iris-virginica'),\n",
+       " (142, [Decimal('6.9'), Decimal('3.1'), Decimal('5.1'), Decimal('2.3')], u'Iris-virginica'),\n",
+       " (143, [Decimal('5.8'), Decimal('2.7'), Decimal('5.1'), Decimal('1.9')], u'Iris-virginica'),\n",
+       " (144, [Decimal('6.8'), Decimal('3.2'), Decimal('5.9'), Decimal('2.3')], u'Iris-virginica'),\n",
+       " (145, [Decimal('6.7'), Decimal('3.3'), Decimal('5.7'), Decimal('2.5')], u'Iris-virginica'),\n",
+       " (146, [Decimal('6.7'), Decimal('3.0'), Decimal('5.2'), Decimal('2.3')], u'Iris-virginica'),\n",
+       " (147, [Decimal('6.3'), Decimal('2.5'), Decimal('5.0'), Decimal('1.9')], u'Iris-virginica'),\n",
+       " (148, [Decimal('6.5'), Decimal('3.0'), Decimal('5.2'), Decimal('2.0')], u'Iris-virginica'),\n",
+       " (149, [Decimal('6.2'), Decimal('3.4'), Decimal('5.4'), Decimal('2.3')], u'Iris-virginica'),\n",
+       " (150, [Decimal('5.9'), Decimal('3.0'), Decimal('5.1'), Decimal('1.8')], u'Iris-virginica')]"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql \n",
+    "DROP TABLE IF EXISTS iris_data;\n",
+    "\n",
+    "CREATE TABLE iris_data(\n",
+    "    id serial,\n",
+    "    attributes numeric[],\n",
+    "    class_text varchar\n",
+    ");\n",
+    "\n",
+    "INSERT INTO iris_data(id, attributes, class_text) VALUES\n",
+    "(1,ARRAY[5.1,3.5,1.4,0.2],'Iris-setosa'),\n",
+    "(2,ARRAY[4.9,3.0,1.4,0.2],'Iris-setosa'),\n",
+    "(3,ARRAY[4.7,3.2,1.3,0.2],'Iris-setosa'),\n",
+    "(4,ARRAY[4.6,3.1,1.5,0.2],'Iris-setosa'),\n",
+    "(5,ARRAY[5.0,3.6,1.4,0.2],'Iris-setosa'),\n",
+    "(6,ARRAY[5.4,3.9,1.7,0.4],'Iris-setosa'),\n",
+    "(7,ARRAY[4.6,3.4,1.4,0.3],'Iris-setosa'),\n",
+    "(8,ARRAY[5.0,3.4,1.5,0.2],'Iris-setosa'),\n",
+    "(9,ARRAY[4.4,2.9,1.4,0.2],'Iris-setosa'),\n",
+    "(10,ARRAY[4.9,3.1,1.5,0.1],'Iris-setosa'),\n",
+    "(11,ARRAY[5.4,3.7,1.5,0.2],'Iris-setosa'),\n",
+    "(12,ARRAY[4.8,3.4,1.6,0.2],'Iris-setosa'),\n",
+    "(13,ARRAY[4.8,3.0,1.4,0.1],'Iris-setosa'),\n",
+    "(14,ARRAY[4.3,3.0,1.1,0.1],'Iris-setosa'),\n",
+    "(15,ARRAY[5.8,4.0,1.2,0.2],'Iris-setosa'),\n",
+    "(16,ARRAY[5.7,4.4,1.5,0.4],'Iris-setosa'),\n",
+    "(17,ARRAY[5.4,3.9,1.3,0.4],'Iris-setosa'),\n",
+    "(18,ARRAY[5.1,3.5,1.4,0.3],'Iris-setosa'),\n",
+    "(19,ARRAY[5.7,3.8,1.7,0.3],'Iris-setosa'),\n",
+    "(20,ARRAY[5.1,3.8,1.5,0.3],'Iris-setosa'),\n",
+    "(21,ARRAY[5.4,3.4,1.7,0.2],'Iris-setosa'),\n",
+    "(22,ARRAY[5.1,3.7,1.5,0.4],'Iris-setosa'),\n",
+    "(23,ARRAY[4.6,3.6,1.0,0.2],'Iris-setosa'),\n",
+    "(24,ARRAY[5.1,3.3,1.7,0.5],'Iris-setosa'),\n",
+    "(25,ARRAY[4.8,3.4,1.9,0.2],'Iris-setosa'),\n",
+    "(26,ARRAY[5.0,3.0,1.6,0.2],'Iris-setosa'),\n",
+    "(27,ARRAY[5.0,3.4,1.6,0.4],'Iris-setosa'),\n",
+    "(28,ARRAY[5.2,3.5,1.5,0.2],'Iris-setosa'),\n",
+    "(29,ARRAY[5.2,3.4,1.4,0.2],'Iris-setosa'),\n",
+    "(30,ARRAY[4.7,3.2,1.6,0.2],'Iris-setosa'),\n",
+    "(31,ARRAY[4.8,3.1,1.6,0.2],'Iris-setosa'),\n",
+    "(32,ARRAY[5.4,3.4,1.5,0.4],'Iris-setosa'),\n",
+    "(33,ARRAY[5.2,4.1,1.5,0.1],'Iris-setosa'),\n",
+    "(34,ARRAY[5.5,4.2,1.4,0.2],'Iris-setosa'),\n",
+    "(35,ARRAY[4.9,3.1,1.5,0.1],'Iris-setosa'),\n",
+    "(36,ARRAY[5.0,3.2,1.2,0.2],'Iris-setosa'),\n",
+    "(37,ARRAY[5.5,3.5,1.3,0.2],'Iris-setosa'),\n",
+    "(38,ARRAY[4.9,3.1,1.5,0.1],'Iris-setosa'),\n",
+    "(39,ARRAY[4.4,3.0,1.3,0.2],'Iris-setosa'),\n",
+    "(40,ARRAY[5.1,3.4,1.5,0.2],'Iris-setosa'),\n",
+    "(41,ARRAY[5.0,3.5,1.3,0.3],'Iris-setosa'),\n",
+    "(42,ARRAY[4.5,2.3,1.3,0.3],'Iris-setosa'),\n",
+    "(43,ARRAY[4.4,3.2,1.3,0.2],'Iris-setosa'),\n",
+    "(44,ARRAY[5.0,3.5,1.6,0.6],'Iris-setosa'),\n",
+    "(45,ARRAY[5.1,3.8,1.9,0.4],'Iris-setosa'),\n",
+    "(46,ARRAY[4.8,3.0,1.4,0.3],'Iris-setosa'),\n",
+    "(47,ARRAY[5.1,3.8,1.6,0.2],'Iris-setosa'),\n",
+    "(48,ARRAY[4.6,3.2,1.4,0.2],'Iris-setosa'),\n",
+    "(49,ARRAY[5.3,3.7,1.5,0.2],'Iris-setosa'),\n",
+    "(50,ARRAY[5.0,3.3,1.4,0.2],'Iris-setosa'),\n",
+    "(51,ARRAY[7.0,3.2,4.7,1.4],'Iris-versicolor'),\n",
+    "(52,ARRAY[6.4,3.2,4.5,1.5],'Iris-versicolor'),\n",
+    "(53,ARRAY[6.9,3.1,4.9,1.5],'Iris-versicolor'),\n",
+    "(54,ARRAY[5.5,2.3,4.0,1.3],'Iris-versicolor'),\n",
+    "(55,ARRAY[6.5,2.8,4.6,1.5],'Iris-versicolor'),\n",
+    "(56,ARRAY[5.7,2.8,4.5,1.3],'Iris-versicolor'),\n",
+    "(57,ARRAY[6.3,3.3,4.7,1.6],'Iris-versicolor'),\n",
+    "(58,ARRAY[4.9,2.4,3.3,1.0],'Iris-versicolor'),\n",
+    "(59,ARRAY[6.6,2.9,4.6,1.3],'Iris-versicolor'),\n",
+    "(60,ARRAY[5.2,2.7,3.9,1.4],'Iris-versicolor'),\n",
+    "(61,ARRAY[5.0,2.0,3.5,1.0],'Iris-versicolor'),\n",
+    "(62,ARRAY[5.9,3.0,4.2,1.5],'Iris-versicolor'),\n",
+    "(63,ARRAY[6.0,2.2,4.0,1.0],'Iris-versicolor'),\n",
+    "(64,ARRAY[6.1,2.9,4.7,1.4],'Iris-versicolor'),\n",
+    "(65,ARRAY[5.6,2.9,3.6,1.3],'Iris-versicolor'),\n",
+    "(66,ARRAY[6.7,3.1,4.4,1.4],'Iris-versicolor'),\n",
+    "(67,ARRAY[5.6,3.0,4.5,1.5],'Iris-versicolor'),\n",
+    "(68,ARRAY[5.8,2.7,4.1,1.0],'Iris-versicolor'),\n",
+    "(69,ARRAY[6.2,2.2,4.5,1.5],'Iris-versicolor'),\n",
+    "(70,ARRAY[5.6,2.5,3.9,1.1],'Iris-versicolor'),\n",
+    "(71,ARRAY[5.9,3.2,4.8,1.8],'Iris-versicolor'),\n",
+    "(72,ARRAY[6.1,2.8,4.0,1.3],'Iris-versicolor'),\n",
+    "(73,ARRAY[6.3,2.5,4.9,1.5],'Iris-versicolor'),\n",
+    "(74,ARRAY[6.1,2.8,4.7,1.2],'Iris-versicolor'),\n",
+    "(75,ARRAY[6.4,2.9,4.3,1.3],'Iris-versicolor'),\n",
+    "(76,ARRAY[6.6,3.0,4.4,1.4],'Iris-versicolor'),\n",
+    "(77,ARRAY[6.8,2.8,4.8,1.4],'Iris-versicolor'),\n",
+    "(78,ARRAY[6.7,3.0,5.0,1.7],'Iris-versicolor'),\n",
+    "(79,ARRAY[6.0,2.9,4.5,1.5],'Iris-versicolor'),\n",
+    "(80,ARRAY[5.7,2.6,3.5,1.0],'Iris-versicolor'),\n",
+    "(81,ARRAY[5.5,2.4,3.8,1.1],'Iris-versicolor'),\n",
+    "(82,ARRAY[5.5,2.4,3.7,1.0],'Iris-versicolor'),\n",
+    "(83,ARRAY[5.8,2.7,3.9,1.2],'Iris-versicolor'),\n",
+    "(84,ARRAY[6.0,2.7,5.1,1.6],'Iris-versicolor'),\n",
+    "(85,ARRAY[5.4,3.0,4.5,1.5],'Iris-versicolor'),\n",
+    "(86,ARRAY[6.0,3.4,4.5,1.6],'Iris-versicolor'),\n",
+    "(87,ARRAY[6.7,3.1,4.7,1.5],'Iris-versicolor'),\n",
+    "(88,ARRAY[6.3,2.3,4.4,1.3],'Iris-versicolor'),\n",
+    "(89,ARRAY[5.6,3.0,4.1,1.3],'Iris-versicolor'),\n",
+    "(90,ARRAY[5.5,2.5,4.0,1.3],'Iris-versicolor'),\n",
+    "(91,ARRAY[5.5,2.6,4.4,1.2],'Iris-versicolor'),\n",
+    "(92,ARRAY[6.1,3.0,4.6,1.4],'Iris-versicolor'),\n",
+    "(93,ARRAY[5.8,2.6,4.0,1.2],'Iris-versicolor'),\n",
+    "(94,ARRAY[5.0,2.3,3.3,1.0],'Iris-versicolor'),\n",
+    "(95,ARRAY[5.6,2.7,4.2,1.3],'Iris-versicolor'),\n",
+    "(96,ARRAY[5.7,3.0,4.2,1.2],'Iris-versicolor'),\n",
+    "(97,ARRAY[5.7,2.9,4.2,1.3],'Iris-versicolor'),\n",
+    "(98,ARRAY[6.2,2.9,4.3,1.3],'Iris-versicolor'),\n",
+    "(99,ARRAY[5.1,2.5,3.0,1.1],'Iris-versicolor'),\n",
+    "(100,ARRAY[5.7,2.8,4.1,1.3],'Iris-versicolor'),\n",
+    "(101,ARRAY[6.3,3.3,6.0,2.5],'Iris-virginica'),\n",
+    "(102,ARRAY[5.8,2.7,5.1,1.9],'Iris-virginica'),\n",
+    "(103,ARRAY[7.1,3.0,5.9,2.1],'Iris-virginica'),\n",
+    "(104,ARRAY[6.3,2.9,5.6,1.8],'Iris-virginica'),\n",
+    "(105,ARRAY[6.5,3.0,5.8,2.2],'Iris-virginica'),\n",
+    "(106,ARRAY[7.6,3.0,6.6,2.1],'Iris-virginica'),\n",
+    "(107,ARRAY[4.9,2.5,4.5,1.7],'Iris-virginica'),\n",
+    "(108,ARRAY[7.3,2.9,6.3,1.8],'Iris-virginica'),\n",
+    "(109,ARRAY[6.7,2.5,5.8,1.8],'Iris-virginica'),\n",
+    "(110,ARRAY[7.2,3.6,6.1,2.5],'Iris-virginica'),\n",
+    "(111,ARRAY[6.5,3.2,5.1,2.0],'Iris-virginica'),\n",
+    "(112,ARRAY[6.4,2.7,5.3,1.9],'Iris-virginica'),\n",
+    "(113,ARRAY[6.8,3.0,5.5,2.1],'Iris-virginica'),\n",
+    "(114,ARRAY[5.7,2.5,5.0,2.0],'Iris-virginica'),\n",
+    "(115,ARRAY[5.8,2.8,5.1,2.4],'Iris-virginica'),\n",
+    "(116,ARRAY[6.4,3.2,5.3,2.3],'Iris-virginica'),\n",
+    "(117,ARRAY[6.5,3.0,5.5,1.8],'Iris-virginica'),\n",
+    "(118,ARRAY[7.7,3.8,6.7,2.2],'Iris-virginica'),\n",
+    "(119,ARRAY[7.7,2.6,6.9,2.3],'Iris-virginica'),\n",
+    "(120,ARRAY[6.0,2.2,5.0,1.5],'Iris-virginica'),\n",
+    "(121,ARRAY[6.9,3.2,5.7,2.3],'Iris-virginica'),\n",
+    "(122,ARRAY[5.6,2.8,4.9,2.0],'Iris-virginica'),\n",
+    "(123,ARRAY[7.7,2.8,6.7,2.0],'Iris-virginica'),\n",
+    "(124,ARRAY[6.3,2.7,4.9,1.8],'Iris-virginica'),\n",
+    "(125,ARRAY[6.7,3.3,5.7,2.1],'Iris-virginica'),\n",
+    "(126,ARRAY[7.2,3.2,6.0,1.8],'Iris-virginica'),\n",
+    "(127,ARRAY[6.2,2.8,4.8,1.8],'Iris-virginica'),\n",
+    "(128,ARRAY[6.1,3.0,4.9,1.8],'Iris-virginica'),\n",
+    "(129,ARRAY[6.4,2.8,5.6,2.1],'Iris-virginica'),\n",
+    "(130,ARRAY[7.2,3.0,5.8,1.6],'Iris-virginica'),\n",
+    "(131,ARRAY[7.4,2.8,6.1,1.9],'Iris-virginica'),\n",
+    "(132,ARRAY[7.9,3.8,6.4,2.0],'Iris-virginica'),\n",
+    "(133,ARRAY[6.4,2.8,5.6,2.2],'Iris-virginica'),\n",
+    "(134,ARRAY[6.3,2.8,5.1,1.5],'Iris-virginica'),\n",
+    "(135,ARRAY[6.1,2.6,5.6,1.4],'Iris-virginica'),\n",
+    "(136,ARRAY[7.7,3.0,6.1,2.3],'Iris-virginica'),\n",
+    "(137,ARRAY[6.3,3.4,5.6,2.4],'Iris-virginica'),\n",
+    "(138,ARRAY[6.4,3.1,5.5,1.8],'Iris-virginica'),\n",
+    "(139,ARRAY[6.0,3.0,4.8,1.8],'Iris-virginica'),\n",
+    "(140,ARRAY[6.9,3.1,5.4,2.1],'Iris-virginica'),\n",
+    "(141,ARRAY[6.7,3.1,5.6,2.4],'Iris-virginica'),\n",
+    "(142,ARRAY[6.9,3.1,5.1,2.3],'Iris-virginica'),\n",
+    "(143,ARRAY[5.8,2.7,5.1,1.9],'Iris-virginica'),\n",
+    "(144,ARRAY[6.8,3.2,5.9,2.3],'Iris-virginica'),\n",
+    "(145,ARRAY[6.7,3.3,5.7,2.5],'Iris-virginica'),\n",
+    "(146,ARRAY[6.7,3.0,5.2,2.3],'Iris-virginica'),\n",
+    "(147,ARRAY[6.3,2.5,5.0,1.9],'Iris-virginica'),\n",
+    "(148,ARRAY[6.5,3.0,5.2,2.0],'Iris-virginica'),\n",
+    "(149,ARRAY[6.2,3.4,5.4,2.3],'Iris-virginica'),\n",
+    "(150,ARRAY[5.9,3.0,5.1,1.8],'Iris-virginica');\n",
+    "\n",
+    "SELECT * FROM iris_data ORDER BY id;"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Create a test/validation dataset from the training data"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Done.\n",
+      "1 rows affected.\n",
+      "1 rows affected.\n",
+      "1 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <tr>\n",
+       "        <th>count</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>120</td>\n",
+       "    </tr>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[(120L,)]"
+      ]
+     },
+     "execution_count": 5,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "DROP TABLE IF EXISTS iris_train, iris_test;\n",
+    "\n",
+    "-- Set seed so results are reproducible\n",
+    "SELECT setseed(0);\n",
+    "\n",
+    "SELECT madlib.train_test_split('iris_data',     -- Source table\n",
+    "                               'iris',          -- Output table root name\n",
+    "                                0.8,            -- Train proportion\n",
+    "                                NULL,           -- Test proportion (0.2)\n",
+    "                                NULL,           -- Strata definition\n",
+    "                                NULL,           -- Output all columns\n",
+    "                                NULL,           -- Sample without replacement\n",
+    "                                TRUE            -- Separate output tables\n",
+    "                              );\n",
+    "\n",
+    "SELECT COUNT(*) FROM iris_train;"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "<a id=\"pp\"></a>\n",
+    "# 2. Call preprocessor for deep learning\n",
+    "Training dataset (uses training preprocessor):"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Done.\n",
+      "1 rows affected.\n",
+      "1 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <tr>\n",
+       "        <th>source_table</th>\n",
+       "        <th>output_table</th>\n",
+       "        <th>dependent_varname</th>\n",
+       "        <th>independent_varname</th>\n",
+       "        <th>dependent_vartype</th>\n",
+       "        <th>class_text_class_values</th>\n",
+       "        <th>buffer_size</th>\n",
+       "        <th>normalizing_const</th>\n",
+       "        <th>num_classes</th>\n",
+       "        <th>distribution_rules</th>\n",
+       "        <th>__internal_gpu_config__</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>iris_train</td>\n",
+       "        <td>iris_train_packed</td>\n",
+       "        <td>[u'class_text']</td>\n",
+       "        <td>[u'attributes']</td>\n",
+       "        <td>[u'character varying']</td>\n",
+       "        <td>[u'Iris-setosa', u'Iris-versicolor', u'Iris-virginica']</td>\n",
+       "        <td>60</td>\n",
+       "        <td>1.0</td>\n",
+       "        <td>[3]</td>\n",
+       "        <td>all_segments</td>\n",
+       "        <td>all_segments</td>\n",
+       "    </tr>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[(u'iris_train', u'iris_train_packed', [u'class_text'], [u'attributes'], [u'character varying'], [u'Iris-setosa', u'Iris-versicolor', u'Iris-virginica'], 60, 1.0, [3], 'all_segments', 'all_segments')]"
+      ]
+     },
+     "execution_count": 6,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "DROP TABLE IF EXISTS iris_train_packed, iris_train_packed_summary;\n",
+    "\n",
+    "SELECT madlib.training_preprocessor_dl('iris_train',         -- Source table\n",
+    "                                       'iris_train_packed',  -- Output table\n",
+    "                                       'class_text',         -- Dependent variable\n",
+    "                                       'attributes'          -- Independent variable\n",
+    "                                        );\n",
+    "\n",
+    "SELECT * FROM iris_train_packed_summary;"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Validation dataset (uses validation preprocessor):"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Done.\n",
+      "1 rows affected.\n",
+      "1 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <tr>\n",
+       "        <th>source_table</th>\n",
+       "        <th>output_table</th>\n",
+       "        <th>dependent_varname</th>\n",
+       "        <th>independent_varname</th>\n",
+       "        <th>dependent_vartype</th>\n",
+       "        <th>class_text_class_values</th>\n",
+       "        <th>buffer_size</th>\n",
+       "        <th>normalizing_const</th>\n",
+       "        <th>num_classes</th>\n",
+       "        <th>distribution_rules</th>\n",
+       "        <th>__internal_gpu_config__</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>iris_test</td>\n",
+       "        <td>iris_test_packed</td>\n",
+       "        <td>[u'class_text']</td>\n",
+       "        <td>[u'attributes']</td>\n",
+       "        <td>[u'character varying']</td>\n",
+       "        <td>[u'Iris-setosa', u'Iris-versicolor', u'Iris-virginica']</td>\n",
+       "        <td>15</td>\n",
+       "        <td>1.0</td>\n",
+       "        <td>[3]</td>\n",
+       "        <td>all_segments</td>\n",
+       "        <td>all_segments</td>\n",
+       "    </tr>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[(u'iris_test', u'iris_test_packed', [u'class_text'], [u'attributes'], [u'character varying'], [u'Iris-setosa', u'Iris-versicolor', u'Iris-virginica'], 15, 1.0, [3], 'all_segments', 'all_segments')]"
+      ]
+     },
+     "execution_count": 7,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "DROP TABLE IF EXISTS iris_test_packed, iris_test_packed_summary;\n",
+    "\n",
+    "SELECT madlib.validation_preprocessor_dl('iris_test',          -- Source table\n",
+    "                                         'iris_test_packed',   -- Output table\n",
+    "                                         'class_text',         -- Dependent variable\n",
+    "                                         'attributes',         -- Independent variable\n",
+    "                                         'iris_train_packed'   -- From training preprocessor step\n",
+    "                                          ); \n",
+    "\n",
+    "SELECT * FROM iris_test_packed_summary;"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "<a id=\"load\"></a>\n",
+    "# 3. Define and load model architecture\n",
+    "Import Keras libraries"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from tensorflow import keras\n",
+    "from tensorflow.keras.models import Sequential\n",
+    "from tensorflow.keras.layers import Dense"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Define model architecture"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WARNING:tensorflow:From /Users/fmcquillan/Library/Python/2.7/lib/python/site-packages/tensorflow/python/ops/init_ops.py:1251: calling __init__ (from tensorflow.python.ops.init_ops) with dtype is deprecated and will be removed in a future version.\n",
+      "Instructions for updating:\n",
+      "Call initializer instance with the dtype argument instead of passing it to the constructor\n",
+      "Model: \"sequential\"\n",
+      "_________________________________________________________________\n",
+      "Layer (type)                 Output Shape              Param #   \n",
+      "=================================================================\n",
+      "dense (Dense)                (None, 10)                50        \n",
+      "_________________________________________________________________\n",
+      "dense_1 (Dense)              (None, 10)                110       \n",
+      "_________________________________________________________________\n",
+      "dense_2 (Dense)              (None, 3)                 33        \n",
+      "=================================================================\n",
+      "Total params: 193\n",
+      "Trainable params: 193\n",
+      "Non-trainable params: 0\n",
+      "_________________________________________________________________\n"
+     ]
+    }
+   ],
+   "source": [
+    "model_simple = Sequential()\n",
+    "model_simple.add(Dense(10, activation='relu', input_shape=(4,)))\n",
+    "model_simple.add(Dense(10, activation='relu'))\n",
+    "model_simple.add(Dense(3, activation='softmax'))\n",
+    "    \n",
+    "model_simple.summary();"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'{\"class_name\": \"Sequential\", \"keras_version\": \"2.2.4-tf\", \"config\": {\"layers\": [{\"class_name\": \"Dense\", \"config\": {\"kernel_initializer\": {\"class_name\": \"GlorotUniform\", \"config\": {\"dtype\": \"float32\", \"seed\": null}}, \"name\": \"dense\", \"kernel_constraint\": null, \"bias_regularizer\": null, \"bias_constraint\": null, \"dtype\": \"float32\", \"activation\": \"relu\", \"trainable\": true, \"kernel_regularizer\": null, \"bias_initializer\": {\"clas [...]
+      ]
+     },
+     "execution_count": 10,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "model_simple.to_json()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Load into model architecture table"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 11,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Done.\n",
+      "1 rows affected.\n",
+      "1 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <tr>\n",
+       "        <th>model_id</th>\n",
+       "        <th>model_arch</th>\n",
+       "        <th>name</th>\n",
+       "        <th>description</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>1</td>\n",
+       "        <td>{u'class_name': u'Sequential', u'keras_version': u'2.1.6', u'config': [{u'class_name': u'Dense', u'config': {u'kernel_initializer': {u'class_name': u'VarianceScaling', u'config': {u'distribution': u'uniform', u'scale': 1.0, u'seed': None, u'mode': u'fan_avg'}}, u'name': u'dense_1', u'kernel_constraint': None, u'bias_regularizer': None, u'bias_constraint': None, u'dtype': u'float32', u'activation': u'relu', u'trainable': True, u'kernel_regularizer': None, u'bias_initia [...]
+       "        <td>Sophie</td>\n",
+       "        <td>A simple model</td>\n",
+       "    </tr>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[(1, {u'class_name': u'Sequential', u'keras_version': u'2.1.6', u'config': [{u'class_name': u'Dense', u'config': {u'kernel_initializer': {u'class_name': u' ... (1340 characters truncated) ... s_initializer': {u'class_name': u'Zeros', u'config': {}}, u'units': 3, u'use_bias': True, u'activity_regularizer': None}}], u'backend': u'tensorflow'}, u'Sophie', u'A simple model')]"
+      ]
+     },
+     "execution_count": 11,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "DROP TABLE IF EXISTS model_arch_library;\n",
+    "SELECT madlib.load_keras_model('model_arch_library',  -- Output table,\n",
+    "                               \n",
+    "$$\n",
+    "{\"class_name\": \"Sequential\", \"keras_version\": \"2.1.6\", \"config\": [{\"class_name\": \"Dense\", \"config\": {\"kernel_initializer\": {\"class_name\": \"VarianceScaling\", \"config\": {\"distribution\": \"uniform\", \"scale\": 1.0, \"seed\": null, \"mode\": \"fan_avg\"}}, \"name\": \"dense_1\", \"kernel_constraint\": null, \"bias_regularizer\": null, \"bias_constraint\": null, \"dtype\": \"float32\", \"activation\": \"relu\", \"trainable\": true, \"kernel_regularizer\": null, [...]
+    "$$\n",
+    "::json,         -- JSON blob\n",
+    "                               NULL,                  -- Weights\n",
+    "                               'Sophie',              -- Name\n",
+    "                               'A simple model'       -- Descr\n",
+    ");\n",
+    "\n",
+    "SELECT model_id, model_arch, name, description FROM model_arch_library ORDER BY model_id;"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "<a id=\"train\"></a>\n",
+    "# 4.  Train\n",
+    "Train the model:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 12,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Done.\n",
+      "1 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <tr>\n",
+       "        <th>madlib_keras_fit</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td></td>\n",
+       "    </tr>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[('',)]"
+      ]
+     },
+     "execution_count": 12,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "DROP TABLE IF EXISTS iris_model, iris_model_summary;\n",
+    "\n",
+    "SELECT madlib.madlib_keras_fit('iris_train_packed',   -- source table\n",
+    "                               'iris_model',          -- model output table\n",
+    "                               'model_arch_library',  -- model arch table\n",
+    "                                1,                    -- model arch id\n",
+    "                                $$ loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'] $$,  -- compile_params\n",
+    "                                $$ batch_size=5, epochs=3 $$,  -- fit_params\n",
+    "                                10                    -- num_iterations\n",
+    "                              );"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "View the model summary:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 13,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "1 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <tr>\n",
+       "        <th>source_table</th>\n",
+       "        <th>model</th>\n",
+       "        <th>dependent_varname</th>\n",
+       "        <th>independent_varname</th>\n",
+       "        <th>model_arch_table</th>\n",
+       "        <th>model_id</th>\n",
+       "        <th>compile_params</th>\n",
+       "        <th>fit_params</th>\n",
+       "        <th>num_iterations</th>\n",
+       "        <th>validation_table</th>\n",
+       "        <th>object_table</th>\n",
+       "        <th>metrics_compute_frequency</th>\n",
+       "        <th>name</th>\n",
+       "        <th>description</th>\n",
+       "        <th>model_type</th>\n",
+       "        <th>model_size</th>\n",
+       "        <th>start_training_time</th>\n",
+       "        <th>end_training_time</th>\n",
+       "        <th>metrics_elapsed_time</th>\n",
+       "        <th>madlib_version</th>\n",
+       "        <th>num_classes</th>\n",
+       "        <th>dependent_vartype</th>\n",
+       "        <th>normalizing_const</th>\n",
+       "        <th>metrics_type</th>\n",
+       "        <th>loss_type</th>\n",
+       "        <th>training_metrics_final</th>\n",
+       "        <th>training_loss_final</th>\n",
+       "        <th>training_metrics</th>\n",
+       "        <th>training_loss</th>\n",
+       "        <th>validation_metrics_final</th>\n",
+       "        <th>validation_loss_final</th>\n",
+       "        <th>validation_metrics</th>\n",
+       "        <th>validation_loss</th>\n",
+       "        <th>metrics_iters</th>\n",
+       "        <th>class_text_class_values</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>iris_train_packed</td>\n",
+       "        <td>iris_model</td>\n",
+       "        <td>[u'class_text']</td>\n",
+       "        <td>[u'attributes']</td>\n",
+       "        <td>model_arch_library</td>\n",
+       "        <td>1</td>\n",
+       "        <td> loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'] </td>\n",
+       "        <td> batch_size=5, epochs=3 </td>\n",
+       "        <td>10</td>\n",
+       "        <td>None</td>\n",
+       "        <td>None</td>\n",
+       "        <td>10</td>\n",
+       "        <td>None</td>\n",
+       "        <td>None</td>\n",
+       "        <td>madlib_keras</td>\n",
+       "        <td>0.7900390625</td>\n",
+       "        <td>2021-04-20 17:31:39.803971</td>\n",
+       "        <td>2021-04-20 17:31:43.238084</td>\n",
+       "        <td>[3.43408703804016]</td>\n",
+       "        <td>1.18.0</td>\n",
+       "        <td>[3]</td>\n",
+       "        <td>[u'character varying']</td>\n",
+       "        <td>1.0</td>\n",
+       "        <td>[u'accuracy']</td>\n",
+       "        <td>categorical_crossentropy</td>\n",
+       "        <td>0.649999976158</td>\n",
+       "        <td>0.614931106567</td>\n",
+       "        <td>[0.649999976158142]</td>\n",
+       "        <td>[0.614931106567383]</td>\n",
+       "        <td>None</td>\n",
+       "        <td>None</td>\n",
+       "        <td>None</td>\n",
+       "        <td>None</td>\n",
+       "        <td>[10]</td>\n",
+       "        <td>[u'Iris-setosa', u'Iris-versicolor', u'Iris-virginica']</td>\n",
+       "    </tr>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[(u'iris_train_packed', u'iris_model', [u'class_text'], [u'attributes'], u'model_arch_library', 1, u\" loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'] \", u' batch_size=5, epochs=3 ', 10, None, None, 10, None, None, u'madlib_keras', 0.7900390625, datetime.datetime(2021, 4, 20, 17, 31, 39, 803971), datetime.datetime(2021, 4, 20, 17, 31, 43, 238084), [3.43408703804016], u'1.18.0', [3], [u'character varying'], 1.0, [u'accuracy'], u'categorical_crossentropy',  [...]
+      ]
+     },
+     "execution_count": 13,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "SELECT * FROM iris_model_summary;"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "<a id=\"eval\"></a>\n",
+    "# 5. Evaluate\n",
+    "\n",
+    "Now run evaluate using model we built above:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 14,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Done.\n",
+      "1 rows affected.\n",
+      "1 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <tr>\n",
+       "        <th>loss</th>\n",
+       "        <th>metric</th>\n",
+       "        <th>metrics_type</th>\n",
+       "        <th>loss_type</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>0.586186826229</td>\n",
+       "        <td>0.733333349228</td>\n",
+       "        <td>[u'accuracy']</td>\n",
+       "        <td>categorical_crossentropy</td>\n",
+       "    </tr>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[(0.586186826229095, 0.733333349227905, [u'accuracy'], u'categorical_crossentropy')]"
+      ]
+     },
+     "execution_count": 14,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "DROP TABLE IF EXISTS iris_validate;\n",
+    "\n",
+    "SELECT madlib.madlib_keras_evaluate('iris_model',       -- model\n",
+    "                                   'iris_test_packed',  -- test table\n",
+    "                                   'iris_validate'      -- output table\n",
+    "                                   );\n",
+    "\n",
+    "SELECT * FROM iris_validate;"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "<a id=\"pred\"></a>\n",
+    "# 6. Predict\n",
+    "\n",
+    "Now predict using model we built.  We will use the validation data set for prediction as well, which is not usual but serves to show the syntax. The prediction is in the estimated_class_text column:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 15,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Done.\n",
+      "1 rows affected.\n",
+      "90 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <tr>\n",
+       "        <th>id</th>\n",
+       "        <th>class_name</th>\n",
+       "        <th>class_value</th>\n",
+       "        <th>prob</th>\n",
+       "        <th>rank</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>4</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.7655876</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>4</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.117251426</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>4</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.117160924</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>12</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.777693</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>12</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.11174332</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>12</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.11056366</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>17</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.87118816</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>17</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.06779073</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>17</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.061021086</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>19</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.8537019</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>19</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.076219656</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>19</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.07007849</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>22</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.818132</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>22</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.09305505</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>22</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.088813</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>27</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.78821623</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>27</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.10692356</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>27</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.104860194</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>42</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.76720774</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>42</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.11651646</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>42</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.11627576</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>48</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.78366095</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>48</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.10901356</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>48</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.10732544</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>50</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.8270906</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>50</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.08885179</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>50</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.0840576</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>59</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.4274588</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>59</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.34008056</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>59</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.23246065</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>60</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.46213812</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>60</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.3217801</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>60</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.2160818</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>71</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.57535416</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>71</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.24261434</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>71</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.18203148</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>75</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.4074172</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>75</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.32788026</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>75</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.26470247</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>84</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.5691922</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>84</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.2353058</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>84</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.195502</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>86</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.5047672</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>86</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.3008239</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>86</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.19440888</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>96</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.44096252</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>96</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.33867082</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>96</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.22036667</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>100</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.4371442</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>100</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.34052446</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>100</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.2223314</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>103</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.62920624</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>103</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.2035913</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>103</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.16720246</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>111</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.576878</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>111</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.2464561</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>111</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.17666587</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>119</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.68757075</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>119</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.15730274</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>119</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.15512651</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>120</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.5293983</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>120</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.25779822</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>120</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.21280344</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>123</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.65714884</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>123</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.17724898</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>123</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.16560222</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>125</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.6504005</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>125</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.19055067</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>125</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.15904878</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>126</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.6051371</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>126</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.21824862</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>126</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.17661428</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>128</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.5626038</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>128</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.2504287</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>128</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.18696755</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>133</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.65727943</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>133</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.18036948</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>133</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.16235106</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>136</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.6176896</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>136</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.21746697</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>136</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.1648434</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>141</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.66387534</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>141</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.18414603</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>141</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.15197858</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>145</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.6796988</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>145</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.17357507</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>145</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.14672612</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>149</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.6485438</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>149</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.18954389</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>149</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.16191238</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[(4, u'class_text', u'Iris-setosa', 0.7655876, 1),\n",
+       " (4, u'class_text', u'Iris-virginica', 0.117251426, 2),\n",
+       " (4, u'class_text', u'Iris-versicolor', 0.117160924, 3),\n",
+       " (12, u'class_text', u'Iris-setosa', 0.777693, 1),\n",
+       " (12, u'class_text', u'Iris-virginica', 0.11174332, 2),\n",
+       " (12, u'class_text', u'Iris-versicolor', 0.11056366, 3),\n",
+       " (17, u'class_text', u'Iris-setosa', 0.87118816, 1),\n",
+       " (17, u'class_text', u'Iris-virginica', 0.06779073, 2),\n",
+       " (17, u'class_text', u'Iris-versicolor', 0.061021086, 3),\n",
+       " (19, u'class_text', u'Iris-setosa', 0.8537019, 1),\n",
+       " (19, u'class_text', u'Iris-virginica', 0.076219656, 2),\n",
+       " (19, u'class_text', u'Iris-versicolor', 0.07007849, 3),\n",
+       " (22, u'class_text', u'Iris-setosa', 0.818132, 1),\n",
+       " (22, u'class_text', u'Iris-virginica', 0.09305505, 2),\n",
+       " (22, u'class_text', u'Iris-versicolor', 0.088813, 3),\n",
+       " (27, u'class_text', u'Iris-setosa', 0.78821623, 1),\n",
+       " (27, u'class_text', u'Iris-virginica', 0.10692356, 2),\n",
+       " (27, u'class_text', u'Iris-versicolor', 0.104860194, 3),\n",
+       " (42, u'class_text', u'Iris-setosa', 0.76720774, 1),\n",
+       " (42, u'class_text', u'Iris-virginica', 0.11651646, 2),\n",
+       " (42, u'class_text', u'Iris-versicolor', 0.11627576, 3),\n",
+       " (48, u'class_text', u'Iris-setosa', 0.78366095, 1),\n",
+       " (48, u'class_text', u'Iris-virginica', 0.10901356, 2),\n",
+       " (48, u'class_text', u'Iris-versicolor', 0.10732544, 3),\n",
+       " (50, u'class_text', u'Iris-setosa', 0.8270906, 1),\n",
+       " (50, u'class_text', u'Iris-virginica', 0.08885179, 2),\n",
+       " (50, u'class_text', u'Iris-versicolor', 0.0840576, 3),\n",
+       " (59, u'class_text', u'Iris-virginica', 0.4274588, 1),\n",
+       " (59, u'class_text', u'Iris-versicolor', 0.34008056, 2),\n",
+       " (59, u'class_text', u'Iris-setosa', 0.23246065, 3),\n",
+       " (60, u'class_text', u'Iris-virginica', 0.46213812, 1),\n",
+       " (60, u'class_text', u'Iris-versicolor', 0.3217801, 2),\n",
+       " (60, u'class_text', u'Iris-setosa', 0.2160818, 3),\n",
+       " (71, u'class_text', u'Iris-virginica', 0.57535416, 1),\n",
+       " (71, u'class_text', u'Iris-versicolor', 0.24261434, 2),\n",
+       " (71, u'class_text', u'Iris-setosa', 0.18203148, 3),\n",
+       " (75, u'class_text', u'Iris-virginica', 0.4074172, 1),\n",
+       " (75, u'class_text', u'Iris-versicolor', 0.32788026, 2),\n",
+       " (75, u'class_text', u'Iris-setosa', 0.26470247, 3),\n",
+       " (84, u'class_text', u'Iris-virginica', 0.5691922, 1),\n",
+       " (84, u'class_text', u'Iris-versicolor', 0.2353058, 2),\n",
+       " (84, u'class_text', u'Iris-setosa', 0.195502, 3),\n",
+       " (86, u'class_text', u'Iris-virginica', 0.5047672, 1),\n",
+       " (86, u'class_text', u'Iris-versicolor', 0.3008239, 2),\n",
+       " (86, u'class_text', u'Iris-setosa', 0.19440888, 3),\n",
+       " (96, u'class_text', u'Iris-virginica', 0.44096252, 1),\n",
+       " (96, u'class_text', u'Iris-versicolor', 0.33867082, 2),\n",
+       " (96, u'class_text', u'Iris-setosa', 0.22036667, 3),\n",
+       " (100, u'class_text', u'Iris-virginica', 0.4371442, 1),\n",
+       " (100, u'class_text', u'Iris-versicolor', 0.34052446, 2),\n",
+       " (100, u'class_text', u'Iris-setosa', 0.2223314, 3),\n",
+       " (103, u'class_text', u'Iris-virginica', 0.62920624, 1),\n",
+       " (103, u'class_text', u'Iris-versicolor', 0.2035913, 2),\n",
+       " (103, u'class_text', u'Iris-setosa', 0.16720246, 3),\n",
+       " (111, u'class_text', u'Iris-virginica', 0.576878, 1),\n",
+       " (111, u'class_text', u'Iris-versicolor', 0.2464561, 2),\n",
+       " (111, u'class_text', u'Iris-setosa', 0.17666587, 3),\n",
+       " (119, u'class_text', u'Iris-virginica', 0.68757075, 1),\n",
+       " (119, u'class_text', u'Iris-setosa', 0.15730274, 2),\n",
+       " (119, u'class_text', u'Iris-versicolor', 0.15512651, 3),\n",
+       " (120, u'class_text', u'Iris-virginica', 0.5293983, 1),\n",
+       " (120, u'class_text', u'Iris-versicolor', 0.25779822, 2),\n",
+       " (120, u'class_text', u'Iris-setosa', 0.21280344, 3),\n",
+       " (123, u'class_text', u'Iris-virginica', 0.65714884, 1),\n",
+       " (123, u'class_text', u'Iris-versicolor', 0.17724898, 2),\n",
+       " (123, u'class_text', u'Iris-setosa', 0.16560222, 3),\n",
+       " (125, u'class_text', u'Iris-virginica', 0.6504005, 1),\n",
+       " (125, u'class_text', u'Iris-versicolor', 0.19055067, 2),\n",
+       " (125, u'class_text', u'Iris-setosa', 0.15904878, 3),\n",
+       " (126, u'class_text', u'Iris-virginica', 0.6051371, 1),\n",
+       " (126, u'class_text', u'Iris-versicolor', 0.21824862, 2),\n",
+       " (126, u'class_text', u'Iris-setosa', 0.17661428, 3),\n",
+       " (128, u'class_text', u'Iris-virginica', 0.5626038, 1),\n",
+       " (128, u'class_text', u'Iris-versicolor', 0.2504287, 2),\n",
+       " (128, u'class_text', u'Iris-setosa', 0.18696755, 3),\n",
+       " (133, u'class_text', u'Iris-virginica', 0.65727943, 1),\n",
+       " (133, u'class_text', u'Iris-versicolor', 0.18036948, 2),\n",
+       " (133, u'class_text', u'Iris-setosa', 0.16235106, 3),\n",
+       " (136, u'class_text', u'Iris-virginica', 0.6176896, 1),\n",
+       " (136, u'class_text', u'Iris-versicolor', 0.21746697, 2),\n",
+       " (136, u'class_text', u'Iris-setosa', 0.1648434, 3),\n",
+       " (141, u'class_text', u'Iris-virginica', 0.66387534, 1),\n",
+       " (141, u'class_text', u'Iris-versicolor', 0.18414603, 2),\n",
+       " (141, u'class_text', u'Iris-setosa', 0.15197858, 3),\n",
+       " (145, u'class_text', u'Iris-virginica', 0.6796988, 1),\n",
+       " (145, u'class_text', u'Iris-versicolor', 0.17357507, 2),\n",
+       " (145, u'class_text', u'Iris-setosa', 0.14672612, 3),\n",
+       " (149, u'class_text', u'Iris-virginica', 0.6485438, 1),\n",
+       " (149, u'class_text', u'Iris-versicolor', 0.18954389, 2),\n",
+       " (149, u'class_text', u'Iris-setosa', 0.16191238, 3)]"
+      ]
+     },
+     "execution_count": 15,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "DROP TABLE IF EXISTS iris_predict;\n",
+    "\n",
+    "SELECT madlib.madlib_keras_predict('iris_model', -- model\n",
+    "                                   'iris_test',  -- test_table\n",
+    "                                   'id',  -- id column\n",
+    "                                   'attributes', -- independent var\n",
+    "                                   'iris_predict'  -- output table\n",
+    "                                   );\n",
+    "\n",
+    "SELECT * FROM iris_predict ORDER BY id, rank;"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Count missclassifications"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 16,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "1 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <tr>\n",
+       "        <th>count</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>8</td>\n",
+       "    </tr>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[(8L,)]"
+      ]
+     },
+     "execution_count": 16,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "SELECT COUNT(*) FROM iris_predict JOIN iris_test USING (id)\n",
+    "WHERE iris_predict.class_value != iris_test.class_text AND iris_predict.rank = 1;"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Percent missclassifications"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 17,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "1 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <tr>\n",
+       "        <th>test_accuracy_percent</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>73.33</td>\n",
+       "    </tr>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[(Decimal('73.33'),)]"
+      ]
+     },
+     "execution_count": 17,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "SELECT round(count(*)*100/(150*0.2),2) as test_accuracy_percent from\n",
+    "    (select iris_test.class_text as actual, iris_predict.class_value as estimated\n",
+    "     from iris_predict inner join iris_test\n",
+    "     on iris_test.id=iris_predict.id where iris_predict.rank = 1) q\n",
+    "WHERE q.actual=q.estimated;"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "<a id=\"pred_byom\"></a>\n",
+    "# 7. Predict BYOM\n",
+    "The predict BYOM function allows you to do inference on models that have not been trained on MADlib, but rather imported from elsewhere.  \n",
+    "\n",
+    "We will use the validation dataset for prediction as well, which is not usual but serves to show the syntax.\n",
+    "\n",
+    "See load_keras_model()\n",
+    "http://madlib.apache.org/docs/latest/group__grp__keras__model__arch.html\n",
+    "for details on how to load the model architecture and weights.  In this example we will use weights we already have:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 18,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "1 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "[]"
+      ]
+     },
+     "execution_count": 18,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "UPDATE model_arch_library \n",
+    "SET model_weights = iris_model.model_weights \n",
+    "FROM iris_model \n",
+    "WHERE model_arch_library.model_id = 1;"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Now train using a model from the model architecture table directly without referencing the model table from the MADlib training.  \n",
+    "\n",
+    "Note that if you specify the class values parameter as we do below, it must reflect how the dependent variable was 1-hot encoded for training.  In this example the 'training_preprocessor_dl()' in Step 2 above encoded in the order {'Iris-setosa', 'Iris-versicolor', 'Iris-virginica'} so this is the order we pass in the parameter.  If we accidently picked another order that did not match the 1-hot encoding, the predictions would be wrong."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 19,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Done.\n",
+      "1 rows affected.\n",
+      "30 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <tr>\n",
+       "        <th>id</th>\n",
+       "        <th>class_name</th>\n",
+       "        <th>class_value</th>\n",
+       "        <th>prob</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>4</td>\n",
+       "        <td>dependent_var</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.7655876</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>12</td>\n",
+       "        <td>dependent_var</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.777693</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>17</td>\n",
+       "        <td>dependent_var</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.87118816</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>19</td>\n",
+       "        <td>dependent_var</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.8537019</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>22</td>\n",
+       "        <td>dependent_var</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.818132</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>27</td>\n",
+       "        <td>dependent_var</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.78821623</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>42</td>\n",
+       "        <td>dependent_var</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.76720774</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>48</td>\n",
+       "        <td>dependent_var</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.78366095</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>50</td>\n",
+       "        <td>dependent_var</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.8270906</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>59</td>\n",
+       "        <td>dependent_var</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.4274588</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>60</td>\n",
+       "        <td>dependent_var</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.46213812</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>71</td>\n",
+       "        <td>dependent_var</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.57535416</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>75</td>\n",
+       "        <td>dependent_var</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.4074172</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>84</td>\n",
+       "        <td>dependent_var</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.5691922</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>86</td>\n",
+       "        <td>dependent_var</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.5047672</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>96</td>\n",
+       "        <td>dependent_var</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.44096252</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>100</td>\n",
+       "        <td>dependent_var</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.4371442</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>103</td>\n",
+       "        <td>dependent_var</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.62920624</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>111</td>\n",
+       "        <td>dependent_var</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.576878</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>119</td>\n",
+       "        <td>dependent_var</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.68757075</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>120</td>\n",
+       "        <td>dependent_var</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.5293983</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>123</td>\n",
+       "        <td>dependent_var</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.65714884</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>125</td>\n",
+       "        <td>dependent_var</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.6504005</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>126</td>\n",
+       "        <td>dependent_var</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.6051371</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>128</td>\n",
+       "        <td>dependent_var</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.5626038</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>133</td>\n",
+       "        <td>dependent_var</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.65727943</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>136</td>\n",
+       "        <td>dependent_var</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.6176896</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>141</td>\n",
+       "        <td>dependent_var</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.66387534</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>145</td>\n",
+       "        <td>dependent_var</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.6796988</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>149</td>\n",
+       "        <td>dependent_var</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.6485438</td>\n",
+       "    </tr>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[(4, u'dependent_var', u'Iris-setosa', 0.7655876),\n",
+       " (12, u'dependent_var', u'Iris-setosa', 0.777693),\n",
+       " (17, u'dependent_var', u'Iris-setosa', 0.87118816),\n",
+       " (19, u'dependent_var', u'Iris-setosa', 0.8537019),\n",
+       " (22, u'dependent_var', u'Iris-setosa', 0.818132),\n",
+       " (27, u'dependent_var', u'Iris-setosa', 0.78821623),\n",
+       " (42, u'dependent_var', u'Iris-setosa', 0.76720774),\n",
+       " (48, u'dependent_var', u'Iris-setosa', 0.78366095),\n",
+       " (50, u'dependent_var', u'Iris-setosa', 0.8270906),\n",
+       " (59, u'dependent_var', u'Iris-virginica', 0.4274588),\n",
+       " (60, u'dependent_var', u'Iris-virginica', 0.46213812),\n",
+       " (71, u'dependent_var', u'Iris-virginica', 0.57535416),\n",
+       " (75, u'dependent_var', u'Iris-virginica', 0.4074172),\n",
+       " (84, u'dependent_var', u'Iris-virginica', 0.5691922),\n",
+       " (86, u'dependent_var', u'Iris-virginica', 0.5047672),\n",
+       " (96, u'dependent_var', u'Iris-virginica', 0.44096252),\n",
+       " (100, u'dependent_var', u'Iris-virginica', 0.4371442),\n",
+       " (103, u'dependent_var', u'Iris-virginica', 0.62920624),\n",
+       " (111, u'dependent_var', u'Iris-virginica', 0.576878),\n",
+       " (119, u'dependent_var', u'Iris-virginica', 0.68757075),\n",
+       " (120, u'dependent_var', u'Iris-virginica', 0.5293983),\n",
+       " (123, u'dependent_var', u'Iris-virginica', 0.65714884),\n",
+       " (125, u'dependent_var', u'Iris-virginica', 0.6504005),\n",
+       " (126, u'dependent_var', u'Iris-virginica', 0.6051371),\n",
+       " (128, u'dependent_var', u'Iris-virginica', 0.5626038),\n",
+       " (133, u'dependent_var', u'Iris-virginica', 0.65727943),\n",
+       " (136, u'dependent_var', u'Iris-virginica', 0.6176896),\n",
+       " (141, u'dependent_var', u'Iris-virginica', 0.66387534),\n",
+       " (145, u'dependent_var', u'Iris-virginica', 0.6796988),\n",
+       " (149, u'dependent_var', u'Iris-virginica', 0.6485438)]"
+      ]
+     },
+     "execution_count": 19,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "DROP TABLE IF EXISTS iris_predict_byom;\n",
+    "\n",
+    "SELECT madlib.madlib_keras_predict_byom('model_arch_library',  -- model arch table\n",
+    "                                         1,                    -- model arch id\n",
+    "                                        'iris_test',           -- test_table\n",
+    "                                        'id',                  -- id column\n",
+    "                                        'attributes',          -- independent var\n",
+    "                                        'iris_predict_byom',   -- output table\n",
+    "                                        'response',            -- prediction type\n",
+    "                                         FALSE,                -- use GPUs\n",
+    "                                         ARRAY[ARRAY['Iris-setosa', 'Iris-versicolor', 'Iris-virginica']], -- class values\n",
+    "                                         1.0                   -- normalizing const\n",
+    "                                   );\n",
+    "\n",
+    "SELECT * FROM iris_predict_byom ORDER BY id;"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Count missclassifications:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 20,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "1 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <tr>\n",
+       "        <th>count</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>8</td>\n",
+       "    </tr>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[(8L,)]"
+      ]
+     },
+     "execution_count": 20,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "SELECT COUNT(*) FROM iris_predict_byom JOIN iris_test USING (id)\n",
+    "WHERE iris_predict_byom.class_value != iris_test.class_text;"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Percent missclassifications:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 21,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "1 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <tr>\n",
+       "        <th>test_accuracy_percent</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>73.33</td>\n",
+       "    </tr>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[(Decimal('73.33'),)]"
+      ]
+     },
+     "execution_count": 21,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "SELECT round(count(*)*100/(150*0.2),2) as test_accuracy_percent from\n",
+    "    (select iris_test.class_text as actual, iris_predict_byom.class_value as estimated\n",
+    "     from iris_predict_byom inner join iris_test\n",
+    "     on iris_test.id=iris_predict_byom.id) q\n",
+    "WHERE q.actual=q.estimated;"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "<a id=\"class2\"></a>\n",
+    "# Classification with Other Parameters\n",
+    "\n",
+    "<a id=\"val_dataset\"></a>\n",
+    "# 1.  Validation dataset\n",
+    "Now use a validation dataset and compute metrics every 2nd iteration using the 'metrics_compute_frequency' parameter.  This can help reduce run time if you do not need metrics computed at every iteration."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 22,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Done.\n",
+      "1 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <tr>\n",
+       "        <th>madlib_keras_fit</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td></td>\n",
+       "    </tr>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[('',)]"
+      ]
+     },
+     "execution_count": 22,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "DROP TABLE IF EXISTS iris_model, iris_model_summary;\n",
+    "\n",
+    "SELECT madlib.madlib_keras_fit('iris_train_packed',   -- source table\n",
+    "                               'iris_model',          -- model output table\n",
+    "                               'model_arch_library',  -- model arch table\n",
+    "                                1,                    -- model arch id\n",
+    "                                $$ loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'] $$,  -- compile_params\n",
+    "                                $$ batch_size=5, epochs=3 $$,  -- fit_params\n",
+    "                                10,                   -- num_iterations\n",
+    "                                FALSE,                -- use GPUs\n",
+    "                                'iris_test_packed',   -- validation dataset\n",
+    "                                2,                    -- metrics compute frequency\n",
+    "                                FALSE,                -- warm start\n",
+    "                               'Sophie L.',           -- name\n",
+    "                               'Simple MLP for iris dataset'  -- description\n",
+    "                              );"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "View the model summary:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 23,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "1 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <tr>\n",
+       "        <th>source_table</th>\n",
+       "        <th>model</th>\n",
+       "        <th>dependent_varname</th>\n",
+       "        <th>independent_varname</th>\n",
+       "        <th>model_arch_table</th>\n",
+       "        <th>model_id</th>\n",
+       "        <th>compile_params</th>\n",
+       "        <th>fit_params</th>\n",
+       "        <th>num_iterations</th>\n",
+       "        <th>validation_table</th>\n",
+       "        <th>object_table</th>\n",
+       "        <th>metrics_compute_frequency</th>\n",
+       "        <th>name</th>\n",
+       "        <th>description</th>\n",
+       "        <th>model_type</th>\n",
+       "        <th>model_size</th>\n",
+       "        <th>start_training_time</th>\n",
+       "        <th>end_training_time</th>\n",
+       "        <th>metrics_elapsed_time</th>\n",
+       "        <th>madlib_version</th>\n",
+       "        <th>num_classes</th>\n",
+       "        <th>dependent_vartype</th>\n",
+       "        <th>normalizing_const</th>\n",
+       "        <th>metrics_type</th>\n",
+       "        <th>loss_type</th>\n",
+       "        <th>training_metrics_final</th>\n",
+       "        <th>training_loss_final</th>\n",
+       "        <th>training_metrics</th>\n",
+       "        <th>training_loss</th>\n",
+       "        <th>validation_metrics_final</th>\n",
+       "        <th>validation_loss_final</th>\n",
+       "        <th>validation_metrics</th>\n",
+       "        <th>validation_loss</th>\n",
+       "        <th>metrics_iters</th>\n",
+       "        <th>class_text_class_values</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>iris_train_packed</td>\n",
+       "        <td>iris_model</td>\n",
+       "        <td>[u'class_text']</td>\n",
+       "        <td>[u'attributes']</td>\n",
+       "        <td>model_arch_library</td>\n",
+       "        <td>1</td>\n",
+       "        <td> loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'] </td>\n",
+       "        <td> batch_size=5, epochs=3 </td>\n",
+       "        <td>10</td>\n",
+       "        <td>iris_test_packed</td>\n",
+       "        <td>None</td>\n",
+       "        <td>2</td>\n",
+       "        <td>Sophie L.</td>\n",
+       "        <td>Simple MLP for iris dataset</td>\n",
+       "        <td>madlib_keras</td>\n",
+       "        <td>0.7900390625</td>\n",
+       "        <td>2021-04-20 17:31:53.992187</td>\n",
+       "        <td>2021-04-20 17:31:55.208164</td>\n",
+       "        <td>[0.699634075164795, 0.830023050308228, 0.959816932678223, 1.08539986610413, 1.21588706970215]</td>\n",
+       "        <td>1.18.0</td>\n",
+       "        <td>[3]</td>\n",
+       "        <td>[u'character varying']</td>\n",
+       "        <td>1.0</td>\n",
+       "        <td>[u'accuracy']</td>\n",
+       "        <td>categorical_crossentropy</td>\n",
+       "        <td>0.925000011921</td>\n",
+       "        <td>0.370821505785</td>\n",
+       "        <td>[0.699999988079071, 0.758333325386047, 0.866666674613953, 0.899999976158142, 0.925000011920929]</td>\n",
+       "        <td>[0.544210851192474, 0.487771362066269, 0.441191077232361, 0.403169572353363, 0.370821505784988]</td>\n",
+       "        <td>0.899999976158</td>\n",
+       "        <td>0.36752179265</td>\n",
+       "        <td>[0.733333349227905, 0.766666650772095, 0.866666674613953, 0.866666674613953, 0.899999976158142]</td>\n",
+       "        <td>[0.519515335559845, 0.467388480901718, 0.428182542324066, 0.393494099378586, 0.367521792650223]</td>\n",
+       "        <td>[2, 4, 6, 8, 10]</td>\n",
+       "        <td>[u'Iris-setosa', u'Iris-versicolor', u'Iris-virginica']</td>\n",
+       "    </tr>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[(u'iris_train_packed', u'iris_model', [u'class_text'], [u'attributes'], u'model_arch_library', 1, u\" loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'] \", u' batch_size=5, epochs=3 ', 10, u'iris_test_packed', None, 2, u'Sophie L.', u'Simple MLP for iris dataset', u'madlib_keras', 0.7900390625, datetime.datetime(2021, 4, 20, 17, 31, 53, 992187), datetime.datetime(2021, 4, 20, 17, 31, 55, 208164), [0.699634075164795, 0.830023050308228, 0.959816932678223, 1.0 [...]
+      ]
+     },
+     "execution_count": 23,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "SELECT * FROM iris_model_summary;"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Accuracy by iteration"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 24,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "1 rows affected.\n",
+      "1 rows affected.\n",
+      "1 rows affected.\n",
+      "1 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYsAAAEWCAYAAACXGLsWAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi41LCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvSM8oowAAIABJREFUeJzs3Xd4FOX2wPHvIUASpRfpEJqFq0gAwdgA6UGKCoKIgkERFMXC9eK1gOUqVrw/wZ4gKoooRZTQISoCFwUiIF1qKAIBQkIJJDm/P2YSl5iQQjabcj7Ps0+mvDNzdpPs2XnPzjuiqhhjjDHnU8LXARhjjCn4LFkYY4zJkiULY4wxWbJkYYwxJkuWLIwxxmTJkoUxxpgsWbIo4kTkLhGZn4/HCxIRFZGS7vwcERmYnba5ONa/ReTjC4m3OBORtiISk0f7el9Ens2LfV1ADL+L [...]
+      "text/plain": [
+       "<Figure size 432x288 with 1 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "import pandas as pd\n",
+    "import numpy as np\n",
+    "import sys\n",
+    "import os\n",
+    "from matplotlib import pyplot as plt\n",
+    "\n",
+    "# get accuracy and iteration number\n",
+    "iters_proxy = %sql SELECT metrics_iters FROM iris_model_summary;\n",
+    "train_accuracy_proxy = %sql SELECT training_metrics FROM iris_model_summary;\n",
+    "test_accuracy_proxy = %sql SELECT validation_metrics FROM iris_model_summary;\n",
+    "\n",
+    "# get number of points\n",
+    "num_points_proxy = %sql SELECT array_length(metrics_iters,1) FROM iris_model_summary;\n",
+    "num_points = num_points_proxy[0]\n",
+    "\n",
+    "# reshape to np arrays\n",
+    "iters = np.array(iters_proxy).reshape(num_points)\n",
+    "train_accuracy = np.array(train_accuracy_proxy).reshape(num_points)\n",
+    "test_accuracy = np.array(test_accuracy_proxy).reshape(num_points)\n",
+    "\n",
+    "#plot\n",
+    "plt.title('Iris validation accuracy by iteration')\n",
+    "plt.xlabel('Iteration number')\n",
+    "plt.ylabel('Accuracy')\n",
+    "plt.grid(True)\n",
+    "plt.plot(iters, train_accuracy, 'g.-', label='Train')\n",
+    "plt.plot(iters, test_accuracy, 'r.-', label='Test')\n",
+    "plt.legend();"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Loss by iteration"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 25,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "1 rows affected.\n",
+      "1 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZIAAAEWCAYAAABMoxE0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi41LCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvSM8oowAAIABJREFUeJzs3XmcTfX/wPHXe2YwZI2+ssVkLNnNjGWUMpYiQiH7viSJ6ltCm6ivqL5Ekj0hS0kpW9mzD7ILE7JWKHtjff/+OEff+9Mw272XmXk/e5zH3HPuOZ/P+9zRfc85n8/5fERVMcYYY5Iq4FYHYIwxJmWzRGKMMSZZLJEYY4xJFkskxhhjksUSiTHGmGSxRGKMMSZZLJGYJBGRliLynR/rKyQiKiJB7vo8EWmbkH2TUFdfERmbnHhvUG47EVnh7XJvUFeyPoPryvLJ55HIGG74 [...]
+      "text/plain": [
+       "<Figure size 432x288 with 1 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "# get loss\n",
+    "train_loss_proxy = %sql SELECT training_loss FROM iris_model_summary;\n",
+    "test_loss_proxy = %sql SELECT validation_loss FROM iris_model_summary;\n",
+    "\n",
+    "# reshape to np arrays\n",
+    "train_loss = np.array(train_loss_proxy).reshape(num_points)\n",
+    "test_loss = np.array(test_loss_proxy).reshape(num_points)\n",
+    "\n",
+    "#plot\n",
+    "plt.title('Iris validation loss by iteration')\n",
+    "plt.xlabel('Iteration number')\n",
+    "plt.ylabel('Loss')\n",
+    "plt.grid(True)\n",
+    "plt.plot(iters, train_loss, 'g.-', label='Train')\n",
+    "plt.plot(iters, test_loss, 'r.-', label='Test')\n",
+    "plt.legend();"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Accuracy by time"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 26,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "1 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYsAAAEWCAYAAACXGLsWAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi41LCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvSM8oowAAIABJREFUeJzt3Xd4FVX6wPHvSyAk0msUKUFAlKJSFGPbAIoU6WBQUQEhupa1u7ZFBAtr+aErrkowFBUpUkQlKiBRUFiQIh1FagSVXgNp7++PmeA1plzIndyU9/M892HuzJkz7z0k982ZM2dGVBVjjDEmN6WCHYAxxpjCz5KFMcaYPFmyMMYYkydLFsYYY/JkycIYY0yeLFkYY4zJkyUL8ycicouIfFmAx4sUERWR0u77BBG53Z+yZ3CsJ0VkbH7iLclEJFpEkjysf52IRHtVv8kfsXkW [...]
+      "text/plain": [
+       "<Figure size 432x288 with 1 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "# get time\n",
+    "time_proxy = %sql SELECT metrics_elapsed_time FROM iris_model_summary;\n",
+    "\n",
+    "# reshape to np arrays\n",
+    "time = np.array(time_proxy).reshape(num_points)/60.0\n",
+    "\n",
+    "#plot\n",
+    "plt.title('Iris validation accuracy by time')\n",
+    "plt.xlabel('Time (min)')\n",
+    "plt.ylabel('Accuracy')\n",
+    "plt.grid(True)\n",
+    "plt.plot(time, train_accuracy, 'g.-', label='Train')\n",
+    "plt.plot(time, test_accuracy, 'r.-', label='Test')\n",
+    "plt.legend();"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Time to achieve a given accuracy"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 27,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZIAAAEWCAYAAABMoxE0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi41LCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvSM8oowAAIABJREFUeJzs3Xd4VVXWwOHfIiSEXgWGZhCwACoIijiWUAVEYJRqoalYsH3YsCGDDUYZGyiDDqMgSkAQkCY1CBKUIi30KkFACBBaetb3xznAJaZcktzclPU+T56ce+o6Ozd33bP3OXuLqmKMMcZkVRF/B2CMMSZ/s0RijDEmWyyRGGOMyRZLJMYYY7LFEokxxphssURijDEmWyyRGK+IyP0iMj+H9nVaRK7IiX1lcpwvReQtXx8nkxj6ishyj9fpnnvqdbNwrLki0ier2xuTVZZIDAAi [...]
+      "text/plain": [
+       "<Figure size 432x288 with 1 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "#plot\n",
+    "plt.title('Iris time by validation accuracy')\n",
+    "plt.xlabel('Accuracy')\n",
+    "plt.ylabel('Time (min)')\n",
+    "plt.grid(True)\n",
+    "plt.plot(train_accuracy, time, 'g.-', label='Train')\n",
+    "plt.plot(test_accuracy, time, 'r.-', label='Test')\n",
+    "plt.legend();"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "<a id=\"pred_prob\"></a>\n",
+    "# 2. Predict probabilities\n",
+    "Predict with probabilities for each class:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 28,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Done.\n",
+      "1 rows affected.\n",
+      "90 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <tr>\n",
+       "        <th>id</th>\n",
+       "        <th>class_name</th>\n",
+       "        <th>class_value</th>\n",
+       "        <th>prob</th>\n",
+       "        <th>rank</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>4</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.9472292</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>4</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.031068973</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>4</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.021701789</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>12</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.9555528</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>12</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.02601278</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>12</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.018434362</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>17</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.9870094</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>17</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.0072811455</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>17</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.0057093655</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>19</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.98176366</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>19</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.010345369</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>19</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.007891006</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>22</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.97142965</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>22</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.016465394</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>22</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.012104888</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>27</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.9564034</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>27</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.025497936</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>27</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.018098775</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>42</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.9353233</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>42</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.038349036</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>42</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.026327627</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>48</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.9576991</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>48</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.024714109</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>48</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.01758675</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>50</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.97392446</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>50</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.014979658</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>50</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.011095825</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>59</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.49260557</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>59</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.32776284</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>59</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.17963153</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>60</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.4357334</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>60</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.42351598</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>60</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.14075062</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>71</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.6644638</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>71</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.25464898</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>71</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.0808872</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>75</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.498721</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>75</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.31049314</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>75</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.19078586</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>84</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.69199336</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>84</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.2247477</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>84</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.08325895</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>86</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.46456945</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>86</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.41553593</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>86</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.11989462</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>96</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.4801436</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>96</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.3588353</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>96</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.16102102</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>100</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.48121163</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>100</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.3563333</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>100</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.16245508</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>103</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.7880244</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>103</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.15765855</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>103</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.05431706</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>111</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.6621611</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>111</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.25863633</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>111</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.079202555</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>119</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.9015497</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>119</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.069268234</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>119</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.029182106</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>120</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.63782895</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>120</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.25926206</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>120</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.10290891</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>123</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.8468553</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>123</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.1097963</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>123</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.04334838</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>125</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.8118</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>125</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.14129929</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>125</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.046900727</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>126</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.726224</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>126</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.20347105</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>126</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.07030494</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>128</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.64842105</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>128</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.26508498</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>128</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.08649397</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>133</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.859512</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>133</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.10296583</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>133</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.037522234</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>136</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.7598308</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>136</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.18129109</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>136</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.058878105</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>141</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.8431489</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>141</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.11826446</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>141</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.03858671</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>145</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.8697712</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>145</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.09845836</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>145</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.031770512</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>149</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-virginica</td>\n",
+       "        <td>0.83679724</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>149</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-versicolor</td>\n",
+       "        <td>0.122279644</td>\n",
+       "        <td>2</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>149</td>\n",
+       "        <td>class_text</td>\n",
+       "        <td>Iris-setosa</td>\n",
+       "        <td>0.04092312</td>\n",
+       "        <td>3</td>\n",
+       "    </tr>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[(4, u'class_text', u'Iris-setosa', 0.9472292, 1),\n",
+       " (4, u'class_text', u'Iris-versicolor', 0.031068973, 2),\n",
+       " (4, u'class_text', u'Iris-virginica', 0.021701789, 3),\n",
+       " (12, u'class_text', u'Iris-setosa', 0.9555528, 1),\n",
+       " (12, u'class_text', u'Iris-versicolor', 0.02601278, 2),\n",
+       " (12, u'class_text', u'Iris-virginica', 0.018434362, 3),\n",
+       " (17, u'class_text', u'Iris-setosa', 0.9870094, 1),\n",
+       " (17, u'class_text', u'Iris-versicolor', 0.0072811455, 2),\n",
+       " (17, u'class_text', u'Iris-virginica', 0.0057093655, 3),\n",
+       " (19, u'class_text', u'Iris-setosa', 0.98176366, 1),\n",
+       " (19, u'class_text', u'Iris-versicolor', 0.010345369, 2),\n",
+       " (19, u'class_text', u'Iris-virginica', 0.007891006, 3),\n",
+       " (22, u'class_text', u'Iris-setosa', 0.97142965, 1),\n",
+       " (22, u'class_text', u'Iris-versicolor', 0.016465394, 2),\n",
+       " (22, u'class_text', u'Iris-virginica', 0.012104888, 3),\n",
+       " (27, u'class_text', u'Iris-setosa', 0.9564034, 1),\n",
+       " (27, u'class_text', u'Iris-versicolor', 0.025497936, 2),\n",
+       " (27, u'class_text', u'Iris-virginica', 0.018098775, 3),\n",
+       " (42, u'class_text', u'Iris-setosa', 0.9353233, 1),\n",
+       " (42, u'class_text', u'Iris-versicolor', 0.038349036, 2),\n",
+       " (42, u'class_text', u'Iris-virginica', 0.026327627, 3),\n",
+       " (48, u'class_text', u'Iris-setosa', 0.9576991, 1),\n",
+       " (48, u'class_text', u'Iris-versicolor', 0.024714109, 2),\n",
+       " (48, u'class_text', u'Iris-virginica', 0.01758675, 3),\n",
+       " (50, u'class_text', u'Iris-setosa', 0.97392446, 1),\n",
+       " (50, u'class_text', u'Iris-versicolor', 0.014979658, 2),\n",
+       " (50, u'class_text', u'Iris-virginica', 0.011095825, 3),\n",
+       " (59, u'class_text', u'Iris-versicolor', 0.49260557, 1),\n",
+       " (59, u'class_text', u'Iris-virginica', 0.32776284, 2),\n",
+       " (59, u'class_text', u'Iris-setosa', 0.17963153, 3),\n",
+       " (60, u'class_text', u'Iris-versicolor', 0.4357334, 1),\n",
+       " (60, u'class_text', u'Iris-virginica', 0.42351598, 2),\n",
+       " (60, u'class_text', u'Iris-setosa', 0.14075062, 3),\n",
+       " (71, u'class_text', u'Iris-virginica', 0.6644638, 1),\n",
+       " (71, u'class_text', u'Iris-versicolor', 0.25464898, 2),\n",
+       " (71, u'class_text', u'Iris-setosa', 0.0808872, 3),\n",
+       " (75, u'class_text', u'Iris-versicolor', 0.498721, 1),\n",
+       " (75, u'class_text', u'Iris-virginica', 0.31049314, 2),\n",
+       " (75, u'class_text', u'Iris-setosa', 0.19078586, 3),\n",
+       " (84, u'class_text', u'Iris-virginica', 0.69199336, 1),\n",
+       " (84, u'class_text', u'Iris-versicolor', 0.2247477, 2),\n",
+       " (84, u'class_text', u'Iris-setosa', 0.08325895, 3),\n",
+       " (86, u'class_text', u'Iris-virginica', 0.46456945, 1),\n",
+       " (86, u'class_text', u'Iris-versicolor', 0.41553593, 2),\n",
+       " (86, u'class_text', u'Iris-setosa', 0.11989462, 3),\n",
+       " (96, u'class_text', u'Iris-versicolor', 0.4801436, 1),\n",
+       " (96, u'class_text', u'Iris-virginica', 0.3588353, 2),\n",
+       " (96, u'class_text', u'Iris-setosa', 0.16102102, 3),\n",
+       " (100, u'class_text', u'Iris-versicolor', 0.48121163, 1),\n",
+       " (100, u'class_text', u'Iris-virginica', 0.3563333, 2),\n",
+       " (100, u'class_text', u'Iris-setosa', 0.16245508, 3),\n",
+       " (103, u'class_text', u'Iris-virginica', 0.7880244, 1),\n",
+       " (103, u'class_text', u'Iris-versicolor', 0.15765855, 2),\n",
+       " (103, u'class_text', u'Iris-setosa', 0.05431706, 3),\n",
+       " (111, u'class_text', u'Iris-virginica', 0.6621611, 1),\n",
+       " (111, u'class_text', u'Iris-versicolor', 0.25863633, 2),\n",
+       " (111, u'class_text', u'Iris-setosa', 0.079202555, 3),\n",
+       " (119, u'class_text', u'Iris-virginica', 0.9015497, 1),\n",
+       " (119, u'class_text', u'Iris-versicolor', 0.069268234, 2),\n",
+       " (119, u'class_text', u'Iris-setosa', 0.029182106, 3),\n",
+       " (120, u'class_text', u'Iris-virginica', 0.63782895, 1),\n",
+       " (120, u'class_text', u'Iris-versicolor', 0.25926206, 2),\n",
+       " (120, u'class_text', u'Iris-setosa', 0.10290891, 3),\n",
+       " (123, u'class_text', u'Iris-virginica', 0.8468553, 1),\n",
+       " (123, u'class_text', u'Iris-versicolor', 0.1097963, 2),\n",
+       " (123, u'class_text', u'Iris-setosa', 0.04334838, 3),\n",
+       " (125, u'class_text', u'Iris-virginica', 0.8118, 1),\n",
+       " (125, u'class_text', u'Iris-versicolor', 0.14129929, 2),\n",
+       " (125, u'class_text', u'Iris-setosa', 0.046900727, 3),\n",
+       " (126, u'class_text', u'Iris-virginica', 0.726224, 1),\n",
+       " (126, u'class_text', u'Iris-versicolor', 0.20347105, 2),\n",
+       " (126, u'class_text', u'Iris-setosa', 0.07030494, 3),\n",
+       " (128, u'class_text', u'Iris-virginica', 0.64842105, 1),\n",
+       " (128, u'class_text', u'Iris-versicolor', 0.26508498, 2),\n",
+       " (128, u'class_text', u'Iris-setosa', 0.08649397, 3),\n",
+       " (133, u'class_text', u'Iris-virginica', 0.859512, 1),\n",
+       " (133, u'class_text', u'Iris-versicolor', 0.10296583, 2),\n",
+       " (133, u'class_text', u'Iris-setosa', 0.037522234, 3),\n",
+       " (136, u'class_text', u'Iris-virginica', 0.7598308, 1),\n",
+       " (136, u'class_text', u'Iris-versicolor', 0.18129109, 2),\n",
+       " (136, u'class_text', u'Iris-setosa', 0.058878105, 3),\n",
+       " (141, u'class_text', u'Iris-virginica', 0.8431489, 1),\n",
+       " (141, u'class_text', u'Iris-versicolor', 0.11826446, 2),\n",
+       " (141, u'class_text', u'Iris-setosa', 0.03858671, 3),\n",
+       " (145, u'class_text', u'Iris-virginica', 0.8697712, 1),\n",
+       " (145, u'class_text', u'Iris-versicolor', 0.09845836, 2),\n",
+       " (145, u'class_text', u'Iris-setosa', 0.031770512, 3),\n",
+       " (149, u'class_text', u'Iris-virginica', 0.83679724, 1),\n",
+       " (149, u'class_text', u'Iris-versicolor', 0.122279644, 2),\n",
+       " (149, u'class_text', u'Iris-setosa', 0.04092312, 3)]"
+      ]
+     },
+     "execution_count": 28,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "DROP TABLE IF EXISTS iris_predict;\n",
+    "\n",
+    "SELECT madlib.madlib_keras_predict('iris_model',      -- model\n",
+    "                                   'iris_test',       -- test_table\n",
+    "                                   'id',              -- id column\n",
+    "                                   'attributes',      -- independent var\n",
+    "                                   'iris_predict',    -- output table\n",
+    "                                   'prob'             -- response type\n",
+    "                                   );\n",
+    "\n",
+    "SELECT * FROM iris_predict ORDER BY id, rank;"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "<a id=\"warm_start\"></a>\n",
+    "# 3. Warm start\n",
+    "Next, use the warm_start parameter to continue learning, using the coefficients from the run above. Note that we don't drop the model table or model summary table:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 29,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "1 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <tr>\n",
+       "        <th>madlib_keras_fit</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td></td>\n",
+       "    </tr>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[('',)]"
+      ]
+     },
+     "execution_count": 29,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "SELECT madlib.madlib_keras_fit('iris_train_packed',   -- source table\n",
+    "                               'iris_model',          -- model output table\n",
+    "                               'model_arch_library',  -- model arch table\n",
+    "                                1,                    -- model arch id\n",
+    "                                $$ loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'] $$,  -- compile_params\n",
+    "                                $$ batch_size=5, epochs=3 $$,  -- fit_params\n",
+    "                                10,                   -- num_iterations\n",
+    "                                FALSE,                -- use GPUs\n",
+    "                                'iris_test_packed',   -- validation dataset\n",
+    "                                2,                    -- metrics compute frequency\n",
+    "                                TRUE,                 -- warm start\n",
+    "                               'Sophie L.',           -- name \n",
+    "                               'Simple MLP for iris dataset'  -- description\n",
+    "                              );"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "In the summary table and plots below note that the loss and accuracy values pick up from where the previous run left off:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 30,
+   "metadata": {
+    "scrolled": true
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "1 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <tr>\n",
+       "        <th>source_table</th>\n",
+       "        <th>model</th>\n",
+       "        <th>dependent_varname</th>\n",
+       "        <th>independent_varname</th>\n",
+       "        <th>model_arch_table</th>\n",
+       "        <th>model_id</th>\n",
+       "        <th>compile_params</th>\n",
+       "        <th>fit_params</th>\n",
+       "        <th>num_iterations</th>\n",
+       "        <th>validation_table</th>\n",
+       "        <th>object_table</th>\n",
+       "        <th>metrics_compute_frequency</th>\n",
+       "        <th>name</th>\n",
+       "        <th>description</th>\n",
+       "        <th>model_type</th>\n",
+       "        <th>model_size</th>\n",
+       "        <th>start_training_time</th>\n",
+       "        <th>end_training_time</th>\n",
+       "        <th>metrics_elapsed_time</th>\n",
+       "        <th>madlib_version</th>\n",
+       "        <th>num_classes</th>\n",
+       "        <th>dependent_vartype</th>\n",
+       "        <th>normalizing_const</th>\n",
+       "        <th>metrics_type</th>\n",
+       "        <th>loss_type</th>\n",
+       "        <th>training_metrics_final</th>\n",
+       "        <th>training_loss_final</th>\n",
+       "        <th>training_metrics</th>\n",
+       "        <th>training_loss</th>\n",
+       "        <th>validation_metrics_final</th>\n",
+       "        <th>validation_loss_final</th>\n",
+       "        <th>validation_metrics</th>\n",
+       "        <th>validation_loss</th>\n",
+       "        <th>metrics_iters</th>\n",
+       "        <th>class_text_class_values</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>iris_train_packed</td>\n",
+       "        <td>iris_model</td>\n",
+       "        <td>[u'class_text']</td>\n",
+       "        <td>[u'attributes']</td>\n",
+       "        <td>model_arch_library</td>\n",
+       "        <td>1</td>\n",
+       "        <td> loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'] </td>\n",
+       "        <td> batch_size=5, epochs=3 </td>\n",
+       "        <td>10</td>\n",
+       "        <td>iris_test_packed</td>\n",
+       "        <td>None</td>\n",
+       "        <td>2</td>\n",
+       "        <td>Sophie L.</td>\n",
+       "        <td>Simple MLP for iris dataset</td>\n",
+       "        <td>madlib_keras</td>\n",
+       "        <td>0.7900390625</td>\n",
+       "        <td>2021-04-20 17:32:02.074590</td>\n",
+       "        <td>2021-04-20 17:32:03.395090</td>\n",
+       "        <td>[0.790004968643188, 0.924566030502319, 1.05826997756958, 1.18729519844055, 1.32041597366333]</td>\n",
+       "        <td>1.18.0</td>\n",
+       "        <td>[3]</td>\n",
+       "        <td>[u'character varying']</td>\n",
+       "        <td>1.0</td>\n",
+       "        <td>[u'accuracy']</td>\n",
+       "        <td>categorical_crossentropy</td>\n",
+       "        <td>0.975000023842</td>\n",
+       "        <td>0.249761134386</td>\n",
+       "        <td>[0.933333337306976, 0.941666662693024, 0.949999988079071, 0.975000023841858, 0.975000023841858]</td>\n",
+       "        <td>[0.338652342557907, 0.311799049377441, 0.288436323404312, 0.267898172140121, 0.249761134386063]</td>\n",
+       "        <td>0.933333337307</td>\n",
+       "        <td>0.272952198982</td>\n",
+       "        <td>[0.899999976158142, 0.899999976158142, 0.933333337306976, 0.933333337306976, 0.933333337306976]</td>\n",
+       "        <td>[0.340351849794388, 0.318843215703964, 0.301624000072479, 0.286121636629105, 0.272952198982239]</td>\n",
+       "        <td>[2, 4, 6, 8, 10]</td>\n",
+       "        <td>[u'Iris-setosa', u'Iris-versicolor', u'Iris-virginica']</td>\n",
+       "    </tr>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[(u'iris_train_packed', u'iris_model', [u'class_text'], [u'attributes'], u'model_arch_library', 1, u\" loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'] \", u' batch_size=5, epochs=3 ', 10, u'iris_test_packed', None, 2, u'Sophie L.', u'Simple MLP for iris dataset', u'madlib_keras', 0.7900390625, datetime.datetime(2021, 4, 20, 17, 32, 2, 74590), datetime.datetime(2021, 4, 20, 17, 32, 3, 395090), [0.790004968643188, 0.924566030502319, 1.05826997756958, 1.18729 [...]
+      ]
+     },
+     "execution_count": 30,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "SELECT * FROM iris_model_summary;"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 31,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "1 rows affected.\n",
+      "1 rows affected.\n",
+      "1 rows affected.\n",
+      "1 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYsAAAEWCAYAAACXGLsWAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi41LCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvSM8oowAAIABJREFUeJzt3Xl8FFW2wPHfSdgJO0wQQRaJC25oEIyiBgGFqKCIiiijIg/1icsb93FBUQd1nBl5D0adQVzBjII6okHEmIiDAQFBVpFFlrAb1rAkJDnvj6rEJiZ0d5JKdZLz/Xz6k1puVZ2udNfpurfqlqgqxhhjzLFE+R2AMcaYyGfJwhhjTFCWLIwxxgRlycIYY0xQliyMMcYEZcnCGGNMUJYsKoCI3CgiX1Ti9jqIiIpILXd8hojcHErZMmzrjyIysTzx1mQikigimRW0rldF5ImK [...]
+      "text/plain": [
+       "<Figure size 432x288 with 1 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "import pandas as pd\n",
+    "import numpy as np\n",
+    "import sys\n",
+    "import os\n",
+    "from matplotlib import pyplot as plt\n",
+    "\n",
+    "# get accuracy and iteration number\n",
+    "iters_proxy = %sql SELECT metrics_iters FROM iris_model_summary;\n",
+    "train_accuracy_proxy = %sql SELECT training_metrics FROM iris_model_summary;\n",
+    "test_accuracy_proxy = %sql SELECT validation_metrics FROM iris_model_summary;\n",
+    "\n",
+    "# get number of points\n",
+    "num_points_proxy = %sql SELECT array_length(metrics_iters,1) FROM iris_model_summary;\n",
+    "num_points = num_points_proxy[0]\n",
+    "\n",
+    "# reshape to np arrays\n",
+    "iters = np.array(iters_proxy).reshape(num_points)\n",
+    "train_accuracy = np.array(train_accuracy_proxy).reshape(num_points)\n",
+    "test_accuracy = np.array(test_accuracy_proxy).reshape(num_points)\n",
+    "\n",
+    "#plot\n",
+    "plt.title('Iris validation accuracy by iteration - warm start')\n",
+    "plt.xlabel('Iteration number')\n",
+    "plt.ylabel('Accuracy')\n",
+    "plt.grid(True)\n",
+    "plt.plot(iters, train_accuracy, 'g.-', label='Train')\n",
+    "plt.plot(iters, test_accuracy, 'r.-', label='Test')\n",
+    "plt.legend();"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 32,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "1 rows affected.\n",
+      "1 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYsAAAEWCAYAAACXGLsWAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi41LCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvSM8oowAAIABJREFUeJzs3Xd4VEUXwOHfSQi9g4B0pCc0SSiRGkQFUUAEpEvvRflQsaGoWLBTBKnSQUSKAiIgRaSXCITeBQEp0lSk5Hx/3ItGCCQh2WzKeXn2YffuLWfvbvbszNyZEVXFGGOMuRMfbwdgjDEm4bNkYYwxJkqWLIwxxkTJkoUxxpgoWbIwxhgTJUsWxhhjomTJwstEpKWIfB+PxysoIioiKdzHC0Xk6eisexfHeklExsQm3tvst62IrIrr/d7mWLE6BzftyyPnI4Yx3Pb9NuZOxPpZ [...]
+      "text/plain": [
+       "<Figure size 432x288 with 1 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "# get loss\n",
+    "train_loss_proxy = %sql SELECT training_loss FROM iris_model_summary;\n",
+    "test_loss_proxy = %sql SELECT validation_loss FROM iris_model_summary;\n",
+    "\n",
+    "# reshape to np arrays\n",
+    "train_loss = np.array(train_loss_proxy).reshape(num_points)\n",
+    "test_loss = np.array(test_loss_proxy).reshape(num_points)\n",
+    "\n",
+    "#plot\n",
+    "plt.title('Iris validation loss by iteration - warm start')\n",
+    "plt.xlabel('Iteration number')\n",
+    "plt.ylabel('Loss')\n",
+    "plt.grid(True)\n",
+    "plt.plot(iters, train_loss, 'g.-', label='Train')\n",
+    "plt.plot(iters, test_loss, 'r.-', label='Test')\n",
+    "plt.legend();"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "<a id=\"transfer_learn\"></a>\n",
+    "# Transfer learning\n",
+    "\n",
+    "<a id=\"load2\"></a>\n",
+    "# 1. Define and load model architecture with some layers frozen\n",
+    "Here we want to start with initial weights from a pre-trained model rather than training from scratch.  We also want to use a model architecture with the earlier feature layer(s) frozen to save on training time.  The example below is somewhat contrived but gives you the idea of the steps.\n",
+    "\n",
+    "First define a model architecture with the 1st hidden layer frozen:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 33,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Model: \"sequential_1\"\n",
+      "_________________________________________________________________\n",
+      "Layer (type)                 Output Shape              Param #   \n",
+      "=================================================================\n",
+      "dense_3 (Dense)              (None, 10)                50        \n",
+      "_________________________________________________________________\n",
+      "dense_4 (Dense)              (None, 10)                110       \n",
+      "_________________________________________________________________\n",
+      "dense_5 (Dense)              (None, 3)                 33        \n",
+      "=================================================================\n",
+      "Total params: 193\n",
+      "Trainable params: 143\n",
+      "Non-trainable params: 50\n",
+      "_________________________________________________________________\n"
+     ]
+    }
+   ],
+   "source": [
+    "model_transfer = Sequential()\n",
+    "model_transfer.add(Dense(10, activation='relu', input_shape=(4,), trainable=False))\n",
+    "model_transfer.add(Dense(10, activation='relu'))\n",
+    "model_transfer.add(Dense(3, activation='softmax'))\n",
+    "    \n",
+    "model_transfer.summary();"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 34,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'{\"class_name\": \"Sequential\", \"keras_version\": \"2.2.4-tf\", \"config\": {\"layers\": [{\"class_name\": \"Dense\", \"config\": {\"kernel_initializer\": {\"class_name\": \"GlorotUniform\", \"config\": {\"dtype\": \"float32\", \"seed\": null}}, \"name\": \"dense_3\", \"kernel_constraint\": null, \"bias_regularizer\": null, \"bias_constraint\": null, \"dtype\": \"float32\", \"activation\": \"relu\", \"trainable\": false, \"kernel_regularizer\": null, \"bias_initializer\": {\"c [...]
+      ]
+     },
+     "execution_count": 34,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "model_transfer.to_json()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Load transfer model into model architecture table"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 35,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "1 rows affected.\n",
+      "2 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <tr>\n",
+       "        <th>model_id</th>\n",
+       "        <th>model_arch</th>\n",
+       "        <th>name</th>\n",
+       "        <th>description</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>1</td>\n",
+       "        <td>{u'class_name': u'Sequential', u'keras_version': u'2.1.6', u'config': [{u'class_name': u'Dense', u'config': {u'kernel_initializer': {u'class_name': u'VarianceScaling', u'config': {u'distribution': u'uniform', u'scale': 1.0, u'seed': None, u'mode': u'fan_avg'}}, u'name': u'dense_1', u'kernel_constraint': None, u'bias_regularizer': None, u'bias_constraint': None, u'dtype': u'float32', u'activation': u'relu', u'trainable': True, u'kernel_regularizer': None, u'bias_initia [...]
+       "        <td>Sophie</td>\n",
+       "        <td>A simple model</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>2</td>\n",
+       "        <td>{u'class_name': u'Sequential', u'keras_version': u'2.1.6', u'config': [{u'class_name': u'Dense', u'config': {u'kernel_initializer': {u'class_name': u'VarianceScaling', u'config': {u'distribution': u'uniform', u'scale': 1.0, u'seed': None, u'mode': u'fan_avg'}}, u'name': u'dense_2', u'kernel_constraint': None, u'bias_regularizer': None, u'bias_constraint': None, u'dtype': u'float32', u'activation': u'relu', u'trainable': False, u'kernel_regularizer': None, u'bias_initi [...]
+       "        <td>Maria</td>\n",
+       "        <td>A transfer model</td>\n",
+       "    </tr>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[(1, {u'class_name': u'Sequential', u'keras_version': u'2.1.6', u'config': [{u'class_name': u'Dense', u'config': {u'kernel_initializer': {u'class_name': u' ... (1340 characters truncated) ... s_initializer': {u'class_name': u'Zeros', u'config': {}}, u'units': 3, u'use_bias': True, u'activity_regularizer': None}}], u'backend': u'tensorflow'}, u'Sophie', u'A simple model'),\n",
+       " (2, {u'class_name': u'Sequential', u'keras_version': u'2.1.6', u'config': [{u'class_name': u'Dense', u'config': {u'kernel_initializer': {u'class_name': u' ... (1341 characters truncated) ... s_initializer': {u'class_name': u'Zeros', u'config': {}}, u'units': 3, u'use_bias': True, u'activity_regularizer': None}}], u'backend': u'tensorflow'}, u'Maria', u'A transfer model')]"
+      ]
+     },
+     "execution_count": 35,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "SELECT madlib.load_keras_model('model_arch_library',  -- Output table,                      \n",
+    "$$\n",
+    "{\"class_name\": \"Sequential\", \"keras_version\": \"2.1.6\", \"config\": [{\"class_name\": \"Dense\", \"config\": {\"kernel_initializer\": {\"class_name\": \"VarianceScaling\", \"config\": {\"distribution\": \"uniform\", \"scale\": 1.0, \"seed\": null, \"mode\": \"fan_avg\"}}, \"name\": \"dense_2\", \"kernel_constraint\": null, \"bias_regularizer\": null, \"bias_constraint\": null, \"dtype\": \"float32\", \"activation\": \"relu\", \"trainable\": false, \"kernel_regularizer\": null [...]
+    "$$\n",
+    "::json,         -- JSON blob\n",
+    "                               NULL,                  -- Weights\n",
+    "                               'Maria',               -- Name\n",
+    "                               'A transfer model'     -- Descr\n",
+    ");\n",
+    "\n",
+    "SELECT model_id, model_arch, name, description FROM model_arch_library ORDER BY model_id;"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "<a id=\"train2\"></a>\n",
+    "# 2. Train transfer model\n",
+    "\n",
+    "Fetch the weights from a previous MADlib run.  (Normally these would be downloaded from a source that trained the same model architecture on a related dataset.)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 36,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "1 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "[]"
+      ]
+     },
+     "execution_count": 36,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "UPDATE model_arch_library \n",
+    "SET model_weights = iris_model.model_weights \n",
+    "FROM iris_model \n",
+    "WHERE model_arch_library.model_id = 2;"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Now train the model using the transfer model and the pre-trained weights:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 37,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Done.\n",
+      "1 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <tr>\n",
+       "        <th>madlib_keras_fit</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td></td>\n",
+       "    </tr>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[('',)]"
+      ]
+     },
+     "execution_count": 37,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "DROP TABLE IF EXISTS iris_model, iris_model_summary;\n",
+    "\n",
+    "SELECT madlib.madlib_keras_fit('iris_train_packed',   -- source table\n",
+    "                               'iris_model',          -- model output table\n",
+    "                               'model_arch_library',  -- model arch table\n",
+    "                                2,                    -- model arch id\n",
+    "                                $$ loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'] $$,  -- compile_params\n",
+    "                                $$ batch_size=5, epochs=3 $$,  -- fit_params\n",
+    "                                10,                   -- num_iterations\n",
+    "                                FALSE,                -- use GPUs\n",
+    "                                'iris_test_packed',   -- validation dataset\n",
+    "                                2                     -- metrics compute frequency\n",
+    "                              );"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 38,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "1 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <tr>\n",
+       "        <th>source_table</th>\n",
+       "        <th>model</th>\n",
+       "        <th>dependent_varname</th>\n",
+       "        <th>independent_varname</th>\n",
+       "        <th>model_arch_table</th>\n",
+       "        <th>model_id</th>\n",
+       "        <th>compile_params</th>\n",
+       "        <th>fit_params</th>\n",
+       "        <th>num_iterations</th>\n",
+       "        <th>validation_table</th>\n",
+       "        <th>object_table</th>\n",
+       "        <th>metrics_compute_frequency</th>\n",
+       "        <th>name</th>\n",
+       "        <th>description</th>\n",
+       "        <th>model_type</th>\n",
+       "        <th>model_size</th>\n",
+       "        <th>start_training_time</th>\n",
+       "        <th>end_training_time</th>\n",
+       "        <th>metrics_elapsed_time</th>\n",
+       "        <th>madlib_version</th>\n",
+       "        <th>num_classes</th>\n",
+       "        <th>dependent_vartype</th>\n",
+       "        <th>normalizing_const</th>\n",
+       "        <th>metrics_type</th>\n",
+       "        <th>loss_type</th>\n",
+       "        <th>training_metrics_final</th>\n",
+       "        <th>training_loss_final</th>\n",
+       "        <th>training_metrics</th>\n",
+       "        <th>training_loss</th>\n",
+       "        <th>validation_metrics_final</th>\n",
+       "        <th>validation_loss_final</th>\n",
+       "        <th>validation_metrics</th>\n",
+       "        <th>validation_loss</th>\n",
+       "        <th>metrics_iters</th>\n",
+       "        <th>class_text_class_values</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>iris_train_packed</td>\n",
+       "        <td>iris_model</td>\n",
+       "        <td>[u'class_text']</td>\n",
+       "        <td>[u'attributes']</td>\n",
+       "        <td>model_arch_library</td>\n",
+       "        <td>2</td>\n",
+       "        <td> loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'] </td>\n",
+       "        <td> batch_size=5, epochs=3 </td>\n",
+       "        <td>10</td>\n",
+       "        <td>iris_test_packed</td>\n",
+       "        <td>None</td>\n",
+       "        <td>2</td>\n",
+       "        <td>None</td>\n",
+       "        <td>None</td>\n",
+       "        <td>madlib_keras</td>\n",
+       "        <td>0.7900390625</td>\n",
+       "        <td>2021-04-20 17:32:07.327197</td>\n",
+       "        <td>2021-04-20 17:32:08.539948</td>\n",
+       "        <td>[0.699096918106079, 0.832123994827271, 0.954991817474365, 1.08145689964294, 1.21266984939575]</td>\n",
+       "        <td>1.18.0</td>\n",
+       "        <td>[3]</td>\n",
+       "        <td>[u'character varying']</td>\n",
+       "        <td>1.0</td>\n",
+       "        <td>[u'accuracy']</td>\n",
+       "        <td>categorical_crossentropy</td>\n",
+       "        <td>0.983333349228</td>\n",
+       "        <td>0.182878404856</td>\n",
+       "        <td>[0.975000023841858, 0.975000023841858, 0.975000023841858, 0.983333349227905, 0.983333349227905]</td>\n",
+       "        <td>[0.233285173773766, 0.218877613544464, 0.205622106790543, 0.19425442814827, 0.182878404855728]</td>\n",
+       "        <td>0.933333337307</td>\n",
+       "        <td>0.229035243392</td>\n",
+       "        <td>[0.933333337306976, 0.933333337306976, 0.933333337306976, 0.933333337306976, 0.933333337306976]</td>\n",
+       "        <td>[0.261644870042801, 0.253041982650757, 0.243918895721436, 0.233916118741035, 0.229035243391991]</td>\n",
+       "        <td>[2, 4, 6, 8, 10]</td>\n",
+       "        <td>[u'Iris-setosa', u'Iris-versicolor', u'Iris-virginica']</td>\n",
+       "    </tr>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[(u'iris_train_packed', u'iris_model', [u'class_text'], [u'attributes'], u'model_arch_library', 2, u\" loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'] \", u' batch_size=5, epochs=3 ', 10, u'iris_test_packed', None, 2, None, None, u'madlib_keras', 0.7900390625, datetime.datetime(2021, 4, 20, 17, 32, 7, 327197), datetime.datetime(2021, 4, 20, 17, 32, 8, 539948), [0.699096918106079, 0.832123994827271, 0.954991817474365, 1.08145689964294, 1.21266984939575], u' [...]
+      ]
+     },
+     "execution_count": 38,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "SELECT * FROM iris_model_summary;"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Note loss picks up from where the last training left off:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 39,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "1 rows affected.\n",
+      "1 rows affected.\n",
+      "1 rows affected.\n",
+      "1 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYsAAAEWCAYAAACXGLsWAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi41LCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvSM8oowAAIABJREFUeJzt3Xt8FPW9//HXh3AJEgQBS1UoUMELthQNiuhRg1jFS7VFaqmK9UKpPV7oqbZH+7Nqba3Yo62xUG1LqVJRar1Q23rHRD1H5KIgKnhBChIFRZRLVC5JPr8/5hscliSzG7LZJXk/H4997Fy+M/OZ787MZ+c7uzPm7oiIiDSkTa4DEBGR/KdkISIiiZQsREQkkZKFiIgkUrIQEZFEShYiIpJIySINZnaWmT3ejMvra2ZuZm1D/yNm9p10yjZiWT8xsyk7E29rZmYlZlbRRPO6 [...]
+      "text/plain": [
+       "<Figure size 432x288 with 1 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "import pandas as pd\n",
+    "import numpy as np\n",
+    "import sys\n",
+    "import os\n",
+    "from matplotlib import pyplot as plt\n",
+    "\n",
+    "# get accuracy and iteration number\n",
+    "iters_proxy = %sql SELECT metrics_iters FROM iris_model_summary;\n",
+    "train_accuracy_proxy = %sql SELECT training_metrics FROM iris_model_summary;\n",
+    "test_accuracy_proxy = %sql SELECT validation_metrics FROM iris_model_summary;\n",
+    "\n",
+    "# get number of points\n",
+    "num_points_proxy = %sql SELECT array_length(metrics_iters,1) FROM iris_model_summary;\n",
+    "num_points = num_points_proxy[0]\n",
+    "\n",
+    "# reshape to np arrays\n",
+    "iters = np.array(iters_proxy).reshape(num_points)\n",
+    "train_accuracy = np.array(train_accuracy_proxy).reshape(num_points)\n",
+    "test_accuracy = np.array(test_accuracy_proxy).reshape(num_points)\n",
+    "\n",
+    "#plot\n",
+    "plt.title('Iris validation accuracy by iteration - transfer learn')\n",
+    "plt.xlabel('Iteration number')\n",
+    "plt.ylabel('Accuracy')\n",
+    "plt.grid(True)\n",
+    "plt.plot(iters, train_accuracy, 'g.-', label='Train')\n",
+    "plt.plot(iters, test_accuracy, 'r.-', label='Test')\n",
+    "plt.legend();"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 40,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "1 rows affected.\n",
+      "1 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYsAAAEWCAYAAACXGLsWAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi41LCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvSM8oowAAIABJREFUeJzs3Xd4FdXWwOHfSoAQSOgagYQiPTYwCAYVQVHBAhZUkCJNrvpxLehVsCLqtV8LoKKIdKNgQwVRY7ABUhSQIopIU5AqGCCBkPX9sSdwCAmpw0lZ7/PMwzkze2bWKTmLvffM3qKqGGOMMccSEuwAjDHGFH2WLIwxxuTIkoUxxpgcWbIwxhiTI0sWxhhjcmTJwhhjTI4sWfhMRHqIyGfH8Xz1RERFpIz3fKaI3Jibsvk4130iMqYg8WZz3D4i8m1hHzebcxXoPch0LF/ejzzG [...]
+      "text/plain": [
+       "<Figure size 432x288 with 1 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "# get loss\n",
+    "train_loss_proxy = %sql SELECT training_loss FROM iris_model_summary;\n",
+    "test_loss_proxy = %sql SELECT validation_loss FROM iris_model_summary;\n",
+    "\n",
+    "# reshape to np arrays\n",
+    "train_loss = np.array(train_loss_proxy).reshape(num_points)\n",
+    "test_loss = np.array(test_loss_proxy).reshape(num_points)\n",
+    "\n",
+    "#plot\n",
+    "plt.title('Iris validation loss by iteration - transfer learn')\n",
+    "plt.xlabel('Iteration number')\n",
+    "plt.ylabel('Loss')\n",
+    "plt.grid(True)\n",
+    "plt.plot(iters, train_loss, 'g.-', label='Train')\n",
+    "plt.plot(iters, test_loss, 'r.-', label='Test')\n",
+    "plt.legend();"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 2",
+   "language": "python",
+   "name": "python2"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 2
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython2",
+   "version": "2.7.16"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 1
+}
diff --git a/community-artifacts/E2E-workflows/.ipynb_checkpoints/MADlib-e2e-ds-workflow-abalone-checkpoint.ipynb b/community-artifacts/E2E-workflows/.ipynb_checkpoints/MADlib-e2e-ds-workflow-abalone-checkpoint.ipynb
new file mode 100644
index 0000000..3a971a4
--- /dev/null
+++ b/community-artifacts/E2E-workflows/.ipynb_checkpoints/MADlib-e2e-ds-workflow-abalone-checkpoint.ipynb
@@ -0,0 +1,4574 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "<img src=\"https://s3.amazonaws.com/greenplum.org/wp-content/uploads/2018/11/14180216/logo-gpdb-light.svg\" alt=\"drawing\" width=\"200\"/>"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# Data Science Workshop"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "This notebook serves as an hands-on introduction to the data science pipeline.  Using a single dataset throughout, it begins with loading the data into Greenplum Database (GPDB), then proceeds to data exploration, feature engineering, model development, and model evaluation.\n",
+    "\n",
+    "We’ll be using the publicly available [Abalone dataset from the University of California, Irvine Machine Learning Repository](https://archive.ics.uci.edu/ml/datasets/abalone).  The dataset contains nine attributes (including our target prediction column).\n",
+    "\n",
+    "| Column Name | Data Type | Description|\n",
+    "| ---|:---:| ---:|\n",
+    "|Sex | text | M,F,I[infant]|\n",
+    "| Length | float | Longest shell measurement|\n",
+    "|Diameter | float | Perpendicular to length|\n",
+    "| Height | float | With meat in shell |\n",
+    "| Whole weight | float | Whole abalone |\n",
+    "| Shucked weight | float | Weight of meat only |\n",
+    "| Viscera weight | float | Gut weight (after bleeding) |\n",
+    "| Shell weight | float | Post-drying |\n",
+    "| Rings | integer | +1.5 gives the age in years|\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# Table of contents\n",
+    "\n",
+    "<a href=\"#setup\">1. Setup</a>\n",
+    "\n",
+    "<a href=\"#load_data\">2. Load data</a>\n",
+    "\n",
+    "<a href=\"#data_review\">3. Review raw data</a>\n",
+    "\n",
+    "<a href=\"#explore\">4. Explore data</a>\n",
+    "\n",
+    "<a href=\"#classification\">5. Classification models</a>\n",
+    "\n",
+    "* <a href=\"#logistic\">5a. Logistic regression</a>\n",
+    "\n",
+    "* <a href=\"#forest\">5b. Random forest</a>\n",
+    "\n",
+    "<a href=\"#regression\">6. Regression models</a>\n",
+    "\n",
+    "* <a href=\"#logistic\">6a. Linear regression</a>\n",
+    "\n",
+    "* <a href=\"#elastic\">6b. Elastic net</a>"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "<a id=\"setup\"></a>\n",
+    "# 1. Set Up Your Notebook Environment and Connect to the Database"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# this command allows for visualizations to appear in the notebook\n",
+    "%matplotlib inline\n",
+    "%load_ext sql\n",
+    "import math\n",
+    "import six\n",
+    "import pandas as pd\n",
+    "from sqlalchemy import create_engine\n",
+    "import numpy as np \n",
+    "import matplotlib.pyplot as plt\n",
+    "import seaborn as sns\n",
+    "pd.set_option('display.max_columns', 200)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Connect to Database"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# Greenplum Database 5.x on GCP (PM demo machine) - via tunnel\n",
+    "%sql postgresql://gpadmin@localhost:8000/madlib\n",
+    "        \n",
+    "# PostgreSQL local\n",
+    "#%sql postgresql://fmcquillan@localhost:5432/madlib"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "<a id=\"load_data\"></a>\n",
+    "# 2. Load Abalone Data"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "An [abalone](https://simple.wikipedia.org/wiki/Abalone) is a salt water univalve mollusc.\n",
+    "We'll load the data from ```web external table``` then start looking at the data."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Done.\n",
+      "Done.\n",
+      "10 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <tr>\n",
+       "        <th>sex</th>\n",
+       "        <th>length</th>\n",
+       "        <th>diameter</th>\n",
+       "        <th>height</th>\n",
+       "        <th>whole_weight</th>\n",
+       "        <th>shucked_weight</th>\n",
+       "        <th>viscera_weight</th>\n",
+       "        <th>shell_weight</th>\n",
+       "        <th>rings</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>M</td>\n",
+       "        <td>0.455</td>\n",
+       "        <td>0.365</td>\n",
+       "        <td>0.095</td>\n",
+       "        <td>0.514</td>\n",
+       "        <td>0.2245</td>\n",
+       "        <td>0.101</td>\n",
+       "        <td>0.15</td>\n",
+       "        <td>15</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>M</td>\n",
+       "        <td>0.35</td>\n",
+       "        <td>0.265</td>\n",
+       "        <td>0.09</td>\n",
+       "        <td>0.2255</td>\n",
+       "        <td>0.0995</td>\n",
+       "        <td>0.0485</td>\n",
+       "        <td>0.07</td>\n",
+       "        <td>7</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>F</td>\n",
+       "        <td>0.53</td>\n",
+       "        <td>0.42</td>\n",
+       "        <td>0.135</td>\n",
+       "        <td>0.677</td>\n",
+       "        <td>0.2565</td>\n",
+       "        <td>0.1415</td>\n",
+       "        <td>0.21</td>\n",
+       "        <td>9</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>M</td>\n",
+       "        <td>0.44</td>\n",
+       "        <td>0.365</td>\n",
+       "        <td>0.125</td>\n",
+       "        <td>0.516</td>\n",
+       "        <td>0.2155</td>\n",
+       "        <td>0.114</td>\n",
+       "        <td>0.155</td>\n",
+       "        <td>10</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>I</td>\n",
+       "        <td>0.33</td>\n",
+       "        <td>0.255</td>\n",
+       "        <td>0.08</td>\n",
+       "        <td>0.205</td>\n",
+       "        <td>0.0895</td>\n",
+       "        <td>0.0395</td>\n",
+       "        <td>0.055</td>\n",
+       "        <td>7</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>I</td>\n",
+       "        <td>0.425</td>\n",
+       "        <td>0.3</td>\n",
+       "        <td>0.095</td>\n",
+       "        <td>0.3515</td>\n",
+       "        <td>0.141</td>\n",
+       "        <td>0.0775</td>\n",
+       "        <td>0.12</td>\n",
+       "        <td>8</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>F</td>\n",
+       "        <td>0.53</td>\n",
+       "        <td>0.415</td>\n",
+       "        <td>0.15</td>\n",
+       "        <td>0.7775</td>\n",
+       "        <td>0.237</td>\n",
+       "        <td>0.1415</td>\n",
+       "        <td>0.33</td>\n",
+       "        <td>20</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>F</td>\n",
+       "        <td>0.545</td>\n",
+       "        <td>0.425</td>\n",
+       "        <td>0.125</td>\n",
+       "        <td>0.768</td>\n",
+       "        <td>0.294</td>\n",
+       "        <td>0.1495</td>\n",
+       "        <td>0.26</td>\n",
+       "        <td>16</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>M</td>\n",
+       "        <td>0.475</td>\n",
+       "        <td>0.37</td>\n",
+       "        <td>0.125</td>\n",
+       "        <td>0.5095</td>\n",
+       "        <td>0.2165</td>\n",
+       "        <td>0.1125</td>\n",
+       "        <td>0.165</td>\n",
+       "        <td>9</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>F</td>\n",
+       "        <td>0.55</td>\n",
+       "        <td>0.44</td>\n",
+       "        <td>0.15</td>\n",
+       "        <td>0.8945</td>\n",
+       "        <td>0.3145</td>\n",
+       "        <td>0.151</td>\n",
+       "        <td>0.32</td>\n",
+       "        <td>19</td>\n",
+       "    </tr>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[(u'M', 0.455, 0.365, 0.095, 0.514, 0.2245, 0.101, 0.15, 15),\n",
+       " (u'M', 0.35, 0.265, 0.09, 0.2255, 0.0995, 0.0485, 0.07, 7),\n",
+       " (u'F', 0.53, 0.42, 0.135, 0.677, 0.2565, 0.1415, 0.21, 9),\n",
+       " (u'M', 0.44, 0.365, 0.125, 0.516, 0.2155, 0.114, 0.155, 10),\n",
+       " (u'I', 0.33, 0.255, 0.08, 0.205, 0.0895, 0.0395, 0.055, 7),\n",
+       " (u'I', 0.425, 0.3, 0.095, 0.3515, 0.141, 0.0775, 0.12, 8),\n",
+       " (u'F', 0.53, 0.415, 0.15, 0.7775, 0.237, 0.1415, 0.33, 20),\n",
+       " (u'F', 0.545, 0.425, 0.125, 0.768, 0.294, 0.1495, 0.26, 16),\n",
+       " (u'M', 0.475, 0.37, 0.125, 0.5095, 0.2165, 0.1125, 0.165, 9),\n",
+       " (u'F', 0.55, 0.44, 0.15, 0.8945, 0.3145, 0.151, 0.32, 19)]"
+      ]
+     },
+     "execution_count": 3,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "---\n",
+    "--- The below code will create an external table that points at the data available at IMS/UCI.\n",
+    "---\n",
+    "drop external table if exists abalone_web;\n",
+    "create external web table\n",
+    "        abalone_web (\n",
+    "        sex char(1),\n",
+    "        length float,\n",
+    "        diameter float,\n",
+    "        height float,\n",
+    "        whole_weight float,\n",
+    "        shucked_weight float,\n",
+    "        viscera_weight float,\n",
+    "        shell_weight float,\n",
+    "        rings integer\n",
+    "    )\n",
+    "    location ( 'http://archive.ics.uci.edu/ml/machine-learning-databases/abalone/abalone.data' )\n",
+    "    format 'TEXT' ( delimiter ',' null '' )\n",
+    "    log errors\n",
+    "    segment reject limit 100\n",
+    ";\n",
+    "select * from abalone_web limit 10\n",
+    ";"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Create heap table"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Done.\n",
+      "Done.\n",
+      "Done.\n",
+      "Done.\n",
+      "4177 rows affected.\n",
+      "10 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <tr>\n",
+       "        <th>id</th>\n",
+       "        <th>sex</th>\n",
+       "        <th>length</th>\n",
+       "        <th>diameter</th>\n",
+       "        <th>height</th>\n",
+       "        <th>whole_weight</th>\n",
+       "        <th>shucked_weight</th>\n",
+       "        <th>viscera_weight</th>\n",
+       "        <th>shell_weight</th>\n",
+       "        <th>rings</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>0</td>\n",
+       "        <td>M</td>\n",
+       "        <td>0.455</td>\n",
+       "        <td>0.365</td>\n",
+       "        <td>0.095</td>\n",
+       "        <td>0.514</td>\n",
+       "        <td>0.2245</td>\n",
+       "        <td>0.101</td>\n",
+       "        <td>0.15</td>\n",
+       "        <td>15</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>1</td>\n",
+       "        <td>M</td>\n",
+       "        <td>0.35</td>\n",
+       "        <td>0.265</td>\n",
+       "        <td>0.09</td>\n",
+       "        <td>0.2255</td>\n",
+       "        <td>0.0995</td>\n",
+       "        <td>0.0485</td>\n",
+       "        <td>0.07</td>\n",
+       "        <td>7</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>2</td>\n",
+       "        <td>F</td>\n",
+       "        <td>0.53</td>\n",
+       "        <td>0.42</td>\n",
+       "        <td>0.135</td>\n",
+       "        <td>0.677</td>\n",
+       "        <td>0.2565</td>\n",
+       "        <td>0.1415</td>\n",
+       "        <td>0.21</td>\n",
+       "        <td>9</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>3</td>\n",
+       "        <td>M</td>\n",
+       "        <td>0.44</td>\n",
+       "        <td>0.365</td>\n",
+       "        <td>0.125</td>\n",
+       "        <td>0.516</td>\n",
+       "        <td>0.2155</td>\n",
+       "        <td>0.114</td>\n",
+       "        <td>0.155</td>\n",
+       "        <td>10</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>4</td>\n",
+       "        <td>I</td>\n",
+       "        <td>0.33</td>\n",
+       "        <td>0.255</td>\n",
+       "        <td>0.08</td>\n",
+       "        <td>0.205</td>\n",
+       "        <td>0.0895</td>\n",
+       "        <td>0.0395</td>\n",
+       "        <td>0.055</td>\n",
+       "        <td>7</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>5</td>\n",
+       "        <td>I</td>\n",
+       "        <td>0.425</td>\n",
+       "        <td>0.3</td>\n",
+       "        <td>0.095</td>\n",
+       "        <td>0.3515</td>\n",
+       "        <td>0.141</td>\n",
+       "        <td>0.0775</td>\n",
+       "        <td>0.12</td>\n",
+       "        <td>8</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>6</td>\n",
+       "        <td>F</td>\n",
+       "        <td>0.53</td>\n",
+       "        <td>0.415</td>\n",
+       "        <td>0.15</td>\n",
+       "        <td>0.7775</td>\n",
+       "        <td>0.237</td>\n",
+       "        <td>0.1415</td>\n",
+       "        <td>0.33</td>\n",
+       "        <td>20</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>7</td>\n",
+       "        <td>F</td>\n",
+       "        <td>0.545</td>\n",
+       "        <td>0.425</td>\n",
+       "        <td>0.125</td>\n",
+       "        <td>0.768</td>\n",
+       "        <td>0.294</td>\n",
+       "        <td>0.1495</td>\n",
+       "        <td>0.26</td>\n",
+       "        <td>16</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>8</td>\n",
+       "        <td>M</td>\n",
+       "        <td>0.475</td>\n",
+       "        <td>0.37</td>\n",
+       "        <td>0.125</td>\n",
+       "        <td>0.5095</td>\n",
+       "        <td>0.2165</td>\n",
+       "        <td>0.1125</td>\n",
+       "        <td>0.165</td>\n",
+       "        <td>9</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>9</td>\n",
+       "        <td>F</td>\n",
+       "        <td>0.55</td>\n",
+       "        <td>0.44</td>\n",
+       "        <td>0.15</td>\n",
+       "        <td>0.8945</td>\n",
+       "        <td>0.3145</td>\n",
+       "        <td>0.151</td>\n",
+       "        <td>0.32</td>\n",
+       "        <td>19</td>\n",
+       "    </tr>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[(0, u'M', 0.455, 0.365, 0.095, 0.514, 0.2245, 0.101, 0.15, 15),\n",
+       " (1, u'M', 0.35, 0.265, 0.09, 0.2255, 0.0995, 0.0485, 0.07, 7),\n",
+       " (2, u'F', 0.53, 0.42, 0.135, 0.677, 0.2565, 0.1415, 0.21, 9),\n",
+       " (3, u'M', 0.44, 0.365, 0.125, 0.516, 0.2155, 0.114, 0.155, 10),\n",
+       " (4, u'I', 0.33, 0.255, 0.08, 0.205, 0.0895, 0.0395, 0.055, 7),\n",
+       " (5, u'I', 0.425, 0.3, 0.095, 0.3515, 0.141, 0.0775, 0.12, 8),\n",
+       " (6, u'F', 0.53, 0.415, 0.15, 0.7775, 0.237, 0.1415, 0.33, 20),\n",
+       " (7, u'F', 0.545, 0.425, 0.125, 0.768, 0.294, 0.1495, 0.26, 16),\n",
+       " (8, u'M', 0.475, 0.37, 0.125, 0.5095, 0.2165, 0.1125, 0.165, 9),\n",
+       " (9, u'F', 0.55, 0.44, 0.15, 0.8945, 0.3145, 0.151, 0.32, 19)]"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "DROP TABLE IF EXISTS abalone;\n",
+    "CREATE TABLE abalone (\n",
+    "        id integer,\n",
+    "        sex char(1),\n",
+    "        length float,\n",
+    "        diameter float,\n",
+    "        height float,\n",
+    "        whole_weight float,\n",
+    "        shucked_weight float,\n",
+    "        viscera_weight float,\n",
+    "        shell_weight float,\n",
+    "        rings integer\n",
+    "    )\n",
+    ";\n",
+    "    \n",
+    "DROP SEQUENCE IF EXISTS abalone_id ;\n",
+    "CREATE TEMPORARY SEQUENCE abalone_id MINVALUE 0 START 0;\n",
+    "\n",
+    "insert into \n",
+    "     abalone \n",
+    "select \n",
+    "      nextval('abalone_id') as id, *\n",
+    "FROM \n",
+    "      abalone_web\n",
+    ";\n",
+    "\n",
+    "\n",
+    "SELECT * FROM abalone ORDER BY id LIMIT 10;"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "<a id=\"data_review\"></a>\n",
+    "# 3. Review raw data\n",
+    "\n",
+    "Load some data into a local variable ```abalone```"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "4177 rows affected.\n"
+     ]
+    }
+   ],
+   "source": [
+    "abalone = %sql select * from abalone where random() < 1.0 order by id limit 5000;\n",
+    "abalone = abalone.DataFrame()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "<class 'pandas.core.frame.DataFrame'>\n",
+      "RangeIndex: 4177 entries, 0 to 4176\n",
+      "Data columns (total 10 columns):\n",
+      "id                4177 non-null int64\n",
+      "sex               4177 non-null object\n",
+      "length            4177 non-null float64\n",
+      "diameter          4177 non-null float64\n",
+      "height            4177 non-null float64\n",
+      "whole_weight      4177 non-null float64\n",
+      "shucked_weight    4177 non-null float64\n",
+      "viscera_weight    4177 non-null float64\n",
+      "shell_weight      4177 non-null float64\n",
+      "rings             4177 non-null int64\n",
+      "dtypes: float64(7), int64(2), object(1)\n",
+      "memory usage: 326.4+ KB\n"
+     ]
+    }
+   ],
+   "source": [
+    "abalone.info();"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "We're interested in estimating the age of the abalone in the data.  To get age, add 1.5 to the number of rings.  A good place to begin is to create a histogram of the target variable."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYAAAAD8CAYAAAB+UHOxAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi41LCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvSM8oowAAEwdJREFUeJzt3X+MZeV93/H3p2BsAi0Lxhqh3W2XNqtErjdNnBEmchQNpnUAR1kiORSLxotLta2EU6esFK/TP3BTWSJtiGtLKdXG0Kwl12uCnbIKpA7CjFz/ATHYhOVHUjZkCbta2Dj8cMZOYk387R/3wRrvzrDLvXfm7p3n/ZJGc85znnPv9+Fc9nPPc8+5k6pCktSfvzfpAiRJk2EASFKnDABJ6pQBIEmdMgAkqVMGgCR1ygCQpE4ZAJLUKQNAkjp15qQLeC0XXnhhbdmyZdJlnJJv [...]
+      "text/plain": [
+       "<Figure size 432x288 with 1 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "(abalone.rings + 1.5 ).hist(bins=20);"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "True     2770\n",
+       "False    1407\n",
+       "Name: rings, dtype: int64"
+      ]
+     },
+     "execution_count": 8,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "((abalone.rings + 1.5) >= 10).value_counts()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Look at the cumulative distribution"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEKCAYAAAD9xUlFAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi41LCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvSM8oowAAIABJREFUeJzt3Xl8VeW59//PlYEESAiEMUACKCgzAilqtS1ocRbqXOpcK9qjPdUWz9E+PR6xP59TK7W0PT61aNWqVUodEC0KrcWxVQJhRgVkTMI8JQESspPr98feiQEhWUB2drLzfb9e67XXvK/lwn1l3fe679vcHREREYCEWAcgIiJNh5KCiIjUUFIQEZEaSgoiIlJDSUFERGooKYiISA0lBRERqaGkICIiNZQURESkRlKsAzhWnTp18t69e8c6DBGRZmXhwoU73L1zffs1u6TQu3dv [...]
+      "text/plain": [
+       "<Figure size 432x288 with 1 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "n_cumsum_df = pd.DataFrame({'Cumulative Sum':((abalone.rings + 1.5).value_counts().sort_index().cumsum())/abalone.shape[0]})\n",
+    "ax = n_cumsum_df.plot();\n",
+    "ax.set_xlabel('Age');\n",
+    "ax.set_ylabel('Normalized Cumulative Sum');"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "<a id=\"explore\"></a>\n",
+    "# 4. Process and explore data\n",
+    "\n",
+    "Create a column for maturity"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Done.\n",
+      "4177 rows affected.\n",
+      "10 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <tr>\n",
+       "        <th>id</th>\n",
+       "        <th>sex</th>\n",
+       "        <th>length</th>\n",
+       "        <th>diameter</th>\n",
+       "        <th>height</th>\n",
+       "        <th>whole_weight</th>\n",
+       "        <th>shucked_weight</th>\n",
+       "        <th>viscera_weight</th>\n",
+       "        <th>shell_weight</th>\n",
+       "        <th>rings</th>\n",
+       "        <th>age</th>\n",
+       "        <th>mature</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>3</td>\n",
+       "        <td>m</td>\n",
+       "        <td>0.44</td>\n",
+       "        <td>0.365</td>\n",
+       "        <td>0.125</td>\n",
+       "        <td>0.516</td>\n",
+       "        <td>0.2155</td>\n",
+       "        <td>0.114</td>\n",
+       "        <td>0.155</td>\n",
+       "        <td>10</td>\n",
+       "        <td>11.5</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>7</td>\n",
+       "        <td>f</td>\n",
+       "        <td>0.545</td>\n",
+       "        <td>0.425</td>\n",
+       "        <td>0.125</td>\n",
+       "        <td>0.768</td>\n",
+       "        <td>0.294</td>\n",
+       "        <td>0.1495</td>\n",
+       "        <td>0.26</td>\n",
+       "        <td>16</td>\n",
+       "        <td>17.5</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>11</td>\n",
+       "        <td>m</td>\n",
+       "        <td>0.43</td>\n",
+       "        <td>0.35</td>\n",
+       "        <td>0.11</td>\n",
+       "        <td>0.406</td>\n",
+       "        <td>0.1675</td>\n",
+       "        <td>0.081</td>\n",
+       "        <td>0.135</td>\n",
+       "        <td>10</td>\n",
+       "        <td>11.5</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>15</td>\n",
+       "        <td>m</td>\n",
+       "        <td>0.5</td>\n",
+       "        <td>0.4</td>\n",
+       "        <td>0.13</td>\n",
+       "        <td>0.6645</td>\n",
+       "        <td>0.258</td>\n",
+       "        <td>0.133</td>\n",
+       "        <td>0.24</td>\n",
+       "        <td>12</td>\n",
+       "        <td>13.5</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>19</td>\n",
+       "        <td>m</td>\n",
+       "        <td>0.45</td>\n",
+       "        <td>0.32</td>\n",
+       "        <td>0.1</td>\n",
+       "        <td>0.381</td>\n",
+       "        <td>0.1705</td>\n",
+       "        <td>0.075</td>\n",
+       "        <td>0.115</td>\n",
+       "        <td>9</td>\n",
+       "        <td>10.5</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>23</td>\n",
+       "        <td>f</td>\n",
+       "        <td>0.55</td>\n",
+       "        <td>0.415</td>\n",
+       "        <td>0.135</td>\n",
+       "        <td>0.7635</td>\n",
+       "        <td>0.318</td>\n",
+       "        <td>0.21</td>\n",
+       "        <td>0.2</td>\n",
+       "        <td>9</td>\n",
+       "        <td>10.5</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>27</td>\n",
+       "        <td>m</td>\n",
+       "        <td>0.59</td>\n",
+       "        <td>0.445</td>\n",
+       "        <td>0.14</td>\n",
+       "        <td>0.931</td>\n",
+       "        <td>0.356</td>\n",
+       "        <td>0.234</td>\n",
+       "        <td>0.28</td>\n",
+       "        <td>12</td>\n",
+       "        <td>13.5</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>31</td>\n",
+       "        <td>f</td>\n",
+       "        <td>0.68</td>\n",
+       "        <td>0.56</td>\n",
+       "        <td>0.165</td>\n",
+       "        <td>1.639</td>\n",
+       "        <td>0.6055</td>\n",
+       "        <td>0.2805</td>\n",
+       "        <td>0.46</td>\n",
+       "        <td>15</td>\n",
+       "        <td>16.5</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>35</td>\n",
+       "        <td>m</td>\n",
+       "        <td>0.465</td>\n",
+       "        <td>0.355</td>\n",
+       "        <td>0.105</td>\n",
+       "        <td>0.4795</td>\n",
+       "        <td>0.227</td>\n",
+       "        <td>0.124</td>\n",
+       "        <td>0.125</td>\n",
+       "        <td>8</td>\n",
+       "        <td>9.5</td>\n",
+       "        <td>0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>39</td>\n",
+       "        <td>m</td>\n",
+       "        <td>0.355</td>\n",
+       "        <td>0.29</td>\n",
+       "        <td>0.09</td>\n",
+       "        <td>0.3275</td>\n",
+       "        <td>0.134</td>\n",
+       "        <td>0.086</td>\n",
+       "        <td>0.09</td>\n",
+       "        <td>9</td>\n",
+       "        <td>10.5</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[(3, u'm', 0.44, 0.365, 0.125, 0.516, 0.2155, 0.114, 0.155, 10, Decimal('11.5'), 1),\n",
+       " (7, u'f', 0.545, 0.425, 0.125, 0.768, 0.294, 0.1495, 0.26, 16, Decimal('17.5'), 1),\n",
+       " (11, u'm', 0.43, 0.35, 0.11, 0.406, 0.1675, 0.081, 0.135, 10, Decimal('11.5'), 1),\n",
+       " (15, u'm', 0.5, 0.4, 0.13, 0.6645, 0.258, 0.133, 0.24, 12, Decimal('13.5'), 1),\n",
+       " (19, u'm', 0.45, 0.32, 0.1, 0.381, 0.1705, 0.075, 0.115, 9, Decimal('10.5'), 1),\n",
+       " (23, u'f', 0.55, 0.415, 0.135, 0.7635, 0.318, 0.21, 0.2, 9, Decimal('10.5'), 1),\n",
+       " (27, u'm', 0.59, 0.445, 0.14, 0.931, 0.356, 0.234, 0.28, 12, Decimal('13.5'), 1),\n",
+       " (31, u'f', 0.68, 0.56, 0.165, 1.639, 0.6055, 0.2805, 0.46, 15, Decimal('16.5'), 1),\n",
+       " (35, u'm', 0.465, 0.355, 0.105, 0.4795, 0.227, 0.124, 0.125, 8, Decimal('9.5'), 0),\n",
+       " (39, u'm', 0.355, 0.29, 0.09, 0.3275, 0.134, 0.086, 0.09, 9, Decimal('10.5'), 1)]"
+      ]
+     },
+     "execution_count": 10,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "DROP TABLE IF EXISTS abalone_target;\n",
+    "CREATE TABLE abalone_target\n",
+    "AS\n",
+    "SELECT \n",
+    "    id,\n",
+    "    lower(sex) as sex,                     --- ensure that sex is indicated in lower case  (m, f, i)\n",
+    "    \"length\",\n",
+    "    diameter,\n",
+    "    height,\n",
+    "    whole_weight,\n",
+    "    shucked_weight,\n",
+    "    viscera_weight,\n",
+    "    shell_weight,\n",
+    "    rings,\n",
+    "    rings + 1.5 as age,                    --- Define the age\n",
+    "    CASE WHEN                              --- Identifies whether the abalone is mature or not (1/0)\n",
+    "            (rings + 1.5) >= 10.0\n",
+    "        THEN 1\n",
+    "        ELSE 0\n",
+    "    END as mature\n",
+    "FROM abalone\n",
+    ";\n",
+    "SELECT * FROM abalone_target LIMIT 10;  --- show a sample"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Encode categorical variables\n",
+    "\n",
+    "Next use [MADlib to one-hot encode](http://madlib.apache.org/docs/latest/group__grp__encode__categorical.html) the “sex” column which is a categorical variable.  In order to create a predictive model, we need all our columns to be numerical values.  Making sure all our model inputs conform to this standard is an important part of the data science modeling pipeline and is considered part of the preprocessing/data cleaning step of the process."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 11,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Done.\n",
+      "1 rows affected.\n",
+      "10 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <tr>\n",
+       "        <th>id</th>\n",
+       "        <th>length</th>\n",
+       "        <th>diameter</th>\n",
+       "        <th>height</th>\n",
+       "        <th>whole_weight</th>\n",
+       "        <th>shucked_weight</th>\n",
+       "        <th>viscera_weight</th>\n",
+       "        <th>shell_weight</th>\n",
+       "        <th>rings</th>\n",
+       "        <th>age</th>\n",
+       "        <th>mature</th>\n",
+       "        <th>sex_f</th>\n",
+       "        <th>sex_i</th>\n",
+       "        <th>sex_m</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>3</td>\n",
+       "        <td>0.44</td>\n",
+       "        <td>0.365</td>\n",
+       "        <td>0.125</td>\n",
+       "        <td>0.516</td>\n",
+       "        <td>0.2155</td>\n",
+       "        <td>0.114</td>\n",
+       "        <td>0.155</td>\n",
+       "        <td>10</td>\n",
+       "        <td>11.5</td>\n",
+       "        <td>1</td>\n",
+       "        <td>0</td>\n",
+       "        <td>0</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>11</td>\n",
+       "        <td>0.43</td>\n",
+       "        <td>0.35</td>\n",
+       "        <td>0.11</td>\n",
+       "        <td>0.406</td>\n",
+       "        <td>0.1675</td>\n",
+       "        <td>0.081</td>\n",
+       "        <td>0.135</td>\n",
+       "        <td>10</td>\n",
+       "        <td>11.5</td>\n",
+       "        <td>1</td>\n",
+       "        <td>0</td>\n",
+       "        <td>0</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>19</td>\n",
+       "        <td>0.45</td>\n",
+       "        <td>0.32</td>\n",
+       "        <td>0.1</td>\n",
+       "        <td>0.381</td>\n",
+       "        <td>0.1705</td>\n",
+       "        <td>0.075</td>\n",
+       "        <td>0.115</td>\n",
+       "        <td>9</td>\n",
+       "        <td>10.5</td>\n",
+       "        <td>1</td>\n",
+       "        <td>0</td>\n",
+       "        <td>0</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>27</td>\n",
+       "        <td>0.59</td>\n",
+       "        <td>0.445</td>\n",
+       "        <td>0.14</td>\n",
+       "        <td>0.931</td>\n",
+       "        <td>0.356</td>\n",
+       "        <td>0.234</td>\n",
+       "        <td>0.28</td>\n",
+       "        <td>12</td>\n",
+       "        <td>13.5</td>\n",
+       "        <td>1</td>\n",
+       "        <td>0</td>\n",
+       "        <td>0</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>35</td>\n",
+       "        <td>0.465</td>\n",
+       "        <td>0.355</td>\n",
+       "        <td>0.105</td>\n",
+       "        <td>0.4795</td>\n",
+       "        <td>0.227</td>\n",
+       "        <td>0.124</td>\n",
+       "        <td>0.125</td>\n",
+       "        <td>8</td>\n",
+       "        <td>9.5</td>\n",
+       "        <td>0</td>\n",
+       "        <td>0</td>\n",
+       "        <td>0</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>43</td>\n",
+       "        <td>0.205</td>\n",
+       "        <td>0.15</td>\n",
+       "        <td>0.055</td>\n",
+       "        <td>0.042</td>\n",
+       "        <td>0.0255</td>\n",
+       "        <td>0.015</td>\n",
+       "        <td>0.012</td>\n",
+       "        <td>5</td>\n",
+       "        <td>6.5</td>\n",
+       "        <td>0</td>\n",
+       "        <td>0</td>\n",
+       "        <td>1</td>\n",
+       "        <td>0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>51</td>\n",
+       "        <td>0.4</td>\n",
+       "        <td>0.32</td>\n",
+       "        <td>0.095</td>\n",
+       "        <td>0.303</td>\n",
+       "        <td>0.1335</td>\n",
+       "        <td>0.06</td>\n",
+       "        <td>0.1</td>\n",
+       "        <td>7</td>\n",
+       "        <td>8.5</td>\n",
+       "        <td>0</td>\n",
+       "        <td>0</td>\n",
+       "        <td>0</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>59</td>\n",
+       "        <td>0.505</td>\n",
+       "        <td>0.4</td>\n",
+       "        <td>0.125</td>\n",
+       "        <td>0.583</td>\n",
+       "        <td>0.246</td>\n",
+       "        <td>0.13</td>\n",
+       "        <td>0.175</td>\n",
+       "        <td>7</td>\n",
+       "        <td>8.5</td>\n",
+       "        <td>0</td>\n",
+       "        <td>1</td>\n",
+       "        <td>0</td>\n",
+       "        <td>0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>67</td>\n",
+       "        <td>0.595</td>\n",
+       "        <td>0.495</td>\n",
+       "        <td>0.185</td>\n",
+       "        <td>1.285</td>\n",
+       "        <td>0.416</td>\n",
+       "        <td>0.224</td>\n",
+       "        <td>0.485</td>\n",
+       "        <td>13</td>\n",
+       "        <td>14.5</td>\n",
+       "        <td>1</td>\n",
+       "        <td>1</td>\n",
+       "        <td>0</td>\n",
+       "        <td>0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>75</td>\n",
+       "        <td>0.6</td>\n",
+       "        <td>0.475</td>\n",
+       "        <td>0.15</td>\n",
+       "        <td>1.0075</td>\n",
+       "        <td>0.4425</td>\n",
+       "        <td>0.221</td>\n",
+       "        <td>0.28</td>\n",
+       "        <td>15</td>\n",
+       "        <td>16.5</td>\n",
+       "        <td>1</td>\n",
+       "        <td>1</td>\n",
+       "        <td>0</td>\n",
+       "        <td>0</td>\n",
+       "    </tr>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[(3, 0.44, 0.365, 0.125, 0.516, 0.2155, 0.114, 0.155, 10, Decimal('11.5'), 1, 0, 0, 1),\n",
+       " (11, 0.43, 0.35, 0.11, 0.406, 0.1675, 0.081, 0.135, 10, Decimal('11.5'), 1, 0, 0, 1),\n",
+       " (19, 0.45, 0.32, 0.1, 0.381, 0.1705, 0.075, 0.115, 9, Decimal('10.5'), 1, 0, 0, 1),\n",
+       " (27, 0.59, 0.445, 0.14, 0.931, 0.356, 0.234, 0.28, 12, Decimal('13.5'), 1, 0, 0, 1),\n",
+       " (35, 0.465, 0.355, 0.105, 0.4795, 0.227, 0.124, 0.125, 8, Decimal('9.5'), 0, 0, 0, 1),\n",
+       " (43, 0.205, 0.15, 0.055, 0.042, 0.0255, 0.015, 0.012, 5, Decimal('6.5'), 0, 0, 1, 0),\n",
+       " (51, 0.4, 0.32, 0.095, 0.303, 0.1335, 0.06, 0.1, 7, Decimal('8.5'), 0, 0, 0, 1),\n",
+       " (59, 0.505, 0.4, 0.125, 0.583, 0.246, 0.13, 0.175, 7, Decimal('8.5'), 0, 1, 0, 0),\n",
+       " (67, 0.595, 0.495, 0.185, 1.285, 0.416, 0.224, 0.485, 13, Decimal('14.5'), 1, 1, 0, 0),\n",
+       " (75, 0.6, 0.475, 0.15, 1.0075, 0.4425, 0.221, 0.28, 15, Decimal('16.5'), 1, 1, 0, 0)]"
+      ]
+     },
+     "execution_count": 11,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "DROP TABLE IF EXISTS abalone_encoded;\n",
+    "SELECT\n",
+    "madlib.encode_categorical_variables (\n",
+    "        'abalone_target',  -- input table\n",
+    "        'abalone_encoded',  -- output table\n",
+    "        'sex',   -- categorical_cols\n",
+    "        NULL,  --categorical_cols_to_exclude    -- Optional\n",
+    "        NULL,  --row_id,                         -- Optional\n",
+    "        NULL,  --top,                            -- Optional\n",
+    "        NULL,  --value_to_drop,                  -- Optional\n",
+    "        NULL,  --encode_null,                    -- Optional\n",
+    "        NULL,  --output_type,                    -- Optional\n",
+    "        NULL,  --output_dictionary,              -- Optional\n",
+    "        NULL  --distributed_by                  -- Optional\n",
+    "    )\n",
+    ";\n",
+    "SELECT *\n",
+    "FROM abalone_encoded\n",
+    "LIMIT 10"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "##  Statistics\n",
+    "\n",
+    "The next step through the modeling process is to explore our data.  We’ll again use some of MADLib’s built in functionality to generate [descriptive statistics](http://madlib.apache.org/docs/latest/group__grp__summary.html) of our data.  This will generate important information about the data including count, number of missing values, the mean, median, maximum, minimum, interquartile range, mode, and variance.\n",
+    "\n",
+    "Note that you only want to do this after converting categorical data to numeric data because otherwise the statistics will not be compute correctly."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 12,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Done.\n",
+      "1 rows affected.\n",
+      "14 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <tr>\n",
+       "        <th>group_by</th>\n",
+       "        <th>group_by_value</th>\n",
+       "        <th>target_column</th>\n",
+       "        <th>column_number</th>\n",
+       "        <th>data_type</th>\n",
+       "        <th>row_count</th>\n",
+       "        <th>distinct_values</th>\n",
+       "        <th>missing_values</th>\n",
+       "        <th>blank_values</th>\n",
+       "        <th>fraction_missing</th>\n",
+       "        <th>fraction_blank</th>\n",
+       "        <th>positive_values</th>\n",
+       "        <th>negative_values</th>\n",
+       "        <th>zero_values</th>\n",
+       "        <th>mean</th>\n",
+       "        <th>variance</th>\n",
+       "        <th>confidence_interval</th>\n",
+       "        <th>min</th>\n",
+       "        <th>max</th>\n",
+       "        <th>first_quartile</th>\n",
+       "        <th>median</th>\n",
+       "        <th>third_quartile</th>\n",
+       "        <th>most_frequent_values</th>\n",
+       "        <th>mfv_frequencies</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>None</td>\n",
+       "        <td>None</td>\n",
+       "        <td>id</td>\n",
+       "        <td>1</td>\n",
+       "        <td>int4</td>\n",
+       "        <td>4177</td>\n",
+       "        <td>4177</td>\n",
+       "        <td>0</td>\n",
+       "        <td>None</td>\n",
+       "        <td>0.0</td>\n",
+       "        <td>None</td>\n",
+       "        <td>4176</td>\n",
+       "        <td>0</td>\n",
+       "        <td>1</td>\n",
+       "        <td>2088.0</td>\n",
+       "        <td>1454292.16667</td>\n",
+       "        <td>[2051.42791957426, 2124.57208042574]</td>\n",
+       "        <td>0.0</td>\n",
+       "        <td>4176.0</td>\n",
+       "        <td>1044.0</td>\n",
+       "        <td>2088.0</td>\n",
+       "        <td>3132.0</td>\n",
+       "        <td>[u'4021', u'3921', u'4076', u'4117', u'4114', u'3348', u'3114', u'3453', u'3593', u'3377']</td>\n",
+       "        <td>[5L, 5L, 5L, 5L, 5L, 4L, 4L, 4L, 4L, 4L]</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>None</td>\n",
+       "        <td>None</td>\n",
+       "        <td>length</td>\n",
+       "        <td>2</td>\n",
+       "        <td>float8</td>\n",
+       "        <td>4177</td>\n",
+       "        <td>134</td>\n",
+       "        <td>0</td>\n",
+       "        <td>None</td>\n",
+       "        <td>0.0</td>\n",
+       "        <td>None</td>\n",
+       "        <td>4177</td>\n",
+       "        <td>0</td>\n",
+       "        <td>0</td>\n",
+       "        <td>0.523992099593</td>\n",
+       "        <td>0.0144223076483</td>\n",
+       "        <td>[0.520350088942874, 0.527634110243145]</td>\n",
+       "        <td>0.075</td>\n",
+       "        <td>0.815</td>\n",
+       "        <td>0.45</td>\n",
+       "        <td>0.545</td>\n",
+       "        <td>0.615</td>\n",
+       "        <td>[u'0.625', u'0.55', u'0.575', u'0.58', u'0.6', u'0.62', u'0.5', u'0.57', u'0.63', u'0.61']</td>\n",
+       "        <td>[94L, 94L, 93L, 92L, 87L, 87L, 81L, 79L, 78L, 75L]</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>None</td>\n",
+       "        <td>None</td>\n",
+       "        <td>diameter</td>\n",
+       "        <td>3</td>\n",
+       "        <td>float8</td>\n",
+       "        <td>4177</td>\n",
+       "        <td>111</td>\n",
+       "        <td>0</td>\n",
+       "        <td>None</td>\n",
+       "        <td>0.0</td>\n",
+       "        <td>None</td>\n",
+       "        <td>4177</td>\n",
+       "        <td>0</td>\n",
+       "        <td>0</td>\n",
+       "        <td>0.407881254489</td>\n",
+       "        <td>0.00984855103022</td>\n",
+       "        <td>[0.404871645997762, 0.410890862979976]</td>\n",
+       "        <td>0.055</td>\n",
+       "        <td>0.65</td>\n",
+       "        <td>0.35</td>\n",
+       "        <td>0.425</td>\n",
+       "        <td>0.48</td>\n",
+       "        <td>[u'0.45', u'0.475', u'0.4', u'0.5', u'0.47', u'0.48', u'0.455', u'0.46', u'0.44', u'0.485']</td>\n",
+       "        <td>[139L, 120L, 111L, 110L, 100L, 91L, 90L, 89L, 87L, 83L]</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>None</td>\n",
+       "        <td>None</td>\n",
+       "        <td>height</td>\n",
+       "        <td>4</td>\n",
+       "        <td>float8</td>\n",
+       "        <td>4177</td>\n",
+       "        <td>51</td>\n",
+       "        <td>0</td>\n",
+       "        <td>None</td>\n",
+       "        <td>0.0</td>\n",
+       "        <td>None</td>\n",
+       "        <td>4175</td>\n",
+       "        <td>0</td>\n",
+       "        <td>2</td>\n",
+       "        <td>0.13951639933</td>\n",
+       "        <td>0.00174950266443</td>\n",
+       "        <td>[0.138247926591562, 0.140784872067761]</td>\n",
+       "        <td>0.0</td>\n",
+       "        <td>1.13</td>\n",
+       "        <td>0.115</td>\n",
+       "        <td>0.14</td>\n",
+       "        <td>0.165</td>\n",
+       "        <td>[u'0.15', u'0.14', u'0.155', u'0.175', u'0.16', u'0.125', u'0.165', u'0.135', u'0.145', u'0.12']</td>\n",
+       "        <td>[267L, 220L, 217L, 211L, 205L, 202L, 193L, 189L, 182L, 169L]</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>None</td>\n",
+       "        <td>None</td>\n",
+       "        <td>whole_weight</td>\n",
+       "        <td>5</td>\n",
+       "        <td>float8</td>\n",
+       "        <td>4177</td>\n",
+       "        <td>2429</td>\n",
+       "        <td>0</td>\n",
+       "        <td>None</td>\n",
+       "        <td>0.0</td>\n",
+       "        <td>None</td>\n",
+       "        <td>4177</td>\n",
+       "        <td>0</td>\n",
+       "        <td>0</td>\n",
+       "        <td>0.828742159445</td>\n",
+       "        <td>0.240481389202</td>\n",
+       "        <td>[0.813870324055102, 0.843613994834059]</td>\n",
+       "        <td>0.002</td>\n",
+       "        <td>2.8255</td>\n",
+       "        <td>0.4415</td>\n",
+       "        <td>0.7995</td>\n",
+       "        <td>1.153</td>\n",
+       "        <td>[u'1.1345', u'0.2225', u'0.196', u'0.4775', u'0.494', u'0.872', u'1.1155', u'0.97', u'0.4425', u'1.0835']</td>\n",
+       "        <td>[10L, 8L, 8L, 7L, 7L, 7L, 7L, 7L, 7L, 7L]</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>None</td>\n",
+       "        <td>None</td>\n",
+       "        <td>shucked_weight</td>\n",
+       "        <td>6</td>\n",
+       "        <td>float8</td>\n",
+       "        <td>4177</td>\n",
+       "        <td>1515</td>\n",
+       "        <td>0</td>\n",
+       "        <td>None</td>\n",
+       "        <td>0.0</td>\n",
+       "        <td>None</td>\n",
+       "        <td>4177</td>\n",
+       "        <td>0</td>\n",
+       "        <td>0</td>\n",
+       "        <td>0.359367488628</td>\n",
+       "        <td>0.0492675507435</td>\n",
+       "        <td>[0.352636105342961, 0.36609887191344]</td>\n",
+       "        <td>0.001</td>\n",
+       "        <td>1.488</td>\n",
+       "        <td>0.186</td>\n",
+       "        <td>0.336</td>\n",
+       "        <td>0.502</td>\n",
+       "        <td>[u'0.175', u'0.2505', u'0.419', u'0.096', u'0.097', u'0.0745', u'0.2945', u'0.2025', u'0.21', u'0.2']</td>\n",
+       "        <td>[11L, 10L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L]</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>None</td>\n",
+       "        <td>None</td>\n",
+       "        <td>viscera_weight</td>\n",
+       "        <td>7</td>\n",
+       "        <td>float8</td>\n",
+       "        <td>4177</td>\n",
+       "        <td>880</td>\n",
+       "        <td>0</td>\n",
+       "        <td>None</td>\n",
+       "        <td>0.0</td>\n",
+       "        <td>None</td>\n",
+       "        <td>4177</td>\n",
+       "        <td>0</td>\n",
+       "        <td>0</td>\n",
+       "        <td>0.180593607853</td>\n",
+       "        <td>0.01201528386</td>\n",
+       "        <td>[0.177269379483621, 0.183917836221432]</td>\n",
+       "        <td>0.0005</td>\n",
+       "        <td>0.76</td>\n",
+       "        <td>0.0935</td>\n",
+       "        <td>0.171</td>\n",
+       "        <td>0.253</td>\n",
+       "        <td>[u'0.1715', u'0.196', u'0.061', u'0.0575', u'0.2195', u'0.037', u'0.099', u'0.096', u'0.0265', u'0.1905']</td>\n",
+       "        <td>[15L, 14L, 13L, 13L, 13L, 13L, 12L, 12L, 12L, 12L]</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>None</td>\n",
+       "        <td>None</td>\n",
+       "        <td>shell_weight</td>\n",
+       "        <td>8</td>\n",
+       "        <td>float8</td>\n",
+       "        <td>4177</td>\n",
+       "        <td>926</td>\n",
+       "        <td>0</td>\n",
+       "        <td>None</td>\n",
+       "        <td>0.0</td>\n",
+       "        <td>None</td>\n",
+       "        <td>4177</td>\n",
+       "        <td>0</td>\n",
+       "        <td>0</td>\n",
+       "        <td>0.238830859469</td>\n",
+       "        <td>0.0193773832022</td>\n",
+       "        <td>[0.234609314715373, 0.243052404221663]</td>\n",
+       "        <td>0.0015</td>\n",
+       "        <td>1.005</td>\n",
+       "        <td>0.13</td>\n",
+       "        <td>0.234</td>\n",
+       "        <td>0.329</td>\n",
+       "        <td>[u'0.275', u'0.25', u'0.315', u'0.265', u'0.185', u'0.285', u'0.17', u'0.3', u'0.22', u'0.175']</td>\n",
+       "        <td>[43L, 42L, 40L, 40L, 40L, 37L, 37L, 37L, 36L, 36L]</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>None</td>\n",
+       "        <td>None</td>\n",
+       "        <td>rings</td>\n",
+       "        <td>9</td>\n",
+       "        <td>int4</td>\n",
+       "        <td>4177</td>\n",
+       "        <td>28</td>\n",
+       "        <td>0</td>\n",
+       "        <td>None</td>\n",
+       "        <td>0.0</td>\n",
+       "        <td>None</td>\n",
+       "        <td>4177</td>\n",
+       "        <td>0</td>\n",
+       "        <td>0</td>\n",
+       "        <td>9.93368446253</td>\n",
+       "        <td>10.3952659473</td>\n",
+       "        <td>[9.83590635305212, 10.0314625720137]</td>\n",
+       "        <td>1.0</td>\n",
+       "        <td>29.0</td>\n",
+       "        <td>8.0</td>\n",
+       "        <td>9.0</td>\n",
+       "        <td>11.0</td>\n",
+       "        <td>[u'9', u'10', u'8', u'11', u'7', u'12', u'6', u'13', u'14', u'5']</td>\n",
+       "        <td>[689L, 634L, 568L, 487L, 391L, 267L, 259L, 203L, 126L, 115L]</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>None</td>\n",
+       "        <td>None</td>\n",
+       "        <td>age</td>\n",
+       "        <td>10</td>\n",
+       "        <td>numeric</td>\n",
+       "        <td>4177</td>\n",
+       "        <td>28</td>\n",
+       "        <td>0</td>\n",
+       "        <td>None</td>\n",
+       "        <td>0.0</td>\n",
+       "        <td>None</td>\n",
+       "        <td>4177</td>\n",
+       "        <td>0</td>\n",
+       "        <td>0</td>\n",
+       "        <td>11.4336844625</td>\n",
+       "        <td>10.3952659473</td>\n",
+       "        <td>[11.3359063530521, 11.5314625720137]</td>\n",
+       "        <td>2.5</td>\n",
+       "        <td>30.5</td>\n",
+       "        <td>9.5</td>\n",
+       "        <td>10.5</td>\n",
+       "        <td>12.5</td>\n",
+       "        <td>[u'10.5', u'11.5', u'9.5', u'12.5', u'8.5', u'13.5', u'7.5', u'14.5', u'15.5', u'6.5']</td>\n",
+       "        <td>[689L, 634L, 568L, 487L, 391L, 267L, 259L, 203L, 126L, 115L]</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>None</td>\n",
+       "        <td>None</td>\n",
+       "        <td>mature</td>\n",
+       "        <td>11</td>\n",
+       "        <td>int4</td>\n",
+       "        <td>4177</td>\n",
+       "        <td>2</td>\n",
+       "        <td>0</td>\n",
+       "        <td>None</td>\n",
+       "        <td>0.0</td>\n",
+       "        <td>None</td>\n",
+       "        <td>2770</td>\n",
+       "        <td>0</td>\n",
+       "        <td>1407</td>\n",
+       "        <td>0.663155374671</td>\n",
+       "        <td>0.223433815173</td>\n",
+       "        <td>[0.648820355293342, 0.67749039404829]</td>\n",
+       "        <td>0.0</td>\n",
+       "        <td>1.0</td>\n",
+       "        <td>0.0</td>\n",
+       "        <td>1.0</td>\n",
+       "        <td>1.0</td>\n",
+       "        <td>[u'1', u'0']</td>\n",
+       "        <td>[2770L, 1407L]</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>None</td>\n",
+       "        <td>None</td>\n",
+       "        <td>sex_f</td>\n",
+       "        <td>12</td>\n",
+       "        <td>int4</td>\n",
+       "        <td>4177</td>\n",
+       "        <td>2</td>\n",
+       "        <td>0</td>\n",
+       "        <td>None</td>\n",
+       "        <td>0.0</td>\n",
+       "        <td>None</td>\n",
+       "        <td>1307</td>\n",
+       "        <td>0</td>\n",
+       "        <td>2870</td>\n",
+       "        <td>0.312903998085</td>\n",
+       "        <td>0.215046569565</td>\n",
+       "        <td>[0.298840605732167, 0.326967390437333]</td>\n",
+       "        <td>0.0</td>\n",
+       "        <td>1.0</td>\n",
+       "        <td>0.0</td>\n",
+       "        <td>0.0</td>\n",
+       "        <td>1.0</td>\n",
+       "        <td>[u'0', u'1']</td>\n",
+       "        <td>[2870L, 1307L]</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>None</td>\n",
+       "        <td>None</td>\n",
+       "        <td>sex_i</td>\n",
+       "        <td>13</td>\n",
+       "        <td>int4</td>\n",
+       "        <td>4177</td>\n",
+       "        <td>2</td>\n",
+       "        <td>0</td>\n",
+       "        <td>None</td>\n",
+       "        <td>0.0</td>\n",
+       "        <td>None</td>\n",
+       "        <td>1342</td>\n",
+       "        <td>0</td>\n",
+       "        <td>2835</td>\n",
+       "        <td>0.32128321762</td>\n",
+       "        <td>0.218112529203</td>\n",
+       "        <td>[0.30711992784858, 0.335446507392023]</td>\n",
+       "        <td>0.0</td>\n",
+       "        <td>1.0</td>\n",
+       "        <td>0.0</td>\n",
+       "        <td>0.0</td>\n",
+       "        <td>1.0</td>\n",
+       "        <td>[u'0', u'1']</td>\n",
+       "        <td>[2835L, 1342L]</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>None</td>\n",
+       "        <td>None</td>\n",
+       "        <td>sex_m</td>\n",
+       "        <td>14</td>\n",
+       "        <td>int4</td>\n",
+       "        <td>4177</td>\n",
+       "        <td>2</td>\n",
+       "        <td>0</td>\n",
+       "        <td>None</td>\n",
+       "        <td>0.0</td>\n",
+       "        <td>None</td>\n",
+       "        <td>1528</td>\n",
+       "        <td>0</td>\n",
+       "        <td>2649</td>\n",
+       "        <td>0.365812784295</td>\n",
+       "        <td>0.23204934521</td>\n",
+       "        <td>[0.351204002328337, 0.380421566261561]</td>\n",
+       "        <td>0.0</td>\n",
+       "        <td>1.0</td>\n",
+       "        <td>0.0</td>\n",
+       "        <td>0.0</td>\n",
+       "        <td>1.0</td>\n",
+       "        <td>[u'0', u'1']</td>\n",
+       "        <td>[2649L, 1528L]</td>\n",
+       "    </tr>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[(None, None, u'id', 1, u'int4', 4177L, 4177L, 0L, None, 0.0, None, 4176L, 0L, 1L, 2088.0, 1454292.16666667, [2051.42791957426, 2124.57208042574], 0.0, 4176.0, 1044.0, 2088.0, 3132.0, [u'4021', u'3921', u'4076', u'4117', u'4114', u'3348', u'3114', u'3453', u'3593', u'3377'], [5L, 5L, 5L, 5L, 5L, 4L, 4L, 4L, 4L, 4L]),\n",
+       " (None, None, u'length', 2, u'float8', 4177L, 134L, 0L, None, 0.0, None, 4177L, 0L, 0L, 0.52399209959301, 0.0144223076482973, [0.520350088942874, 0.527634110243145], 0.075, 0.815, 0.45, 0.545, 0.615, [u'0.625', u'0.55', u'0.575', u'0.58', u'0.6', u'0.62', u'0.5', u'0.57', u'0.63', u'0.61'], [94L, 94L, 93L, 92L, 87L, 87L, 81L, 79L, 78L, 75L]),\n",
+       " (None, None, u'diameter', 3, u'float8', 4177L, 111L, 0L, None, 0.0, None, 4177L, 0L, 0L, 0.407881254488869, 0.00984855103022463, [0.404871645997762, 0.410890862979976], 0.055, 0.65, 0.35, 0.425, 0.48, [u'0.45', u'0.475', u'0.4', u'0.5', u'0.47', u'0.48', u'0.455', u'0.46', u'0.44', u'0.485'], [139L, 120L, 111L, 110L, 100L, 91L, 90L, 89L, 87L, 83L]),\n",
+       " (None, None, u'height', 4, u'float8', 4177L, 51L, 0L, None, 0.0, None, 4175L, 0L, 2L, 0.139516399329661, 0.00174950266442683, [0.138247926591562, 0.140784872067761], 0.0, 1.13, 0.115, 0.14, 0.165, [u'0.15', u'0.14', u'0.155', u'0.175', u'0.16', u'0.125', u'0.165', u'0.135', u'0.145', u'0.12'], [267L, 220L, 217L, 211L, 205L, 202L, 193L, 189L, 182L, 169L]),\n",
+       " (None, None, u'whole_weight', 5, u'float8', 4177L, 2429L, 0L, None, 0.0, None, 4177L, 0L, 0L, 0.82874215944458, 0.240481389201556, [0.813870324055102, 0.843613994834059], 0.002, 2.8255, 0.4415, 0.7995, 1.153, [u'1.1345', u'0.2225', u'0.196', u'0.4775', u'0.494', u'0.872', u'1.1155', u'0.97', u'0.4425', u'1.0835'], [10L, 8L, 8L, 7L, 7L, 7L, 7L, 7L, 7L, 7L]),\n",
+       " (None, None, u'shucked_weight', 6, u'float8', 4177L, 1515L, 0L, None, 0.0, None, 4177L, 0L, 0L, 0.359367488628201, 0.0492675507435245, [0.352636105342961, 0.36609887191344], 0.001, 1.488, 0.186, 0.336, 0.502, [u'0.175', u'0.2505', u'0.419', u'0.096', u'0.097', u'0.0745', u'0.2945', u'0.2025', u'0.21', u'0.2'], [11L, 10L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L]),\n",
+       " (None, None, u'viscera_weight', 7, u'float8', 4177L, 880L, 0L, None, 0.0, None, 4177L, 0L, 0L, 0.180593607852526, 0.0120152838599928, [0.177269379483621, 0.183917836221432], 0.0005, 0.76, 0.0935, 0.171, 0.253, [u'0.1715', u'0.196', u'0.061', u'0.0575', u'0.2195', u'0.037', u'0.099', u'0.096', u'0.0265', u'0.1905'], [15L, 14L, 13L, 13L, 13L, 13L, 12L, 12L, 12L, 12L]),\n",
+       " (None, None, u'shell_weight', 8, u'float8', 4177L, 926L, 0L, None, 0.0, None, 4177L, 0L, 0L, 0.238830859468518, 0.0193773832021587, [0.234609314715373, 0.243052404221663], 0.0015, 1.005, 0.13, 0.234, 0.329, [u'0.275', u'0.25', u'0.315', u'0.265', u'0.185', u'0.285', u'0.17', u'0.3', u'0.22', u'0.175'], [43L, 42L, 40L, 40L, 40L, 37L, 37L, 37L, 36L, 36L]),\n",
+       " (None, None, u'rings', 9, u'int4', 4177L, 28L, 0L, None, 0.0, None, 4177L, 0L, 0L, 9.93368446253292, 10.3952659473471, [9.83590635305212, 10.0314625720137], 1.0, 29.0, 8.0, 9.0, 11.0, [u'9', u'10', u'8', u'11', u'7', u'12', u'6', u'13', u'14', u'5'], [689L, 634L, 568L, 487L, 391L, 267L, 259L, 203L, 126L, 115L]),\n",
+       " (None, None, u'age', 10, u'numeric', 4177L, 28L, 0L, None, 0.0, None, 4177L, 0L, 0L, 11.4336844625329, 10.3952659473471, [11.3359063530521, 11.5314625720137], 2.5, 30.5, 9.5, 10.5, 12.5, [u'10.5', u'11.5', u'9.5', u'12.5', u'8.5', u'13.5', u'7.5', u'14.5', u'15.5', u'6.5'], [689L, 634L, 568L, 487L, 391L, 267L, 259L, 203L, 126L, 115L]),\n",
+       " (None, None, u'mature', 11, u'int4', 4177L, 2L, 0L, None, 0.0, None, 2770L, 0L, 1407L, 0.663155374670816, 0.223433815172854, [0.648820355293342, 0.67749039404829], 0.0, 1.0, 0.0, 1.0, 1.0, [u'1', u'0'], [2770L, 1407L]),\n",
+       " (None, None, u'sex_f', 12, u'int4', 4177L, 2L, 0L, None, 0.0, None, 1307L, 0L, 2870L, 0.31290399808475, 0.21504656956495, [0.298840605732167, 0.326967390437333], 0.0, 1.0, 0.0, 0.0, 1.0, [u'0', u'1'], [2870L, 1307L]),\n",
+       " (None, None, u'sex_i', 13, u'int4', 4177L, 2L, 0L, None, 0.0, None, 1342L, 0L, 2835L, 0.321283217620302, 0.218112529203438, [0.30711992784858, 0.335446507392023], 0.0, 1.0, 0.0, 0.0, 1.0, [u'0', u'1'], [2835L, 1342L]),\n",
+       " (None, None, u'sex_m', 14, u'int4', 4177L, 2L, 0L, None, 0.0, None, 1528L, 0L, 2649L, 0.365812784294949, 0.232049345210086, [0.351204002328337, 0.380421566261561], 0.0, 1.0, 0.0, 0.0, 1.0, [u'0', u'1'], [2649L, 1528L])]"
+      ]
+     },
+     "execution_count": 12,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "DROP TABLE IF EXISTS abalone_summary ;\n",
+    "SELECT madlib.summary (\n",
+    "    'abalone_encoded',  -- source_table\n",
+    "    'abalone_summary',  -- output_table\n",
+    "    NULL,  -- target_cols\n",
+    "    NULL,  -- grouping_cols\n",
+    "    TRUE,  -- get_distinct\n",
+    "    TRUE,  -- get_quartiles\n",
+    "    NULL,  -- quantile_array\n",
+    "    10,    -- how_many_mfv\n",
+    "    FALSE  -- get_estimate\n",
+    ")\n",
+    ";\n",
+    "\n",
+    "SELECT * FROM abalone_summary LIMIT 15\n",
+    ";"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Correlation\n",
+    "Another aspect of the data that we might want to know about is the correlation between different columns.  We turn again to MADlib to provide a ready made function: [correlation()](http://madlib.apache.org/docs/latest/group__grp__correlation.html)."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 13,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Done.\n",
+      "Done.\n",
+      "1 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <tr>\n",
+       "        <th>correlation</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>Summary for 'Correlation' function<br>Output table = abalone_correlations<br>Grouping columns: sex_f,sex_i,sex_m<br>Producing correlation for columns: length,diameter,height,whole_weight,shucked_weight,viscera_weight,shell_weight,rings<br>Total run time = ('abalone_correlations', 8, 0.2049999237060547)</td>\n",
+       "    </tr>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[(u\"Summary for 'Correlation' function\\nOutput table = abalone_correlations\\nGrouping columns: sex_f,sex_i,sex_m\\nProducing correlation for columns: length,diameter,height,whole_weight,shucked_weight,viscera_weight,shell_weight,rings\\nTotal run time = ('abalone_correlations', 8, 0.2049999237060547)\",)]"
+      ]
+     },
+     "execution_count": 13,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "DROP TABLE IF EXISTS abalone_correlations;\n",
+    "DROP TABLE IF EXISTS abalone_correlations_summary;\n",
+    "\n",
+    "SELECT\n",
+    "madlib.correlation(\n",
+    "    'abalone_encoded', -- source_table,\n",
+    "    'abalone_correlations', -- output_table,\n",
+    "    'length,diameter,height,whole_weight,shucked_weight,viscera_weight,shell_weight,rings', -- target_cols,\n",
+    "    TRUE, -- verbose,\n",
+    "    'sex_f,sex_i,sex_m'  -- grouping_columns\n",
+    ");"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 14,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "8 rows affected.\n"
+     ]
+    }
+   ],
+   "source": [
+    "Index = %sql SELECT variable FROM abalone_correlations WHERE sex_m = '1' ORDER BY column_position;\n",
+    "Index = Index.DataFrame();"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 15,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "length,diameter,height,whole_weight,shucked_weight,viscera_weight,shell_weight,rings\n"
+     ]
+    }
+   ],
+   "source": [
+    "columns =  ','.join(','.join('%s' %x for x in y) for y in Index.values)\n",
+    "print(columns)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 16,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "8 rows affected.\n"
+     ]
+    }
+   ],
+   "source": [
+    "correlations_male = %sql select variable,{columns} from abalone_correlations where sex_m = '1' ORDER BY column_position;\n",
+    "correlations_male = correlations_male.DataFrame()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 17,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAbIAAAFPCAYAAAAof0vbAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi41LCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvSM8oowAAIABJREFUeJzt3Xu8pXPd//HX2xg5nyJhMGhU4zQxSA5JEXKoyCEq5abuQif9bjogh453J4UahYgc6zYyoZuYCTkMYw6KNLgdkzLOxszen98f3+821yx77bX2nrWua63Z76fH9dhrXde1ruuz1xrrs79nRQRmZmbdaomqAzAzM1sUTmRmZtbVnMjMzKyrOZGZmVlXcyIzM7Ou5kRmZmZdzYnMhg1JD0p6zxBfu4Oke1sdU4N7riFpsqTnJH2vzHsPRNK5kk5p07VvkPQfQ3xt2+KyzuZE [...]
+      "text/plain": [
+       "<Figure size 432x288 with 2 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "corm = correlations_male.set_index('variable')\n",
+    "ax = sns.heatmap(corm)\n",
+    "ax.set_title('Correlations for Male Abalone')\n",
+    "plt.show();"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Sampling for Training and Testing\n",
+    "Ensuring predictive power in large part is the result of creating a hold-out data set that we don’t train our model with.  By creating this subset of the data, we can test any model we develop against “unseen” data to prevent overfitting by our model.  This has the benefit of generating a predictive model that will generalize better.\n",
+    "\n",
+    "There’s no right answer as to how much data to set aside in the test table; a 70&-30% split, weighted towards the training data, is a good rule of thumb.  This process is referred to as the [train-test split](http://madlib.apache.org/docs/latest/group__grp__train__test__split.html).\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 18,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Done.\n",
+      "Done.\n",
+      "Done.\n",
+      "1 rows affected.\n",
+      "1 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <tr>\n",
+       "        <th>Number of abalone in the Training Set</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>2924</td>\n",
+       "    </tr>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[(2924L,)]"
+      ]
+     },
+     "execution_count": 18,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "DROP TABLE IF EXISTS abalone_classif CASCADE;\n",
+    "DROP TABLE IF EXISTS abalone_classif_train CASCADE;\n",
+    "DROP TABLE IF EXISTS abalone_classif_test CASCADE;\n",
+    "SELECT madlib.train_test_split(\n",
+    "    'abalone_encoded', -- source_table,\n",
+    "    'abalone_classif', -- output_table,\n",
+    "    0.7, -- train_proportion,\n",
+    "    NULL, -- test_proportion,\n",
+    "    NULL, -- grouping_cols,\n",
+    "    'id,length,diameter,height,whole_weight,shucked_weight,viscera_weight,shell_weight,sex_f,sex_i,sex_m,rings,age,mature', -- target_cols,\n",
+    "    FALSE, -- with_replacement,\n",
+    "    TRUE -- separate_output_tables\n",
+    ")\n",
+    ";\n",
+    "SELECT count(*) as \"Number of abalone in the Training Set\" FROM abalone_classif_train\n",
+    ";"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "<a id=\"classification\"></a>\n",
+    "# 5. Classification models\n",
+    "\n",
+    "<a id=\"logistic\"></a>\n",
+    "## 5a. Logistic Regression\n",
+    "\n",
+    "We’re now ready to create our first predictive model.  We’ll start with a classic [logistic regression](http://madlib.apache.org/docs/latest/group__grp__logreg.html).\n",
+    "\n",
+    "Note: we drop one of the 1-hot-encoded variables to remove perfect colinearity"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 19,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Done.\n",
+      "Done.\n",
+      "1 rows affected.\n",
+      "1 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <tr>\n",
+       "        <th>method</th>\n",
+       "        <th>source_table</th>\n",
+       "        <th>out_table</th>\n",
+       "        <th>dependent_varname</th>\n",
+       "        <th>independent_varname</th>\n",
+       "        <th>optimizer_params</th>\n",
+       "        <th>num_all_groups</th>\n",
+       "        <th>num_failed_groups</th>\n",
+       "        <th>num_rows_processed</th>\n",
+       "        <th>num_missing_rows_skipped</th>\n",
+       "        <th>grouping_col</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>logregr</td>\n",
+       "        <td>abalone_classif_train</td>\n",
+       "        <td>abalone_logreg_model</td>\n",
+       "        <td>mature</td>\n",
+       "        <td>ARRAY[<br>            1,<br>            length,<br>            diameter,<br>            height,<br>            whole_weight,<br>            shucked_weight,<br>            viscera_weight,<br>            shell_weight,<br>            sex_f,<br>            sex_m<br>        ]</td>\n",
+       "        <td>optimizer=irls, max_iter=20, tolerance=0.0001</td>\n",
+       "        <td>1</td>\n",
+       "        <td>0</td>\n",
+       "        <td>2924</td>\n",
+       "        <td>0</td>\n",
+       "        <td>None</td>\n",
+       "    </tr>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[(u'logregr', u'abalone_classif_train', u'abalone_logreg_model', u'mature', u'ARRAY[\\n            1,\\n            length,\\n            diameter,\\n            height,\\n            whole_weight,\\n            shucked_weight,\\n            viscera_weight,\\n            shell_weight,\\n            sex_f,\\n            sex_m\\n        ]', u'optimizer=irls, max_iter=20, tolerance=0.0001', 1, 0, 2924, 0, None)]"
+      ]
+     },
+     "execution_count": 19,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "DROP TABLE IF EXISTS abalone_logreg_model;\n",
+    "DROP TABLE IF EXISTS abalone_logreg_model_summary;\n",
+    "\n",
+    "SELECT\n",
+    "    madlib.logregr_train(                 --- Train the Logistic Regression Model\n",
+    "        'abalone_classif_train', -- source_table,\n",
+    "        'abalone_logreg_model',  -- out_table,\n",
+    "        'mature',                         -- dependent_varname,\n",
+    "        'ARRAY[\n",
+    "            1,\n",
+    "            length,\n",
+    "            diameter,\n",
+    "            height,\n",
+    "            whole_weight,\n",
+    "            shucked_weight,\n",
+    "            viscera_weight,\n",
+    "            shell_weight,\n",
+    "            sex_f,\n",
+    "            sex_m\n",
+    "        ]'                               -- independent_varname,\n",
+    "        --, -- grouping_cols,\n",
+    "        --, -- max_iter,\n",
+    "        --, -- optimizer,\n",
+    "        --, -- tolerance,\n",
+    "        -- verbose\n",
+    "    )\n",
+    ";\n",
+    "SELECT * FROM abalone_logreg_model_summary ;           --- Get the summary table"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Review model weights"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 20,
+   "metadata": {
+    "scrolled": true
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "1 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <tr>\n",
+       "        <th>coef</th>\n",
+       "        <th>log_likelihood</th>\n",
+       "        <th>std_err</th>\n",
+       "        <th>z_stats</th>\n",
+       "        <th>p_values</th>\n",
+       "        <th>odds_ratios</th>\n",
+       "        <th>condition_no</th>\n",
+       "        <th>num_rows_processed</th>\n",
+       "        <th>num_missing_rows_skipped</th>\n",
+       "        <th>num_iterations</th>\n",
+       "        <th>variance_covariance</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>[-4.04505269771369, -0.93301504036607, 5.00251129121366, 1.19180693972641, 5.75504372424075, -14.5300619747124, -2.61116421067156, 17.1305967152886, 0.978183314470999, 0.909416906435011]</td>\n",
+       "        <td>-1049.90387006</td>\n",
+       "        <td>[0.552100368863192, 2.83843999633685, 3.55584913643184, 1.78805895696604, 1.75162981107839, 1.96111012383532, 2.92049614584736, 2.63455814511125, 0.148723884821104, 0.136234173628881]</td>\n",
+       "        <td>[-7.32666182788955, -0.328706980443544, 1.40684013839617, 0.666536712944106, 3.28553652594989, -7.40910048758312, -0.894082402534364, 6.50226556854571, 6.57717699915942, 6.67539488962864]</td>\n",
+       "        <td>[2.35956228652833e-13, 0.742377177645187, 0.159474797442884, 0.505068105605233, 0.00101788344116673, 1.27158930714484e-13, 0.371277803934971, 7.91192629385751e-11, 4.7946390791206e-11, 2.46567332366593e-11]</td>\n",
+       "        <td>[0.0175087819587038, 0.393365906546296, 148.786336147016, 3.29302613444559, 315.779354434872, 4.89411604411293e-07, 0.07344898387701, 27524765.3425458, 2.65962015698488, 2.48287436315265]</td>\n",
+       "        <td>119.71415666</td>\n",
+       "        <td>2924</td>\n",
+       "        <td>0</td>\n",
+       "        <td>7</td>\n",
+       "        <td>[[0.304814817298873, -0.612756211579355, -0.322899467612372, -0.147591238471627, 0.125663887346171, -0.0048479179589035, 0.0776627080553855, 0.322603415487592, -0.0077292583552645, -0.0123480576513426], [-0.612756211579355, 8.05674161280473, -8.28234305040855, -0.0263654913913357, -0.273690396397007, 0.0317512305815633, -0.511536037818079, 0.069680434604085, 0.0378379558011754, 0.046090552123875], [-0.322899467612372, -8.28234305040855, 12.644063081063, -0.39526444429 [...]
+       "    </tr>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[([-4.04505269771369, -0.93301504036607, 5.00251129121366, 1.19180693972641, 5.75504372424075, -14.5300619747124, -2.61116421067156, 17.1305967152886, 0.978183314470999, 0.909416906435011], -1049.90387005837, [0.552100368863192, 2.83843999633685, 3.55584913643184, 1.78805895696604, 1.75162981107839, 1.96111012383532, 2.92049614584736, 2.63455814511125, 0.148723884821104, 0.136234173628881], [-7.32666182788955, -0.328706980443544, 1.40684013839617, 0.666536712944106, 3.28553652594 [...]
+      ]
+     },
+     "execution_count": 20,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "SELECT * FROM abalone_logreg_model ;"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Show coefficients from model"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 21,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "1 rows affected.\n"
+     ]
+    }
+   ],
+   "source": [
+    "logreg_coefs = %sql SELECT coef FROM abalone_logreg_model ;\n",
+    "logreg_coefs = logreg_coefs.DataFrame();"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 22,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(('intercept', -4.04505269771369),\n",
+       " ('length', -0.93301504036607),\n",
+       " ('diameter', 5.00251129121366),\n",
+       " ('height', 1.19180693972641),\n",
+       " ('whole_weight', 5.75504372424075),\n",
+       " ('shucked_weight', -14.5300619747124),\n",
+       " ('viscera_weight', -2.61116421067156),\n",
+       " ('shell_weight', 17.1305967152886),\n",
+       " ('sex_f', 0.978183314470999),\n",
+       " ('sex_m', 0.909416906435011))"
+      ]
+     },
+     "execution_count": 22,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "logreg_coef_names = (\n",
+    "    'intercept',\n",
+    "    'length',\n",
+    "    'diameter',\n",
+    "    'height',\n",
+    "    'whole_weight',\n",
+    "    'shucked_weight',\n",
+    "    'viscera_weight',\n",
+    "    'shell_weight',\n",
+    "    'sex_f',\n",
+    "    'sex_m'\n",
+    ")\n",
+    "tuple(zip(logreg_coef_names, logreg_coefs.iloc[0, 0]))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Score the model against test data and join with the test data\n",
+    "\n",
+    "Now that we have a model with coefficients, we can make predictions on records previously unseen by the model. In the current version of MADlib (1.16), the way to predict probability using a logistic regression model is to `CROSS JOIN` the test set records with the single-row model table. A `CROSS JOIN` produces the cartesian product between all records in both tables, meaning it pairs every record from one table with every record in the other table. In Postgres/Greenplum this can b [...]
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 23,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Done.\n",
+      "1253 rows affected.\n",
+      "10 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <tr>\n",
+       "        <th>proba</th>\n",
+       "        <th>mature</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>0.284078602587</td>\n",
+       "        <td>0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>0.44095785318</td>\n",
+       "        <td>0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>0.0934114377882</td>\n",
+       "        <td>0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>0.978536300931</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>0.0539202921607</td>\n",
+       "        <td>0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>0.0812143237698</td>\n",
+       "        <td>0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>0.859117921785</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>0.648252874218</td>\n",
+       "        <td>0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>0.195039357479</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>0.0503872504207</td>\n",
+       "        <td>0</td>\n",
+       "    </tr>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[(0.284078602587383, 0),\n",
+       " (0.440957853179563, 0),\n",
+       " (0.0934114377882211, 0),\n",
+       " (0.978536300931053, 1),\n",
+       " (0.0539202921607297, 0),\n",
+       " (0.0812143237697867, 0),\n",
+       " (0.859117921784581, 1),\n",
+       " (0.64825287421822, 0),\n",
+       " (0.195039357478718, 1),\n",
+       " (0.0503872504206839, 0)]"
+      ]
+     },
+     "execution_count": 23,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "DROP TABLE IF EXISTS abalone_logreg_test_proba;\n",
+    "CREATE TABLE abalone_logreg_test_proba\n",
+    "AS\n",
+    "SELECT madlib.logregr_predict_prob(   --- Use the logistic regression model to estimate probability of mature\n",
+    "        coef, \n",
+    "        ARRAY[\n",
+    "            1,\n",
+    "            length,\n",
+    "            diameter,\n",
+    "            height,\n",
+    "            whole_weight,\n",
+    "            shucked_weight,\n",
+    "            viscera_weight,\n",
+    "            shell_weight,\n",
+    "            sex_f,\n",
+    "            sex_m\n",
+    "        ] \n",
+    "    ) as proba,\n",
+    "    test.mature\n",
+    "FROM abalone_classif_test test, abalone_logreg_model model\n",
+    ";\n",
+    "\n",
+    "SELECT *                                   --- take a look at a few of the values\n",
+    "FROM abalone_logreg_test_proba\n",
+    "LIMIT 10\n",
+    ";"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Look at the top model calculated probability vs the actual maturity"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 24,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "10 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <tr>\n",
+       "        <th>probability</th>\n",
+       "        <th>mature</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>0.9999999894</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>0.999999806125</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>0.999999481018</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>0.999995305009</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>0.999993758914</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>0.999993324885</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>0.999990680558</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>0.999990303525</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>0.999983333209</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>0.999977836626</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[(0.999999989399823, 1),\n",
+       " (0.999999806125173, 1),\n",
+       " (0.999999481018065, 1),\n",
+       " (0.999995305008911, 1),\n",
+       " (0.999993758913853, 1),\n",
+       " (0.999993324885356, 1),\n",
+       " (0.999990680557964, 1),\n",
+       " (0.999990303524592, 1),\n",
+       " (0.99998333320942, 1),\n",
+       " (0.999977836626412, 1)]"
+      ]
+     },
+     "execution_count": 24,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "SELECT proba as probability, mature\n",
+    "    FROM abalone_logreg_test_proba\n",
+    "    ORDER BY probability DESC\n",
+    "    LIMIT 10;"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Calculate the area under the ROC"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 25,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Done.\n",
+      "1 rows affected.\n",
+      "1 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <tr>\n",
+       "        <th>area_under_roc</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>0.91407991768135825758963716915337563596850</td>\n",
+       "    </tr>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[(Decimal('0.91407991768135825758963716915337563596850'),)]"
+      ]
+     },
+     "execution_count": 25,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "drop table if exists abalone_logreg_test_auc;\n",
+    "SELECT\n",
+    "madlib.area_under_roc(\n",
+    "    'abalone_logreg_test_proba', -- table_in, \n",
+    "    'abalone_logreg_test_auc',  --table_out,\n",
+    "    'proba',  -- prediction_col, \n",
+    "    'mature'  --observed_col, \n",
+    ") as result\n",
+    ";\n",
+    "SELECT *\n",
+    "FROM abalone_logreg_test_auc\n",
+    ";"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Confusion matrix"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 26,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Done.\n",
+      "1253 rows affected.\n",
+      "10 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <tr>\n",
+       "        <th>predicted</th>\n",
+       "        <th>mature</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>0</td>\n",
+       "        <td>0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>1</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>0</td>\n",
+       "        <td>0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>1</td>\n",
+       "        <td>0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>0</td>\n",
+       "        <td>0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>0</td>\n",
+       "        <td>0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>0</td>\n",
+       "        <td>0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>1</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>1</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>1</td>\n",
+       "        <td>1</td>\n",
+       "    </tr>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[(0, 0),\n",
+       " (1, 1),\n",
+       " (0, 0),\n",
+       " (1, 0),\n",
+       " (0, 0),\n",
+       " (0, 0),\n",
+       " (0, 0),\n",
+       " (1, 1),\n",
+       " (1, 1),\n",
+       " (1, 1)]"
+      ]
+     },
+     "execution_count": 26,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "DROP TABLE IF EXISTS abalone_logreg_test_predict ;\n",
+    "CREATE TABLE abalone_logreg_test_predict\n",
+    "AS\n",
+    "SELECT\n",
+    "    (proba >= 0.5)::integer as predicted,\n",
+    "    mature\n",
+    "FROM abalone_logreg_test_proba\n",
+    ";\n",
+    "SELECT * \n",
+    "    FROM abalone_logreg_test_predict\n",
+    "    LIMIT 10\n",
+    ";"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 27,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Done.\n",
+      "1 rows affected.\n",
+      "2 rows affected.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<table>\n",
+       "    <tr>\n",
+       "        <th>row_id</th>\n",
+       "        <th>Mature</th>\n",
+       "        <th>Predicted: Not Mature</th>\n",
+       "        <th>Mature_1</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>1</td>\n",
+       "        <td>0</td>\n",
+       "        <td>317</td>\n",
+       "        <td>103</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "        <td>2</td>\n",
+       "        <td>1</td>\n",
+       "        <td>91</td>\n",
+       "        <td>742</td>\n",
+       "    </tr>\n",
+       "</table>"
+      ],
+      "text/plain": [
+       "[(1L, 0, Decimal('317'), Decimal('103')),\n",
+       " (2L, 1, Decimal('91'), Decimal('742'))]"
+      ]
+     },
+     "execution_count": 27,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%%sql\n",
+    "DROP TABLE IF EXISTS abalone_logreg_test_conf_matrix;\n",
+    "SELECT\n",
+    "madlib.confusion_matrix(\n",
+    "    'abalone_logreg_test_predict', -- table_in\n",
+    "    'abalone_logreg_test_conf_matrix', -- table_out\n",
+    "    'predicted',  --prediction_col\n",
+    "    'mature' --observation_col\n",
... 12485 lines suppressed ...