-
-
Save minya/0c6013bf44b6ff2adabd to your computer and use it in GitHub Desktop.
Лабораторная 2
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{"nbformat_minor": 0, "metadata": {"language_info": {"file_extension": ".py", "mimetype": "text/x-python", "nbconvert_exporter": "python", "version": "3.4.1", "name": "python", "pygments_lexer": "ipython3", "codemirror_mode": {"name": "ipython", "version": 3}}, "kernelspec": {"language": "python", "name": "python3", "display_name": "Python 3"}}, "cells": [{"cell_type": "markdown", "metadata": {}, "source": "# \u041b\u0430\u0431\u043e\u0440\u0430\u0442\u043e\u0440\u043d\u0430\u044f 2\n# \u0411\u0440\u0435\u043b\u044c \u041c\u0438\u0445\u0430\u0438\u043b"}, {"cell_type": "markdown", "metadata": {}, "source": "# 1. \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445"}, {"outputs": [{"metadata": {}, "data": {"text/plain": " word_freq_make word_freq_address word_freq_all word_freq_3d \\\n0 0.00 0.64 0.64 0 \n1 0.21 0.28 0.50 0 \n2 0.06 0.00 0.71 0 \n3 0.00 0.00 0.00 0 \n4 0.00 0.00 0.00 0 \n\n word_freq_our word_freq_over word_freq_remove word_freq_internet \\\n0 0.32 0.00 0.00 0.00 \n1 0.14 0.28 0.21 0.07 \n2 1.23 0.19 0.19 0.12 \n3 0.63 0.00 0.31 0.63 \n4 0.63 0.00 0.31 0.63 \n\n word_freq_order word_freq_mail ... char_freq_; char_freq_( \\\n0 0.00 0.00 ... 0.00 0.000 \n1 0.00 0.94 ... 0.00 0.132 \n2 0.64 0.25 ... 0.01 0.143 \n3 0.31 0.63 ... 0.00 0.137 \n4 0.31 0.63 ... 0.00 0.135 \n\n char_freq_[ char_freq_! char_freq_$ char_freq_# \\\n0 0 0.778 0.000 0.000 \n1 0 0.372 0.180 0.048 \n2 0 0.276 0.184 0.010 \n3 0 0.137 0.000 0.000 \n4 0 0.135 0.000 0.000 \n\n capital_run_length_average capital_run_length_longest \\\n0 3.756 61 \n1 5.114 101 \n2 9.821 485 \n3 3.537 40 \n4 3.537 40 \n\n capital_run_length_total spam \n0 278 1 \n1 1028 1 \n2 2259 1 \n3 191 1 \n4 191 1 \n\n[5 rows x 58 columns]", "text/html": "<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>word_freq_make</th>\n <th>word_freq_address</th>\n <th>word_freq_all</th>\n <th>word_freq_3d</th>\n <th>word_freq_our</th>\n <th>word_freq_over</th>\n <th>word_freq_remove</th>\n <th>word_freq_internet</th>\n <th>word_freq_order</th>\n <th>word_freq_mail</th>\n <th>...</th>\n <th>char_freq_;</th>\n <th>char_freq_(</th>\n <th>char_freq_[</th>\n <th>char_freq_!</th>\n <th>char_freq_$</th>\n <th>char_freq_#</th>\n <th>capital_run_length_average</th>\n <th>capital_run_length_longest</th>\n <th>capital_run_length_total</th>\n <th>spam</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td> 0.00</td>\n <td> 0.64</td>\n <td> 0.64</td>\n <td> 0</td>\n <td> 0.32</td>\n <td> 0.00</td>\n <td> 0.00</td>\n <td> 0.00</td>\n <td> 0.00</td>\n <td> 0.00</td>\n <td>...</td>\n <td> 0.00</td>\n <td> 0.000</td>\n <td> 0</td>\n <td> 0.778</td>\n <td> 0.000</td>\n <td> 0.000</td>\n <td> 3.756</td>\n <td> 61</td>\n <td> 278</td>\n <td> 1</td>\n </tr>\n <tr>\n <th>1</th>\n <td> 0.21</td>\n <td> 0.28</td>\n <td> 0.50</td>\n <td> 0</td>\n <td> 0.14</td>\n <td> 0.28</td>\n <td> 0.21</td>\n <td> 0.07</td>\n <td> 0.00</td>\n <td> 0.94</td>\n <td>...</td>\n <td> 0.00</td>\n <td> 0.132</td>\n <td> 0</td>\n <td> 0.372</td>\n <td> 0.180</td>\n <td> 0.048</td>\n <td> 5.114</td>\n <td> 101</td>\n <td> 1028</td>\n <td> 1</td>\n </tr>\n <tr>\n <th>2</th>\n <td> 0.06</td>\n <td> 0.00</td>\n <td> 0.71</td>\n <td> 0</td>\n <td> 1.23</td>\n <td> 0.19</td>\n <td> 0.19</td>\n <td> 0.12</td>\n <td> 0.64</td>\n <td> 0.25</td>\n <td>...</td>\n <td> 0.01</td>\n <td> 0.143</td>\n <td> 0</td>\n <td> 0.276</td>\n <td> 0.184</td>\n <td> 0.010</td>\n <td> 9.821</td>\n <td> 485</td>\n <td> 2259</td>\n <td> 1</td>\n </tr>\n <tr>\n <th>3</th>\n <td> 0.00</td>\n <td> 0.00</td>\n <td> 0.00</td>\n <td> 0</td>\n <td> 0.63</td>\n <td> 0.00</td>\n <td> 0.31</td>\n <td> 0.63</td>\n <td> 0.31</td>\n <td> 0.63</td>\n <td>...</td>\n <td> 0.00</td>\n <td> 0.137</td>\n <td> 0</td>\n <td> 0.137</td>\n <td> 0.000</td>\n <td> 0.000</td>\n <td> 3.537</td>\n <td> 40</td>\n <td> 191</td>\n <td> 1</td>\n </tr>\n <tr>\n <th>4</th>\n <td> 0.00</td>\n <td> 0.00</td>\n <td> 0.00</td>\n <td> 0</td>\n <td> 0.63</td>\n <td> 0.00</td>\n <td> 0.31</td>\n <td> 0.63</td>\n <td> 0.31</td>\n <td> 0.63</td>\n <td>...</td>\n <td> 0.00</td>\n <td> 0.135</td>\n <td> 0</td>\n <td> 0.135</td>\n <td> 0.000</td>\n <td> 0.000</td>\n <td> 3.537</td>\n <td> 40</td>\n <td> 191</td>\n <td> 1</td>\n </tr>\n </tbody>\n</table>\n<p>5 rows \u00d7 58 columns</p>\n</div>"}, "execution_count": 1, "output_type": "execute_result"}], "cell_type": "code", "metadata": {"trusted": false, "collapsed": false}, "source": "import pandas\nfrom urllib.request import urlopen\n\nSPAMBASE_NAMES_URL = 'https://archive.ics.uci.edu/ml/machine-learning-databases/spambase/spambase.names'\nSPAMBASE_DATA_URL = 'https://archive.ics.uci.edu/ml/machine-learning-databases/spambase/spambase.data'\n\nlines = urlopen(SPAMBASE_NAMES_URL).readlines()[33:]\n\nfeature_names = [\n str(line, 'utf8').strip().split(':')[0] for line in lines\n]\nspam_data = pandas.read_csv(SPAMBASE_DATA_URL, header=None, names=(feature_names + ['spam']))\n \nX, y = spam_data.ix[:, :-1].values, spam_data.ix[:, -1].values\n \nspam_data.head()", "execution_count": 1}, {"outputs": [{"name": "stdout", "text": "- \u0412 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u043c \u043d\u0430\u0431\u043e\u0440\u0435 4601 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u043f\u0438\u0441\u0435\u043c\n- \u0414\u043e\u043b\u044f \u043f\u043b\u043e\u0445\u0438\u0445 \u043f\u0438\u0441\u0435\u043c \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 39 \u043f\u0440\u043e\u0446\u0435\u043d\u0442\u043e\u0432\n- \u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u0432 \u043d\u0430\u0431\u043e\u0440\u0435\n 48 \u0432\u0435\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u043e\u0432, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0447\u0430\u0441\u0442\u043e\u0442\u0430\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043b\u043e\u0432 \u0432 \u0442\u0435\u043a\u0441\u0442\u0435 \n 6 \u0432\u0435\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u043e\u0432, \u0441\u043e\u043e\u0442\u0432\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0447\u0430\u0441\u0442\u043e\u0442\u0430\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0432 \u0442\u0435\u043a\u0441\u0442\u0435\n 1 \u0432\u0435\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u0438\u0437\u043d\u0430\u043a, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u0441\u0440\u0435\u0434\u043d\u0435\u0439 \u0447\u0430\u0441\u0442\u043e\u0442\u0435 \u0441\u043b\u043e\u0432 \u0438\u0437 \u0437\u0430\u0433\u043b\u0430\u0432\u043d\u044b\u0445 \u0431\u0443\u043a\u0432\n 2 \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u0430 -- \u0434\u043b\u0438\u043d\u0430 \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0435\u0433\u043e \u0441\u043b\u043e\u0432\u0430 \u0438\u0437 \u0437\u0430\u0433\u043b\u0430\u0432\u043d\u044b\u0445 \u0431\u0443\u043a\u0432 \u0438 \u0441\u0443\u043c\u043c\u0430 \u0434\u043b\u0438\u043d \u0432\u0441\u0435\u0445 \u0441\u043b\u043e\u0432, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0438\u0445 \u0438\u0437 \u0437\u0430\u0433\u043b\u0430\u0432\u043d\u044b\u0445 \u0431\u0443\u043a\u0432.\n", "output_type": "stream"}], "cell_type": "code", "metadata": {"trusted": false, "collapsed": false}, "source": "import math\nprint(\"- \u0412 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u043c \u043d\u0430\u0431\u043e\u0440\u0435 %d \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u043f\u0438\u0441\u0435\u043c\" % spam_data.shape[0])\ndef spam_per_cent(y):\n part = (len([l for l in y if l == 1]) / len(y))\n return round(part, 2) * 100\nprint(\"- \u0414\u043e\u043b\u044f \u043f\u043b\u043e\u0445\u0438\u0445 \u043f\u0438\u0441\u0435\u043c \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 %d \u043f\u0440\u043e\u0446\u0435\u043d\u0442\u043e\u0432\" % spam_per_cent(y))\n\nprint(\"- \u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u0432 \u043d\u0430\u0431\u043e\u0440\u0435\\n 48 \u0432\u0435\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u043e\u0432, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445\\\n \u0447\u0430\u0441\u0442\u043e\u0442\u0430\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043b\u043e\u0432 \u0432 \u0442\u0435\u043a\u0441\u0442\u0435 \\n 6 \u0432\u0435\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u043e\u0432, \u0441\u043e\u043e\u0442\u0432\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0447\u0430\u0441\u0442\u043e\u0442\u0430\u043c\\\n \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0432 \u0442\u0435\u043a\u0441\u0442\u0435\\n 1 \u0432\u0435\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u0438\u0437\u043d\u0430\u043a, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u0441\u0440\u0435\u0434\u043d\u0435\u0439 \u0447\u0430\u0441\u0442\u043e\u0442\u0435\\\n \u0441\u043b\u043e\u0432 \u0438\u0437 \u0437\u0430\u0433\u043b\u0430\u0432\u043d\u044b\u0445 \u0431\u0443\u043a\u0432\\n 2 \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u0430 -- \u0434\u043b\u0438\u043d\u0430 \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0435\u0433\u043e \u0441\u043b\u043e\u0432\u0430 \u0438\u0437 \u0437\u0430\u0433\u043b\u0430\u0432\u043d\u044b\u0445\\\n \u0431\u0443\u043a\u0432 \u0438 \u0441\u0443\u043c\u043c\u0430 \u0434\u043b\u0438\u043d \u0432\u0441\u0435\u0445 \u0441\u043b\u043e\u0432, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0438\u0445 \u0438\u0437 \u0437\u0430\u0433\u043b\u0430\u0432\u043d\u044b\u0445 \u0431\u0443\u043a\u0432.\")", "execution_count": 2}, {"cell_type": "markdown", "metadata": {"collapsed": true}, "source": "# 2. \u041e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u0438 \u043e\u0446\u0435\u043d\u043a\u0430 \u0435\u0433\u043e \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430"}, {"cell_type": "markdown", "metadata": {}, "source": "\u0420\u0430\u0437\u043e\u0431\u044c\u0435\u043c \u0432\u044b\u0431\u043e\u0440\u043a\u0443 \u043d\u0430 \u043e\u0431\u0443\u0447\u0430\u044e\u0449\u0443\u044e \u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u0443\u044e"}, {"outputs": [{"name": "stdout", "text": "X_train shape: (3000, 57)\ny_train dimension: 3000\nX_test shape: (1601, 57)\ny_test dimension: 1601\n", "output_type": "stream"}], "cell_type": "code", "metadata": {"trusted": false, "collapsed": false}, "source": "X_train, y_train = spam_data.ix[0:2999, :-1].values, spam_data.ix[0:2999, -1].values\nX_test, y_test = spam_data.ix[3000:, :-1].values, spam_data.ix[3000:, -1].values\nprint(\"X_train shape: (%d, %d)\" % X_train.shape)\nprint(\"y_train dimension: %d\" % y_train.shape)\nprint(\"X_test shape: (%d, %d)\" % X_test.shape)\nprint(\"y_test dimension: %d\" % y_test.shape)", "execution_count": 3}, {"cell_type": "markdown", "metadata": {}, "source": "\u041e\u0431\u0443\u0447\u0438\u043c \u0440\u0435\u0448\u0430\u044e\u0449\u0435\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u0441 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438, \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0438\u0437 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0439 \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u0438 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0435\u043c \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430"}, {"outputs": [{"name": "stdout", "text": "TP=1232 TN=0 FP=0 FN=369\nAccuracy = 0.769519 \u2014 \u0434\u043e\u043b\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0445 \u043e\u0442\u0432\u0435\u0442\u043e\u0432\nPrecision = 1.000000 \u2014 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c, \u0434\u043e\u043b\u044f \u0441\u043f\u0430\u043c\u0430 \u0441\u0440\u0435\u0434\u0438 \u043f\u0438\u0441\u0435\u043c, \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043a\u0430\u043a \u0441\u043f\u0430\u043c\nRecall = 0.769519 \u2014 \u043f\u043e\u043b\u043d\u043e\u0442\u0430, \u0434\u043e\u043b\u044f \u0441\u043f\u0430\u043c\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u044b\u043b\u0430 \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u043d\u0430\nF1 = 0.869749 \u2014 \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u0433\u0430\u0440\u043c\u043e\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043c\u0435\u0436\u0434\u0443 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c\u044e \u0438 \u043f\u043e\u043b\u043d\u043e\u0442\u043e\u0439\n", "output_type": "stream"}], "cell_type": "code", "metadata": {"trusted": false, "collapsed": false}, "source": "from sklearn.tree import DecisionTreeClassifier as DT\nclf = DT(criterion='gini', max_depth=7)\nclf.fit(X_train, y_train)\ny_test_pred = clf.predict(X_test)\n\ndef metrics_sources(y_actual, y_predicted):\n TP = TN = FP = FN = 0\n for i in range(0, len(y_actual)):\n p = y_predicted[i]\n a = y_actual[i]\n if p == 0:\n if p == a:\n TP += 1\n else:\n FP += 1\n else:\n if p == a:\n TN += 1\n else:\n FN += 1\n return (TP, TN, FP, FN)\n\n# from sklearn.metrics import confusion_matrix\n# confusion_matrix(y_test, y_test_pred)\n\ndef print_quality_metrics(y_test, y_test_pred):\n TP, TN, FP, FN = metrics_sources(y_test, y_test_pred)\n\n print(\"TP=%d TN=%d FP=%d FN=%d\" % (TP, TN, FP, FN) )\n print(\"Accuracy = %f \u2014 \u0434\u043e\u043b\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0445 \u043e\u0442\u0432\u0435\u0442\u043e\u0432\" % ((TP + TN) / (TP + TN + FP + FN)) )\n print(\"Precision = %f \u2014 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c, \u0434\u043e\u043b\u044f \u0441\u043f\u0430\u043c\u0430 \u0441\u0440\u0435\u0434\u0438 \u043f\u0438\u0441\u0435\u043c, \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043a\u0430\u043a \u0441\u043f\u0430\u043c\" % (TP / (TP + FP)) )\n print(\"Recall = %f \u2014 \u043f\u043e\u043b\u043d\u043e\u0442\u0430, \u0434\u043e\u043b\u044f \u0441\u043f\u0430\u043c\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u044b\u043b\u0430 \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u043d\u0430\" % (TP / (TP + FN)))\n print(\"F1 = %f \u2014 \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u0433\u0430\u0440\u043c\u043e\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043c\u0435\u0436\u0434\u0443 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c\u044e \u0438 \u043f\u043e\u043b\u043d\u043e\u0442\u043e\u0439\" % (2*TP / (2*TP + FP + FN)) )\n \nprint_quality_metrics(y_test, y_test_pred)\n ", "execution_count": 4}, {"cell_type": "markdown", "metadata": {}, "source": "\u041d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u044d\u0442\u043e \u0438\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u043f\u043b\u043e\u0445\u043e\u0435. \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u044d\u0442\u043e"}, {"outputs": [{"name": "stdout", "text": "\u0414\u043e\u043b\u044f \u0441\u043f\u0430\u043c\u0430 \u0432 \u043e\u0431\u0443\u0447\u0430\u044e\u0449\u0435\u0439 \u0432\u044b\u0431\u043e\u0440\u043a\u0435 - 60 \n\u0414\u043e\u043b\u044f \u0441\u043f\u0430\u043c\u0430 \u0432 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u043e\u0439 \u0432\u044b\u0431\u043e\u0440\u043a\u0435 - 0 \n", "output_type": "stream"}], "cell_type": "code", "metadata": {"trusted": false, "collapsed": false}, "source": "print(\"\u0414\u043e\u043b\u044f \u0441\u043f\u0430\u043c\u0430 \u0432 \u043e\u0431\u0443\u0447\u0430\u044e\u0449\u0435\u0439 \u0432\u044b\u0431\u043e\u0440\u043a\u0435 - %d \" % spam_per_cent(y_train))\nprint(\"\u0414\u043e\u043b\u044f \u0441\u043f\u0430\u043c\u0430 \u0432 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u043e\u0439 \u0432\u044b\u0431\u043e\u0440\u043a\u0435 - %d \" % spam_per_cent(y_test))", "execution_count": 5}, {"cell_type": "markdown", "metadata": {}, "source": "\u0412 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0443\u044e \u0432\u044b\u0431\u043e\u0440\u043a\u0443 \u0441\u043f\u0430\u043c \u043d\u0435 \u043f\u043e\u043f\u0430\u043b \u0432\u043e\u043e\u0431\u0449\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0430\u043c \u043d\u0435 \u0431\u044b\u043b\u043e \u0448\u0430\u043d\u0441\u043e\u0432 \u0447\u0442\u043e-\u0442\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c.\n\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440\u043a\u0443 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e"}, {"outputs": [], "cell_type": "code", "metadata": {"trusted": false, "collapsed": true}, "source": "from sklearn.cross_validation import train_test_split as ttsplit\nX_train, X_test, y_train, y_test = ttsplit(X, y, train_size = 0.65)", "execution_count": 6}, {"outputs": [{"name": "stdout", "text": "\u0414\u043e\u043b\u044f \u0441\u043f\u0430\u043c\u0430 \u0432 \u043e\u0431\u0443\u0447\u0430\u044e\u0449\u0435\u0439 \u0432\u044b\u0431\u043e\u0440\u043a\u0435 (\u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e) - 40 \n\u0414\u043e\u043b\u044f \u0441\u043f\u0430\u043c\u0430 \u0432 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u043e\u0439 \u0432\u044b\u0431\u043e\u0440\u043a\u0435 (\u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e) - 39 \n", "output_type": "stream"}], "cell_type": "code", "metadata": {"trusted": false, "collapsed": false}, "source": "print(\"\u0414\u043e\u043b\u044f \u0441\u043f\u0430\u043c\u0430 \u0432 \u043e\u0431\u0443\u0447\u0430\u044e\u0449\u0435\u0439 \u0432\u044b\u0431\u043e\u0440\u043a\u0435 (\u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e) - %d \" % spam_per_cent(y_train))\nprint(\"\u0414\u043e\u043b\u044f \u0441\u043f\u0430\u043c\u0430 \u0432 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u043e\u0439 \u0432\u044b\u0431\u043e\u0440\u043a\u0435 (\u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e) - %d \" % spam_per_cent(y_test))", "execution_count": 7}, {"outputs": [{"name": "stdout", "text": "TP=919 TN=550 FP=78 FN=64\nAccuracy = 0.911856 \u2014 \u0434\u043e\u043b\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0445 \u043e\u0442\u0432\u0435\u0442\u043e\u0432\nPrecision = 0.921765 \u2014 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c, \u0434\u043e\u043b\u044f \u0441\u043f\u0430\u043c\u0430 \u0441\u0440\u0435\u0434\u0438 \u043f\u0438\u0441\u0435\u043c, \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043a\u0430\u043a \u0441\u043f\u0430\u043c\nRecall = 0.934893 \u2014 \u043f\u043e\u043b\u043d\u043e\u0442\u0430, \u0434\u043e\u043b\u044f \u0441\u043f\u0430\u043c\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u044b\u043b\u0430 \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u043d\u0430\nF1 = 0.928283 \u2014 \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u0433\u0430\u0440\u043c\u043e\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043c\u0435\u0436\u0434\u0443 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c\u044e \u0438 \u043f\u043e\u043b\u043d\u043e\u0442\u043e\u0439\n", "output_type": "stream"}], "cell_type": "code", "metadata": {"trusted": false, "collapsed": false}, "source": "clfDT = DT(criterion='gini', max_depth=7)\nclfDT.fit(X_train, y_train)\ny_test_pred = clfDT.predict(X_test)\n\nprint_quality_metrics(y_test, y_test_pred)", "execution_count": 32}, {"cell_type": "markdown", "metadata": {}, "source": "\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0432\u0441\u0435\u043c \u0434\u0440\u0443\u0433\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u0430."}, {"outputs": [{"metadata": {}, "data": {"text/plain": "[(0.400450379229081, 'char_freq_!'),\n (0.1470259513948125, 'word_freq_remove'),\n (0.13288449500167376, 'capital_run_length_average'),\n (0.054985206612606481, 'word_freq_hp'),\n (0.037804285486500798, 'word_freq_money'),\n (0.034773965600890196, 'word_freq_free'),\n (0.031496134275290286, 'word_freq_your'),\n (0.019065980863768119, 'word_freq_meeting'),\n (0.01859331938045973, 'capital_run_length_total'),\n (0.018348403213036341, 'char_freq_$')]"}, "execution_count": 41, "output_type": "execute_result"}], "cell_type": "code", "metadata": {"trusted": false, "collapsed": false}, "source": "importances = zip(clf.feature_importances_, spam_data.columns[:-1])\nimp_desc = sorted(importances, key = lambda x: -x[0])\nimp_desc[0:10]", "execution_count": 41}, {"cell_type": "markdown", "metadata": {}, "source": "\u0421\u0430\u043c\u044b\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0432\u043d\u044b\u043c \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u043e\u043c \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u0447\u0430\u0441\u0442\u043e\u0442\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 !"}, {"cell_type": "markdown", "metadata": {}, "source": "\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0434\u0440\u0443\u0433\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b: \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u044b\u0439 \u0438 \u043c\u0435\u0442\u043e\u0434 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0445 \u0441\u043e\u0441\u0435\u0434\u0435\u0439"}, {"outputs": [{"name": "stdout", "text": "TP=983 TN=0 FP=628 FN=0\nAccuracy = 0.610180 \u2014 \u0434\u043e\u043b\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0445 \u043e\u0442\u0432\u0435\u0442\u043e\u0432\nPrecision = 0.610180 \u2014 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c, \u0434\u043e\u043b\u044f \u0441\u043f\u0430\u043c\u0430 \u0441\u0440\u0435\u0434\u0438 \u043f\u0438\u0441\u0435\u043c, \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043a\u0430\u043a \u0441\u043f\u0430\u043c\nRecall = 1.000000 \u2014 \u043f\u043e\u043b\u043d\u043e\u0442\u0430, \u0434\u043e\u043b\u044f \u0441\u043f\u0430\u043c\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u044b\u043b\u0430 \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u043d\u0430\nF1 = 0.757903 \u2014 \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u0433\u0430\u0440\u043c\u043e\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043c\u0435\u0436\u0434\u0443 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c\u044e \u0438 \u043f\u043e\u043b\u043d\u043e\u0442\u043e\u0439\n", "output_type": "stream"}], "cell_type": "code", "metadata": {"trusted": false, "collapsed": false}, "source": "from sklearn.dummy import DummyClassifier as CNST\nclfConst = CNST(strategy='constant', constant=0)\nclfConst.fit(X_train, y_train)\ny_test_pred = clfConst.predict(X_test)\n\nprint_quality_metrics(y_test, y_test_pred)", "execution_count": 10}, {"outputs": [{"name": "stdout", "text": "TP=880 TN=416 FP=212 FN=103\nAccuracy = 0.804469 \u2014 \u0434\u043e\u043b\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0445 \u043e\u0442\u0432\u0435\u0442\u043e\u0432\nPrecision = 0.805861 \u2014 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c, \u0434\u043e\u043b\u044f \u0441\u043f\u0430\u043c\u0430 \u0441\u0440\u0435\u0434\u0438 \u043f\u0438\u0441\u0435\u043c, \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043a\u0430\u043a \u0441\u043f\u0430\u043c\nRecall = 0.895219 \u2014 \u043f\u043e\u043b\u043d\u043e\u0442\u0430, \u0434\u043e\u043b\u044f \u0441\u043f\u0430\u043c\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u044b\u043b\u0430 \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u043d\u0430\nF1 = 0.848193 \u2014 \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u0433\u0430\u0440\u043c\u043e\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043c\u0435\u0436\u0434\u0443 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c\u044e \u0438 \u043f\u043e\u043b\u043d\u043e\u0442\u043e\u0439\n", "output_type": "stream"}], "cell_type": "code", "metadata": {"trusted": false, "collapsed": false}, "source": "from sklearn.neighbors import KNeighborsClassifier as KNN\nclfKnn = KNN(n_neighbors=10, metric='minkowski', p=2)\nclfKnn.fit(X_train, y_train)\ny_test_pred = clfKnn.predict(X_test)\n\nprint_quality_metrics(y_test, y_test_pred)", "execution_count": 11}, {"cell_type": "markdown", "metadata": {}, "source": "\u0415\u0441\u0442\u044c \u043f\u043e\u0434\u043e\u0437\u0440\u0435\u043d\u0438\u0435, \u0447\u0442\u043e \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u0438, \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0431\u043e\u043b\u044c\u0448\u0435, \u043a\u0430\u0436\u0443\u0442\u0441\u044f \u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430\u043c \u0431\u043e\u043b\u0435\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0432\u043d\u044b\u043c\u0438. \u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u043a\u0438\u043b\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0441 \u0441\u0430\u043d\u0442\u0438\u043c\u0435\u0442\u0440\u0430\u043c\u0438. \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u044d\u0442\u043e, \u043f\u0440\u043e\u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0432 \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u0438"}, {"outputs": [{"name": "stdout", "text": "TP=940 TN=506 FP=116 FN=49\nAccuracy = 0.897579 \u2014 \u0434\u043e\u043b\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0445 \u043e\u0442\u0432\u0435\u0442\u043e\u0432\nPrecision = 0.890152 \u2014 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c, \u0434\u043e\u043b\u044f \u0441\u043f\u0430\u043c\u0430 \u0441\u0440\u0435\u0434\u0438 \u043f\u0438\u0441\u0435\u043c, \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043a\u0430\u043a \u0441\u043f\u0430\u043c\nRecall = 0.950455 \u2014 \u043f\u043e\u043b\u043d\u043e\u0442\u0430, \u0434\u043e\u043b\u044f \u0441\u043f\u0430\u043c\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u044b\u043b\u0430 \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u043d\u0430\nF1 = 0.919315 \u2014 \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u0433\u0430\u0440\u043c\u043e\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043c\u0435\u0436\u0434\u0443 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c\u044e \u0438 \u043f\u043e\u043b\u043d\u043e\u0442\u043e\u0439\n", "output_type": "stream"}], "cell_type": "code", "metadata": {"trusted": false, "collapsed": false}, "source": "from sklearn.preprocessing import scale\nX_norm = scale(X)\nX_norm_train, X_norm_test, y_norm_train, y_norm_test = ttsplit(X_norm, y, train_size = 0.65)\nclfKnn_norm = KNN(n_neighbors=10, metric='minkowski', p=2)\nclfKnn_norm.fit(X_norm_train, y_norm_train)\ny_norm_test_pred = clfKnn_norm.predict(X_norm_test)\n\nprint_quality_metrics(y_norm_test, y_norm_test_pred)", "execution_count": 12}, {"cell_type": "markdown", "metadata": {}, "source": "\u0412\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0443\u043b\u0443\u0447\u0448\u0438\u043b\u0441\u044f."}, {"cell_type": "markdown", "metadata": {}, "source": "(*)"}, {"outputs": [], "cell_type": "code", "metadata": {"trusted": false, "collapsed": false}, "source": "grid = [x/100 for x in range(1, 100, 1)]\nrepeat = 10\nfrom sklearn.metrics import mean_absolute_error as loss\n\ndef mean(X):\n return sum(X) / len(X)\n\ndef stdev(X):\n m = mean(X)\n return math.sqrt(mean([(x - m)**2 for x in X]))\n\ndef error_dependency(X, y, grid, repeat):\n result = []\n for tsize in grid:\n vals = []\n for i in range(0, repeat):\n X_train, X_test, y_train, y_test = ttsplit(X, y, train_size = tsize)\n testclf = KNN(n_neighbors=10, metric='minkowski', p=2)\n testclf.fit(X_train, y_train)\n y_test_pred = testclf.predict(X_test)\n loss_val = loss(y_test, y_test_pred)\n vals.append(loss_val)\n result.append((tsize, stdev(vals)))\n return result\n\nerrfunc = error_dependency(X, y, grid, repeat)\n \n ", "execution_count": 13}, {"outputs": [{"name": "stdout", "text": "Populating the interactive namespace from numpy and matplotlib\n", "output_type": "stream"}, {"name": "stderr", "text": "WARNING: pylab import has clobbered these variables: ['mean', 'clf', 'grid', 'repeat']\n`%matplotlib` prevents importing * from pylab and numpy\n", "output_type": "stream"}, {"metadata": {}, "data": {"text/plain": "<matplotlib.figure.Figure at 0x105db4748>", "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZQAAAEPCAYAAABlZDIgAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJztnXuYHVWZr98fgXCHGIMJkGjABAigEsQQxUu8gJnoATyK\nmOMIImrGMergDWRmDjk6ozIKOgyKOEQHcQTxBkHAgEh7wwkEwjWJJEADCSSoXAwBMYHv/LFWdVdX\nV+1du3tX70t/7/P007tWrVW1qnp3ffVdl8wMx3Ecxxku27R6Ao7jOE534ALFcRzHaQouUBzHcZym\n4ALFcRzHaQouUBzHcZym4ALFcRzHaQqVChRJcyWtlrRG0qkFfc6J+2+TNDOzb4ykFZKuSLUtkrQu\ntq+QNLfKa3Acx3HKsW1VB5Y0BjgXeBOwHrhJ0hIzW5XqMw+YZmbTJR0OnAfMTh3mY8BKYNdUmwFn\nm9nZVc3dcRzHaZwqNZRZwFoz6zWzLcAlwDGZPkcDFwKY2TJgnKSJAJImA/OACwBlxmW3HcdxnBZT\npUDZG3gwtb0utpXt8xXgU8BzOcf+SDSRLZY0rknzdRzHcYZBlQKlbE2XQdqHpLcCj5jZipz95wH7\nAIcADwNnDWuWjuM4TlOozIdC8JtMSW1PIWggtfpMjm1vB46OPpYdgN0kfcfMTjCzR5LOki4AriAH\nSV6kzHEcp0HMbOguBTOr5IcgrO4BpgJjgVuBGZk+84Cr4ufZwP/kHOd1wBWp7T1Tn08Bvldwfqvq\n2jrtB1jU6jm0w4/fB78Xfi/q3gsbzvjKNBQz2yppIbAUGAMsNrNVkhbE/eeb2VWS5klaC2wGTio6\nXOrzmZIOiW33AQuqugbHcRynPFWavDCzq4GrM23nZ7YX1jnGL4FfprZPaOYcHcdxnObgmfKjg55W\nT6BN6Gn1BNqInlZPoI3oafUEugVFu1nXIclsOM4lx3GcUcZwn5uuoTiO4zhNwQWK4ziO0xRcoDiO\n43QxEs+T+OBInMsFiuM4TnczH/gPiZ2rPpELFMdxnO7meGAL8OqqT+QCxXEcp0uR2At4KfBV4Miq\nz+cCxXEcp3t5B7AEuJKwNlWluEBxHMfpXt4JXArcBEyVeEGVJ3OB4jiO04VITAZmANeasZVQwuoN\nVZ7TBYrjOE53chxwuRl/jds/p2KzlwsUx3Gc7uSdwPdT2z8HjpSqW0LdBYrjOE6XIfEiYBrwi1Tz\nakKF+RdXdV4XKI7jON3H24DLzNiSNJhhVGz2coHiOI7TfewFrMlp71yBImmupNWS1kg6taDPOXH/\nbZJmZvaNkbRC0hWptvGSrpV0t6RrJI2r8hocx3E6kB2Av+S0/xx4vcSYKk5amUCRNAY4F5gLHAjM\nlzQj02ceMM3MpgMfBM7LHOZjwEoGLgF8GnCtme0HXBe3HcdxnH62B57JNprxMHA/sF8VJ61SQ5kF\nrDWzXjPbAlwCHJPpczRwIYCZLQPGSZoIIGkyMA+4AAZEJfSNib+PrewKHMdxOpMiDQXgFWasquKk\nVQqUvYEHU9vrYlvZPl8BPgU8lxkz0cw2xs8bgYlNma3jOE73sAM5GgqAGc9WddJtqzowA81UtcjG\nREvSW4FHzGyFpDmFJzAzSYXnkbQotdljZj0l5+Q4jtPJbE+xhtJHfL7OadZJqxQo64Epqe0pBA2k\nVp/Jse3twNHRx7IDsJuk75jZCcBGSZPMbIOkPYFHiiZgZouGfxmO4zgdR6GGkia+ZPck25LOGM5J\nqzR5LQemS5oqaSyhJv+STJ8lwAkAkmYDj5vZBjM73cymmNk+wLuAX0Rhkow5MX4+EbiswmtwHMfp\nREppKM2mMg3FzLZKWggsBcYAi81slaQFcf/5ZnaVpHmS1gKbgZOKDpf6/EXgUkknA72E8gKO4zhO\nP6U0lGYjs7Kujs5CkplZZTVrHMdx2hWJW4D3m3FLY+OG99z0THnHcZzuo1bYcGW4QHEcx+k+chMb\nq8YFiuM4TvfhGorjOI7TFFrilHeB4jiO0320JGzYBYrjOE734RqK4ziOMzwktiWUtNo60ud2geI4\njtNdbA88E1doHFFcoDiO43QXLfGfgAsUx3GcbqMl/hNwgeI4jtNtuIbiOI7jNIWWJDWCCxTHcZxu\nw01ejuM4TlNwk5fjOI7TFFxDcRzHcZpCd2ookuZKWi1pjaRTC/qcE/ffJmlmbNtB0jJJt0paKekL\nqf6LJK2TtCL+zK3yGhzHcTqMlmkolS0BLGkMcC7wJmA9cJOkJWa2KtVnHjDNzKZLOhw4D5htZn+R\n9Hoze0rStsBvJB1hZr8lLAd8tpmdXdXcHcdxOpiu1FBmAWvNrNfMtgCXAMdk+hwNXAhgZsuAcZIm\nxu2nYp+xhDXpH0uN86V9Hcdx8ulKH8rewIOp7XWxrV6fyRA0HEm3AhuB681sZarfR6KJbLGkcc2f\nuuM4TsfSsjyUykxeULowWVbbMAAzexY4RNLuwFJJc8ysh2AW+2zs+zngLODk3ANLi1KbPXG84zhO\nN1Pa5CVpDjCnWSeuUqCsB6aktqcQNJBafSbHtj7M7AlJVwKHEYTCI8k+SRcAVxRNwMwWDWnmjuM4\nnUtpk1d8ye5JtiWdMZwTV2nyWg5MlzRV0ljgeGBJps8S4AQASbOBx81so6QJiSlL0o7AkcCKuL1n\navzbgDsqvAbHcZxOo2VO+co0FDPbKmkhsJTgVF9sZqskLYj7zzezqyTNk7QW2AycFIfvCVwoaRuC\n0LvIzK6L+86UdAjBNHYfsKCqa3Acx+lAWuaUl9mIr8EyIkgyM/NoMMdxRhUSXwIeMeNLjY8d3nPT\nM+Udx3G6i64MG3Ycx3FGnq5MbHQcx3FGHtdQHMdxnKbgC2w5juM4TWF7XENxHMdxmoBrKI7jOE5T\ncKe84ziO0xTcKe84juM0BddQHMdxnKbgGorjOI7TFNwp7ziO4zQFDxt2HMdxmoJrKI7jOE5TcA2l\nCiTGtHoOjuM4VSAxUeITObtcQ6mIHVo9AcdxnIp4KfDedIPEtoCZsbUVE6pUoEiaK2m1pDWSTi3o\nc07cf5ukmbFtB0nLJN0qaaWkL6T6j5d0raS7JV2TLBVcwE5NviTHcZx2YQKwa6atZSHDUKFAkTQG\nOBeYCxwIzJc0I9NnHjDNzKYDHwTOAzCzvwCvN7NDCFL49ZKOiMNOA641s/2A6+J2ETs28ZIcx3Ha\niQnAbpm2liU1QrUayixgrZn1mtkW4BLgmEyfo4ELAcxsGTBO0sS4/VTsM5awJv1j2THx97E15uAa\niuM43coEYFeJ9JK93amhAHsDD6a218W2en0mQ9BwJN0KbASuN7OVsc9EM9sYP28EJtaYg2sojuN0\nKxOAbRnoK26ZQx7CZKrCSvZTZtsAzOxZ4BBJuwNLJc0xs54BHc1MUo3zHLJQui0RWD3Z8Y7jOB3M\n8+PvXYGn4+eGQoYlzQHmNGtCVQqU9cCU1PYUggZSq8/k2NaHmT0h6Urg5UAPsFHSJDPbIGlP4JHi\nKdx6iRnXDvUCHMdx2pgJ8fdu9D8HG9JQ4kt2T7It6YzhTKhKk9dyYLqkqZLGAscDSzJ9lgAnAEia\nDTxuZhslTUiityTtCBwJ3Joac2L8fCJwWY05uMnLcZxuZQLwLAMjvVqW1AgVaihmtlXSQmApwam+\n2MxWSVoQ959vZldJmidpLbAZOCkO3xO4UNI2BKF3kZldF/d9EbhU0slAL/DOGtNwp7zjON3KBIIP\nOh3p1bU+FMzsauDqTNv5me2FOePuAA4tOOajwJtKTsE1FMdxuo4Y2TUBuIE20lC6PVPeNRTHcbqR\nnQnmro20kYbS7QLFNRTHcbqRCcAfgU0M1lBcoFSEayiO43QjzycIlD8zWENxk1dFuEBxHKcbKdJQ\n3ORVIW7ychynG5kA/InBGoo75SvENRTHcbqRREP5M66hjBiuoTiO042kTV6do6HEMvSdimsojuN0\nIx2rodwn6ZuS3igpW8ix3XENxXGcbqQzNRRgBmEhq4VAr6RzJb2m2mk1DddQHMfpRtJhw52joZjZ\nZjP7vpm9DTgE2J1Udco2xwWK4zjdSBLlldVQ2lugQKiZL+k84BaCSlWrIGM74SYvx3G6kSIfSntX\nG5bUSygd/33gU2b2ZNWTaiKuoTiO01WkCkP+iVDPazcJmWF0QLXhl5nZE5XPpBpcQ3Ecp9vYFXjG\nLAgOiS0EQfI0HeCUnyTpOkl3AUh6maR/qnhezcI1FMdxuo3E3JWQ9qO0vQ/lP4HTgb/G7duB+WUO\nLmmupNWS1kg6taDPOXH/bZJmxrYpkq6XdJekOyV9NNV/kaR1klbEn7k1puAaiuM43UZWoKT9KO3t\nQwF2MrNlSQqKmZmkLfUGxYTIcwmLYa0HbpK0xMxWpfrMA6aZ2XRJhwPnAbOBLcApZnarpF2AmyVd\nY2arAQPONrOzS8x9G4ltzdhaoq/jOE4n8HyC/yShozSUP0ialmxIegfwcIlxs4C1ZtZrZluAS4Bj\nMn2OBi4EMLNlwDhJE81sg5ndGtufBFYBe6fGlU2wfBrXUhzH6S7aVkMpI1AWAucDB0h6CDgF+FCJ\ncXsT1jtOWMdAoVDUZ3K6g6SpwExgWar5I9FEtljSuBpzeAr3oziO0110rg/FzO4xszcSLmJ/MzvC\nzHpLHNtKziGrbfSNi+auHwIfS4UrnwfsQ0iyfBg4q8axn8YFiuM43UUtDaWlC2wV+lAkfSK1mX7I\nh4b6Poz1wJTU9hSCBlKrz+TYhqTtgB8B3zWzy/omYvZIai4XAFcUT+FTO8NPPind8wegx8x66szZ\ncRyn3ZkArEhtpzWUhpYAljQHmNOsidVyyu9KECT7A68AlhC0ibcCN5Y49nJgejRZPQQcz+DosCUE\nk9olkmYDj5vZxliEcjGw0sy+mh4gaU8zS3w4bwPuKJ7Clx6AL33bjOUl5us4jtMJ1NNQSguU+JLd\nk2xLOmM4EysUKGa2KJ7g18ChZrYpdcKrSkx0q6SFwFJgDLDYzFZJWhD3n29mV0maJ2ktsBk4KQ4/\nAvhb4HZJiST+jJn9DDhT0iEEYXcfsKDGNJ7CnfKO44wQMYv9H4F/jZnrVVAryqvtw4ZfQAjjTdgS\n2+piZlcDV2fazs9sL8wZ9xsK/DtmdkKZc0fch+I4zkiyM/A54MtU5xzP01CmRmHWnj6UFN8BbpT0\nY4LJ61hiqG8H4BqK4zgjyfj4e2fqCBSJ7cyom9OXQ1GU17bAc63MuysT5fWvBFPU48CjwHvN7PNV\nT6xJeNiw4zgjSSJQaj53ojbxsMQPJA4se/A4LmvySnwoLQ0ZhnLVhi8ys/cAN+e0tTtu8nIcZyRJ\nayi1SATAjUCPxFLgFLMBmkceuwNPmfWVwoJ+DaWl5i4ol9h4cHpD0rbAy6uZTtNxk5fjOCNJWYEy\nCXjYjC8B04A9CJGw9ciau6BfQ2koZLgKCgWKpNMlbQJeImlT8gM8Qgj37QRcQ3EcZyQpZfICJgIb\nAcz4M8ECNL7miECyDkqa9tdQzOzzZrYr8GUz2zX1M97MThvBOQ4H11AcxxlJGtFQNqS2HwNqlZFK\nSNaST9P+GkqKn8YSKEh6j6SzJb2o4nk1C9dQHMcZSRrWUCKPAc8rcfwik1eiobS9QDkPeErSy4CP\nA/cSQok7AddQHMcZSRKhUE9DyQqUxxm6QNlEv5O/PU1eKbaa2XOE/JOvmdm59Kf5tzuuoTiOM5KM\nJ6RXDMXkNSSBEvNO/kowmbW9hrJJ0umEUig/jQtnbVfttJqGayiO44wk4wlLclRl8poO9Oa0byJE\nirW9hnI8Qeq9z8w2ENYw+VKls2oentjoOM5IkgiUMhrKUATKTAZWGk74M6EkVnsnNsbKvmenth+g\nc3wobvJyHGckGQ/cQDkfSkNRXhK7x3F35+zuGA2lk3GTl+M4I0ldk1csn5I1eW0CdpJqvuQfAtxh\nxrM5+/5MECht70PpZFxDcRxnRJDYgWD1+QO1NZTdgWfMeDppMOM5glCopaXMBG4p2NfeGoqk3Wvs\ne2E102k6rqE4jjNSPI8Q4bWZ2gIlq50k1POjFPlPoAM0lJ7kg6TrMvsur2Q2zcc1FMdxRookZHgz\ntZ87WYd8wnAESntrKBnK1JgZhKS5klZLWiPp1II+58T9t0maGdumSLpe0l2S7pT00VT/8ZKulXS3\npGsk1VIRXUNxHGekSAuUehrKhpz2QoESzWnTgDsLjtn2GsqwiPkq5wJzgQOB+ZJmZPrMA6aZ2XTg\ng4SsfAirQp5iZgcBs4EPSzog7jsNuNbM9gOui9tFuIbiOM5IMZ4gFJ5i6CavohfklwBrzAo1kE2U\nWNSrampFFOwh6eOEVRrTnyFIwnrMAtaaWS+ApEuAY4BVqT5HE1d/NLNlksZJmhjzXTbE9iclrSLk\nv6yOY14Xx19IMM0VCZWnCZETqnB9Z8dxHKjW5FXL3AVBQ4E2NnldQCixskvm867Af5Y49t6E8LmE\ndbGtXp/J6Q6SphJu5rLYNNHMkj/GRoK0zyUur/ksnZPZ7zhO5zJck1etel71BMqm+Ls9NRQzW1S0\nT9KsEscuqxEos903LlY5/iHwMTN7MmeOJqneeRKz11/r9HMcxxkOiUAZjsmryF89E7i4xjHbQkOp\nmymfIOkgYD7wLoIkPazOkPXAlNT2FIIGUqvP5NiGpO2AHwHfNbPLUn02SppkZhsk7UlY8Ktozovg\ntG3gW/8kPfJTM+upM2fHcZyhMh64g+GZvF6cbZQYQ/Ch3FrjmEPSUCTNAeY0MqYWNQWKpH0IAmQ+\n4Q1/KnBY4hepw3JgejRZPUSoCTY/02cJsBC4RNJs4HEz2yhJwGJgpZl9NWfMicCZ8fdlFGBmiyRO\ngC+cZ8Y9Eq8F/t6Md5WYv+M4TiMM0FBq+G4bjfLaH3goruxYxJA0lPiS3ZNsSzqjkfFZCgWKpN8B\nY4EfAMea2b2S7ispTDCzrZIWAkuBMcBiM1slaUHcf76ZXSVpnqS1BKl+Uhx+BKG68e2SErvhZ8zs\nZ8AXgUslnUyouvnOOlNJhw6fBsyRGFNQvsBxHGeojAceNWOLxLOE5+eAB3xB2ZWEIoFSz38C7e5D\nIVzwwYSLfwFhYa2GMLOrgaszbednthfmjPsNBQEDZvYo8KYGppFEes0AXk4wke0PrGzgGI7jOPVI\nNBTod8xnNYZxwNNmuQ/+orDhMgKlLXwotdaUP5bgJ7kD+Kyke4HnSTp8pCbXJBIN5WPANwjRYoe2\ndEaO43QjeQIlS5F2Al2godRMbDSzx83sW2Z2FPBK4J+Br0h6sNa4NuMpguP/eODrhOJqM1s6I8dx\nupG0QClai6nIIQ/FYcMvBW6rc+72FyhpzGyjmf2Hmb0KeHWFc2o2TwP/AFxmxkaCQHENxXGcphHL\nzu9Mv+mploaS55CHIFB2k/qfyxI7x+MUjQH6lgF+mnYNG5Z0BSEnJJsnQmw/uqpJNZmnCL6Tk+P2\nCmCmxDaxZLTjOM5wGQc8nnqmFAmUQg3FjGclniSUt38sNr8IeKBkpY8/08ZO+dmEvJGL6c9ST4RL\nJ5UxeRq43iyojGb8UeIJYB/gnpbOzHGcbiFt7oJik1ctHwr0+1HSAuX+knNYTMzjaxW1BMqewJGE\n3JH5wJXAxWZ210hMrIn8kIF/aOg3e7lAcRynGWQFSi2T1+9qHCcb6TWVkgLFjH8s069KakV5bTWz\nq83sBIK2shb4Zcwt6RjMWGrGTZnmFbgfxXGc5pGnoTRk8opkI70a0VBaTk2nvKQdJL0d+C7wYeDf\ngZ+MxMQqxh3zjjOKkPiQVKpK+lDJ01CKTF61HOzZSK+OEii1nPIXAQcBVwGfNbM7RmxW1XMLwTHv\nZe0dZ3TwUWAN8POKjt+IyWtUaijvBqYTEgJvkLQp9VOrpkwn8DDwHIPL6TuO053swRBXni1JXZNX\nquxKYUFbOlyg1CpfX9lqjq3GDJP6zF7ZCsiO43QRsVrveKoXKGtT25sJa0eleR6wuaDsSkKfQJEY\nC0wgFNftCLpWaJTA/SiOMzoYT0h5GEkNJc/kVc8hDwOjvKYQqgxvbcoMRwAXKI7jdDsT4u+RNnll\nnfL1/Ccw0OTVUeYucIHiAsVxup8kuqvVGsoLqC9Q0lFeLlA6iPsJZe1f0OqJOI5TKROAZ2m9QNkD\n+EOd46Q1lKm4QOkMYrjwHYSlNR3HaQCJN0p8t9XzKMkehPWcWm3y2gP4Y53juMmrCElzJa2WtEbS\nqQV9zon7b5M0M9X+LUkbJd2R6b9I0jpJK+LP3GFM0QWK4wyN6cDLWj2JkkwA7qYigRKrA48jmKsS\nmqGhuEBJkDQGOBeYCxwIzJc0I9NnHjDNzKYDHwTOS+3+dhybxYCzzWxm/PnZMKbpAsVxhsYkYGrM\nrWh39gB+T3Uaym6EcOB0NFaeQJlAOYEyLt5XFygpZgFrzazXzLYAlwDHZPocDVwIYGbLgHGSJsXt\nX9NfcTNLs77EdxKWOXYcpzEmArtQrRmpWexB1FAqEoBZcxcUm7xqChQzthBK0O9OSLzupMUMKxUo\n2ZuxjsGZ6WX65PGRaCJbLClvDeay3AkclF7QxnGcUkyKv6e2chIlmQA8QLBu7FjB8fMESpHJq54P\nBYLpbAbwpzpJkG1HrfL1w6VsjazsG0O9cecBn42fPwecRf/iWQMPLC1KbfaYWc+AExlPSPwJXxvF\ncRplIuHhOBW4ubVTqUuiGTxKePg/1eTjNyJQ6pm8IFhmDmEEzF2S5gBzmnW8KgXKekKmZ8IUBpc5\nyfaZTJ0FYsysrw6OpAuAK2r0XVRinonZywWK45RnEvA/dI6G8kf6BUqzyy1NZ3B9rqcIaQmKpZ62\niecuo6GMmECJL9k9ybakM4ZzvCpNPcuB6ZKmShoLHA8syfRZApwAIGk28LiZ1Uz8kbRnavNtBMf6\ncHDHvOM0QPRDdIRAiXPNaijNPP5OwGnA19Lt0RfyHDA2No0Dnozt9XgMmEmHOeShQoFiZluBhcBS\nYCXwfTNbJWmBpAWxz1XAvZLWAucDf5+Ml3QxcAOwn6QHJZ0Ud50p6XZJtwGvA04Z5lRdoDhOY+xC\nME3fSZsLFPod409RgUABPg78zowbcvalzV5lzV0QBMpL6ECBUqXJCzO7Grg603Z+Zjt3BUgzm1/Q\nfkLTJhi4Ezi9ycd0nG5mEmGRqF7aX6DsAfwhmp2aKlAkJgH/QIhozSOJ9HqU8g55CAJlBzpQoHh0\nE6wG9pXYvtUTcZwOISlyeD/wojbPRUk/yJutofw/4L/MuLdg/3A0FOhAgVKphtIJmPGMxL3AAcBt\nrZ6P43QAk4ANZjwu8Swhszsb5dQupJMJmyZQJA4m+HD3r9EtvQxwmaTGhCTjvuMEimsogTtxP4rj\nlCUxeUH7m73SmkEzNZRFwOfNCpOvYeCqjY1qKI+ZsWno02sNLlACd+AZ845TlvS6HvfT3gIlCRmG\nJgkUid2Ao4D/qtM1a/JqxIfSO5S5tRoXKAGP9HKc8rSNhiLxaammkKhCQ3kL8CuzAcUg80iXX2lE\nQ/kN8Jkhzq2luEAJuMnLccqT1lB6aa2G8mngiBr7m66hAMcBPyzRL62hlPahmPG4GUuHOLeW4gIl\ncB+hcNzurZ6I43QAbaGhxP/X51PbXN1UDUViF+CNDE7SzmOoUV4diwsUwIzngLtwP4rjlGEibSBQ\nCDX4oPb/bUMaisSXJV5ao8s84AazUlFtQzV5dSwuUPq5k85ZMMhxWkKq7MoAk1eLclH2JdTlqmWu\nTj/InwS2L8o5k9iBUK3juBrHK2vugqihpMq/lHXKdywuUPq5GnhnqyfhOG3OOOAvZjwNwd5PqFn1\nvJqjqmFf4EpgusR2BX36BEpc9vtRiuf6GmAL8Oa8nRI7E6K7Lis5v8TktTNgZmwuOa5jcYHSz+XA\nAVLNRCXHGe2kHfIJvbTG7LUvwVT9ILBfdqfEtoTVFNO5IrXMXnOBcwjPgQkF+5eZ8aeS80tMXo0k\nNXY0LlAisQrot4EPtHouCRIfkziw1fNwnBRph3xCL60TKPdSnEf2fEKC4LOptnoCZQnwS+BNOfsb\nMXdBv4YyKvwn4AIlywXACdGW2ofEmBbN513A21t0bmeUIDFZ6iuzXo+0Qz6hl7D++UiTCJSipbzT\nDvmEXIEi8ULgBYTFwpaSMXtJ7EoQOD9pYH5pgdL1/hNwgTIAM+4h1PN6W9IWTWDrpcEq9QiwJ/Da\nFpzXGV18BzixZN+0Qz6hlxHWUOJL3gvjuYsSk/M0gyIN5c3AtTHicylwVCbQ4O+An5k1pGkkJi/X\nUEYx3wQ+CCDxAuAqwn06aCQnkYqmmV3D4eg4hUSTaRnN4WDgrSUPOyyTV3RsN4O9CGuuP00TNBSC\n9vGz+Hkt8ExyzGix+Djw+QbnmGgo7kMZxVwOzJA4hGBPvRj4HvDiEZ7H7oQv9b3AoSN8bqfDiS8k\nn6GOhhudzzsDr8+aegsYslNe4m+BP0rsWa9vCRJzFwQBsFeOsCqlocQXtjcC10BfNFja7PU+YLkZ\ntzc4x6TasGsozUDSXEmrJa2RdGpBn3Pi/tskzUy1f0vSRkl3ZPqPl3StpLslXSNpXDPnbMZfCUXf\negjrzP9z/D3SAiV5E/wVbvZyGmcy4eE/rU6/GQQz7+3AnBLHLdRQinJRJCRxKvCvwHqa87/UJ1DM\n2Ar8HgYFsORpBnkayuHAvWYDrmsp8OYobD4d594oSbVhFyjDRdIY4FyCKnkgMF/SjEyfecA0M5tO\nMDOdl9r97Tg2y2nAtWa2H3Bd3G425wHfB94X31ZcoDidxizgWeoLlAMJS3T/lFD0sB6DnPIxF2Ur\nwak9gOjrOAd4N/Aq4Eaa429JayiQb/bKc4bnCZS0uSvhF8Bs4P3APWb8zxDm6E75JjILWGtmvWa2\nBbgEOCbT52jgQgAzWwaMkzQpbv8actca6BsTfx/b7Imbcb8ZC8x4JjblChSJPaWGoj4aIREovwZe\nPdRIM4lj23xFPacaZhFMONPr9EsEypXAW0t8V/Kc8hCio16e0z6P8EL0GjPW0zwHfp5AyTrmyzrl\nBwkUM/4efsqkAAAbCElEQVQMrADOonHfSUJi8nIfShPYm5BwlLAutjXaJ8tEM0u+0BsJb0xV0wtM\njolSaV4BHBvXR2g2yap4G4BHGEKdsTivn8RjOaOLWcB/U05DWUV4II8hmMBykdiGoIU8krN7OXBY\nTvurgB+b8UTcvo9qBEpeLkpdp7zUZxb8Xc45riaYAn8xxDmOOpNXlUsAW8l+2TeisuMwM5NU2F/S\notRmj5n1lD32wPPwjMQGQphi+kucfIFnEpKhmknaVp2YvRpdoviA+Hsq8HBzpuW0O1GbfTkhh2kb\niefXyO4+EFhphkl9Zq+VBX3HA5tSmnua5cBJOe2zgS+mtnuB4+tfRV32JQinhCKTVz0N5X8BS2Ni\nc5azgG9Es/dQaPvERklzKOc7K0WVGsp6YEpqewpBA6nVZ3Jsq8XGxCwmaU/y35YAMLNFqZ+eshMv\nIM/s9RLCG1Ceqj9c8gRKoyRvm61IOmsYiTEeIt0UDgA2xoq4aynQUiTGEaIJEyvBldQOH85zyCcs\nBw5Lm8xSgu3GVL9e+qsED4lYQn63zFweJBRifH6qrUzY8DGEyM5BmPHXOkv81iQKqecIQqXeYlwt\nwcx60s/J4R6vSoGyHJguaaqksYS3kuwaAkuAEwAkzQYeT5mzilhCfxLWiZQv1DZc7mWwQDmYEFJc\nhUDZk4xAGYIvZAah2N3UoU5CYpLEgqGOb5CFwJdH6FzdzCz6H+JrKDZ7zQBWxWQ+gOuBmVJh8cS8\nLPmEBwkms71SbQcBD2Ueyg8QzMfDqT6xD3Bfat5JqG+flpKq8JvVDJ4AdpHYNoYZv46Qa1YVTxHy\nZYaq5XQUlQkUM9tKeEAsJajQ3zezVZIWSFoQ+1wF3CtpLXA+oXQ0AJIuBm4A9pP0oKREnf4icKSk\nu4E3MFCdrpIBGkosVTEN+C75tuNCJC6XeEWdbpOIZioz7geeJqcAXh1mEITR1AbHpTkO+OQwxjfC\nS4FXj9C5ho3Ei9o04GEWsCx+XkuxYz5xyANgxlOE78tRBf2LHPLJAz3rRzk8NY+k3zMErSEteBol\n6z9JuBN4u8Rhsc+WpCpy6vzPEYTKOMJ1LiuxlO9w2EybmruqoEofCmZ2NcGxlW47P7O9sGDs/IL2\nR8kv3FY198AAITCd8La1gvDGtVuMDKlJVNfnEe7LTTW6Zs0Lidnr9w3M+UDgG8CRDYzJ8mbgRRLb\npN8IK2I/4KUSO2YfBCOJxFQzeuv02Z7wt5hLyFlqJ2bRHwm5hmIBMYPB/pIrgIUSV0QBk6aWyQv6\nBUpiQpoNueG2vYSXnAdz9pWhSKB8D/gEodrFFIIwzSMxexWau5rIU4wigeKZ8uXJ+lAOBu6ISVW3\nExzzZTiCIMgLtY0YTTaegV/E31B77ezsMXYg/FP9nBwNJfornp9tz/TZniDEnoamZDfXYz/CA2vQ\nvZQ4WRrWW20pJN4I3Cuxb52uhwJjgY808dwvHa4PSWJHgg/l1thU6EMho6FEFhMe1tdEH0uavCz5\nNHU1lEgvw9OacwWKGb8042gzDjVjD4r/Jx8lRKu9hXJL+Q6HUaWhuEApzz3Ai1MmjpcQVGwojsHP\n4w0ErabWuit7EOyu6bLbd9EftVWG6YQomLWQa5qZRxA2tXg1IaR0JRUX/4sPr50Ib8iHZ/aNAf6N\n8vWmhjqH3QgP1NUUv9UnvJJg7pxTsl5WvXNvR8g5et8wDzWT4Bf5S9wubfKCvqzzkwjCoSf60CZI\nzCdoYw/VOHefYz7ey6mEcN4sww0dLtJQBlDDb/EoIbrrQTMeGMY8yrCZUZLUCC5QShPtrM8QHvYQ\nNJShCpRvUFug5JkW1lA/SS1N4nDdDGxicL7Oy4BDpJoRN28m+MB6qb6a7H7A3YQ32lmZfYcSNLZ6\nfqfhchYhGfBfKSdQriVU6v1QE859BOH7ddowtZS0Qx7C2/G20qD6VbsQ3tJ7sweIps1TgB8RhOs9\nhKUUvgFcWnRiMx4iBIG8kPC3WlEQjtvL8CK9SgmUGjxKCAYaiYAeN3k5haTNXg0LlPgWfgDB1ltr\nDYo8gZL7YKhB2j7ey2CBcBDhH6tWpYE3EzKI88Y3m0Sg3MhggXIUIUCjMoEi8TcEX9MnCJrb63MS\nWdO8kpAM9zXgfdHUNBzmEUr+3Av8n2EcZ4BAiW/peWavA4C7M1pwH2aYGZ8jmLD2MOMYM76e0nyK\nSMxes8k3d0GJ71NRFFhMrpzKwByURnmU8D9Wtf8E3OTl1CAxe+1MiFJJnH4rgSklMuZfC/yPGU8S\nHPpF9cEGCZT4YGhES0kyoCH/H/hg4CsUCJRYEfaFhIdT3vhmkwiU3wPPl/o0QQgC5UvAfhI7NfvE\nUdB/k1C7bZMZGwnXnBVsSf8pwPaEGk9rCcEVuUEkOWO3LRBU8wjhq/8CnD6MsNp0hFdCXuhwnv9k\nEGasjQVTy5IIlMPJd8hDne+TxOHAhljxO8uewBPDXJ/9UeB+aLh68FD4NXDLCJynLXCB0hiJhjID\n+H20N9OAY/4N9JdxuJtix3w6ByXNmhpjssygQKCkQp7PBV6WeXgnHAVcF69twPiK2J9wT58jPJRe\nEee6K8HkdQ3hevIeMsPlA8D1ZgNKbFxDZtW+FK8Efpey0Z8DfKReCHEMFb+LIBzT7S8imJ9uIkSM\n/RF4R4PXgMTLCMveZiMB8zSUUgJlCCR/u1oayoPA3nmCVeKVBD/aTYTCjFneQn6ZlEa4C1g8Erkh\nZpxlNuz5dgwuUBojSW5MO+QTBpi9JI6TBq2ClxYov6fYj1IUnpmroUj8o8QbUttjYr/kwXI/AwXC\ndOCB6Be6huCgzDKX4D+BkdVQIGhFiWP+dcCNMYT1Jqoxe70b+FambSnFfpTE3JVwLSGgYE5e56iV\n/DMhE/0c4L2ZCLt5hNUAn4sPuX8B/imad7LHksRvJD6TyUrfi/Ag/lBOeHeeY75KgfJagi8lWxkD\n6MtF+QOZXBSJVxHMUCcSVkicnzYlxuv9MAOrkjeMGZdGc57TZFygNEaioaT9Jwl9AkXiWOA/gC8n\nanvUAl4U+0F4eNYSKHm1t+4m3+T1HsJiSgn7EEpvJGaBXgaWXzmI8JYGwTE5wOwVBdKR9AuUBwgm\nvdzvi8Q2EqdJQ8s4jg+K6QSBCQMd80cRFz6iAoEicRDhrf5XmV2/BQ4qyBofIFDiA/xTwCXSwNDu\nGH78K4JgPNSMrwE/JpXES7+5K+FnwF8JlbWzzCIUUJ0P/Hu897sShNV5ZlySM2bIJq9GMeMRwnd3\nWR0NoJeUY17ixYTv4glmXB2jr5aTWo6bUGhyR+pHJzotwgVKY9QVKDGP4ZsE1fwU4HvxLWsO8KvE\nTEbQHorMV6U1lPgwmUIwXSX7sglrvQzUMNLzv4oQ+rpLav+hwCNJSGVMMnyMnFwUhRX/riRoOUfE\n7UbZC3gyVZH2RmBWFDRHETSAvvZaB4oP2Eay198NXJx9q49v0b+Bfs0vHn8HgoZ6U6Z/UhLoMimU\ngY8a6jLgB8BRZn1v7F8mJA/uGI/3OvqFZuIv+zwM1EIi7yN8v15LiNS7mLA0xHKKq0YM0FCiNrMX\n4ftcBcsp9p8kZEOHTwa+YzagjPxiBoZRf5ggNKtOsHWGiAuUxniIUEzvMAbH168kPNgvBt5hxs2E\n8uG3AWcSHkzXp/oP2eSVecgcQhAO34a+mltphzwEk1c6F6VPoESz1++I/oKonZxMv3aS0EvG7CUx\nk+BwvI0gMH/L0IpY7k+/uQszHiZEx7yeoD0kSXqrCEu91lql88fA35Q5adS4/g/h75RHnh/lUIKv\nZ5BTOD4M3wpcQFj87ZPAG834Sqbu1CrCA/e9hPt2eyzkmOYnhO/anNR8dyaUwrkw/t3eTPgfFvD3\nNTSCR4CxEs+L1/wd4IsFIb3NYCHw9Tp9eonfpzindwMXZfpcTnhR2kehzPzfEFZTddoUFygNEB8K\n9wHbkSkbETWPi4ATzYL5JP6D/z2hxMN8Bq6rsAHYocCkkitQ4kNnKwxwoh9KeKh/EzgxvvGmHfLE\nqLLN9K+ol9WwLgPeJvFywhv1AcDZmdP3MtiP8kng3804LT6cehhaKez9GOxIvhH4R+Da5GEc7/EK\natdOewXlKwq8CniS4mifpcBRGQE+mxpOYTOWEe7Bz4FZVrwO+ZcIIcr/i6DhZY/zHCGZM23KfAdw\nQ8z3wIy/mHEc8JZawiEVOvxiwt9se4a+aFRdzHg4fudq0Uv/9+m1hMitAcszRC3xe4REy/cDPxxO\n9V+nelygNM49wJ15b4Nm/J1ZtnYZjxFMIRtJPbji+EGRXvEtdDsorAuWjfQ6FLjZjHsIZrfjyAiU\nSC9h3e8dCZrUmtS+JYS1M64k+H5ebzaozlLWsQ/hwf3T1HYPQxcod2fabiRodddm2gv9KFE470X5\nJNN3A/9d481+NfQFOCRkHfKDMGO1GZ+vU4/stwTN4QMUV7v9LjAjCnoImuPinPOViVZaS3ip+STw\n7pTptVX00v99+lsGaycJ3yIIlAXU13qcFuMCpXHuYbD/pCZm9AAH5Nh+8xzzEwkrNRY9JLJ+lJfT\nH+f+DULW9gEUCJS4b236jdbC0qzvAQ4y48KCcyfjAZDYG9iFgYLgFoLQatSPMsDkFUlCTksLFEKw\nwQMEX1a9EN6xhDf+7xX1iffhB8ClUl9B0roCpQzx2GcSHNi5WkzM/zgbOFViP4Lg/Wle3xKsAT4O\nLByBciNl6KX/Bed/U/B3iFrLRmCdGStGbnrOUKi02nCXcj40nnRW8JDOc8wX5aAk9AmUmOS3L/0C\n7qeE3JKnc2zyvQSBMJYcgWjGD2teQBj/9tT2qwjml77rMmOrxG+B1xB8AGUp0lDOSDmy0+3/VnCc\ngwmmprcQtLC+B2e003+OEMp6IyHqbbWFpQFq8QmC4DlP4iHC/RtO2Y8+zLhc4ro6GsZ/Esxenwcu\nGobf4zpAZsWlU0aYBwnRam8jaNi1Ftb7ODSUXOm0CNdQGsSMVWaNaSg1yHPM1ysRng4dfimhXtdf\n49y2Eh5AWe0E+gVKXoRaGZLxCa8imG2y9FDH7JXJLRhLePgPiDgy42kzPpsz/F5gp5jJn+VgQrBE\nXimclxFMj4cRHLs/IDinaxJLkPyAEOhwKfCVZibE1fM1xP1fJwjzQeauBs7zCzNOH+r4ZhO/sxuB\n0yg2dyV9f2VWN2rMaQNcoLSWPJNXPYGSNnmlzV0JZ5FfrLCXIBAOYmgC5X4G5qIcQaivlaWH4gS/\nfSUuAx6OeQcQchHWlS3vYf0LOeWZvZL8mjyBciRwmRknm/ESYFcaeECbscWMr5nxhbJjmsg5wKfN\nWN2Cc1fJfYT8mEa0WaeNqVSgSJorabWkNZJOLehzTtx/m6SZ9cZKWiRpnaQV8WdulddQMXcD0zIJ\ng2UEyrToIziU/kRJILzRFjx4Eqf6wfQnNZYmOpgfByZFU9tBhAd7lluAfdKZ4BI7SXyO4P+4kZAJ\nfmmMSMvzn9RjkB8l3o+kgkGeQEknSGLGU52Sz2DGo2YDy7V0Cb3AT8zY1OqJOM2hMh+KpDEEe/6b\ngPXATZKWmNmqVJ95wDQzmy7pcEJJhdl1xhpwtpllw1o7DjOelHiUYPJJbPmTqLGSoxl/lthMiGY6\nlODTKcP9BH/LVoZeqbWXIJS2IywuNiiKyYwt0Y/yWuAnUfgsJUQ0HWLGg/HhfzjB4XwvjQuU3xBC\nitO8gJCPsYH+JFOZYdHEdjjtt7LiaOer4MKkm6hSQ5kFrDWzXjPbQsjmPSbT52jiUqVmtgwYJ2lS\nibHtuI73UMmaveppKBC0lIPjuFIVU+Nb4CaCzyW3ZHkJegkC5Qjy/ScJPYTs++0Ifode4LgkFDma\nrd5PMEP9HY0LlF8S1nLZPdV2MP3h3OsJLx6T477XALdZiSWanZHDjFvMBoSvOx1OlQJlbwYm/62L\nbWX67FVn7EeiiWyxpFpZ051ANtKrrED538Aaq78+RZpehuY/SY+fSrFDPqGHkOX+X8BzhLLw2dIm\nTxByZiYzOKmxJlEzugF4Y6q5rz5ZFCpps9cAc5fjONVQpUApGwnTqLZxHsGRewghhv+swgMHf0vy\nM6fB84wUK4F3x9LjUF6gvJ3G11noZQj+k8z4fYkhwzX63UL4G00Gji8KdTXjVkKk2vV5++uwlIFl\nUbLRa2mBciSD81kcZ9QjaU76OTnc41WZh7Ke4BtImMLgctbZPpNjn+2KxprZI0mjpAsIJbtzMbNF\nQ5j3SHMBoRTG1RK3EBIbN9YZczehxtXNdfpl+WeGt3pcL3A68JhZsdCLfpTjCGuG1MoWx6xhc1fC\nz4CPJn4SgkD5bmr/zcAHJSYRFgor9Es5zmjFzHpI+RYlnTGc41WpoSwHpkuaKmkscDyhxEeaJYS1\nnZE0G3jczDbWGispnX/wNgYXaewoYr7Flwlv/j8FfhRrGNUisTs3pKHEHJo/DmGaCfcThHst7SQ5\n18+sv3pwFawiJJjuH5386ZL80K+hvImweFarS404TtdTmYZiZlslLSSYJsYAi81slaQFcf/5ZnaV\npHmS1hKKF55Ua2w89JmSDiGY1O6jv8JuRxN9Id+IP/VYS3Cw31avY5NJItFq+U9GhBi9lZi9NgNP\nmfGnVJd1BHPqe4EfjfwMHWf0IbPKV8FsCZLMzLopGmwAEru1ImpJYj3w5iZWCxjOXI4jvIT8B/Bx\nM47M7L+asPLktFg803GcGgz3uemZ8h1KC0NgD2kHYRL5OSEk+DDyo9duBu5zYeI4I4MXh3QawmxY\nTv2mYsZjEncQclry6n5dTv5Syo7jVIBrKE6ns5QQxTUoHNqMmyys4e44zgjgAsXpdJI1yFe2dBaO\n47hAcTqe5cAJXlbFcVqPR3k5juM4gEd5OY7jOG2CCxTHcRynKbhAcRzHcZqCCxTHcRynKbhAcRzH\ncZqCCxTHcRynKbhAcRzHcZqCCxTHcRynKbhAcRzHcZpCpQJF0lxJqyWtkXRqQZ9z4v7bJM2sN1bS\neEnXSrpb0jWSxlV5DY7jOE45KhMoksYA5xIWODoQmC9pRqbPPGCamU0HPgicV2LsacC1ZrYfcF3c\ndmogaU6r59AO+H3ox+9FP34vmkeVGsosYK2Z9ZrZFuAS4JhMn6OBCwHMbBkwTtKkOmP7xsTfx1Z4\nDd3CnFZPoE2Y0+oJtBFzWj2BNmJOqyfQLVQpUPYGHkxtr4ttZfrsVWPsRDPbGD9vBCY2a8KO4zjO\n0KlSoJQtY1ymsqXyjmehVHJ3lkt2HMfpMKpcAng9MCW1PYWgadTqMzn22S6nfX38vFHSJDPbIGlP\n4JGiCUhyYRORdEar59AO+H3ox+9FP34vmkOVAmU5MF3SVOAh4HhgfqbPEmAhcImk2cDjZrZR0p9q\njF0CnAicGX9flndyXwvFcRxnZKlMoJjZVkkLCWt+jwEWm9kqSQvi/vPN7CpJ8yStBTYDJ9UaGw/9\nReBSSScDvcA7q7oGx3Ecpzxdu2Kj4ziOM7J0XaZ8mWTKbkXSFEnXS7pL0p2SPhrbR20yqKQxklZI\nuiJuj8p7IWmcpB9KWiVppaTDR/G9+Ez8H7lD0vckbT9a7oWkb0naKOmOVFvhtcd7tSY+U4+qd/yu\nEihlkim7nC3AKWZ2EDAb+HC8/tGcDPoxYCX90YCj9V78O3CVmc0AXgqsZhTei+iX/QBwqJm9hGBS\nfxej5158m/B8TJN77ZIOJPivD4xjvi6ppszoKoFCuWTKrsXMNpjZrfHzk8AqQv7OqEwGlTQZmAdc\nQH94+qi7F5J2B15jZt+C4KM0sycYhfcC+DPhxWsnSdsCOxECf0bFvTCzXwOPZZqLrv0Y4GIz22Jm\nvcBawjO2kG4TKGWSKUcF8U1sJrCM0ZsM+hXgU8BzqbbReC/2Af4g6duSbpH0n5J2ZhTeCzN7FDgL\neIAgSB43s2sZhfciRdG178XAVI+6z9NuEygeYQBI2gX4EfAxM9uU3jdakkElvRV4xMxWUJA8O1ru\nBSGa81Dg62Z2KCGicoBJZ7TcC0kvBv4BmEp4YO4i6W/TfUbLvcijxLXXvC/dJlDKJFN2NZK2IwiT\ni8wsydHZGGukUS8ZtIt4FXC0pPuAi4E3SLqI0Xkv1gHrzOymuP1DgoDZMArvxWHADWb2JzPbCvwY\neCWj814kFP1P5CWer6cG3SZQ+pIpJY0lOJSWtHhOI4YkAYuBlWb21dSuJBkUaiSDdhNmdrqZTTGz\nfQhO11+Y2XsYnfdiA/CgpP1i05uAu4ArGGX3ghCMMFvSjvH/5U2EoI3ReC8Siv4nlgDvkjRW0j7A\ndODGWgfqujwUSX8DfJX+hMgvtHhKI4akVwO/Am6nXzX9DOFLcCnwQmIyqJk93oo5tgJJrwM+YWZH\nSxrPKLwXkl5GCE4YC9xDSCIew+i8F58mPDifA24B3g/syii4F5IuBl4HTCD4S/4vcDkF1y7pdOB9\nwFaCCX1pzeN3m0BxHMdxWkO3mbwcx3GcFuECxXEcx2kKLlAcx3GcpuACxXEcx2kKLlAcx3GcpuAC\nxXEcx2kKLlAcJwdJu0v60BDHXilpt2bPqcb5hjxXx2kmnofiODnE4ppXxBLn2X3bxrIdLSdWzJ1M\nwVwdZyRxDcVx8vki8OK4ONe/SXqdpF9Luhy4E0DSZZKWx8XMPpAMlNQbFy2aGhe0+mbss1TSDtkT\nSfovSd+QdJOk30t6S2yfKulXkm6OP6+M7XNSc7kL+EJqrmeOwL1xnFwqW1PecTqcU4GDzGwmhIc4\nYTmAg8zs/tjnJDN7TNKOwI2SfmhmjzGwIus04Hgz+6Ck7wNvB/47cy4DXmhmr5A0Dbg+/t4IHGlm\nz0iaDnwPeEUc0zcXSS8CDk7m6jitwgWK4+STV/L+xpQwAfiYpGQxoinkF8+7z8xuj59vJpRNz+NS\nADNbK+leYH/gfuDcWIfr2Xj8vLnklud3nJHGBYrjlGdz8iFqLG8EZpvZXyRdDwwyZwHPpD4/C+zY\nwPlOAR42s/fE5a3/kjcXx2kX3IfiOPlsIlSgLWI34LEoTA4AZg/jXAKOU2AasC/w+3iODbHPCYTq\nwEOZq+OMCC5QHCcHM/sT8FtJd0RHd3Ylu58B20paSXCK/67oUHW2k7YHCOayK4EFZvYM8HXgREm3\nEkxgT+YdJ2eujtMSPGzYcVqMpG8Twn5/3Oq5OM5wcA3FcRzHaQquoTiO4zhNwTUUx3Ecpym4QHEc\nx3GaggsUx3Ecpym4QHEcx3GaggsUx3Ecpym4QHEcx3Gawv8HjDMNin5V+loAAAAASUVORK5CYII=\n"}, "output_type": "display_data"}], "cell_type": "code", "metadata": {"trusted": false, "collapsed": false}, "source": "%pylab inline\nfrom matplotlib import pyplot as plt\nplt.plot([x[1] for x in errfunc])\nplt.xlabel(\"train part\")\nplt.ylabel(\"MAE stdev\")\nplt.show()\n", "execution_count": 14}, {"cell_type": "markdown", "metadata": {"collapsed": true}, "source": "\u041b\u0443\u0447\u0448\u0435\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0438 \u0434\u0435\u0440\u0435\u0432\u044c\u044f \u0438 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0435 \u0441\u043e\u0441\u0435\u0434\u0438 \u0441 \u0446\u0435\u043d\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0438 \u043d\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u043a\u043e\u0439 \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u043e\u0432.\n\u0423 \u0434\u0435\u0440\u0435\u0432\u044c\u0435\u0432 \u0432\u044b\u0448\u0435 \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e\u0441\u0442\u044c \u0438 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c, \u0443 \u0441\u043e\u0441\u0435\u0434\u0435\u0439 -- \u043f\u043e\u043b\u043d\u043e\u0442\u0430. \u0425\u0443\u0436\u0435 \u0432\u0441\u0435\u0445 \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440"}, {"cell_type": "markdown", "metadata": {}, "source": "### 3. \u0412\u044b\u0431\u043e\u0440 \u043f\u043e\u0440\u043e\u0433\u0430 \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438"}, {"outputs": [{"metadata": {}, "data": {"text/plain": "<matplotlib.figure.Figure at 0x10ef662b0>", "image/png": "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\n5aA8bNgw2rZtG/N11llnAbBw4UIaNWrEQQcdVHn/Pn368Pnnn1crX6RS2rdvHytWrGDr1q3VtjE8\nVDXjX07M0N96NOgshbUKXeK+dwx9GMNixiDp/hxpenZNgCCwDvgxZPdz8L4LGUtZWZlOnTq18njJ\nkiUqIrpkyZLKc4MHD9Z//vOflccVFRXaokULLS8v1wkTJujAgQOr9Dl69GgNBoN1kqdt27b66aef\nqqrqqFGj9JZbbqm89vbbb2vXrl1VVfX999/X4uJiraioSLjvxx9/XEtLSyuP9+7dq02aNNH58+dX\nnnv44Yd10KBBqqp6+umn6/3331+nz6GqOmPGDO3UqVOVc4888khl/9HccsstOmDAAF2/fr2uXr1a\n+/fvr3l5ebpmzZr92o0aNarOcmUCkWOk7v97qfXvLCsthibs2ohLvb02gfYNfbfzEUBf3L6EJ70v\nkZFiIpdsysvLueGGGypnxKFZ88qVKykvL2fmzJlVZszPPPMMa9cm8lWHu+66i969e9OmTRvatm3L\nt99+y4YNG+K+b/ny5XTv3p28vNoNCZGfa8OGDezZs4fu3btXnistLWXlSmfYr1ixgh49etSq/0ha\ntmzJli1bqpz79ttvadUqdtmYm2++mX79+tG3b19OOOEERowYQaNGjejYsWOVdvaT2J9sVAxFPflq\nG7COxJZDGrR/QVU/UdWz1fYlpITqlmoiz5eWlvLII4+wefPmytf27ds5/vjjKS0t5cQTT6xybevW\nrfztb3+Le+933nmHO++8k4kTJ/LNN9+wefNmWrduXTnwFRQUsGNHOFHAmjXhILRu3bqxbNmyWjuQ\nIz9XUVERjRs3ZunSpZXnli1bRteuXSvvsWjRopj9nHnmmbRq1Srma+jQoQAcfPDB7N27t0ofc+fO\n5fDDD4/ZZ7NmzfjrX//KihUrWLRoEe3ateOYY46p8TMYjmxUDMW9+WI3CTieJSidgIOBGb5LZRhA\nx44dWbx4cY1trrrqKu64447KaJpvv/220sE8bNgwFi5cyFNPPcWePXvYs2cPH330EQsWLACcw/eA\nAw6I2e/WrVtp1KgRRUVF7N69m9tuu63KDLtv375MmTKFzZs3s2bNGu67777Ka/3796dz58785je/\nYceOHezcuZP333+/Vp89Pz+fH/3oR9x8881s27aN8vJy7r33Xi655BIAfvrTn3LXXXcxa9YsVJVF\n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\nvdq4cWP98ssvK6/ddNNNle+tLS+++KL269ev8rgmxTB69Gi98cYba9X/oEGDNBAIVB4/+eSTetxx\nx1Vpc/zxx+vYsWN11apVmpeXF1MZJ8oVV1yhv/nNb6qcGzBggD7xxBMx22/cuFH79eunjRo1UhHR\nyy67LGa72267TU866aRq75tsxZA1S0kdWNcEWCVBaQwMBl6pT39REUffU9Udcd5iGHFR9b+0Z0FB\nAc8++ywPPfQQXbp0YdiwYXz55ZdAzWU0n3zySfr160fbtm1p27Yt8+bNY+PGjfu1Ky8vZ+bMmZXt\n2rZtyzPPPMPatWvZsGEDe/furVLaM7L2QzzWrl3LBRdcQNeuXWndujWXXnppTBliUdcSoZGyrlq1\naj95u3fvzqpVq1ixYgXt2rWjdevWtb5HiNqUIVVVzjjjDM4//3x27NjBhg0b2LRpE7/+9a/3a/vk\nk0/yk5/8pM5y1ZasUQwV5O9FdRswEPhKAxqr7nNcqsmEahFHRlJIVWnP008/nTfeeIM1a9bQq1cv\n/ud/XImS6spolpeXM3r0aP72t7+xadMmNm/ezOGHHx6aVVahtLSUE088kc2bN1e+tm7dyt/+9jeK\niopo1KhRlUibmqJuornpppvIz89n3rx5fPvtt4wbN459+8KBhS1atKhShnT16vDPvKYSoTURGSVW\nUlJCeXl5levl5eWUlJTQrVs3Nm3aVMXnESJUDKi61/jx4wE47LDDmDt3buX7tm/fzuLFiznssMP2\n63PDhg188sknXHvttTRu3Jh27doxatQopkyZUqXde++9x+rVqznvvPNq/dnrStYohi0UhtTwcOCl\nenTVGeiF7UswfMKP0p6RrFu3jkmTJrF9+3YaN25MQUEB+fn5QPVlNLdv346IUFRUxL59+3j88ceZ\nN29ezP6HDh3KwoULeeqpp9izZw979uzho48+YsGCBeTn53POOecwZswYvvvuO7744gueeOKJKoPv\noEGDCAaDMfvetm0bBQUFFBYWsnLlSu68884q1/v27cvTTz9NRUVF5TMMccUVV/D444/z1ltvsW/f\nPlauXFlpKdVE5E98yJAhLFy4kPHjx7N3716effZZFixYwLBhw+jUqRNnnnkmV199Nd988w179uyp\nvH9paWm1JUi3bt3KhRdeCMCIESOYN28eL7zwAjt37iQYDNK3b18OPvjg/eQqKiqic+fOPPjgg1RU\n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\n"}, "output_type": "display_data"}, {"metadata": {}, "data": {"text/plain": "<matplotlib.figure.Figure at 0x10ef2f630>", "image/png": "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\n"}, "output_type": "display_data"}], "cell_type": "code", "metadata": {"trusted": false, "collapsed": false}, "source": "plt.figure()\ndef draw_roc(X, y, clf, label):\n from sklearn.metrics import roc_curve, auc\n X_train, X_test, y_train, y_test = ttsplit(X, y, train_size = 0.5)\n clf.fit(X_train, y_train)\n y_test_pred = clf.predict(X_test)\n\n fpr, tpr, _ = roc_curve(y_test, y_test_pred)\n roc_auc = auc(fpr, tpr)\n plt.plot(fpr, tpr, label=\"%s, auc_roc=%0.2f\" % (label, roc_auc))\n\ndef draw_precision_recall(X, y, clf, label):\n from sklearn.metrics import precision_recall_curve\n X_train, X_test, y_train, y_test = ttsplit(X, y, train_size = 0.5)\n clf.fit(X_train, y_train)\n y_test_pred = clf.predict(X_test)\n\n precision, recall, _ = precision_recall_curve(y_test, y_test_pred)\n# roc_auc = auc(fpr, tpr)\n plt.plot(recall, precision, label=\"%s\" % (label))\n\n\n\ndraw_roc(X, y, DT(criterion='gini', max_depth=7), \"tree\")\ndraw_roc(X, y, KNN(n_neighbors=10, metric='minkowski', p=2), \"knn\")\ndraw_roc(scale(X), y, KNN(n_neighbors=10, metric='minkowski', p=2), \"knn scaled\")\n\nplt.plot([0, 1], [0, 1], 'k--')\nplt.xlim([0.0, 1.0])\nplt.ylim([0.0, 1.0])\nplt.xlabel('False Positive Rate')\nplt.ylabel('True Positive Rate')\nplt.legend(loc=\"lower right\")\nplt.show()\n\nplt.figure()\ndraw_precision_recall(X, y, DT(criterion='gini', max_depth=7), \"tree\")\ndraw_precision_recall(X, y, KNN(n_neighbors=10, metric='minkowski', p=2), \"knn\")\ndraw_precision_recall(scale(X), y, KNN(n_neighbors=10, metric='minkowski', p=2), \"knn scaled\")\n\n# plt.plot([0, 1], [0, 1], 'k--')\nplt.xlim([0.0, 1.0])\nplt.ylim([0.0, 1.05])\nplt.xlabel('precision')\nplt.ylabel('recall')\nplt.legend(loc=\"lower left\")\nplt.show()\nplt.show()", "execution_count": 16}, {"cell_type": "markdown", "metadata": {}, "source": "### 4. \u041a\u0440\u043e\u0441\u0441-\u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f \u0438 \u043f\u043e\u0434\u0431\u043e\u0440 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432"}, {"outputs": [{"name": "stdout", "text": "{'criterion': 'entropy', 'max_depth': 6}\n0.944775997288\n", "output_type": "stream"}], "cell_type": "code", "metadata": {"trusted": false, "collapsed": false}, "source": "# \u0411\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c k-fold\nfrom sklearn.grid_search import GridSearchCV\ngridDT = param_grid={'criterion': ['gini', 'entropy'], 'max_depth' : [5, 6, 7, 8,9, 10, 11, 12]}\nsearchDT = GridSearchCV(DT(), gridDT, cv=5, scoring='roc_auc')\nsearchDT.fit(X_train, y_train)\nX_test_pred = searchDT.best_estimator_.predict(X_test)\n\n#print_quality_metrics(y_norm_test, y_norm_test_pred)\nprint(searchDT.best_params_)\nprint(searchDT.best_score_)", "execution_count": 27}, {"outputs": [{"name": "stdout", "text": "{'weights': 'distance', 'n_neighbors': 12, 'p': 1}\n0.912020056804\n", "output_type": "stream"}], "cell_type": "code", "metadata": {"trusted": false, "collapsed": false}, "source": "gridKNN = param_grid={'n_neighbors': [x for x in range(1, 40)], 'weights' : ['uniform', 'distance'], 'p': [1,2,3] }\nsearchKNN = GridSearchCV(KNN(), gridKNN, cv=5, scoring='roc_auc')\nsearchKNN.fit(X_train, y_train)\nX_test_pred = searchKNN.best_estimator_.predict(X_test)\n\n#print_quality_metrics(y_norm_test, y_norm_test_pred)\nprint(searchKNN.best_params_)\nprint(searchKNN.best_score_)", "execution_count": 37}, {"cell_type": "markdown", "metadata": {}, "source": "\u0421\u0440\u0430\u0432\u043d\u0438\u043c \u0441 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c\u0438, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u043c\u0438 \u0440\u0430\u043d\u0435\u0435:"}, {"outputs": [{"name": "stdout", "text": "\u0414\u0435\u0440\u0435\u0432\u044c\u044f: \u0431\u0435\u0437 \u043f\u043e\u0434\u0433\u043e\u043d\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 vs. \u0441 \u043f\u043e\u0434\u0433\u043e\u043d\u043e\u043c - 0.905345 vs 0.944776\n\u0421\u043e\u0441\u0435\u0434\u0438: \u0431\u0435\u0437 \u043f\u043e\u0434\u0433\u043e\u043d\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 vs. \u0441 \u043f\u043e\u0434\u0433\u043e\u043d\u043e\u043c - 0.778820 vs 0.912020\n", "output_type": "stream"}], "cell_type": "code", "metadata": {"trusted": false, "collapsed": false}, "source": "from sklearn.metrics import roc_auc_score\nprint(\"\u0414\u0435\u0440\u0435\u0432\u044c\u044f: \u0431\u0435\u0437 \u043f\u043e\u0434\u0433\u043e\u043d\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 vs. \u0441 \u043f\u043e\u0434\u0433\u043e\u043d\u043e\u043c - %f vs %f\" % (roc_auc_score(y_test, clfDT.predict(X_test)), searchDT.best_score_))\nprint(\"\u0421\u043e\u0441\u0435\u0434\u0438: \u0431\u0435\u0437 \u043f\u043e\u0434\u0433\u043e\u043d\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 vs. \u0441 \u043f\u043e\u0434\u0433\u043e\u043d\u043e\u043c - %f vs %f\" % (roc_auc_score(y_test, clfKnn.predict(X_test)), searchKNN.best_score_))", "execution_count": 38}, {"cell_type": "markdown", "metadata": {}, "source": "\u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u043f\u043e\u0434\u0431\u043e\u0440 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u043b\u0443\u0447\u0448\u0430\u0435\u0442 \u0446\u0435\u043b\u0435\u0432\u0443\u044e \u043c\u0435\u0442\u0440\u0438\u043a\u0443"}], "nbformat": 4} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment