{ "cells": [ { "cell_type": "code", "execution_count": 85, "metadata": { "id": "i-B5sPHELBBj" }, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import pandas as pd\n", "import seaborn as sns\n", "from sklearn.discriminant_analysis import QuadraticDiscriminantAnalysis\n", "from sklearn.dummy import DummyClassifier\n", "from sklearn.ensemble import (\n", " AdaBoostClassifier,\n", " GradientBoostingClassifier,\n", " RandomForestClassifier,\n", ")\n", "from sklearn.feature_extraction.text import TfidfVectorizer\n", "from sklearn.gaussian_process import GaussianProcessClassifier\n", "from sklearn.gaussian_process.kernels import RBF\n", "from sklearn.metrics import accuracy_score, classification_report, confusion_matrix\n", "from sklearn.model_selection import GridSearchCV, train_test_split\n", "from sklearn.naive_bayes import GaussianNB, MultinomialNB\n", "from sklearn.neighbors import KNeighborsClassifier\n", "from sklearn.neural_network import MLPClassifier\n", "from sklearn.preprocessing import StandardScaler\n", "from sklearn.svm import SVC, LinearSVC\n", "from sklearn.tree import DecisionTreeClassifier" ] }, { "cell_type": "code", "execution_count": 78, "metadata": { "id": "uxhFjfeHLBBr" }, "outputs": [], "source": [ "# Read the pokedex we scraped in web_scrape.ipynb into a DataFrame\n", "pkmn = pd.read_csv(\"pokemon.csv\")\n", "pkmn.rename(columns={\"Unnamed: 0\": \"wiki_index\"}, inplace=True)\n", "pkmn = pkmn[pkmn.primary_type != \"Bird\"]" ] }, { "cell_type": "code", "execution_count": 79, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 908 }, "id": "1HfxKWKEPpNU", "outputId": "b3d9ab9d-7cd2-4010-f060-bb7ac2f843f1" }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1AAAAN7CAYAAABLcHvEAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzdeZjld1Un/vfpLZ2NBEjMAD5jAB0ziCGGEAFRw6a4suggiCM4zK8HUGZxeEDn5yiOjgMzOqiIk+mfIuiAgigGmBFlSCKIsiQQlgCKJiCymITsnXQ63XV+f9Tt6qKrcutbSVV9b1W/Xs9zn7r3u91zqzuVOn3O53yruwMAAMDKto0dAAAAwGYhgQIAABhIAgUAADCQBAoAAGAgCRQAAMBAO8YOYBa95Mxnztxowl/6/LvGDmFTuO/xJ48dwrL23XnH2CEssWv77P3nf+DQwbFDWOKb73vW2CEscfG1Hxs7hGU94KTTxg5hiWtuu3HsEJbYf/DA2CFsCo86ffb+20uSD91w1dghLHHizuPGDmGJE3ceP3YIS9x4x61jh7Cs62/5VI0dwxB3XnfVzP1+vNjO0x60Yd9HFSgAAICBJFAAAAADSaAAAAAGmr1FEAAAwGyZOzR2BDNDBQoAAGAgCRQAAMBAWvgAAIDpem7sCGaGChQAAMBAEigAAICBtPABAADTzWnhO0wFCgAAYCAJFAAAwEASKAAAgIGsgQIAAKZqY8wXqEABAAAMJIECAAAYSAsfAAAwnTHmC1SgAAAABtp0CVRVHaqqK6rqw1X1wap69NgxAQAAx4bN2MJ3e3efkyRV9e1J/kuSbx03JAAA2MJM4Vuw6SpQR7lXkhuSpKouqKq3Hd5RVb9WVc+ZPP/OqvpkVV1eVb+6+DgAAIChNmMF6viquiLJ7iT3S/K4aQdX1e4k/zPJt3T31VX1uxsQIwAAsAVtxgrU7d19TnefleRJSX67qmrK8Wcluaq7r568XjaBqqo9VXVZVV12xS1/s8YhAwDAJjZ3aLYfG2gzJlALuvsvk5yW5PQkB/Pln2f3Kq+1t7vP6+7zzjn5q9cwSgAAYKvY1AlUVZ2VZHuSLyX5TJKHVNVxVXVqksdPDvurJA+qqjMnr39go+MEAAC2hs28BipJKsmzu/tQks9W1RuTfCzJ1Uk+lCTdfXtVvSDJ26tqX5IPjBE0AABsWqbwLdh0CVR3b5+y78VJXrzMrku6+6zJWqlXJblsveIDAAC2rk3dwrcK/8+kanVlklMyP5UPAABgVTZdBeru6O5XJHnF2HEAAACb2zGRQAEAAPfAnDVQhx0rLXwAAAD3mAQKAABgIC18AADAVG2M+QIVKAAAgIEkUAAAAANp4QMAAKYzhW+BChQAAMBAEigAAICBtPABAADTmcK3QAUKAABgIAkUAADAQFr4AACA6eYOjR3BzFCBAgAAGEgCBQAAMFB199gxzJwdux4wc9+UR51+1tghLPHXt35u7BCW+NLtt4wdwrLuddwJY4ewxIFDB8cOYVM4dfeJY4ewxLW33TR2CJvGoRm88ePuHbvGDmGJO+f8PBhq57bZW/2w/+CBsUNYYhb/ns/i9ylJDh74XI0dwxB3fOKSmfv9eLHj/uljN+z7qAIFAAAwkAQKAABgIAkUAADAQLPXyAsAAMyWGVxTOhYVKAAAgIEkUAAAAANp4QMAAKZrLXyHqUABAAAMJIECAAAYSAsfAAAwnSl8C1SgAAAABpJAAQAADKSFDwAAmKr70NghzAwVKAAAgIEkUAAAAANp4QMAAKZzI90FKlAAAAADSaAAAAAGmukEqqoOVdUVVXVlVX24qv59Va0q5qo6s6o+tl4xAgAAx45ZXwN1e3efkyRV9RVJXp/kXkl+ZsjJVTXrnw8AAGbfnDVQh810BWqx7r4myZ4kP1bzzqyqd1fVByePRydJVV0w2f6WJB9ffI2qelBVfaiqHjHCRwAAADa5TVWh6e6rqmp7kq9Ick2SJ3b3/qr6miS/m+S8yaHnJnlod19dVWcmSVV9bZLfS/Kc7v7whgcPAABsepsqgTrKziS/VlXnJDmU5J8s2vf+7r560evTk1yU5Gnd/WVVqcOqak/mK1yp7adk27YT1ydqAADYbIwxX7BpWviS+Ra8zCdL1yT5d0n+IcnDMl952rXo0H1HnXpTkr9L8pi7unZ37+3u87r7PMkTAACwnE2TQFXV6UkuTPJr3d1JTknyhe6eS/LPk2yfcvqBJE9N8sNV9YPrHiwAALAlzXoL3/FVdUXm2/UOJvmdJP99su/Xk/xBVf1wkrdnadXpy3T3vqr67iTvqKpbu/st6xg3AABsHXOHxo5gZsx0AtXdd1lV6u5PJTl70aaXTLZfmuTSRcd9OslDJ89vTGICHwAAcLdsmhY+AACAsc10BQoAAJgBpvAtUIECAAAYSAIFAAAwkBY+AABgujktfIepQAEAAAwkgQIAABhICx8AADCdKXwLVKAAAAAGkkABAAAMJIECAAAYyBooAABgOmPMF6hAAQAADCSBAgAAGEgLHwAAMJ0WvgUqUAAAAANJoAAAAAbSwrdJ/OW1nxw7hCWeeMbZY4ewxMV3fGzsEJZ18x23jR3CErt37Bo7hCXunDs4dghL3Hlo9mI6cefusUNY1iz+Pb/v8SePHcISN96xb+wQljikNWewnf7peZD9Bw+MHQJrrPvQ2CHMDD8GAAAABpJAAQAADKSFDwAAmE6r7wIVKAAAgIEkUAAAAANp4QMAAKZrLXyHqUABAAAMJIECAAAYSAIFAAAwkDVQAADAdMaYL1CBAgAAGEgCBQAAMJAWPgAAYDpjzBeoQAEAAFteVZ1aVW+qqk9W1Seq6lFVdZ+qekdVfWry9d4rXUcCBQAAHAt+Jcnbu/usJA9L8okkP5Hknd39NUneOXk9lRY+AABguk0+ha+qTknyLUmekyTdfSDJgap6cpILJoe9NsmlSV4y7VoqUAAAwKZWVXuq6rJFjz1HHfLAJNcm+a2q+lBV/UZVnZjkjO7+wuSYLyY5Y6X3UoECAAA2te7em2TvlEN2JDk3yQu7+31V9Ss5ql2vu7uqeqX32rAEqqoOJflokp1JDib57SSv6DbSAwAAZtrm/5X975P8fXe/b/L6TZlPoP6hqu7X3V+oqvsluWalC21kC9/t3X1Od39dkicm+Y4kP3P0QVWlKgYAAKyZ7v5iks9W1ddONj0+yceTvCXJsyfbnp3kopWuNUqy0t3XTPoSP1BVL818sE9LclKS7VX1XZkP/t6Zr1j9VHdflCRV9R+T/FDmexg/m+Ty7v7FqjonyYVJTkjyt0n+RXffUFWXJnlfkscmOTXJc7v73Rv2YQEAgFnwwiSvq6pdSa5K8iOZLyi9saqem+QzSZ6+0kVGq/Z091VVtT3JV0w2nZvk7O6+flKFemp331xVpyV5b1W9Jcl5Sb4v82MHdyb5YJLLJ+f/duZ7Gv+sqv5T5qtb/3ayb0d3n19V3znZ/oSN+IwAALAlbPIpfEnS3VdkPp842uNXc51Zapd7R3dfP3leSX6hqr4lyVySB2R+IsY3Jbmou/cn2V9Vb00WxhKe2t1/Njn/tUl+f9G1/3Dy9fIkZ67rpwAAALas0RKoqnpQkkM5slBr36Ldz0pyepKHd/edVfXpJLvvwdvdMfl6KHfxmScthXuSpLafkm3bTrwHbwcAAGxFo9wHqqpOz/x6pV/r7uVGBZ6S5JpJ8vTYJF812f6eJN9TVbur6qQk350k3X1Tkhuq6psnx/3zJH929EWn6e693X1ed58neQIAAJazkRWo46vqihwZY/47Sf77XRz7uiRvraqPJrksySeTpLs/MFkL9ZEk/5D5seg3Tc55dpILq+qEHFkUBgAA3FNbYA3UWtmwBKq7t0/Z95okr1n0+rokj7qLw3+xu186SZTelckQicmisEcuc+0LjrrumasOHgAAILM1RGKovVX1kMyviXptd39w7IAAAIBjw6ZLoLr7B8eOAQAAjimthe+wUYZIAAAAbEYSKAAAgIE2XQsfAACwwUzhW6ACBQAAMJAECgAAYCAtfAAAwHSm8C1QgQIAABhIAgUAADCQFj4AAGA6U/gWqEABAAAMJIECAAAYSAsfAAAwnSl8C1SgAAAABpJAAQAADCSBAgAAGMgaKAAAYDpjzBdIoDaJ7dtmr1h48bUfGzuEJf7PKY8eO4RlPfmW948dwhL7Dx4YO4QlZvHv+c7ts/dj8sY79o0dwrJm8c/vS7ffMnYIS+zesWvsEJbYOXt/dDNrFn92zqL7Hn/y2CEsMas/O9l8/MgEAAAYaPb+aRUAAJgtWvgWqEABAAAMJIECAAAYSAsfAAAwXffYEcwMFSgAAICBJFAAAAADaeEDAACmM4VvgQoUAADAQBIoAACAgbTwAQAA02nhW6ACBQAAMJAECgAAYCAJFAAAwEDWQAEAANO1NVCHqUABAAAMJIECAAAYSAsfAAAwnTHmCzasAlVVh6rqikWPn5hsv7Sqzrsb1zunqr5zyv7zqupX70nMAAAAi21kBer27j5nDa93TpLzkvyfo3dU1Y7uvizJZWv4fgAAwDFuplr4qurbkvxskuOS/G2SH+nuW6vqEUl+JcmJSe5I8sQk/ynJ8VX1mCT/Jck/TfLgJA9K8ndV9T+TvKi7v7uqTkryyswnXJ3kZ7v7Dzb20wEAwCbVPXYEM2Mjh0gcf1QL3w8s3llVpyX5qSRP6O5zM189+vGq2pXkDUn+TXc/LMkTkuxL8tNJ3tDd53T3GyaXecjk/Gce9d7/MclN3f313X12kovX7VMCAABb1iy18D0y8wnQe6oqSXYl+cskX5vkC939gSTp7puTZHLM0d7S3bcvs/0JSZ5x+EV333D0AVW1J8meJKntp2TbthMHfCQAAOBYMkstfJXkHUdXj6rq61dxjX139827e2+SvUmyY9cD1CgBAOAwU/gWzNJ9oN6b5Juq6quTpKpOrKp/kuSvktxvsg4qVXVyVe1IckuSkwde+x1JfvTwi6q695pGDgAAHBPGXAP1ssU7u/vaJM9J8rtV9ZHMt++d1d0HkvxAkldW1YcznwztTnJJkocst55qGT+f5N5V9bHJNR67th8NAAA4FmxYC193b7+L7Rcsen5xkkcsc8wHMr9G6mhLjl10zqVJLp08vzXJs1cTLwAAMKGFb8EstfABAADMNAkUAADAQLM0hQ8AAJhFrYXvMBUoAACAgSRQAAAAA0mgAAAABrIGCgAAmKrneuwQZoYKFAAAwEASKAAAgIG08AEAANPNGWN+mAoUAADAQBIoAACAgbTwAQAA07UWvsNUoAAAAAaSQAEAAAykhQ8AAJjOjXQXqEABAAAMpAK1SRwye3+Qb7/hz8cOYVnPu/9jxg5hiQs/P3vfq1n8e37bnXeMHcISs/h9Yrj9Bw+MHQKsuxvv2Dd2CEv42clakUABAADTSUAXaOEDAAAYSAIFAAAwkAQKAABgIGugAACA6ayBWqACBQAAMJAECgAAYCAtfAAAwHTdY0cwM1SgAAAABpJAAQAADKSFDwAAmM4UvgUqUAAAAANJoAAAAAbSwgcAAEw3ZwrfYSpQAAAAA0mgAAAABtLCBwAATNem8B2mAgUAADDQTCdQVXWoqq5Y9DhzyrF/sXGRAQAAx6JZb+G7vbvPGXJgdz/66G1VtaO7D659WAAAwLFo1hOoL1NVJyW5KMm9k+xM8lPdfdFk363dfVJVXZDk55LckOSsqvq9JNd39y9PjvvPSa7p7l8Z4zMAAMCmY4z5gllPoI6vqismz69O8s+SPLW7b66q05K8t6re0t1H/4mem+Sh3X31pO3vD5P8clVtS/KMJOdvTPgAAMBWMusJ1Je18FXVziS/UFXfkmQuyQOSnJHki0ed9/7uvjpJuvvTVfWlqvqGybEf6u4vHf1GVbUnyZ4kqe2nZNu2E9flAwEAAJvXrCdQR3tWktOTPLy776yqTyfZvcxx+456/RtJnpPkHyV59XIX7u69SfYmyY5dD1CjBACAiZ4zxvywmZ7Ct4xTMr9+6c6qemySrxp43puTPCnJI5L8yXoFBwAAbG2brQL1uiRvraqPJrksySeHnNTdB6rqkiQ3dveh9QwQAADYumY6geruk456fV2SR007trsvTXLp4n2T4RGPzPwQCgAAYDVM4Vuw2Vr4Vq2qHpLkb5K8s7s/NXY8AADA5jXTFai10N0fT/KgseMAAAA2vy2fQAEAAPdQm8J32JZv4QMAAFgrEigAAICBtPABAADTmcK3QAUKAABgIAkUAADAQFr4AACA6eZM4TtMBQoAAGAgCRQAAMBAEigAAICBrIECAACmM8Z8gQQKAADY8qrq00luSXIoycHuPq+q7pPkDUnOTPLpJE/v7humXUcLHwAAcKx4bHef093nTV7/RJJ3dvfXJHnn5PVUKlAAAMB0vWXHmD85yQWT569NcmmSl0w7QQUKAADY1KpqT1VdtuixZ5nDOsmfVtXli/af0d1fmDz/YpIzVnovFahNYveOXWOHsMT+gwfGDmHTuPDzfz52CEu85rTHjh3CEs+57pKxQ1hi3537xw5hie3bZvPfvg65yeIgs/jn589uOP8/Hmbntln8FfPg2AGwjrp7b5K9Kxz2mO7+XFV9RZJ3VNUnj7pGV9WK0zJm8W83AAAwS7bAFL7u/tzk6zVV9eYk5yf5h6q6X3d/oarul+Sala4ze/8MBgAAsIaq6sSqOvnw8yTfluRjSd6S5NmTw56d5KKVrqUCBQAAbHVnJHlzVSXzOdDru/vtVfWBJG+squcm+UySp690IQkUAAAwVW/ytZLdfVWShy2z/UtJHr+aa2nhAwAAGEgCBQAAMJAWPgAAYLotMIVvrahAAQAADCSBAgAAGEgCBQAAMJA1UAAAwHTWQC1QgQIAABhIAgUAADCQFj4AAGC6nhs7gpmhAgUAADCQBAoAAGAgLXwAAMB0pvAtUIECAAAYaF0TqKo6VFVXLHqcWVV/MeC8T1fVactsv6CqHr3o9fOq6ofXOm4AAIDlrHcL3+3dfc5R2x697JHDXJDk1iR/kSTdfeE9uBYAADBAa+FbsOFroKrq1u4+qaq2Jfm1JI9L8tkkdyZ5dXe/aXLoC6vqe5LsTPLPkuxP8rwkh6rqh5K8MMnjk9za3b9YVZcmeV+SxyY5Nclzu/vdVXVCktckeWiSv0py/yQ/2t2XbcgHBgAAtoz1TqCOr6orJs+v7u6nLtr3tCRnJnlIkq9I8okkr160/7ruPreqXpDkRd39L6vqwkwSpiSpqscf9X47uvv8qvrOJD+T5AlJXpDkhu5+SFU9NMkVAQAAuBvGaOE77DFJfr+755J8saouOWr/H06+Xp75ZGuIxeecueh9fiVJuvtjVfWRgdcCAAASU/gWmeUpfHdMvh7K8ETv7pyTJKmqPVV1WVVdNje3bzWnAgAAx4gxE6j3JPm+qtpWVWdkfkDESm5JcvLdeJ+nJ0lVPSTJ1y93UHfv7e7zuvu8bdtOXOVbAAAAx4Ixb6T7B5kfAvHxzA+R+GCSm1Y4561J3lRVT878EIkhfj3Ja6vq40k+meTKAe8DAAAcNjc3dgQzY10TqO4+6a62dfdcVb2ou2+tqvsmeX+Sj072nbno+MsyqU51918nOXvR5d696LgLFj2/LkfWQO1P8kPdvb+qHpzk/yb5zD3/dAAAwLFmzApUkrytqk5NsivJz3X3F9fhPU5IcklV7UxSSV7Q3QfW4X0AAIAtbtQEanHVaB3f45Yk5633+wAAAFvf2BUoAABg1hljvmCWx5gDAADMFAkUAADAQFr4AACA6bTwLVCBAgAAGEgCBQAAMJAWPgAAYKpuLXyHqUABAAAMJIECAAAYSAsfAAAwnSl8C1SgAAAABpJAAQAADKSFDwAAmE4L3wIVKAAAgIEkUAAAAANJoAAAAAayBmoZu3fsGjuEJe6cOzh2CEts3zZ7+fehubmxQ9g0fvrAlWOHsMT7zzhv7BCW+P7b/27sEJb43K3XjR3CpjGLP8/3HzwwdghL+D5tbrP4/+NZ/L2Fe6atgVowe//FAQAAzCgJFAAAwEBa+AAAgOm08C1QgQIAABhIAgUAADCQFj4AAGA6g44XqEABAAAMJIECAAAYSAsfAAAwlRvpHqECBQAAMJAECgAAYCAtfAAAwHRa+BaoQAEAAAwkgQIAABhIAgUAADCQNVAAAMB0c2MHMDtUoAAAAAaSQAEAAAy0KVv4qupQko8u2vSUJK/v7kePFBIAAGxZbYz5gk2ZQCW5vbvPOWrbkuSpqnZ098ENigkAANjitkwLX1XdOvl6QVW9u6rekuTjVbW9qv5bVX2gqj5SVf9q5FABAIBNarNWoI6vqismz6/u7qcetf/cJA/t7qurak+Sm7r7EVV1XJL3VNWfdvfVGxoxAABsVqbwLdisCdRyLXyLvX9RgvRtSc6uqu+fvD4lydck+bIEapJo7UmSXTvvm507Tl7jkAEAgM1usyZQK9m36HkleWF3/8m0E7p7b5K9SXLSCQ+0Sg4AAFhiqyZQi/1JkudX1cXdfWdV/ZMkn+vufSudCAAAmMK32LGQQP1GkjOTfLCqKsm1mR97DgAAsCqbMoHq7pPualt3X5rk0kXb55L8h8kDAADgbtuUCRQAALCBTOFbsGXuAwUAALDeJFAAAAADaeEDAACmai18C1SgAAAABpJAAQAADCSBAgAAGMgaKAAAYDproBaoQAEAAAwkgQIAABhICx8AADCVMeZHqEABAAAMJIECAAAYSAsfAAAwnRa+BSpQAAAAA0mgAAAABtLCBwAATGUK3xESqGXsP3hg7BA2hd07do0dwhKH5vzZDfV3N18zdghLnD+DMd3ruBPGDmGJQ3P+LzaUn+fD+D4N53s1zPZtmpzYuvztBgAAGEgFCgAAmEoL3xEqUAAAAANJoAAAAAaSQAEAAAxkDRQAADCVNVBHqEABAAAMJIECAAAYSAsfAAAwXdfYEcwMFSgAAICBJFAAAAADaeEDAACmMoXvCBUoAACAgSRQAAAAA2nhAwAApuo5U/gOU4ECAAAYSAIFAAAwkBY+AABgKlP4jpiJClRVHaqqKxY9zqyqC6rqbSuc97yq+uGNihMAADi2zUoF6vbuPmfxhqo6c6WTuvvC9QoIAADgaDNRgZqmqrZV1aeq6vRFr/+mqk6vqpdW1Ysm2y+tqpdX1fur6q+r6psn20+oqjdW1cer6s1V9b6qOm/MzwQAAJtJd830YyPNSgJ1/KL2vTcv3tHdc0n+V5JnTTY9IcmHu/vaZa6zo7vPT/Jvk/zMZNsLktzQ3Q9J8h+TPHxdPgEAALDlzUoCdXt3nzN5PHWZ/a9Ocnit079I8lt3cZ0/nHy9PMmZk+ePSfJ7SdLdH0vykeVOrKo9VXVZVV02N7fvbnwEAABgllXV9qr60OFZC1X1wEmH2t9U1RuqatdK15iVBGqq7v5skn+oqsclOT/JH9/FoXdMvh7KKtd3dffe7j6vu8/btu3Eux8sAAAwq/5Nkk8sev3yJK/o7q9OckOS5650gU2RQE38RuZb+X6/uw+t4rz3JHl6klTVQ5J8/TrEBgAAW1bPzfZjiKr6yiTflfm8IlVVSR6X5E2TQ16b5CkrXWczJVBvSXJS7rp97678epLTq+rjSX4+yZVJblrj2AAAgJEsXo4zeexZ5rBfTvLiJIdTrvsmubG7D05e/32SB6z0XjMxxry7T1pm26VJLl206WGZHx7xyUXHvHTR8wsWPb8uR9ZA7U/yQ929v6oenOT/JvnMmgUPAACMqrv3Jtl7V/ur6ruTXNPdl1fVBffkvWYigVpJVf1EkufnyCS+1TghySVVtTNJJXlBdx9Yy/gAAGAr67mNHRW+Dr4pyfdW1Xcm2Z3kXkl+JcmpVbVjUoX6yiSfW+lCm6KFr7tf1t1f1d1/fjfOvWUyHOJh3X12d9/VAAoAAGAL6u6f7O6v7O4zkzwjycXd/awklyT5/slhz05y0UrX2hQJFAAAwDp4SZIfr6q/yfyaqN9c6YRN0cIHAACMp3vsCNbO4lkL3X1V5m+TNJgKFAAAwEASKAAAgIG08AEAAFNtgSl8a0YFCgAAYCAJFAAAwEBa+AAAgKm08B2hAgUAADCQBAoAAGAgCRQAAMBA1kABAABTdY8dwexQgQIAABhIAgUAADCQFj4AAGAqY8yPkEBtEtu3zV6x8M65g2OHsGnM4p/fobm5sUNY4l7HnTB2CJvCE884e+wQlvXRfZ8dO4Qlbty/b+wQlth/8MDYIWwKs/rz4OY7bhs7hE1hFv8fA2tl9n6rAwAAmFEqUAAAwFTdWvgOU4ECAAAYSAIFAAAwkBY+AABgqjYXZIEKFAAAwEASKAAAgIG08AEAAFPNmcK3QAUKAABgIAkUAADAQBIoAACAgayBAgAApmproBaoQAEAAAwkgQIAABhICx8AADBVz2nhO2xwBarm/VBV/fTk9T+uqvPXLzQAAIDZspoWvl9P8qgkz5y8viXJq9Y8IgAAgBm1mha+b+zuc6vqQ0nS3TdU1a51igsAAJgR3WNHMDtWU4G6s6q2J+kkqarTk8ytVSBVdUZVvb6qrqqqy6vqL6vqqVX1nKr6tTW4/nOq6v5rESsAAHBsWk0C9atJ3pzkjKr6z0n+PMkvrEUQVVVJ/ijJu7r7Qd398CTPSPKVa3H9ieckkUABAAB32+AWvu5+XVVdnuTxk01P6e5PrFEcj0tyoLsvXPR+n0nyyqp6TpL7V9Xbkzw4yZu7+8VJUlXPTPIfklSS/93dL5lUyX4zyXmZr5a9OslnJ69fV1W3J3lUd9++RrEDAMCWZgrfEasdY35CksNtfMevYRxfl+SDU/afk+QbktyR5K+q6pVJDiV5eZKHJ7khyZ9W1VMynyw9oLsfmiRVdWp331hVP5bkRd192RrGDQAAHENWM8b8p5O8Nsl9kpyW5Leq6qfWI6iqelVVfbiqPjDZ9M7uvqm79yf5eJKvSvKIJJd297XdfTDJ65J8S5Krkjyoql5ZVU9KcvPA99xTVZdV1WVzc/vW/kMBAACb3moqUM9K8rBJEpOqelmSK5L8/BrEcWWS7zv8ort/tGnmckcAACAASURBVKpOS3K4WnTHomMPZUrck+mAD0vy7Umel+TpSf7FSgF0994ke5Nkx64HmDMCAAATc62F77DVDJH4fJLdi14fl+RzaxTHxUl2V9XzF207YYVz3p/kW6vqtMm6p2cm+bNJ4rWtu/8gyU8lOXdy/C1JTl6jeAEAgGPQaipQNyW5sqrekfk1UE9M8v6q+tUk6e5/fXeD6O6erF96RVW9OMm1SfYleUnuYq1Vd3+hqn4iySU5MkTiokn16beq6nBy+JOTr69JcqEhEgAAwN1VPfCuWFX17Gn7u/u1axLRDJjFFr7t21ZTLDx2HZpbs1uTralZ/PObxe/VvY5bqfBMknzjqV89dgjL+ui+z44dwhI37p+9Na37Dx4YO4RNYVZ/Htx8x21jh8AWc/DA5zZFb9xHH/g9M/f78WJff/VbN+z7uJoK1PWZr/LM3m9dAAAAG2A1/yz+A0k+VVX/tarOWq+AAAAAZtXgBKq7fyjz92L62ySvqaq/nIz+NpgBAAA4JqxqYUZ335zkTUl+L8n9kjw1yQer6oXrEBsAADADumf7sZFWcyPdJ1fVm5NcmmRnkvO7+zuSPCzJv1+f8AAAAGbHaoZIPC3JK7r7XYs3dvdtVfXctQ0LAABg9qwmgfri0clTVb28u1/S3e9c47gAAIAZMdebYtr6hljNGqgnLrPtO9YqEAAAgFm3YgWqqp6f5AVJHlxVH1m06+Qk71mvwAAAAGbNkBa+1yf54yT/JclPLNp+S3dff/hFVd27u29Y4/gAAICRtRa+BSsmUN19U5KbkjxzhUPfmeTctQgKAABgFq3qPlArkJYCAABb2mqm8K1kg29hBQAAbISNvlntLFvLChQAAMCWpoUPAABgoMEtfFX1S0le3d1X3sUhj1+bkAAAgFniRrpHrKYC9Ykke6vqfVX1vKo6ZfHOxSPNAQAAtqLBCVR3/0Z3f1OSH05yZpKPVNXrq+qx6xUcAADALFnVFL6q2p7krMnjuiQfTvLjVfWvuvsZ6xAfEyfu3D12CJvCzXfcNnYIyzr9hFNWPmiD3XbnHWOHsMQs/vk96JT7jR3CEhdf+7GxQ1jWF7/rwWOHsMQ/+t83jR3CErt37Bo7hCX2HzwwdghLfNO9v3bsEJb1nhv+auwQlpjFn533Ou6EsUNYYha/T2xOq1kD9Yok353k4iS/0N3vn+x6eVXN3k8TAABgTbQ1UAsGJVBVVUmuT3JOd+9b5pDz1zQqAACAGTRoDVR3d5Kn30XylO6evR4JAACANbaaNVAfrKpHdPcH1i0aAABg5hhjfsRqEqhvTPKsqvpMkn2Zv3Fud/fZ6xIZAADAjFlNAvXt6xYFAADAJjA4geruzyRJVX1FEjO1AQDgGNFjBzBDBt9It6q+t6o+leTqJH+W5NNJ/nid4gIAAJg5gxOoJD+X5JFJ/rq7H5jk8Uneuy5RAQAAzKDVrIG6s7u/VFXbqmpbd19SVb+8bpEBAAAzwRS+I1aTQN1YVScleVeS11XVNZmfxgcAAHBMWE0L35OT3J7k3yV5e5K/TfI96xEUAADALFrNFL59SVJV90ry1nWLCAAAmCmthW/B4ASqqv5Vkp9Nsj/JXCY30k3yoPUJDQAAYLasZg3Ui5I8tLuvW69gAAAAZtlqEqi/TXLbegUCAADMprmxA5ghq0mgfjLJX1TV+5LccXhjd//rNY8KAABgBq0mgfqfSS5O8tFIQgEAgGPQahKond394+sWSZKqOiPJK5I8MskNSQ4k+a/d/eb1fF8AAIAhVpNA/XFV7cn8CPPFLXzXr0UgVVVJ/ijJa7v7ByfbvirJ9x513I7uPrgW7wkAAKysY4z5YatJoJ45+fqTi7at5RjzxyU50N0XLly8+zNJXllVz0nytCQnJdleVd+V5KIk906yM8lPdfdFVXVikjcm+cok25P8XHe/oapelvlE7GCSP+3uF61RzAAAwDFkNTfSfeB6BpLk65J8cMr+c5Oc3d3XV9WOJE/t7pur6rQk762qtyR5UpLPd/d3JUlVnVJV903y1CRndXdX1anr/DkAAIAtasUEqqoe190XV9XTltvf3X+49mElVfWqJI/J/DqoVyV5x6J2wUryC1X1LZkfaPGAJGdkfsDFL1XVy5O8rbvfPUm29if5zap6W5K33cX77UmyJ0lq+ynZtu3E9fhYAACw6cz12BHMjiEVqG/N/PS971lmXydZqwTqyiTft3Dh7h+dVJcum2zat+jYZyU5PcnDu/vOqvp0kt3d/ddVdW6S70zy81X1zu7+T1V1fpLHJ/n+JD+W+XbBL/8g3XuT7E2SHbse4K8IAACwxIoJVHf/TFVtS/LH3f3GdYzl4sxXlZ7f3f9jsu2Euzj2lCTXTJKnxyb5qiSpqvsnub67/1dV3ZjkX1bVSUlO6O7/U1XvSXLVOn4GAABgCxu0Bqq756rqxZkf0LAuJuuTnpLkFZP3ujbzVaeXJDn+qMNfl+StVfXRzFeoPjnZ/vVJ/ltVzSW5M8nzk5yc5KKq2p351r91HcUOAABbzZwpfAtWM4Xv/1bVi5K8IYva6dZqjPnkWl9I8oy72P2aRcddl+RRyxzz6SR/ssz28+9pbAAAAKtJoH4g82ueXnDU9rUaYw4AADDTVpNAPSTzydNjMp9IvTvJhVPPAAAANj030j1iNQnUa5PcnORXJ69/cLLt6WsdFAAAwCxaTQL10O5+yKLXl1TVx9c6IAAAgFm1mgTqg1X1yO5+b5JU1TfmyD2aAACALWpu7ABmyGoSqIcn+Yuq+rvJ63+c5K8mo8S7u89e8+gAAABmyGoSqCetWxQAAACbwOAEqrs/s56BAAAAzLrVVKAAAIBjkDHmR2wbOwAAAIDNQgIFAAAwkBY+AABgKmPMj1CBAgAAGEgCBQAAMJAWPgAAYCotfEeoQAEAAAwkgQIAABhICx9324FDB8cOYYnt22bz3wS+eOsNY4fA3XTd/pvGDmGJE3fuHjuEZZ3+1k+NHcIS//z+jxw7hCV+5/PvHTuEJWbxZ+cff/FDY4ewrN07do0dwhL3Ou6EsUNYYt+d+8cOgTXmRrpHzN5PTAAAgBklgQIAABhICx8AADDVnA6+BSpQAAAAA0mgAACALa2qdlfV+6vqw1V1ZVX97GT7A6vqfVX1N1X1hqpacVKMBAoAANjq7kjyuO5+WJJzkjypqh6Z5OVJXtHdX53khiTPXelCEigAAGCqudRMP1bS826dvNw5eXSSxyV502T7a5M8ZaVrSaAAAIBNrar2VNVlix57ljlme1VdkeSaJO9I8rdJbuzuwzc3/fskD1jpvUzhAwAANrXu3ptk7wrHHEpyTlWdmuTNSc66O+8lgQIAAKbqsQNYQ919Y1VdkuRRSU6tqh2TKtRXJvncSudr4QMAALa0qjp9UnlKVR2f5IlJPpHkkiTfPzns2UkuWulaKlAAAMBWd78kr62q7ZkvIr2xu99WVR9P8ntV9fNJPpTkN1e6kAQKAACYam7sAO6h7v5Ikm9YZvtVSc5fzbW08AEAAAwkgQIAABhICx8AADDVXK18s9pjhQoUAADAQBIoAACAgTY0gaqqM6rq9VV1VVVdXlV/WVVP3cD3P7OqPrZR7wcAAFtBz/hjI21YAlVVleSPkryrux/U3Q9P8ozM3/F38XHWZQEAADNpIytQj0tyoLsvPLyhuz/T3a+squdU1Vuq6uIk76yq+1TVH1XVR6rqvVV1dpJU1Uur6kWHz6+qj02qSmdW1Seq6v+rqiur6k8ndxhOVT28qj5cVR9O8qMb+HkBAIAtZiMTqK9L8sEp+89N8v3d/a1JfjbJh7r77CT/IclvD7j+1yR5VXd/XZIbk3zfZPtvJXlhdz/sbkcOAADHsLkZf2yk0YZIVNWrJpWhD0w2vaO7r588f0yS30mS7r44yX2r6l4rXPLq7r5i8vzyJGdW1alJTu3ud022/86UePZU1WVVddnc3L679ZkAAICtbSMTqCszX2VKknT3jyZ5fJLTJ5uGZC0H8+Ux7170/I5Fzw9llfe46u693X1ed5+3bduJqzkVAAA4RmxkAnVxkt1V9fxF2064i2PfneRZSVJVFyS5rrtvTvLpTJKwqjo3yQOnvWF335jkxqp6zGTTs+5u8AAAABs28a67u6qekuQVVfXiJNdmvur0kiTHH3X4S5O8uqo+kuS2JM+ebP+DJD9cVVcmeV+Svx7w1j8yuVYn+dN7/EEAAOAYM1djRzA7NnRkeHd/IfOjy5fzmkXHXZ/kKcucf3uSb7uL8x+66LhfXPT88iSLB0i8eHjEAAAAR4w2RAIAAGCzcdNaAABgqrno4TtMBQoAAGAgCRQAAMBAWvgAAICpeuwAZogKFAAAwEASKAAAgIG08AEAAFO5ke4RKlAAAAADSaAAAAAG0sIHAABMNTd2ADNEBQoAAGAgCRQAAMBAEigAAICBrIECAACm6rEDmCEqUAAAAANJoAAAAAbSwreM3Tt2jR3CEjffcdvYIcAx6cChg2OHsMSdc7MX06y66EsfGTuEJZ5yv4ePHcISf/SFy8cOYdPYtX32fnXyO8Iw9zruhLFD2NTmauwIZocKFAAAwEASKAAAgIFmrw4NAADMlLmxA5ghKlAAAAADSaAAAAAG0sIHAABMpYXvCBUoAACAgSRQAAAAA2nhAwAApmo30l2gAgUAADCQBAoAAGAgLXwAAMBUpvAdoQIFAAAwkAQKAABgIAkUAADAQNZAAQAAU1kDdYQKFAAAwEASKAAAgIG2RAtfVd3a3SeNHQcAAGxFPXYAM0QFCgAAYKAtl0BV1Uuq6qNV9eGqetlk24Or6u1VdXlVvbuqzho7TgAAYPPZEi18h1XVdyR5cpJv7O7bquo+k117kzyvuz9VVd+Y5NeTPG6sOAEAYDOZq7EjmB1bKoFK8oQkv9XdtyVJd19fVScleXSS369a+JM/7ugTq2pPkj1JsmvnfbNzx8kbEzEAALBpbLUEajnbktzY3edMO6i792a+UpWTTnigdXIAAMASW20N1DuS/EhVnZAkVXWf7r45ydVV9c8m26qqHjZmkAAAsJnMzfhjI22pBKq7357kLUkuq6orkrxosutZSZ5bVR9OcmXm10kBAACsypZo4Vt8D6juflmSlx21/+okT9rouAAAgK1lSyRQAADA+tnoNrlZtqVa+AAAANaTBAoAAGAgCRQAAMBA1kABAABTuUnqESpQAAAAA0mgAAAABtLCBwAATDVXY0cwO1SgAAAABpJAAQAADKSFDwAAmGpu7ABmiAoUAADAQBIoAACAgbTwAQAAU7mR7hEqUAAAAANJoAAAAAbSwgcAAEw1p4lvgQRqGfsPHhg7hE1h+7bZK2AempvNIZv3Pf7ksUNY4s65Q2OHsMTNd9w2dghL/OJ9v2nsEJb4sX+4ZOwQlrV7x66xQ1hi3537xw5hiT/6wuVjh7DE7Z9/99ghLHH8/b957BCWtXPb9rFD4G6axZ8HbE6z9xswAADAjJJAAQAADKSFDwAAmGo2F0mMQwUKAABgIAkUAADAQFr4AACAqQwxP0IFCgAAYCAJFAAAwEBa+AAAgKlM4TtCBQoAAGAgCRQAAMBAWvgAAICp5mrsCGaHChQAAMBAEigAAICBtPABAABTzbmV7gIVKAAAgIEkUAAAAANp4QMAAKbSwHfEhlagqqqr6pcWvX5RVb10g2O4tKrO28j3BAAAtoaNbuG7I8nTquq0u3NyVamYAQAAo9nohORgkr1J/l2S/3fxjqo6M8mrk5yW5NokP9Ldf1dVr0myP8k3JHlPVd0n+f/bu/Nwycrq7vvfXzfNLDgRgqigKBhERAQjOOEYjThEcY6C+ogmxgF9YtSYmBhNHOLwBBO1RSYlRpCoqK8ioqKCgsyDihqUqCCKyDx2n/X+sffpLs45fbq67a57d/f3w3WurtpVu2pVnaLOXvte97q5qb/+B8BLgBcB+wCnV9VB/eN9CNgb2Az4dFW9de2+NEmSJEnruxZNJP4deEGSrWdsPxQ4qqp2B44B/m3ktrsD+1bV6/rrd6JLmA4BTgDeD9wfeECSPfr7/G1V7QXsDjwqye5r5dVIkiRJ67mpgf9M0sQTqKq6FjgaePWMm/YB/rO//HHg4SO3HVdVS0euf76qCrgAuKKqLqiqKeAiYMf+Ps9OcjZwDl1ytesafSGSJEmSNjit2ph/AHgpsMWY979hxvVb+n+nRi5PX98oyb2A/ws8th/R+iKw6XxPkOTgJGcmOXNqaubTSZIkSVKjBKqqrgKOpUuipp0GPLe//ALgW7/HU2xFl3Rdk2Rb4EljxLS4qvaqqr0WLBg3r5MkSZLWf1PUoH8mqeVCuu+laxgx7VXAi5OcD7wQeM3qPnBVnUdXuvdDurLAU3+POCVJkiQJmHAXvqracuTyFcDmI9cvBR4zxz4Hreh6Vf0M2G0Ft91uv5Ht+61y4JIkSZLE5NuYS5IkSVrHTLZIbthalvBJkiRJ0jrFBEqSJEmSxmQJnyRJkqR5TXqx2iFzBEqSJEmSxmQCJUmSJGm9luQeSb6e5PtJLkrymn77nZOclOTH/b93WtljmUBJkiRJmlfrhXLXwEK6S4DXV9WuwEOBVybZFXgjcHJV3Rc4ub8+LxMoSZIkSeu1qrq8qs7uL18H/ADYHngacFR/t6OAp6/ssUygJEmSJK3Tkhyc5MyRn4Pnue+OwIOA04Ftq+ry/qZfAduu7LnswidJkiRpnVZVi4HFK7tfki2B44HXVtW1SUYfo5KstB7QBEqSJEnSvMaaZTRwSRbRJU/HVNV/95uvSLJdVV2eZDvg1yt7HEv4JEmSJK3X0g01fQz4QVW9b+SmE4AD+8sHAp9b2WM5AiVJkiRpffcw4IXABUnO7be9GXgncGySlwKXAs9e2QOZQEmSJEma11TrAH5PVfVtICu4+bGr8liW8EmSJEnSmEygJEmSJGlMlvBJkiRJmletF3341gxHoCRJkiRpTI5AzWHhguHllVss2rR1COuEa2+5sXUIc/rtTde1DmGWrTbZvHUIs2y60catQ5jlzVef3jqEdcbNS25tHcIsQ/xMLZ0a3vu02d0e0TqEWZ693UNahzCnYy8/o3UIWk0eS2lNMYGSJEmSNK91vQvfmjS8oRZJkiRJGigTKEmSJEkakyV8kiRJkuY1ZRe+ZRyBkiRJkqQxmUBJkiRJ0pgs4ZMkSZI0Lwv4lnMESpIkSZLGZAIlSZIkSWMygZIkSZKkMTkHSpIkSdK8bGO+nCNQkiRJkjQmEyhJkiRJGpMlfJIkSZLmNdU6gAFxBEqSJEmSxmQCJUmSJEljsoRPkiRJ0rzKLnzLOAIlSZIkSWNqmkAlWZrk3CQXJjkuyebz3PepSd44yfgkSZIkaVTrEaibqmqPqtoNuBV4xYruWFUnVNU7JxeaJEmSJOi68A35Z5JaJ1CjvgXcJ8mdk3w2yflJvptkd4AkByX5YH/5Wf2o1XlJvtlv2zTJEUkuSHJOkkeP7PffSb6c5MdJ3t3sFUqSJElapw2iiUSSjYAnAV8G/hE4p6qenuQxwNHAHjN2+XvgT6rql0nu2G97JVBV9YAk9wO+kmTn/rY9gAcBtwAXJzm0qn6+ll+WJEmSpPVM6xGozZKcC5wJ/C/wMeDhwMcBquprwF2SbDVjv1OBI5O8DFjYb3s48Il+vx8ClwLTCdTJVXVNVd0MfB/YYWYgSQ5OcmaSM5cuvX5NvkZJkiRpnVYD/2+SWo9A3VRVtxtdSrLSnarqFUn+GHgycFaSB69kl1tGLi9ljtddVYuBxQCbbHoP+zRKkiRJmqX1CNRcvgW8ACDJfsCVVXXt6B2S7FRVp1fV3wO/Ae4xY7+dgXsCF08wbkmSJEnrudYjUHP5B+DwJOcDNwIHznGf9yS5LxDgZOA84IfAh5JcACwBDqqqW8YZ0ZIkSZKkcTRNoKpqyzm2XQU8fY7tRwJH9pefMcfD3Qy8eL79+uv7r2a4kiRJ0gZp0q3Ch2yIJXySJEmSNEgmUJIkSZI0piHOgZIkSZI0IFNlk+ppjkBJkiRJ0phMoCRJkiRpTJbwSZIkSZqXBXzLOQIlSZIkSWMygZIkSZKkMVnCJ0mSJGleUxbxLeMIlCRJkiSNyQRKkiRJksZkCZ8kSZKkeZUlfMs4AiVJkiRJYzKBkiRJkqQxmUBJkiRJ0picAyVJkiRpXlOtAxgQR6AkSZIkaUyOQM1h6dTwcuwbbru5dQj6Pdx76+1ahzDLpddd0TqEdcLdtrhL6xBmWbRgYesQ5nT1LTe0DmGWm5fc2jqEWRYu8NzlOI69/IzWIczpwh0f2DqEWXb72XmtQ5hl0402bh3CLNfecmPrELSeMIGSJEmSNK8p25gv42kwSZIkSRqTCZQkSZIkjckSPkmSJEnzKkv4lnEESpIkSZLGZAIlSZIkSWOyhE+SJEnSvIa3yE87jkBJkiRJ0phMoCRJkiRpTJbwSZIkSZpXlV34pjkCJUmSJEljMoGSJEmSpDFZwidJkiRpXlMupLuMI1CSJEmSNCYTKEmSJEkakwmUJEmSJI3JOVCSJEmS5jXVOoABcQRKkiRJksY0sQQqydIk5ya5MMlxSTZfQ497ZJID5th+tySfXhPPIUmSJEkw2RGom6pqj6raDbgVeMXafLKquqyqZiVWkiRJklZNDfy/SWpVwvct4D5JtkvyzZGRqUckeUmSD0zfMcnLkry/v/yiJOcnOS/Jx0ce75FJTktyyfRoVJIdk1zYX16Y5F/75zg/yasm+WIlSZIkrR8m3kQiyUbAk4AvA88HTqyqdyRZCGwOnAP8bZK/rqrbgBcDL09yf+AtwL5VdWWSO4887HbAw4H7AScAM0v3DgZ2BPaoqiUz9pUkSZKksUwygdosybn95W8BHwMeChyeZBHw2ao6FyDJ14D9k/wAWFRVF/SjRsdV1ZUAVXXVyGN/tqqmgO8n2XaO534c8OGqWjLHvvTPeTBdokUWbs2CBVusgZcsSZIkrfumJlwmN2STTKBuqqo9Zmz7ZpJHAk8Gjkzyvqo6GjgMeDPwQ+CIMR77lpHLWZ3gqmoxsBhgo4239xMiSZIkaZambcyT7ABcUVUfpUua9gSoqtOBe9CV+H2yv/vXgGcluUu/76qU4Z1EVwa40WrsK0mSJElA+4V09wP+OsltwPXAi0ZuO5ZuztLvAKrqoiTvAE5JspRurtRBYz7PYcDOwPn9c30U+OAaeQWSJEnSeq7KAq1pE0ugqmrLObYdBRy1gl0eDrx/ZfevqoPmep6q+hmwW395CfC6/keSJEmSVkvTEr65JLljkh/RzZk6uXU8kiRJkjStdQnfLFV1NV25nSRJkqQBmGodwIAMbgRKkiRJkobKBEqSJEmSxmQCJUmSJEljGtwcKEmSJEnDUtjGfJojUJIkSZI0JhMoSZIkSRqTJXySJEmS5jVlCd8yjkBJkiRJ0phMoCRJkiRpTJbwSZIkSZpXlSV80xyBkiRJkqQxmUBJkiRJ0pgs4ZMkSZI0L7vwLecIlCRJkiSNyQRKkiRJksZkCd8cNt1o49YhzHLb1JLWIcyyaMHwPj5Lp25tHcKcLrvht61DWCcM8TN1za3Xtw5hlt/edF3rEOY0xO/O7be8Y+sQZvn1jVe3DmGWm5cM77tz4YJhnuPd6xc/aB3CLI/fdvfWIcxy9rU/bR3CLH+w+fC+D9YlZQnfMsP8dpIkSZKkATKBkiRJkqQxDa9eRpIkSdKgTLmQ7jKOQEmSJEnSmEygJEmSJGlMJlCSJEmSNCbnQEmSJEmalzOglnMESpIkSZLGZAIlSZIkSWOyhE+SJEnSvKYs4lvGEShJkiRJGpMJlCRJkiSNyRI+SZIkSfOyhG85R6AkSZIkaUwmUJIkSZLWe0kOT/LrJBeObLtzkpOS/Lj/904rexwTKEmSJEnzqqpB/4zpSOCJM7a9ETi5qu4LnNxfn5cJlCRJkqT1XlV9E7hqxuanAUf1l48Cnr6yxzGBkiRJkrSh2raqLu8v/wrYdmU7DD6BSrI0yblJLkzy+SR3XI3H2C/JF9ZGfJIkSdL6booa9E+Sg5OcOfJz8Kq+xupqAVdaDzj4BAq4qar2qKrd6IbcXtk6IEmSJEnDUVWLq2qvkZ/FY+56RZLtAPp/f72yHdaFBGrUd4DtAZLskeS7Sc5P8pnpjhlJ7pPkq0nOS3J2kp1GHyDJ3knOmbldkiRJ0gbnBODA/vKBwOdWtsM6k0AlWQg8lu5FAhwN/E1V7Q5cALy1334M8O9V9UBgX+DykcfYF/gw8LSq+p9JxS5JkiSprSSfpBuQ2SXJL5K8FHgn8PgkPwYe11+f10ZrN8w1YrMk59KNPP0AOCnJ1sAdq+qU/j5HAccluQOwfVV9BqCqbgZIAvBHwGLgCVV12YRfgyRJkrTOqpVPDRq8qnreCm567Ko8zrowAnVTVe0B7ACE1Z8DdTlwM/CguW4cnXh225LrVvMpJEmSJK3P1oUECoCquhF4NfB64Abgd0ke0d/8QuCUqroO+EWSpwMk2STJ5v19rgaeDPxLkv3mePxlE88WbXSHtfxqJEmSJK2L1oUSvmWq6pwk5wPPo5vk9eE+QboEeHF/txcCH0nyNuA24Fkj+1+RZH/gS0leUlWnT/YVSJIkSeuersO3YB1IoKpqyxnXnzJy9aFz3P/HwGNmbL4E+EZ/+/8C91+zUUqSJEnaEKwzJXySJEmS1NrgR6AkSZIktTW1HnThW1McgZIkSZKkMZlASZIkSdKYLOGTJEmSNC+78C3nCJQkSZIkjckESpIkSZLGZAmfJEmSpHnZhW85R6AkSZIkaUwmUJIkSZI0JhMoSZIkSRqTc6AkSZIkzaucA7WMI1CSJEmSNCYTKEmSJEkakyV8kiRJkuY1VZbwTXMESpIkSZLGZAIlSZIkSWOyhE+SJEnSvOzCt5wJ1BxuXnJr6xDWCYscvxzbshcVzQAAIABJREFUxguH97/abVNLWocwi//vjWerTTZvHcKcrr3lxtYhzPLL669sHcIsS6emWoewThjq+7T9lndsHcIsp1/9k9YhzLLjltu2DmGW83/709YhaD3hIbAkSZIkjWl4p8UlSZIkDYpd+JZzBEqSJEmSxmQCJUmSJEljsoRPkiRJ0rzswrecI1CSJEmSNCYTKEmSJEkakyV8kiRJkuZlF77lHIGSJEmSpDGZQEmSJEnSmEygJEmSJGlMzoGSJEmSNC/bmC/nCJQkSZIkjckESpIkSZLGZAmfJEmSpHnZxnw5R6AkSZIkaUwmUJIkSZI0Jkv4JEmSJM3LLnzLDXoEKsnfJrkoyflJzk3yx0lem2Tz3+Mxj0xywJqMU5IkSdKGYbAjUEn2AfYH9qyqW5LcFdgY+BTwCeDGlvFJkiRJ2vAMeQRqO+DKqroFoKquBA4A7gZ8PcnXAZI8Icl3kpyd5LgkW/bbH5zklCRnJTkxyXatXogkSZK0LquaGvTPJA05gfoKcI8kP0ryH0keVVX/BlwGPLqqHt2PSr0FeFxV7QmcCbwuySLgUOCAqnowcDjwjkavQ5IkSdJ6YrAlfFV1fZIHA48AHg18KskbZ9ztocCuwKlJoCvx+w6wC7AbcFK/fSFw+XzPl+Rg4GCALNyaBQu2WHMvRpIkSdJ6YbAJFEBVLQW+AXwjyQXAgTPuEuCkqnre7TYmDwAuqqp9VuG5FgOLATbaeHvbjEiSJEm9KbvwLTPYEr4kuyS578imPYBLgeuAO/Tbvgs8LMl9+n22SLIzcDGwTd+IgiSLktx/ctFLkiRJWh8NeQRqS+DQJHcElgA/oSuxex7w5SSX9fOgDgI+mWSTfr+3VNWP+lbl/5Zka7rX+QHgoom/CkmSJEnrjcEmUFV1FrDvHDcd2v9M3+9rwN5z7H8u8Mg5th+05qKUJEmStCEZbAIlSZIkaRiqnAM1bbBzoCRJkiRpaEygJEmSJGlMlvBJkiRJmpdtzJdzBEqSJEmSxmQCJUmSJEljsoRPkiRJ0rzswrecI1CSJEmSNCYTKEmSJEkakyV8kiRJkuY1ZQnfMo5ASZIkSdKYTKAkSZIkaUyW8EmSJEmaV7mQ7jKOQEmSJEnSmEygJEmSJGlMlvBJkiRJmpcL6S7nCJQkSZIkjckRqDlsutHGrUOYZYtFm7QOYZbbppa2DmGdsWjBwtYhzLJowfD+9186dWvrEGa52xZ3aR3CLFfefE3rEOa01Sabtw5hlh233LZ1CLP88sYrW4cwy29vuq51CLMM8fMEcOvUba1DmGXzAR4jXPS7S1uHMMtNl32rdQhaTzgCJUmSJEljGt4paEmSJEmDMmUb82UcgZIkSZKkMZlASZIkSdKYLOGTJEmSNC/bmC/nCJQkSZIkjckESpIkSZLGZAmfJEmSpHlNWcK3jCNQkiRJkjQmEyhJkiRJGpMlfJIkSZLmZRe+5RyBkiRJkqQxmUBJkiRJ0pgs4ZMkSZI0ryks4ZvmCJQkSZIkjckESpIkSZLGZAIlSZIkSWNyDpQkSZKkednGfLlBjEAleX+S145cPzHJYSPX35vkdSvY96Akd5tEnJIkSZI2bINIoIBTgX0BkiwA7grcf+T2fYHTVrDvQcAqJVBJHHmTJEmStMqGkkCdBuzTX74/cCFwXZI7JdkE+CPgCUm+l+TCJIvTOQDYCzgmyblJNkvy4CSnJDmrH8naDiDJN5J8IMmZwGsavEZJkiRpnTRVNeifSRpEAlVVlwFLktyTbrTpO8DpdEnVXsAFwAerau+q2g3YDNi/qj4NnAm8oKr2AJYAhwIHVNWDgcOBd4w81cZVtVdVvXdSr02SJEnS+mNIpWyn0SVP+wLvA7bvL19DV+L36CRvADYH7gxcBHx+xmPsAuwGnJQEYCFw+cjtn1rRkyc5GDgYYONFd2HRRnf4/V+RJEmSpPXKkBKo6XlQD6Ar4fs58HrgWuAI4KPAXlX18yT/AGw6x2MEuKiq9pnjNoAbVvTkVbUYWAyw5eb3ss2IJEmS1Cs8PJ42iBK+3mnA/sBVVbW0qq4C7khXxjfdQOLKJFsCB4zsdx0wPVx0MbBNkn0AkixKMtqMQpIkSZJW25ASqAvouu99d8a2a6rqSroRqAuBE4HvjdznSODDSc6lK9k7AHhXkvOAc+m7+0mSJEnS72swJXxVtRTYasa2g0YuvwV4yxz7HQ8cP7LpXOCRc9xvvzUUqiRJkrRBmXSnuyEb0giUJEmSJA2aCZQkSZIkjWkwJXySJEmShqks4VvGEShJkiRJGpMJlCRJkiSNyQRKkiRJksbkHChJkiRJ8yqcAzXNEShJkiRJGpMJlCRJkiSNyRI+SZIkSfOyjflyjkBJkiRJ0phMoCRJkiRpTJbwSZIkSZqXJXzLOQIlSZIkSWMygZIkSZKkMZlASZIkSZpXDfxnHEmemOTiJD9J8sbVeydMoCRJkiSt55IsBP4deBKwK/C8JLuuzmOZQEmSJEla3z0E+ElVXVJVtwL/BTxtdR7ILnxzuP7Gn2ZNPVaSg6tq8Zp6vDXBmMYzxJhgmHEZ03iMaXxDjMuYxmNM4xtiXMY0niHGtLYtufWXa+z4eG1IcjBw8MimxTN+R9sDPx+5/gvgj1fnuRyBWvsOXvldJs6YxjPEmGCYcRnTeIxpfEOMy5jGY0zjG2JcxjSeIca0QauqxVW118jPWktwTaAkSZIkre9+Cdxj5Prd+22rzARKkiRJ0vrue8B9k9wrycbAc4ETVueBnAO19g2xPtaYxjPEmGCYcRnTeIxpfEOMy5jGY0zjG2JcxjSeIcakeVTVkiR/BZwILAQOr6qLVuexUjVu53RJkiRJ2rBZwidJkiRJYzKBkiRJkqQxmUBJkiRJ0phMoDYQSR48x7b9W8SiVZfkVUnu1DqOdUGSHZI8rr+8WZI7tI5paJJsMs42SRuGJPeaY9veLWIZqiQLkxzSOg4Ng00k1oIknwdmvrHXAGcCH6mqmxvEdDbwoqq6sL/+POC1VbVaKzCvoZgeBvwDsANdR8gAVVX3bhjTnwFfq6pr+ut3BParqs+2iqmP4+107TbPBg4HTqzG//Mm2XOOzdcAl1bVkknHA5DkZXSLG965qnZKcl/gw1X12Bbx9DEN8X06u6r2XNm2Ccf0buDtwE3Al4HdgUOq6hMNYrmA2d/hy1TV7hMMZ5YkOwMfAratqt2S7A48tare3iCWeT8zVXX2pGKZS5LtWf43BoCq+ma7iCDJK4Fjqurq/vqdgOdV1X80jOls4ClV9cv++qOAD1bVAxrE8oz5bq+q/55ULDMlOaOqHtLq+TUcJlBrQZL/B2wDfLLf9BzgWro/yFtV1QsbxHRv4NPA84FHAC8C9p9OFFpI8kPgEOAsYOn09qr6bcOYzq2qPWZsO6eqHtQqppE4AjwBeDGwF3As8LGq+p9G8XwX2BM4ny753Q24CNga+Iuq+kqDmM4FHgKcPv07S3JBi4OAkZgG8z4l+UNge+ATdN8F6W/aii7RvN+kYpkjtnOrao/+JMb+wOuAb1bVAxvEskN/8ZX9vx/v/30BQFW9cdIxjUpyCvDXdCfkpj/nF1bVbg1i+fo8N1dVPWZiwcyQ5F10f3+/z/K/MVVVT20VEwzz70w/2vQfwFPovq/+he4Y4ecNYjlinpurql4ysWBmSPJ+YBHwKeCGkaCanijQ5LkO1Nqxb1WNDn1/Psn3qmrvJKvVb/73VVWXJHku8Fngf4EnVNVNLWIZcU1VfalxDDPNVdY6iP9PqqqS/Ar4FbAEuBPw6SQnVdUbGoR0GfDS6TUUkuwKvA14A/DfwMQTKOCWqrq1yzUhyUbMM5IwIUN6n/4EOIhu9fX3sjyBug548wTjmMv0/2dPBo6rqmumf4+TVlWXAiR5/IyD2jf2Z+qbJlDA5lV1xoz3p8loZlU9usXzjunpwC5VdUvrQGZYmCTTVQRJFgIbtwyoqr6X5NV030c3A4+rqt80iuXFLZ53TNOJ79tGthXQ7ESB2hjEgeF6aMsk96yq/wVIck9gy/62WycZyBylKHemWzzs9CStS1G+nuQ9dAeRy/7ANT6Tc2aS9wH/3l9/Jd0IWVNJXkM3anglcBjw11V1W5IFwI/pDsYnbefRBeiq6vtJ7tcn6w3CAeCUJG8GNkvyeOAvgc+3CqY3mPepqo4CjkryzKo6fqJPvnJf6EelbwL+Isk2dAdyLSXJw6rq1P7Kvgxj7vCVSXai/25PcgBweduQIMluwK7AptPbqurodhFxCd1owdASqC8Dn0rykf76y/ttEzfHlIPN6UqMP9YfIzQbrUuyLfDPwN2q6kn9yad9qupjrWIa+AkDTZAlfGtBkj8FPgz8D90Z3nvRHch9A3hZVX1ggrHsMN/t02daW1hB6Ufrko8tgL8DHtdvOgl4e1XdsOK91r4k/wAcMdfvK8kfVdUPGsT0KeAq4L/6Tc8B7gq8EPj2jFHYScUU4P/QlTqGbrXxw1rOFxvo+/Qa4Ai6kaeP0pXsvLFF2eWMuO5MNzK9NMnmdCXPv2oYz4Pp5hxuTfd5+h3wktblOn1J9mJg3z6mnwJ/XlU/axjTW4H96BKo/w94Et3n+4CGMR0PPBA4mdufpHt1q5gA+hNfLwem52aeRPc9tXTFe621WB413+1VdcqkYpkpyZfovqf+tqoe2FcUnNO4JHtwSZ3aMIFaS/qOVtPzCS5u0ThiJJaFwEUt5zdo9Q3195dkM7oTAw/vN51KV0N/M12J0fUTjsf3afyYzusPSP4EeAXwFuDjjZtIPAv4clVdl+QtdEnd21snKwBJtgZoOWd0Lv0JnwVVdd0AYrmALlk5p/9sbQt8oqoe3zCmA+fa3o/EakS6LnyXTx+r9N9b2zZOyqenPiybHzbX/LEJxzS4pE5tWMK3FiR50YxND+yHwpuUMvRncy8eLSscgv6g5K3AI/tNpwBva3GQkuQDVfXaOcoZAJqWMQz199fPoXtv/zPTxJMC36dVMl07+KfA0VV1URrWXfb+rqqOS/JwuhHg99B1mmvZKXQT4JnAjsBG029RVb1tnt3WuiT/DLy7bt/F7fVV9ZaGYd1UVVNJliTZCvg1cI+G8VBVRyXZGNi533RxVd3WKp4kx1bVs+corQead3c8jm5Ec9rSflvLVuY3JLkLy0tVH0pXXtjSXavq2CRvAqiqJUkmPnKo9kyg1o7RL5xN6YbpzwZa1oLfCbgoyRncvnNMy25EhwMXAs/ur7+Q7szOvC1M15LpLlv/2uC5xzG4319mt6GfjqlZG3p8n8Z1VpKv0JUXvyndWllTDeOB5V3Sngwsrqovpmvf39Ln6A7YzmJY82ieVFXLmn5U1e/60vGWCdSZ6ZZ9+Cjd+3U98J2G8ZBkP+Ao4Gd0Jw3ukeTAatfG/DX9v0Ncg3Gjqlo2R7tvxtO0sQVdJ84TgJ2SnErX3bhZSWhviEmdGrCEbwL6Pyr/VVVPbBjDnHXOjeub52rl2mx4vi8BO7qqXtDi+ecz0N/fENvQ+z6NF9MCum5Sl1TV1f0BwfZVdX7DmL4A/BJ4PF353k3AGdWgjflITE1ag69MkvOBvae7y/XlVmdW1f3bRtZJsiPd/LVmn6c+jrOA51fVxf31nYFPVtWsheU3dElOAg6tqhP6608DXl0N19Dr49gI2IUuAW46gtjHsydwKN1yFBfSJXXPqqrzWsalyXMEajJuoDvT20zLA8h53JTk4VX1bVh2pr5Za/W+BGyHJBuPnokbgoH+/gbXht73aTx9qdXdgef3ZWmnVFXrboXPBp4I/Guf1G1Ht9ZRS6cleUBVXdA4jpmOAU7O8vVyXkw30tJUugV9d6Q/tkhyn2q46CmwaDp5AqiqHyVZ1DAeYNlCse8C/oAuMZheRH6rhmG9AjgmyXQH2p/TVYU00zeSeR2wQ1W9LMl9k+xSVV9oGNZFwKMYSeoYRmdOTZgjUGvBjHk0C+i6Eh1bDRdf7IeZDwX+iG69iYXADS2/sJPsQfdHf7rD1VXAQS3P5CQ5mu49OoHbl4C9r1E8366qhye5jtvXzDf/g5vknXSfo+Zt6H2fViumvekOxAGeB3xvtCyslSR/wO3bYDebz5bk+8B96Lrc3cLyz1PLuSoAJHkSI13cqurExvEcDuxOd4A5XQ5a1XbR08P7WD7Rb/pzuqYbzWICSPIT4CnVoHvqyiTZEqBFc5s5YvkU3cj9i6pqtz6hOq1xE4mzZzbbmWub1n8mUGvBjDKiJcClVfWLVvEAJDkTeC7dpNC96NYU2rmq3tQyLoB+wjFVde0AYnnrHJur9aTxIcqA2tAn2aEatuSfz5Dep2l9CdgeVTXVX19I10mqWWKQ5Kl0jTbuRteA4J7AD1uWpWUFy0AM9bPWUpLvV9WureMY1TcBeSXLO2B+C/iParywbpJTq+phLWOYaUhNnUZiOrOq9prRhe+8FmW9Sf4Q2J4uGX8+yxvxbAV8uAbW/VVrnyV8a8FoGVGSuwLN5jqMqqqfJFlY3VoTRyQ5B2iWQCV53Yzr0E/YrqpzmwQF36+q40Y3pGuvPAhDOjtfw1pQ8DN082ZIcnxVPbNxPMsM7H0adUe6UV/oRoFb+yfgocBXq+pBSR5NN2LQ0qDOMM4xwrrsJtqXgH0nya5V9f2GMdxOnyi9D3hfujXG7t4yeepL96BruPEp4LPcflS6ZbnjkJo6Tbu1n9833bBhJ9o1c/kT4CDg7nSfqWnXAc1H7jV5JlBrUF8m9066g5J/ouvsdldgQZIXVVWTlcZ7N/Yddc5N8m66Vetb1+3u1f9Mz73YHzgfeEWS46rq3Q1iehPdKN3Ktk3UHGfndwB+AEz87HySP6+qT8xMgKc1KnccbcHdsrvdMgN9n6b9C3BOPzoWurPOzUqMe7dV1W+TLEiyoKq+nmRii46vwBfpDt5Cd+LiXnRzHpqMilXVHVo875iOpkuifsVAyh2TfAN4Kt2xzlnAr5OcVlWHNArpKSOXb6Rb8Hta0ZX5trLTjBNP/5ik1YnMaf8AfJmue+IxwMPo5vtNXHVrhx2V5JlVdXyLGDQsJlBr1gfpzkRsDXyNrtXsd5PcD/gk3RdBKy+kS5j+iq4j2D3o1jdp6e7AntO11n353BfpDubOAiaWQPXzCf4U2D7Jv43ctBVdGWZrQzo7v0X/71wHc63O2NcKLrc03/vUVFV9sj+4nF5y4W+q6lcNQwK4up9/8U26yey/ZmQeYgs1Y3HMvgPXXzYKZ+g+Rvd35gLat8SftnVVXZvk/9B1WH1rX77aRFU1Ofgf06CaOgFU1Vf6TooPpUvIX1NVVzaO6fgkT6Y7iTJaDWKZ/wbGBGrN2qiqvgKQ5G1V9V2AqvphGq9RWVWXJtmmv/yPTYNZ7g+4/XD8bXQrn9+UZNLD9JcBZ9KdrTxrZPt1dAlna4M5O19VH+kvfrWqTh29rf+j28IDk1xL90d2s/4yNCxtGnmfPlgNW5bPYwFwJd3fgZ2T7Fzt1scBeBrdAdshwAvoTkQN6qCkqs5O0mxh34H7TfUtsAdko76b47OBv20dzLQkR9ElA6MLIb+3cXOLv6AbYRlt6nRgw3hIcnJ1bdS/OMe2VjF9GNgceDRwGN26VGe0ikftmECtWaNn3WaeuWlyVjxd5vZWupGnBf2mJXTrPbQ+ODkGOD3J5/rrTwH+M8kWwETr6PvOf+cl+Qxdd8KlsGxy/SaTjGUFBnd2nq6r48zOQ3NtW+uqauGkn3MVfLcvhTkC+FINoHNPkncBz2FGxzS6z1eLeBYCX+jni00xgJbcMGue5gK6z/ZljcIZunOS/CddSfZQ5vW8DTgR+HZVfS/JvYEfN4xn2u7TyRMsWwj5QS0D6ucdP3C6qRPd35fn0pXVT1SSTemSlLv2yeVow4btJx3PDPtW1e5Jzq+qf0zyXmBQy1RoMkyg1qz5zoJvuuLd1qpD6OqG966qnwL0f0Q+lOSQqnp/o7ioqn9K8mVg337TK6rqzP5yq8VsvwI8Dphu4bpZv23fFe6xFiW5Z98oYjBn55PsQ/d+bDPjAHMrunbdur2d6T5TLwH+LcmxwJFV9aOGMT0d2KV1N7Jp1a3BNpVk65Zdv+YwWn65hO5MuPMf5rYZXeI0mHk9fUOg40auX0L70nXo5kXfqap+B9A3uGhyPNYnTK+kS0w+B3y1v/56uuTpmBXvvda8HHgt3ZzfmRUhH2wQz6ib+39vTHI3uiZh2zWMR42YQK1BAz0L/kLg8aN1w1V1SZI/p0sMmiVQfSzfS3IpfYI5kjC0suno+hdVdX26tSda+SzdPLEbRrrLtT47vzGwJd33x+gB5rV05Qwa0Y84nQSc1M9d+wTwl0nOA95YVd9pENYlwCLadbSay/XABUlO4vZrsL26VUDT5c4Z0No4Q9SPIP62qv5v61gAkryhqt6d5FDmqP5o+ZnqvZeu4cZ0cvcs4B2NYvk48DvgO8DL6EodA/xZw264pwHHAgdU1aFJDqRLfH8G/GeLgJK8to/rhCR3pJujfTbd5+uwFjGpLROo9d+iuSZdVtVv0nhF9jk6y90T+CGNOlz1bkiyZ/WLnCZ5MG0n0g6uu1zfpv+UJEe6Hs7KJbkLXcOPFwJXAK+iW6h5D7qz4/eaYCzTB5Q30nXkPJnbl1u1PLD8b5aPVkwf9DadPJpkN7oDzDv3168EDqyqC1vGNTT9COKQ1jWaXqD2zHnv1UhVHZ1ubcbpteCe0bD9+72nm6UkOYyuQ+89q+rm+Xdbqz4CPK5Pnh5J1zX0VXTfmYtpc6Lu7sAHgD8CHg+cSpdwnjbQOa5ay0yg1n+3ruZtkzCkznLTXgscl+QyuoO3P6SbK9LKELvLTdskyWJgR0a+S6rhArED9R26g/Cn1+0X1D6zn5A8SdMHlGfRJXGjn6kmyUqSp9Gtz/Pv/fUzgG362P6mRUwjFgOvq6qvAyTZr9/WpKR34M5NcgLdSYHREcSJl/BV1ef7f4+C4Y0g9vNmPlZVrcvRoGveBCxLhH/ROHkCWFhV02vUPQdY3LcOP75Va/Xp0dV0y8HsRfcdcBDwkSRX18AWkdbaZwK1/puelzVTy3lZ0wbTWW5aX1J4P2CXftPFVXXbfPusZYPrLjfiOODDdOULSxvGMXS7rKhxRFW9a8KxXANsP7Bk5Q10k9WnbQw8mK5M9AjarsG2xXTyBFBV3+ib3Gi2Tenmg4yeQGk6B2rGCGKS/AZ4UVVd1Cqm3g+AjybZiO4z/smGc/8eOOPvymYjf3Na/Y1ZmGSjqloCPBY4eOS21setm9HN9926/7mMrnW/NjCtP4haywY6L2va4DrL9fOdXgfsUFUvS3LfJLtU1RdaxDPw39+SqvpQ6yCGKsnn6Ud45lrGoKqeOumYgL9meMnKxlX185Hr3+7PPl81gGTlkiR/R3cQDt0I+SUN4xmsGuYaR3ONIH6UxiOIVXUYcFiSXegWhj0/yanAR0cT9gnFMsS/MZ+kKxO/kq6E/lsASe5DdxJo4vpqi/vTNbI4nW4+1PumG4Fow2MCpZYG01luxBF05U379Nd/SXdQ2SSBGqK+YxTA55P8JfAZbj+P5qo5d9zw/GvrAOYwxGTlTqNXquqvRq5uM+FYZnoJ8I90oyhFdyDXcq2ewUpyd7plDKbnQn2Lbq2jX6x4r7VusCOIfeON+/U/VwLnAa9L8vKqeu68O6/nquod/fzM7YCvjIzgL6CbC9XCPemWNPkx3XHBL4Cr591D67UMYEkSbYD6Px5f7dd9GYwkZ1bVXknOqaoH9dvOq6oHto5tKJL8lO5gcq45M1VVg2h20doAOkrOkuQnVXWfFdz2P1W1U4OYjgG+UVUfnbH95cB+VfW8ScfUP/8gv6OGqu+e+J/cfrTuBVX1+IYxfYauU9poTA+uqj9rFRNAkvcD+wNfo5sLdcbIbRdX1S4r3FnNpCsluD/dCOa+wG50Cw5/p6re2jI2TZ4jUGpiwOu+3JpkM5aXXu3EsFo9N1dVE+sat477LP2iwiMt6Fs7PcnLVpCsnLGCfda2Q4DPJnk+3cEudGWFm9CtV9XEgL+jhmqbqjpi5PqRfevnloY6gng+8Jaqmqtk/SGTDkbj6UfCLkxyNV0p4TV0ifBDABOoDYwJlFoa3LovdF+CXwbu0Z8Zfxhdpx3NkOQZc2y+Brigqn496XgGaHAt6BlgstJ/VvZN8hiWL2Hwxar6Wot4Zhjid9RQ/bZfX/CT/fXn0TWVmLgkmwKvAO5DN8H/9Y2bAc20bBHt/j3bE/h/VXWpyfowJXk1y0eebqObA3UacDg2kdggWcKnZvrF8WaZbj3bSr9uz0PpDoC/O9c6WoIkX6SbKzY9x2A/uvlj9wLeVlUfX8GuG4QkZ1fVnjMvD8GMZOWigSQrgzPjO2rZ2lStv6OGKMkOdHOg9qF7r04DXt2ijDXJp+gOcr8FPAn4WVW1Hg1bJsn5wAOB3YEj6TqZPruqHtUyLq1YkvfRrf10WlVd3joetWcCpaaSbAPdwr6N45j34HZ6YV0tl+REupbAV/TXtwWOpjvz/M2q2q1lfK0lWUo3ahG61rc3Tt9E+xb0msfK1qaqqpat1bUSSS4YWRx2I+CMgZ3AOLuq9kzy98Avq+pjQzvJIml+lvBp4vqJmG8F/oquq06SLAEOrapWXfjeO89txe3XNlHnHtPJU+/X/barkgypXKaJgbYH1niGvDbVoPRJwIpUVf3TxIJZbnRx2CVzLSPQ2HVJ3kTX1OKRSRYAixrHJGkVmECphUPo5hbtXVU/BUhyb+BDSQ6pqvdPOiA7ba2WbyT5AssPJp/Zb9sC27tq3TbEdu9DNVcjhC2AlwJ3AVokUENcHHbUc4DnAy+tql8luSfwnsYxSVoFlvBp4pKcAzx+5tyivpzvK9Ptwycc0xuq6t395WeNlugk+eeqevOkYxq6fiTxmSxf9+VU4PjyS0XruCG2e18XJLnYu+tkAAAFTklEQVQD8Bq65OlY4L02lFlujuYWH6uqJW2jkrQ6FrQOQBukRXM1ZujnQbUqYxgt13nTjNueOMlA1hXV+XRVHdL/fNrkSeuJ05O8bObGxu3eByvJnZO8na4990bAnlX1NyZPsxwF7EWXPD2J+UvHJQ2YJXxq4dbVvG1tygouz3V9g5bk21X18CTXsbwzGQynPEb6fQ2u3ftQJXkP8AxgMfCAqrq+cUhDtutIc4uPYTIurbMs4dPEjXQnm3UTsGlVTXwUar6W03ZHur0kO1TVpa3jkNY2272vXJIpusXGl+AJlXn5t0Vaf5hASay05XSTpG6oZiSbx1fVM1vHJElDN+Pk4ejfGpNNaR1jCZ+ELadX0WhJ472bRSFJ6xD/zkjrD5tISFpVtYLLkiRJ6z1L+CStkpWUO1qGIkmS1msmUJIkSZI0Jkv4JEmSJGlMJlCSJEmSNCYTKEmSJEkakwmUJGlsSfZL8oW1+Ph7JPnTtfX4kiT9vkygJElrTZJVXW9wD8AESpI0WCZQkrQOSbJFki8mOS/JhUmek+TBSU5JclaSE5Ns19/3Pkm+2t/37CQ7pfOeft8Lkjynv+9+Sb6R5NNJfpjkmCTpb3tiv+1s4BkjsTwkyXeSnJPktCS79NsPSnJCkq8BJyc5OsnTR/Y7JsnT5nhtGwNvA56T5Nz+tf04yTb97QuS/CTJNkmOTPLhJGcm+VGS/fv7LOxf3/eSnJ/k5WvrdyFJ2jCt6plBSVJbTwQuq6onAyTZGvgS8LSq+k2fEL0DeAlwDPDOqvpMkk3pTpo9g26U54HAXYHvJflm/9gPAu4PXAacCjwsyZnAR4HHAD8BPjUSyw+BR1TVkiSPA/4ZeGZ/257A7lV1VZJHAYcAn+3j3Rc4cOYLq6pbk/w9sFdV/VX/+u4HvAD4APA44Lz+dQLsCDwE2An4epL7AC8CrqmqvZNsApya5CtV9dNVf6slSZrNBEqS1i0XAO9N8i7gC8DvgN2Ak/qkYiFweZI7ANtX1WcAqupmgCQPBz5ZVUuBK5KcAuwNXAucUVW/6O93Ll2Ccj3w06r6cb/9E8DBfSxbA0cluS9QwKKROE+qqqv65z4lyX/0I0nPBI6vqiVjvt7Dgc/RJVAvAY4Yue3YqpoCfpzkEuB+wBOA3ZMcMBLjfQETKEnSGmECJUnrkKr6UZI96eYJvR34GnBRVe0zer8+gVpVt4xcXsrK/0b8E/D1qvqzJDsC3xi57YYZ9z0a+HPgucCLxw2oqn6e5Iokj6EbbXrB6M0z7w4EeFVVnTjuc0iStCqcAyVJ65AkdwNurKpPAO8B/hjYJsk+/e2Lkty/qq4DfjE99yjJJkk2B75FN8doYT8i9EjgjHme8ofAjkl26q8/b+S2rYFf9pcPWknoRwKvBaiq789zv+uAmcnfYcAngOP6kbNpz+rnRe0E3Bu4GDgR+IskiwCS7Jxki5XEJknS2EygJGnd8gDgjL7E7q3A3wMHAO9Kch5wLt0cI4AXAq9Ocj5wGvCHwGeA84Hz6Eav3lBVv1rRk/WlfwcDX+ybSPx65OZ3A/+S5BxWMlpVVVcAP+D2JXhz+Tqw63QTiX7bCcCWc+z7v3TJ35eAV/SxHgZ8Hzg7yYXAR1YWmyRJqyJVMysgJElas/rRrwuAPavqmlXcdy/g/VX1iJFtRwJfqKpPr9FAJUlaCUegJElrVd+h7wfAoauRPL0ROB5409qITZKkVeUIlCRp4pL8CfCuGZt/WlV/1iIeSZLGZQIlSZIkSWOyhE+SJEmSxmQCJUmSJEljMoGSJEmSpDGZQEmSJEnSmP5/ltMFOz3PksYAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "pivot_table = pkmn[[\"primary_type\", \"secondary_type\"]].value_counts().unstack().fillna(0)\n", "long_form = pkmn[[\"primary_type\", \"secondary_type\"]].value_counts()\n", "\n", "ax = sns.heatmap(pivot_table)\n", "ax.figure.set_size_inches(15, 15)" ] }, { "cell_type": "code", "execution_count": 80, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "RTUdYUv3LBBt", "outputId": "1098fdc6-500c-4c9a-ade1-57b380a0ef84" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(935, 6229) (935,)\n" ] }, { "data": { "text/plain": [ "['000',\n", " '01',\n", " '02',\n", " '03',\n", " '04',\n", " '05',\n", " '10',\n", " '100',\n", " '1000',\n", " '100x',\n", " '101',\n", " '108',\n", " '11',\n", " '12',\n", " '120',\n", " '13',\n", " '14',\n", " '148',\n", " '15',\n", " '150',\n", " '16',\n", " '17',\n", " '18',\n", " '180',\n", " '19',\n", " '1950s',\n", " '1970s',\n", " '1997',\n", " '1px',\n", " '20',\n", " '200',\n", " '2000',\n", " '2003',\n", " '2005',\n", " '2007',\n", " '2008',\n", " '2009',\n", " '2013',\n", " '2014',\n", " '2015',\n", " '2016',\n", " '2018',\n", " '2019',\n", " '2020',\n", " '2021',\n", " '20th',\n", " '21',\n", " '22',\n", " '23',\n", " '23rd',\n", " '24',\n", " '242',\n", " '25',\n", " '26',\n", " '27',\n", " '28',\n", " '29',\n", " '294',\n", " '296',\n", " '2nd',\n", " '30',\n", " '300',\n", " '31',\n", " '310',\n", " '32',\n", " '33',\n", " '34',\n", " '35',\n", " '36',\n", " '360',\n", " '36th',\n", " '37',\n", " '370',\n", " '38',\n", " '39',\n", " '390',\n", " '3ds',\n", " '3rd',\n", " '40',\n", " '400',\n", " '41',\n", " '42',\n", " '43',\n", " '44',\n", " '440',\n", " '45',\n", " '46',\n", " '47',\n", " '48',\n", " '49',\n", " '4ever',\n", " '50',\n", " '500',\n", " '5000',\n", " '50th',\n", " '51',\n", " '52',\n", " '53',\n", " '54',\n", " '55',\n", " '56',\n", " '57',\n", " '58',\n", " '59',\n", " '60',\n", " '600',\n", " '61',\n", " '610',\n", " '62',\n", " '63',\n", " '630',\n", " '64',\n", " '65',\n", " '650',\n", " '66',\n", " '67',\n", " '68',\n", " '69',\n", " '69th',\n", " '70',\n", " '71',\n", " '719',\n", " '72',\n", " '721',\n", " '73',\n", " '74',\n", " '75',\n", " '76',\n", " '767',\n", " '77',\n", " '78',\n", " '79',\n", " '80',\n", " '82',\n", " '90',\n", " '900',\n", " '95',\n", " '967',\n", " 'abandoned',\n", " 'abbreviation',\n", " 'abilities',\n", " 'ability',\n", " 'able',\n", " 'abnormalities',\n", " 'abominable',\n", " 'abra',\n", " 'absence',\n", " 'absolutely',\n", " 'absorb',\n", " 'absorbed',\n", " 'absorbing',\n", " 'absorbs',\n", " 'absorption',\n", " 'abundance',\n", " 'abundantly',\n", " 'acanthaster',\n", " 'accelerate',\n", " 'accelgor',\n", " 'accept',\n", " 'accepted',\n", " 'accompanies',\n", " 'according',\n", " 'account',\n", " 'accurately',\n", " 'accustomed',\n", " 'ace',\n", " 'acerola',\n", " 'achieve',\n", " 'acid',\n", " 'acknowledge',\n", " 'acknowledged',\n", " 'acquire',\n", " 'acquires',\n", " 'acrobatic',\n", " 'act',\n", " 'acting',\n", " 'actions',\n", " 'activate',\n", " 'activated',\n", " 'active',\n", " 'actively',\n", " 'actor',\n", " 'acts',\n", " 'actual',\n", " 'actually',\n", " 'added',\n", " 'adding',\n", " 'addition',\n", " 'additional',\n", " 'additionally',\n", " 'adept',\n", " 'adhesive',\n", " 'adopted',\n", " 'adorable',\n", " 'adorn',\n", " 'adorned',\n", " 'adornment',\n", " 'adult',\n", " 'advance',\n", " 'advanced',\n", " 'advantage',\n", " 'adventure',\n", " 'aegislash',\n", " 'aether',\n", " 'affect',\n", " 'affecting',\n", " 'affection',\n", " 'affects',\n", " 'affinity',\n", " 'afford',\n", " 'aforementioned',\n", " 'afro',\n", " 'afterlife',\n", " 'afterward',\n", " 'agent',\n", " 'ages',\n", " 'aggressive',\n", " 'aggressively',\n", " 'agile',\n", " 'agility',\n", " 'agitated',\n", " 'agitates',\n", " 'ago',\n", " 'agriculture',\n", " 'aipom',\n", " 'air',\n", " 'airborne',\n", " 'aircraft',\n", " 'akala',\n", " 'akin',\n", " 'alakazam',\n", " 'albeit',\n", " 'alchemic',\n", " 'alcremie',\n", " 'alien',\n", " 'aliens',\n", " 'alike',\n", " 'alive',\n", " 'allies',\n", " 'alligator',\n", " 'alligators',\n", " 'allow',\n", " 'allowed',\n", " 'allowing',\n", " 'allows',\n", " 'alloy',\n", " 'alludes',\n", " 'alola',\n", " 'alolan',\n", " 'alomomola',\n", " 'alongside',\n", " 'alpha',\n", " 'alphabet',\n", " 'alright',\n", " 'altaria',\n", " 'altered',\n", " 'altering',\n", " 'alternate',\n", " 'alternative',\n", " 'alternatively',\n", " 'altitudes',\n", " 'amargasaurus',\n", " 'amazing',\n", " 'amber',\n", " 'america',\n", " 'american',\n", " 'ammonites',\n", " 'amoeba',\n", " 'amped',\n", " 'amperage',\n", " 'ampharos',\n", " 'amphibian',\n", " 'amusing',\n", " 'anaconda',\n", " 'ancestor',\n", " 'anchor',\n", " 'anchors',\n", " 'ancient',\n", " 'andrew',\n", " 'angel',\n", " 'anger',\n", " 'angered',\n", " 'anglerfish',\n", " 'angles',\n", " 'angry',\n", " 'animal',\n", " 'anime',\n", " 'animon',\n", " 'ankylosaurus',\n", " 'announcement',\n", " 'annoyance',\n", " 'anomalocaris',\n", " 'anorith',\n", " 'answer',\n", " 'answers',\n", " 'antagonist',\n", " 'antagonists',\n", " 'anteater',\n", " 'antenna',\n", " 'antennae',\n", " 'antimatter',\n", " 'antique',\n", " 'antlers',\n", " 'antlion',\n", " 'anymore',\n", " 'aoki',\n", " 'apart',\n", " 'apocalypse',\n", " 'apparent',\n", " 'apparently',\n", " 'appealing',\n", " 'appear',\n", " 'appearance',\n", " 'appearances',\n", " 'appeared',\n", " 'appearing',\n", " 'appears',\n", " 'appendages',\n", " 'apple',\n", " 'apples',\n", " 'appletun',\n", " 'appliances',\n", " 'applin',\n", " 'appreciation',\n", " 'approaches',\n", " 'appropriation',\n", " 'approximately',\n", " 'april',\n", " 'aqua',\n", " 'aquatic',\n", " 'aramis',\n", " 'araquanid',\n", " 'arbok',\n", " 'arcanine',\n", " 'arceus',\n", " 'arch',\n", " 'archaeopteryx',\n", " 'archen',\n", " 'archeops',\n", " 'archie',\n", " 'arctic',\n", " 'arctovish',\n", " 'arctozolts',\n", " 'area',\n", " 'areas',\n", " 'aren',\n", " 'aria',\n", " 'ariados',\n", " 'arid',\n", " 'ariga',\n", " 'arm',\n", " 'armed',\n", " 'armless',\n", " 'armor',\n", " 'armored',\n", " 'armour',\n", " 'arms',\n", " 'aroma',\n", " 'aromatisse',\n", " 'aron',\n", " 'arranges',\n", " 'arrive',\n", " 'arrives',\n", " 'arrokuda',\n", " 'arrow',\n", " 'arrows',\n", " 'art',\n", " 'artagnan',\n", " 'artillery',\n", " 'artist',\n", " 'arts',\n", " 'artwork',\n", " 'ascend',\n", " 'ascended',\n", " 'ash',\n", " 'asia',\n", " 'asian',\n", " 'aside',\n", " 'asking',\n", " 'asleep',\n", " 'aspects',\n", " 'ass',\n", " 'assault',\n", " 'assembly',\n", " 'assist',\n", " 'assists',\n", " 'associated',\n", " 'association',\n", " 'assume',\n", " 'assuming',\n", " 'astral',\n", " 'ate',\n", " 'athos',\n", " 'atk',\n", " 'atmosphere',\n", " 'atop',\n", " 'atrophied',\n", " 'atsuko',\n", " 'attach',\n", " 'attached',\n", " 'attaches',\n", " 'attack',\n", " 'attacked',\n", " 'attackers',\n", " 'attacking',\n", " 'attacks',\n", " 'attempt',\n", " 'attempted',\n", " 'attempts',\n", " 'attention',\n", " 'attitude',\n", " 'attract',\n", " 'attracted',\n", " 'attractive',\n", " 'attracts',\n", " 'audience',\n", " 'audiences',\n", " 'audino',\n", " 'augite',\n", " 'augurite',\n", " 'august',\n", " 'aura',\n", " 'auras',\n", " 'aurorus',\n", " 'australia',\n", " 'authentic',\n", " 'authenticity',\n", " 'automatically',\n", " 'available',\n", " 'avoid',\n", " 'avoiding',\n", " 'avoids',\n", " 'awaits',\n", " 'awake',\n", " 'away',\n", " 'awe',\n", " 'awesome',\n", " 'awful',\n", " 'awhile',\n", " 'awkward',\n", " 'awoken',\n", " 'az',\n", " 'azelf',\n", " 'azumarill',\n", " 'azure',\n", " 'azurill',\n", " 'babies',\n", " 'baboon',\n", " 'baby',\n", " 'backfish',\n", " 'backstory',\n", " 'backwards',\n", " 'bacteria',\n", " 'bad',\n", " 'bag',\n", " 'bagon',\n", " 'bags',\n", " 'baile',\n", " 'baku',\n", " 'balance',\n", " 'bald',\n", " 'ball',\n", " 'balloon',\n", " 'balloons',\n", " 'balls',\n", " 'bamboo',\n", " 'band',\n", " 'bandai',\n", " 'banette',\n", " 'bangs',\n", " 'banished',\n", " 'banned',\n", " 'bar',\n", " 'baragon',\n", " 'barb',\n", " 'barbaracle',\n", " 'barbed',\n", " 'barboach',\n", " 'bare',\n", " 'barely',\n", " 'bares',\n", " 'bark',\n", " 'barks',\n", " 'barn',\n", " 'barnacle',\n", " 'barnacles',\n", " 'barracuda',\n", " 'barrage',\n", " 'barraskewda',\n", " 'barreled',\n", " 'barriers',\n", " 'basculegion',\n", " 'basculin',\n", " 'base',\n", " 'based',\n", " 'bash',\n", " 'bashir',\n", " 'basic',\n", " 'basis',\n", " 'basking',\n", " 'basks',\n", " 'bass',\n", " 'bat',\n", " 'bathed',\n", " 'bathes',\n", " 'battery',\n", " 'battle',\n", " 'battled',\n", " 'battles',\n", " 'battling',\n", " 'bay',\n", " 'bayleef',\n", " 'beach',\n", " 'beaches',\n", " 'beady',\n", " 'beak',\n", " 'beaks',\n", " 'beam',\n", " 'beams',\n", " 'bean',\n", " 'beans',\n", " 'bear',\n", " 'beard',\n", " 'bearing',\n", " 'bears',\n", " 'beast',\n", " 'beasts',\n", " 'beat',\n", " 'beaten',\n", " 'beats',\n", " 'beautifly',\n", " 'beautiful',\n", " 'beauty',\n", " 'beaver',\n", " 'becalms',\n", " 'bee',\n", " 'beedrill',\n", " 'beefy',\n", " 'beehive',\n", " 'bees',\n", " 'beetle',\n", " 'befriends',\n", " 'befuddle',\n", " 'began',\n", " 'begging',\n", " 'begin',\n", " 'begins',\n", " 'behavior',\n", " 'behemoth',\n", " 'beings',\n", " 'belch',\n", " 'beldum',\n", " 'beldums',\n", " 'belief',\n", " 'believe',\n", " 'believed',\n", " 'bell',\n", " 'belligerently',\n", " 'bellossom',\n", " 'bells',\n", " 'bellsprout',\n", " 'belly',\n", " 'belonged',\n", " 'belonging',\n", " 'belongs',\n", " 'belt',\n", " 'belts',\n", " 'bem',\n", " 'ben',\n", " 'beneath',\n", " 'benefits',\n", " 'berries',\n", " 'berry',\n", " 'berserk',\n", " 'best',\n", " 'bestowing',\n", " 'beta',\n", " 'betobebi',\n", " 'betray',\n", " 'better',\n", " 'bewear',\n", " 'bewitching',\n", " 'bibarel',\n", " 'bidoof',\n", " 'big',\n", " 'bigger',\n", " 'billions',\n", " 'binacle',\n", " 'binnacle',\n", " 'biped',\n", " 'bipedal',\n", " 'bird',\n", " 'birds',\n", " 'birthed',\n", " 'bisharp',\n", " 'bison',\n", " 'bit',\n", " 'bite',\n", " 'bites',\n", " 'biting',\n", " 'bits',\n", " 'bitterly',\n", " 'bivalve',\n", " 'blacephalon',\n", " 'black',\n", " 'blackened',\n", " 'blackface',\n", " 'blade',\n", " 'blades',\n", " 'blaine',\n", " 'blast',\n", " 'blaster',\n", " 'blasting',\n", " 'blastoise',\n", " 'blasts',\n", " 'blaze',\n", " 'blaziken',\n", " 'bleaching',\n", " 'blend',\n", " 'blessings',\n", " 'blind',\n", " 'blinding',\n", " 'blipbug',\n", " 'blissey',\n", " 'blizzard',\n", " 'blizzards',\n", " 'blob',\n", " 'block',\n", " 'blocking',\n", " 'blocks',\n", " 'blocky',\n", " 'blond',\n", " 'blood',\n", " 'bloom',\n", " 'bloomed',\n", " 'blooms',\n", " 'blossom',\n", " 'blossoms',\n", " 'blow',\n", " 'blowing',\n", " 'blown',\n", " 'blows',\n", " 'blubber',\n", " 'blue',\n", " 'blueish',\n", " 'boats',\n", " 'bodied',\n", " 'bodies',\n", " 'bodily',\n", " 'body',\n", " 'boeing',\n", " 'bogos',\n", " 'boil',\n", " 'bolts',\n", " 'boltund',\n", " 'bomb',\n", " 'bombs',\n", " 'bond',\n", " 'bonded',\n", " 'bone',\n", " 'bonemurang',\n", " 'bones',\n", " 'bonnets',\n", " 'bonsly',\n", " 'bonus',\n", " 'boomerang',\n", " 'boost',\n", " 'boosting',\n", " 'boosts',\n", " 'border',\n", " 'bordering',\n", " 'born',\n", " 'borrows',\n", " 'boss',\n", " 'bother',\n", " 'bothered',\n", " 'bottle',\n", " 'bottles',\n", " 'bouffalant',\n", " 'boulder',\n", " 'boulders',\n", " 'bounce',\n", " 'bounces',\n", " 'bouncing',\n", " 'bouncy',\n", " 'bounding',\n", " 'bounsweet',\n", " 'bountiful',\n", " 'bow',\n", " 'bowie',\n", " 'bowl',\n", " 'bows',\n", " 'boxer',\n", " 'boxers',\n", " 'boxing',\n", " 'boy',\n", " 'bracelets',\n", " 'braids',\n", " 'brain',\n", " 'brains',\n", " 'brainwaves',\n", " 'braise',\n", " 'braixen',\n", " 'bramble',\n", " 'branch',\n", " 'branches',\n", " 'branching',\n", " 'brass',\n", " 'brave',\n", " 'bravery',\n", " 'brawl',\n", " 'brawly',\n", " 'break',\n", " 'breaking',\n", " 'breaks',\n", " 'breath',\n", " 'breathe',\n", " 'breathing',\n", " 'breeding',\n", " 'bridge',\n", " 'brief',\n", " 'brigadier',\n", " 'bright',\n", " 'brighter',\n", " 'brightly',\n", " 'brightness',\n", " 'brilliant',\n", " 'briney',\n", " 'bring',\n", " 'bringer',\n", " 'brings',\n", " 'brionne',\n", " 'british',\n", " 'brittle',\n", " 'broad',\n", " 'brock',\n", " 'broke',\n", " 'broken',\n", " 'broom',\n", " 'bros',\n", " 'brought',\n", " 'brown',\n", " 'browser',\n", " 'bruce',\n", " 'brush',\n", " 'brutal',\n", " 'bruxish',\n", " 'bubble',\n", " 'bubbles',\n", " 'buck',\n", " 'bucktoothed',\n", " 'bud',\n", " 'budew',\n", " 'bug',\n", " 'bugs',\n", " 'build',\n", " 'building',\n", " 'buildings',\n", " 'builds',\n", " 'built',\n", " 'bulb',\n", " 'bulbasaur',\n", " 'bulbous',\n", " 'bulgasari',\n", " 'bulge',\n", " 'bulky',\n", " 'bull',\n", " 'bullied',\n", " 'bullies',\n", " 'bully',\n", " 'bulu',\n", " 'bumps',\n", " 'bunch',\n", " 'bunnelby',\n", " 'burglars',\n", " 'buried',\n", " 'buries',\n", " 'burmy',\n", " 'burn',\n", " 'burning',\n", " 'burns',\n", " 'burnt',\n", " 'burrow',\n", " 'burrows',\n", " 'burst',\n", " 'bursting',\n", " 'bushes',\n", " 'bushy',\n", " 'busts',\n", " 'butlers',\n", " 'butt',\n", " 'butterfly',\n", " 'butterflyfish',\n", " 'buzzwole',\n", " 'bōzu',\n", " 'cackles',\n", " 'cacnea',\n", " 'cactus',\n", " 'cafe',\n", " 'cafes',\n", " 'cage',\n", " 'cake',\n", " 'calculated',\n", " 'called',\n", " 'calling',\n", " 'calls',\n", " 'calm',\n", " 'calorie',\n", " 'calyrex',\n", " 'came',\n", " 'camels',\n", " 'cameo',\n", " 'camerupt',\n", " 'camouflage',\n", " 'camouflaged',\n", " 'camouflaging',\n", " 'campers',\n", " 'canceled',\n", " 'cancelled',\n", " 'candies',\n", " 'candy',\n", " 'cane',\n", " 'cannon',\n", " 'cannonball',\n", " 'cannons',\n", " 'canonically',\n", " 'cantankerous',\n", " 'canyon',\n", " 'canyons',\n", " 'cap',\n", " 'capabilities',\n", " 'capable',\n", " 'caped',\n", " 'capoeira',\n", " 'caps',\n", " 'capture',\n", " 'captured',\n", " 'carapace',\n", " 'caravaggio',\n", " 'carbink',\n", " 'carcolh',\n", " 'card',\n", " 'cards',\n", " 'care',\n", " 'carefree',\n", " 'careful',\n", " 'carefully',\n", " 'carelessly',\n", " 'cares',\n", " 'caring',\n", " 'carkol',\n", " 'carnotaur',\n", " 'carp',\n", " 'carracosta',\n", " 'carried',\n", " 'carriers',\n", " 'carries',\n", " 'carrot',\n", " 'carrots',\n", " 'carry',\n", " 'carrying',\n", " 'cars',\n", " 'cartoonist',\n", " 'carvanha',\n", " 'cascoon',\n", " 'case',\n", " 'cast',\n", " 'caste',\n", " 'castform',\n", " 'castle',\n", " 'cat',\n", " 'catch',\n", " 'catcher',\n", " 'catches',\n", " 'category',\n", " 'catfish',\n", " 'caught',\n", " 'cause',\n", " 'caused',\n", " 'causes',\n", " 'causing',\n", " 'cautionary',\n", " 'cave',\n", " 'cavernous',\n", " 'caves',\n", " 'ceilings',\n", " 'celebi',\n", " 'celebration',\n", " 'celesteela',\n", " 'cell',\n", " 'cells',\n", " 'celsius',\n", " 'cemetery',\n", " 'center',\n", " 'centers',\n", " 'centipede',\n", " 'centiskorch',\n", " 'central',\n", " 'centres',\n", " 'centrifugal',\n", " 'ceo',\n", " 'ceremonies',\n", " 'certain',\n", " 'chains',\n", " 'challenge',\n", " 'chameleon',\n", " 'champion',\n", " 'championship',\n", " 'championships',\n", " 'chan',\n", " 'chance',\n", " 'chandelure',\n", " 'change',\n", " 'changed',\n", " 'changes',\n", " 'changing',\n", " 'chansey',\n", " 'chaos',\n", " 'chaplin',\n", " 'char',\n", " 'character',\n", " 'characterized',\n", " 'characters',\n", " 'charge',\n", " 'charged',\n", " 'charges',\n", " 'charging',\n", " 'charizard',\n", " 'charjabug',\n", " 'charlie',\n", " 'charm',\n", " 'charmander',\n", " 'charmeleon',\n", " 'chase',\n", " 'chases',\n", " 'chatter',\n", " 'check',\n", " 'cheek',\n", " 'cheeks',\n", " 'cheer',\n", " 'cheerful',\n", " 'chefs',\n", " 'chemical',\n", " 'chemically',\n", " 'cherish',\n", " 'chesnaught',\n", " 'chespin',\n", " 'chess',\n", " 'chest',\n", " 'chestnut',\n", " 'chewable',\n", " 'chewing',\n", " 'chewtle',\n", " 'chick',\n", " 'chickadee',\n", " 'chicken',\n", " 'chicks',\n", " 'chief',\n", " 'chikorita',\n", " 'child',\n", " 'children',\n", " 'chilling',\n", " 'chills',\n", " 'chimchar',\n", " 'chime',\n", " 'chimera',\n", " 'chimes',\n", " 'chinchou',\n", " 'chinese',\n", " 'chipped',\n", " 'chipping',\n", " 'choice',\n", " 'chomps',\n", " 'choose',\n", " 'chooses',\n", " 'chop',\n", " 'chose',\n", " 'chosen',\n", " 'church',\n", " 'chōchin',\n", " 'cicada',\n", " 'cinccino',\n", " 'cinderace',\n", " 'cinders',\n", " 'circle',\n", " 'circles',\n", " 'circulates',\n", " 'circulating',\n", " 'circumstances',\n", " 'citation',\n", " 'cited',\n", " 'cites',\n", " 'cities',\n", " 'city',\n", " 'civilization',\n", " 'civilizations',\n", " 'claim',\n", " 'claimed',\n", " 'claiming',\n", " 'claims',\n", " ...]" ] }, "execution_count": 80, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Create a TF-IDF vectorizer to transform the text into a matrix of features\n", "vectorizer = TfidfVectorizer(stop_words=\"english\")\n", "X = vectorizer.fit_transform(pkmn[\"Notes\"]).toarray()\n", "y = pkmn[\"primary_type\"]\n", "print(X.shape, y.shape)\n", "list(vectorizer.get_feature_names_out())" ] }, { "cell_type": "code", "execution_count": 81, "metadata": { "id": "ICefCkn6LBBv" }, "outputs": [], "source": [ "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)" ] }, { "cell_type": "code", "execution_count": 82, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "GpuzXYA0LBBw", "outputId": "2216c89a-d8f8-46e8-c1ee-442a6961aa29" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Dummy : 0.12455516014234876\n", "Nearest Neighbors : 0.3665480427046263\n", "Linear SVM : 0.12455516014234876\n", "RBF SVM : 0.17437722419928825\n", "LinearSVC : 0.47330960854092524\n", "Decision Tree : 0.16370106761565836\n", "Random Forest : 0.13167259786476868\n", "Neural Net : 0.298932384341637\n", "Gradient Boosting : 0.33451957295373663\n", "AdaBoost : 0.1494661921708185\n", "Naive Bayes : 0.3701067615658363\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/usr/local/lib/python3.7/dist-packages/sklearn/discriminant_analysis.py:878: UserWarning: Variables are collinear\n", " warnings.warn(\"Variables are collinear\")\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "QDA : 0.05693950177935943\n", "Best classifier: LinearSVC with score: 0.47330960854092524\n" ] } ], "source": [ "names = [\n", " \"Dummy\",\n", " \"Nearest Neighbors\",\n", " \"Linear SVM\",\n", " \"RBF SVM\",\n", " \"LinearSVC\",\n", " # \"Gaussian Process\",\n", " \"Decision Tree\",\n", " \"Random Forest\",\n", " \"Neural Net\",\n", " \"Gradient Boosting\",\n", " \"AdaBoost\",\n", " \"Naive Bayes\",\n", " \"QDA\",\n", "]\n", "\n", "classifiers = [\n", " DummyClassifier(),\n", " KNeighborsClassifier(3),\n", " SVC(kernel=\"linear\", C=0.025),\n", " SVC(gamma=2, C=1),\n", " LinearSVC(),\n", " # GaussianProcessClassifier(1.0 * RBF(1.0)),\n", " DecisionTreeClassifier(max_depth=5),\n", " RandomForestClassifier(max_depth=5, n_estimators=10, max_features=1),\n", " MLPClassifier(alpha=1, max_iter=1000),\n", " GradientBoostingClassifier(),\n", " AdaBoostClassifier(),\n", " GaussianNB(),\n", " QuadraticDiscriminantAnalysis(),\n", "]\n", "\n", "\n", "max_so_far = 0\n", "for name, clf in zip(names, classifiers):\n", " clf.fit(X_train, y_train)\n", " print(name, \": \", clf.score(X_test, y_test))\n", "\n", " if clf.score(X_test, y_test) > max_so_far:\n", " max_so_far = clf.score(X_test, y_test)\n", " best_clf = clf\n", " best_clf_name = name\n", "\n", "clf = best_clf\n", "print(\"Best classifier: \", best_clf_name, \" with score: \", max_so_far)" ] }, { "cell_type": "code", "execution_count": 89, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "w6v8QJ3xWLfw", "outputId": "0aae6cf5-f26b-4e7c-b93e-cd5215225d93" }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/usr/local/lib/python3.7/dist-packages/sklearn/model_selection/_validation.py:372: FitFailedWarning: \n", "20 fits failed out of a total of 80.\n", "The score on these train-test partitions for these parameters will be set to nan.\n", "If these failures are not expected, you can try to debug them by setting error_score='raise'.\n", "\n", "Below are more details about the failures:\n", "--------------------------------------------------------------------------------\n", "20 fits failed with the following error:\n", "Traceback (most recent call last):\n", " File \"/usr/local/lib/python3.7/dist-packages/sklearn/model_selection/_validation.py\", line 680, in _fit_and_score\n", " estimator.fit(X_train, y_train, **fit_params)\n", " File \"/usr/local/lib/python3.7/dist-packages/sklearn/svm/_classes.py\", line 272, in fit\n", " sample_weight=sample_weight,\n", " File \"/usr/local/lib/python3.7/dist-packages/sklearn/svm/_base.py\", line 1185, in _fit_liblinear\n", " solver_type = _get_liblinear_solver_type(multi_class, penalty, loss, dual)\n", " File \"/usr/local/lib/python3.7/dist-packages/sklearn/svm/_base.py\", line 1026, in _get_liblinear_solver_type\n", " % (error_string, penalty, loss, dual)\n", "ValueError: Unsupported set of arguments: The combination of penalty='l1' and loss='squared_hinge' are not supported when dual=True, Parameters: penalty='l1', loss='squared_hinge', dual=True\n", "\n", " warnings.warn(some_fits_failed_message, FitFailedWarning)\n", "/usr/local/lib/python3.7/dist-packages/sklearn/model_selection/_search.py:972: UserWarning: One or more of the test scores are non-finite: [ nan 0.40510863 0.41276571 0.41276571 nan 0.40971227\n", " 0.41276571 0.41276571 nan 0.40971227 0.41276571 0.41276571\n", " nan 0.41122725 0.41276571 0.41276571]\n", " category=UserWarning,\n", "/usr/local/lib/python3.7/dist-packages/sklearn/svm/_base.py:1208: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n", " ConvergenceWarning,\n" ] }, { "data": { "text/plain": [ "0.41276570757486786" ] }, "execution_count": 89, "metadata": {}, "output_type": "execute_result" } ], "source": [ "parameters = {\n", " \"penalty\": [\"l1\", \"l2\"],\n", " \"C\": [1, 10, 100, 1000],\n", " \"multi_class\": [\"ovr\", \"crammer_singer\"],\n", "}\n", "\n", "gs_clf = GridSearchCV(clf, parameters, cv=5, n_jobs=-1)\n", "gs_clf.fit(X_train, y_train)\n", "gs_clf.best_score_" ] }, { "cell_type": "code", "execution_count": 90, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "ct1IDpeghQan", "outputId": "1159ea06-a44d-4528-eb9e-4a158d71f05e" }, "outputs": [ { "data": { "text/plain": [ "{'C': 1, 'multi_class': 'crammer_singer', 'penalty': 'l1'}" ] }, "execution_count": 90, "metadata": {}, "output_type": "execute_result" } ], "source": [ "gs_clf.best_params_" ] }, { "cell_type": "code", "execution_count": 93, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 1000 }, "id": "AUubKCsvhuC9", "outputId": "36862862-bf28-4d05-f8f3-a57b21684c89" }, "outputs": [ { "data": { "text/html": [ "\n", "
\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
mean_fit_timestd_fit_timemean_score_timestd_score_timeparam_Cparam_multi_classparam_penaltyparamssplit0_test_scoresplit1_test_scoresplit2_test_scoresplit3_test_scoresplit4_test_scoremean_test_scorestd_test_scorerank_test_score
00.0225430.0045290.0000000.0000001ovrl1{'C': 1, 'multi_class': 'ovr', 'penalty': 'l1'}NaNNaNNaNNaNNaNNaNNaN13
10.0836520.0016970.0053570.0004841ovrl2{'C': 1, 'multi_class': 'ovr', 'penalty': 'l2'}0.4656490.4045800.4122140.3969470.3461540.4051090.03810012
20.1161120.0147200.0081720.0038831crammer_singerl1{'C': 1, 'multi_class': 'crammer_singer', 'pen...0.4732820.3969470.4198470.4122140.3615380.4127660.0362971
30.1202340.0121570.0072470.0031751crammer_singerl2{'C': 1, 'multi_class': 'crammer_singer', 'pen...0.4732820.3969470.4198470.4122140.3615380.4127660.0362971
40.0150910.0023330.0000000.00000010ovrl1{'C': 10, 'multi_class': 'ovr', 'penalty': 'l1'}NaNNaNNaNNaNNaNNaNNaN14
50.2464300.0180340.0052650.00030110ovrl2{'C': 10, 'multi_class': 'ovr', 'penalty': 'l2'}0.4809160.4122140.4045800.3893130.3615380.4097120.03959710
60.1326180.0054600.0050940.00008010crammer_singerl1{'C': 10, 'multi_class': 'crammer_singer', 'pe...0.4809160.4122140.4122140.3969470.3615380.4127660.0387801
70.1463670.0140930.0050400.00005310crammer_singerl2{'C': 10, 'multi_class': 'crammer_singer', 'pe...0.4809160.4122140.4122140.3969470.3615380.4127660.0387801
80.0141140.0010500.0000000.000000100ovrl1{'C': 100, 'multi_class': 'ovr', 'penalty': 'l1'}NaNNaNNaNNaNNaNNaNNaN15
90.8341560.0308550.0050860.000078100ovrl2{'C': 100, 'multi_class': 'ovr', 'penalty': 'l2'}0.4732820.4045800.4122140.3969470.3615380.4097120.03621410
100.5195920.0219080.0051760.000095100crammer_singerl1{'C': 100, 'multi_class': 'crammer_singer', 'p...0.4809160.4122140.4122140.3969470.3615380.4127660.0387801
110.5132600.0136590.0049890.000057100crammer_singerl2{'C': 100, 'multi_class': 'crammer_singer', 'p...0.4809160.4122140.4122140.3969470.3615380.4127660.0387801
120.0138910.0007940.0000000.0000001000ovrl1{'C': 1000, 'multi_class': 'ovr', 'penalty': '...NaNNaNNaNNaNNaNNaNNaN16
130.6260050.1065140.0050550.0000831000ovrl2{'C': 1000, 'multi_class': 'ovr', 'penalty': '...0.4732820.3969470.4274810.4045800.3538460.4112270.0391309
144.0005730.1463040.0050130.0000321000crammer_singerl1{'C': 1000, 'multi_class': 'crammer_singer', '...0.4809160.4122140.4122140.3969470.3615380.4127660.0387801
153.9543070.1848810.0047610.0006061000crammer_singerl2{'C': 1000, 'multi_class': 'crammer_singer', '...0.4809160.4122140.4122140.3969470.3615380.4127660.0387801
\n", "
\n", " \n", " \n", " \n", "\n", " \n", "
\n", "
\n", " " ], "text/plain": [ " mean_fit_time std_fit_time mean_score_time std_score_time param_C \\\n", "0 0.022543 0.004529 0.000000 0.000000 1 \n", "1 0.083652 0.001697 0.005357 0.000484 1 \n", "2 0.116112 0.014720 0.008172 0.003883 1 \n", "3 0.120234 0.012157 0.007247 0.003175 1 \n", "4 0.015091 0.002333 0.000000 0.000000 10 \n", "5 0.246430 0.018034 0.005265 0.000301 10 \n", "6 0.132618 0.005460 0.005094 0.000080 10 \n", "7 0.146367 0.014093 0.005040 0.000053 10 \n", "8 0.014114 0.001050 0.000000 0.000000 100 \n", "9 0.834156 0.030855 0.005086 0.000078 100 \n", "10 0.519592 0.021908 0.005176 0.000095 100 \n", "11 0.513260 0.013659 0.004989 0.000057 100 \n", "12 0.013891 0.000794 0.000000 0.000000 1000 \n", "13 0.626005 0.106514 0.005055 0.000083 1000 \n", "14 4.000573 0.146304 0.005013 0.000032 1000 \n", "15 3.954307 0.184881 0.004761 0.000606 1000 \n", "\n", " param_multi_class param_penalty \\\n", "0 ovr l1 \n", "1 ovr l2 \n", "2 crammer_singer l1 \n", "3 crammer_singer l2 \n", "4 ovr l1 \n", "5 ovr l2 \n", "6 crammer_singer l1 \n", "7 crammer_singer l2 \n", "8 ovr l1 \n", "9 ovr l2 \n", "10 crammer_singer l1 \n", "11 crammer_singer l2 \n", "12 ovr l1 \n", "13 ovr l2 \n", "14 crammer_singer l1 \n", "15 crammer_singer l2 \n", "\n", " params split0_test_score \\\n", "0 {'C': 1, 'multi_class': 'ovr', 'penalty': 'l1'} NaN \n", "1 {'C': 1, 'multi_class': 'ovr', 'penalty': 'l2'} 0.465649 \n", "2 {'C': 1, 'multi_class': 'crammer_singer', 'pen... 0.473282 \n", "3 {'C': 1, 'multi_class': 'crammer_singer', 'pen... 0.473282 \n", "4 {'C': 10, 'multi_class': 'ovr', 'penalty': 'l1'} NaN \n", "5 {'C': 10, 'multi_class': 'ovr', 'penalty': 'l2'} 0.480916 \n", "6 {'C': 10, 'multi_class': 'crammer_singer', 'pe... 0.480916 \n", "7 {'C': 10, 'multi_class': 'crammer_singer', 'pe... 0.480916 \n", "8 {'C': 100, 'multi_class': 'ovr', 'penalty': 'l1'} NaN \n", "9 {'C': 100, 'multi_class': 'ovr', 'penalty': 'l2'} 0.473282 \n", "10 {'C': 100, 'multi_class': 'crammer_singer', 'p... 0.480916 \n", "11 {'C': 100, 'multi_class': 'crammer_singer', 'p... 0.480916 \n", "12 {'C': 1000, 'multi_class': 'ovr', 'penalty': '... NaN \n", "13 {'C': 1000, 'multi_class': 'ovr', 'penalty': '... 0.473282 \n", "14 {'C': 1000, 'multi_class': 'crammer_singer', '... 0.480916 \n", "15 {'C': 1000, 'multi_class': 'crammer_singer', '... 0.480916 \n", "\n", " split1_test_score split2_test_score split3_test_score \\\n", "0 NaN NaN NaN \n", "1 0.404580 0.412214 0.396947 \n", "2 0.396947 0.419847 0.412214 \n", "3 0.396947 0.419847 0.412214 \n", "4 NaN NaN NaN \n", "5 0.412214 0.404580 0.389313 \n", "6 0.412214 0.412214 0.396947 \n", "7 0.412214 0.412214 0.396947 \n", "8 NaN NaN NaN \n", "9 0.404580 0.412214 0.396947 \n", "10 0.412214 0.412214 0.396947 \n", "11 0.412214 0.412214 0.396947 \n", "12 NaN NaN NaN \n", "13 0.396947 0.427481 0.404580 \n", "14 0.412214 0.412214 0.396947 \n", "15 0.412214 0.412214 0.396947 \n", "\n", " split4_test_score mean_test_score std_test_score rank_test_score \n", "0 NaN NaN NaN 13 \n", "1 0.346154 0.405109 0.038100 12 \n", "2 0.361538 0.412766 0.036297 1 \n", "3 0.361538 0.412766 0.036297 1 \n", "4 NaN NaN NaN 14 \n", "5 0.361538 0.409712 0.039597 10 \n", "6 0.361538 0.412766 0.038780 1 \n", "7 0.361538 0.412766 0.038780 1 \n", "8 NaN NaN NaN 15 \n", "9 0.361538 0.409712 0.036214 10 \n", "10 0.361538 0.412766 0.038780 1 \n", "11 0.361538 0.412766 0.038780 1 \n", "12 NaN NaN NaN 16 \n", "13 0.353846 0.411227 0.039130 9 \n", "14 0.361538 0.412766 0.038780 1 \n", "15 0.361538 0.412766 0.038780 1 " ] }, "execution_count": 93, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.DataFrame(gs_clf.cv_results_)" ] }, { "cell_type": "code", "execution_count": 94, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "KKBzq6-gLBBy", "outputId": "45199ff5-8d74-4610-f782-ff61d30f05d3" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "'In the green springtime, this creature photosynthesizes under the sun.' => Grass\n", "'This create is native to caves in the Arctic. They make friends with polar bears, and sometimes drink hot cocoa.' => Ice\n" ] } ], "source": [ "docs_new = [\n", " \"In the green springtime, this creature photosynthesizes under the sun.\",\n", " \"This create is native to caves in the Arctic. They make friends with polar bears, and sometimes drink hot cocoa.\",\n", "]\n", "\n", "X_new_counts = vectorizer.transform(docs_new)\n", "predicted = clf.predict(X_new_counts.toarray())\n", "\n", "for doc, cat in zip(docs_new, predicted):\n", " print(f\"{doc!r} => {cat}\")" ] }, { "cell_type": "code", "execution_count": 95, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 282 }, "id": "aF8K0Ku5LBB1", "outputId": "b2492636-9610-4606-f976-aff09b460b6d" }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 95, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.imshow(confusion_matrix(y_test, clf.predict(X_test)))" ] }, { "cell_type": "code", "execution_count": 96, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "lUVDLT01LBB2", "outputId": "d4fd1914-ceb1-4c39-d6c6-a8acc794fddf" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", " Accuracy: 0.47330960854092524\n", "\n", " Classification Report\n", "==================================\n", "\n", " precision recall f1-score support\n", "\n", " Bug 0.57 0.64 0.60 25\n", " Dark 1.00 0.27 0.42 15\n", " Dragon 1.00 0.17 0.29 6\n", " Electric 0.55 0.55 0.55 11\n", " Fairy 1.00 0.14 0.25 7\n", " Fighting 0.33 0.30 0.32 10\n", " Fire 0.58 0.37 0.45 19\n", " Flying 0.00 0.00 0.00 1\n", " Ghost 0.38 0.30 0.33 10\n", " Grass 0.49 0.53 0.51 32\n", " Ground 0.57 0.31 0.40 13\n", " Ice 0.80 0.40 0.53 10\n", " Normal 0.23 0.46 0.31 28\n", " Poison 0.80 0.50 0.62 8\n", " Psychic 0.63 0.52 0.57 23\n", " Rock 0.54 0.35 0.42 20\n", " Steel 0.40 0.25 0.31 8\n", " Water 0.47 0.83 0.60 35\n", "\n", " accuracy 0.47 281\n", " macro avg 0.57 0.38 0.42 281\n", "weighted avg 0.55 0.47 0.47 281\n", "\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/usr/local/lib/python3.7/dist-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n", " _warn_prf(average, modifier, msg_start, len(result))\n", "/usr/local/lib/python3.7/dist-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n", " _warn_prf(average, modifier, msg_start, len(result))\n", "/usr/local/lib/python3.7/dist-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n", " _warn_prf(average, modifier, msg_start, len(result))\n" ] } ], "source": [ "print(\"\\n Accuracy: \", accuracy_score(y_test, clf.predict(X_test)))\n", "print(\"\\n Classification Report\")\n", "print(\"==================================\")\n", "print(\"\\n\", classification_report(y_test, clf.predict(X_test)))" ] }, { "cell_type": "code", "execution_count": 97, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "XamB14MKPJs-", "outputId": "f758f37c-7945-4139-e067-b19ef8656510" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", " Accuracy: 0.49466192170818507\n", "\n", " Classification Report\n", "==================================\n", "\n", " precision recall f1-score support\n", "\n", " Bug 0.57 0.64 0.60 25\n", " Dark 1.00 0.40 0.57 15\n", " Dragon 0.50 0.17 0.25 6\n", " Electric 0.50 0.55 0.52 11\n", " Fairy 0.50 0.14 0.22 7\n", " Fighting 0.50 0.30 0.37 10\n", " Fire 0.41 0.37 0.39 19\n", " Flying 0.00 0.00 0.00 1\n", " Ghost 0.42 0.50 0.45 10\n", " Grass 0.50 0.50 0.50 32\n", " Ground 0.67 0.31 0.42 13\n", " Ice 0.67 0.40 0.50 10\n", " Normal 0.30 0.50 0.38 28\n", " Poison 0.80 0.50 0.62 8\n", " Psychic 0.67 0.61 0.64 23\n", " Rock 0.47 0.35 0.40 20\n", " Steel 0.33 0.25 0.29 8\n", " Water 0.49 0.83 0.62 35\n", "\n", " accuracy 0.49 281\n", " macro avg 0.52 0.41 0.43 281\n", "weighted avg 0.53 0.49 0.49 281\n", "\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/usr/local/lib/python3.7/dist-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n", " _warn_prf(average, modifier, msg_start, len(result))\n", "/usr/local/lib/python3.7/dist-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n", " _warn_prf(average, modifier, msg_start, len(result))\n", "/usr/local/lib/python3.7/dist-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n", " _warn_prf(average, modifier, msg_start, len(result))\n" ] } ], "source": [ "print(\"\\n Accuracy: \", accuracy_score(y_test, gs_clf.predict(X_test)))\n", "print(\"\\n Classification Report\")\n", "print(\"==================================\")\n", "print(\"\\n\", classification_report(y_test, gs_clf.predict(X_test)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In summary, we can see the grid search classifier is better than the best classifier, however, an accuracy around 0.49 still can be improved.\n", "We're going to pick this analysis up in the next notebook where we'll look at using HuggingFace Transformers to improve the result." ] }, { "cell_type": "markdown", "metadata": {}, "source": [] } ], "metadata": { "colab": { "name": "nlp.ipynb", "provenance": [] }, "interpreter": { "hash": "45e1260056979d5382785f386f12ee00f44622d9a136ee7663e9a61a67ca2a68" }, "kernelspec": { "display_name": "Python 3.10.0 ('projects-vBrzsZbN-py3.10')", "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.10.0" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 0 }