blob: 4ae9eae0feb7aafc9b1f1acf78812595a38499fd [file] [log] [blame]
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Model Selection for Multilayer Perceptron Using Keras and MADlib\n",
"\n",
"E2E classification example using MADlib calling a Keras MLP for different hyperparameters and model architectures.\n",
"\n",
"Deep learning works best on very large datasets, but that is not convenient for a quick introduction to the syntax. So in this workbook we use the well known iris data set from https://archive.ics.uci.edu/ml/datasets/iris to help get you started. It is similar to the example in user docs http://madlib.apache.org/docs/latest/index.html\n",
"\n",
"For more realistic examples please refer to the deep learning notebooks at https://github.com/apache/madlib-site/tree/asf-site/community-artifacts\n",
"\n",
"## Table of contents\n",
"\n",
"<a href=\"#class\">Classification</a>\n",
"\n",
"* <a href=\"#create_input_data\">1. Create input data</a>\n",
"\n",
"* <a href=\"#pp\">2. Call preprocessor for deep learning</a>\n",
"\n",
"* <a href=\"#load\">3. Define and load model architecture</a>\n",
"\n",
"* <a href=\"#def_mst\">4. Define and load model selection tuples</a>\n",
"\n",
"* <a href=\"#train\">5. Train</a>\n",
"\n",
"* <a href=\"#eval\">6. Evaluate</a>\n",
"\n",
"* <a href=\"#pred\">7. Predict</a>\n",
"\n",
"<a href=\"#class2\">Classification with Other Parameters</a>\n",
"\n",
"* <a href=\"#val_dataset\">1. Validation dataset</a>\n",
"\n",
"* <a href=\"#pred_prob\">2. Predict probabilities</a>\n",
"\n",
"* <a href=\"#warm_start\">3. Warm start</a>"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"scrolled": false
},
"outputs": [],
"source": [
"%load_ext sql"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"# Greenplum Database 5.x on GCP - via tunnel\n",
"%sql postgresql://gpadmin@localhost:8000/madlib\n",
" \n",
"# PostgreSQL local\n",
"#%sql postgresql://fmcquillan@localhost:5432/madlib"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1 rows affected.\n"
]
},
{
"data": {
"text/html": [
"<table>\n",
" <tr>\n",
" <th>version</th>\n",
" </tr>\n",
" <tr>\n",
" <td>MADlib version: 1.18.0-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",
"2 rows affected.\n"
]
},
{
"data": {
"text/html": [
"<table>\n",
" <tr>\n",
" <th>attributes_shape</th>\n",
" <th>class_text_shape</th>\n",
" <th>buffer_id</th>\n",
" </tr>\n",
" <tr>\n",
" <td>[60, 4]</td>\n",
" <td>[60, 3]</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <td>[60, 4]</td>\n",
" <td>[60, 3]</td>\n",
" <td>1</td>\n",
" </tr>\n",
"</table>"
],
"text/plain": [
"[([60, 4], [60, 3], 0), ([60, 4], [60, 3], 1)]"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%sql\n",
"DROP TABLE IF EXISTS iris_train_packed, iris_train_packed_summary;\n",
"\n",
"SELECT madlib.training_preprocessor_dl('iris_train', -- Source table\n",
" 'iris_train_packed', -- Output table\n",
" 'class_text', -- Dependent variable\n",
" 'attributes' -- Independent variable\n",
" ); \n",
"\n",
"SELECT attributes_shape, class_text_shape, buffer_id FROM iris_train_packed ORDER BY buffer_id;"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1 rows affected.\n"
]
},
{
"data": {
"text/html": [
"<table>\n",
" <tr>\n",
" <th>source_table</th>\n",
" <th>output_table</th>\n",
" <th>dependent_varname</th>\n",
" <th>independent_varname</th>\n",
" <th>dependent_vartype</th>\n",
" <th>class_text_class_values</th>\n",
" <th>buffer_size</th>\n",
" <th>normalizing_const</th>\n",
" <th>num_classes</th>\n",
" <th>distribution_rules</th>\n",
" <th>__internal_gpu_config__</th>\n",
" </tr>\n",
" <tr>\n",
" <td>iris_train</td>\n",
" <td>iris_train_packed</td>\n",
" <td>[u'class_text']</td>\n",
" <td>[u'attributes']</td>\n",
" <td>[u'character varying']</td>\n",
" <td>[u'Iris-setosa', u'Iris-versicolor', u'Iris-virginica']</td>\n",
" <td>60</td>\n",
" <td>1.0</td>\n",
" <td>[3]</td>\n",
" <td>all_segments</td>\n",
" <td>all_segments</td>\n",
" </tr>\n",
"</table>"
],
"text/plain": [
"[(u'iris_train', u'iris_train_packed', [u'class_text'], [u'attributes'], [u'character varying'], [u'Iris-setosa', u'Iris-versicolor', u'Iris-virginica'], 60, 1.0, [3], 'all_segments', 'all_segments')]"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%sql\n",
"SELECT * FROM iris_train_packed_summary;"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Validation dataset (uses validation preprocessor):"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Done.\n",
"1 rows affected.\n",
"2 rows affected.\n"
]
},
{
"data": {
"text/html": [
"<table>\n",
" <tr>\n",
" <th>attributes_shape</th>\n",
" <th>class_text_shape</th>\n",
" <th>buffer_id</th>\n",
" </tr>\n",
" <tr>\n",
" <td>[15, 4]</td>\n",
" <td>[15, 3]</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <td>[15, 4]</td>\n",
" <td>[15, 3]</td>\n",
" <td>1</td>\n",
" </tr>\n",
"</table>"
],
"text/plain": [
"[([15, 4], [15, 3], 0), ([15, 4], [15, 3], 1)]"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%sql\n",
"DROP TABLE IF EXISTS iris_test_packed, iris_test_packed_summary;\n",
"\n",
"SELECT madlib.validation_preprocessor_dl('iris_test', -- Source table\n",
" 'iris_test_packed', -- Output table\n",
" 'class_text', -- Dependent variable\n",
" 'attributes', -- Independent variable\n",
" 'iris_train_packed' -- From training preprocessor step\n",
" ); \n",
"\n",
"SELECT attributes_shape, class_text_shape, buffer_id FROM iris_test_packed ORDER BY buffer_id;"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1 rows affected.\n"
]
},
{
"data": {
"text/html": [
"<table>\n",
" <tr>\n",
" <th>source_table</th>\n",
" <th>output_table</th>\n",
" <th>dependent_varname</th>\n",
" <th>independent_varname</th>\n",
" <th>dependent_vartype</th>\n",
" <th>class_text_class_values</th>\n",
" <th>buffer_size</th>\n",
" <th>normalizing_const</th>\n",
" <th>num_classes</th>\n",
" <th>distribution_rules</th>\n",
" <th>__internal_gpu_config__</th>\n",
" </tr>\n",
" <tr>\n",
" <td>iris_test</td>\n",
" <td>iris_test_packed</td>\n",
" <td>[u'class_text']</td>\n",
" <td>[u'attributes']</td>\n",
" <td>[u'character varying']</td>\n",
" <td>[u'Iris-setosa', u'Iris-versicolor', u'Iris-virginica']</td>\n",
" <td>15</td>\n",
" <td>1.0</td>\n",
" <td>[3]</td>\n",
" <td>all_segments</td>\n",
" <td>all_segments</td>\n",
" </tr>\n",
"</table>"
],
"text/plain": [
"[(u'iris_test', u'iris_test_packed', [u'class_text'], [u'attributes'], [u'character varying'], [u'Iris-setosa', u'Iris-versicolor', u'Iris-virginica'], 15, 1.0, [3], 'all_segments', 'all_segments')]"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%sql\n",
"SELECT * FROM iris_test_packed_summary;"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a id=\"load\"></a>\n",
"# 3. Define and load model architecture\n",
"Import Keras libraries"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"from tensorflow import keras\n",
"from tensorflow.keras.models import Sequential\n",
"from tensorflow.keras.layers import Dense"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Define model architecture with 1 hidden layer:"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"WARNING:tensorflow:From /Users/fmcquillan/Library/Python/2.7/lib/python/site-packages/tensorflow/python/ops/init_ops.py:1251: calling __init__ (from tensorflow.python.ops.init_ops) with dtype is deprecated and will be removed in a future version.\n",
"Instructions for updating:\n",
"Call initializer instance with the dtype argument instead of passing it to the constructor\n",
"Model: \"sequential\"\n",
"_________________________________________________________________\n",
"Layer (type) Output Shape Param # \n",
"=================================================================\n",
"dense (Dense) (None, 10) 50 \n",
"_________________________________________________________________\n",
"dense_1 (Dense) (None, 10) 110 \n",
"_________________________________________________________________\n",
"dense_2 (Dense) (None, 3) 33 \n",
"=================================================================\n",
"Total params: 193\n",
"Trainable params: 193\n",
"Non-trainable params: 0\n",
"_________________________________________________________________\n"
]
}
],
"source": [
"model1 = Sequential()\n",
"model1.add(Dense(10, activation='relu', input_shape=(4,)))\n",
"model1.add(Dense(10, activation='relu'))\n",
"model1.add(Dense(3, activation='softmax'))\n",
" \n",
"model1.summary()"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'{\"class_name\": \"Sequential\", \"keras_version\": \"2.2.4-tf\", \"config\": {\"layers\": [{\"class_name\": \"Dense\", \"config\": {\"kernel_initializer\": {\"class_name\": \"GlorotUniform\", \"config\": {\"dtype\": \"float32\", \"seed\": null}}, \"name\": \"dense\", \"kernel_constraint\": null, \"bias_regularizer\": null, \"bias_constraint\": null, \"dtype\": \"float32\", \"activation\": \"relu\", \"trainable\": true, \"kernel_regularizer\": null, \"bias_initializer\": {\"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": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"model1.to_json()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Define model architecture with 2 hidden layers:"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Model: \"sequential_1\"\n",
"_________________________________________________________________\n",
"Layer (type) Output Shape Param # \n",
"=================================================================\n",
"dense_3 (Dense) (None, 10) 50 \n",
"_________________________________________________________________\n",
"dense_4 (Dense) (None, 10) 110 \n",
"_________________________________________________________________\n",
"dense_5 (Dense) (None, 10) 110 \n",
"_________________________________________________________________\n",
"dense_6 (Dense) (None, 3) 33 \n",
"=================================================================\n",
"Total params: 303\n",
"Trainable params: 303\n",
"Non-trainable params: 0\n",
"_________________________________________________________________\n"
]
}
],
"source": [
"model2 = Sequential()\n",
"model2.add(Dense(10, activation='relu', input_shape=(4,)))\n",
"model2.add(Dense(10, activation='relu'))\n",
"model2.add(Dense(10, activation='relu'))\n",
"model2.add(Dense(3, activation='softmax'))\n",
" \n",
"model2.summary()"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'{\"class_name\": \"Sequential\", \"keras_version\": \"2.2.4-tf\", \"config\": {\"layers\": [{\"class_name\": \"Dense\", \"config\": {\"kernel_initializer\": {\"class_name\": \"GlorotUniform\", \"config\": {\"dtype\": \"float32\", \"seed\": null}}, \"name\": \"dense_3\", \"kernel_constraint\": null, \"bias_regularizer\": null, \"bias_constraint\": null, \"dtype\": \"float32\", \"activation\": \"relu\", \"trainable\": true, \"kernel_regularizer\": null, \"bias_initializer\": {\"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\": \"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_6\", \"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": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"model2.to_json()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Load into model architecture table"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Done.\n",
"1 rows affected.\n",
"1 rows affected.\n",
"2 rows affected.\n"
]
},
{
"data": {
"text/html": [
"<table>\n",
" <tr>\n",
" <th>model_id</th>\n",
" <th>model_arch</th>\n",
" <th>model_weights</th>\n",
" <th>name</th>\n",
" <th>description</th>\n",
" <th>__internal_madlib_id__</th>\n",
" </tr>\n",
" <tr>\n",
" <td>1</td>\n",
" <td>{u'class_name': u'Sequential', u'keras_version': u'2.1.6', u'config': [{u'class_name': u'Dense', u'config': {u'kernel_initializer': {u'class_name': u'VarianceScaling', u'config': {u'distribution': u'uniform', u'scale': 1.0, u'seed': None, u'mode': u'fan_avg'}}, u'name': u'dense_1', u'kernel_constraint': None, u'bias_regularizer': None, u'bias_constraint': None, u'dtype': u'float32', u'activation': u'relu', u'trainable': True, u'kernel_regularizer': None, u'bias_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>None</td>\n",
" <td>Sophie</td>\n",
" <td>MLP with 1 hidden layer</td>\n",
" <td>__madlib_temp_4017958_1614991901_4240024__</td>\n",
" </tr>\n",
" <tr>\n",
" <td>2</td>\n",
" <td>{u'class_name': u'Sequential', u'keras_version': u'2.1.6', u'config': [{u'class_name': u'Dense', u'config': {u'kernel_initializer': {u'class_name': u'VarianceScaling', u'config': {u'distribution': u'uniform', u'scale': 1.0, u'seed': None, u'mode': u'fan_avg'}}, u'name': u'dense_4', u'kernel_constraint': None, u'bias_regularizer': None, u'bias_constraint': None, u'dtype': u'float32', u'activation': u'relu', u'trainable': True, u'kernel_regularizer': None, u'bias_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_5', 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_6', 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_7', 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>None</td>\n",
" <td>Maria</td>\n",
" <td>MLP with 2 hidden layers</td>\n",
" <td>__madlib_temp_28416680_1614991901_72274844__</td>\n",
" </tr>\n",
"</table>"
],
"text/plain": [
"[(1, {u'class_name': u'Sequential', u'keras_version': u'2.1.6', u'config': [{u'class_name': u'Dense', u'config': {u'kernel_initializer': {u'class_name': u' ... (1340 characters truncated) ... s_initializer': {u'class_name': u'Zeros', u'config': {}}, u'units': 3, u'use_bias': True, u'activity_regularizer': None}}], u'backend': u'tensorflow'}, None, u'Sophie', u'MLP with 1 hidden layer', u'__madlib_temp_4017958_1614991901_4240024__'),\n",
" (2, {u'class_name': u'Sequential', u'keras_version': u'2.1.6', u'config': [{u'class_name': u'Dense', u'config': {u'kernel_initializer': {u'class_name': u' ... (1835 characters truncated) ... s_initializer': {u'class_name': u'Zeros', u'config': {}}, u'units': 3, u'use_bias': True, u'activity_regularizer': None}}], u'backend': u'tensorflow'}, None, u'Maria', u'MLP with 2 hidden layers', u'__madlib_temp_28416680_1614991901_72274844__')]"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%sql\n",
"DROP TABLE IF EXISTS model_arch_library;\n",
"\n",
"SELECT madlib.load_keras_model('model_arch_library', -- Output table,\n",
" \n",
"$$\n",
"{\"class_name\": \"Sequential\", \"keras_version\": \"2.1.6\", \"config\": [{\"class_name\": \"Dense\", \"config\": {\"kernel_initializer\": {\"class_name\": \"VarianceScaling\", \"config\": {\"distribution\": \"uniform\", \"scale\": 1.0, \"seed\": null, \"mode\": \"fan_avg\"}}, \"name\": \"dense_1\", \"kernel_constraint\": null, \"bias_regularizer\": null, \"bias_constraint\": null, \"dtype\": \"float32\", \"activation\": \"relu\", \"trainable\": true, \"kernel_regularizer\": null, \"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",
" 'MLP with 1 hidden layer' -- Descr\n",
");\n",
"\n",
"SELECT madlib.load_keras_model('model_arch_library', -- Output table,\n",
" \n",
"$$\n",
"{\"class_name\": \"Sequential\", \"keras_version\": \"2.1.6\", \"config\": [{\"class_name\": \"Dense\", \"config\": {\"kernel_initializer\": {\"class_name\": \"VarianceScaling\", \"config\": {\"distribution\": \"uniform\", \"scale\": 1.0, \"seed\": null, \"mode\": \"fan_avg\"}}, \"name\": \"dense_4\", \"kernel_constraint\": null, \"bias_regularizer\": null, \"bias_constraint\": null, \"dtype\": \"float32\", \"activation\": \"relu\", \"trainable\": true, \"kernel_regularizer\": null, \"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_5\", \"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_6\", \"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_7\", \"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",
" 'MLP with 2 hidden layers' -- Descr\n",
");\n",
"\n",
"SELECT * FROM model_arch_library ORDER BY model_id;"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a id=\"def_mst\"></a>\n",
"# 4. Define and load model selection tuples"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Generate model configurations using grid search. The output table for grid search contains the unique combinations of model architectures, compile and fit parameters."
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Done.\n",
"1 rows affected.\n",
"12 rows affected.\n"
]
},
{
"data": {
"text/html": [
"<table>\n",
" <tr>\n",
" <th>mst_key</th>\n",
" <th>model_id</th>\n",
" <th>compile_params</th>\n",
" <th>fit_params</th>\n",
" </tr>\n",
" <tr>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>optimizer='Adam(lr=0.001)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
" <td>epochs=1,batch_size=4</td>\n",
" </tr>\n",
" <tr>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>optimizer='Adam(lr=0.001)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
" <td>epochs=1,batch_size=8</td>\n",
" </tr>\n",
" <tr>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>optimizer='Adam(lr=0.01)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
" <td>epochs=1,batch_size=4</td>\n",
" </tr>\n",
" <tr>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" <td>optimizer='Adam(lr=0.01)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
" <td>epochs=1,batch_size=8</td>\n",
" </tr>\n",
" <tr>\n",
" <td>5</td>\n",
" <td>1</td>\n",
" <td>optimizer='Adam(lr=0.1)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
" <td>epochs=1,batch_size=4</td>\n",
" </tr>\n",
" <tr>\n",
" <td>6</td>\n",
" <td>1</td>\n",
" <td>optimizer='Adam(lr=0.1)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
" <td>epochs=1,batch_size=8</td>\n",
" </tr>\n",
" <tr>\n",
" <td>7</td>\n",
" <td>2</td>\n",
" <td>optimizer='Adam(lr=0.001)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
" <td>epochs=1,batch_size=4</td>\n",
" </tr>\n",
" <tr>\n",
" <td>8</td>\n",
" <td>2</td>\n",
" <td>optimizer='Adam(lr=0.001)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
" <td>epochs=1,batch_size=8</td>\n",
" </tr>\n",
" <tr>\n",
" <td>9</td>\n",
" <td>2</td>\n",
" <td>optimizer='Adam(lr=0.01)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
" <td>epochs=1,batch_size=4</td>\n",
" </tr>\n",
" <tr>\n",
" <td>10</td>\n",
" <td>2</td>\n",
" <td>optimizer='Adam(lr=0.01)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
" <td>epochs=1,batch_size=8</td>\n",
" </tr>\n",
" <tr>\n",
" <td>11</td>\n",
" <td>2</td>\n",
" <td>optimizer='Adam(lr=0.1)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
" <td>epochs=1,batch_size=4</td>\n",
" </tr>\n",
" <tr>\n",
" <td>12</td>\n",
" <td>2</td>\n",
" <td>optimizer='Adam(lr=0.1)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
" <td>epochs=1,batch_size=8</td>\n",
" </tr>\n",
"</table>"
],
"text/plain": [
"[(1, 1, u\"optimizer='Adam(lr=0.001)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=4'),\n",
" (2, 1, u\"optimizer='Adam(lr=0.001)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=8'),\n",
" (3, 1, u\"optimizer='Adam(lr=0.01)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=4'),\n",
" (4, 1, u\"optimizer='Adam(lr=0.01)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=8'),\n",
" (5, 1, u\"optimizer='Adam(lr=0.1)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=4'),\n",
" (6, 1, u\"optimizer='Adam(lr=0.1)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=8'),\n",
" (7, 2, u\"optimizer='Adam(lr=0.001)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=4'),\n",
" (8, 2, u\"optimizer='Adam(lr=0.001)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=8'),\n",
" (9, 2, u\"optimizer='Adam(lr=0.01)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=4'),\n",
" (10, 2, u\"optimizer='Adam(lr=0.01)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=8'),\n",
" (11, 2, u\"optimizer='Adam(lr=0.1)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=4'),\n",
" (12, 2, u\"optimizer='Adam(lr=0.1)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=8')]"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%sql\n",
"DROP TABLE IF EXISTS mst_table, mst_table_summary;\n",
"\n",
"SELECT madlib.generate_model_configs(\n",
" 'model_arch_library', -- model architecture table\n",
" 'mst_table', -- model selection table output\n",
" ARRAY[1,2], -- model ids from model architecture table\n",
" $$\n",
" {'loss': ['categorical_crossentropy'],\n",
" 'optimizer_params_list': [ {'optimizer': ['Adam'], 'lr': [0.001, 0.01, 0.1]} ],\n",
" 'metrics': ['accuracy']}\n",
" $$, -- compile_param_grid\n",
" $$\n",
" { 'batch_size': [4, 8],\n",
" 'epochs': [1]\n",
" }\n",
" $$, -- fit_param_grid\n",
" 'grid' -- search_type\n",
" );\n",
"\n",
"SELECT * FROM mst_table ORDER BY mst_key;"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This is the name of the model architecture table that corresponds to the model selection table:"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1 rows affected.\n"
]
},
{
"data": {
"text/html": [
"<table>\n",
" <tr>\n",
" <th>model_arch_table</th>\n",
" <th>object_table</th>\n",
" </tr>\n",
" <tr>\n",
" <td>model_arch_library</td>\n",
" <td>None</td>\n",
" </tr>\n",
"</table>"
],
"text/plain": [
"[(u'model_arch_library', None)]"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%sql\n",
"SELECT * FROM mst_table_summary;"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a id=\"train\"></a>\n",
"# 5. Train\n",
"Train multiple models:"
]
},
{
"cell_type": "code",
"execution_count": 18,
"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_multiple_model</th>\n",
" </tr>\n",
" <tr>\n",
" <td></td>\n",
" </tr>\n",
"</table>"
],
"text/plain": [
"[('',)]"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%sql\n",
"DROP TABLE IF EXISTS iris_multi_model, iris_multi_model_summary, iris_multi_model_info;\n",
"\n",
"SELECT madlib.madlib_keras_fit_multiple_model('iris_train_packed', -- source_table\n",
" 'iris_multi_model', -- model_output_table\n",
" 'mst_table', -- model_selection_table\n",
" 10, -- num_iterations\n",
" FALSE -- use gpus\n",
" );"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"View the model summary:"
]
},
{
"cell_type": "code",
"execution_count": 19,
"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>validation_table</th>\n",
" <th>model</th>\n",
" <th>model_info</th>\n",
" <th>dependent_varname</th>\n",
" <th>independent_varname</th>\n",
" <th>model_arch_table</th>\n",
" <th>model_selection_table</th>\n",
" <th>object_table</th>\n",
" <th>num_iterations</th>\n",
" <th>metrics_compute_frequency</th>\n",
" <th>warm_start</th>\n",
" <th>name</th>\n",
" <th>description</th>\n",
" <th>start_training_time</th>\n",
" <th>end_training_time</th>\n",
" <th>madlib_version</th>\n",
" <th>num_classes</th>\n",
" <th>class_text_class_values</th>\n",
" <th>dependent_vartype</th>\n",
" <th>normalizing_const</th>\n",
" <th>metrics_iters</th>\n",
" </tr>\n",
" <tr>\n",
" <td>iris_train_packed</td>\n",
" <td>None</td>\n",
" <td>iris_multi_model</td>\n",
" <td>iris_multi_model_info</td>\n",
" <td>[u'class_text']</td>\n",
" <td>[u'attributes']</td>\n",
" <td>model_arch_library</td>\n",
" <td>mst_table</td>\n",
" <td>None</td>\n",
" <td>10</td>\n",
" <td>10</td>\n",
" <td>False</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" <td>2021-03-06 00:51:48.452654</td>\n",
" <td>2021-03-06 00:53:20.221035</td>\n",
" <td>1.18.0-dev</td>\n",
" <td>[1]</td>\n",
" <td>[u'Iris-setosa', u'Iris-versicolor', u'Iris-virginica']</td>\n",
" <td>[u'character varying']</td>\n",
" <td>1.0</td>\n",
" <td>[10]</td>\n",
" </tr>\n",
"</table>"
],
"text/plain": [
"[(u'iris_train_packed', None, u'iris_multi_model', u'iris_multi_model_info', [u'class_text'], [u'attributes'], u'model_arch_library', u'mst_table', None, 10, 10, False, None, None, datetime.datetime(2021, 3, 6, 0, 51, 48, 452654), datetime.datetime(2021, 3, 6, 0, 53, 20, 221035), u'1.18.0-dev', [1], [u'Iris-setosa', u'Iris-versicolor', u'Iris-virginica'], [u'character varying'], 1.0, [10])]"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%sql\n",
"SELECT * FROM iris_multi_model_summary;"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"View results for each model:"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"12 rows affected.\n"
]
},
{
"data": {
"text/html": [
"<table>\n",
" <tr>\n",
" <th>mst_key</th>\n",
" <th>model_id</th>\n",
" <th>compile_params</th>\n",
" <th>fit_params</th>\n",
" <th>model_type</th>\n",
" <th>model_size</th>\n",
" <th>metrics_elapsed_time</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",
" </tr>\n",
" <tr>\n",
" <td>6</td>\n",
" <td>1</td>\n",
" <td>optimizer='Adam(lr=0.1)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
" <td>epochs=1,batch_size=8</td>\n",
" <td>madlib_keras</td>\n",
" <td>0.75390625</td>\n",
" <td>[90.2427790164948]</td>\n",
" <td>[u'accuracy']</td>\n",
" <td>categorical_crossentropy</td>\n",
" <td>0.983333349228</td>\n",
" <td>0.201789721847</td>\n",
" <td>[0.983333349227905]</td>\n",
" <td>[0.201789721846581]</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" </tr>\n",
" <tr>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>optimizer='Adam(lr=0.01)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
" <td>epochs=1,batch_size=4</td>\n",
" <td>madlib_keras</td>\n",
" <td>0.75390625</td>\n",
" <td>[88.9964590072632]</td>\n",
" <td>[u'accuracy']</td>\n",
" <td>categorical_crossentropy</td>\n",
" <td>0.933333337307</td>\n",
" <td>0.134730249643</td>\n",
" <td>[0.933333337306976]</td>\n",
" <td>[0.134730249643326]</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" </tr>\n",
" <tr>\n",
" <td>7</td>\n",
" <td>2</td>\n",
" <td>optimizer='Adam(lr=0.001)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
" <td>epochs=1,batch_size=4</td>\n",
" <td>madlib_keras</td>\n",
" <td>1.18359375</td>\n",
" <td>[88.7690601348877]</td>\n",
" <td>[u'accuracy']</td>\n",
" <td>categorical_crossentropy</td>\n",
" <td>0.933333337307</td>\n",
" <td>0.402144879103</td>\n",
" <td>[0.933333337306976]</td>\n",
" <td>[0.402144879102707]</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" </tr>\n",
" <tr>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>optimizer='Adam(lr=0.001)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
" <td>epochs=1,batch_size=4</td>\n",
" <td>madlib_keras</td>\n",
" <td>0.75390625</td>\n",
" <td>[90.9196391105652]</td>\n",
" <td>[u'accuracy']</td>\n",
" <td>categorical_crossentropy</td>\n",
" <td>0.933333337307</td>\n",
" <td>0.416792035103</td>\n",
" <td>[0.933333337306976]</td>\n",
" <td>[0.416792035102844]</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" </tr>\n",
" <tr>\n",
" <td>10</td>\n",
" <td>2</td>\n",
" <td>optimizer='Adam(lr=0.01)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
" <td>epochs=1,batch_size=8</td>\n",
" <td>madlib_keras</td>\n",
" <td>1.18359375</td>\n",
" <td>[89.534707069397]</td>\n",
" <td>[u'accuracy']</td>\n",
" <td>categorical_crossentropy</td>\n",
" <td>0.908333361149</td>\n",
" <td>0.19042557478</td>\n",
" <td>[0.908333361148834]</td>\n",
" <td>[0.19042557477951]</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" </tr>\n",
" <tr>\n",
" <td>9</td>\n",
" <td>2</td>\n",
" <td>optimizer='Adam(lr=0.01)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
" <td>epochs=1,batch_size=4</td>\n",
" <td>madlib_keras</td>\n",
" <td>1.18359375</td>\n",
" <td>[89.273796081543]</td>\n",
" <td>[u'accuracy']</td>\n",
" <td>categorical_crossentropy</td>\n",
" <td>0.899999976158</td>\n",
" <td>0.181902274489</td>\n",
" <td>[0.899999976158142]</td>\n",
" <td>[0.181902274489403]</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" </tr>\n",
" <tr>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" <td>optimizer='Adam(lr=0.01)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
" <td>epochs=1,batch_size=8</td>\n",
" <td>madlib_keras</td>\n",
" <td>0.75390625</td>\n",
" <td>[90.4800100326538]</td>\n",
" <td>[u'accuracy']</td>\n",
" <td>categorical_crossentropy</td>\n",
" <td>0.824999988079</td>\n",
" <td>0.303107827902</td>\n",
" <td>[0.824999988079071]</td>\n",
" <td>[0.30310782790184]</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" </tr>\n",
" <tr>\n",
" <td>12</td>\n",
" <td>2</td>\n",
" <td>optimizer='Adam(lr=0.1)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
" <td>epochs=1,batch_size=8</td>\n",
" <td>madlib_keras</td>\n",
" <td>1.18359375</td>\n",
" <td>[89.7936120033264]</td>\n",
" <td>[u'accuracy']</td>\n",
" <td>categorical_crossentropy</td>\n",
" <td>0.808333337307</td>\n",
" <td>0.300039559603</td>\n",
" <td>[0.808333337306976]</td>\n",
" <td>[0.300039559602737]</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" </tr>\n",
" <tr>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>optimizer='Adam(lr=0.001)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
" <td>epochs=1,batch_size=8</td>\n",
" <td>madlib_keras</td>\n",
" <td>0.75390625</td>\n",
" <td>[90.0158791542053]</td>\n",
" <td>[u'accuracy']</td>\n",
" <td>categorical_crossentropy</td>\n",
" <td>0.658333361149</td>\n",
" <td>0.869387447834</td>\n",
" <td>[0.658333361148834]</td>\n",
" <td>[0.869387447834015]</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" </tr>\n",
" <tr>\n",
" <td>8</td>\n",
" <td>2</td>\n",
" <td>optimizer='Adam(lr=0.001)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
" <td>epochs=1,batch_size=8</td>\n",
" <td>madlib_keras</td>\n",
" <td>1.18359375</td>\n",
" <td>[91.1929490566254]</td>\n",
" <td>[u'accuracy']</td>\n",
" <td>categorical_crossentropy</td>\n",
" <td>0.558333337307</td>\n",
" <td>0.84612262249</td>\n",
" <td>[0.558333337306976]</td>\n",
" <td>[0.846122622489929]</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" </tr>\n",
" <tr>\n",
" <td>11</td>\n",
" <td>2</td>\n",
" <td>optimizer='Adam(lr=0.1)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
" <td>epochs=1,batch_size=4</td>\n",
" <td>madlib_keras</td>\n",
" <td>1.18359375</td>\n",
" <td>[91.7660541534424]</td>\n",
" <td>[u'accuracy']</td>\n",
" <td>categorical_crossentropy</td>\n",
" <td>0.341666668653</td>\n",
" <td>1.10138702393</td>\n",
" <td>[0.341666668653488]</td>\n",
" <td>[1.10138702392578]</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" </tr>\n",
" <tr>\n",
" <td>5</td>\n",
" <td>1</td>\n",
" <td>optimizer='Adam(lr=0.1)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
" <td>epochs=1,batch_size=4</td>\n",
" <td>madlib_keras</td>\n",
" <td>0.75390625</td>\n",
" <td>[91.5026919841766]</td>\n",
" <td>[u'accuracy']</td>\n",
" <td>categorical_crossentropy</td>\n",
" <td>0.341666668653</td>\n",
" <td>1.10163521767</td>\n",
" <td>[0.341666668653488]</td>\n",
" <td>[1.10163521766663]</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" </tr>\n",
"</table>"
],
"text/plain": [
"[(6, 1, u\"optimizer='Adam(lr=0.1)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=8', u'madlib_keras', 0.75390625, [90.2427790164948], [u'accuracy'], u'categorical_crossentropy', 0.983333349227905, 0.201789721846581, [0.983333349227905], [0.201789721846581], None, None, None, None),\n",
" (3, 1, u\"optimizer='Adam(lr=0.01)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=4', u'madlib_keras', 0.75390625, [88.9964590072632], [u'accuracy'], u'categorical_crossentropy', 0.933333337306976, 0.134730249643326, [0.933333337306976], [0.134730249643326], None, None, None, None),\n",
" (7, 2, u\"optimizer='Adam(lr=0.001)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=4', u'madlib_keras', 1.18359375, [88.7690601348877], [u'accuracy'], u'categorical_crossentropy', 0.933333337306976, 0.402144879102707, [0.933333337306976], [0.402144879102707], None, None, None, None),\n",
" (1, 1, u\"optimizer='Adam(lr=0.001)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=4', u'madlib_keras', 0.75390625, [90.9196391105652], [u'accuracy'], u'categorical_crossentropy', 0.933333337306976, 0.416792035102844, [0.933333337306976], [0.416792035102844], None, None, None, None),\n",
" (10, 2, u\"optimizer='Adam(lr=0.01)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=8', u'madlib_keras', 1.18359375, [89.534707069397], [u'accuracy'], u'categorical_crossentropy', 0.908333361148834, 0.19042557477951, [0.908333361148834], [0.19042557477951], None, None, None, None),\n",
" (9, 2, u\"optimizer='Adam(lr=0.01)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=4', u'madlib_keras', 1.18359375, [89.273796081543], [u'accuracy'], u'categorical_crossentropy', 0.899999976158142, 0.181902274489403, [0.899999976158142], [0.181902274489403], None, None, None, None),\n",
" (4, 1, u\"optimizer='Adam(lr=0.01)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=8', u'madlib_keras', 0.75390625, [90.4800100326538], [u'accuracy'], u'categorical_crossentropy', 0.824999988079071, 0.30310782790184, [0.824999988079071], [0.30310782790184], None, None, None, None),\n",
" (12, 2, u\"optimizer='Adam(lr=0.1)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=8', u'madlib_keras', 1.18359375, [89.7936120033264], [u'accuracy'], u'categorical_crossentropy', 0.808333337306976, 0.300039559602737, [0.808333337306976], [0.300039559602737], None, None, None, None),\n",
" (2, 1, u\"optimizer='Adam(lr=0.001)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=8', u'madlib_keras', 0.75390625, [90.0158791542053], [u'accuracy'], u'categorical_crossentropy', 0.658333361148834, 0.869387447834015, [0.658333361148834], [0.869387447834015], None, None, None, None),\n",
" (8, 2, u\"optimizer='Adam(lr=0.001)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=8', u'madlib_keras', 1.18359375, [91.1929490566254], [u'accuracy'], u'categorical_crossentropy', 0.558333337306976, 0.846122622489929, [0.558333337306976], [0.846122622489929], None, None, None, None),\n",
" (11, 2, u\"optimizer='Adam(lr=0.1)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=4', u'madlib_keras', 1.18359375, [91.7660541534424], [u'accuracy'], u'categorical_crossentropy', 0.341666668653488, 1.10138702392578, [0.341666668653488], [1.10138702392578], None, None, None, None),\n",
" (5, 1, u\"optimizer='Adam(lr=0.1)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=4', u'madlib_keras', 0.75390625, [91.5026919841766], [u'accuracy'], u'categorical_crossentropy', 0.341666668653488, 1.10163521766663, [0.341666668653488], [1.10163521766663], None, None, None, None)]"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%sql\n",
"SELECT * FROM iris_multi_model_info ORDER BY training_metrics_final DESC, training_loss_final;"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a id=\"eval\"></a>\n",
"# 6. Evaluate\n",
"\n",
"Now run evaluate using model we built above:"
]
},
{
"cell_type": "code",
"execution_count": 21,
"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.194916069508</td>\n",
" <td>0.899999976158</td>\n",
" <td>[u'accuracy']</td>\n",
" <td>categorical_crossentropy</td>\n",
" </tr>\n",
"</table>"
],
"text/plain": [
"[(0.194916069507599, 0.899999976158142, [u'accuracy'], u'categorical_crossentropy')]"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%sql\n",
"DROP TABLE IF EXISTS iris_validate;\n",
"SELECT madlib.madlib_keras_evaluate('iris_multi_model', -- model\n",
" 'iris_test_packed', -- test table\n",
" 'iris_validate', -- output table\n",
" NULL, -- use gpus\n",
" 9 -- mst_key to use\n",
" );\n",
"\n",
"SELECT * FROM iris_validate;"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a id=\"pred\"></a>\n",
"# 7. Predict\n",
"\n",
"Now predict using model we built. We will use the validation data set for prediction as well, which is not usual but serves to show the syntax. The prediction is in the estimated_class_text column:"
]
},
{
"cell_type": "code",
"execution_count": 22,
"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>3</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" <tr>\n",
" <td>10</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.9999999</td>\n",
" </tr>\n",
" <tr>\n",
" <td>12</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" <tr>\n",
" <td>14</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.9999999</td>\n",
" </tr>\n",
" <tr>\n",
" <td>18</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" <tr>\n",
" <td>20</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" <tr>\n",
" <td>30</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.9999999</td>\n",
" </tr>\n",
" <tr>\n",
" <td>31</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.9999999</td>\n",
" </tr>\n",
" <tr>\n",
" <td>49</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" <tr>\n",
" <td>55</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.99069124</td>\n",
" </tr>\n",
" <tr>\n",
" <td>64</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.9864196</td>\n",
" </tr>\n",
" <tr>\n",
" <td>70</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.9983382</td>\n",
" </tr>\n",
" <tr>\n",
" <td>76</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.9991603</td>\n",
" </tr>\n",
" <tr>\n",
" <td>82</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.9974559</td>\n",
" </tr>\n",
" <tr>\n",
" <td>84</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.60661113</td>\n",
" </tr>\n",
" <tr>\n",
" <td>92</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.9940832</td>\n",
" </tr>\n",
" <tr>\n",
" <td>98</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.9987955</td>\n",
" </tr>\n",
" <tr>\n",
" <td>99</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.7598468</td>\n",
" </tr>\n",
" <tr>\n",
" <td>102</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.8414144</td>\n",
" </tr>\n",
" <tr>\n",
" <td>107</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.715776</td>\n",
" </tr>\n",
" <tr>\n",
" <td>114</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.9163472</td>\n",
" </tr>\n",
" <tr>\n",
" <td>117</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.5081183</td>\n",
" </tr>\n",
" <tr>\n",
" <td>121</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.85080105</td>\n",
" </tr>\n",
" <tr>\n",
" <td>123</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.9842195</td>\n",
" </tr>\n",
" <tr>\n",
" <td>125</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.6804195</td>\n",
" </tr>\n",
" <tr>\n",
" <td>127</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.81555897</td>\n",
" </tr>\n",
" <tr>\n",
" <td>145</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.92707217</td>\n",
" </tr>\n",
" <tr>\n",
" <td>147</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.7158722</td>\n",
" </tr>\n",
" <tr>\n",
" <td>148</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.55272627</td>\n",
" </tr>\n",
" <tr>\n",
" <td>149</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.7662018</td>\n",
" </tr>\n",
"</table>"
],
"text/plain": [
"[(3, u'class_text', u'Iris-setosa', 1.0),\n",
" (10, u'class_text', u'Iris-setosa', 0.9999999),\n",
" (12, u'class_text', u'Iris-setosa', 1.0),\n",
" (14, u'class_text', u'Iris-setosa', 0.9999999),\n",
" (18, u'class_text', u'Iris-setosa', 1.0),\n",
" (20, u'class_text', u'Iris-setosa', 1.0),\n",
" (30, u'class_text', u'Iris-setosa', 0.9999999),\n",
" (31, u'class_text', u'Iris-setosa', 0.9999999),\n",
" (49, u'class_text', u'Iris-setosa', 1.0),\n",
" (55, u'class_text', u'Iris-versicolor', 0.99069124),\n",
" (64, u'class_text', u'Iris-versicolor', 0.9864196),\n",
" (70, u'class_text', u'Iris-versicolor', 0.9983382),\n",
" (76, u'class_text', u'Iris-versicolor', 0.9991603),\n",
" (82, u'class_text', u'Iris-versicolor', 0.9974559),\n",
" (84, u'class_text', u'Iris-versicolor', 0.60661113),\n",
" (92, u'class_text', u'Iris-versicolor', 0.9940832),\n",
" (98, u'class_text', u'Iris-versicolor', 0.9987955),\n",
" (99, u'class_text', u'Iris-versicolor', 0.7598468),\n",
" (102, u'class_text', u'Iris-virginica', 0.8414144),\n",
" (107, u'class_text', u'Iris-virginica', 0.715776),\n",
" (114, u'class_text', u'Iris-virginica', 0.9163472),\n",
" (117, u'class_text', u'Iris-versicolor', 0.5081183),\n",
" (121, u'class_text', u'Iris-virginica', 0.85080105),\n",
" (123, u'class_text', u'Iris-virginica', 0.9842195),\n",
" (125, u'class_text', u'Iris-virginica', 0.6804195),\n",
" (127, u'class_text', u'Iris-versicolor', 0.81555897),\n",
" (145, u'class_text', u'Iris-virginica', 0.92707217),\n",
" (147, u'class_text', u'Iris-virginica', 0.7158722),\n",
" (148, u'class_text', u'Iris-versicolor', 0.55272627),\n",
" (149, u'class_text', u'Iris-virginica', 0.7662018)]"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%sql\n",
"DROP TABLE IF EXISTS iris_predict;\n",
"\n",
"SELECT madlib.madlib_keras_predict('iris_multi_model', -- model\n",
" 'iris_test', -- test_table\n",
" 'id', -- id column\n",
" 'attributes', -- independent var\n",
" 'iris_predict', -- output table\n",
" 'response', -- prediction type\n",
" FALSE, -- use gpus\n",
" 9 -- mst_key to use\n",
" );\n",
"\n",
"SELECT * FROM iris_predict ORDER BY id;"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Count missclassifications"
]
},
{
"cell_type": "code",
"execution_count": 23,
"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": 23,
"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;"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Percent missclassifications"
]
},
{
"cell_type": "code",
"execution_count": 24,
"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": 24,
"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) q\n",
"WHERE q.actual=q.estimated;"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a id=\"class2\"></a>\n",
"# Classification with Other Parameters\n",
"\n",
"<a id=\"val_dataset\"></a>\n",
"# 1. Validation dataset\n",
"\n",
"Now use a validation dataset and compute metrics every 2nd iteration using the 'metrics_compute_frequency' parameter. This can help reduce run time if you do not need metrics computed at every iteration."
]
},
{
"cell_type": "code",
"execution_count": 25,
"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_multiple_model</th>\n",
" </tr>\n",
" <tr>\n",
" <td></td>\n",
" </tr>\n",
"</table>"
],
"text/plain": [
"[('',)]"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%sql\n",
"DROP TABLE IF EXISTS iris_multi_model, iris_multi_model_summary, iris_multi_model_info;\n",
"\n",
"SELECT madlib.madlib_keras_fit_multiple_model('iris_train_packed', -- source_table\n",
" 'iris_multi_model', -- model_output_table\n",
" 'mst_table', -- model_selection_table\n",
" 10, -- num_iterations\n",
" FALSE, -- use gpus\n",
" 'iris_test_packed', -- validation dataset\n",
" 3, -- metrics compute frequency\n",
" FALSE, -- warm start\n",
" 'Sophie L.', -- name\n",
" 'Model selection for iris dataset' -- description\n",
" );"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"View the model summary:"
]
},
{
"cell_type": "code",
"execution_count": 26,
"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>validation_table</th>\n",
" <th>model</th>\n",
" <th>model_info</th>\n",
" <th>dependent_varname</th>\n",
" <th>independent_varname</th>\n",
" <th>model_arch_table</th>\n",
" <th>model_selection_table</th>\n",
" <th>object_table</th>\n",
" <th>num_iterations</th>\n",
" <th>metrics_compute_frequency</th>\n",
" <th>warm_start</th>\n",
" <th>name</th>\n",
" <th>description</th>\n",
" <th>start_training_time</th>\n",
" <th>end_training_time</th>\n",
" <th>madlib_version</th>\n",
" <th>num_classes</th>\n",
" <th>class_text_class_values</th>\n",
" <th>dependent_vartype</th>\n",
" <th>normalizing_const</th>\n",
" <th>metrics_iters</th>\n",
" </tr>\n",
" <tr>\n",
" <td>iris_train_packed</td>\n",
" <td>iris_test_packed</td>\n",
" <td>iris_multi_model</td>\n",
" <td>iris_multi_model_info</td>\n",
" <td>[u'class_text']</td>\n",
" <td>[u'attributes']</td>\n",
" <td>model_arch_library</td>\n",
" <td>mst_table</td>\n",
" <td>None</td>\n",
" <td>10</td>\n",
" <td>3</td>\n",
" <td>False</td>\n",
" <td>Sophie L.</td>\n",
" <td>Model selection for iris dataset</td>\n",
" <td>2021-03-06 00:53:31.218406</td>\n",
" <td>2021-03-06 00:55:25.621208</td>\n",
" <td>1.18.0-dev</td>\n",
" <td>[1]</td>\n",
" <td>[u'Iris-setosa', u'Iris-versicolor', u'Iris-virginica']</td>\n",
" <td>[u'character varying']</td>\n",
" <td>1.0</td>\n",
" <td>[3, 6, 9, 10]</td>\n",
" </tr>\n",
"</table>"
],
"text/plain": [
"[(u'iris_train_packed', u'iris_test_packed', u'iris_multi_model', u'iris_multi_model_info', [u'class_text'], [u'attributes'], u'model_arch_library', u'mst_table', None, 10, 3, False, u'Sophie L.', u'Model selection for iris dataset', datetime.datetime(2021, 3, 6, 0, 53, 31, 218406), datetime.datetime(2021, 3, 6, 0, 55, 25, 621208), u'1.18.0-dev', [1], [u'Iris-setosa', u'Iris-versicolor', u'Iris-virginica'], [u'character varying'], 1.0, [3, 6, 9, 10])]"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%sql\n",
"SELECT * FROM iris_multi_model_summary;"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"View performance of each model:"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"12 rows affected.\n"
]
},
{
"data": {
"text/html": [
"<table>\n",
" <tr>\n",
" <th>mst_key</th>\n",
" <th>model_id</th>\n",
" <th>compile_params</th>\n",
" <th>fit_params</th>\n",
" <th>model_type</th>\n",
" <th>model_size</th>\n",
" <th>metrics_elapsed_time</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",
" </tr>\n",
" <tr>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" <td>optimizer='Adam(lr=0.01)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
" <td>epochs=1,batch_size=8</td>\n",
" <td>madlib_keras</td>\n",
" <td>0.75390625</td>\n",
" <td>[31.5490398406982, 64.223620891571, 97.8899219036102, 113.156138896942]</td>\n",
" <td>[u'accuracy']</td>\n",
" <td>categorical_crossentropy</td>\n",
" <td>0.991666674614</td>\n",
" <td>0.177691921592</td>\n",
" <td>[0.824999988079071, 0.975000023841858, 0.933333337306976, 0.991666674613953]</td>\n",
" <td>[0.508709609508514, 0.290052831172943, 0.217903628945351, 0.177691921591759]</td>\n",
" <td>0.966666638851</td>\n",
" <td>0.20564225316</td>\n",
" <td>[0.833333313465118, 0.966666638851166, 0.933333337306976, 0.966666638851166]</td>\n",
" <td>[0.516587793827057, 0.316147029399872, 0.228292018175125, 0.205642253160477]</td>\n",
" </tr>\n",
" <tr>\n",
" <td>10</td>\n",
" <td>2</td>\n",
" <td>optimizer='Adam(lr=0.01)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
" <td>epochs=1,batch_size=8</td>\n",
" <td>madlib_keras</td>\n",
" <td>1.18359375</td>\n",
" <td>[30.4000718593597, 62.9767029285431, 96.690801858902, 112.145288944244]</td>\n",
" <td>[u'accuracy']</td>\n",
" <td>categorical_crossentropy</td>\n",
" <td>0.908333361149</td>\n",
" <td>0.203085869551</td>\n",
" <td>[0.933333337306976, 0.808333337306976, 0.958333313465118, 0.908333361148834]</td>\n",
" <td>[0.372362315654755, 0.304766088724136, 0.11820487678051, 0.203085869550705]</td>\n",
" <td>0.933333337307</td>\n",
" <td>0.190864190459</td>\n",
" <td>[0.966666638851166, 0.833333313465118, 0.966666638851166, 0.933333337306976]</td>\n",
" <td>[0.347199022769928, 0.290798246860504, 0.110275268554688, 0.190864190459251]</td>\n",
" </tr>\n",
" <tr>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>optimizer='Adam(lr=0.001)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
" <td>epochs=1,batch_size=8</td>\n",
" <td>madlib_keras</td>\n",
" <td>0.75390625</td>\n",
" <td>[30.875373840332, 63.4593389034271, 97.1958589553833, 112.702126979828]</td>\n",
" <td>[u'accuracy']</td>\n",
" <td>categorical_crossentropy</td>\n",
" <td>0.883333325386</td>\n",
" <td>0.692279815674</td>\n",
" <td>[0.533333361148834, 0.616666674613953, 0.875, 0.883333325386047]</td>\n",
" <td>[1.08197057247162, 0.851473987102509, 0.729827761650085, 0.692279815673828]</td>\n",
" <td>0.899999976158</td>\n",
" <td>0.674779772758</td>\n",
" <td>[0.600000023841858, 0.666666686534882, 0.899999976158142, 0.899999976158142]</td>\n",
" <td>[1.05298256874084, 0.817528009414673, 0.710631787776947, 0.674779772758484]</td>\n",
" </tr>\n",
" <tr>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>optimizer='Adam(lr=0.01)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
" <td>epochs=1,batch_size=4</td>\n",
" <td>madlib_keras</td>\n",
" <td>0.75390625</td>\n",
" <td>[29.8903229236603, 62.4677069187164, 96.1764039993286, 111.539803981781]</td>\n",
" <td>[u'accuracy']</td>\n",
" <td>categorical_crossentropy</td>\n",
" <td>0.925000011921</td>\n",
" <td>0.176520362496</td>\n",
" <td>[0.833333313465118, 0.925000011920929, 0.774999976158142, 0.925000011920929]</td>\n",
" <td>[0.324734181165695, 0.182637020945549, 0.468331128358841, 0.176520362496376]</td>\n",
" <td>0.899999976158</td>\n",
" <td>0.2585529387</td>\n",
" <td>[0.866666674613953, 0.866666674613953, 0.866666674613953, 0.899999976158142]</td>\n",
" <td>[0.341204434633255, 0.261798053979874, 0.45467621088028, 0.258552938699722]</td>\n",
" </tr>\n",
" <tr>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>optimizer='Adam(lr=0.001)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
" <td>epochs=1,batch_size=4</td>\n",
" <td>madlib_keras</td>\n",
" <td>0.75390625</td>\n",
" <td>[31.7836039066315, 64.4592599868774, 98.1328208446503, 113.377946853638]</td>\n",
" <td>[u'accuracy']</td>\n",
" <td>categorical_crossentropy</td>\n",
" <td>0.891666650772</td>\n",
" <td>0.797108471394</td>\n",
" <td>[0.341666668653488, 0.491666674613953, 0.916666686534882, 0.891666650772095]</td>\n",
" <td>[1.09786474704742, 0.967048287391663, 0.838281869888306, 0.797108471393585]</td>\n",
" <td>0.899999976158</td>\n",
" <td>0.800795376301</td>\n",
" <td>[0.300000011920929, 0.433333337306976, 0.933333337306976, 0.899999976158142]</td>\n",
" <td>[1.07609903812408, 0.962578594684601, 0.834975183010101, 0.800795376300812]</td>\n",
" </tr>\n",
" <tr>\n",
" <td>9</td>\n",
" <td>2</td>\n",
" <td>optimizer='Adam(lr=0.01)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
" <td>epochs=1,batch_size=4</td>\n",
" <td>madlib_keras</td>\n",
" <td>1.18359375</td>\n",
" <td>[30.1456639766693, 62.722916841507, 96.4333670139313, 111.892151832581]</td>\n",
" <td>[u'accuracy']</td>\n",
" <td>categorical_crossentropy</td>\n",
" <td>0.816666662693</td>\n",
" <td>0.734887838364</td>\n",
" <td>[0.850000023841858, 0.958333313465118, 0.966666638851166, 0.816666662693024]</td>\n",
" <td>[0.335647404193878, 0.0894104242324829, 0.0672163665294647, 0.734887838363647]</td>\n",
" <td>0.866666674614</td>\n",
" <td>0.665323019028</td>\n",
" <td>[0.866666674613953, 0.966666638851166, 0.966666638851166, 0.866666674613953]</td>\n",
" <td>[0.320426166057587, 0.154994085431099, 0.204012081027031, 0.66532301902771]</td>\n",
" </tr>\n",
" <tr>\n",
" <td>8</td>\n",
" <td>2</td>\n",
" <td>optimizer='Adam(lr=0.001)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
" <td>epochs=1,batch_size=8</td>\n",
" <td>madlib_keras</td>\n",
" <td>1.18359375</td>\n",
" <td>[32.0452349185944, 64.7241299152374, 98.4015560150146, 113.899842977524]</td>\n",
" <td>[u'accuracy']</td>\n",
" <td>categorical_crossentropy</td>\n",
" <td>0.791666686535</td>\n",
" <td>0.772948563099</td>\n",
" <td>[0.316666662693024, 0.349999994039536, 0.725000023841858, 0.791666686534882]</td>\n",
" <td>[1.01266825199127, 0.905348658561707, 0.807280421257019, 0.772948563098907]</td>\n",
" <td>0.866666674614</td>\n",
" <td>0.740880072117</td>\n",
" <td>[0.400000005960464, 0.466666668653488, 0.800000011920929, 0.866666674613953]</td>\n",
" <td>[0.964996755123138, 0.868514597415924, 0.771895349025726, 0.740880072116852]</td>\n",
" </tr>\n",
" <tr>\n",
" <td>12</td>\n",
" <td>2</td>\n",
" <td>optimizer='Adam(lr=0.1)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
" <td>epochs=1,batch_size=8</td>\n",
" <td>madlib_keras</td>\n",
" <td>1.18359375</td>\n",
" <td>[30.6602540016174, 63.2428169250488, 96.9531948566437, 112.484740972519]</td>\n",
" <td>[u'accuracy']</td>\n",
" <td>categorical_crossentropy</td>\n",
" <td>0.691666662693</td>\n",
" <td>0.501820206642</td>\n",
" <td>[0.658333361148834, 0.658333361148834, 0.658333361148834, 0.691666662693024]</td>\n",
" <td>[0.654709756374359, 0.581917643547058, 1.33844769001007, 0.501820206642151]</td>\n",
" <td>0.766666650772</td>\n",
" <td>0.457984447479</td>\n",
" <td>[0.699999988079071, 0.699999988079071, 0.699999988079071, 0.766666650772095]</td>\n",
" <td>[0.592061340808868, 0.525563180446625, 1.17788350582123, 0.457984447479248]</td>\n",
" </tr>\n",
" <tr>\n",
" <td>6</td>\n",
" <td>1</td>\n",
" <td>optimizer='Adam(lr=0.1)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
" <td>epochs=1,batch_size=8</td>\n",
" <td>madlib_keras</td>\n",
" <td>0.75390625</td>\n",
" <td>[31.0910878181458, 63.7646949291229, 97.4185988903046, 112.939773797989]</td>\n",
" <td>[u'accuracy']</td>\n",
" <td>categorical_crossentropy</td>\n",
" <td>0.666666686535</td>\n",
" <td>0.50052946806</td>\n",
" <td>[0.433333337306976, 0.641666650772095, 0.649999976158142, 0.666666686534882]</td>\n",
" <td>[0.850135624408722, 0.611121952533722, 0.509139358997345, 0.50052946805954]</td>\n",
" <td>0.733333349228</td>\n",
" <td>0.459399551153</td>\n",
" <td>[0.466666668653488, 0.699999988079071, 0.699999988079071, 0.733333349227905]</td>\n",
" <td>[0.802468597888947, 0.571285247802734, 0.492577910423279, 0.459399551153183]</td>\n",
" </tr>\n",
" <tr>\n",
" <td>7</td>\n",
" <td>2</td>\n",
" <td>optimizer='Adam(lr=0.001)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
" <td>epochs=1,batch_size=4</td>\n",
" <td>madlib_keras</td>\n",
" <td>1.18359375</td>\n",
" <td>[29.6670269966125, 62.2440509796143, 95.9554150104523, 111.311369895935]</td>\n",
" <td>[u'accuracy']</td>\n",
" <td>categorical_crossentropy</td>\n",
" <td>0.733333349228</td>\n",
" <td>0.821944594383</td>\n",
" <td>[0.341666668653488, 0.341666668653488, 0.658333361148834, 0.733333349227905]</td>\n",
" <td>[1.06431686878204, 0.996406197547913, 0.869706034660339, 0.82194459438324]</td>\n",
" <td>0.699999988079</td>\n",
" <td>0.852133929729</td>\n",
" <td>[0.300000011920929, 0.300000011920929, 0.699999988079071, 0.699999988079071]</td>\n",
" <td>[1.09268116950989, 1.01670277118683, 0.891825795173645, 0.852133929729462]</td>\n",
" </tr>\n",
" <tr>\n",
" <td>11</td>\n",
" <td>2</td>\n",
" <td>optimizer='Adam(lr=0.1)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
" <td>epochs=1,batch_size=4</td>\n",
" <td>madlib_keras</td>\n",
" <td>1.18359375</td>\n",
" <td>[32.5322558879852, 65.2217888832092, 98.9477097988129, 114.400418996811]</td>\n",
" <td>[u'accuracy']</td>\n",
" <td>categorical_crossentropy</td>\n",
" <td>0.683333337307</td>\n",
" <td>0.455871999264</td>\n",
" <td>[0.725000023841858, 0.683333337306976, 0.683333337306976, 0.683333337306976]</td>\n",
" <td>[0.383917421102524, 0.457853585481644, 0.455943495035172, 0.455871999263763]</td>\n",
" <td>0.600000023842</td>\n",
" <td>0.488439053297</td>\n",
" <td>[0.800000011920929, 0.600000023841858, 0.600000023841858, 0.600000023841858]</td>\n",
" <td>[0.388951361179352, 0.50080794095993, 0.487448841333389, 0.488439053297043]</td>\n",
" </tr>\n",
" <tr>\n",
" <td>5</td>\n",
" <td>1</td>\n",
" <td>optimizer='Adam(lr=0.1)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
" <td>epochs=1,batch_size=4</td>\n",
" <td>madlib_keras</td>\n",
" <td>0.75390625</td>\n",
" <td>[32.2720308303833, 64.9502189159393, 98.6836059093475, 114.134181976318]</td>\n",
" <td>[u'accuracy']</td>\n",
" <td>categorical_crossentropy</td>\n",
" <td>0.675000011921</td>\n",
" <td>0.452209770679</td>\n",
" <td>[0.683333337306976, 0.675000011920929, 0.683333337306976, 0.675000011920929]</td>\n",
" <td>[0.492754250764847, 0.469423890113831, 0.571796059608459, 0.452209770679474]</td>\n",
" <td>0.600000023842</td>\n",
" <td>0.464268505573</td>\n",
" <td>[0.733333349227905, 0.766666650772095, 0.600000023841858, 0.600000023841858]</td>\n",
" <td>[0.438488334417343, 0.390993624925613, 0.690678656101227, 0.464268505573273]</td>\n",
" </tr>\n",
"</table>"
],
"text/plain": [
"[(4, 1, u\"optimizer='Adam(lr=0.01)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=8', u'madlib_keras', 0.75390625, [31.5490398406982, 64.223620891571, 97.8899219036102, 113.156138896942], [u'accuracy'], u'categorical_crossentropy', 0.991666674613953, 0.177691921591759, [0.824999988079071, 0.975000023841858, 0.933333337306976, 0.991666674613953], [0.508709609508514, 0.290052831172943, 0.217903628945351, 0.177691921591759], 0.966666638851166, 0.205642253160477, [0.833333313465118, 0.966666638851166, 0.933333337306976, 0.966666638851166], [0.516587793827057, 0.316147029399872, 0.228292018175125, 0.205642253160477]),\n",
" (10, 2, u\"optimizer='Adam(lr=0.01)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=8', u'madlib_keras', 1.18359375, [30.4000718593597, 62.9767029285431, 96.690801858902, 112.145288944244], [u'accuracy'], u'categorical_crossentropy', 0.908333361148834, 0.203085869550705, [0.933333337306976, 0.808333337306976, 0.958333313465118, 0.908333361148834], [0.372362315654755, 0.304766088724136, 0.11820487678051, 0.203085869550705], 0.933333337306976, 0.190864190459251, [0.966666638851166, 0.833333313465118, 0.966666638851166, 0.933333337306976], [0.347199022769928, 0.290798246860504, 0.110275268554688, 0.190864190459251]),\n",
" (2, 1, u\"optimizer='Adam(lr=0.001)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=8', u'madlib_keras', 0.75390625, [30.875373840332, 63.4593389034271, 97.1958589553833, 112.702126979828], [u'accuracy'], u'categorical_crossentropy', 0.883333325386047, 0.692279815673828, [0.533333361148834, 0.616666674613953, 0.875, 0.883333325386047], [1.08197057247162, 0.851473987102509, 0.729827761650085, 0.692279815673828], 0.899999976158142, 0.674779772758484, [0.600000023841858, 0.666666686534882, 0.899999976158142, 0.899999976158142], [1.05298256874084, 0.817528009414673, 0.710631787776947, 0.674779772758484]),\n",
" (3, 1, u\"optimizer='Adam(lr=0.01)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=4', u'madlib_keras', 0.75390625, [29.8903229236603, 62.4677069187164, 96.1764039993286, 111.539803981781], [u'accuracy'], u'categorical_crossentropy', 0.925000011920929, 0.176520362496376, [0.833333313465118, 0.925000011920929, 0.774999976158142, 0.925000011920929], [0.324734181165695, 0.182637020945549, 0.468331128358841, 0.176520362496376], 0.899999976158142, 0.258552938699722, [0.866666674613953, 0.866666674613953, 0.866666674613953, 0.899999976158142], [0.341204434633255, 0.261798053979874, 0.45467621088028, 0.258552938699722]),\n",
" (1, 1, u\"optimizer='Adam(lr=0.001)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=4', u'madlib_keras', 0.75390625, [31.7836039066315, 64.4592599868774, 98.1328208446503, 113.377946853638], [u'accuracy'], u'categorical_crossentropy', 0.891666650772095, 0.797108471393585, [0.341666668653488, 0.491666674613953, 0.916666686534882, 0.891666650772095], [1.09786474704742, 0.967048287391663, 0.838281869888306, 0.797108471393585], 0.899999976158142, 0.800795376300812, [0.300000011920929, 0.433333337306976, 0.933333337306976, 0.899999976158142], [1.07609903812408, 0.962578594684601, 0.834975183010101, 0.800795376300812]),\n",
" (9, 2, u\"optimizer='Adam(lr=0.01)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=4', u'madlib_keras', 1.18359375, [30.1456639766693, 62.722916841507, 96.4333670139313, 111.892151832581], [u'accuracy'], u'categorical_crossentropy', 0.816666662693024, 0.734887838363647, [0.850000023841858, 0.958333313465118, 0.966666638851166, 0.816666662693024], [0.335647404193878, 0.0894104242324829, 0.0672163665294647, 0.734887838363647], 0.866666674613953, 0.66532301902771, [0.866666674613953, 0.966666638851166, 0.966666638851166, 0.866666674613953], [0.320426166057587, 0.154994085431099, 0.204012081027031, 0.66532301902771]),\n",
" (8, 2, u\"optimizer='Adam(lr=0.001)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=8', u'madlib_keras', 1.18359375, [32.0452349185944, 64.7241299152374, 98.4015560150146, 113.899842977524], [u'accuracy'], u'categorical_crossentropy', 0.791666686534882, 0.772948563098907, [0.316666662693024, 0.349999994039536, 0.725000023841858, 0.791666686534882], [1.01266825199127, 0.905348658561707, 0.807280421257019, 0.772948563098907], 0.866666674613953, 0.740880072116852, [0.400000005960464, 0.466666668653488, 0.800000011920929, 0.866666674613953], [0.964996755123138, 0.868514597415924, 0.771895349025726, 0.740880072116852]),\n",
" (12, 2, u\"optimizer='Adam(lr=0.1)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=8', u'madlib_keras', 1.18359375, [30.6602540016174, 63.2428169250488, 96.9531948566437, 112.484740972519], [u'accuracy'], u'categorical_crossentropy', 0.691666662693024, 0.501820206642151, [0.658333361148834, 0.658333361148834, 0.658333361148834, 0.691666662693024], [0.654709756374359, 0.581917643547058, 1.33844769001007, 0.501820206642151], 0.766666650772095, 0.457984447479248, [0.699999988079071, 0.699999988079071, 0.699999988079071, 0.766666650772095], [0.592061340808868, 0.525563180446625, 1.17788350582123, 0.457984447479248]),\n",
" (6, 1, u\"optimizer='Adam(lr=0.1)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=8', u'madlib_keras', 0.75390625, [31.0910878181458, 63.7646949291229, 97.4185988903046, 112.939773797989], [u'accuracy'], u'categorical_crossentropy', 0.666666686534882, 0.50052946805954, [0.433333337306976, 0.641666650772095, 0.649999976158142, 0.666666686534882], [0.850135624408722, 0.611121952533722, 0.509139358997345, 0.50052946805954], 0.733333349227905, 0.459399551153183, [0.466666668653488, 0.699999988079071, 0.699999988079071, 0.733333349227905], [0.802468597888947, 0.571285247802734, 0.492577910423279, 0.459399551153183]),\n",
" (7, 2, u\"optimizer='Adam(lr=0.001)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=4', u'madlib_keras', 1.18359375, [29.6670269966125, 62.2440509796143, 95.9554150104523, 111.311369895935], [u'accuracy'], u'categorical_crossentropy', 0.733333349227905, 0.82194459438324, [0.341666668653488, 0.341666668653488, 0.658333361148834, 0.733333349227905], [1.06431686878204, 0.996406197547913, 0.869706034660339, 0.82194459438324], 0.699999988079071, 0.852133929729462, [0.300000011920929, 0.300000011920929, 0.699999988079071, 0.699999988079071], [1.09268116950989, 1.01670277118683, 0.891825795173645, 0.852133929729462]),\n",
" (11, 2, u\"optimizer='Adam(lr=0.1)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=4', u'madlib_keras', 1.18359375, [32.5322558879852, 65.2217888832092, 98.9477097988129, 114.400418996811], [u'accuracy'], u'categorical_crossentropy', 0.683333337306976, 0.455871999263763, [0.725000023841858, 0.683333337306976, 0.683333337306976, 0.683333337306976], [0.383917421102524, 0.457853585481644, 0.455943495035172, 0.455871999263763], 0.600000023841858, 0.488439053297043, [0.800000011920929, 0.600000023841858, 0.600000023841858, 0.600000023841858], [0.388951361179352, 0.50080794095993, 0.487448841333389, 0.488439053297043]),\n",
" (5, 1, u\"optimizer='Adam(lr=0.1)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=4', u'madlib_keras', 0.75390625, [32.2720308303833, 64.9502189159393, 98.6836059093475, 114.134181976318], [u'accuracy'], u'categorical_crossentropy', 0.675000011920929, 0.452209770679474, [0.683333337306976, 0.675000011920929, 0.683333337306976, 0.675000011920929], [0.492754250764847, 0.469423890113831, 0.571796059608459, 0.452209770679474], 0.600000023841858, 0.464268505573273, [0.733333349227905, 0.766666650772095, 0.600000023841858, 0.600000023841858], [0.438488334417343, 0.390993624925613, 0.690678656101227, 0.464268505573273])]"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%sql\n",
"SELECT * FROM iris_multi_model_info ORDER BY validation_metrics_final DESC;"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Plot validation results"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib notebook\n",
"import matplotlib.pyplot as plt\n",
"from matplotlib.ticker import MaxNLocator\n",
"from collections import defaultdict\n",
"import pandas as pd\n",
"import seaborn as sns\n",
"sns.set_palette(sns.color_palette(\"hls\", 20))\n",
"plt.rcParams.update({'font.size': 12})\n",
"pd.set_option('display.max_colwidth', -1)"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"7 rows affected.\n",
"1 rows affected.\n"
]
},
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\n",
"\n",
"\n",
"mpl.get_websocket_type = function() {\n",
" if (typeof(WebSocket) !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert('Your browser does not have WebSocket support.' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.');\n",
" };\n",
"}\n",
"\n",
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = (this.ws.binaryType != undefined);\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById(\"mpl-warnings\");\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent = (\n",
" \"This browser does not support binary websocket messages. \" +\n",
" \"Performance may be slow.\");\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" if (mpl.ratio != 1) {\n",
" fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
" }\n",
" fig.send_message(\"refresh\", {});\n",
" }\n",
"\n",
" this.imageObj.onload = function() {\n",
" if (fig.image_mode == 'full') {\n",
" // Full images could contain transparency (where diff images\n",
" // almost always do), so we need to clear the canvas so that\n",
" // there is no ghosting.\n",
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
" }\n",
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
" };\n",
"\n",
" this.imageObj.onunload = function() {\n",
" fig.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var backingStore = this.context.backingStorePixelRatio ||\n",
"\tthis.context.webkitBackingStorePixelRatio ||\n",
"\tthis.context.mozBackingStorePixelRatio ||\n",
"\tthis.context.msBackingStorePixelRatio ||\n",
"\tthis.context.oBackingStorePixelRatio ||\n",
"\tthis.context.backingStorePixelRatio || 1;\n",
"\n",
" mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width * mpl.ratio);\n",
" canvas.attr('height', height * mpl.ratio);\n",
" canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
" return false;\n",
" });\n",
"\n",
" function set_focus () {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'] / mpl.ratio;\n",
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
" var x1 = msg['x1'] / mpl.ratio;\n",
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x * mpl.ratio;\n",
" var y = canvas_pos.y * mpl.ratio;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" var width = fig.canvas.width/mpl.ratio\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var width = this.canvas.width/mpl.ratio\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" // select the cell after this one\n",
" var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
" IPython.notebook.select(index + 1);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\" width=\"720\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"1 rows affected.\n",
"1 rows affected.\n",
"1 rows affected.\n",
"1 rows affected.\n",
"1 rows affected.\n",
"1 rows affected.\n",
"1 rows affected.\n"
]
}
],
"source": [
"df_results = %sql SELECT * FROM iris_multi_model_info ORDER BY validation_loss ASC LIMIT 7;\n",
"df_results = df_results.DataFrame()\n",
"\n",
"df_summary = %sql SELECT * FROM iris_multi_model_summary;\n",
"df_summary = df_summary.DataFrame()\n",
"\n",
"#set up plots\n",
"fig, axs = plt.subplots(nrows=1, ncols=2, figsize=(10,5))\n",
"fig.legend(ncol=4)\n",
"fig.tight_layout()\n",
"\n",
"ax_metric = axs[0]\n",
"ax_loss = axs[1]\n",
"\n",
"ax_metric.xaxis.set_major_locator(MaxNLocator(integer=True))\n",
"ax_metric.set_xlabel('Iteration')\n",
"ax_metric.set_ylabel('Metric')\n",
"ax_metric.set_title('Validation metric curve')\n",
"\n",
"ax_loss.xaxis.set_major_locator(MaxNLocator(integer=True))\n",
"ax_loss.set_xlabel('Iteration')\n",
"ax_loss.set_ylabel('Loss')\n",
"ax_loss.set_title('Validation loss curve')\n",
"\n",
"iters = df_summary['metrics_iters'][0]\n",
"\n",
"for mst_key in df_results['mst_key']:\n",
" df_output_info = %sql SELECT validation_metrics,validation_loss FROM iris_multi_model_info WHERE mst_key = $mst_key\n",
" df_output_info = df_output_info.DataFrame()\n",
" validation_metrics = df_output_info['validation_metrics'][0]\n",
" validation_loss = df_output_info['validation_loss'][0]\n",
" \n",
" ax_metric.plot(iters, validation_metrics, label=mst_key, marker='o')\n",
" ax_loss.plot(iters, validation_loss, label=mst_key, marker='o')\n",
"\n",
"plt.legend();\n",
"# fig.savefig('./lc_keras_fit.png', dpi = 300)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a id=\"pred_prob\"></a>\n",
"# 2. Predict probabilities\n",
"\n",
"Predict with probabilities for each class:"
]
},
{
"cell_type": "code",
"execution_count": 30,
"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>3</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.9999932</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>3</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>6.7611923e-06</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>3</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>1.2535056e-10</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>10</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.9999808</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>10</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>1.9209425e-05</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>10</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>4.433645e-10</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.99998367</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>1.6334934e-05</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>4.3492965e-10</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>14</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.9999931</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>14</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>6.9504345e-06</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>14</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>1.9190094e-10</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.99999726</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>2.719827e-06</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>2.4018267e-11</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>20</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.9999982</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>20</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>1.8036015e-06</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>20</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>1.515534e-11</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>30</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.99996376</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>30</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>3.623055e-05</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>30</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>1.4014193e-09</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.99995685</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>4.3105167e-05</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>1.541236e-09</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>49</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.99999833</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>49</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>1.6733742e-06</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>49</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>1.0720992e-11</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>55</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.97456545</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>55</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.025385397</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>55</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>4.912654e-05</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>64</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.8837083</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>64</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.11627731</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>64</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>1.4444132e-05</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>70</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.9832433</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>70</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.016161945</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>70</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.0005947249</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>76</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.9934144</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>76</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.006202936</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>76</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.00038262276</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>82</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.9880006</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>82</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.01050145</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>82</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.0014980072</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>84</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.743757</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>84</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.25624287</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>84</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>1.1804799e-07</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>92</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.9489498</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>92</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.050999135</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>92</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>5.1051586e-05</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>98</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.9882598</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>98</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.011410431</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>98</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>0.00032975432</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.7122672</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.2864844</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.0012483773</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.8344315</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.16556835</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>4.9313943e-08</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>107</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.7617606</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>107</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.23823881</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>107</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>6.2156596e-07</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>114</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.85601324</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>114</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.1439867</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>114</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>3.4068247e-08</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.76065344</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.23934652</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>4.0775706e-08</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>121</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.65924823</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>121</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.34075174</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>121</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>3.7877243e-08</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.968423</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.031577036</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>1.5606285e-11</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>125</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.72842705</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>125</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.2715729</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>125</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>3.7875385e-08</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.8053533</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.19464317</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>3.5179064e-06</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.7297866</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.2702134</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>2.8784607e-08</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>147</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.5341273</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>147</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.4658725</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>147</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>2.3799986e-07</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>148</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.6266347</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>148</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.3733647</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>148</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>5.7692125e-07</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <td>149</td>\n",
" <td>class_text</td>\n",
" <td>Iris-virginica</td>\n",
" <td>0.5517554</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>149</td>\n",
" <td>class_text</td>\n",
" <td>Iris-versicolor</td>\n",
" <td>0.4482443</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>149</td>\n",
" <td>class_text</td>\n",
" <td>Iris-setosa</td>\n",
" <td>3.1108453e-07</td>\n",
" <td>3</td>\n",
" </tr>\n",
"</table>"
],
"text/plain": [
"[(3, u'class_text', u'Iris-setosa', 0.9999932, 1),\n",
" (3, u'class_text', u'Iris-versicolor', 6.7611923e-06, 2),\n",
" (3, u'class_text', u'Iris-virginica', 1.2535056e-10, 3),\n",
" (10, u'class_text', u'Iris-setosa', 0.9999808, 1),\n",
" (10, u'class_text', u'Iris-versicolor', 1.9209425e-05, 2),\n",
" (10, u'class_text', u'Iris-virginica', 4.433645e-10, 3),\n",
" (12, u'class_text', u'Iris-setosa', 0.99998367, 1),\n",
" (12, u'class_text', u'Iris-versicolor', 1.6334934e-05, 2),\n",
" (12, u'class_text', u'Iris-virginica', 4.3492965e-10, 3),\n",
" (14, u'class_text', u'Iris-setosa', 0.9999931, 1),\n",
" (14, u'class_text', u'Iris-versicolor', 6.9504345e-06, 2),\n",
" (14, u'class_text', u'Iris-virginica', 1.9190094e-10, 3),\n",
" (18, u'class_text', u'Iris-setosa', 0.99999726, 1),\n",
" (18, u'class_text', u'Iris-versicolor', 2.719827e-06, 2),\n",
" (18, u'class_text', u'Iris-virginica', 2.4018267e-11, 3),\n",
" (20, u'class_text', u'Iris-setosa', 0.9999982, 1),\n",
" (20, u'class_text', u'Iris-versicolor', 1.8036015e-06, 2),\n",
" (20, u'class_text', u'Iris-virginica', 1.515534e-11, 3),\n",
" (30, u'class_text', u'Iris-setosa', 0.99996376, 1),\n",
" (30, u'class_text', u'Iris-versicolor', 3.623055e-05, 2),\n",
" (30, u'class_text', u'Iris-virginica', 1.4014193e-09, 3),\n",
" (31, u'class_text', u'Iris-setosa', 0.99995685, 1),\n",
" (31, u'class_text', u'Iris-versicolor', 4.3105167e-05, 2),\n",
" (31, u'class_text', u'Iris-virginica', 1.541236e-09, 3),\n",
" (49, u'class_text', u'Iris-setosa', 0.99999833, 1),\n",
" (49, u'class_text', u'Iris-versicolor', 1.6733742e-06, 2),\n",
" (49, u'class_text', u'Iris-virginica', 1.0720992e-11, 3),\n",
" (55, u'class_text', u'Iris-versicolor', 0.97456545, 1),\n",
" (55, u'class_text', u'Iris-virginica', 0.025385397, 2),\n",
" (55, u'class_text', u'Iris-setosa', 4.912654e-05, 3),\n",
" (64, u'class_text', u'Iris-versicolor', 0.8837083, 1),\n",
" (64, u'class_text', u'Iris-virginica', 0.11627731, 2),\n",
" (64, u'class_text', u'Iris-setosa', 1.4444132e-05, 3),\n",
" (70, u'class_text', u'Iris-versicolor', 0.9832433, 1),\n",
" (70, u'class_text', u'Iris-virginica', 0.016161945, 2),\n",
" (70, u'class_text', u'Iris-setosa', 0.0005947249, 3),\n",
" (76, u'class_text', u'Iris-versicolor', 0.9934144, 1),\n",
" (76, u'class_text', u'Iris-virginica', 0.006202936, 2),\n",
" (76, u'class_text', u'Iris-setosa', 0.00038262276, 3),\n",
" (82, u'class_text', u'Iris-versicolor', 0.9880006, 1),\n",
" (82, u'class_text', u'Iris-virginica', 0.01050145, 2),\n",
" (82, u'class_text', u'Iris-setosa', 0.0014980072, 3),\n",
" (84, u'class_text', u'Iris-virginica', 0.743757, 1),\n",
" (84, u'class_text', u'Iris-versicolor', 0.25624287, 2),\n",
" (84, u'class_text', u'Iris-setosa', 1.1804799e-07, 3),\n",
" (92, u'class_text', u'Iris-versicolor', 0.9489498, 1),\n",
" (92, u'class_text', u'Iris-virginica', 0.050999135, 2),\n",
" (92, u'class_text', u'Iris-setosa', 5.1051586e-05, 3),\n",
" (98, u'class_text', u'Iris-versicolor', 0.9882598, 1),\n",
" (98, u'class_text', u'Iris-virginica', 0.011410431, 2),\n",
" (98, u'class_text', u'Iris-setosa', 0.00032975432, 3),\n",
" (99, u'class_text', u'Iris-versicolor', 0.7122672, 1),\n",
" (99, u'class_text', u'Iris-setosa', 0.2864844, 2),\n",
" (99, u'class_text', u'Iris-virginica', 0.0012483773, 3),\n",
" (102, u'class_text', u'Iris-virginica', 0.8344315, 1),\n",
" (102, u'class_text', u'Iris-versicolor', 0.16556835, 2),\n",
" (102, u'class_text', u'Iris-setosa', 4.9313943e-08, 3),\n",
" (107, u'class_text', u'Iris-virginica', 0.7617606, 1),\n",
" (107, u'class_text', u'Iris-versicolor', 0.23823881, 2),\n",
" (107, u'class_text', u'Iris-setosa', 6.2156596e-07, 3),\n",
" (114, u'class_text', u'Iris-virginica', 0.85601324, 1),\n",
" (114, u'class_text', u'Iris-versicolor', 0.1439867, 2),\n",
" (114, u'class_text', u'Iris-setosa', 3.4068247e-08, 3),\n",
" (117, u'class_text', u'Iris-virginica', 0.76065344, 1),\n",
" (117, u'class_text', u'Iris-versicolor', 0.23934652, 2),\n",
" (117, u'class_text', u'Iris-setosa', 4.0775706e-08, 3),\n",
" (121, u'class_text', u'Iris-virginica', 0.65924823, 1),\n",
" (121, u'class_text', u'Iris-versicolor', 0.34075174, 2),\n",
" (121, u'class_text', u'Iris-setosa', 3.7877243e-08, 3),\n",
" (123, u'class_text', u'Iris-virginica', 0.968423, 1),\n",
" (123, u'class_text', u'Iris-versicolor', 0.031577036, 2),\n",
" (123, u'class_text', u'Iris-setosa', 1.5606285e-11, 3),\n",
" (125, u'class_text', u'Iris-virginica', 0.72842705, 1),\n",
" (125, u'class_text', u'Iris-versicolor', 0.2715729, 2),\n",
" (125, u'class_text', u'Iris-setosa', 3.7875385e-08, 3),\n",
" (127, u'class_text', u'Iris-versicolor', 0.8053533, 1),\n",
" (127, u'class_text', u'Iris-virginica', 0.19464317, 2),\n",
" (127, u'class_text', u'Iris-setosa', 3.5179064e-06, 3),\n",
" (145, u'class_text', u'Iris-virginica', 0.7297866, 1),\n",
" (145, u'class_text', u'Iris-versicolor', 0.2702134, 2),\n",
" (145, u'class_text', u'Iris-setosa', 2.8784607e-08, 3),\n",
" (147, u'class_text', u'Iris-virginica', 0.5341273, 1),\n",
" (147, u'class_text', u'Iris-versicolor', 0.4658725, 2),\n",
" (147, u'class_text', u'Iris-setosa', 2.3799986e-07, 3),\n",
" (148, u'class_text', u'Iris-versicolor', 0.6266347, 1),\n",
" (148, u'class_text', u'Iris-virginica', 0.3733647, 2),\n",
" (148, u'class_text', u'Iris-setosa', 5.7692125e-07, 3),\n",
" (149, u'class_text', u'Iris-virginica', 0.5517554, 1),\n",
" (149, u'class_text', u'Iris-versicolor', 0.4482443, 2),\n",
" (149, u'class_text', u'Iris-setosa', 3.1108453e-07, 3)]"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%sql\n",
"DROP TABLE IF EXISTS iris_predict;\n",
"\n",
"SELECT madlib.madlib_keras_predict('iris_multi_model', -- model\n",
" 'iris_test', -- test_table\n",
" 'id', -- id column\n",
" 'attributes', -- independent var\n",
" 'iris_predict', -- output table\n",
" 'prob', -- prediction type\n",
" FALSE, -- use gpus\n",
" 3 -- mst_key to use\n",
" );\n",
"\n",
"SELECT * FROM iris_predict ORDER BY id, rank;"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a id=\"warm_start\"></a>\n",
"# 3. Warm start\n",
"\n",
"Next, use the warm_start parameter to continue learning, using the coefficients from the run above. Note that we don't drop the model table or model summary table:"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1 rows affected.\n"
]
},
{
"data": {
"text/html": [
"<table>\n",
" <tr>\n",
" <th>madlib_keras_fit_multiple_model</th>\n",
" </tr>\n",
" <tr>\n",
" <td></td>\n",
" </tr>\n",
"</table>"
],
"text/plain": [
"[('',)]"
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%sql\n",
"SELECT madlib.madlib_keras_fit_multiple_model('iris_train_packed', -- source_table\n",
" 'iris_multi_model', -- model_output_table\n",
" 'mst_table', -- model_selection_table\n",
" 3, -- num_iterations\n",
" FALSE, -- use gpus\n",
" 'iris_test_packed', -- validation dataset\n",
" 1, -- metrics compute frequency\n",
" TRUE, -- warm start\n",
" 'Sophie L.', -- name\n",
" 'Simple MLP for iris dataset' -- description\n",
" );"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"View summary:"
]
},
{
"cell_type": "code",
"execution_count": 32,
"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>validation_table</th>\n",
" <th>model</th>\n",
" <th>model_info</th>\n",
" <th>dependent_varname</th>\n",
" <th>independent_varname</th>\n",
" <th>model_arch_table</th>\n",
" <th>model_selection_table</th>\n",
" <th>object_table</th>\n",
" <th>num_iterations</th>\n",
" <th>metrics_compute_frequency</th>\n",
" <th>warm_start</th>\n",
" <th>name</th>\n",
" <th>description</th>\n",
" <th>start_training_time</th>\n",
" <th>end_training_time</th>\n",
" <th>madlib_version</th>\n",
" <th>num_classes</th>\n",
" <th>class_text_class_values</th>\n",
" <th>dependent_vartype</th>\n",
" <th>normalizing_const</th>\n",
" <th>metrics_iters</th>\n",
" </tr>\n",
" <tr>\n",
" <td>iris_train_packed</td>\n",
" <td>iris_test_packed</td>\n",
" <td>iris_multi_model</td>\n",
" <td>iris_multi_model_info</td>\n",
" <td>[u'class_text']</td>\n",
" <td>[u'attributes']</td>\n",
" <td>model_arch_library</td>\n",
" <td>mst_table</td>\n",
" <td>None</td>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>True</td>\n",
" <td>Sophie L.</td>\n",
" <td>Simple MLP for iris dataset</td>\n",
" <td>2021-03-06 00:55:34.010762</td>\n",
" <td>2021-03-06 00:56:20.576330</td>\n",
" <td>1.18.0-dev</td>\n",
" <td>[1]</td>\n",
" <td>[u'Iris-setosa', u'Iris-versicolor', u'Iris-virginica']</td>\n",
" <td>[u'character varying']</td>\n",
" <td>1.0</td>\n",
" <td>[1, 2, 3]</td>\n",
" </tr>\n",
"</table>"
],
"text/plain": [
"[(u'iris_train_packed', u'iris_test_packed', u'iris_multi_model', u'iris_multi_model_info', [u'class_text'], [u'attributes'], u'model_arch_library', u'mst_table', None, 3, 1, True, u'Sophie L.', u'Simple MLP for iris dataset', datetime.datetime(2021, 3, 6, 0, 55, 34, 10762), datetime.datetime(2021, 3, 6, 0, 56, 20, 576330), u'1.18.0-dev', [1], [u'Iris-setosa', u'Iris-versicolor', u'Iris-virginica'], [u'character varying'], 1.0, [1, 2, 3])]"
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%sql\n",
"SELECT * FROM iris_multi_model_summary;"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"View performance of each model:"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"12 rows affected.\n"
]
},
{
"data": {
"text/html": [
"<table>\n",
" <tr>\n",
" <th>mst_key</th>\n",
" <th>model_id</th>\n",
" <th>compile_params</th>\n",
" <th>fit_params</th>\n",
" <th>model_type</th>\n",
" <th>model_size</th>\n",
" <th>metrics_elapsed_time</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",
" </tr>\n",
" <tr>\n",
" <td>9</td>\n",
" <td>2</td>\n",
" <td>optimizer='Adam(lr=0.01)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
" <td>epochs=1,batch_size=4</td>\n",
" <td>madlib_keras</td>\n",
" <td>1.18359375</td>\n",
" <td>[12.8246030807495, 28.3149819374084, 43.8511519432068]</td>\n",
" <td>[u'accuracy']</td>\n",
" <td>categorical_crossentropy</td>\n",
" <td>0.949999988079</td>\n",
" <td>0.125932246447</td>\n",
" <td>[0.983333349227905, 0.908333361148834, 0.949999988079071]</td>\n",
" <td>[0.0759517326951027, 0.280529856681824, 0.125932246446609]</td>\n",
" <td>0.966666638851</td>\n",
" <td>0.262804627419</td>\n",
" <td>[0.966666638851166, 0.933333337306976, 0.966666638851166]</td>\n",
" <td>[0.115140154957771, 0.282798647880554, 0.262804627418518]</td>\n",
" </tr>\n",
" <tr>\n",
" <td>7</td>\n",
" <td>2</td>\n",
" <td>optimizer='Adam(lr=0.001)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
" <td>epochs=1,batch_size=4</td>\n",
" <td>madlib_keras</td>\n",
" <td>1.18359375</td>\n",
" <td>[12.3267669677734, 27.5790538787842, 43.3719210624695]</td>\n",
" <td>[u'accuracy']</td>\n",
" <td>categorical_crossentropy</td>\n",
" <td>0.958333313465</td>\n",
" <td>0.646220803261</td>\n",
" <td>[0.916666686534882, 0.774999976158142, 0.958333313465118]</td>\n",
" <td>[0.760809063911438, 0.70676600933075, 0.646220803260803]</td>\n",
" <td>0.966666638851</td>\n",
" <td>0.676706075668</td>\n",
" <td>[0.899999976158142, 0.699999988079071, 0.966666638851166]</td>\n",
" <td>[0.789911270141602, 0.741125166416168, 0.676706075668335]</td>\n",
" </tr>\n",
" <tr>\n",
" <td>6</td>\n",
" <td>1</td>\n",
" <td>optimizer='Adam(lr=0.1)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
" <td>epochs=1,batch_size=8</td>\n",
" <td>madlib_keras</td>\n",
" <td>0.75390625</td>\n",
" <td>[13.8655989170074, 29.3921880722046, 45.186311006546]</td>\n",
" <td>[u'accuracy']</td>\n",
" <td>categorical_crossentropy</td>\n",
" <td>0.966666638851</td>\n",
" <td>0.161019146442</td>\n",
" <td>[0.608333349227905, 0.975000023841858, 0.966666638851166]</td>\n",
" <td>[0.656926870346069, 0.154457986354828, 0.161019146442413]</td>\n",
" <td>0.966666638851</td>\n",
" <td>0.184286847711</td>\n",
" <td>[0.666666686534882, 0.966666638851166, 0.966666638851166]</td>\n",
" <td>[0.60343611240387, 0.166501134634018, 0.184286847710609]</td>\n",
" </tr>\n",
" <tr>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>optimizer='Adam(lr=0.01)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
" <td>epochs=1,batch_size=4</td>\n",
" <td>madlib_keras</td>\n",
" <td>0.75390625</td>\n",
" <td>[12.5584180355072, 27.7957689762115, 43.5938129425049]</td>\n",
" <td>[u'accuracy']</td>\n",
" <td>categorical_crossentropy</td>\n",
" <td>0.925000011921</td>\n",
" <td>0.125614732504</td>\n",
" <td>[0.850000023841858, 0.908333361148834, 0.925000011920929]</td>\n",
" <td>[0.311796188354492, 0.228279903531075, 0.125614732503891]</td>\n",
" <td>0.933333337307</td>\n",
" <td>0.205575048923</td>\n",
" <td>[0.699999988079071, 0.899999976158142, 0.933333337306976]</td>\n",
" <td>[0.434732705354691, 0.278642177581787, 0.205575048923492]</td>\n",
" </tr>\n",
" <tr>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>optimizer='Adam(lr=0.001)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
" <td>epochs=1,batch_size=4</td>\n",
" <td>madlib_keras</td>\n",
" <td>0.75390625</td>\n",
" <td>[14.3016650676727, 29.8289239406586, 45.6773319244385]</td>\n",
" <td>[u'accuracy']</td>\n",
" <td>categorical_crossentropy</td>\n",
" <td>0.916666686535</td>\n",
" <td>0.680241525173</td>\n",
" <td>[0.899999976158142, 0.899999976158142, 0.916666686534882]</td>\n",
" <td>[0.75947380065918, 0.717410624027252, 0.680241525173187]</td>\n",
" <td>0.933333337307</td>\n",
" <td>0.685820519924</td>\n",
" <td>[0.933333337306976, 0.933333337306976, 0.933333337306976]</td>\n",
" <td>[0.764581918716431, 0.718774557113647, 0.685820519924164]</td>\n",
" </tr>\n",
" <tr>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>optimizer='Adam(lr=0.001)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
" <td>epochs=1,batch_size=8</td>\n",
" <td>madlib_keras</td>\n",
" <td>0.75390625</td>\n",
" <td>[13.6457929611206, 29.1624140739441, 44.9534199237823]</td>\n",
" <td>[u'accuracy']</td>\n",
" <td>categorical_crossentropy</td>\n",
" <td>0.891666650772</td>\n",
" <td>0.590237081051</td>\n",
" <td>[0.824999988079071, 0.783333361148834, 0.891666650772095]</td>\n",
" <td>[0.666068911552429, 0.633061707019806, 0.590237081050873]</td>\n",
" <td>0.899999976158</td>\n",
" <td>0.576045572758</td>\n",
" <td>[0.866666674613953, 0.866666674613953, 0.899999976158142]</td>\n",
" <td>[0.645683944225311, 0.608498632907867, 0.576045572757721]</td>\n",
" </tr>\n",
" <tr>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" <td>optimizer='Adam(lr=0.01)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
" <td>epochs=1,batch_size=8</td>\n",
" <td>madlib_keras</td>\n",
" <td>0.75390625</td>\n",
" <td>[14.0837008953094, 29.6097829341888, 45.4142129421234]</td>\n",
" <td>[u'accuracy']</td>\n",
" <td>categorical_crossentropy</td>\n",
" <td>0.916666686535</td>\n",
" <td>0.174454689026</td>\n",
" <td>[0.949999988079071, 0.958333313465118, 0.916666686534882]</td>\n",
" <td>[0.166735425591469, 0.141851797699928, 0.174454689025879]</td>\n",
" <td>0.899999976158</td>\n",
" <td>0.219132959843</td>\n",
" <td>[0.966666638851166, 0.933333337306976, 0.899999976158142]</td>\n",
" <td>[0.186790466308594, 0.176578417420387, 0.219132959842682]</td>\n",
" </tr>\n",
" <tr>\n",
" <td>10</td>\n",
" <td>2</td>\n",
" <td>optimizer='Adam(lr=0.01)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
" <td>epochs=1,batch_size=8</td>\n",
" <td>madlib_keras</td>\n",
" <td>1.18359375</td>\n",
" <td>[13.1594960689545, 28.5860660076141, 44.1881170272827]</td>\n",
" <td>[u'accuracy']</td>\n",
" <td>categorical_crossentropy</td>\n",
" <td>0.866666674614</td>\n",
" <td>0.285291582346</td>\n",
" <td>[0.774999976158142, 0.949999988079071, 0.866666674613953]</td>\n",
" <td>[0.441815197467804, 0.140827313065529, 0.285291582345963]</td>\n",
" <td>0.866666674614</td>\n",
" <td>0.246576815844</td>\n",
" <td>[0.766666650772095, 0.966666638851166, 0.866666674613953]</td>\n",
" <td>[0.4128278195858, 0.146319955587387, 0.246576815843582]</td>\n",
" </tr>\n",
" <tr>\n",
" <td>8</td>\n",
" <td>2</td>\n",
" <td>optimizer='Adam(lr=0.001)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
" <td>epochs=1,batch_size=8</td>\n",
" <td>madlib_keras</td>\n",
" <td>1.18359375</td>\n",
" <td>[14.5546190738678, 30.0798380374908, 45.94082903862]</td>\n",
" <td>[u'accuracy']</td>\n",
" <td>categorical_crossentropy</td>\n",
" <td>0.850000023842</td>\n",
" <td>0.675731360912</td>\n",
" <td>[0.791666686534882, 0.841666638851166, 0.850000023841858]</td>\n",
" <td>[0.746130049228668, 0.706377267837524, 0.675731360912323]</td>\n",
" <td>0.866666674614</td>\n",
" <td>0.650432705879</td>\n",
" <td>[0.866666674613953, 0.866666674613953, 0.866666674613953]</td>\n",
" <td>[0.712817847728729, 0.677974581718445, 0.650432705879211]</td>\n",
" </tr>\n",
" <tr>\n",
" <td>11</td>\n",
" <td>2</td>\n",
" <td>optimizer='Adam(lr=0.1)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
" <td>epochs=1,batch_size=4</td>\n",
" <td>madlib_keras</td>\n",
" <td>1.18359375</td>\n",
" <td>[15.3575170040131, 30.5435180664062, 46.5635209083557]</td>\n",
" <td>[u'accuracy']</td>\n",
" <td>categorical_crossentropy</td>\n",
" <td>0.658333361149</td>\n",
" <td>0.45723798871</td>\n",
" <td>[0.658333361148834, 0.683333337306976, 0.658333361148834]</td>\n",
" <td>[0.457635939121246, 0.455960959196091, 0.457237988710403]</td>\n",
" <td>0.699999988079</td>\n",
" <td>0.48275628686</td>\n",
" <td>[0.699999988079071, 0.600000023841858, 0.699999988079071]</td>\n",
" <td>[0.48207613825798, 0.491984754800797, 0.482756286859512]</td>\n",
" </tr>\n",
" <tr>\n",
" <td>5</td>\n",
" <td>1</td>\n",
" <td>optimizer='Adam(lr=0.1)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
" <td>epochs=1,batch_size=4</td>\n",
" <td>madlib_keras</td>\n",
" <td>0.75390625</td>\n",
" <td>[14.8466219902039, 30.2953569889069, 46.1656670570374]</td>\n",
" <td>[u'accuracy']</td>\n",
" <td>categorical_crossentropy</td>\n",
" <td>0.683333337307</td>\n",
" <td>0.456283688545</td>\n",
" <td>[0.925000011920929, 0.899999976158142, 0.683333337306976]</td>\n",
" <td>[0.224153310060501, 0.295417010784149, 0.456283688545227]</td>\n",
" <td>0.600000023842</td>\n",
" <td>0.494575560093</td>\n",
" <td>[0.966666638851166, 0.899999976158142, 0.600000023841858]</td>\n",
" <td>[0.227903217077255, 0.345975488424301, 0.494575560092926]</td>\n",
" </tr>\n",
" <tr>\n",
" <td>12</td>\n",
" <td>2</td>\n",
" <td>optimizer='Adam(lr=0.1)',metrics=['accuracy'],loss='categorical_crossentropy'</td>\n",
" <td>epochs=1,batch_size=8</td>\n",
" <td>madlib_keras</td>\n",
" <td>1.18359375</td>\n",
" <td>[13.4095330238342, 28.938658952713, 44.7153990268707]</td>\n",
" <td>[u'accuracy']</td>\n",
" <td>categorical_crossentropy</td>\n",
" <td>0.691666662693</td>\n",
" <td>0.528191685677</td>\n",
" <td>[0.708333313465118, 0.966666638851166, 0.691666662693024]</td>\n",
" <td>[0.395545929670334, 0.100506067276001, 0.528191685676575]</td>\n",
" <td>0.566666662693</td>\n",
" <td>0.720313131809</td>\n",
" <td>[0.633333325386047, 0.966666638851166, 0.566666662693024]</td>\n",
" <td>[0.508394777774811, 0.130626574158669, 0.720313131809235]</td>\n",
" </tr>\n",
"</table>"
],
"text/plain": [
"[(9, 2, u\"optimizer='Adam(lr=0.01)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=4', u'madlib_keras', 1.18359375, [12.8246030807495, 28.3149819374084, 43.8511519432068], [u'accuracy'], u'categorical_crossentropy', 0.949999988079071, 0.125932246446609, [0.983333349227905, 0.908333361148834, 0.949999988079071], [0.0759517326951027, 0.280529856681824, 0.125932246446609], 0.966666638851166, 0.262804627418518, [0.966666638851166, 0.933333337306976, 0.966666638851166], [0.115140154957771, 0.282798647880554, 0.262804627418518]),\n",
" (7, 2, u\"optimizer='Adam(lr=0.001)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=4', u'madlib_keras', 1.18359375, [12.3267669677734, 27.5790538787842, 43.3719210624695], [u'accuracy'], u'categorical_crossentropy', 0.958333313465118, 0.646220803260803, [0.916666686534882, 0.774999976158142, 0.958333313465118], [0.760809063911438, 0.70676600933075, 0.646220803260803], 0.966666638851166, 0.676706075668335, [0.899999976158142, 0.699999988079071, 0.966666638851166], [0.789911270141602, 0.741125166416168, 0.676706075668335]),\n",
" (6, 1, u\"optimizer='Adam(lr=0.1)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=8', u'madlib_keras', 0.75390625, [13.8655989170074, 29.3921880722046, 45.186311006546], [u'accuracy'], u'categorical_crossentropy', 0.966666638851166, 0.161019146442413, [0.608333349227905, 0.975000023841858, 0.966666638851166], [0.656926870346069, 0.154457986354828, 0.161019146442413], 0.966666638851166, 0.184286847710609, [0.666666686534882, 0.966666638851166, 0.966666638851166], [0.60343611240387, 0.166501134634018, 0.184286847710609]),\n",
" (3, 1, u\"optimizer='Adam(lr=0.01)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=4', u'madlib_keras', 0.75390625, [12.5584180355072, 27.7957689762115, 43.5938129425049], [u'accuracy'], u'categorical_crossentropy', 0.925000011920929, 0.125614732503891, [0.850000023841858, 0.908333361148834, 0.925000011920929], [0.311796188354492, 0.228279903531075, 0.125614732503891], 0.933333337306976, 0.205575048923492, [0.699999988079071, 0.899999976158142, 0.933333337306976], [0.434732705354691, 0.278642177581787, 0.205575048923492]),\n",
" (1, 1, u\"optimizer='Adam(lr=0.001)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=4', u'madlib_keras', 0.75390625, [14.3016650676727, 29.8289239406586, 45.6773319244385], [u'accuracy'], u'categorical_crossentropy', 0.916666686534882, 0.680241525173187, [0.899999976158142, 0.899999976158142, 0.916666686534882], [0.75947380065918, 0.717410624027252, 0.680241525173187], 0.933333337306976, 0.685820519924164, [0.933333337306976, 0.933333337306976, 0.933333337306976], [0.764581918716431, 0.718774557113647, 0.685820519924164]),\n",
" (2, 1, u\"optimizer='Adam(lr=0.001)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=8', u'madlib_keras', 0.75390625, [13.6457929611206, 29.1624140739441, 44.9534199237823], [u'accuracy'], u'categorical_crossentropy', 0.891666650772095, 0.590237081050873, [0.824999988079071, 0.783333361148834, 0.891666650772095], [0.666068911552429, 0.633061707019806, 0.590237081050873], 0.899999976158142, 0.576045572757721, [0.866666674613953, 0.866666674613953, 0.899999976158142], [0.645683944225311, 0.608498632907867, 0.576045572757721]),\n",
" (4, 1, u\"optimizer='Adam(lr=0.01)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=8', u'madlib_keras', 0.75390625, [14.0837008953094, 29.6097829341888, 45.4142129421234], [u'accuracy'], u'categorical_crossentropy', 0.916666686534882, 0.174454689025879, [0.949999988079071, 0.958333313465118, 0.916666686534882], [0.166735425591469, 0.141851797699928, 0.174454689025879], 0.899999976158142, 0.219132959842682, [0.966666638851166, 0.933333337306976, 0.899999976158142], [0.186790466308594, 0.176578417420387, 0.219132959842682]),\n",
" (10, 2, u\"optimizer='Adam(lr=0.01)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=8', u'madlib_keras', 1.18359375, [13.1594960689545, 28.5860660076141, 44.1881170272827], [u'accuracy'], u'categorical_crossentropy', 0.866666674613953, 0.285291582345963, [0.774999976158142, 0.949999988079071, 0.866666674613953], [0.441815197467804, 0.140827313065529, 0.285291582345963], 0.866666674613953, 0.246576815843582, [0.766666650772095, 0.966666638851166, 0.866666674613953], [0.4128278195858, 0.146319955587387, 0.246576815843582]),\n",
" (8, 2, u\"optimizer='Adam(lr=0.001)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=8', u'madlib_keras', 1.18359375, [14.5546190738678, 30.0798380374908, 45.94082903862], [u'accuracy'], u'categorical_crossentropy', 0.850000023841858, 0.675731360912323, [0.791666686534882, 0.841666638851166, 0.850000023841858], [0.746130049228668, 0.706377267837524, 0.675731360912323], 0.866666674613953, 0.650432705879211, [0.866666674613953, 0.866666674613953, 0.866666674613953], [0.712817847728729, 0.677974581718445, 0.650432705879211]),\n",
" (11, 2, u\"optimizer='Adam(lr=0.1)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=4', u'madlib_keras', 1.18359375, [15.3575170040131, 30.5435180664062, 46.5635209083557], [u'accuracy'], u'categorical_crossentropy', 0.658333361148834, 0.457237988710403, [0.658333361148834, 0.683333337306976, 0.658333361148834], [0.457635939121246, 0.455960959196091, 0.457237988710403], 0.699999988079071, 0.482756286859512, [0.699999988079071, 0.600000023841858, 0.699999988079071], [0.48207613825798, 0.491984754800797, 0.482756286859512]),\n",
" (5, 1, u\"optimizer='Adam(lr=0.1)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=4', u'madlib_keras', 0.75390625, [14.8466219902039, 30.2953569889069, 46.1656670570374], [u'accuracy'], u'categorical_crossentropy', 0.683333337306976, 0.456283688545227, [0.925000011920929, 0.899999976158142, 0.683333337306976], [0.224153310060501, 0.295417010784149, 0.456283688545227], 0.600000023841858, 0.494575560092926, [0.966666638851166, 0.899999976158142, 0.600000023841858], [0.227903217077255, 0.345975488424301, 0.494575560092926]),\n",
" (12, 2, u\"optimizer='Adam(lr=0.1)',metrics=['accuracy'],loss='categorical_crossentropy'\", u'epochs=1,batch_size=8', u'madlib_keras', 1.18359375, [13.4095330238342, 28.938658952713, 44.7153990268707], [u'accuracy'], u'categorical_crossentropy', 0.691666662693024, 0.528191685676575, [0.708333313465118, 0.966666638851166, 0.691666662693024], [0.395545929670334, 0.100506067276001, 0.528191685676575], 0.566666662693024, 0.720313131809235, [0.633333325386047, 0.966666638851166, 0.566666662693024], [0.508394777774811, 0.130626574158669, 0.720313131809235])]"
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%sql\n",
"SELECT * FROM iris_multi_model_info ORDER BY validation_metrics_final DESC;"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Plot validation results:"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"7 rows affected.\n",
"1 rows affected.\n"
]
},
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\n",
"\n",
"\n",
"mpl.get_websocket_type = function() {\n",
" if (typeof(WebSocket) !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert('Your browser does not have WebSocket support.' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.');\n",
" };\n",
"}\n",
"\n",
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = (this.ws.binaryType != undefined);\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById(\"mpl-warnings\");\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent = (\n",
" \"This browser does not support binary websocket messages. \" +\n",
" \"Performance may be slow.\");\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" if (mpl.ratio != 1) {\n",
" fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
" }\n",
" fig.send_message(\"refresh\", {});\n",
" }\n",
"\n",
" this.imageObj.onload = function() {\n",
" if (fig.image_mode == 'full') {\n",
" // Full images could contain transparency (where diff images\n",
" // almost always do), so we need to clear the canvas so that\n",
" // there is no ghosting.\n",
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
" }\n",
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
" };\n",
"\n",
" this.imageObj.onunload = function() {\n",
" fig.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var backingStore = this.context.backingStorePixelRatio ||\n",
"\tthis.context.webkitBackingStorePixelRatio ||\n",
"\tthis.context.mozBackingStorePixelRatio ||\n",
"\tthis.context.msBackingStorePixelRatio ||\n",
"\tthis.context.oBackingStorePixelRatio ||\n",
"\tthis.context.backingStorePixelRatio || 1;\n",
"\n",
" mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width * mpl.ratio);\n",
" canvas.attr('height', height * mpl.ratio);\n",
" canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
" return false;\n",
" });\n",
"\n",
" function set_focus () {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'] / mpl.ratio;\n",
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
" var x1 = msg['x1'] / mpl.ratio;\n",
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x * mpl.ratio;\n",
" var y = canvas_pos.y * mpl.ratio;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" var width = fig.canvas.width/mpl.ratio\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var width = this.canvas.width/mpl.ratio\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" // select the cell after this one\n",
" var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
" IPython.notebook.select(index + 1);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\" width=\"720\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"1 rows affected.\n",
"1 rows affected.\n",
"1 rows affected.\n",
"1 rows affected.\n",
"1 rows affected.\n",
"1 rows affected.\n",
"1 rows affected.\n"
]
}
],
"source": [
"df_results = %sql SELECT * FROM iris_multi_model_info ORDER BY validation_loss ASC LIMIT 7;\n",
"df_results = df_results.DataFrame()\n",
"\n",
"df_summary = %sql SELECT * FROM iris_multi_model_summary;\n",
"df_summary = df_summary.DataFrame()\n",
"\n",
"#set up plots\n",
"fig, axs = plt.subplots(nrows=1, ncols=2, figsize=(10,5))\n",
"fig.legend(ncol=4)\n",
"fig.tight_layout()\n",
"\n",
"ax_metric = axs[0]\n",
"ax_loss = axs[1]\n",
"\n",
"ax_metric.xaxis.set_major_locator(MaxNLocator(integer=True))\n",
"ax_metric.set_xlabel('Iteration')\n",
"ax_metric.set_ylabel('Metric')\n",
"ax_metric.set_title('Validation metric curve')\n",
"\n",
"ax_loss.xaxis.set_major_locator(MaxNLocator(integer=True))\n",
"ax_loss.set_xlabel('Iteration')\n",
"ax_loss.set_ylabel('Loss')\n",
"ax_loss.set_title('Validation loss curve')\n",
"\n",
"iters = df_summary['metrics_iters'][0]\n",
"\n",
"for mst_key in df_results['mst_key']:\n",
" df_output_info = %sql SELECT validation_metrics,validation_loss FROM iris_multi_model_info WHERE mst_key = $mst_key\n",
" df_output_info = df_output_info.DataFrame()\n",
" validation_metrics = df_output_info['validation_metrics'][0]\n",
" validation_loss = df_output_info['validation_loss'][0]\n",
" \n",
" ax_metric.plot(iters, validation_metrics, label=mst_key, marker='o')\n",
" ax_loss.plot(iters, validation_loss, label=mst_key, marker='o')\n",
"\n",
"plt.legend();\n",
"# fig.savefig('./lc_keras_fit.png', dpi = 300)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.16"
}
},
"nbformat": 4,
"nbformat_minor": 1
}