blob: b16a9488232989ee579386235f091ee1dbe755ec [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:29:48.575453</td>\n",
" <td>2021-03-06 00:29:51.861215</td>\n",
" <td>[3.28567409515381]</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.958333313465</td>\n",
" <td>0.560008466244</td>\n",
" <td>[0.958333313465118]</td>\n",
" <td>[0.560008466243744]</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, 29, 48, 575453), datetime.datetime(2021, 3, 6, 0, 29, 51, 861215), [3.28567409515381], u'1.18.0-dev', [3], [u'character varying'], 1.0, [u'accuracy'], u'categorical_crossentropy', 0.958333313465118, 0.560008466243744, [0.958333313465118], [0.560008466243744], 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.590213775635</td>\n",
" <td>0.899999976158</td>\n",
" <td>[u'accuracy']</td>\n",
" <td>categorical_crossentropy</td>\n",
" </tr>\n",
"</table>"
],
"text/plain": [
"[(0.590213775634766, 0.899999976158142, [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>9</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.8026635</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>9</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.13821265</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>9</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.059123855</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>12</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.8471821</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>12</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.110732675</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>12</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.042085275</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>18</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.8697099</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>18</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.09588991</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>18</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.03440017</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>23</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.9113638</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>23</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.06569701</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>23</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.022939174</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>24</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.8007704</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>24</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.14301367</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>24</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.056215953</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>26</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.7946505</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>26</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.14609303</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>26</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.05925647</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>31</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.8087025</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>31</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.1362152</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>31</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.055082306</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>33</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.9220808</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>33</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.059425894</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>33</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.018493252</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.82773703</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.12367095</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.04859213</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>51</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.52441037</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>51</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.2698906</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>51</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.205699</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>54</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.4541727</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>54</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.3792952</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>54</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.16653205</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>66</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.5121435</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>66</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.2632511</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>66</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.22460538</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>73</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.44443503</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>73</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.4180967</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>73</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.13746823</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>78</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.46657953</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>78</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.3879333</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>78</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.14548717</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>81</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.47301942</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>81</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.3099994</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>81</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.21698117</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>83</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.48130804</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>83</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.2771792</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>83</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.2415128</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>93</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.48122597</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>93</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.30558127</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>93</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.2131927</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.45175043</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>94</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.2748035</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>94</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.2734461</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>96</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.45799258</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>96</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.29800493</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>96</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.24400246</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>99</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.41659498</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>99</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.34956554</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>99</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.23383953</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.46772137</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.3688568</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.16342185</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>111</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.4250459</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>111</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.41558483</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>111</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.15936929</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.46659094</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.3897162</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.1436929</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>123</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.5056077</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>123</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.37151548</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>123</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.12287672</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>127</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.42669904</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>127</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.418276</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.15502496</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>128</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.41957054</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>128</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.41565675</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>128</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.16477272</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>131</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.4755917</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>131</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.40127525</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>131</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.12313308</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>135</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.50083333</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>135</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.34366286</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>135</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.15550385</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>143</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.46772137</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>143</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.3688568</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>143</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.16342185</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>145</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.47896492</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>145</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.36823604</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>145</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.15279905</td>\n",
" <td>3</td>\n",
" </tr>\n",
"</table>"
],
"text/plain": [
"[(9, u'class_text', u'Iris-setosa', 0.8026635, 1),\n",
" (9, u'class_text', u'Iris-versicolor', 0.13821265, 2),\n",
" (9, u'class_text', u'Iris-virginica', 0.059123855, 3),\n",
" (12, u'class_text', u'Iris-setosa', 0.8471821, 1),\n",
" (12, u'class_text', u'Iris-versicolor', 0.110732675, 2),\n",
" (12, u'class_text', u'Iris-virginica', 0.042085275, 3),\n",
" (18, u'class_text', u'Iris-setosa', 0.8697099, 1),\n",
" (18, u'class_text', u'Iris-versicolor', 0.09588991, 2),\n",
" (18, u'class_text', u'Iris-virginica', 0.03440017, 3),\n",
" (23, u'class_text', u'Iris-setosa', 0.9113638, 1),\n",
" (23, u'class_text', u'Iris-versicolor', 0.06569701, 2),\n",
" (23, u'class_text', u'Iris-virginica', 0.022939174, 3),\n",
" (24, u'class_text', u'Iris-setosa', 0.8007704, 1),\n",
" (24, u'class_text', u'Iris-versicolor', 0.14301367, 2),\n",
" (24, u'class_text', u'Iris-virginica', 0.056215953, 3),\n",
" (26, u'class_text', u'Iris-setosa', 0.7946505, 1),\n",
" (26, u'class_text', u'Iris-versicolor', 0.14609303, 2),\n",
" (26, u'class_text', u'Iris-virginica', 0.05925647, 3),\n",
" (31, u'class_text', u'Iris-setosa', 0.8087025, 1),\n",
" (31, u'class_text', u'Iris-versicolor', 0.1362152, 2),\n",
" (31, u'class_text', u'Iris-virginica', 0.055082306, 3),\n",
" (33, u'class_text', u'Iris-setosa', 0.9220808, 1),\n",
" (33, u'class_text', u'Iris-versicolor', 0.059425894, 2),\n",
" (33, u'class_text', u'Iris-virginica', 0.018493252, 3),\n",
" (38, u'class_text', u'Iris-setosa', 0.82773703, 1),\n",
" (38, u'class_text', u'Iris-versicolor', 0.12367095, 2),\n",
" (38, u'class_text', u'Iris-virginica', 0.04859213, 3),\n",
" (51, u'class_text', u'Iris-versicolor', 0.52441037, 1),\n",
" (51, u'class_text', u'Iris-virginica', 0.2698906, 2),\n",
" (51, u'class_text', u'Iris-setosa', 0.205699, 3),\n",
" (54, u'class_text', u'Iris-versicolor', 0.4541727, 1),\n",
" (54, u'class_text', u'Iris-virginica', 0.3792952, 2),\n",
" (54, u'class_text', u'Iris-setosa', 0.16653205, 3),\n",
" (66, u'class_text', u'Iris-versicolor', 0.5121435, 1),\n",
" (66, u'class_text', u'Iris-virginica', 0.2632511, 2),\n",
" (66, u'class_text', u'Iris-setosa', 0.22460538, 3),\n",
" (73, u'class_text', u'Iris-virginica', 0.44443503, 1),\n",
" (73, u'class_text', u'Iris-versicolor', 0.4180967, 2),\n",
" (73, u'class_text', u'Iris-setosa', 0.13746823, 3),\n",
" (78, u'class_text', u'Iris-versicolor', 0.46657953, 1),\n",
" (78, u'class_text', u'Iris-virginica', 0.3879333, 2),\n",
" (78, u'class_text', u'Iris-setosa', 0.14548717, 3),\n",
" (81, u'class_text', u'Iris-versicolor', 0.47301942, 1),\n",
" (81, u'class_text', u'Iris-virginica', 0.3099994, 2),\n",
" (81, u'class_text', u'Iris-setosa', 0.21698117, 3),\n",
" (83, u'class_text', u'Iris-versicolor', 0.48130804, 1),\n",
" (83, u'class_text', u'Iris-virginica', 0.2771792, 2),\n",
" (83, u'class_text', u'Iris-setosa', 0.2415128, 3),\n",
" (93, u'class_text', u'Iris-versicolor', 0.48122597, 1),\n",
" (93, u'class_text', u'Iris-virginica', 0.30558127, 2),\n",
" (93, u'class_text', u'Iris-setosa', 0.2131927, 3),\n",
" (94, u'class_text', u'Iris-versicolor', 0.45175043, 1),\n",
" (94, u'class_text', u'Iris-setosa', 0.2748035, 2),\n",
" (94, u'class_text', u'Iris-virginica', 0.2734461, 3),\n",
" (96, u'class_text', u'Iris-versicolor', 0.45799258, 1),\n",
" (96, u'class_text', u'Iris-virginica', 0.29800493, 2),\n",
" (96, u'class_text', u'Iris-setosa', 0.24400246, 3),\n",
" (99, u'class_text', u'Iris-versicolor', 0.41659498, 1),\n",
" (99, u'class_text', u'Iris-setosa', 0.34956554, 2),\n",
" (99, u'class_text', u'Iris-virginica', 0.23383953, 3),\n",
" (102, u'class_text', u'Iris-virginica', 0.46772137, 1),\n",
" (102, u'class_text', u'Iris-versicolor', 0.3688568, 2),\n",
" (102, u'class_text', u'Iris-setosa', 0.16342185, 3),\n",
" (111, u'class_text', u'Iris-versicolor', 0.4250459, 1),\n",
" (111, u'class_text', u'Iris-virginica', 0.41558483, 2),\n",
" (111, u'class_text', u'Iris-setosa', 0.15936929, 3),\n",
" (117, u'class_text', u'Iris-virginica', 0.46659094, 1),\n",
" (117, u'class_text', u'Iris-versicolor', 0.3897162, 2),\n",
" (117, u'class_text', u'Iris-setosa', 0.1436929, 3),\n",
" (123, u'class_text', u'Iris-virginica', 0.5056077, 1),\n",
" (123, u'class_text', u'Iris-versicolor', 0.37151548, 2),\n",
" (123, u'class_text', u'Iris-setosa', 0.12287672, 3),\n",
" (127, u'class_text', u'Iris-versicolor', 0.42669904, 1),\n",
" (127, u'class_text', u'Iris-virginica', 0.418276, 2),\n",
" (127, u'class_text', u'Iris-setosa', 0.15502496, 3),\n",
" (128, u'class_text', u'Iris-virginica', 0.41957054, 1),\n",
" (128, u'class_text', u'Iris-versicolor', 0.41565675, 2),\n",
" (128, u'class_text', u'Iris-setosa', 0.16477272, 3),\n",
" (131, u'class_text', u'Iris-virginica', 0.4755917, 1),\n",
" (131, u'class_text', u'Iris-versicolor', 0.40127525, 2),\n",
" (131, u'class_text', u'Iris-setosa', 0.12313308, 3),\n",
" (135, u'class_text', u'Iris-virginica', 0.50083333, 1),\n",
" (135, u'class_text', u'Iris-versicolor', 0.34366286, 2),\n",
" (135, u'class_text', u'Iris-setosa', 0.15550385, 3),\n",
" (143, u'class_text', u'Iris-virginica', 0.46772137, 1),\n",
" (143, u'class_text', u'Iris-versicolor', 0.3688568, 2),\n",
" (143, u'class_text', u'Iris-setosa', 0.16342185, 3),\n",
" (145, u'class_text', u'Iris-virginica', 0.47896492, 1),\n",
" (145, u'class_text', u'Iris-versicolor', 0.36823604, 2),\n",
" (145, u'class_text', u'Iris-setosa', 0.15279905, 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>3</td>\n",
" </tr>\n",
"</table>"
],
"text/plain": [
"[(3L,)]"
]
},
"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>90.00</td>\n",
" </tr>\n",
"</table>"
],
"text/plain": [
"[(Decimal('90.00'),)]"
]
},
"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>9</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.8026635</td>\n",
" </tr>\n",
" <tr>\n",
" <td>12</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.8471821</td>\n",
" </tr>\n",
" <tr>\n",
" <td>18</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.8697099</td>\n",
" </tr>\n",
" <tr>\n",
" <td>23</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.9113638</td>\n",
" </tr>\n",
" <tr>\n",
" <td>24</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.8007704</td>\n",
" </tr>\n",
" <tr>\n",
" <td>26</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.7946505</td>\n",
" </tr>\n",
" <tr>\n",
" <td>31</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.8087025</td>\n",
" </tr>\n",
" <tr>\n",
" <td>33</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.9220808</td>\n",
" </tr>\n",
" <tr>\n",
" <td>38</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.82773703</td>\n",
" </tr>\n",
" <tr>\n",
" <td>51</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.52441037</td>\n",
" </tr>\n",
" <tr>\n",
" <td>54</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.4541727</td>\n",
" </tr>\n",
" <tr>\n",
" <td>66</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.5121435</td>\n",
" </tr>\n",
" <tr>\n",
" <td>73</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.44443503</td>\n",
" </tr>\n",
" <tr>\n",
" <td>78</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.46657953</td>\n",
" </tr>\n",
" <tr>\n",
" <td>81</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.47301942</td>\n",
" </tr>\n",
" <tr>\n",
" <td>83</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.48130804</td>\n",
" </tr>\n",
" <tr>\n",
" <td>93</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.48122597</td>\n",
" </tr>\n",
" <tr>\n",
" <td>94</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.45175043</td>\n",
" </tr>\n",
" <tr>\n",
" <td>96</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.45799258</td>\n",
" </tr>\n",
" <tr>\n",
" <td>99</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.41659498</td>\n",
" </tr>\n",
" <tr>\n",
" <td>102</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.46772137</td>\n",
" </tr>\n",
" <tr>\n",
" <td>111</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.4250459</td>\n",
" </tr>\n",
" <tr>\n",
" <td>117</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.46659094</td>\n",
" </tr>\n",
" <tr>\n",
" <td>123</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.5056077</td>\n",
" </tr>\n",
" <tr>\n",
" <td>127</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.42669904</td>\n",
" </tr>\n",
" <tr>\n",
" <td>128</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.41957054</td>\n",
" </tr>\n",
" <tr>\n",
" <td>131</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.4755917</td>\n",
" </tr>\n",
" <tr>\n",
" <td>135</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.50083333</td>\n",
" </tr>\n",
" <tr>\n",
" <td>143</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.46772137</td>\n",
" </tr>\n",
" <tr>\n",
" <td>145</td>\n",
" <td>dependent_var</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.47896492</td>\n",
" </tr>\n",
"</table>"
],
"text/plain": [
"[(9, u'dependent_var', u'Iris-setosa', 0.8026635),\n",
" (12, u'dependent_var', u'Iris-setosa', 0.8471821),\n",
" (18, u'dependent_var', u'Iris-setosa', 0.8697099),\n",
" (23, u'dependent_var', u'Iris-setosa', 0.9113638),\n",
" (24, u'dependent_var', u'Iris-setosa', 0.8007704),\n",
" (26, u'dependent_var', u'Iris-setosa', 0.7946505),\n",
" (31, u'dependent_var', u'Iris-setosa', 0.8087025),\n",
" (33, u'dependent_var', u'Iris-setosa', 0.9220808),\n",
" (38, u'dependent_var', u'Iris-setosa', 0.82773703),\n",
" (51, u'dependent_var', u'Iris-versicolor', 0.52441037),\n",
" (54, u'dependent_var', u'Iris-versicolor', 0.4541727),\n",
" (66, u'dependent_var', u'Iris-versicolor', 0.5121435),\n",
" (73, u'dependent_var', u'Iris-virginica', 0.44443503),\n",
" (78, u'dependent_var', u'Iris-versicolor', 0.46657953),\n",
" (81, u'dependent_var', u'Iris-versicolor', 0.47301942),\n",
" (83, u'dependent_var', u'Iris-versicolor', 0.48130804),\n",
" (93, u'dependent_var', u'Iris-versicolor', 0.48122597),\n",
" (94, u'dependent_var', u'Iris-versicolor', 0.45175043),\n",
" (96, u'dependent_var', u'Iris-versicolor', 0.45799258),\n",
" (99, u'dependent_var', u'Iris-versicolor', 0.41659498),\n",
" (102, u'dependent_var', u'Iris-virginica', 0.46772137),\n",
" (111, u'dependent_var', u'Iris-versicolor', 0.4250459),\n",
" (117, u'dependent_var', u'Iris-virginica', 0.46659094),\n",
" (123, u'dependent_var', u'Iris-virginica', 0.5056077),\n",
" (127, u'dependent_var', u'Iris-versicolor', 0.42669904),\n",
" (128, u'dependent_var', u'Iris-virginica', 0.41957054),\n",
" (131, u'dependent_var', u'Iris-virginica', 0.4755917),\n",
" (135, u'dependent_var', u'Iris-virginica', 0.50083333),\n",
" (143, u'dependent_var', u'Iris-virginica', 0.46772137),\n",
" (145, u'dependent_var', u'Iris-virginica', 0.47896492)]"
]
},
"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>3</td>\n",
" </tr>\n",
"</table>"
],
"text/plain": [
"[(3L,)]"
]
},
"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>90.00</td>\n",
" </tr>\n",
"</table>"
],
"text/plain": [
"[(Decimal('90.00'),)]"
]
},
"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:30:02.409489</td>\n",
" <td>2021-03-06 00:30:03.741511</td>\n",
" <td>[0.776393890380859, 0.917426109313965, 1.05355596542358, 1.18816304206848, 1.33194589614868]</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.983333349228</td>\n",
" <td>0.251336187124</td>\n",
" <td>[0.975000023841858, 0.983333349227905, 0.975000023841858, 0.991666674613953, 0.983333349227905]</td>\n",
" <td>[0.474240601062775, 0.406035482883453, 0.347332179546356, 0.295203357934952, 0.251336187124252]</td>\n",
" <td>0.966666638851</td>\n",
" <td>0.272865414619</td>\n",
" <td>[0.966666638851166, 0.899999976158142, 0.966666638851166, 0.966666638851166, 0.966666638851166]</td>\n",
" <td>[0.50140792131424, 0.429758101701736, 0.369670689105988, 0.317984014749527, 0.272865414619446]</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, 30, 2, 409489), datetime.datetime(2021, 3, 6, 0, 30, 3, 741511), [0.776393890380859, 0.917426109313965, 1.05355596542358, 1.18816304206848, 1.33194589614868], u'1.18.0-dev', [3], [u'character varying'], 1.0, [u'accuracy'], u'categorical_crossentropy', 0.983333349227905, 0.251336187124252, [0.975000023841858, 0.983333349227905, 0.975000023841858, 0.991666674613953, 0.983333349227905], [0.474240601062775, 0.406035482883453, 0.347332179546356, 0.295203357934952, 0.251336187124252], 0.966666638851166, 0.272865414619446, [0.966666638851166, 0.899999976158142, 0.966666638851166, 0.966666638851166, 0.966666638851166], [0.50140792131424, 0.429758101701736, 0.369670689105988, 0.317984014749527, 0.272865414619446], [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": "iVBORw0KGgoAAAANSUhEUgAAAYsAAAEWCAYAAACXGLsWAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi41LCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvSM8oowAAIABJREFUeJzt3Xd4VGX2wPHvSSD0DoYSEAQsiBgEgVA0WBAs6Kq7YldEdFcX8bcWEEVFpFhWUVgbdlEWcS3rYluElSbVAAoiiAqhCKKUIBBCzu+P9844xJCZkEzuZOZ8nmee3Ln1zM3MnLnvvfc9oqoYY4wxRUnyOwBjjDGxz5KFMcaYsCxZGGOMCcuShTHGmLAsWRhjjAnLkoUxxpiwLFnEORG5XEQ+LsPtNRcRFZEK3vMPROTqSOY9jG3dJSITSxJvIhORTBHJLqV1PS0i95TGukoQw1cikulnDPFM7D6L8k1EvgcGqOp//Y4FXAIAvgMqqmpeKc6bCbymqmmlEaeJ3j4ti/+ViLwEZKvq3dHahjmYHVnEscP9xW78lej/t0R//bHKkkUcEZFrRGSOiDwmItuA+7xxs73p4k3bIiI7RWS5iLQtZD2XiMiiAuNuFZH3vOFzROQLbx3rReS+ImKaKSIDvOFkEXlERH4SkbXAOQXmvVZEVorILhFZKyI3eOOrAR8AjUUkx3s0FpH7ROS1kOX7ek0R273tHhcy7XsRuU1ElonIDhH5p4hUPkTMLUXkUxHZ5sU6SURqh0xvKiL/EpGt3jzjQ6ZdH/IaVojISd54FZFWIfO9JCIjveFMEckWkTtFZDPwoojUEZH3vW384g2nhSxfV0ReFJGN3vR3vPFfish5IfNV9F5D+yL+R3d583wvIpd7404WkR9FJDlkvgtFZOkh1vGSiIws4n+VJCJDRORbb59NEZG63rKB5sjrRGQd8Kk3/k0R2ez9vz4TkeO98QOBy4E7vPX/O+R/fIY3XElEHvf2z0ZvuFKB/f0377OwSUSuPdT+MY4li/jTGVgLpAIPFpjWCzgFOBqoBfwJ2FbIOv4NHCMirUPGXQa87g3vBq4CauO+8P8sIhdEENv1wLlAe6AjcHGB6Vu86TWBa4HHROQkVd0N9AE2qmp177ExdEERORp4AxgMNACmAf8WkZSQ2f4E9AZaAO2Aaw4RpwCjgcbAcUBT4D5vO8nA+8APQHOgCTDZm/ZHb76rvNfQl8L3b2EaAnWBI4GBuM/mi97zZsAeYHzI/K8CVYHjgSOAx7zxrwBXhMx3NrBJVb8oYrv1vddxNfCsiByjqgu92HuFzHult/5DKuJ/9VfgAuBU3H79BZhQYPFTcfv7LO/5B0Br7/UtASZ523jWG37IW/95/N4woAuQDpwIdAJCm6wa4j4DTYDrgAkiUqeo15bwVNUe5fgBfA+c4Q1fA6wrMP0aYLY3fBrwDe5DlBRmva8Bw73h1sAuoOoh5n0ceMwbbg4oUMF7PhN3TgXcL8YbQ5brFTpvIet9B7jFG87EtVGHTr8P1zYOcA8wJWRaErAByAzZT1eETH8IeDrCfXwB8IU3nAFsLSxm4KNAvIVMU6BVyPOXgJEhry0XqFxEDOnAL95wIyAfqFPIfI29/1VN7/lU4I5DrDMTyAOqhYybAtzjDd8JTPKG6wK/Ao0Osa6Cr6fg/2olcHrI80bAfqBCyHvmqCJef21vnloFt3eIz8K3wNkh084Cvg+Jb0/o/xD3Q6VLaX8+4+lhRxbxZ/2hJqjqp7hfpxOALSLyrIjUPMTsrwOXesOXAe+o6q8AItJZRGZ4TSQ7gBtxv07DaVwgvh9CJ4pIHxH5XER+FpHtuF/Fkaw3sO7g+lQ139tWk5B5NocM/wpUL2xFIpIqIpNFZIOI7MQlzkAcTYEftPAT8k1xX1KHY6uq7g2JoaqIPCMiP3gxfAbU9o5smgI/q+ovBVei7lf8HOAir+msD94v8kP4Rd3RQMAPuH0J7nWf5zUt/QmYpaqbDvP1HQm87TURbscljwO4I+CA4HtDXJPlGK/ZaicuEcBhvh84+HUBbCvwPzzk+8E4liziT5GXt6nqE6raAWiDa466/RCzfgI0EJF0XNJ4PWTa68B7QFNVrQU8jWu6CWcT7osuoFlgwGtPfgt4BEhV1dq4pqTAesNdtrcR94UUWJ9429oQQVwFjfK2d4Kq1sQ16wTiWA80k8JPwq4HWh5inb/imo0CGhaYXvD1/Q04BujsxXCKN1687dQNPY9SwMtezH8E5qlqUfugjpcMAprh9iXecvOAC3FNUK8WsZ6iXgtezH1UtXbIo3KB2EKXuww4HzgD11zU3Bt/WO8HQl6XOTyWLBKId9Kys4hUxJ132ItrzvgdVd0PvAk8jGuC+CRkcg3cL9u9ItIJ98GOxBRgkIikee3DQ0KmpQCVcE08eSLSh4Pby38E6olIrSLWfY6InO69vr8B+4C5EcYWqgaQA+wQkSYcnFAX4JLeGBGpJiKVRaSbN20icJuIdBCnlYgEvrCygMu8X8y9ce3z4WLYA2z3TgTfG5jg/br/APiHuBPhFUXklJBl3wFOAm4hzDkGz/0ikiIiPXDnjN4MmfYKcAdwAvCvCNYFhf+vngYeDOwPEWkgIucXsY4auP/fNlySHVXINo4qYvk3gLu97dQHhuOOlMxhsmSRWGoCz+FOLv6A+yA+XMT8r+N+2b1Z4JD9L8AIEdmF+xBOiXD7z+Ha9ZfiTlgGv3xUdRcwyFvXL7gE9F7I9K9xXwBrvaaM0CYFVHUV7tf0k8BPwHnAeaqaG2Fsoe7HfdnuAP5TIM4D3rpbAeuAbOASb9qbuIsKXsedN3gHl2jBfXGfB2zHXcnzTpgYHgeqeK/lc+DDAtOvxLX5f41rbx8cEuMe3FFaC8J/wW/G7e+NuOaqG719HfA2XhNSoBkynEP8r8bh/p8fe++bz3EXYxzKK7j36AZghTd/qOeBNt76C9uXI4FFwDJgOe79NjKS+E3h7KY8Y+KQiAwHjlbVK8LOHH5d3wI3aIzc+Gn8YTe/GBNnvGar63BHHyVd10W48wOflnRdpnyzZihj4oiIXI87mfyBqn5WwnXNBJ4CbvKuLjMJzJqhjDHGhGVHFsYYY8KKm3MW9evX1+bNmx/28rt376ZatWrhZyxjFlfxWFzFY3EVTzzGtXjx4p9UtUHYGf2+hby0Hh06dNCSmDFjRomWjxaLq3gsruKxuIonHuMCFql192GMMaY0WLIwxhgTliULY4wxYVmyMMYYE5YlC2OMMWFZsjDGGBOWJQtjTEyZt34ek9ZNYt76eX6HYkJYsjDGxIzPfviMzJczef675zntldOYu+5wypGYaIibO7iNMeXX7tzdPLfkOe6deS+5B1wJkr15eznz1TM5s+WZdG/WnR7NenBSo5OomFzR52gTkyULY4xvft7zM+MXjOeJ+U+wbc820hums3LrSvYf2E9yUjKZLTL5autXvLvqXQCqVKhCl7QuweTRJa0LNSrV8PlVJAZLFsaYMrdx10b+Pu/vPLP4GXJyczj36HMZ2n0oXZt2Zd76ebww4wX69+xPRtMMADbt2sSc9XOYvW42s9bN4sFZD5Kv+SRLMukN04PJo3uz7qRWT/X51cUnSxbGmDKzettqHp77MC8vfZm8/Dz6te3HkG5DOCH1hOA8GU0z2NdsXzBRADSq0YiL21zMxW0uBmDXvl3My54XTB7PLn6WcfPHAdC6bmu6N+seTCCt6rZCRMr2hcYhSxbGmKjL2pzF6NmjmbpiKhWTKtI/vT+3d7udo+ocdVjrq1GpBr1a9qJXy14A5B7IZcmmJcHk8e6qd3kx60UAUqulHpQ8Tmx4IhWS7KuvuGyPGWOiQlWZtW4Wo2eP5sM1H1IjpQa3d72dwV0G07B6w1LdVkpyCl3SutAlrQu3db2NfM3n65++Zva62cEE8tbKtwConlKdjLSMYPLonNaZqhWrlmo88ciShTGmVKkq/1n9H0bPHs3c9XNpULUBD572IH85+S/Urly7TGJIkiTaNGhDmwZtGNhhIADZO7MPSh73zbwPRamQVIGTGp0UPOfRvVl36letXyZxlieWLIwxpSIvP48pX01hzOwxLN+ynGa1mvFknyfp375/TPxyT6uZRr+2/ejXth8A2/duZ+76ucHk8eSCJ3l03qMAHFv/2GDy6NGsB81rN0/48x6WLIwxJbI3by8vZb3Ew3MfZu0vazmu/nG8fMHLXNr20pi+J6J25dqc3fpszm59NuBex+KNi5m1bhaz183mzRVv8tyS5wBoXKMxPZr1IHVfKnU216HtEW1JTkr2M/wyZ8nCGHNYdu7byVMLn+Kxzx/jx90/0qlJJx7t9Sh9j+lLkpS/ziEqV6hMt2bd6NasGwD5ms9XW74KJo9Z62aRvTObJ9Y8Qc1KNenatGvw6KNTk05UrlDZ51cQXZYsjDHFsmX3FsZ9Po4JCyewY98OzjjqDF7v/jo9m/eMq6aaJEnihNQTOCH1BP5y8l9QVf750T/Ja5wXTB7DPh0GuBPsHRt3DCaPrk27UrdKXZ9fQemyZGGMicgP23/gkbmP8PwXz7M3by8XHnchQ7oPoWPjjn6HViZEhIaVG5LZLpMr2l0BwLZftzF3/dzg0cff5/2dsXPGAtD2iLZ0b9qdHke6BNKsVjM/wy8xSxbGmCKt2LqCsXPG8vry1wG4st2V3NHtDo6tf6zPkfmvXtV6nHfMeZx3zHkA/Lr/VxZuWBhMHpOWT+LpxU8D0KxWs4PuNG/ToE25aq6zZGGMKdSCDQsYPXs073z9DlUrVuWmk2/ibxl/o2mtpn6HFrOqVqzKqc1P5dTmpwLuCrHlPy4PJo9Pv/s0mHTrVK5Dt2bdgkcfHRp1oFKFSn6GXyRLFsaYIFVl+nfTGT17NJ9+9ym1K9fmnlPuYVDnQXbvwWGokFSB9o3a075RewZ1HoSqsvaXtcFzHrPXzeb9b94H3An2Tk06BZNHRloGtSrX8vkV/MaShTGGfM3n7ZVvM2bOGBZtXESj6o14+MyHuaHDDdaraykSEVrWbUnLui25Ov1qwF0wMGfdnGDyGDtnLKNmjyJJkmiX2u6g8x6NazT2LXZLFqbYApXMKq2vdFBnb6b82Z+/nxe/eJGxc8ayatsqWtZpyTPnPsPVJ14d000i8eSIakfwh+P+wB+O+wMAObk5zM+eHzz6eCHrBcYvHA9Ai9otXOLwEsgx9Y7h8+zPy+TzaMnCRCwnN4cXv3iRv338N/Ly83ht/WtMv3I6XZt19Ts0U0y7c3czcclERi0YxZZ9Wzgx9UQmXzSZi9tcnHA3m8Wa6inVOf2o0zn9qNMB2H9gP1mbs4LJ44PVH/DK0lcAqFWpFrtyd6GqTFo/ielXTY9awrBkYQ6p4OHxkk1LOKAHgtP35u2l12u9OKvVWcErPNIbpluPnjHslz2/MH7BeMbNH8e2PdtoV6sdL130Er1b9Y6reyTiScXkipzc5GRObnIyt2bciqryzbZvmL1uNv9Y+A+WbF4CuJ53Z34/05KFia7AibfQu1W/2fYNAJWSK9E5rTNDug+hXpV6DPt0GPvy9pGclEyPZj34YtMX/GvlvwCoVrEaGU0zgsmjc5POVEup5udLM7hiQ4/Ne4ynFz9NTm4O57Q+h6Hdh7J/7X4yW2f6HZ4pBhHhmPrHcEz9Y2jToA2nv3I6+/L2kZKcQmbzzKht15JFgjqQf4BlPy4LJofZ62azKWcT8Nslfde1v47uzbr/7pK+LmldflfJbMPODQdd4VGwR89AG2u3pt1oUK2BL685Ea35eQ0PzXkoWGzokuMvYUj3IbRLbQfAzLUz/Q3QlEhG0wymXzX9d5/HaLBkkSD27N/D/A3zg4lh7vq57MrdBbibhU5rcVrwhqHjGhxX5M1ChVUya1KzCZe0vYRL2l4CwI69Ow7q0XPCwgn8/fO/A65Hz9ArPFrUbmFNIKUsa3MWY2aP4c0Vb1IhqQLXpl/L7V1vp2Xdln6HZkpZYZ/HaIhqshCR3sA4IBmYqKpjCkw/EngBaAD8DFyhqtnetIeAc4Ak4BPgFlXVaMYbT7b9uu2gmsWLNy5mf/5+wHVDcEW7K4J990ejG4JalWvRp3Uf+rTuA8C+vH0s2rgoGM/UlVOZ+MVEwPXoGXpn6wlHnGAnWQ/TrB9csaEP1nxAjZQa3JZxG4O7DKZRjUZ+h2bKuaglCxFJBiYAZwLZwEIReU9VV4TM9gjwiqq+LCKnAaOBK0WkK9ANaOfNNxs4FZgZrXjLM1Vl3Y51B51vWLHV7eaU5BRObnwy/5fxf3Rv1p1uTbtRp0qdMo+xUoVKwR497+TOYI+egXhnrZvFlK+mAAR79AwcfZzc+GSqVKxS5jGXF6rKtNXTGD17NHPWz6F+1fqM7DmSv5z8F1/+1yY+RfPIohOwRlXXAojIZOB8IDRZtAH+zxueAbzjDStQGUgBBKgI/BjFWMuVfM3nyy1fHnSOIHtnNuC+aLs17cblJ1xOj2Y96Ni4Y0x+0Yb26Pnnk/8M4BLeD78lvLvX3A381qNnIHnEY4+ehyMvP483v3qTMXPGsOzHZTSr1Ywnej/BdSddFxPFhkx8kWi17IjIxUBvVR3gPb8S6KyqN4fM8zowX1XHiciFwFtAfVXdJiKPAANwyWK8qg4rZBsDgYEAqampHSZPnnzY8ebk5FC9evXDXj5acnJySKmawqpdq1i+YznLdizjq51fkZOXA0D9lPqcUOuE4KNFtRYkS/SbcMpif+3cv5Mvd3zJ8p3LWb5jOat2rSJP8wBoUa0FJ9T87XWnVk4ts7gOR2nGlZufy4ebP+Sf6//Jxr0bObLqkfRr2o8zjjij2JctJ8L+Kk3xGFfPnj0Xq2rYroP9PsF9GzBeRK4BPgM2AAdEpBVwHJDmzfeJiPRQ1VmhC6vqs8CzAB07dtTMzMzDDmTmzJmUZPnSFFru8f3V7/PN7m/Yd2AfAMfVP45L210abN/3q9xjWe2vvvQNDu/Zv4cFGxa4k/TrZzNj3Qze2/QeAE1rNqXHkT04Yu8RXNfpupjr0bM09tfOfTt5etHTPPb5Y2zO2czJjU9mfPfxnH/s+Yf9WmPpfR/K4iqesogrmsliAxDaPWWaNy5IVTcCFwKISHXgIlXdLiLXA5+rao437QMgAzgoWcSLQCH5WT/MYvb62Sz/cXnwstPW1Vpzc6eb6dHMNb8k8mWnVSpWOahHzwP5B1i+ZXlwv834bgabcjbx+OrHy12PnkXZunsr4+a7YkPb927njKPO4LU/vMZpLU6zq8hMmYlmslgItBaRFrgk0Q+4LHQGEakP/Kyq+cBQ3JVRAOuA60VkNK4Z6lTg8SjGWmZUlZU/rTzofMP3278H3G3+GWkZXJR5ET2a9aBTk04snLswJn/JxILkpGTSG6aT3jCdv3b+K6rKGx++wf5G+4P7t7AePQOVzGKpR8/CrNuxjkfmPsLEJRPZm7eXPxz3B4Z0G8LJTU72OzSTgKKWLFQ1T0RuBj7CXTr7gqp+JSIjgEWq+h6QCYwWEcU1Q93kLT4VOA1YjjvZ/aGq/jtasUZT7oFclmxaEvz1O2fdHLbt2Qa4DsR6NOvB4M6D6d6sOyc2PNG6yigBEaFxlcZkpmcGe/Tcunsrc9bPCe7/QI+egtAutV2wOa/HkT187dEz1MqtKxk7ZyyTlk8C4Ip2V3BH1zs4rsFxPkdmEllUv5lUdRowrcC44SHDU3GJoeByB4AbohlbtOzct5PPsz8PfjnNz57Pnrw9ALSu25q+x/QNfkG1qtvKmhGirEG1Blxw7AVccOwFgOtAb/6G+cH/z4tZLxbZo2dZ/n8WblgYLDZUuUJl/tLxL/yt69/KfTlOEx/sZ2wJbc7ZHLzcc/b62WRtziJf80mSJNo3bM/ADgPp0awH3Zp1o2H1hn6Hm/CqpVTjtBancVqL0wDXo+fSH5cGk0doj571q9Z3Ny56TVcnNTqJiskVSzWeQLGhMbPHMP276dSuXJthPYYxqPOghD4/ZWKPJYtiUFVW/7w6+MUy64dZfPvLtwBUqVCFLmlduLvH3XRv1p0uaV2saEw5UDG5Ih0bd6Rj447BHj1X/7z6oHNK73ztbv8J/I8DR4YZTTOonnJ4lyvmaz7vfP0OY2aPYeHGhTSs3pCHzniIGzreQM1KNUvzJRpTKixZFCEvP4+szVnB5DB73Wy27N4CQL0q9ejerDt/7vjnqP3qNGVPRDi63tEcXe9o+rfvD8CmXZsOOu8xctZI8jWfZHEn2APJo3uz7qRWTy1y/fsP7GfS8kmMnTOWr3/6Olhs6KoTr6Jyhcpl8RKNOSyWLPit8lv+2nwUDf6q/Dz7c3bv3w249uyzWv5Wt+HY+sfa+YYE0ahGIy5uczEXt7kY+P15qacXP83j893Feq3rtj6on6tWdVvxefbnvPz9y7z74bu8tfIt1u9cT7vUdrxx0Rtc3OZiu6jBlAsJ/y6dtnoa508+n7z8PCZ+5zq2C1wpc236tcFfjE1qNvE5UhMralaqSa+WvejVshfw2xVvgR8Z7656lxezXgRcd+879u0gX/PhB2iX2o6nz32aPq362I8NU64kfLJYsGEBefmuCwlBuOrEqxjXe1zMX4NvYkdKcgpd0rrQJa0Lt3W9jXzN5+ufvmb2utk8tegpsjZnAa4/rH7H9+Ps1mf7HLExxRc7/SH45KyWZ1GlQhWSSKJyhcrc0OEGSxSmRJIkiTYN2jCww0D+cfY/gu+vSsmVolrJzJhoSvhkEag01b9F/6gWOzeJyd5fJl4kfDMUlF2lKZOY7P1l4kHCH1kYY4wJz5KFMcaYsCxZGGOMCcuShTHGmLAsWRhjjAnLkoUxxpiwLFkYY4wJy5KFMcaYsCxZGGOMCcuShTHGmLAsWRhjjAnLkoUxxpiwLFkAzJtHs0mTYN48vyMx8cjeX8Vj+6t4ymh/Wa+z06ZB3760yM+HSZNg+nTIsN5BTSmZNw9OPZUW+/fDiy/CuedCw4Z+RxV09MaNMHmy32H8ZvNmeP99Whw4YPsrEoH9VQbfX5YsPv8cDhxAAHJzYeZMSxam9Lz+Ouzf795fBw64D3O1an5HFVQ/NxdSUvwO4ze7d//2ebT9FV7o/ory95cliz59YMwY2L8fKlSAzEy/IzLxZNEiAPKTkkiqVAk+/jimfozMnTmTzFh6z8+bB6efTv6+fba/IhG6v1JSovr9ZecsMjLgo4/Iq1IFjj0WunTxOyITLz77zB253nQT3/fvb02ckcjIgOnTbX9Fqgz3lyULgJ49WXvDDbB0KXz4od/RmHigCkOHQuPG8PDDrLv8cvvii1RGhu2v4iij/WXJwrPp7LPhqKPcBzw/3+9wTHn3/vswdy7cey9UqeJ3NMaUmCULj1asCA884I4upkzxOxxTnh04AHfdBa1bw7XX+h2NMaXCkkWofv2gXTu4+253wtuYw/HGG/Dll+7HR8WKfkdjTKmwZBEqKQlGjYJvv4UXXvA7GlMe5ebC8OHQvj388Y9+R2NMqbFkUdDZZ0O3bnD//fDrr35HY8qb556D775zPzqS7ONl4oe9mwsScfddbNoE48f7HY0pT3bvdk1Pp54KZ53ldzTGlCpLFoXp3t0dYYwZA9u3+x2NKS/GjYMff4TRo92PDmPiSFSThYj0FpFVIrJGRIYUMv1IEZkuIstEZKaIpIVMayYiH4vIShFZISLNoxnr74waBb/8Ag8/XKabNeXUzz/DQw9B3752f4CJS1FLFiKSDEwA+gBtgEtFpE2B2R4BXlHVdsAIYHTItFeAh1X1OKATsCVasRbqxBPh0kvh8cddZ13GFGXsWNi5Ex580O9IjImKaB5ZdALWqOpaVc0FJgPnF5inDfCpNzwjMN1LKhVU9RMAVc1R1bI/2zxihLu6ZeTIMt+0KUc2bIAnnoArroC2bf2OxpioiGayaAKsD3me7Y0LtRS40Bv+A1BDROoBRwPbReRfIvKFiDzsHamUrVatYMAAeOYZWLu2zDdvyokHHnA34t1/v9+RGBM1oqrRWbHIxUBvVR3gPb8S6KyqN4fM0xgYD7QAPgMuAtoCZwDPA+2BdcA/gWmq+nyBbQwEBgKkpqZ2mFyCfuZzcnKoXr3678an/PQTna+4gq2nnMLXd9112Osv7bj8ZnE5VbKz6XT11Ww4/3zWDBoUM3FFyuIqnniMq2fPnotVtWPYGVU1Kg8gA/go5PlQYGgR81cHsr3hLsD/QqZdCUwoansdOnTQkpgxY8ahJ955p6qI6rJlJdrG4SgyLh9ZXJ5+/VSrVlXdvLnI2Wx/FY/FVTwliQtYpBF8p0ezGWoh0FpEWohICtAPeC90BhGpLyKBGIYCL4QsW1tEGnjPTwNWRDHWot15J9SqBcOG+RaCiUFZWa5q2q23Qmqq39EYE1VRSxaqmgfcDHwErASmqOpXIjJCRPp6s2UCq0TkGyAVeNBb9gBwGzBdRJYDAjwXrVjDqlMH7rgD/v1vmDPHtzBMjLnrLvfeuO02vyMxJuqiWilPVacB0wqMGx4yPBWYeohlPwHaRTO+Yhk0yF3xMnQo/O9/dtNVovvsM/jgA3dvRe3afkdjTNTZHdyRqlYN7rkHZs2yAkmJLrSw0c03h5/fmDhgyaI4BgxwBZLuussKJCWy//zHChuZhGPJojhSUtyNellZViApUeXnux8LrVpZYSOTUCxZFNell7oCSffcYwWSEtEbb8Dy5e6ufitsZBKIJYviSkpy/f+sWWMFkhJNbq77kZCeboWNTMIJmyxE5K8iUqcsgik3zjnHFUgaMcIKJCWSiRNdYaPRo62wkUk4kbzjU4GFIjLF63LcrhkVcV8YGzdagaREsXu3+3FwyilW2MgkpLDJQlXvBlrj+mq6BlgtIqNEpGWUY4ttPXpYgaREYoWNTIKL6Fja6z9ks/fIA+oAU0XkoSjGFvsefNAKJCWCQGGj886Drl39jsYYX0RyzuIWEVkMPATMAU5Q1T8DHXC9xCau9HQrkJQIrLCRMREdWdQFLlTVs1T1TVXdD6Cq+cC5UY2uPLACSfEtUNjo8svhhBP8jsYY30SSLD4Afg48EZGaItIZQFVXRiuwciNQIOnZZ61AUjyywkbBdkLSAAAe2ElEQVTGAJEli6eAnJDnOd44E3DPPVChguv+wcSP1avd5bIDB7puXoxJYJEkC/FOcAPB5qeo9lZb7jRu7HqlnTTJ3d1r4sPw4VCpEtx9t9+RGOO7SJLFWhEZJCIVvcctgLW3FHTnnVCzphVIiheBwkaDB0PDhn5HY4zvIkkWNwJdgQ1ANtAZr+61CVGnjksY//6365HUlG+Bwka33+53JMbEhEhuytuiqv1U9QhVTVXVy1R1S1kEV+4MGuTKaw4d6moemPIpUNhoyBArbGSMJ+y5BxGpDFwHHA9UDoxX1f5RjKt8qlbNtXPfdBN89BH07u13RKa4rLCRMYWKpBnqVaAhcBbwPyAN2BXNoMq1AQOgRQv3hWMFksqfQGGj4cOhalW/ozEmZkSSLFqp6j3AblV9GTgHd97CFCYlxV2bn5UFb77pdzSmOEILG/W3A2djQkWSLAIVfraLSFugFnBE9EKKA5de6u72vftuK5BUngQKGz3wgBU2MqaASJLFs149i7uB94AVwNioRlXeJSXBqFGuQNKLL/odjYlEaGGjP/3J72iMiTlFnuAWkSRgp6r+AnwG2G2skTrnHNdD6f33w5VXQpUqfkdkihIobDRtmhU2MqYQRX4qvLu17yijWOKLiKt1YQWSYl9oYSO7gs2YQkXyE+q/InKbiDQVkbqBR9Qjiwc9ekCfPq5gjhVIil1PPGGFjYwJI5JkcQlwE64ZarH3WBTNoOLKqFGuQNIjj/gdiSnMzz+7ehVW2MiYIkVyB3eLQh527iJS6enQrx889pgVSIpFDz1khY2MiUAkd3BfVdh4VX2l9MOJUw88AFOnui+kJ5/0OxoTsHGjq61thY2MCSuSZqiTQx49gPuAvlGMKf60agXXXQfPPOOuuDGx4YEHIC/PChsZE4FImqH+GvK4HjgJqB790OLM8OGQnGwFkmLFmjXuctkbbrDCRsZE4HAuKN8NtCjtQOJeoEDSa69ZgaRYMHy465rFChsZE5GwyUJE/i0i73mP94FVwNvRDy0OBQok2ReUv7KyXNceVtjImIhFUh419JrPPOAHVc2OUjzxrW5duOMOV01v7ly7VNMvw4ZZYSNjiimSZqh1wHxV/Z+qzgG2iUjzqEYVz265xQok+WnWLNelhxU2MqZYIkkWbwKhhRkOeOPCEpHeIrJKRNaIyJBCph8pItNFZJmIzBSRtALTa4pItojET38Z1aq5Dus++8wVSDJlJ1DYqFEjK2xkTDFFkiwqqGpu4Ik3nBJuIRFJBiYAfYA2wKUi0qbAbI8Ar6hqO2AEMLrA9Adwd47Hl+uvdwWS7rrLCiSVpf/8B+bMcVekWWEjY4olkmSxVUSC91WIyPnATxEs1wlYo6prvQQzGTi/wDxtgE+94Rmh00WkA5AKfBzBtsqXlBTXcd0XX1iBpLJihY2MKZFIksWNwF0isk5E1gF3AjdEsFwTYH3I82xvXKilwIXe8B+AGiJSz+sa/VHgtgi2Uz4FCiTdc48VSCoLVtjImBIRjfAkq4hUB1DVnAjnvxjoraoDvOdXAp1V9eaQeRoD43H3bXwGXAS0Ba4AqqrqQyJyDdAxdLmQ5QcCAwFSU1M7TJ48OaLXUpicnByqVy/bew3rzZ3LCcOGser//o9N550XM3FFojzFJfv30+maa8irWpXFzzzjS72K8rS/YoHFVTwliatnz56LVbVj2BlVtcgHMAqoHfK8DjAyguUygI9Cng8FhhYxf3Ug2xuehLsK63tck9dOYExR2+vQoYOWxIwZM0q0/GHJz1ft2lW1cWPVX38tdBZf4opAuYprwgRVUJ02rczjCShX+ysGWFzFU5K4gEUa5vtcVSNqhuqjqsFiDOqq5p0dwXILgdYi0kJEUoB+uLKsQSJS32tyCiSTF7xtXK6qzVS1Oa4p6hVV/d3VVOWeiKuhYAWSomf3btf01KOHFTYypgQiSRbJIlIp8EREqgCVipgfAFXNA24GPgJWAlNU9SsRGRFywjwTWCUi3+BOZideP9GnnGIFkqLpiSdc1/BW2MiYEonkDu5JwHQReREQ4Brg5UhWrqrTgGkFxg0PGZ4KTA2zjpeAlyLZXrn14INw0kmuQNLIkX5HEz9++cXVqzj3XOjWze9ojCnXIul1diwwEjgOOAZ3pHBklONKLO3b/1Yg6ccf/Y4mfowdCzt2WGEjY0pBpJeF/Ago8EfgNFyzkilNI0bAvn12ZFFaNm50TVCXXQbt2vkdjTHl3iGThYgcLSL3isjXwJO4q5NEVXuqqp2NLW2tW8OAAVYgqbQ88IC7f2XECL8jMSYuFHVk8TXuKOJcVe2uqk/i+oUy0XLPPVYgqTQEChsNHGiFjYwpJUUliwuBTcAMEXlORE7HneA20dKkyW8Fkr780u9oyi8rbGRMqTtkslDVd1S1H3Asrt+mwcARIvKUiPQqqwATTqBA0rBhfkdSLlVfs8Z17XHLLa53WWNMqYjkaqjdqvq6qp4HpAFf4PqHMtEQKJD03nswb57f0ZQ7LSZOdIWN7rjD71CMiSvF6iRHVX9R1WdV9fRoBWSwAkmHa9Ys6s2f747OrLCRMaWq7HtUM+EFCiT973/UWbjQ72jKB6+w0b569eCvf/U7GmPijiWLWOUVSDpq4kQrkBSJadNgzhx+uOoqK2xkTBRYsohVXoGkGqtXw9Qie0QxgcJGLVuy6exI+rg0xhSXJYtYduml5LRo4S4BtQJJhzZ5MixbBg88gFaIpLszY0xxWbKIZcnJfDdgAKxeDS+95Hc0sSk3153fOfFEuOQSv6MxJm5Zsohx2zIyICMD7rsP9uzxO5zY8/zzsHYtjBrlSwU8YxKFfbpinQiMGeM6xpswwe9oYsvu3a7vpx49XE0QY0zUWLIoD045xVV5Gz3adbltnCeftMJGxpQRSxblxahR8PPPrkCScYWNxo61wkbGlBFLFuVF+/buBK4VSHIeesgKGxlThixZlCcPPAB799oX5KZNMG6cFTYypgxZsihPWreG666Dp5+G77/3Oxr/BAob3X+/35EYkzAsWZQ3w4cndoGkb7+F555zhY1atvQ7GmMShiWL8qZJE9dR3quvJmaBpOHDoWJFK2xkTBmzZFEeDRniCiQl2hfm0qXw+usweLAVNjKmjFmyKI/q1oXbb4d334XPP/c7mrIzbJirU3H77X5HYkzCsWRRXiVagaTZs+E//3FHVXXq+B2NMQnHkkV5Vb26a4aaORM++cTvaKJL1SWJRo2ssJExPrFkUZ4NHAjNm7uji3gukOQVNmL4cCtsZIxPLFmUZ16BJJYsgbfe8jua6AgpbMR11/kdjTEJy5JFeXfZZdC2rWuSysvzO5rSF1LYiIoV/Y7GmIRlyaK8S0523X988038FUiywkbGxAxLFvHgvPPis0CSFTYyJmbYJzAeiLiaDhs2wD/+4Xc0pePXX935mO7drbCRMTHAkkW8OPVUVyBp1Kj4KJD0xBNW2MiYGGLJIp4ECiQ9+qjfkZRMoLDROee4IwtjjO8sWcSTQIGkv/+9fBdIChQ2GjXK70iMMZ6oJgsR6S0iq0RkjYgMKWT6kSIyXUSWichMEUnzxqeLyDwR+cqbZpfCRCpQIKm8ftEGChtdeqkVNjImhkQtWYhIMjAB6AO0AS4VkTYFZnsEeEVV2wEjgNHe+F+Bq1T1eKA38LiI1I5WrHElUCDpqafKZ4GkQGGjESP8jsQYEyKaRxadgDWqulZVc4HJwPkF5mkDfOoNzwhMV9VvVHW1N7wR2AI0iGKs8SVQIOm++/yOpHgChY2uv94KGxkTY0Sj1GOpiFwM9FbVAd7zK4HOqnpzyDyvA/NVdZyIXAi8BdRX1W0h83QCXgaOV9X8AtsYCAwESE1N7TB58uTDjjcnJ4fq1asf9vLRcrhxHfX00zSdMoWFzz/Pry1axExcRTlu5Ejqz57N/EmTyK1XL2biKg0WV/FYXMVTkrh69uy5WFU7hp1RVaPyAC4GJoY8vxIYX2CexsC/gC+AcUA2UDtkeiNgFdAl3PY6dOigJTFjxowSLR8thx3XTz+p1qypesEFpRpPQKnvr6wsVRHVIUNKtJq4+z9GmcVVPPEYF7BII/hOj2Yz1AagacjzNG9caKLaqKoXqmp7YJg3bjuAiNQE/gMMU9UEqvBTSurVgzvugHfeKR8FkoYNg1q1XMzGmJgTzWSxEGgtIi1EJAXoB7wXOoOI1BeRQAxDgRe88SnA27iT31OjGGN8u+UWOOKI2C+QFChsdOedVtjImBgVtWShqnnAzcBHwEpgiqp+JSIjRKSvN1smsEpEvgFSgQe98X8CTgGuEZEs75EerVjjVvXqriO+WC6QpOqSWaNGMGiQ39EYYw6hQjRXrqrTgGkFxg0PGZ4K/O7IQVVfA16LZmwJY+BAd0f3XXfBGWfEXod8H3zgjiz+8Q8rbGRMDIuxbw5T6gIFkhYvjr0CSaGFjQYM8DsaY0wRLFkkgssug+OPj70CSf/8Jyxd6pKZFTYyJqZZskgEycmu+49YKpC0f787n9KuHfTr53c0xpgwLFkkikCBpPvvj40CSc8/7+7YtsJGxpQL9ilNFIECSdnZ/hdICi1sdPbZ/sZijImIJYtEcuqpcNZZLmn4WSDpySdd77JW2MiYcsOSRaIZNQq2bfOvQNIvv8CYMVbYyJhyxpJFojnpJPjTn1yBpC1byn77Dz8M27fDgw+Gn9cYEzMsWSSiQIGksv7C3rQJHn/cXcp74ollu21jTIlE9Q5uv+3fv5/s7Gz27t0bdt5atWqxcuXKMoiqeIobV+XKlUlLS6NiUfctHH009O8PTz8Nt94KzZuXPNBIjBxphY2MKafiOllkZ2dTo0YNmjdvjoQ5kbpr1y5q1KhRRpFFrjhxqSrbtm0jOzubFuFqWAwfDq++6goklcW9F99+C88+a4WNjCmn4roZau/evdSrVy9soogXIkK9evUiOpIiLQ1uvtkljK++in5w997r7tK+557ob8sYU+riOlkACZMoAor1eocMcT3T3n139AICWLYMXn/ddZneqFF0t2WMiYq4TxamCPXqwe23uwJJ8+dHbztW2MiYcs+SRRRt27aN9PR00tPTadiwIU2aNAk+z83NjWgdf/7zn1m1alX0ghw8OLoFkubMgffft8JGxpRzcX2C+3DMWz+Pmd/PJLN5JhlNM0q0rnr16pGVlQXAfffdR/Xq1bntttsOmidY3/YQ/SM99dRT0T3xHmiGGjQI/vtfOPPM0lu3qmvqatjQChsZU84lTLIY/OFgsjZnHXL6gQMHyMnLYdmPy8jXfJIkiXap7ahVqdYhl0lvmM7jvR8vdixr1qyhb9++tG/fni+++IJPPvmE+++/nyVLlrBnzx4uueQShg93NaJ69erFU089Rdu2balfvz433ngjH3zwAVWrVuXdd9/liCOOKPb2f2fgQHeT3tChrkBSaZ3nscJGxsQNa4YKsWPvDvI1H4B8zWfH3uj1n/T1119z6623smLFCpo0acKYMWNYtGgRS5cu5ZNPPmHFihW/j2/HDk499VSWLl1KRkYGL7zwQukEU6mS6422NAskBQobHXUUXHdd6azTGOObhDmyCHcEsGvXLr7c/iWnv3I6uQdySUlOYdKFk0rcFHUoLVu2pGPHjsHnb7zxBs8//zx5eXls3LiRFStW0KZNm4OWqVKlCn369AGgQ4cOzJo1q/QCuvxyeOgh1yR1wQVQoYRvjUBho0mTXLU+Y0y5ljDJIhIZTTOYftX0UjtnUZRq1aoFh1evXs24ceNYsGABtWvX5oorrij0XomUkC/d5ORk8kqz6l1ysuv+44IL4OWXS3Y0YIWNjIk71gxVQEbTDIb2GBrVRFHQzp07qVGjBjVr1mTTpk189NFHZbbtg/TtC126uLu6I7mx71CssJExccc+yTHgpJNOok2bNhx77LFcddVVdOvWzZ9ASqNAUqCwUbduVtjImDhizVBl5L777gsOt2rVKnhJLbi7rl999dVCl/v444+Dl85u3749OL5fv370i0YTT2amK5A0ahQMGAA1axZv+UBhoylTrLCRMXHEjizM7x1ugaRAYaOzz7bCRsbEGUsW5vcCBZIefbR4BZIChY1GjYpebMYYX1iyMIULFEiK9It/0yYYNw4uvdQKGxkThyxZmMIFCiQ99RT88EP4+UeOhNxcK2xkTJyyZGEObfhwd5I65OR8odaudYWNBgyAVq3KJDRjTNmyZGEOLS0N/vpXeOUVKKT7kaDhw62wkTFxzpJFFJVGF+UAL7zwAps3b45ipEUIVyApUNho0CBo3LhsYzPGlBlLFgXNm+duTJs3r8SrCnRRnpWVxY033sitt94afJ5SjP6SfE0WgQJJb79deIGkQGGjO+8s+9iMMWUmcW7KGzwYsg7dRXmVAwcgJ8f9Us7Pd91UtGvnvggPJT0dHi9+F+UAL7/8MhMmTCA3N5euXbsyfvx48vPzufbaa8nKykJVGThwIDVr1iQrK4tLLrmEKlWqsGDBgmIlmlIxeLC72W7oUJg+/beb7QKFjUaNssJGxsS5xEkWkdixwyUKcH937Cg6WRymL7/8krfffpu5c+dSoUIFBg4cyOTJk2nZsiU//fQTy5cvB9wd28nJyUycOJHx48eTnp5e6rFEpLACSaoueVhhI2MSQuIkizBHAHt27aLGl1/C6ae7S0BTUlz32hml36Hgf//7XxYuXBjsonzPnj00bdqUs846i1WrVjFo0CDOOeccevXqRU5OTqlv/7AMHOhu0vMKJNVdsABmzYIJEyCkB11jTHyK6jkLEektIqtEZI2IDClk+pEiMl1ElonITBFJC5l2tYis9h5XRzPOoIwM18zywAPubxQSBbhSqv379w+ev1i1ahX33HMP9erVY9myZfTo0YMJEyZwww03RGX7h6VSJXcPxeLFMHUqRz33nCtsNGCA35EZY8pA1JKFiCQDE4A+QBvgUhFpU2C2R4BXVLUdMAIY7S1bF7gX6Ax0Au4VkbJpFM/IcL+eo5QoAM444wymTJnCTz/9BLirptatW8fWrVtRVf74xz8yYsQIlixZAkCNGjXYtWtX1OKJ2OWXw/HHw9VXU/3bb+HKK62wkTEJIppHFp2ANaq6VlVzgcnA+QXmaQN86g3PCJl+FvCJqv6sqr8AnwC9oxhrmTrhhBO49957OeOMM2jXrh29evXixx9/ZP369Zxyyimkp6dz7bXXMsrrauPaa69lwIABxb7kttQlJ7sEsWcPCq6yXilcNWaMiX2iqtFZscjFQG9VHeA9vxLorKo3h8zzOjBfVceJyIXAW0B94FqgsqqO9Oa7B9ijqo8U2MZAYCBAampqh8mTJx8UQ61atWgV4R3FBw4cIDk5+bBeazQdTlxr1qxhx47o1A9vNmkSLSZORID8pCS+79+fdZdfHpVtHY6cnByqV6/udxi/Y3EVj8VVPCWJq2fPnotVtWO4+fw+wX0bMF5ErgE+AzYAByJdWFWfBZ4F6Nixo2ZmZh40feXKlcFaEOHs2rUr4nnL0uHEVblyZdq3bx+dgCpVgkmTyN+3j6RKlTiqf3+OimKTXXHNnDmTgu+DWGBxFY/FVTxlEVc0m6E2AE1Dnqd544JUdaOqXqiq7YFh3rjtkSxrfOJdBPB9//5RvQjAGBNbonlksRBoLSItcF/0/YDLQmcQkfrAz6qaDwwFXvAmfQSMCjmp3cubXmyqiiRQxbZoNSseJCODdfv2xdQRhTEmuqJ2ZKGqecDNuC/+lcAUVf1KREaISF9vtkxglYh8A6QCD3rL/gw8gEs4C4ER3rhiqVy5Mtu2bSubL9AYoKps27aNypUr+x2KMSbORPWchapOA6YVGDc8ZHgqMPUQy77Ab0cahyUtLY3s7Gy2bt0adt69e/fG5JdsceOqXLkyaWlp4Wc0xphi8PsEd1RVrFiRFi1aRDTvzJkzo3dSuARiNS5jTGKxXmeNMcaEZcnCGGNMWJYsjDHGhBW1O7jLmohsBX4owSrqAz+VUjilyeIqHoureCyu4onHuI5U1QbhZoqbZFFSIrIoklvey5rFVTwWV/FYXMWTyHFZM5QxxpiwLFkYY4wJy5LFb571O4BDsLiKx+IqHoureBI2LjtnYYwxJiw7sjDGGBOWJQtjjDFhJXSyEJGmIjJDRFaIyFcicovfMQGISGURWSAiS7247vc7plAikiwiX4jI+37HEiAi34vIchHJEpFFfscTICK1RWSqiHwtIitFJCb6dReRY7x9FXjsFJHBMRDXrd57/ksReUNEYqJ3TxG5xYvpK7/3k4i8ICJbROTLkHF1ReQTEVnt/a1T1DoOR0InCyAP+JuqtgG6ADeJSBufYwLYB5ymqicC6UBvEenic0yhbsF1Ox9reqpqeoxdBz8O+FBVjwVOJEb2m6qu8vZVOtAB+BV428+YRKQJMAjoqKptgWRcHRxfiUhb4HqgE+5/eK6IRFavOTpeAnoXGDcEmK6qrYHp3vNSldDJQlU3qeoSb3gX7oPcxN+oQJ0c72lF7xETVyKISBpwDjDR71hinYjUAk4BngdQ1VyvEmSsOR34VlVL0gNCaakAVBGRCkBVYKPP8QAcB8xX1V+9Oj3/Ay70KxhV/QwoWN/nfOBlb/hl4ILS3m5CJ4tQItIcaA/M9zcSx2vqyQK2AJ+oakzEBTwO3AHk+x1IAQp8LCKLRWSg38F4WgBbgRe9ZruJIlLN76AK0Q94w+8gVHUD8AiwDtgE7FDVj/2NCoAvgR4iUk9EqgJnc3DZ51iQqqqbvOHNuGJypcqSBSAi1YG3gMGqutPveABU9YDXRJAGdPIOhX0lIucCW1R1sd+xFKK7qp4E9ME1J57id0C4X8knAU95deZ3E4XmgZIQkRSgL/BmDMRSB/cLuQXQGKgmIlf4GxWo6kpgLPAx8CGQBRzwNagiqLsfotRbIhI+WYhIRVyimKSq//I7noK8ZosZ/L6N0g/dgL4i8j0wGThNRF7zNyTH+1WKqm7Btb138jciALKB7JCjwqm45BFL+gBLVPVHvwMBzgC+U9Wtqrof+BfQ1eeYAFDV51W1g6qeAvwCfON3TAX8KCKNALy/W0p7AwmdLEREcO3JK1X1737HEyAiDUSktjdcBTgT+NrfqEBVh6pqmqo2xzVdfKqqvv/yE5FqIlIjMAz0wjUd+EpVNwPrReQYb9TpwAofQyrMpcRAE5RnHdBFRKp6n83TiZELAkTkCO9vM9z5itf9jeh33gOu9oavBt4t7Q3EdVnVCHQDrgSWe+cHAO7yaof7qRHwsogk4xL6FFWNmctUY1Aq8Lb7fqEC8LqqfuhvSEF/BSZ5zT1rgWt9jifIS6xnAjf4HQuAqs4XkanAEtyVil8QO91rvCUi9YD9wE1+XqggIm8AmUB9EckG7gXGAFNE5DpcqYY/lfp2rbsPY4wx4SR0M5QxxpjIWLIwxhgTliULY4wxYVmyMMYYE5YlC2OMMWFZsjDlnojkeH+bi8hlpbzuuwo8n1ua6y9tInKNiIz3Ow4TfyxZmHjSHChWsvA6rCvKQclCVWPijuJo8e7tMeZ3LFmYeDIG1+FbllcXIVlEHhaRhSKyTERuABCRTBGZJSLv4d1RLSLveJ0QfhXoiFBExuB6QM0SkUneuMBRjHjr/tKro3FJyLpnhtSwmOTdjXwQb56x4uqWfCMiPbzxBx0ZiMj7IpIZ2La3za9E5L8i0slbz1oR6Ruy+qbe+NUicm/Iuq7wtpclIs8EEoO33kdFZCkQE/U2TAxSVXvYo1w/gBzvbybwfsj4gcDd3nAlYBGuk7pMXKd+LULmrev9rYLrKqRe6LoL2dZFwCe4mgupuK4qGnnr3oHrADIJmIfr5LBgzDOBR73hs4H/esPXAOND5nsfyPSGFejjDb+N69iuIq7GQlbI8puAeiGvpSOum+1/AxW9+f4BXBWy3j/5/X+0R2w/Er27DxPfegHtRORi73ktoDWQCyxQ1e9C5h0kIn/whpt6820rYt3dgTdU9QCuE7f/AScDO711ZwN43cg0B2YXso5Ax5WLvXnCycX1egqwHNinqvtFZHmB5T9R1W3e9v/lxZqHK3K00DvQqcJvnc0dwHWmacwhWbIw8UyAv6rqRweNdM06uws8PwPIUNVfRWQmUJJynvtChg9w6M/ZvkLmyePg5uHQOParaqB/nvzA8qqaX+DcS8E+fBS3L15W1aGFxLHXS3rGHJKdszDxZBdQI+T5R8CfvW7oEZGjD1F8qBbwi5cojsWV2A3YH1i+gFnAJd55kQa4ingLSuE1fA+ki0iSiDTl8LpaP1NcTeYquIppc3ClNi8O6T21rogcWQrxmgRhRxYmniwDDngnal/C1b9uDizxTjJvpfBykx8CN4rISmAV8HnItGeBZSKyRFUvDxn/Nu5k8FLcL/c7VHWzl2xKYg7wHe7E+0pcD6zFtQDXrJQGvKaqiwBE5G5cNcEkvN5TcT2UGhOW9TprjDEmLGuGMsYYE5YlC2OMMWFZsjDGGBOWJQtjjDFhWbIwxhgTliULY4wxYVmyMMYYE9b/A3p/aG2JYhlSAAAAAElFTkSuQmCC\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>9</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.9294206</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>9</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.06840064</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>9</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.002178827</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>12</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.95446134</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>12</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.044602826</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>12</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.0009358918</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>18</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.9657251</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>18</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.033696607</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>18</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.00057823793</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>23</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.9846532</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>23</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.015122785</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>23</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.00022406144</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>24</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.9215944</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>24</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.07646777</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>24</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.0019379102</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>26</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.9169111</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>26</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.08092835</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>26</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.0021605128</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>31</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.92948824</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>31</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.06870209</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>31</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.0018096273</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>33</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.9864705</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>33</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.013397024</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>33</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.0001324016</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.94184655</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.056837272</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.0013162153</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>51</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.8235848</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>51</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.10498193</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>51</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.07143335</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>54</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.60921746</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>54</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.33687788</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>54</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.05390459</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>66</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.8232913</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>66</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.09234422</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>66</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.084364414</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>73</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.5667156</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>73</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.41627046</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>73</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.017013948</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>78</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.584179</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>78</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.3888702</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>78</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.026950791</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>81</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.7245893</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>81</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.17719878</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>81</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.09821194</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>83</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.7691566</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>83</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.12076647</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>83</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.11007695</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>93</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.7436626</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>93</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.16565561</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>93</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.09068175</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.72709775</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>94</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.1566202</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>94</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.11628201</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>96</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.727868</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>96</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.15816915</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>96</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.11396286</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>99</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.66456306</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>99</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.2604218</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>99</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.0750151</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.7876302</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.20347802</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.008891817</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>111</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.5265808</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>111</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.45525447</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>111</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.018164707</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.7262987</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.2655178</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.008183556</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>123</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.8544553</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>123</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.1435273</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>123</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.0020173935</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.5349145</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.44564962</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.019435901</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>128</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.545205</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>128</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.43319198</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>128</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.021603057</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>131</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.8042598</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>131</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.19291137</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>131</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.0028288176</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>135</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.8229959</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>135</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.17136817</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>135</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.005635898</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>143</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.7876302</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>143</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.20347802</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>143</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.008891817</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>145</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.7896347</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>145</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.20416242</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>145</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.006202857</td>\n",
" <td>3</td>\n",
" </tr>\n",
"</table>"
],
"text/plain": [
"[(9, u'class_text', u'Iris-setosa', 0.9294206, 1),\n",
" (9, u'class_text', u'Iris-versicolor', 0.06840064, 2),\n",
" (9, u'class_text', u'Iris-virginica', 0.002178827, 3),\n",
" (12, u'class_text', u'Iris-setosa', 0.95446134, 1),\n",
" (12, u'class_text', u'Iris-versicolor', 0.044602826, 2),\n",
" (12, u'class_text', u'Iris-virginica', 0.0009358918, 3),\n",
" (18, u'class_text', u'Iris-setosa', 0.9657251, 1),\n",
" (18, u'class_text', u'Iris-versicolor', 0.033696607, 2),\n",
" (18, u'class_text', u'Iris-virginica', 0.00057823793, 3),\n",
" (23, u'class_text', u'Iris-setosa', 0.9846532, 1),\n",
" (23, u'class_text', u'Iris-versicolor', 0.015122785, 2),\n",
" (23, u'class_text', u'Iris-virginica', 0.00022406144, 3),\n",
" (24, u'class_text', u'Iris-setosa', 0.9215944, 1),\n",
" (24, u'class_text', u'Iris-versicolor', 0.07646777, 2),\n",
" (24, u'class_text', u'Iris-virginica', 0.0019379102, 3),\n",
" (26, u'class_text', u'Iris-setosa', 0.9169111, 1),\n",
" (26, u'class_text', u'Iris-versicolor', 0.08092835, 2),\n",
" (26, u'class_text', u'Iris-virginica', 0.0021605128, 3),\n",
" (31, u'class_text', u'Iris-setosa', 0.92948824, 1),\n",
" (31, u'class_text', u'Iris-versicolor', 0.06870209, 2),\n",
" (31, u'class_text', u'Iris-virginica', 0.0018096273, 3),\n",
" (33, u'class_text', u'Iris-setosa', 0.9864705, 1),\n",
" (33, u'class_text', u'Iris-versicolor', 0.013397024, 2),\n",
" (33, u'class_text', u'Iris-virginica', 0.0001324016, 3),\n",
" (38, u'class_text', u'Iris-setosa', 0.94184655, 1),\n",
" (38, u'class_text', u'Iris-versicolor', 0.056837272, 2),\n",
" (38, u'class_text', u'Iris-virginica', 0.0013162153, 3),\n",
" (51, u'class_text', u'Iris-versicolor', 0.8235848, 1),\n",
" (51, u'class_text', u'Iris-virginica', 0.10498193, 2),\n",
" (51, u'class_text', u'Iris-setosa', 0.07143335, 3),\n",
" (54, u'class_text', u'Iris-versicolor', 0.60921746, 1),\n",
" (54, u'class_text', u'Iris-virginica', 0.33687788, 2),\n",
" (54, u'class_text', u'Iris-setosa', 0.05390459, 3),\n",
" (66, u'class_text', u'Iris-versicolor', 0.8232913, 1),\n",
" (66, u'class_text', u'Iris-virginica', 0.09234422, 2),\n",
" (66, u'class_text', u'Iris-setosa', 0.084364414, 3),\n",
" (73, u'class_text', u'Iris-virginica', 0.5667156, 1),\n",
" (73, u'class_text', u'Iris-versicolor', 0.41627046, 2),\n",
" (73, u'class_text', u'Iris-setosa', 0.017013948, 3),\n",
" (78, u'class_text', u'Iris-versicolor', 0.584179, 1),\n",
" (78, u'class_text', u'Iris-virginica', 0.3888702, 2),\n",
" (78, u'class_text', u'Iris-setosa', 0.026950791, 3),\n",
" (81, u'class_text', u'Iris-versicolor', 0.7245893, 1),\n",
" (81, u'class_text', u'Iris-virginica', 0.17719878, 2),\n",
" (81, u'class_text', u'Iris-setosa', 0.09821194, 3),\n",
" (83, u'class_text', u'Iris-versicolor', 0.7691566, 1),\n",
" (83, u'class_text', u'Iris-virginica', 0.12076647, 2),\n",
" (83, u'class_text', u'Iris-setosa', 0.11007695, 3),\n",
" (93, u'class_text', u'Iris-versicolor', 0.7436626, 1),\n",
" (93, u'class_text', u'Iris-virginica', 0.16565561, 2),\n",
" (93, u'class_text', u'Iris-setosa', 0.09068175, 3),\n",
" (94, u'class_text', u'Iris-versicolor', 0.72709775, 1),\n",
" (94, u'class_text', u'Iris-setosa', 0.1566202, 2),\n",
" (94, u'class_text', u'Iris-virginica', 0.11628201, 3),\n",
" (96, u'class_text', u'Iris-versicolor', 0.727868, 1),\n",
" (96, u'class_text', u'Iris-virginica', 0.15816915, 2),\n",
" (96, u'class_text', u'Iris-setosa', 0.11396286, 3),\n",
" (99, u'class_text', u'Iris-versicolor', 0.66456306, 1),\n",
" (99, u'class_text', u'Iris-setosa', 0.2604218, 2),\n",
" (99, u'class_text', u'Iris-virginica', 0.0750151, 3),\n",
" (102, u'class_text', u'Iris-virginica', 0.7876302, 1),\n",
" (102, u'class_text', u'Iris-versicolor', 0.20347802, 2),\n",
" (102, u'class_text', u'Iris-setosa', 0.008891817, 3),\n",
" (111, u'class_text', u'Iris-virginica', 0.5265808, 1),\n",
" (111, u'class_text', u'Iris-versicolor', 0.45525447, 2),\n",
" (111, u'class_text', u'Iris-setosa', 0.018164707, 3),\n",
" (117, u'class_text', u'Iris-virginica', 0.7262987, 1),\n",
" (117, u'class_text', u'Iris-versicolor', 0.2655178, 2),\n",
" (117, u'class_text', u'Iris-setosa', 0.008183556, 3),\n",
" (123, u'class_text', u'Iris-virginica', 0.8544553, 1),\n",
" (123, u'class_text', u'Iris-versicolor', 0.1435273, 2),\n",
" (123, u'class_text', u'Iris-setosa', 0.0020173935, 3),\n",
" (127, u'class_text', u'Iris-virginica', 0.5349145, 1),\n",
" (127, u'class_text', u'Iris-versicolor', 0.44564962, 2),\n",
" (127, u'class_text', u'Iris-setosa', 0.019435901, 3),\n",
" (128, u'class_text', u'Iris-virginica', 0.545205, 1),\n",
" (128, u'class_text', u'Iris-versicolor', 0.43319198, 2),\n",
" (128, u'class_text', u'Iris-setosa', 0.021603057, 3),\n",
" (131, u'class_text', u'Iris-virginica', 0.8042598, 1),\n",
" (131, u'class_text', u'Iris-versicolor', 0.19291137, 2),\n",
" (131, u'class_text', u'Iris-setosa', 0.0028288176, 3),\n",
" (135, u'class_text', u'Iris-virginica', 0.8229959, 1),\n",
" (135, u'class_text', u'Iris-versicolor', 0.17136817, 2),\n",
" (135, u'class_text', u'Iris-setosa', 0.005635898, 3),\n",
" (143, u'class_text', u'Iris-virginica', 0.7876302, 1),\n",
" (143, u'class_text', u'Iris-versicolor', 0.20347802, 2),\n",
" (143, u'class_text', u'Iris-setosa', 0.008891817, 3),\n",
" (145, u'class_text', u'Iris-virginica', 0.7896347, 1),\n",
" (145, u'class_text', u'Iris-versicolor', 0.20416242, 2),\n",
" (145, u'class_text', u'Iris-setosa', 0.006202857, 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:30:10.030573</td>\n",
" <td>2021-03-06 00:30:11.397745</td>\n",
" <td>[0.810183048248291, 0.952910184860229, 1.08659505844116, 1.22299003601074, 1.36708807945251]</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.991666674614</td>\n",
" <td>0.139637470245</td>\n",
" <td>[0.975000023841858, 0.975000023841858, 0.991666674613953, 0.991666674613953, 0.991666674613953]</td>\n",
" <td>[0.21851558983326, 0.192899897694588, 0.170841887593269, 0.153602108359337, 0.139637470245361]</td>\n",
" <td>0.966666638851</td>\n",
" <td>0.162758678198</td>\n",
" <td>[0.966666638851166, 0.966666638851166, 0.966666638851166, 0.966666638851166, 0.966666638851166]</td>\n",
" <td>[0.239112228155136, 0.212523519992828, 0.192814856767654, 0.176179185509682, 0.162758678197861]</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, 30, 10, 30573), datetime.datetime(2021, 3, 6, 0, 30, 11, 397745), [0.810183048248291, 0.952910184860229, 1.08659505844116, 1.22299003601074, 1.36708807945251], u'1.18.0-dev', [3], [u'character varying'], 1.0, [u'accuracy'], u'categorical_crossentropy', 0.991666674613953, 0.139637470245361, [0.975000023841858, 0.975000023841858, 0.991666674613953, 0.991666674613953, 0.991666674613953], [0.21851558983326, 0.192899897694588, 0.170841887593269, 0.153602108359337, 0.139637470245361], 0.966666638851166, 0.162758678197861, [0.966666638851166, 0.966666638851166, 0.966666638851166, 0.966666638851166, 0.966666638851166], [0.239112228155136, 0.212523519992828, 0.192814856767654, 0.176179185509682, 0.162758678197861], [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:30:15.327042</td>\n",
" <td>2021-03-06 00:30:16.549371</td>\n",
" <td>[0.64433479309082, 0.790453910827637, 0.93260383605957, 1.07773494720459, 1.22224497795105]</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.991666674614</td>\n",
" <td>0.101017765701</td>\n",
" <td>[0.991666674613953, 0.991666674613953, 0.991666674613953, 0.991666674613953, 0.991666674613953]</td>\n",
" <td>[0.127938449382782, 0.11921951174736, 0.112009204924107, 0.106061458587646, 0.101017765700817]</td>\n",
" <td>0.966666638851</td>\n",
" <td>0.124947711825</td>\n",
" <td>[0.966666638851166, 0.966666638851166, 0.966666638851166, 0.966666638851166, 0.966666638851166]</td>\n",
" <td>[0.151599556207657, 0.142985984683037, 0.135312005877495, 0.129271760582924, 0.124947711825371]</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, 30, 15, 327042), datetime.datetime(2021, 3, 6, 0, 30, 16, 549371), [0.64433479309082, 0.790453910827637, 0.93260383605957, 1.07773494720459, 1.22224497795105], u'1.18.0-dev', [3], [u'character varying'], 1.0, [u'accuracy'], u'categorical_crossentropy', 0.991666674613953, 0.101017765700817, [0.991666674613953, 0.991666674613953, 0.991666674613953, 0.991666674613953, 0.991666674613953], [0.127938449382782, 0.11921951174736, 0.112009204924107, 0.106061458587646, 0.101017765700817], 0.966666638851166, 0.124947711825371, [0.966666638851166, 0.966666638851166, 0.966666638851166, 0.966666638851166, 0.966666638851166], [0.151599556207657, 0.142985984683037, 0.135312005877495, 0.129271760582924, 0.124947711825371], [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
}