Вы не можете выбрать более 25 тем
Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
614 строки
80 KiB
Plaintext
614 строки
80 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Лабораторная №1 - Бинарная классификация фактографических данных\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Методические указания\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"Основной библиотекой, которую рекомендуется использовать в данном курсе работ, является библиотека scikit-learn (http://scikit-learn.org). Библиотека scikit-learn предоставляет реализацию целого ряда алгоритмов для обучения с учителем (Supervised Learning) и обучения без учителя (Unsupervised Learning) через интерфейс для языка программирования Python.\n",
|
|
"\n",
|
|
"В данной работе нам потребуются следующие модули:\n",
|
|
"* [confusion_matrix](http://scikit-learn.org/stable/modules/generated/sklearn.metrics.confusion_matrix.html)\n",
|
|
"* [classification_report](http://scikit-learn.org/stable/modules/generated/sklearn.metrics.classification_report.html)\n",
|
|
"* [accuracy_score](http://scikit-learn.org/stable/modules/generated/sklearn.metrics.accuracy_score.html)\n",
|
|
"* [metrics](http://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_auc_score.html#sklearn.metrics.roc_auc_score)\n",
|
|
"* [train_test_split](http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html )\n",
|
|
"* [LogisticRegression](http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html )\n",
|
|
"* [KNeighborsClassifier](http://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html )\n",
|
|
"* [RandomForestClassifier](http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html)\n",
|
|
"* [GaussianNB](http://scikit-learn.org/stable/modules/generated/sklearn.naive_bayes.GaussianNB.html )\n",
|
|
"\n",
|
|
"А также, в зависимости от варианта задания – один из модулей встроенных генераторов датасетов – \n",
|
|
"* [make_blobs](http://scikit-learn.org/stable/modules/generated/sklearn.datasets.make_blobs.html )\n",
|
|
"* [make_moons](http://scikit-learn.org/stable/modules/generated/sklearn.datasets.make_moons.html )\n",
|
|
"* [make_classification](http://scikit-learn.org/stable/modules/generated/sklearn.datasets.make_classification.html#sklearn.datasets.make_classification )\n",
|
|
"\n",
|
|
"Кроме того, в работе будет использоваться библиотека NumPy http://www.numpy.org, позволяющая работать с многомерными массивами и высокоуровневыми математическими функциями.\n",
|
|
"Программный код для импорта указанных модулей может выглядеть следующим образом: \n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Импортируем требуемые модули"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 19,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# библиотека для работы с массивами\n",
|
|
"import numpy as np \n",
|
|
"\n",
|
|
"# Требуемые модули из sklearn\n",
|
|
"from sklearn.datasets import make_blobs\n",
|
|
"from sklearn.metrics import confusion_matrix, classification_report, accuracy_score, roc_auc_score\n",
|
|
"from sklearn.model_selection import train_test_split\n",
|
|
"from sklearn.neighbors import KNeighborsClassifier\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"Для построения графиков рекомендуется использовать библиотеку matplotlib и ее модуль [pyplot](https://matplotlib.org/users/pyplot_tutorial)\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 3,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"import matplotlib.pyplot as plt"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"\n",
|
|
"А для отображения на графике области принятия решения - готовую функцию `plot_2d_separator`, которой нужно передать на вход объект `classifier` – модель классификатора и `X` – массив входных данных:\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 5,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"def plot_2d_separator(classifier, X, fill=False, line=True, ax=None, eps=None):\n",
|
|
" if eps is None:\n",
|
|
" eps = 1.0 #X.std() / 2.\n",
|
|
" x_min, x_max = X[:, 0].min() - eps, X[:, 0].max() + eps\n",
|
|
" y_min, y_max = X[:, 1].min() - eps, X[:, 1].max() + eps\n",
|
|
" xx = np.linspace(x_min, x_max, 100)\n",
|
|
" yy = np.linspace(y_min, y_max, 100)\n",
|
|
" X1, X2 = np.meshgrid(xx, yy)\n",
|
|
" X_grid = np.c_[X1.ravel(), X2.ravel()]\n",
|
|
" try:\n",
|
|
" decision_values = classifier.decision_function(X_grid)\n",
|
|
" levels = [0]\n",
|
|
" fill_levels = [decision_values.min(), 0, decision_values.max()]\n",
|
|
" except AttributeError:\n",
|
|
" # no decision_function\n",
|
|
" decision_values = classifier.predict_proba(X_grid)[:, 1]\n",
|
|
" levels = [.5]\n",
|
|
" fill_levels = [0, .5, 1]\n",
|
|
" if ax is None:\n",
|
|
" ax = plt.gca()\n",
|
|
" if fill:\n",
|
|
" ax.contourf(X1, X2, decision_values.reshape(X1.shape),\n",
|
|
" levels=fill_levels, colors=['cyan', 'pink', 'yellow'])\n",
|
|
" if line:\n",
|
|
" ax.contour(X1, X2, decision_values.reshape(X1.shape), levels=levels, colors=\"black\")\n",
|
|
" ax.set_xlim(x_min, x_max)\n",
|
|
" ax.set_ylim(y_min, y_max)\n",
|
|
" ax.set_xticks(())\n",
|
|
" ax.set_yticks(())\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Генерация и знакомство с выборкой"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"Сгенерируем данные, с которыми будем работать. В нашем случае это будут 2 «пузыря» (blob). \n",
|
|
"\n",
|
|
"Передадим в качестве параметров:\n",
|
|
"* `centers = 2` – количество классов-пузырей, \n",
|
|
"* `random_state = 66` – основа, используемая для генерации случайных чисел, \n",
|
|
"* `cluster_std = 4` – стандартное отклонение кластеров,\n",
|
|
"* `shuffle = 1` – перемешиваем объекты внутри выборки.\n",
|
|
"\n",
|
|
"В массив с именем `Х` сохраним координаты каждого объекта выборки, а в массив `у` – метки классов\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 7,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"X, y = make_blobs(centers = 2 , random_state = 66, cluster_std = 4, shuffle = 1)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"Посмотрим, что из себя представляют массивы Х и у. Выведем первые 15 элементов каждого из массивов"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 8,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Координаты точек: \n",
|
|
"[[-14.80437794 -7.18377798]\n",
|
|
" [ -2.60632729 0.20074702]\n",
|
|
" [ -7.67410393 -0.92722787]\n",
|
|
" [-18.73964269 -1.88968606]\n",
|
|
" [ -3.7511755 3.11333437]\n",
|
|
" [ -6.13559977 -8.39517379]\n",
|
|
" [ -8.10457133 6.15227722]\n",
|
|
" [ 4.91341461 -2.95516942]\n",
|
|
" [ -2.86156125 10.56078045]\n",
|
|
" [ 0.52303829 3.14548666]\n",
|
|
" [ 3.53563356 5.80649298]\n",
|
|
" [ -6.05018557 -2.10920558]\n",
|
|
" [ 0.8102374 1.86943425]\n",
|
|
" [ -8.0759995 -0.91582206]\n",
|
|
" [ -9.37948058 -10.35367349]]\n",
|
|
"Метки класса: \n",
|
|
"[0 1 0 0 1 0 1 0 1 1 1 0 1 1 0]\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"print (\"Координаты точек: \") \n",
|
|
"print (X[:15])\n",
|
|
"print (\"Метки класса: \") \n",
|
|
"print (y[:15])\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"Первый элемент выборки с координатами `[-14.80437794 -7.18377798]` относится к классу 0, \n",
|
|
"второй элемент `[ -2.60632729 0.20074702]` – к классу 1, третий `[ -7.67410393 -0.92722787]` - к классу 0 и т.д.\n",
|
|
"\n",
|
|
"Отобразим на графике сгенерированные данные. \n",
|
|
"В качестве координат точек передадим первый и второй столбец массива `Х`, а для указания цвета точки (параметр `с`) используем метку класса из массива `у`\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 9,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"<function matplotlib.pyplot.show(*args, **kw)>"
|
|
]
|
|
},
|
|
"execution_count": 9,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
},
|
|
{
|
|
"data": {
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAXkAAAD4CAYAAAAJmJb0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzdd3hU1dbA4d8609PoKCJNQQVBBAGxCyICoohe67UX7F1Rr+Xa9doLNuwN/bBhwV5RmiKoNFF6J5SQNn3O/v44AyaZSUKSKZnJfp8nD+TMzDlrJsmaPbusLUopNE3TtOxkpDsATdM0LXl0ktc0TctiOslrmqZlMZ3kNU3TsphO8pqmaVnMnu4AKmrdurXq3LlzusPQNE3LKL/++usmpVSbeLc1qiTfuXNnZs2ale4wNE3TMoqIrKjuNt1do2malsV0ktc0TctiOslrmqZlsYQkeRF5SUQKRWRehWO3i8gaEfkt+jUiEdfSNE3TdlyiWvKvAMPiHH9UKbVv9OvTBF1L07RGQimFCi1CBX9FKX+6w9HiSMjsGqXUFBHpnIhzaZqWGVR4JapoDJjrABtgovJvx8g5Lt2haRUku0/+MhH5I9qd0yLeHURkjIjMEpFZGzduTHI4mqYlglIKVXQ2RJaD8oEqA+WFkttQofnpDk+rIJlJ/hlgd2BfYB3wcLw7KaXGK6X6KaX6tWkTdy6/pmmNTeg3MIsAs8oNQZT3jXREpFUjaUleKbVBKRVRSpnA88CAZF1L07QUM4sAiXcDRDalOhqtBklL8iLSrsK3o4F51d1X07QM49wXVCjODR5wDUp5OFr1EjLwKiJvAYcDrUVkNfBf4HAR2RdQwHLgwkRcS9O09BOjJSrvQih/3uqTB8ANtvZIzui0xqZVlqjZNafGOfxiIs6taVrjZORdhnL0QpW/DqoEXEchOacg4kl3aFoFjapAmaZpmUVchyGuw9IdhlYDXdZA0zQti+kkr2malsV0ktc0TctiOslrmqZlMZ3kNU3TsphO8pqmaVlMJ3lN07QsppO8pmlaFtNJXtM0LYvpJK9pGUpFClHh1Sil0h2K1ojpsgaalmFUeDVq65UQXgQYYLSC5g8jzr7pDk1rhHRLXtMyiFJh1JbTIDwfCAJ+MNegis5FRQrTHZ7WCOkkr2mZJDgVVCkxOzKpMMr3flpC0ho33V2jaZkksh5UJM4NQYisSnk4qabCyyA0B4ydwDkQEVu6Q2r0dJLXtEzi6B3/uOQgzv1TG0sKKWWiim8A/+cgNkBACqDlm4h913SH16jp7hpNyyDi2AtchwDuCkedYOwM7mHpCivplPdd8H8JBEB5QZWDuQG19bJ0h9bo6SSvaRlGmj8O+deCbXewdYDcc5BW7yLiTHdoyeN7E/BVOWhCeAkqsi4dEWUM3V2jaRlGxI7kngW5Z6U7lNRR/mpuMCrsMavFo5O8pjUxyiyG4CwQDzgHINK404BSEZDc+Dca+WDrnNJ4Mk3j/ulqmpZQZvmbUHo/iANQgBNavoQ49k53aNVS5c9DeHGcW2xIs4cQ0b3ONdGvjqY1ESo0H0r/hzV4WWYNXqoi1JZzUCqU7vCqV/4qEK+7xglZPKMoUXSS17QMppS5w7VrlHci1irZqsIQnJ7QuBJKlVRzgx+It2ZAq0gneU3LQCr0J+bmk1EbuqM27INZfCvK9NbyoGJiVspaN4BZlowwE8OxT/zj9m6NfjyhMUhIkheRl0SkUETmVTjWUkS+EpG/o/+2SMS1NK2pU5H1qC2nWis/UUAAfB+gtl5S4+PENRQkJ84JQ+AamJRYE0EKbrYGidm2utUA3EjBf9MYVeZIVEv+FaDqSowbgW+UUt2Ab6Lfa5pWDaUUyv8t5pYLMbecjfK+H7evXHnftBJzJUEIzkbFHaCMcg8Fe09gW6IXwAN5VyFGywQ9i8QTR0+k1fvgPhZs3cA9Amk1EXH2T3doGSEhn3WUUlNEpHOVw6OAw6P/fxX4HrghEdfTtGykSu8G33vWik5ABeeA/0No8VLlGi2hhcTtWxc7hJeBvWvc84vYoeXL4P8C5f8UjHzEc3JGlCgW++5I8/+lO4yMlMwOrZ2UUusAlFLrRKRtvDuJyBhgDEDHjh2TGI6mNV4qvBy8E4FAhaM+CP0OgSngHvTPYUcvCM4gJtGrULUJfhsRB3hGIp6RCYpca+zSPvCqlBqvlOqnlOrXpk2bdIejaekRnEHcP0flRQV+qHRIck4DcWF1t2zjAtcBiL1LMqPUMlAyk/wGEWkHEP1X72igadUxmkHcRT0OqNJfLrY2SKt3wHmQdbvkQ87pSPNxKQlVyyzJ7K75CDgLuD/674dJvJamZTbXIOK3uWyIZ3TMUbHvhrR8KelhaZkvUVMo3wKmA3uKyGoROQ8ruR8pIn8DR0a/1zQtDhE30vIVMFpbdVokz/q32cOIvUO6w9MyWKJm15xazU1HJOL8mtYUiKMXtPnRGmxVQXD2QcSV7rC0DKeXi2laIyJigwyY0qhljrTPrtE0rWlQoT8wN5+Kub4nZuFBmGUvolS8MgtaIumWvKZpSadCf6M2n8H23Z3MjVD2BMrciBToxfDJpFvymqYlnSp/msoLvQB84H0T1ZiLo2UBneQ1TUu+0HziVsAUB0RWpjycpkR312iaBoBSYQh8B+G/wdYJ3EcmbnNwe1eIrMCqmlnxoiGwtU/MNbS4dJLXNA1lbkVtPhnMQqtAmuRY2wS2egex7dzg80veJajAT1Te4ckNnmMQo1mDz69VT3fXaJqGKn0QIqutLQFR1r/mRlTxzQk5vzh6Ii2eBdtugGG9ieScjhTckZDza9XTLXlN08D/GVC1Rr0JwWkoFbKqVzaQuA5E2nyOUkHAgYjU+hit4XSS1zSNmL7yJIrXz6+UguB0q849DsRzHOLsnbKYsplO8pqmgXsE+D4AwhUOGuA8MCGt+JoopVAlN1mfJpQPEJTvHVTuORj51yb12k2B7pPXNA3Jvx5sHayiaIj1r9EaaXZ38i8emg2+bQkerE8VQSh/DrPsheRfP8vplrymaYjRHFpPjk6h/Cs6hXJo4qZQ1kD5v6byrJsKyh5BuQ5DHN2SHke20i15TdMAaw9YcR+J5F2KeEYi4kSFl2EWXYa5YQDmxqMwve9Y/ecJvbCH6lNRBOV7N7HXa2J0ktc0LS4VXo3afAIEvga1FSLLoORuVNmjCb2OeI6l8laGlaIAVZLQ6zU1OslrWU8phQrOQfk+QYWXpTucjKHKnwflp3I5Ah+Uv4wySxN2HbF3hryrq7k1B3HpbSkaQvfJa1lNmVtQW86CyCpAQIVRrkFI80cQqd+vvzLLwG+9YYijJ7iPSknfdcqFfqXybJsocUB4KSRwiqORdwGm2grlr7B9vr7kgKNPdGvEzKfCq60VxfY9ECMvZdfVSV7LamrrWAgvoVKyCnyPKn8JyRtT9/OFl1rL/1UQ8KEkB8oeg1bvIkaLhMXdKNg6WXVs4tabaXipg6qM/OtRrsNR3omgyhH30dE3UFvCr5UoSvlBBRGjoPr7mMWoossg9Jv1BqlCqLxLMPIuTkmMurtGy1rKLIPgdGJbo37wvlW/cxbfFO0jjk73U16IrEeVPtKQUBslybsQqLr9oAtchyK2nZJzTWd/jOYPYrR4GvEcXe9PW8mmzBLMoitQG/ZDFQ7E3DgMFZwd/75br7GmiRIAVWb9W/Ysyv9FSmLVSV7LYsEabqtmyl4NlOmF0FxiV4eGwP95nc/X2IljH6T5Y2DsBDitL/dwpPlD6Q4t7VTRBRD4FqtrKQyRpaiic1DhymWTVWQzBGcSWzLChyp7MSWxNs63SU1LADFaomwdILK0yi12cA2uzwlruLHxdik0hLgHW33i5mYwchHxNPicSplIja9l46ZCf0JoITGNCBVGed9ACv5T4dhWqm1LR1IzCSBzX2lN2wHS7H5rAI9tA6MeMFoieVfV/VziBudAYhO6EzzHNTDSxktEEFvrBid40/shZuGhqA17YRYeiFn+doIiTLHIaojbjRSKjv9UYOtI3MFrAFWGUlV3y0o83ZLXspo494XWn6G8b0dnhOyHeE5AjPz6na/Zvagtp4K51RqAFDvYuiF5V9T5XEqFrYFNyUXsHesVT6YwfZOh5Fa2d5OZm6D0PkzAyD0lnaHVnX1P62cfwwXOvpWOiDhQ5ADx5vo7ILIBkvyz10ley3pia4fkVzcPu67n2hlafwWBH61pmY69wNG/zmVzlf9raxCXsPUx37470uJpxLZLQuJsTJRZDiV3EDsO4oPyJyDDkrzYO6DcR0KlcgxWjXzJOTX2Ac7u0X75OIzWyQpzu6QneRFZDpQCESCslOqX7GtqWjKJ2MFd/7nbKrzYmnFRMemF/7Tm87f+MqvqrCvTi9p8fLRvOg5zM0qFG+0smupIswdQ9pfA+6a1wYrrMCT/WsRoGXvfvMtRW36n0s9bPOA5CTFykh5rql7ZQUqpTSm6lqY1aqr8TeJu0GFuhNCcmI/8mUz53oXIuurvYLSpMcErpawuLbUV7D1SuoioJiJ2a53FDqy1EOcAVLOHofQeMDeAuMBzBpJf93Gh+sist09NywbmOqwPtlUZVqJvIGVuBaRee6eqyHqU732IrEdcB4LriIbVkw98S/XTVZ2QV329eBVZjyo6H8KrQGxWt1b+tRi5Z9U/njQxPEei3EOwXgtXSmcXpSLJK+BLEVHAc0qp8RVvFJExwBiAjh2ze/BJ0wBwHgKB6WxfULWNCoKj/qUCVHgpaut1EF5kfe/ogTR7eIcHdVVgBmrrhaAiQBDl/whsXaDVhPrPrDFaYxUfq7q2QCD3Yoyc0dXHU3RBdLZK5J+Hlz6Csu+JuAbWL54UU6F5KN8kUCHEc3S9xm8aKhVvJwcppfoCw4FLReTQijcqpcYrpfoppfq1adMmBeFoWmIp5UP5v7O+lK/W+4tnNNjaUnk1qQdy/m0N7NYnBtOL2nwqhOdjdQWFIDQXteXkHZqmp5SJKr4munFHdP638kJ4Car89XrFBCA5ZxC7atYAW0ck75Lq4wn9DeGVxH7i8aG8r9Y7nlQyy55GbT4NvG+A721U0QWoklsTX6q5FklP8kqptdF/C4EPgAHJvqampYryf4cqPABVfK31VXgAyv9djY8RIwdp9T7kjgFbN3D0RZrdi+TfWP9A/J+BClC5xWxaVST9X9X++PDfVlKPPTH4P653WOLsDQW3WgONkmf9a+uCtHip5hat2mp10cRjNv7hPRVeDWXPYHXPmFglk33g+9gad0mhpHbXiEguYCilSqP/HwrcmcxralqqqMgm1NYrqdrnrLZeCW2+RWzVT48TIx/JvxzyL09QLKuBOEla+a3FO7URJyizmtv+aYlbG27/hPJ/wj8bbtc8Yc7IORHlGQmheSAFVhXG2ros7D2i3UZVucA1pObHNgbBKcSvke9H+b9GUji4nuyW/E7ATyLyO/AzMFkplX1FPrSmyf9Z/W5LAnH0iq7srXqDCxy9aj+BrTPY2hGbmDyIx5r7rZRCFd9gVVT0fQC+d1BF52GWPFx7fOJBnP0Rx5471CctRi7kjwUqjgW4wNYWyTmt9ueTdi7ip1cbiDulkSQ1ySulliqleke/9lZK3ZPM62laSqlyYqdCYh1TZamNxXVYdAl9xbr2LrDtDs4Dan24iCAtngZpGd3M2219uYeAJzo4GpoN/i/4Z8A42gXhfQUVXpHQpwNg5P4bafkCuIZadeXzLkNaTar3auWUch9B5c1WtrEhnmNSGoqeQqlp9eU6BMqeJnZw0GEl3QZQkfUQmGK1xF2Da01sIjZoOQFV/jT4PgIEPMchuRfv8HQ9se8ObX+wrmtuAsd+lTbQVoHvqHY6ZGAK2M/YwWe348TZH3H2T/h5k02M5tD8cavrTmygFBCBglsQe5eUxqKTvKbVkzj2RnmOAd8n/NO69YBnJOLoUe/zmmUvWhuRYGB1n9wGLR5HXIfXHI+Rh+SPjXZz1I+I02q9x70xBytlVP30YsTvKmrixD0I2k6DwPdAyFoVG2dFbLLpJK+lnQqvtLo37F0zbhs9Kbgb3EOtudCAeI4D56G1PKp6KrQAyh4HKk97VEVXQtupcVd8KqUgNMuqpWPvgTj2qvf1ayLukaiyZ+LfWN0bQwMpcwvK+65VltfeB/GMTEkpgEQRIw88I9Mag07yWtqoyDpU0SXWghexAQaq4G4Mz/B0h7bDRMRqoTWwe2Yb5fuIuJudiGG1CKskDBXZjNpyBphrowdMlHOAVewswW+YYu+IKrgbSm6pUGpXIc2fqNfq2oqUWWKNcRg7be9eUqGFqC2nRys++oHPUOVPQav3EVuryo9XAYgUgq2NVRJa204neS0tlFKoLedAZAWVVjQW34Cyd0Yc3dMZXvrEzHXffkN0X9kqR4tvgshyKtUsD85ElT1nTdFMMCNnFMo9CIJTATs4D2pQy1qZJajisRD4CRAwmkHBXYh7EKr4RlClFe7tBTOIKnsEaWbN4VBKocqeAO9L2182lXsWkndVRm9Mkkj6VdDSIzwXzPXEDloGUSV3Ym4aiVk4CLPkHpS5JR0RpoW4j4o/xU5FrIHeioeUL5psq25KEQDf/yUvRqMAcQ9H3EfGJHilTFRko7XB9Q5QRRdZZZsJAgEwC1Fbr8IMzo5uIl5VuNLiLuV9JZrgfVjjIj4ofxVVnpqt9TKBTvJaekQ2Ef/Xz7RWBIb/AnMNeCegNh1nbcrdFDj3B/dwa2UogrULlRvyr0dsVcp+qDDxW/1EPxGklun7DLXxYNTGwagN/TGL/1NjSQUVXmYtkIoZyA2Ad0L1F6rYDVU+PprgK/JB+Qt1DT9r6e4aLT0cveN2P1gqzi8OgbkV5XsXyT07BYGll4hAwX3gOQHl+wIMN+IeVWkq4/b7Gvko++7bC5L9w560gdDqqOAvUHwDlaZY+j5GKT/S/JH4D4qss/r2Y96nzOhzchH7KcUFnn9VuGtRNQEVoZTKqtr89aVb8lpaiK0V5JwTbbFuY6e6peAEp6cosvQTEcTZH6PZLRj518VN8Nvv2+x/0cVL20oPeMBoheRdk5JYt1Hb67RUFAD/l6jqErFjr2re6B3R6pPlVY4b1vaNFQub2bvGP7dtd53go3RLXksbyb8GnD1R5a+BKgH7PuCvOOd8GzvYdo15vFImhH63HuvomxkrIRNMHD2g9Vco30QILwPHvohnVPypluFVqPKXrC4Sx15I7rmJW5gTWVldgNasF6NF7E1GS1TOaeD9P/75mVuzrOKvJLYjBXdVmjUk+Tejii6k8huMGym4uV5PIxvpJK+ljYiA+yhrsJHoTInwb1ayqvQx3Y7knF7psSq8FLXlXFDFgIAKofKvx8g9M2XxNxZia11z2V6zCOWbDKUPYCXPCITnWfXiW7xqbXbeUI6+0UJoVZbyK7PGjaol/yaUvRt4XwGz2BpcDi2C8Lw4d3ZBZCWKiFV4zd4NcR0ALV+1ZtiE/7LWWuRdgTj3a/hzyhKS6trGNenXr5+aNWtWusPQ0khFNqK2Xg2h3wADjGZIs/sQ18H/3EeZqI2DozssVfz9dSMtX9Z/4BWYZU9HSy+EiVtLxd4Do/WkBl9HhZejNo+OliuO/kzEA7kXYeRdXKdzmSX3WjXYY/rjnWDsYs3KEgPEjTR7qNLvRlMlIr9Wt3+27pPXGhWxtcFo9QbS5gek9SdImymxf8Sh36Mt+KoNlADK+2aqQm30VOBHKHsOa3piNWWEwwtRcUv6/iMSjrBs7goKV1Vfx13snZFW74DrCJAWViu74G4k96I6xy2550SnkVbsU3djbY+4AvBbbybmFlTRpVbtdq1aurtGa5SsFY2t4t+oSog/QKuqn23RBKny14gd36gqmjyrMeXd6Tx24XOEQxEi4Qhd++7Gbe9cS6t2cfrY7V2tSpbbrq+sKpUKT50GQcXWDlpNRJXcC8FfrIFl18Hg/5rYN/awNfMqRZtiZyLdktcyj6NPdKl7ZabpIsSgNASUOCq8EhX4ERVZk4CTba3lDm7IObHaBLz4t2U8cNY4SovK8ZX5CfpDLPr5b24adneNW9gppTDL30AV7o8q3A9VOBCzvG6fsMTeFaPlSxg7z8XYaQbiPDD++zqhaLedVh2d5LWMI0YB5F8HuFHRv3y/V1ixyMapXT/j5VveSvk+mg2lVACz6ELUpqNRW69EbRyGWXQFKs6b2Q5zDaVyffmKnFbNnRoqVk564lNCgcrXj4RN1i3dwJLfl1f7OOWbCKUPRt9kIqCKoPQBTO/EOj8FFfob5f8CZbSKv1OU5CDOg+p83qZEd9doGcnIPQvl6MniqfdQumklP3yUzzfvtSToD/PeY5Np2a45oy7NnEJnquR+CEwDAv+sVg18jyobh+RfXb+TOnoQdyqiYwDS/EGrW6QGhSs3YZqxb5Y2u8GWdVuhukk5ZU8S203ks47nnLQjkVuboxddBME50QVTYTCaWzNwtk+XdIGtA7iH7dA5myqd5LWMpex9uPbYHPzlled6B7wBJj74UcYkeaUU+N6janlh8FvL++ub5MufI27Zg/B8MKoZ76hgv6G9mT/9L4K+yguWgv4we/TbrfoHmhurOV5Y6zW3USX3Q3A21pvetscrcPa3ylIrH7iPRnLOzLjy1Kmmu2u0jBUKhAj643dnFG8qSXE0DWESm+CjVJzNuXdU+K9qzhmBHSj6NvLCI2nepgCH65+2oDvXxQlXHU3zNjWUFrZ1qNvxquEpZe0hG/OaBCA0B6PVRIzWH2PkXZRRteXTRbfktYzl8rjYqVMb1i3dEHPbnv2rWe7eCInYUPaeVmXOqpxxpz7vGFunapK5wA7sUJTbLJdnfn2Adx7+iCWzv6F73wC9Dh/MPkNOqfmBeWOh+DqqrkIl74Y6BF/dm17qC69lOt2S1zLa5ePOw5VTYZm7IbhzXYx5MLNWvkqzO6Jb6DmiRxwguUj+LfU/Z96VWFMkK/JAHbo48lt6OOf66dz9yiz+feV89un9JGwejopU3/VieIYizR8H+x7W9e17IM0fx/AcuWNxi4Aj3oI2sap0anWiV7xqGW/BjL948+73WPXnGrrttxun3/ovuvSsfil9Y6XCq6z66KE/wdELyT2r1sHR2pi+r6Ds3mjFx1zIPQ/Jveif3ZeUgvBiq1vI0T0m+ZtlL0DZE1RuldvA2Q+j5esNiq0mKvQ3asvJ0QJmQcAJ4kJavYPYaxgPaKJqWvGqk7ymNQFKBQFHpTnxKrzcKu4ViZYJwICCezE8R22/j7lxSDXFxxxI22kN3vavxpgjhSjvBAgtAEdPJOfU2Jr6dTmfCllVMYNTwGiLeE5Eaqirk0lqSvJJ75MXkWHA41jl5V5QSt2f7Gtqiecr9yMiuHNctd9Za3SqttCViqC2nAnmBqytBaM3FF+PcuyObCvhW+0OT5L0/nGxtU3YSlal/KjN/46WMPYCdlT5q9D8ccSd2QvoapPUPnkRsQFPAcOBHsCpItIjmdfUEmvN4nVcfditjG5xNsc1P4vrh9xB4cpqpshpmSP4c3T/1Kqf5EMo71v/fOsaSty2oG0XMOrfqk415X07up3gttlKYcCPKr6+YQvOMkCyB14HAIuVUkuV9XnxbWBUkq+pJYiv3M+VB93C/KmLiISt2iV//LCAKw+6hVAwu/8wsl61UygjVv33KMm/DIy2wLbNXZzWKtNmD2TWphy+T4jd1AQgYnUHZbFkJ/n2wKoK36+OHtMywA8TpxPwBlAVVj2aEZPyEi8zPv41jZFVppQfFVmb9S2ybVR4OeaWszHXd8dc3xuz+DaUWcf59M794tb/QTyI6/B/vjVaIq0/hfybwH0M5F6ItP48MTXoU6nSDmQVmfE3Ts8iye6Tr6ZUYIU7iIwBxgB07JgdgyDZYt2S9fjLY/tdg75Q3LnpqaZUGFX6AHjfBgTEhsq7HCP3nHSHljTK3ILa/K8KXS0+8L2PCi9BWu14ETCx7cyGzSdRuGQyHbuVUNAiArjB1hE8Iyvf18hBck8Bapkf34hJ7mmorX9QudyCgNE6OtUzeyU7ya8GKi5z2xVYW/EOSqnxwHiwZtckOR6tDrr26YInz42vrPLHXKfbwW69O6cnqApU6aPRBB+NTwGlj2FKS4yc7OwVVN6J0QHPin8qQQjNQ4UWWNsB1sJX7ufukx/ht2//xOHqSsgfZOS5ijH3D8PIPQ2RLBxcdw0Dz0yrfITYsBoFbqTFc5nV7VQPyU7yvwDdRKQLsAarKXBakq+pJcgBx/aj1S4tWb+8kHDQ2qXH4bLTvls7+g7pldbYlAqD7w1i+1l9UP40VEjyKrwCVfoQBGeAUQA55xAwR/POI5P5dsJPOJx2RowZwrEXH4XNbkvp86iz0ALirgYVw5rvvgNJ/rELn2PON/OiZSGsY5++6qZj704cPSY7ywSICNLsdlTuuRCcZe056zoYEUftD85wSZ8nLyIjgMewplC+pJS6p7r76nnyjU9pURkv3/IW3//fNMQQjvj3IZx95ynk5FfXx5kayixBFQ4kdos4QPIwdppt3S+yHrXpaFDlbNsdSeHmu0nteOSaVoSitW9cOU76DtmHOyfVZen9jivasJUPn/6CBdMW0anHroy+YgS77L5znc9jlj0b3c6v6pubB2k1AXHsXePj/d4Ax7c6m1Ag9nXbdY92vPznE3WOSUs/vRhKyzpKKdTGQ+JXNnT0x4j2T1v7hb5J1ZK7Qb9wer8eFG/558OsK8fFo1PupFvfxK6oXLd0A5f0v4GAN0goEMLmsOFw2vnfl7fS44A963QuZW5BbRxaZfqjExz7YLSaUOvjiwqL+Xeni+Im+YJW+by38aU6xaM1DnqPVy3riIg146NSbRYB3JU3wgjOJl5N9WBA6LhH5dawMhULZ/yd8FjHj30db7F3+wYckVAEf3mAR8Y8W+dzidHS2kvVeQDWh2MPeEYjLZ7focc3b1NA87axq1QNQ9h3UM86x6M1froKpZaxDM/RKKMZquxJAmVLWTLPwwcvd2O3Pn8z+oo9rC4lexcIz6PqRtYOl6JwdeVVoDaHjVa7xO5d2lCzv54bd/ON1YvW4i311bnrS+xdkLFFq3sAACAASURBVJav1CsWEeGqZy/kzhMfIugPoUyF3WHHlePk3HtPteL6ay1TJ/2CYQgHn7A/7brsVK9raY2DTvJarULBEN+9NZXvJ04jJ9/N0WOOpM/g9A68biOugxl33Z98+cr30emeJcz49H2+nfATT8/6H87c81D+L6jYh61wMm+mhw0Vkvy2kg0DRvRJeIyePDfekth57IZhVKrVnioDhvfhsR/v5v8e/JA1f62l58Hd+de1x9C2Q2veuv8D3rjrXcxwBER45ba3GfPgGRmzAYsWK+OTfCQcYfrHs1g+bxXtu7XjoNEDcLqyf8Q8VSLhCGOH3MniOcu2z5mf+clsTho7ijNuOzHN0cGGFRv57MVvtw+gAgT9IQpXbuLbCT8x/LwjoMUzqOJbov33griHkdf5DHbq9BxbNxajTMWue+7CrROvxeFM/O/OqEuP4s173iPg/WeHJYfLziEnHJCU6+2Irn26cPOEynVhVixczRt3vRuzE9T461/ngGP60bZj5pQx0P6R0Um+ZEspVx54M5vXFuEvD+DOdTH++td4Yvq9tNm19u3NtNr99P5Mlvy2vNKiKL83wNv3f8CIC4bQql3iuzfqYv60RRhG7Dxnf3mAWV/+zvDzjkBcB0Gbb60NpSUHETfd94fXlz7FuqUbsDvttO3QOmEx+b0B7A4bdof153XS9aNYsWA1U96bgdNlJxyMsNeArlz5zAUJu2Yi/PT+TCKhOJtlA1Mn/cLoK0akOCItETI6yT9//eusX1ZIOPqL6SvzE/AFefTC57h38n/SHF12mPbRLzGLocDqv/7jhwUMOuWgNERlWb+8kOeuf61SC3kbm8NW6Y1eREAq74YkIvWaxlidRbOW8OiYZ1k2dyWGIbTcpSW+Uh95zXMZfeUIzrrzZFYuWM3Ou+1Ep+67Juy6qZDtC4ayWUYn+R/enb49wW9jRkx+/ep3IuFI41/YkgEKWuZj2AzMSOWBS0HIbZa+hTNKKW495n6K1hXFvd3usDPyoqEpi6dw5UauH3z79jdEMwKFK6xqnaVbynjxpgmsXLCaK58Zk7KY6uqQEwYy4Z73iYRjW/MHHtc/DRFpiZDRUyglbmmc+AVztPoZccERcQcH7S57Wle9rvxzDeuWFRJvmYfNYeOWt69m124N21WpLiaN+7zGypwBb4AvXvmeLevjvyk1Bh33as+Zt5+I0+3A7rTjcNlxuh1c+PBZCe3O0lIro1vyh/5rIF+/MaVSa96wGew3tLduxSdIl16duOzJ8xh32YvYHDZQ4Mp1ce+n/9ne55wO3hIfNnv8Nspu+3Rk4Mh4e4Qmz4r5qwgH4/dnb+N0O1g+bxUtd07vOEZNTh57HAcfvz/TJv2CGMIhJwxkp056wDWTZXSSv+DBM5g3bRGb12zB77UGXnOb5XDVsxemO7SsMuycwRz6rwOYP/VP3Lluehy4BzZbet9Ed9+3c+x+F4DT4+TQfx2Y8ni6D+zGb9/NI+ivvjUfDoZpmwEJs33Xdpx43bHpDkNLkIwvaxAJR5g5eTbL5q6kfbedOfA4PYWyqfhmwo88OuZZQv4Qpqlw5Thp06E1T/18f8pr62zdWMy53a+ifGt53IVPDpeDvQ/ckwe/+W9K49Iav+XzVzHjk19xuhwceuJAWrev+8xAXbtGy1qLf1vGR09/waY1W9j/6L4MPetwPLnp2QRi3bINjL/udWZ99Tv2aHdhwGdNPT1wVH+uHn8RuQXZWeVRq5/nb3idD8d9TjgUwbAZiMA1L1zMEacdUqfz6CSvaWmglKJ4UwnuXLfeAF2LsWDGX4wdcicBb+XS0U63k7dWP0tBy/wdPpcuUKZpaSAiNG/TLCsTfNGGrXz+0rd88cp3FG8qSXc4Gem7t36KWV0MYLMb/PzpnIRdJ6MHXjWtNkUbtjLz0znYbAb7j+xbp9aRFt9nL33DuMtexLAZIMITlzzPtS9ezOBT69bFoGHN905yZ4pO8lrCKaX46f2ZfPLcVwS8AQafdgjDzhuc8gHxyc9/xdNXvhzt6xQeu9hk7CuXcdiJB6Q0jmyybtkGxl3+UswsoofPe5Z9B/Vs1NNDG5tBpx7MZy9+G9NdEwmbCS2Up7trtIR78rIXeODsccz++g/mT1vE+LGvc/3g2+OupEyWtUvW8/SVLxP0h/CXB/CV+Qn6gjxw9jiKCotTFke2mfLOjJjVzwAITHl3RuoDymA9Bu7BqEuPwuVxYrPbcLodON0OrnnhooR+4tQteS2h1ixexxcvf1eppRfwBlg6dyXTPvyFQ04YmJI4vv+/qUTiJCMRmPrBz4y88MiUxJFtQsFQ3CSvTHP7PsDajrvgf2dw5JmHM+PjWTjdznpPoayJTvJaQs2dstDqq63CX+bnly9+S1mSDwaqS0Zq+w5NWt0dcEw/3r7vAwJVBgzFMBh4TNzJHVotOu/dgc57d0ja+XV3jZZQBa3yESP218rutNFip9ht55LlwGP743THHwNIdcmDulIqZG1ArmJnXqTb7r07c+ylw3DluBARDENw5Tg5eeyolNYK0nacbslrCdV/+L44XHZ8pZWP2+w2hp07OGVx7LHf7ow4fwifvvANQV8QEXC4HZx642ja7dY4t7NTSqG8L0HZU6DCgKByzkDyr0Gk8bTHxjxwBof+ayA/TJyGGMKgUw5O+ObnWuLoxVDaDilcuZFv3/qJ8mIf+4/ow94H7VVtjfFlc1dwyzH3U7qlDDEEMYQbXr2cA9LwcX7B9EX88M50bHaDwaceQtc+XVIew44yve9C6V2gfBWOeiDvfIy8y9MWl9b46RWvWoP88M50Hjh7HGbEJBwK485xceCo/tz4+hXVJnqlFEt+W07AF2SPfrulbZu7TGJuPAIiq2JvkDyk7axG1ZrXGhe94lWrN1+ZjwfPeYqgL2jNnlDW1nrTPprFzMmzq32ciNC1Txf2PnBPneB3VKQw/nHlBQLxb9O0WiQtyYvI7SKyRkR+i37pDSIz0Jxv58Wt2+4v8/P1m1PSEFEWc+wV/7ixE5Ceomta5kt2S/5RpdS+0a9Pk3wtLQlscaZDbmPXG7MklOTfQGwyd0P+f/Qeq1q96dk1GSQcCjN10i8snPkX7bq0ZfBph5DfIi+p1+xzRK+4W+y5c10MPXtQUq/d1IizH7R8DVX2KIQWgb0jkncl4krfZula5kvawKuI3A6cDZQAs4BrlVIxG1yKyBhgDEDHjh33W7FiRVLiyXTlJV6uPPBmClduwlfmx5XjxO6w88gPd7LbPp2Seu1fv/qd249/ELDqaoghjBwzhIseOTujWpi/fTePF/8zgZULV7Nz57acfdcpaZnxU1HxphKKNhSzy+474XQ70xoLgLfUx6Rxn/Hju9PJbZbLcZcP56DjBmTUz7kpStrsGhH5Gtg5zk03AzOATVg11u4C2imlzq3pfHp2TfWeu/41Phz3GaFA5aXjnXt25Pk/Hq73eed8O5cPn/qc0i1lHHz8/gw/74i4pXFLi8qY+sHPeEt99DtqXzru1b7e10yH2d/M5bZj76+0UtOV4+SaFy5m8CkHpzwevzfAA2ePY8bHv2J32lFKcc5dJ3P8lSNTHkvFmC7pdwMblhduL0vhznVx7KXDuOD+09MWl1a7tE+hFJHOwCdKqZ413U8n+eqd2vFCNq3eEnPc4bLz5vJnaLFT8zqf8+3/fcAbd723vQqeK8fJLrvvzJMz7sXlya4a6Bfvdz2L5yyPOd66fUsmrHw25S3Ve057jGmTfq5U48eV4+KmN64gp8DD63e+w9rFG+jatwtn33FySub3f/zslzx33WsxVREdLgevL32KVu10hcnGKi1TKEWk4hrn0cC8ZF2rKahu42ylrNWkdVWyuZTX7nin0h90wBtk7ZINfPVa9s2aWblwTdzjW9YVEUpxYa2yreVM/WBmTLnegDfA+LGvc+ux9zN3ykI2r93Cz5N/5apDbuXPn/9Oelw/fzo7JsGD1ZBYMP2vBp9/3k8LGXvknZzW6SJuOfZ+/p69tMHn1GqXzNk1D4jIXBH5AxgEXJ3Ea2W9YecOwump3GdrGEK3vl0oaFX3sqQLpv+F0xk77h7wBpj24c/1jrOxatW+ZdzjOc1ycMR5HZKpdEtZtW/M65cVEvD+06WkVDT5X/8686b+yZxv5xL0J6emTev2LeMWl1OmanDdoZmfzubGo+5mzjdz2bhqMz9P/pWrD72VBdMXNei8Wu2SluSVUmcopXoppfZRSh2rlFqXrGs1BSddP4q9BnTFnevC4bLjyffQfKfm3PTmlfU6X37LPEwztqtODKlX109jd+Z/T8JVZazBnePilBuOS3lXTduOrbE7Yt9YDJuBacap1Q7M/WkhN4+4l9uPf5B/tT2PH9+fmfC4jr10GA5X5bgMQ2jethl7H7hng8791BUvVRoPsd68gjx33WsNOq9WOz2FMkM43U4e+vZ25k9bxF+/LKFtp9YMHLlf3GSxI7oP7EZBq3z85QEqjss43Q6OveSoRIXdaAw5/VC8pT5eve1tvKV+nG4HJ48dxUnXj0p5LDa7jYseOYsnL3txe/eIYTNw57oIhyJx9/1EWTNftvnfmU/Qtc8jtOuSuGJrXXp25PqXL+PRMc+iTEUkEqHdbjtx10c3NuiNMBgIsWF5/NW8i+csq/d5tR2ja9c0Yav/Xsd/ht/D1sJixDCIhCNc/OhZHH1B9m6oYZom5cVecgo81Y5zpMrsb+by1n3vU7hiI70O7cG/bzmByc99xaRxn1XqsonH7rRxyo2jOev2kxMeVygYYunvK8gp8NBhz4bPojJNk+NanIWv1B9zW5sOrZiw4tkGX6Opq2ngVbfkm7Bdu7Xj1b+f5O/ZSykv9rLX/t3w5Gb38nnDMJK+gGxH9T2iF32P6FXp2Dl3n0rAF+TTF77BMIRIOIIyFeFQ5a0Tw8EIxRtLkhKXw+lgz/5dE3Y+wzAYfcUI3nv0k0pvXq4cF6fcODph19Hi00m+iRMR9thv93SHoUXZ7DYuffxczr33NLYWFhPwBbm0341QJcm789zsP6JvmqKsuzNvPwlfqZ/J47/GZjcwTcWJ1x3LMRcNTXdoWU9312haI/fUlS/x+Uvf4i+3+u/duS66H7AH939+C0aVXbjCoTArF64hr0UubTu0Tke4NfKV+di8bittdm2ZdWsx0kl312SI33+Yz0dPfU5pUTkHj96fo845XP8haFzy2Dnsd2RvJj//FUFfiCP+fQiDTzs4JsF/+/ZPPHHJ85gRk0goQte+u3H7e9c1qtlSnjwPu3bzpDuMJkW35BuJiQ99xGu3T6yw+tRF+2478+T0extFTROtcVv0y2KuHfTfSn3eNruNLr068syvD6QxMi0V9KYhjVzJllJeve3tKqtPA6xdvJ6v3/gxjZFlvxULV/PzZ3PYtDa2ZEQmef/xTwn6Kq+gjYQjrF60lmXzVqYpKq0x0N01jcCCaX9hd9pjlrn7ywP89MFMRpx/RJoiyw5KKRbO+ItZX/5OTr6Hw085CE+ui1uOuZ+/f126/bU/8oxDufLZMTHdIJlg46pNxPtUbnPYKFq/lS49O6YhKq0x0Em+EchrkRv3D1QMoXmbgjRElD2UUtx/5pNM++BnAr4gdqedV259m916d2bx7KWEguHtKzG/mfATnXt2YPQVR6c56rrrd1RvFv2yOKahEAqE6Nq38W5eriVf5jVZslCPA/Ygr3keVRcVOt0Ojrk4+1afptL0j2cxbdLP+L3Wyt5QIETAF2ThjL9iCpMFvAE+eOKzNEXaMMdcfBQFrfMrlSVw57o4aexxFLSse20jLXvoJN8IGIbB/768hbad2uDJc5NbkIPL4+Sih8+i+/7d0h1eRvvmjSnbpx7uiPISbxKjSZ78Fnk8O/tBjr/qaDrstQude3Zgz/67s3bxemZ+OjvuJ0WtadDdNY1Ehz3b8/qSp1j0y2LKi710H7gHOfl6qllDSTV71IpITOITQ9hvaO9UhJUUzVoXcP59pxMOhpk8/muWz1sFwLQPf+bg4/dn7CuX6R2emiDdkm9ERIS9BnRjvyN771CC95b6ePLyFxjd8mxGNTuT/531JEWFxSmINHMMPfNw3Lmxaw2cHicOt6PSMWUq/pz5N0Ubttb5OiVbSnntjolctv9N3H78A8z9cWG9Y26IFQtX8/EzX1b69OIvD/DTezNZODP5Nem1xkcn+QyllOLaQf/lsxe+oWxrOd5SH9+9NZXL9r8xafXGGzulFN+9PZWL9xvLqR0v4sFzn6Jj9/YccfqhOD1O7E4b7lwXrhwXt79/PSPHDImpn164YhMPnD2uTtct2VzKhftex9v3T2LRL4uZOukXbhp+D5++8HUin94O+fWL3+N2zfh9AWZO/jXl8Wjpp7trMtRv381jzV/rKu35GglHKNlcxpR3ZzDk9EPTGF16vHHXu0x88MPtrdivX5/C9I9mMf73hzj24qP49cvfySnwcMgJAylolc8jFzyDGalcvz0SjjDri985teOFjLpkGCded2ytO2+99+gnFG8sJRT4Z2ZLwBvgmWte5Yh/H5LSVcvuPDc2uy1mL2C7w05OQU7K4tAaD92Sz1DL/lhJOBS7bZ2/zM/iOU1vW7XyEi9v3z+pUjeFGTHxlfl45+GP2W2fTpx43bEcPebI7TtpVV08VNGm1Vt44+53ue/0x2u99szJsysl+G0MQ1g2N7ULkQ4+fgDxxlgNm8GgUw5KaSxa46CTfIZq321n7HG2rXPnuui4165piCi9VixYjd0Z2+IOByP89l387YUPPK4/Nkf1rfSAN8j0j2axZnHNm5q12Dn+1njhUIRmrVO7zqGgZT7/fe86PHlucgo85BR4cOU4GfvypY2yYJmWfLq7JkP1G7YvLdo2I+gLEQlbZWjFEJweJ4c3wRZb6/YtCcfZkFsE2nVpG/cx59x9KrO++I3SLWXVTrO0O+ws/X0F7bu2i3s7wPFXjWTuj39WKkths9vYbZ9OtNstcTs37aj+R+3LxPUvMOebuZgRkz5H9NIztZow3ZLPUDabjcd+upv+w/tgs9swbAb7HNqDJ6ff2yT/oNt2aM0+h/XA4ao8Y8bpcVa7xV+Lts14cf6jjHnwTDr22BUxYqcXmqbJTp3bVDq2fnkhD5w9jtM6XsQl/W/AW+xl1GXDMGwGhs3AZjfo3LMDd04am7gnWEfuHBcHHNOPg44b0CR/H7R/6CqUWSAcCqOUwuF01H7nLFZe4uXBs5/i58/mWHum5ji5fNz5HHbSgbU+dsOKjZzf8+pKLXq7w2qNj/v5/u3zyzeu3syY3tfiLfFtH7R1uB2YERNlKsyIicNlJ7dZLs/MfoDWu7RMzpPVtApqqkKpk7yWdOuXF7Jq0Vo67LkLO3eO33WSSKVFZZQVldO2U+s67eO6YPoiHj7/GdYu2QDAgOF9uPbFiyuVBRh3xYtMfu6rmO34qrLZbQw9+3CuGX9R/Z6EptWB3jRES4tgIMR9pz3Oz5/NxuGyEwqE6T+8D/+ZcBVOV/I+deS3yNuhfVx//34+Hz39OSVbyjj4+P0Zds4gXpz/GCVbSnG6nYQCIXylPvJb5G1vyf/+/fxaEzxYUzFnTp7d4OeiaQ2lk7yWNC/f8hY/fz6HoD+0vTriL5/N4eWb3+LCh85Ma2xVN2lZOONvPh3/NU9MvwcU3HnCQ/z23TzEZlDQMo9rXriY/kfty86d224vF1Cb3Ga6L1xLvwYNvIrIiSIyX0RMEelX5babRGSxiCwSEV1KsQn6dPzXBH2VV98G/SEmP/9VmiKyVLdJy5rF6/nqtSncfPS9zPl2LqFgmKAvyKY1W7jjhIdYsWAVJ99wHK6cyoubxJCYCqLuHBejrxiRiqejaTVq6OyaecDxwJSKB0WkB3AKsDcwDHhaRHa8c1TLCn5v/GmJdakKmQwLp/8Vd41BwBvg6zd+YNm8VTFdMqFAiA+e+JSeB+3FNS9cREGrPNw5LhwuOwOG96Vb391w5bjIbZaDw+1gyBmHcvSYI1P1lDStWg3qrlFKLQTiVbYbBbytlAoAy0RkMTAAmN6Q62mZpfvAPZg/9c+Y4z0O2HOHz+Er9/PWve/zzRs/gsCRZx3OKTcchzun/qUC8lrkocw4m7SI4HA5sDtsVH0bMiMma/5eD8DgUw7msBMPYMPyjeS3/Kf/f9ncFRSu2szuvTvRun2resenaYmUrHny7YGKHZero8diiMgYEZklIrM2btyYpHC0dLh83Hl48t3YHVZbwu6w48lzc/m483bo8ZFIhGsPu433Hv2EwlWbKFy5iXce/JCxQ+7ANM3aT1CN7gO7UdAqP6Zx4vQ4OOHqkTG7K4G1gUvvQXtv/95ms7HL7jtXGuDt0qsT+4/oqxN8NQK+AN+9PZX3Hv2EBTP+0jXuU6TWlryIfA3sHOemm5VSH1b3sDjH4v5ElVLjgfFgTaGsLR4tc+zeuzPP//EIHzwxmb9+XUq3vrtx/JVHs1OnNrU/GJj1+W+s/mtdpaQb9IdYPm8Vv307j75D9qlXXIZhcP8Xt3DT8Hso3liCGEIkFOGih89i4NH7Mey8wXz5yvfb++xtdhu5zXI4Vu/SVW/L56/i2sP/SygYIhwIY3PY2OfQHtwxaez2RoCWHLW+ukqpIfU472qgQ4XvdwXW1uM8WobbqVMbLnr47Ho9dtEvS/CV+WOOB3xBFv2ypN5JHmDXPXbhtcXj+GvWEsqLvey1f7ftK0Mvf/I8uvbuzPtPTKZsq5eBR+/H6bf9a3thM61ulFLceeLDlG4p3V48LRQM8/sPC/j42S8ZfbkeoE6mZL2FfgRMEJFHgF2AbsDPSbqWlqXadmqDO9cVM1Dr8jhp27HhxbZEhD37d417fMQFQxhxQX3aN1pV65cVUrhiY0x1zIA3wGcvfKOTfJI1dArlaBFZDRwATBaRLwCUUvOBicAC4HPgUqVU7StINK2Cw04ciMPlqDQ9UcQqwnbw8QPSF1gahENhls9fxaa1W9IdSp1FIiYxc0yjqtbz1xKvobNrPgA+qOa2e4B7GnJ+rWnz5Hl49Me7uO/fj7Ny4WpQ0LlXR/7z5pUN2ohjy/oi5nwzD0+em35H9cbpdiYw6sT77u2pPHHJ80TCEcKhCN0HduPWidfQvE38EseNTfuuO9O8TQEbVlSeWOH0OBlyxmFpiqrp0LVrtIxQVFiMCA1ObP/3wCRevX0idrsNEUEM4d5P/1OnaZ2ptOiXxVw76L8EvP8sKrM7bHTt04UnZ9yX8OttXL2ZKe9MJ+gPMXBkX7r06pSQ8y6c+Tc3Dr2LSDhCwBfEk+emU49deei721O6c1a20gXKNA1YMOMvxg65o1LCBMhrnsvE9c83yiqe95z2GD/837SY6YauHCdPz3qAjnvFnZlcL99M+JFHzn8GpaxuFLvDxsiLh3LRQ2cl5Pwlm0v5dsJPbFqzmZ4Hd6f/8H3rVEBOq54uUKZpwGcvfhN3yz/TNJnzzTwGDO+ThqhqVrhyU9z55HaHnc1rtyQsyZdsKeWR85+tNF01Eo4w+bmvOOT4gex9YMM/6RS0yue4y4c3+Dxa3ehNQ7Qmw1fmj78AR4G/PHaqZmPQb2hvnO7YTxihQIiufbok7Dq/fPYbNkdsOgh4g3z71o8Ju46WejrJa03GYSceiDs3tv83HArT54heaYiodqMuHUZeizzsFfaidee6OPmG43aonPKOEqGa5Ypxy5ZoGUR312hJt3jOMl6/8x2W/r6Cjj3ac8ZtJ7LXgG4pj+PAUf3Y57Ae/PHDAvzlAQybgcNp58KHz0xowkykglb5PDvnQf7vfx8wc/JsClrl869rjuGQEwYm9Dr9h/expjpW4fQ4GXzqwQm9lpZaeuBVS6p5U//kxqPuJugLbF8M48pxcuekGxq0YrW+IhFrM4+pH/xMbjMPR50zmN17d055HI3Rd/83lYfOeRpQRCImdruNUZcN44L/nZHu0LRa6Nk1Wtpctv+NLPplSczxjt3b8+L8x9IQUeNQsrmU7/9vGkUbttLr0B70GdyzUXSLbFq7hR/fnbF9CmWnHh1qf5CWdnp2jZY2i39bHvf4yoVriEQiTXIK3bypf/Kf4fdgmiYBbxB3npvuA7tx7+T/pL1YV+tdWurNTrKMHnjVkqqgZfy+7txmORhG0/v1M02Tu058GF+Zf/t8fX+ZnwXTFvHZC9+kOTotGzW9vzItpU687tiY7fJcOS5OuProRtE9kWpL/1gRv7KmN8iXr36f+oC0rKe7a7SkOuHqkRRvKmXSE59i2A0ioQjDzxvMaTefkO7Q0sIwDFQ1cxXFaHpvelry6SSvJZVhGJx/37/5983HU7hqM212bbW9bntT1KVXR/Ka5+Evq1I+OcfF8POOSFNUWjbT3TVaSnjyPHTqvmuTTvBgLSy6/f3ryS3IwZPnxma34c510XdIL4aedXi6w9OykG7Ja1qK7dlvdyasepYf35vB1sISeh3ane77d2uSYxRa8ukkr2k1WLN4Hf7yAJ17dkjodM+cfA9HnT0oYefTtOroJK9pcaxdsp7/jn6AdUs3YBgGDpeDsa9exv4j+qY7NE2rE90nr2lVRCIRrht8BysWrCbgDeIr81OyuZS7TnqYNYvXpTs8TasTneQ1rYrfv19A+dZylFl5qmMkFGHy+K/SFJWm1Y9O8ppWxdYNW+POZQ+HImxctTkNEWla/ekkr2lVdD9gDyKhSMxxd66L/Ybum4aINK3+dJLXtCraddmJoWcPqrTBiNPtYKdObRh86kFpjEzT6k7PrtG0OK546nx6HbwXHz79Ob4yP4efdCCjrxiB0+1Md2iaVie6nrymaVqGq6mefIO6a0TkRBGZLyKmiPSrcLyziPhE5Lfo17MNuY6maZpWPw3trpkHHA88F+e2JUopPUqlaZqWRg1K8kqphaB3c9eapqLCYr589TvWLdnA3gftxWEnHqD77LVG7KY1GQAABMtJREFUJ5kDr11EZA5QAtyilPox3p1EZAwwBqBjx45JDEfTEmfRL4sZO+ROwqEwQX+Ibyf8xJt3v8e4mfeR1zw33eFp2na19smLyNciMi/O16gaHrYO6KiU6gNcA0wQkYJ4d1RKjVdK9VNK9WvTpk39noWmpZBSivvPeBJvqY+gPwSAr8zPhhUbeePud9McnaZVVmuSV0oNUUr1jPP1YQ2PCSilNkf//yuwBNgjcWFrWvpsXlfEhpUbY46Hg2GmTJyehog0rXpJWQwlIm1ExBb9/25AN2BpMq6laanmcNqhmqnHDpdeeqI1Lg2dQjlaRFYDBwCTReSL6E2HAn+IyO/Au8BFSqktDQtV0xqHZq0L6Lbfbhi2yn8+Lo+TERcMSVNUmhafXgylafVQuHIjVx96G2VF5UQiEUDofVgP7pg0FrtDt+a11KppMZT+bdS0emjbsQ2vLRnHr1/+wcZVm9ij3+5067tbusPStBg6yWtaPdlsNgYM75PuMDStRroKpaZpWhbTSV7TNC2L6SSvaZqWxXSS1zRNy2I6yWuapmWxRjVPXkQ2AivSHUcatQY2pTuINNLPv2k/f9CvQX2ffyelVNziX40qyTd1IjKrugUNTYF+/k37+YN+DZLx/HV3jaZpWhbTSV7TNC2L6STfuIxPdwBppp+/1tRfg4Q/f90nr2malsV0S17TNC2L6SSvaZqWxXSSTzMROVFE5ouIKSL9KhzvLCI+Efkt+vVsOuNMpupeg+htN4nIYhFZJCJHpSvGVBGR20VkTYWf+4h0x5QKIjIs+jNeLCI3pjuedBCR5SIyN/pzT9jGGrrUcPrNA44Hnotz2xKl1L4pjicd4r4GItIDOAXYG9gF+FpE9lBKRVIfYko9qpR6KN1BpEp0q9CngCOB1cAvIvKRUmpBeiNLi0FKqYQuBtMt+TRTSi1USi1KdxzpVMNrMAp4O7ox/DJgMTAgtdFpKTAAWKyUWqqUCgJvY/3stQTQSb5x6yIic0TkBxE5JN3BpEF7YFWF71dHj2W7y0TkDxF5SURapDuYFGiqP+eqFPCliPwqImMSdVLdXZMCIvI1sHOcm25WSn1YzcPWAR2VUptFZD9gkojsrZQqSVqgSVTP10DiHMv4Ob81vRbAM8BdWM/zLuBh4NzURZcWWflzroeDlFJrRaQt8JWI/KmUmtLQk+oknwJKqSH1eEwACET//6uILAH2ADJyp/P6vAZYLboOFb7fFVibmIjSZ0dfCxF5HvgkyeE0Bln5c64rpdTa6L+FIvIBVjdWg5O87q5ppESkTXRAChHZDegGLE1vVCn3EXDK/7dzxygRxHAUxr8PQQuxXMRyC3tPYKn1nkJBT2Fpa29pYSMIgl5Bm23W2hN4gpG/xSDY2O1sIL5fNdMMjww8QhKi7qhzxjF4bZxpUurBr9cF46Z0796AQ3WubjNutj82zrRR6q669/MMnLCmf5+ZfGPqArgBZsCTuqyqU+AYuFIH4As4r6rPhlEn89cYVNVKvQfegQG4+Acna67VI8blig/grG2c6VXVoF4CL8AWcFtVq8axNm0feFBh7OW7qnpex4dzrUFERMeyXBMR0bGUfEREx1LyEREdS8lHRHQsJR8R0bGUfEREx1LyEREd+wbIIwNZreUtnAAAAABJRU5ErkJggg==\n",
|
|
"text/plain": [
|
|
"<Figure size 432x288 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"needs_background": "light"
|
|
},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"plt.scatter (X[:,0], X[:,1], c=y)\n",
|
|
"plt.show\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"Видно, что объекты двух классов пересекаются между собой."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Разбиение на тестовое и обучающее множества"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"Разобьем выборку на обучающее и тестовое множества, используя функцию **train_test_split**. \n",
|
|
"\n",
|
|
"В качестве аргументов передаем массив `Х`, массив `у`.\n",
|
|
"`test_size = 0.25` означает, что на тестовую часть пойдет 25% всей выборки, соответственно, на обучающую – 75%, \n",
|
|
"\n",
|
|
"Также указываем, что разбиение будет случайным, но воспроизводимым: `random_state = 1`. Если параметр `random_state = None`, то разбиение будет невоспроизводимым.\n",
|
|
"\n",
|
|
"Функция `train_test_split` записывает результаты разбиения в 4 переменные. Назовем их `X_train, X_test, y_train, y_test`. В первую и вторую переменную будут записаны координаты объектов из обучающей и тестовой выборки соответственно, а в третью и четвертую – метки классов объектов из обучающей и тестовой выборки соответственно.\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 11,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 1)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"Таким образом, в переменной `X_train` лежат координаты, а в `y_train` – метки классов соответствующих объектов из тестовой выборки. Эти переменные будут использоваться в дальнейшем для обучения модели. \n",
|
|
"\n",
|
|
"`X_test, y_test` – соответственно координаты и метки классов объектов тестовой выборки. Эти переменные мы будем использовать для оценки точности модели\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Обучение модели и классификация"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"Для обучения модели и последующей классификации с использованием модулей библиотеки scikit-learn используется довольно стандартная процедура. Разберем на примере обучение и классификацию данных методом к-ближайших соседей. Требуемый модуль мы уже загрузили в блоке импорта. \n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
" \n",
|
|
"### 1. Создать переменную - модель классификатора, указав при необходимости параметры классификации. \n",
|
|
"\n",
|
|
"В нашем случае мы задаем два параметра – количество ближайших соседей = 1 и евклидову метрику."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 12,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"knn = KNeighborsClassifier(n_neighbors=1, metric = 'euclidean')"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"Для большинства классификаторов, если не задавать никаких параметров, они будут выбраны по умолчанию. Список доступных параметров можно посмотреть в документации, в нашем случае:\n",
|
|
"\n",
|
|
"http://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html \n",
|
|
"\n",
|
|
"Посмотреть доступные метрики расстояний также можно в документации на DistanceMetric:\n",
|
|
"\n",
|
|
"http://scikit-learn.org/stable/modules/generated/sklearn.neighbors.DistanceMetric.html"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"### 2. Обучить модель\n",
|
|
"используя для этого метод `fit()`, передав в него координаты объектов и метки классов обучающей выборки"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 13,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"KNeighborsClassifier(metric='euclidean', n_neighbors=1)"
|
|
]
|
|
},
|
|
"execution_count": 13,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"knn.fit(X_train, y_train)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"### 3. Проверить модель на тестовой выборке\n",
|
|
"используя метод `predict()`\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 14,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"prediction = knn.predict(X_test)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"Стоит отметить, что в метод `predict()` подаются только координаты объектов (`X_test`) без истинных меток класса (`y_test`). \n",
|
|
"\n",
|
|
"В общем случае, когда модель полностью настроена, в данный метод могут передаваться «боевые» данные – объекты, которые нужно проклассифицировать.\n",
|
|
"\n",
|
|
"В нашем случае, в переменную `prediction` метод вернул предсказанные метки классов для каждого объекта из переменной `X_test`. \n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"### 4. Оценка качества модели\n",
|
|
"\n",
|
|
"Зная истинные метки классов (переменная `y_test`) мы можем оценить, насколько точно работает наша модель.\n",
|
|
"Самое простое – вывести на экран истинные и предсказанные ответы:\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 15,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Prediction and test: \n",
|
|
"[1 1 1 0 0 0 1 1 1 1 1 1 1 0 0 0 1 0 1 1 1 0 0 1 1]\n",
|
|
"[1 1 0 0 0 0 1 1 1 1 1 1 0 0 0 0 1 0 1 1 0 0 0 1 1]\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"print ('Prediction and test: ')\n",
|
|
"print (prediction)\n",
|
|
"print (y_test)\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"Кроме того, можно оценить матрицу неточностей (**confusion matrix**) используя функцию `confusion_matrix`, и передав в нее истинные и предсказанные ответы:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 16,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Confusion matrix: \n",
|
|
"[[ 9 3]\n",
|
|
" [ 0 13]]\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"print ('Confusion matrix: ')\n",
|
|
"print (confusion_matrix(y_test, prediction))\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"Для оценки аккуратности классификации можно использовать функцию `accuracy_score`:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 17,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Accuracy score: 0.88\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"print ('Accuracy score: ', accuracy_score(prediction, y_test))"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"Для оценки показателей полноты-точности и f1-меры воспользуемся функцией `classification_report`:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 18,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
" precision recall f1-score support\n",
|
|
"\n",
|
|
" 0 1.00 0.75 0.86 12\n",
|
|
" 1 0.81 1.00 0.90 13\n",
|
|
"\n",
|
|
" accuracy 0.88 25\n",
|
|
" macro avg 0.91 0.88 0.88 25\n",
|
|
"weighted avg 0.90 0.88 0.88 25\n",
|
|
"\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"print(classification_report(y_test, prediction))"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"Оценить показатель AUC ROC можно следующим образом:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 20,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"0.875"
|
|
]
|
|
},
|
|
"execution_count": 20,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"roc_auc_score(y_test, prediction)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"Кроме того, воспользовавшись функцией `plot_2d_separator`, описанной выше, можно наглядно отобразить на графике область принятия решений по каждому классу:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 21,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"<matplotlib.collections.PathCollection at 0x1b9f050bd30>"
|
|
]
|
|
},
|
|
"execution_count": 21,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
},
|
|
{
|
|
"data": {
|
|
"image/png": "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\n",
|
|
"text/plain": [
|
|
"<Figure size 432x288 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"plt.xlabel(\"first feature\")\n",
|
|
"plt.ylabel(\"second feature\")\n",
|
|
"plot_2d_separator(knn, X, fill=True)\n",
|
|
"plt.scatter(X[:, 0], X[:, 1], c=y, s=70)\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"Обычно, для адекватной проверки качества модели, все исследования, начиная с разбиения на тестовое и обучающее множество, проводят несколько раз (3,5,..), по разному разбивая выборку (устанавляивая разные значения `random_state`), заново обучая модель и проверяя ее на тестовом множестве. \n",
|
|
"\n",
|
|
"При этом, на каждой итерации будут получаться разные значения всех метрик, что связано как раз с разным разбиением на обучающее и тестовое множество. Итоговая оценка качества находится как среднее по всем итерациям."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": []
|
|
}
|
|
],
|
|
"metadata": {
|
|
"kernelspec": {
|
|
"display_name": "Python 3",
|
|
"language": "python",
|
|
"name": "python3"
|
|
},
|
|
"language_info": {
|
|
"codemirror_mode": {
|
|
"name": "ipython",
|
|
"version": 3
|
|
},
|
|
"file_extension": ".py",
|
|
"mimetype": "text/x-python",
|
|
"name": "python",
|
|
"nbconvert_exporter": "python",
|
|
"pygments_lexer": "ipython3",
|
|
"version": "3.8.3"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 4
|
|
}
|