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 ...