blob: 8dfa6cdc255f101f3678dbb329f8d3c1f9c441d0 [file] [log] [blame]
{
"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-dev, git revision: rel/v1.17.0-89-g14a91ce, cmake configuration time: Fri Mar 5 23:08:38 UTC 2021, build type: release, build system: Linux-3.10.0-1160.11.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-dev, git revision: rel/v1.17.0-89-g14a91ce, cmake configuration time: Fri Mar 5 23:08:38 UTC 2021, build type: release, build system: Linux-3.10.0-1160.11.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\": {\"class_name\": \"Zeros\", \"config\": {\"dtype\": \"float32\"}}, \"units\": 10, \"batch_input_shape\": [null, 4], \"use_bias\": true, \"activity_regularizer\": null}}, {\"class_name\": \"Dense\", \"config\": {\"kernel_initializer\": {\"class_name\": \"GlorotUniform\", \"config\": {\"dtype\": \"float32\", \"seed\": null}}, \"name\": \"dense_1\", \"kernel_constraint\": null, \"bias_regularizer\": null, \"bias_constraint\": null, \"dtype\": \"float32\", \"activation\": \"relu\", \"trainable\": true, \"kernel_regularizer\": null, \"bias_initializer\": {\"class_name\": \"Zeros\", \"config\": {\"dtype\": \"float32\"}}, \"units\": 10, \"use_bias\": true, \"activity_regularizer\": null}}, {\"class_name\": \"Dense\", \"config\": {\"kernel_initializer\": {\"class_name\": \"GlorotUniform\", \"config\": {\"dtype\": \"float32\", \"seed\": null}}, \"name\": \"dense_2\", \"kernel_constraint\": null, \"bias_regularizer\": null, \"bias_constraint\": null, \"dtype\": \"float32\", \"activation\": \"softmax\", \"trainable\": true, \"kernel_regularizer\": null, \"bias_initializer\": {\"class_name\": \"Zeros\", \"config\": {\"dtype\": \"float32\"}}, \"units\": 3, \"use_bias\": true, \"activity_regularizer\": null}}], \"name\": \"sequential\"}, \"backend\": \"tensorflow\"}'"
]
},
"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_initializer': {u'class_name': u'Zeros', u'config': {}}, u'units': 10, u'batch_input_shape': [None, 4], u'use_bias': True, u'activity_regularizer': None}}, {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'activation': u'relu', u'trainable': True, u'kernel_regularizer': None, u'bias_initializer': {u'class_name': u'Zeros', u'config': {}}, u'units': 10, u'use_bias': True, u'activity_regularizer': None}}, {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_3', u'kernel_constraint': None, u'bias_regularizer': None, u'bias_constraint': None, u'activation': u'softmax', u'trainable': True, u'kernel_regularizer': None, u'bias_initializer': {u'class_name': u'Zeros', u'config': {}}, u'units': 3, u'use_bias': True, u'activity_regularizer': None}}], u'backend': u'tensorflow'}</td>\n",
" <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, \"bias_initializer\": {\"class_name\": \"Zeros\", \"config\": {}}, \"units\": 10, \"batch_input_shape\": [null, 4], \"use_bias\": true, \"activity_regularizer\": null}}, {\"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, \"activation\": \"relu\", \"trainable\": true, \"kernel_regularizer\": null, \"bias_initializer\": {\"class_name\": \"Zeros\", \"config\": {}}, \"units\": 10, \"use_bias\": true, \"activity_regularizer\": null}}, {\"class_name\": \"Dense\", \"config\": {\"kernel_initializer\": {\"class_name\": \"VarianceScaling\", \"config\": {\"distribution\": \"uniform\", \"scale\": 1.0, \"seed\": null, \"mode\": \"fan_avg\"}}, \"name\": \"dense_3\", \"kernel_constraint\": null, \"bias_regularizer\": null, \"bias_constraint\": null, \"activation\": \"softmax\", \"trainable\": true, \"kernel_regularizer\": null, \"bias_initializer\": {\"class_name\": \"Zeros\", \"config\": {}}, \"units\": 3, \"use_bias\": true, \"activity_regularizer\": null}}], \"backend\": \"tensorflow\"}\n",
"$$\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-03-06 00:27:28.144705</td>\n",
" <td>2021-03-06 00:27:31.754147</td>\n",
" <td>[3.60936093330383]</td>\n",
" <td>1.18.0-dev</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.916666686535</td>\n",
" <td>0.463008254766</td>\n",
" <td>[0.916666686534882]</td>\n",
" <td>[0.463008254766464]</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, 3, 6, 0, 27, 28, 144705), datetime.datetime(2021, 3, 6, 0, 27, 31, 754147), [3.60936093330383], u'1.18.0-dev', [3], [u'character varying'], 1.0, [u'accuracy'], u'categorical_crossentropy', 0.916666686534882, 0.463008254766464, [0.916666686534882], [0.463008254766464], None, None, None, None, [10], [u'Iris-setosa', u'Iris-versicolor', u'Iris-virginica'])]"
]
},
"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.523572981358</td>\n",
" <td>0.933333337307</td>\n",
" <td>[u'accuracy']</td>\n",
" <td>categorical_crossentropy</td>\n",
" </tr>\n",
"</table>"
],
"text/plain": [
"[(0.523572981357574, 0.933333337306976, [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>10</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.83670896</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>10</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.14060013</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>10</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.022690918</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>13</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.8369735</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>13</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.14013577</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>13</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.022890732</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>29</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.87973696</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>29</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.10638312</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>29</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.013879963</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>34</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.93740743</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>34</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.056862056</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>34</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.0057305074</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>38</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.83670896</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>38</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.14060013</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>38</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.022690918</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>43</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.8709096</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>43</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.11054307</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>43</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.018547323</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>56</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.4681935</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>56</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.4571225</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>56</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.07468399</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>61</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.45466852</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>61</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.4470526</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>61</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.09827888</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>64</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.47486252</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>64</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.46100235</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>64</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.064135045</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>67</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.47181308</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>67</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.43595785</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>67</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.09222904</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>70</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.47956672</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>70</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.41212082</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>70</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.10831244</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>72</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.50861007</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>72</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.3626588</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>72</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.12873109</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.5061021</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.3914343</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.102463536</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>89</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.49345753</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>89</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.35755217</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>89</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.14899038</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>92</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.4796765</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>92</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.4385325</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>92</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.0817909</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>94</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.47809058</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>94</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.34930265</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>94</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.17260681</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>101</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.6172143</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>101</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.3620455</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>101</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.020740215</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>102</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.5837618</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>102</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.3847274</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>102</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.03151086</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.61951214</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.3637118</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.016776035</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>112</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.5954762</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>112</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.37995332</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>112</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.024570476</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>113</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.571379</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>113</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.4039808</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>113</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.024640195</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>115</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.57040656</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>115</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.3980587</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>115</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.03153468</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>116</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.52341586</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>116</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.43971062</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>116</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.036873452</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>117</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.5800313</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>117</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.3929817</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>117</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.026986998</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.72622484</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.26773784</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.0060372944</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>127</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.5089497</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>127</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.44541556</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>127</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.045634773</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.62922823</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.35819018</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.012581516</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>144</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.6017383</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>144</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.3781529</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>144</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.020108894</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>146</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.5293082</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>146</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.4390557</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>146</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.031636048</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>147</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.58249867</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>147</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.39045528</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>147</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.027046034</td>\n",
" <td>3</td>\n",
" </tr>\n",
"</table>"
],
"text/plain": [
"[(10, u'class_text', u'Iris-setosa', 0.83670896, 1),\n",
" (10, u'class_text', u'Iris-versicolor', 0.14060013, 2),\n",
" (10, u'class_text', u'Iris-virginica', 0.022690918, 3),\n",
" (13, u'class_text', u'Iris-setosa', 0.8369735, 1),\n",
" (13, u'class_text', u'Iris-versicolor', 0.14013577, 2),\n",
" (13, u'class_text', u'Iris-virginica', 0.022890732, 3),\n",
" (29, u'class_text', u'Iris-setosa', 0.87973696, 1),\n",
" (29, u'class_text', u'Iris-versicolor', 0.10638312, 2),\n",
" (29, u'class_text', u'Iris-virginica', 0.013879963, 3),\n",
" (34, u'class_text', u'Iris-setosa', 0.93740743, 1),\n",
" (34, u'class_text', u'Iris-versicolor', 0.056862056, 2),\n",
" (34, u'class_text', u'Iris-virginica', 0.0057305074, 3),\n",
" (38, u'class_text', u'Iris-setosa', 0.83670896, 1),\n",
" (38, u'class_text', u'Iris-versicolor', 0.14060013, 2),\n",
" (38, u'class_text', u'Iris-virginica', 0.022690918, 3),\n",
" (43, u'class_text', u'Iris-setosa', 0.8709096, 1),\n",
" (43, u'class_text', u'Iris-versicolor', 0.11054307, 2),\n",
" (43, u'class_text', u'Iris-virginica', 0.018547323, 3),\n",
" (56, u'class_text', u'Iris-virginica', 0.4681935, 1),\n",
" (56, u'class_text', u'Iris-versicolor', 0.4571225, 2),\n",
" (56, u'class_text', u'Iris-setosa', 0.07468399, 3),\n",
" (61, u'class_text', u'Iris-versicolor', 0.45466852, 1),\n",
" (61, u'class_text', u'Iris-virginica', 0.4470526, 2),\n",
" (61, u'class_text', u'Iris-setosa', 0.09827888, 3),\n",
" (64, u'class_text', u'Iris-virginica', 0.47486252, 1),\n",
" (64, u'class_text', u'Iris-versicolor', 0.46100235, 2),\n",
" (64, u'class_text', u'Iris-setosa', 0.064135045, 3),\n",
" (67, u'class_text', u'Iris-versicolor', 0.47181308, 1),\n",
" (67, u'class_text', u'Iris-virginica', 0.43595785, 2),\n",
" (67, u'class_text', u'Iris-setosa', 0.09222904, 3),\n",
" (70, u'class_text', u'Iris-versicolor', 0.47956672, 1),\n",
" (70, u'class_text', u'Iris-virginica', 0.41212082, 2),\n",
" (70, u'class_text', u'Iris-setosa', 0.10831244, 3),\n",
" (72, u'class_text', u'Iris-versicolor', 0.50861007, 1),\n",
" (72, u'class_text', u'Iris-virginica', 0.3626588, 2),\n",
" (72, u'class_text', u'Iris-setosa', 0.12873109, 3),\n",
" (75, u'class_text', u'Iris-versicolor', 0.5061021, 1),\n",
" (75, u'class_text', u'Iris-virginica', 0.3914343, 2),\n",
" (75, u'class_text', u'Iris-setosa', 0.102463536, 3),\n",
" (89, u'class_text', u'Iris-versicolor', 0.49345753, 1),\n",
" (89, u'class_text', u'Iris-virginica', 0.35755217, 2),\n",
" (89, u'class_text', u'Iris-setosa', 0.14899038, 3),\n",
" (92, u'class_text', u'Iris-versicolor', 0.4796765, 1),\n",
" (92, u'class_text', u'Iris-virginica', 0.4385325, 2),\n",
" (92, u'class_text', u'Iris-setosa', 0.0817909, 3),\n",
" (94, u'class_text', u'Iris-versicolor', 0.47809058, 1),\n",
" (94, u'class_text', u'Iris-virginica', 0.34930265, 2),\n",
" (94, u'class_text', u'Iris-setosa', 0.17260681, 3),\n",
" (101, u'class_text', u'Iris-virginica', 0.6172143, 1),\n",
" (101, u'class_text', u'Iris-versicolor', 0.3620455, 2),\n",
" (101, u'class_text', u'Iris-setosa', 0.020740215, 3),\n",
" (102, u'class_text', u'Iris-virginica', 0.5837618, 1),\n",
" (102, u'class_text', u'Iris-versicolor', 0.3847274, 2),\n",
" (102, u'class_text', u'Iris-setosa', 0.03151086, 3),\n",
" (103, u'class_text', u'Iris-virginica', 0.61951214, 1),\n",
" (103, u'class_text', u'Iris-versicolor', 0.3637118, 2),\n",
" (103, u'class_text', u'Iris-setosa', 0.016776035, 3),\n",
" (112, u'class_text', u'Iris-virginica', 0.5954762, 1),\n",
" (112, u'class_text', u'Iris-versicolor', 0.37995332, 2),\n",
" (112, u'class_text', u'Iris-setosa', 0.024570476, 3),\n",
" (113, u'class_text', u'Iris-virginica', 0.571379, 1),\n",
" (113, u'class_text', u'Iris-versicolor', 0.4039808, 2),\n",
" (113, u'class_text', u'Iris-setosa', 0.024640195, 3),\n",
" (115, u'class_text', u'Iris-virginica', 0.57040656, 1),\n",
" (115, u'class_text', u'Iris-versicolor', 0.3980587, 2),\n",
" (115, u'class_text', u'Iris-setosa', 0.03153468, 3),\n",
" (116, u'class_text', u'Iris-virginica', 0.52341586, 1),\n",
" (116, u'class_text', u'Iris-versicolor', 0.43971062, 2),\n",
" (116, u'class_text', u'Iris-setosa', 0.036873452, 3),\n",
" (117, u'class_text', u'Iris-virginica', 0.5800313, 1),\n",
" (117, u'class_text', u'Iris-versicolor', 0.3929817, 2),\n",
" (117, u'class_text', u'Iris-setosa', 0.026986998, 3),\n",
" (119, u'class_text', u'Iris-virginica', 0.72622484, 1),\n",
" (119, u'class_text', u'Iris-versicolor', 0.26773784, 2),\n",
" (119, u'class_text', u'Iris-setosa', 0.0060372944, 3),\n",
" (127, u'class_text', u'Iris-virginica', 0.5089497, 1),\n",
" (127, u'class_text', u'Iris-versicolor', 0.44541556, 2),\n",
" (127, u'class_text', u'Iris-setosa', 0.045634773, 3),\n",
" (136, u'class_text', u'Iris-virginica', 0.62922823, 1),\n",
" (136, u'class_text', u'Iris-versicolor', 0.35819018, 2),\n",
" (136, u'class_text', u'Iris-setosa', 0.012581516, 3),\n",
" (144, u'class_text', u'Iris-virginica', 0.6017383, 1),\n",
" (144, u'class_text', u'Iris-versicolor', 0.3781529, 2),\n",
" (144, u'class_text', u'Iris-setosa', 0.020108894, 3),\n",
" (146, u'class_text', u'Iris-virginica', 0.5293082, 1),\n",
" (146, u'class_text', u'Iris-versicolor', 0.4390557, 2),\n",
" (146, u'class_text', u'Iris-setosa', 0.031636048, 3),\n",
" (147, u'class_text', u'Iris-virginica', 0.58249867, 1),\n",
" (147, u'class_text', u'Iris-versicolor', 0.39045528, 2),\n",
" (147, u'class_text', u'Iris-setosa', 0.027046034, 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>2</td>\n",
" </tr>\n",
"</table>"
],
"text/plain": [
"[(2L,)]"
]
},
"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>93.33</td>\n",
" </tr>\n",
"</table>"
],
"text/plain": [
"[(Decimal('93.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>10</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.83670896</td>\n",
" </tr>\n",
" <tr>\n",
" <td>13</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.8369735</td>\n",
" </tr>\n",
" <tr>\n",
" <td>29</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.87973696</td>\n",
" </tr>\n",
" <tr>\n",
" <td>34</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.93740743</td>\n",
" </tr>\n",
" <tr>\n",
" <td>38</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.83670896</td>\n",
" </tr>\n",
" <tr>\n",
" <td>43</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.8709096</td>\n",
" </tr>\n",
" <tr>\n",
" <td>56</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.4681935</td>\n",
" </tr>\n",
" <tr>\n",
" <td>61</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.45466852</td>\n",
" </tr>\n",
" <tr>\n",
" <td>64</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.47486252</td>\n",
" </tr>\n",
" <tr>\n",
" <td>67</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.47181308</td>\n",
" </tr>\n",
" <tr>\n",
" <td>70</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.47956672</td>\n",
" </tr>\n",
" <tr>\n",
" <td>72</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.50861007</td>\n",
" </tr>\n",
" <tr>\n",
" <td>75</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.5061021</td>\n",
" </tr>\n",
" <tr>\n",
" <td>89</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.49345753</td>\n",
" </tr>\n",
" <tr>\n",
" <td>92</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.4796765</td>\n",
" </tr>\n",
" <tr>\n",
" <td>94</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.47809058</td>\n",
" </tr>\n",
" <tr>\n",
" <td>101</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.6172143</td>\n",
" </tr>\n",
" <tr>\n",
" <td>102</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.5837618</td>\n",
" </tr>\n",
" <tr>\n",
" <td>103</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.61951214</td>\n",
" </tr>\n",
" <tr>\n",
" <td>112</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.5954762</td>\n",
" </tr>\n",
" <tr>\n",
" <td>113</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.571379</td>\n",
" </tr>\n",
" <tr>\n",
" <td>115</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.57040656</td>\n",
" </tr>\n",
" <tr>\n",
" <td>116</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.52341586</td>\n",
" </tr>\n",
" <tr>\n",
" <td>117</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.5800313</td>\n",
" </tr>\n",
" <tr>\n",
" <td>119</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.72622484</td>\n",
" </tr>\n",
" <tr>\n",
" <td>127</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.5089497</td>\n",
" </tr>\n",
" <tr>\n",
" <td>136</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.62922823</td>\n",
" </tr>\n",
" <tr>\n",
" <td>144</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.6017383</td>\n",
" </tr>\n",
" <tr>\n",
" <td>146</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.5293082</td>\n",
" </tr>\n",
" <tr>\n",
" <td>147</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.58249867</td>\n",
" </tr>\n",
"</table>"
],
"text/plain": [
"[(10, u'dependent_var', u'Iris-setosa', 0.83670896),\n",
" (13, u'dependent_var', u'Iris-setosa', 0.8369735),\n",
" (29, u'dependent_var', u'Iris-setosa', 0.87973696),\n",
" (34, u'dependent_var', u'Iris-setosa', 0.93740743),\n",
" (38, u'dependent_var', u'Iris-setosa', 0.83670896),\n",
" (43, u'dependent_var', u'Iris-setosa', 0.8709096),\n",
" (56, u'dependent_var', u'Iris-virginica', 0.4681935),\n",
" (61, u'dependent_var', u'Iris-versicolor', 0.45466852),\n",
" (64, u'dependent_var', u'Iris-virginica', 0.47486252),\n",
" (67, u'dependent_var', u'Iris-versicolor', 0.47181308),\n",
" (70, u'dependent_var', u'Iris-versicolor', 0.47956672),\n",
" (72, u'dependent_var', u'Iris-versicolor', 0.50861007),\n",
" (75, u'dependent_var', u'Iris-versicolor', 0.5061021),\n",
" (89, u'dependent_var', u'Iris-versicolor', 0.49345753),\n",
" (92, u'dependent_var', u'Iris-versicolor', 0.4796765),\n",
" (94, u'dependent_var', u'Iris-versicolor', 0.47809058),\n",
" (101, u'dependent_var', u'Iris-virginica', 0.6172143),\n",
" (102, u'dependent_var', u'Iris-virginica', 0.5837618),\n",
" (103, u'dependent_var', u'Iris-virginica', 0.61951214),\n",
" (112, u'dependent_var', u'Iris-virginica', 0.5954762),\n",
" (113, u'dependent_var', u'Iris-virginica', 0.571379),\n",
" (115, u'dependent_var', u'Iris-virginica', 0.57040656),\n",
" (116, u'dependent_var', u'Iris-virginica', 0.52341586),\n",
" (117, u'dependent_var', u'Iris-virginica', 0.5800313),\n",
" (119, u'dependent_var', u'Iris-virginica', 0.72622484),\n",
" (127, u'dependent_var', u'Iris-virginica', 0.5089497),\n",
" (136, u'dependent_var', u'Iris-virginica', 0.62922823),\n",
" (144, u'dependent_var', u'Iris-virginica', 0.6017383),\n",
" (146, u'dependent_var', u'Iris-virginica', 0.5293082),\n",
" (147, u'dependent_var', u'Iris-virginica', 0.58249867)]"
]
},
"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>2</td>\n",
" </tr>\n",
"</table>"
],
"text/plain": [
"[(2L,)]"
]
},
"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>93.33</td>\n",
" </tr>\n",
"</table>"
],
"text/plain": [
"[(Decimal('93.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-03-06 00:27:42.910502</td>\n",
" <td>2021-03-06 00:27:44.171209</td>\n",
" <td>[0.706467866897583, 0.850914001464844, 0.988704919815063, 1.12321996688843, 1.26061987876892]</td>\n",
" <td>1.18.0-dev</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.966666638851</td>\n",
" <td>0.286152273417</td>\n",
" <td>[0.933333337306976, 0.941666662693024, 0.941666662693024, 0.958333313465118, 0.966666638851166]</td>\n",
" <td>[0.410510897636414, 0.371806919574738, 0.339208543300629, 0.310610443353653, 0.286152273416519]</td>\n",
" <td>1.0</td>\n",
" <td>0.312809795141</td>\n",
" <td>[1.0, 1.0, 1.0, 1.0, 1.0]</td>\n",
" <td>[0.478174388408661, 0.426770567893982, 0.391106754541397, 0.351149171590805, 0.31280979514122]</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, 3, 6, 0, 27, 42, 910502), datetime.datetime(2021, 3, 6, 0, 27, 44, 171209), [0.706467866897583, 0.850914001464844, 0.988704919815063, 1.12321996688843, 1.26061987876892], u'1.18.0-dev', [3], [u'character varying'], 1.0, [u'accuracy'], u'categorical_crossentropy', 0.966666638851166, 0.286152273416519, [0.933333337306976, 0.941666662693024, 0.941666662693024, 0.958333313465118, 0.966666638851166], [0.410510897636414, 0.371806919574738, 0.339208543300629, 0.310610443353653, 0.286152273416519], 1.0, 0.31280979514122, [1.0, 1.0, 1.0, 1.0, 1.0], [0.478174388408661, 0.426770567893982, 0.391106754541397, 0.351149171590805, 0.31280979514122], [2, 4, 6, 8, 10], [u'Iris-setosa', u'Iris-versicolor', u'Iris-virginica'])]"
]
},
"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": "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\n",
"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": "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\n",
"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": "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\n",
"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": "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\n",
"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>10</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.95964456</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>10</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.040107667</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>10</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.00024777954</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>13</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.9597473</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>13</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.039995104</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>13</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.00025748153</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>29</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.9761629</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>29</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.02375229</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>29</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>8.479464e-05</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>34</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.99167526</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>34</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.008311711</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>34</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>1.30546e-05</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>38</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.95964456</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>38</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.040107667</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>38</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.00024777954</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>43</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.9731986</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>43</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.026633002</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>43</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.0001682964</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>56</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.5465453</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>56</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.44023818</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>56</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.01321647</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>61</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.58524394</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>61</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.38831925</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>61</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.026436739</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>64</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.54376984</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>64</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.4466499</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>64</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.009580206</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>67</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.57931274</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>67</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.4024986</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>67</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.018188644</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>70</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.6546029</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>70</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.31436205</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>70</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.031035094</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>72</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.7274642</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>72</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.23212723</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>72</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.04040851</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.70608836</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.2678585</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.026053142</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>89</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.7004706</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>89</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.24725808</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>89</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.052271266</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>92</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.60884434</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>92</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.37558457</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>92</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.015571073</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>94</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.6937521</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>94</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.22628777</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>94</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.07996013</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>101</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.8121722</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>101</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.18745965</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>101</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.00036821415</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>102</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.732954</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>102</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.26589376</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>102</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.0011522635</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.7756057</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.22408752</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.00030681648</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>112</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.73672587</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>112</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.26255292</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>112</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.00072121713</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>113</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.6946963</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>113</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.30448684</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>113</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.0008168273</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>115</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.7407642</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>115</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.2582139</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>115</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.0010218392</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>116</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.6248408</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>116</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.37318283</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>116</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.0019763925</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>117</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.69742286</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>117</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.30152085</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>117</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.0010562533</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.8924382</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.10752802</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>3.379417e-05</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>127</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.5494711</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>127</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.44651195</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>127</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.004016916</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.7880493</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.21177953</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.0001712008</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>144</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.76935935</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>144</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.23023891</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>144</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.00040176214</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>146</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.62273574</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>146</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.37572634</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>146</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.0015378947</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>147</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.71288556</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>147</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.2861904</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>147</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.0009240419</td>\n",
" <td>3</td>\n",
" </tr>\n",
"</table>"
],
"text/plain": [
"[(10, u'class_text', u'Iris-setosa', 0.95964456, 1),\n",
" (10, u'class_text', u'Iris-versicolor', 0.040107667, 2),\n",
" (10, u'class_text', u'Iris-virginica', 0.00024777954, 3),\n",
" (13, u'class_text', u'Iris-setosa', 0.9597473, 1),\n",
" (13, u'class_text', u'Iris-versicolor', 0.039995104, 2),\n",
" (13, u'class_text', u'Iris-virginica', 0.00025748153, 3),\n",
" (29, u'class_text', u'Iris-setosa', 0.9761629, 1),\n",
" (29, u'class_text', u'Iris-versicolor', 0.02375229, 2),\n",
" (29, u'class_text', u'Iris-virginica', 8.479464e-05, 3),\n",
" (34, u'class_text', u'Iris-setosa', 0.99167526, 1),\n",
" (34, u'class_text', u'Iris-versicolor', 0.008311711, 2),\n",
" (34, u'class_text', u'Iris-virginica', 1.30546e-05, 3),\n",
" (38, u'class_text', u'Iris-setosa', 0.95964456, 1),\n",
" (38, u'class_text', u'Iris-versicolor', 0.040107667, 2),\n",
" (38, u'class_text', u'Iris-virginica', 0.00024777954, 3),\n",
" (43, u'class_text', u'Iris-setosa', 0.9731986, 1),\n",
" (43, u'class_text', u'Iris-versicolor', 0.026633002, 2),\n",
" (43, u'class_text', u'Iris-virginica', 0.0001682964, 3),\n",
" (56, u'class_text', u'Iris-versicolor', 0.5465453, 1),\n",
" (56, u'class_text', u'Iris-virginica', 0.44023818, 2),\n",
" (56, u'class_text', u'Iris-setosa', 0.01321647, 3),\n",
" (61, u'class_text', u'Iris-versicolor', 0.58524394, 1),\n",
" (61, u'class_text', u'Iris-virginica', 0.38831925, 2),\n",
" (61, u'class_text', u'Iris-setosa', 0.026436739, 3),\n",
" (64, u'class_text', u'Iris-versicolor', 0.54376984, 1),\n",
" (64, u'class_text', u'Iris-virginica', 0.4466499, 2),\n",
" (64, u'class_text', u'Iris-setosa', 0.009580206, 3),\n",
" (67, u'class_text', u'Iris-versicolor', 0.57931274, 1),\n",
" (67, u'class_text', u'Iris-virginica', 0.4024986, 2),\n",
" (67, u'class_text', u'Iris-setosa', 0.018188644, 3),\n",
" (70, u'class_text', u'Iris-versicolor', 0.6546029, 1),\n",
" (70, u'class_text', u'Iris-virginica', 0.31436205, 2),\n",
" (70, u'class_text', u'Iris-setosa', 0.031035094, 3),\n",
" (72, u'class_text', u'Iris-versicolor', 0.7274642, 1),\n",
" (72, u'class_text', u'Iris-virginica', 0.23212723, 2),\n",
" (72, u'class_text', u'Iris-setosa', 0.04040851, 3),\n",
" (75, u'class_text', u'Iris-versicolor', 0.70608836, 1),\n",
" (75, u'class_text', u'Iris-virginica', 0.2678585, 2),\n",
" (75, u'class_text', u'Iris-setosa', 0.026053142, 3),\n",
" (89, u'class_text', u'Iris-versicolor', 0.7004706, 1),\n",
" (89, u'class_text', u'Iris-virginica', 0.24725808, 2),\n",
" (89, u'class_text', u'Iris-setosa', 0.052271266, 3),\n",
" (92, u'class_text', u'Iris-versicolor', 0.60884434, 1),\n",
" (92, u'class_text', u'Iris-virginica', 0.37558457, 2),\n",
" (92, u'class_text', u'Iris-setosa', 0.015571073, 3),\n",
" (94, u'class_text', u'Iris-versicolor', 0.6937521, 1),\n",
" (94, u'class_text', u'Iris-virginica', 0.22628777, 2),\n",
" (94, u'class_text', u'Iris-setosa', 0.07996013, 3),\n",
" (101, u'class_text', u'Iris-virginica', 0.8121722, 1),\n",
" (101, u'class_text', u'Iris-versicolor', 0.18745965, 2),\n",
" (101, u'class_text', u'Iris-setosa', 0.00036821415, 3),\n",
" (102, u'class_text', u'Iris-virginica', 0.732954, 1),\n",
" (102, u'class_text', u'Iris-versicolor', 0.26589376, 2),\n",
" (102, u'class_text', u'Iris-setosa', 0.0011522635, 3),\n",
" (103, u'class_text', u'Iris-virginica', 0.7756057, 1),\n",
" (103, u'class_text', u'Iris-versicolor', 0.22408752, 2),\n",
" (103, u'class_text', u'Iris-setosa', 0.00030681648, 3),\n",
" (112, u'class_text', u'Iris-virginica', 0.73672587, 1),\n",
" (112, u'class_text', u'Iris-versicolor', 0.26255292, 2),\n",
" (112, u'class_text', u'Iris-setosa', 0.00072121713, 3),\n",
" (113, u'class_text', u'Iris-virginica', 0.6946963, 1),\n",
" (113, u'class_text', u'Iris-versicolor', 0.30448684, 2),\n",
" (113, u'class_text', u'Iris-setosa', 0.0008168273, 3),\n",
" (115, u'class_text', u'Iris-virginica', 0.7407642, 1),\n",
" (115, u'class_text', u'Iris-versicolor', 0.2582139, 2),\n",
" (115, u'class_text', u'Iris-setosa', 0.0010218392, 3),\n",
" (116, u'class_text', u'Iris-virginica', 0.6248408, 1),\n",
" (116, u'class_text', u'Iris-versicolor', 0.37318283, 2),\n",
" (116, u'class_text', u'Iris-setosa', 0.0019763925, 3),\n",
" (117, u'class_text', u'Iris-virginica', 0.69742286, 1),\n",
" (117, u'class_text', u'Iris-versicolor', 0.30152085, 2),\n",
" (117, u'class_text', u'Iris-setosa', 0.0010562533, 3),\n",
" (119, u'class_text', u'Iris-virginica', 0.8924382, 1),\n",
" (119, u'class_text', u'Iris-versicolor', 0.10752802, 2),\n",
" (119, u'class_text', u'Iris-setosa', 3.379417e-05, 3),\n",
" (127, u'class_text', u'Iris-virginica', 0.5494711, 1),\n",
" (127, u'class_text', u'Iris-versicolor', 0.44651195, 2),\n",
" (127, u'class_text', u'Iris-setosa', 0.004016916, 3),\n",
" (136, u'class_text', u'Iris-virginica', 0.7880493, 1),\n",
" (136, u'class_text', u'Iris-versicolor', 0.21177953, 2),\n",
" (136, u'class_text', u'Iris-setosa', 0.0001712008, 3),\n",
" (144, u'class_text', u'Iris-virginica', 0.76935935, 1),\n",
" (144, u'class_text', u'Iris-versicolor', 0.23023891, 2),\n",
" (144, u'class_text', u'Iris-setosa', 0.00040176214, 3),\n",
" (146, u'class_text', u'Iris-virginica', 0.62273574, 1),\n",
" (146, u'class_text', u'Iris-versicolor', 0.37572634, 2),\n",
" (146, u'class_text', u'Iris-setosa', 0.0015378947, 3),\n",
" (147, u'class_text', u'Iris-virginica', 0.71288556, 1),\n",
" (147, u'class_text', u'Iris-versicolor', 0.2861904, 2),\n",
" (147, u'class_text', u'Iris-setosa', 0.0009240419, 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-03-06 00:27:51.102558</td>\n",
" <td>2021-03-06 00:27:52.451185</td>\n",
" <td>[0.781347990036011, 0.923561096191406, 1.06405401229858, 1.20302820205688, 1.34854102134705]</td>\n",
" <td>1.18.0-dev</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.194891035557</td>\n",
" <td>[0.941666662693024, 0.966666638851166, 0.958333313465118, 0.949999988079071, 0.975000023841858]</td>\n",
" <td>[0.262409120798111, 0.24169448018074, 0.222953796386719, 0.207046672701836, 0.194891035556793]</td>\n",
" <td>1.0</td>\n",
" <td>0.188044458628</td>\n",
" <td>[0.966666638851166, 1.0, 1.0, 1.0, 1.0]</td>\n",
" <td>[0.293483078479767, 0.254781544208527, 0.232207864522934, 0.212682083249092, 0.188044458627701]</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, 3, 6, 0, 27, 51, 102558), datetime.datetime(2021, 3, 6, 0, 27, 52, 451185), [0.781347990036011, 0.923561096191406, 1.06405401229858, 1.20302820205688, 1.34854102134705], u'1.18.0-dev', [3], [u'character varying'], 1.0, [u'accuracy'], u'categorical_crossentropy', 0.975000023841858, 0.194891035556793, [0.941666662693024, 0.966666638851166, 0.958333313465118, 0.949999988079071, 0.975000023841858], [0.262409120798111, 0.24169448018074, 0.222953796386719, 0.207046672701836, 0.194891035556793], 1.0, 0.188044458627701, [0.966666638851166, 1.0, 1.0, 1.0, 1.0], [0.293483078479767, 0.254781544208527, 0.232207864522934, 0.212682083249092, 0.188044458627701], [2, 4, 6, 8, 10], [u'Iris-setosa', u'Iris-versicolor', u'Iris-virginica'])]"
]
},
"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": "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\n",
"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": "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\n",
"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\": {\"class_name\": \"Zeros\", \"config\": {\"dtype\": \"float32\"}}, \"units\": 10, \"batch_input_shape\": [null, 4], \"use_bias\": true, \"activity_regularizer\": null}}, {\"class_name\": \"Dense\", \"config\": {\"kernel_initializer\": {\"class_name\": \"GlorotUniform\", \"config\": {\"dtype\": \"float32\", \"seed\": null}}, \"name\": \"dense_4\", \"kernel_constraint\": null, \"bias_regularizer\": null, \"bias_constraint\": null, \"dtype\": \"float32\", \"activation\": \"relu\", \"trainable\": true, \"kernel_regularizer\": null, \"bias_initializer\": {\"class_name\": \"Zeros\", \"config\": {\"dtype\": \"float32\"}}, \"units\": 10, \"use_bias\": true, \"activity_regularizer\": null}}, {\"class_name\": \"Dense\", \"config\": {\"kernel_initializer\": {\"class_name\": \"GlorotUniform\", \"config\": {\"dtype\": \"float32\", \"seed\": null}}, \"name\": \"dense_5\", \"kernel_constraint\": null, \"bias_regularizer\": null, \"bias_constraint\": null, \"dtype\": \"float32\", \"activation\": \"softmax\", \"trainable\": true, \"kernel_regularizer\": null, \"bias_initializer\": {\"class_name\": \"Zeros\", \"config\": {\"dtype\": \"float32\"}}, \"units\": 3, \"use_bias\": true, \"activity_regularizer\": null}}], \"name\": \"sequential_1\"}, \"backend\": \"tensorflow\"}'"
]
},
"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_initializer': {u'class_name': u'Zeros', u'config': {}}, u'units': 10, u'batch_input_shape': [None, 4], u'use_bias': True, u'activity_regularizer': None}}, {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'activation': u'relu', u'trainable': True, u'kernel_regularizer': None, u'bias_initializer': {u'class_name': u'Zeros', u'config': {}}, u'units': 10, u'use_bias': True, u'activity_regularizer': None}}, {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_3', u'kernel_constraint': None, u'bias_regularizer': None, u'bias_constraint': None, u'activation': u'softmax', u'trainable': True, u'kernel_regularizer': None, u'bias_initializer': {u'class_name': u'Zeros', u'config': {}}, u'units': 3, u'use_bias': True, u'activity_regularizer': None}}], u'backend': u'tensorflow'}</td>\n",
" <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_initializer': {u'class_name': u'Zeros', u'config': {}}, u'units': 10, u'batch_input_shape': [None, 4], u'use_bias': True, u'activity_regularizer': None}}, {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_3', u'kernel_constraint': None, u'bias_regularizer': None, u'bias_constraint': None, u'activation': u'relu', u'trainable': True, u'kernel_regularizer': None, u'bias_initializer': {u'class_name': u'Zeros', u'config': {}}, u'units': 10, u'use_bias': True, u'activity_regularizer': None}}, {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'activation': u'softmax', u'trainable': True, u'kernel_regularizer': None, u'bias_initializer': {u'class_name': u'Zeros', u'config': {}}, u'units': 3, u'use_bias': True, u'activity_regularizer': None}}], u'backend': u'tensorflow'}</td>\n",
" <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, \"bias_initializer\": {\"class_name\": \"Zeros\", \"config\": {}}, \"units\": 10, \"batch_input_shape\": [null, 4], \"use_bias\": true, \"activity_regularizer\": null}}, {\"class_name\": \"Dense\", \"config\": {\"kernel_initializer\": {\"class_name\": \"VarianceScaling\", \"config\": {\"distribution\": \"uniform\", \"scale\": 1.0, \"seed\": null, \"mode\": \"fan_avg\"}}, \"name\": \"dense_3\", \"kernel_constraint\": null, \"bias_regularizer\": null, \"bias_constraint\": null, \"activation\": \"relu\", \"trainable\": true, \"kernel_regularizer\": null, \"bias_initializer\": {\"class_name\": \"Zeros\", \"config\": {}}, \"units\": 10, \"use_bias\": true, \"activity_regularizer\": null}}, {\"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, \"activation\": \"softmax\", \"trainable\": true, \"kernel_regularizer\": null, \"bias_initializer\": {\"class_name\": \"Zeros\", \"config\": {}}, \"units\": 3, \"use_bias\": true, \"activity_regularizer\": null}}], \"backend\": \"tensorflow\"}\n",
"$$\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-03-06 00:27:56.293667</td>\n",
" <td>2021-03-06 00:27:57.661243</td>\n",
" <td>[0.832237005233765, 0.965812921524048, 1.09816098213196, 1.22954201698303, 1.3674840927124]</td>\n",
" <td>1.18.0-dev</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.949999988079</td>\n",
" <td>0.153273612261</td>\n",
" <td>[0.949999988079071, 0.958333313465118, 0.949999988079071, 0.949999988079071, 0.949999988079071]</td>\n",
" <td>[0.182110622525215, 0.173247531056404, 0.165094882249832, 0.158673033118248, 0.153273612260818]</td>\n",
" <td>1.0</td>\n",
" <td>0.134765788913</td>\n",
" <td>[1.0, 1.0, 1.0, 1.0, 1.0]</td>\n",
" <td>[0.177851542830467, 0.161254957318306, 0.152191400527954, 0.142795532941818, 0.134765788912773]</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, 3, 6, 0, 27, 56, 293667), datetime.datetime(2021, 3, 6, 0, 27, 57, 661243), [0.832237005233765, 0.965812921524048, 1.09816098213196, 1.22954201698303, 1.3674840927124], u'1.18.0-dev', [3], [u'character varying'], 1.0, [u'accuracy'], u'categorical_crossentropy', 0.949999988079071, 0.153273612260818, [0.949999988079071, 0.958333313465118, 0.949999988079071, 0.949999988079071, 0.949999988079071], [0.182110622525215, 0.173247531056404, 0.165094882249832, 0.158673033118248, 0.153273612260818], 1.0, 0.134765788912773, [1.0, 1.0, 1.0, 1.0, 1.0], [0.177851542830467, 0.161254957318306, 0.152191400527954, 0.142795532941818, 0.134765788912773], [2, 4, 6, 8, 10], [u'Iris-setosa', u'Iris-versicolor', u'Iris-virginica'])]"
]
},
"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": "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\n",
"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": "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\n",
"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
}