{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "Contents:\n", "- [Data Preprocessing](#Data-Preprocessing)\n", " - [Data scaling](#Data-scaling)\n", " - [Categorical variables](#Categorical-variables)\n", " - [One-hot encoding](#One-hot-encoding)\n", " - [Method 1](#Method-1)\n", " - [Method 2](#Method-2)\n", " - [Ordinal encoding](#Ordinal-encoding)\n", " - [Target Encoding](#Target-Encoding)\n", " - [Multiple column transformations](#Multiple-column-transformations)\n", "- [Cross validation and Hyperparameter tuning](#Cross-validation-and-Hyperparameter-tuning)\n", " - [Grid search](#Grid-search)\n", " - [Randomized search](#Randomized-search)\n", " - [Successive Halving search](#Successive-Halving-search)\n", " - [Other libraries for hyperparameter tuning](#Other-libraries-for-hyperparameter-tuning)\n", " - [Practice question](#Practice-question)\n", "- [Note](#Note)\n", "- [Algorithm chains and pipelines](#Algorithm-chains-and-pipelines)\n", " - [Building Pipelines](#Building-Pipelines)\n", " - [The General Pipeline Interface](#The-General-Pipeline-Interface)\n", " - [Pipeline and ColumnTransformer](#Pipeline-and-ColumnTransformer)\n", " - [Grid-Searching Which Model To Use](#Grid-Searching-Which-Model-To-Use)\n", "- [Splitting data in cross-validation](#Splitting-data-in-cross-validation)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Data Preprocessing" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The following exercise is adapted from Chapter 4 of the book *Introduction to Machine Learning with Python*, by Andreas C. Müller, Sarah Guido." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Regardless of the types of features our data consists of, how we represent them can have an enormous effect on the performance of machine learning models. The question of how to represent our data best for a particular application is known as feature engineering, and it is one of the main tasks of data scientists trying to solve real-world problems. Representing the data in the right way can have a bigger influence on the performance of a supervised model than the exact parameters we choose." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "from collections import Counter\n", "from sklearn.inspection import DecisionBoundaryDisplay" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Data scaling\n", "Some algorithms are very sensitive to the scaling of the data. \n", "Therefore, a common practice is to adjust the features so that the data representation is more suitable for these algorithms.\n", "Let's visualize two different scaling techniques: normalization and standardization.\n", "First, let's generate a small synthetic dataset with sklearn's *make_blobs()*." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.5, 1.0, 'our dataset')" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from sklearn.datasets import make_blobs\n", "X, y = make_blobs(n_samples=50, centers=2, random_state=1, cluster_std=3)\n", "plt.figure(figsize=(4,4))\n", "plt.scatter(X[:, 0], X[:, 1], s=30, c=y) \n", "plt.title(\"our dataset\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The first feature (the x-axis value) is between -15 and 3. The second feature (the y-axis value) is between -10 and 10.\n", "Now, let's scale the data with two different scalers *MinMax* (performs normalization) and *StandardScaler* (performs standardization)." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "from sklearn.preprocessing import MinMaxScaler, StandardScaler\n", "\n", "minmax_scaler = MinMaxScaler()\n", "standard_scaler = StandardScaler()\n", "X_minmax = minmax_scaler.fit_transform(X)\n", "X_standard = standard_scaler.fit_transform(X)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, let's see the difference:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABCwAAAF2CAYAAAClPwmmAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAagNJREFUeJzt3Qd4VFX6x/HfnUkHEqoUQQV7BRULVmzYu1jXLnbXuorsXxF3FRXruq5Ysay94VoRUbBXsFdQivSWBNIzc/7Pe1NMQmYSIJmW7+d5hmTuvXPvuZmE+857z3mP55xzAgAAAAAASCCBeDcAAAAAAACgIRIWAAAAAAAg4ZCwAAAAAAAACYeEBQAAAAAASDgkLAAAAAAAQMIhYQEAAAAAABIOCQsAAAAAAJBwSFgAAAAAAICEQ8ICAAAAAAAkHBIWQIrbYIMNdNppp8XkWHYcO16iGTx4sP8AAACReZ6n6667Lt7NSBmPPPKI/zOdOXNmvJsCJC0SFsAa+Pbbb3XMMcdo/fXXV1ZWltZdd13tt99+uvvuu+ttd+ONN2r8+PFxaycAAGibH5Lt8cEHH6yy3jmnPn36+OsPOeSQuLQRAJqLhAWwmj766CMNHDhQX3/9tYYNG6Z///vfOuussxQIBHTXXXfV25aEBQAAiAe7ofLkk0+usnzKlCn6448/lJmZucq6kpIS/d///V+MWggATUtrxjYA6rjhhhuUl5enzz//XB07dqy3btGiRUplpaWlysjI8JMzbVU4HFZ5ebkfCAIAkKgOOuggPffcc/rXv/6ltLQ/Q35LYmy//fZasmTJKq/h2pbYioqK1K5du3g3A4iptvupA1hDM2bM0JZbbrlKssKss846td9bV0u7sDz66KO1XTNraknMmjVL559/vjbddFNlZ2erS5cuGjp06CpjHGu6dX744Ye67LLL1K1bN/9CdeSRR2rx4sWrdPH85z//qd69eysnJ0d77bWXvv/++1XauGzZMl1xxRXaeuut1b59e+Xm5urAAw/0e4zUNXnyZP/YTz/9tH+3xYa92H4LCwv99dZzZKuttvKDG/v60ksvNftn+MUXX2j//fdX165d/fPv27evzjjjjFUSA9Zjxdppx7BzP+CAA/zX1hg3bpz23ntv/+dud4q22GIL3Xvvvc1qQ1lZmUaOHKmNNtrIf611j73yyiv95XXZz+DCCy/UE0884b/vtu2bb77Z7HMFACAeTjjhBC1dulQTJ06sXWYJ9+eff14nnnhis2pY2Pe2bPr06X4MY7GP3bQ5/fTTVVxc3Oj10pIkdj226/ugQYP8YbTmvvvu86+5dk23ulINY57333/fj4XWW2+92uvypZde6vf6qHtjyOIBe73FPTWsfRYfHXfccVF/JitWrNAll1zi19uyY1j8YEN6p06dWm+7Tz/91E/4dOrUyd/vNttsU68X7TfffOP/PPr16+efT48ePfw4xn7ezfHGG29o99139/fdoUMHHXzwwavEbLZ/i9Ms7rS22HYnnXRSs/YPpBJ6WACryepWfPzxx/ruu+/8D+qRPP744/5QkR133FFnn322v2zDDTf0v1rvDBtacvzxx/sJBrto2wdtuwD/8MMPfmKgrosuusi/aNoHbNv2zjvv9IOCZ555pnaba6+91k9Y2EXNHnbxHTJkiB+c1PXbb7/5yQYLCixRsHDhQj+I2HPPPf1j9+rVq972//jHP/xeFZbksA/z9v1bb72lo48+2g9IRo8e7V+gLXixc2mKBRvWLgs4hg8f7gc/dk4vvvhive3OPPNMP2FjyRT7OVZWVvrBzCeffOIPyTH2M7MkwmGHHebfPXrllVf8RJAlOy644IKIbbD19hob22vvzeabb+4HVHfccYd++eWXVYbxvPPOO3r22Wf9n7klWRKxsCgAAHXZtcoSBk899ZR/La35oFxQUODHH9bzormOPfZYP2awa77FFw8++KD/Yf/mm2+ut51dp//3v//VXoNte6uTYTcE/vOf//jX6OXLl+uWW27xP+Db9bWGJTosCXLeeef5N3I+++wzvzaYDV+xdcaOadd+i2Fs3V//+lf/mm4f7u0DvR0jmnPPPddP2Nj13GIYi18sFvjxxx+13Xbb+dtYgsfa3LNnT1188cV+MsLWv/rqq/7zmm0snrLYx9ZbsuH+++/3v1qcYsmbaPHhqaee6t+4sZ+fnbOd02677aZp06bVizEs9rHtbN2tt966SnwItAkOwGp56623XDAY9B+DBg1yV155pZswYYIrLy9fZdt27dq5U089dZXlxcXFqyz7+OOP7VaBe+yxx2qXjRs3zl+27777unA4XLv80ksv9Y+fn5/vP1+0aJHLyMhwBx98cL3tRowY4b++bhtKS0tdKBSqd+zff//dZWZmuuuv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4bDr0aOHGzNmTL33NjMz0z311FMuEf3www/+79nnn39eu+yNN95wnue5uXPnRnzdnnvu6S6++GKXiHbccUd3wQUX1D4PhUKuV69ebvTo0Y1uf+yxx7qDDz643rKddtrJnXPOOS5Rre45rs7faSKy39GXXnop6jZXXnml23LLLestO+6449z+++/vUuUc3333XX+75cuXu2S1aNEi/xymTJkScZtk/JtMJqkckxjikuSNS1IxJjHEJasiLkl8xCUt+zeZUD0sGlNQUKDOnTtHXP/ll1/62R3rplfDupyst956+vjjj5VKrOuQZd023XRT/w7B0qVLlSosk2pdoOq+j3l5eX63uER9H61d1uVy4MCBtcus/YFAwL8TE80TTzyhrl27aqutttLVV1+t4uJiJcLdJ/t7qvse2LnY80jvgS2vu72xuwKJ+p6tyTka61K7/vrrq0+fPjr88MP9O1ipJNnex7UxYMAAv3v3fvvtpw8//FDJxK6HJto1sS29l/FATFIfcUniSLWYxBCXEJcky/u4NohLmpamBDZ9+nTdfffduvXWWyNuYxeTjIyMVcYjdu/ePaHHAK0u63ZpXUptLO2MGTP8LqkHHnig/2YHg0Elu5r3yt63ZHkfrV0Nu22lpaX5f7TR2nziiSf6Fxkb4/bNN9/oqquu8ruDvfjii4qnJUuWKBQKNfoeWNfoxth5JtN7tibnaIH4ww8/rG222cb/j9n+P7Jx0BYc9O7dW6kg0vtYWFiokpISf+x2srNgwLp1WzBfVlamBx980B+7bYG8jZFNdDY0wbrE7rrrrv6HikiS7W8ymRCT1EdcklhSLSYxxCXEJXURl7TduCQmPSyGDx/eaFGRuo+Gf5Rz5871L4Y23tDG1iW6NTnH1XH88cfrsMMO8wuV2LgfG5v4+eef+3c3UuUcE0Vrn6eNJ7XMor2XNt70scce00svveQHfEg8gwYN0imnnOJnwPfcc08/iOvWrZs/rh3JwwK8c845R9tvv70f2FmwZ1+tLkEysDGjNt7z6aefjndTkl5biEkMcUlqxCXEJGiIuCQ1EJcosXpYXH755X416Wj69etX+70VqLIiK/am3X///VFf16NHD787VX5+fr07GlaR29bFyuqe49qyfVn3Pbvjs88++yjZz7HmvbL3zTKONey5/YccS809T2tzw4JIlZWVfpXu1fnds+6lxt5Lq0IfL/b7ZHfFGlazj/a3ZMtXZ/t4W5NzbCg9PV3bbrut/36likjvoxX1SoW7GJHsuOOO+uCDD5ToLrzwwtoCek3dPUu2v8l4aAsxiSEu+bNdyRyXtNWYxBCXEJfURVzSduOSmCQsLOtnj+awuxgWGFi2ady4cf44rmhsO/tDnTRpkj91mLGubLNnz/YzkLGyOufYEv744w9/rGjdi2gyn6N1KbVfXHsfawIB6/Zl3aJWt2p5rM7Tfr8sKLWxh/Z7aN555x2/i1TNBb85rPqxieV72RjrxmznYe+B3S0zdi723P5jivQzsPXWJayGVQ2O5d9ea59jQ9Z189tvv9VBBx2kVGHvV8MpphL5fWwp9rcX77+7aKxu10UXXeTf7bS71vb/ZFOS7W8yHtpCTGKIS1IjLmmrMYkhLiEuqSuR38eWQlwSgUsgf/zxh9too43cPvvs438/f/782kfdbTbddFP36aef1i4799xz3Xrrrefeeecd98UXX7hBgwb5j0Q1a9YsN23aNDdq1CjXvn17/3t7rFixonYbO8cXX3zR/96WX3HFFX6F8d9//929/fbbbrvttnMbb7yxKy0tdalwjuamm25yHTt2dC+//LL75ptv/OrjVo29pKTEJaoDDjjAbbvttv7v4wcffOC/JyeccELE39fp06e766+/3v89tffSzrVfv35ujz32cIng6aef9iugP/LII37F8bPPPtt/TxYsWOCvP/nkk93w4cNrt//www9dWlqau/XWW/1K+CNHjvQr5H/77bcuUa3uOdrv8IQJE9yMGTPcl19+6Y4//niXlZXlvv/+e5eo7O+s5m/O/pu//fbb/e/t79LY+dl51vjtt99cTk6O+9vf/ua/j/fcc48LBoPuzTffdKlyjnfccYcbP368+/XXX/3fT6uKHwgE/P9PE9V5553nV4KfPHlyvethcXFx7Tap8DeZqNpKTGKIS1IjLkm1mMQQlxCXEJckjnjFJQmVsLBpeuwNbuxRw/5Dtec2FUwNu3Ccf/75rlOnTv4v95FHHlkvoEg0NhVYY+dY95zsuf08jP0SDBkyxHXr1s1/g9dff303bNiw2v/IUuEca6YQu+aaa1z37t39/7gtSPz5559dIlu6dKkfDFjwk5ub604//fR6wU/D39fZs2f7gUDnzp39c7Rg2P4zLigocIni7rvv9oPtjIwMf6qtTz75pN70Z/be1vXss8+6TTbZxN/epqB67bXXXKJbnXO85JJLare1382DDjrITZ061SWymqmyGj5qzsu+2nk2fM2AAQP887SAte7fZiqc48033+w23HBDP6izv7/Bgwf7HygTWaTrYd33JlX+JhNRW4lJDHFJasQlqRiTGOIS4hLikrYdl3jVBwcAAAAAAEgYMZklBAAAAAAAYHWQsAAAAAAAAAmHhAUAAAAAAEg4JCwAAAAAAEDCIWEBAAAAAAASDgkLAAAAAACQcEhYAAAAAACAhEPCAgAAAAAAJBwSFgAAAAAAIOGQsAAAAAAAAAmHhAUAAAAAAEg4JCwAAAAAAIASzf8DmYlhQ3KpyhkAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots(1, 2, figsize=(13,4))\n", "ax[0].set_title(\"Standard scaler\")\n", "ax[0].scatter(X_standard[:, 0], X_standard[:, 1], s=30, c=y)\n", "ax[0].axis([-2, 2, -2.5, 2.5])\n", "\n", "ax[1].set_title(\"Minmax scaler\")\n", "ax[1].scatter(X_minmax[:, 0], X_minmax[:, 1], s=30, c=y )\n", "ax[1].axis([-2, 2, -2.5, 2.5]);\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The *StandardScaler* in *sklearn* ensures that for each feature the mean is 0 and the variance is 1, bringing all features to the same magnitude. However, this scaling does not ensure any particular minimum and maximum values for the features. \n", "\n", "The *MinMaxScaler*, on the other hand, shifts the data such that all features are exactly between 0 and 1. For the two-dimensional dataset this means all of the data is contained within the rectangle created by the x-axis between 0 and 1 and the y-axis between 0 and 1." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Previously, we have mentioned that it is important that we should fit the scaler only on the training data and transform the test data. This way we avoid any data leakage.\n", "Now, let's also demonstrate why should we apply the same transformation to the training set and the test set for the supervised model." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABQkAAAGGCAYAAADYVwfrAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAf7dJREFUeJzt3Qm81XP+x/FP97aptNB6FZU0hTahKWOyRIZBtjG20lDDZCuDQgsha2USJuuYscT8U2YkS5JBI9qEalBUWg1KpdLt93+8v3fO7W7n3O0sv+X1fDyO47ecc3/n172/9/l9f9/f51vF8zzPAAAAAAAAAERWVqY3AAAAAAAAAEBm0UgIAAAAAAAARByNhAAAAAAAAEDE0UgIAAAAAAAARByNhAAAAAAAAEDE0UgIAAAAAAAARByNhAAAAAAAAEDE0UgIAAAAAAAARByNhAAAAAAAAEDE0UgIZNioUaOsSpUqFXrtk08+6V775ZdfWqrovfUz9LMAAEjk4osvtpYtWyb1PfV+el8AANJxjuUn+gz6LMny1ltvuffUM1ASGgmBCvrkk0/swgsvtP32289q1KhhOTk5dsEFF7j5URQLnNhD+6RJkyZ2zDHH2B133GEbN26s8Ht/+umnLhxT2RgKAGGzePFiO/vss+2AAw6wmjVrurw64YQTbMKECRZGBTOoatWqts8++1jXrl3t6quvdjlSUdu2bXMZxAkVgEyKdQ748MMPM70pkbR792576qmnrFu3bi5f9t57b2vbtq317dvX/v3vf1tYf99iD32P0Plu79697U9/+pP98MMPFX7v9957z+Xq999/n9RtRnLQSAhUwJQpU+ywww6zmTNnWv/+/e3BBx+0Sy65xGbNmuXmv/jii2V+r5tvvtl+/PHHCm3HRRdd5F6rE0C/uOqqq+yvf/2rTZo0ya677joXoiNHjrT27dvbm2++WaH31MndLbfcQiMhAJTjC/jhhx9uixYtsgEDBtgDDzxgl156qWVlZdn9999vYaVGUGXQE088YbfeeqvL5L/85S/WqVMnGzt2bIUbCZVBNBICQHTpHKdfv37WrFkz18B111132a9+9SvXQDhjxgwLK2WpcvWhhx6yK6+80s275pprrEOHDvbRRx9V+DuKcpVGQn+qmukNAILmiy++cI1zrVu3trffftsaNWqUv0y9FY4++mi3XAdNrRPP1q1brXbt2q63gx4VkZ2d7R5+os+vnisF6ST1xBNPtLPOOss1+ClcAQCpc/vtt1u9evXsgw8+sPr16xdatmHDBgsr9epQL/+C7rzzTjv11FPt2muvtXbt2tnJJ5+cse0DgLDwPM+2b99ue+21l/lJ7BwrmdavX+86heiimzpCFDR+/PhK3THld2oI1UXHmGHDhrmOH7/+9a/ttNNOsyVLlvjudwCVQ09CoJzuuece16tAAVGwgVAaNmxof/7zn1043X333cVqYqiB7Pzzz7cGDRrYL37xi0LLClLvQF2t0vupK7sOwF9//XWxmhQl1SRU7SYdtN955x078sgjXddwNVaqe3xB3377rf3xj390V4Hq1KljdevWdSGgBr1kUw8OBaiuFqk3S8xXX31lf/jDH+xnP/uZC5d9993XzjnnnEKfR59R8+TYY4/N7/Ie69Exbdo0O+WUU1z3d93ifOCBB9ro0aMtNzc36Z8DAIJ0QeuQQw4p1kAojRs3Ljbvb3/7m8uMWrVquYz65S9/aa+99lr+8soca3WLljJA26NMUimK3//+9/bdd98VO+G87bbbrHnz5m47dMxPRgkPZctzzz3nLsip8TRm586dNmLECHdLshpUdVKpC126KyBGeRTLevV6iGVQLIt1QVD1EpWz+mxNmza13/3ud/bf//630tsNAKXR8Uff41euXOm+/+v/VVpi4sSJ+WUnjjvuOHd8051HzzzzTKHXx84l1PFBx2UdL3VOoFtoix6jY+cYr776qms00nd3nffI8uXL3fd13UGk4/fPf/5ze/nll0ssTTR58mS78cYb3fFS26XznFWrVhX7bO+//76ddNJJ7vis9+zZs6e9++67hdZJdI5VlF6vc5KS6FxEt9HGs2LFCpdRRx11VLFl+vlFc1XnPIMHD3b7TJmpXNM+/eabb8qcP4novFBZozzV+ytfH3/88WLrrV692vr06ePeX9uobdqxY4dVln6nhg8f7s7l9P0hpiyZqH8z3W0mrVq1ys/V2Pmf7gTQ+2t79dkOPvhg14sR6UNPQqCc/vGPf7gDvg7kJdGJlZYXDUZReB500EGuRp+CJh4dXJ9//nnXI1EhO3v2bHdyVlaff/65682nW6DVLV6hofdUEClEYmE+depUt006QOsKmYJeAaqg1YlgMsW2RyedsZM09XBRd/Pf/va3LjwVDgoB1THUNugLgfanGkxV+0JfKHTbssSe9eVGX4iGDBninnVlS6G7efNm16ALAFGkk8E5c+bYxx9/bIceemjCddX4pS/tPXr0cLcVVa9e3Z2c6XiqXuCVPdbqxFOvV3kOHc91sqULRgsWLHAnfNWqVXPr6f3USKiefnrMnz/f/XydTFXW/vvv7/JNJ2DaZp0E6/nRRx+18847z/UOUX2lxx57zJ0ozp071zp37uwaCJVLl19+uZ1xxhl25plnuvfr2LGje3799dddnuqz6WRIjZq6iKhn3YIWhqL5APxNF2t0oV/fmdVJ4emnn7YrrrjCNQzddNNNrma6jl0PP/ywa6jq3r27++5fkNbXRSVlwbJly9xxTw1AsYa9GC3TMVPHdR031bimcwjlhzpR6BivhkaVeVDj39///nd37CxI5wF6zxtuuMH1bNdFpF69etnChQvze6QpY/SZdO6iskUqlRFrPPrXv/7lLmqV9xxL51Xa5qK5qPOR//znP64EVDyx0k4vvPCC+1k6R4lny5Yt7jxRPezUQKayF2ocfOmll1yjnTqBlCV/4tH+1vmh9qH+3ZRTr7zyijvP0vvqVuBYp5Pjjz/eNSDr30XndrptuKLln0ranzo307mdPkNZM1G/i9rfzz77rI0bN87tD4ldkNPvns5X9fuji3s691anEl1wHDRoUFK2HaXwAJTZ999/r9TxTj/99ITrnXbaaW69zZs3u+mRI0e66fPOO6/YurFlMfPmzXPT11xzTaH1Lr74Yjdf68c88cQTbt6KFSvy5x1wwAFu3ttvv50/b8OGDV6NGjW8a6+9Nn/e9u3bvdzc3EI/Q++j9W699dZC8/R++lmJzJo1y633wgsvxF2nU6dOXoMGDfKnt23bVmydOXPmuPd56qmn8ufpPTVPP6Ookt7j97//vVerVi33GQEgil577TUvOzvbPbp37+5df/313quvvurt3Lmz0HqfffaZl5WV5Z1xxhnFMmH37t3lPtb269fP5VDMv/71L3f8fvrppwu9dsaMGYXmK6eqV6/unXLKKYV+7o033ujW0/uWRusNGjQo7vKrr77arbNo0SI3vWvXLm/Hjh2F1vnuu++8Jk2aeL/73e/y523cuLFY/ibaL88++2yxHAaAyop97//ggw/y5+nYqHl33HFHoePYXnvt5VWpUsV77rnn8ucvXbo07rlE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BQCEArkEAPCTY445xq655pqkvufFF19sffr0sVT68ssvXe4tXLgwpT8HQHCFqifhH//4Rzv11FPtgAMOsDVr1tjIkSMtOzvbzjvvPLe8b9++tt9++7magnL11Vdbz5497b777rNTTjnFnnvuOfvwww9t0qRJFmWq5xgzefJkGzFihC1btix/Xh0qkAIA0ohcAgAAAFIvVD0JV69e7RoENXDJb37zG9t3333t3//+tzVq1Mgt10jHBU80evToYc8884xrFOzUqZP9/e9/d70JDj30UPOlxYvN2rbNe04h3W4de9SrV89dbSo4T42p7du3t5o1a1q7du3swQcfzH/tzp077YorrnC9N7VcDbaxRtmWLVu65zPOOMO9Z2y6qETvIaozeemll7p/17p169pxxx1nixYtcss0cI0GldF0rIeJ5gEAUoBccsglAIhOJqnH3+zZs+3+++/PP66rh55owEzVydfFKw2IedFFF9k333yT/1qdb3bo0MH22msvd67aq1cv27p1q+tx/pe//MWmTZuW/55vvfVWiT8/3nvEPProo3EzsVWrVu65S5cu7meoRyQAhLYnoU4SEinpQKuBTvQIBA039NlnZiNGmL34YkY24emnn3Y9OB544AEXLgsWLLABAwZY7dq1rV+/fvanP/3JXnrpJTdYzP777+8GdYkN7PLBBx9Y48aN7YknnrCTTjrJ9fIsSaL3EP17KRRfeeUVd7L45z//2Y4//nj7z3/+Y+eee64L5xkzZtgbb7zh1tc6AIAUIJcccgkAopNJahzU8V0dS2699VY3TxeJdMFIF4l00WjcuHH2448/2g033OA6r7z55puus4o6tNx9993u4tQPP/xg//rXv8zzPHdH3JIlS2zz5s0uk2SfffYp9rMTvUdZMnHu3Ll25JFHujw65JBDrHr16inbTwCCKVSNhKGmuhHTpuX9v2onqYdCp05p3wzdwq3bs88888z8q1GffvqpOyFS8Ki35kEHHWS/+MUv3NUp9baIifXo1IAyiQaHSfQe77zzjgu3DRs25A8ec++997oeoLqqNnDgQHflrmrVqqUOQAMAqARyySGXACBamaQLPWpcq1WrVqHjeqxh7o477sif9/jjj1uLFi1co6Lq5e/atcvlVSxH1CMwRhebduzYkTAr1EiY6D1Ky8RY7qkHIpkEIPS3G4eairJX/V+b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qxj2W8Ww38ou6r01kplJ/N6xDyTq+yDqn1+ivg8q8/nJpDzkUnJE/fML+4B9EPXPn45civZlLQAAAAAAAAA0EgIAAAAAAABRRyNhBNWoUcNGjhzpnlE+7LuKYb9VDPsNmcDvHftAor4Pov75Jer7IOqf30+i/m8R9c8v7AP2QdQ/fzr3AQOXAAAAAAAAABFHT0IAAAAAAAAg4mgkBAAAAAAAACKORkIAAAAAAAAg4mgkhLVs2dKqVKlS6HHnnXdmerN8Z+LEiW5f1axZ07p162Zz587N9Cb53qhRo4r9brVr1y7Tm+U7b7/9tp166qmWk5Pj9tHUqVMLLVfp2BEjRlizZs1sr732sl69etlnn32Wse1F9I5nL7zwgvvb1fodOnSw6dOnW5T2wSOPPGJHH320NWjQwD30Nxj0DKhopj333HPuONWnTx8LuvLug++//94GDRrkjsUqGt62bdvA/y2Udx+MHz/efvazn7ksatGihQ0ePNi2b99uYczekrz11lt22GGHuX//Nm3a2JNPPpmWbY2CqOdS1DNJyCVyiUw61R+ZpIFLEG0HHHCAd+utt3pr167Nf2zZsiXTm+Urzz33nFe9enXv8ccf9z755BNvwIABXv369b3169dnetN8beTIkd4hhxxS6Hdr48aNmd4s35k+fbp30003eVOmTNFAUt6LL75YaPmdd97p1atXz5s6daq3aNEi77TTTvNatWrl/fjjjxnbZkTnePbuu+962dnZ3t133+19+umn3s033+xVq1bNW7x4sReVfXD++ed7EydO9BYsWOAtWbLEu/jii93f5OrVq70oZdqKFSu8/fbbzzv66KO9008/3Quy8u6DHTt2eIcffrh38skne++8847bF2+99Za3cOFCLyr74Omnn/Zq1KjhnvX5X331Va9Zs2be4MGDvTBmb1HLly/3atWq5Q0ZMsQdCydMmOCOjTNmzEjbNodV1HMp6pkk5BK5RCZN900m0UgI10g4bty4TG+Grx155JHeoEGD8qdzc3O9nJwcb8yYMRndriA0Enbq1CnTmxEoRUNh9+7dXtOmTb177rknf97333/vQvHZZ5/N0FYiSsez3/zmN94pp5xSaF63bt283//+9ynfVr8e03ft2uXtvffe3l/+8hcvKp9fn7lHjx7eo48+6vXr1y/wJ2Pl3QcPPfSQ17p1a2/nzp1e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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from sklearn.model_selection import train_test_split\n", "\n", "X, y = make_blobs(n_samples=50, centers=5, random_state=4, cluster_std=2)\n", "X_train, X_test = train_test_split(X, random_state=5, test_size=.1)\n", "\n", "fig, ax = plt.subplots(1, 3, figsize=(13, 4))\n", "ax[0].scatter(X_train[:, 0], X_train[:, 1], label=\"Training set\", s=30, c = 'blue')\n", "ax[0].scatter(X_test[:, 0], X_test[:, 1], marker='^', label=\"Test set\", s=30,c = 'red')\n", "ax[0].legend(loc='upper left')\n", "ax[0].set_title(\"Original Data\")\n", "\n", "# scale the data using MinMaxScaler\n", "scaler = MinMaxScaler()\n", "scaler.fit(X_train)\n", "X_train_scaled = scaler.transform(X_train)\n", "X_test_scaled = scaler.transform(X_test)\n", "\n", "# visualize the properly scaled data\n", "ax[1].scatter(X_train_scaled[:, 0], X_train_scaled[:, 1], label=\"Training set\", s=30, c = 'blue')\n", "ax[1].scatter(X_test_scaled[:, 0], X_test_scaled[:, 1], marker='^', label=\"Test set\", s=30,c = 'red')\n", "ax[1].legend(loc='upper left')\n", "ax[1].set_title(\"Scaled Data\")\n", "\n", "# rescale the test set separately\n", "# so test set min is 0 and test set max is 1\n", "# DO NOT DO THIS! For illustration purposes only.\n", "test_scaler = MinMaxScaler()\n", "test_scaler.fit(X_test)\n", "X_test_scaled_badly = test_scaler.transform(X_test)\n", "\n", "# visualize wrongly scaled data\n", "ax[2].scatter(X_train_scaled[:, 0], X_train_scaled[:, 1], label=\"training set\", s=30, c = 'blue')\n", "ax[2].scatter(X_test_scaled_badly[:, 0], X_test_scaled_badly[:, 1], marker='^', label=\"test set\", s=30,c = 'red')\n", "ax[2].legend(loc='upper left')\n", "ax[2].set_title(\"Improperly Scaled Data\")\n", "\n", "for axi in ax:\n", " axi.set_xlabel(\"Feature 0\")\n", " axi.set_ylabel(\"Feature 1\")\n", "fig.tight_layout()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The first subplot is an unscaled two-dimensional dataset, with the training set shown as blue circles and the test set shown as red triangles. The second subplot is the same data, but scaled using the *MinMaxScaler*. Here, we called `fit` on the training set, and then called `transform` on the training and test sets. We can see that the dataset in the second subplot looks identical to the first; only the ticks on the axes have changed. Now all the features are between 0 and 1. We can also see that the minimum and maximum feature values for the test data (the triangles) are not 0 and 1.\n", "\n", "The third subplot shows what would happen if we scaled the training set and test set separately. In this case, the minimum and maximum feature values for both the training and the test set are 0 and 1. But now the dataset looks different. The test points moved, as they were scaled differently. We changed the arrangement of the data in an arbitrary way. Clearly this is not what we want to do. Hence, **we should use `fit` on the training set only, and then `transform` on the training and test sets**." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Categorical variables" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For this part of the exercise, we will use the dataset of adult incomes in the United States, derived from the 1994 census database. The task of the dataset is to predict whether a worker has an income of over 50,000 or under 50,000.\n", "Place the downloaded csv file *census_data* in the same directory as your notebook and import it.\n", "\n" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "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", "
ageworkclasseducationcapital-gain-categoryhours-per-weekoccupationincome
039State-govBachelorscat240Adm-clerical<=50K
150Self-emp-not-incBachelorscat113Exec-managerial<=50K
238PrivateHS-gradcat140Handlers-cleaners<=50K
353Private11thcat140Handlers-cleaners<=50K
428PrivateBachelorscat140Prof-specialty<=50K
\n", "
" ], "text/plain": [ " age workclass education capital-gain-category hours-per-week \\\n", "0 39 State-gov Bachelors cat2 40 \n", "1 50 Self-emp-not-inc Bachelors cat1 13 \n", "2 38 Private HS-grad cat1 40 \n", "3 53 Private 11th cat1 40 \n", "4 28 Private Bachelors cat1 40 \n", "\n", " occupation income \n", "0 Adm-clerical <=50K \n", "1 Exec-managerial <=50K \n", "2 Handlers-cleaners <=50K \n", "3 Handlers-cleaners <=50K \n", "4 Prof-specialty <=50K " ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data = pd.read_csv('census_data.csv')\n", "# For illustration purposes, we will only select some of the columns\n", "data = data[['age', 'workclass', 'education', 'capital-gain-category', 'hours-per-week', 'occupation', 'income']]\n", "data.head()" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(32561, 7)" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.shape" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "age int64\n", "workclass object\n", "education object\n", "capital-gain-category object\n", "hours-per-week int64\n", "occupation object\n", "income object\n", "dtype: object" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.dtypes" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The *workclass*, *education*, *\tcapital-gain-category*, and *occupation* features are categorical features. All of them come from a fixed list of possible values, as opposed to a range, and denote a qualitative property, as opposed to a quantity. In our example, target variable is income, and it is also categorical." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### One-hot encoding" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "By far the most common way to represent categorical variables is using the one-hot-encoding or one-out-of-N encoding, also known as dummy variables. The idea behind dummy variables is to replace a categorical variable with one or more new features that can have the values 0 and 1. We can represent any number of categories by introducing one new feature per category, as described here. In general, this encoding works well if there are only a few levels.\n", "For illustration purposes, we will do one hot encoding for all categorical features, even though education is ordinal, as the values it can take can be ordered." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's see the values that the *workclass* feature can take." ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "workclass\n", "Private 22696\n", "Self-emp-not-inc 2541\n", "Local-gov 2093\n", "? 1836\n", "State-gov 1298\n", "Self-emp-inc 1116\n", "Federal-gov 960\n", "Without-pay 14\n", "Never-worked 7\n", "Name: count, dtype: int64" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.workclass.value_counts()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Method 1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's apply pandas function *get_dummies* to do one hot encoding." ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(32561, 7)\n", "(32561, 48)\n", "Index(['age', 'hours-per-week', 'workclass_?', 'workclass_Federal-gov',\n", " 'workclass_Local-gov', 'workclass_Never-worked', 'workclass_Private',\n", " 'workclass_Self-emp-inc', 'workclass_Self-emp-not-inc',\n", " 'workclass_State-gov', 'workclass_Without-pay', 'education_10th',\n", " 'education_11th', 'education_12th', 'education_1st-4th',\n", " 'education_5th-6th', 'education_7th-8th', 'education_9th',\n", " 'education_Assoc-acdm', 'education_Assoc-voc', 'education_Bachelors',\n", " 'education_Doctorate', 'education_HS-grad', 'education_Masters',\n", " 'education_Preschool', 'education_Prof-school',\n", " 'education_Some-college', 'capital-gain-category_cat1',\n", " 'capital-gain-category_cat2', 'capital-gain-category_cat3',\n", " 'capital-gain-category_cat4', 'occupation_?', 'occupation_Adm-clerical',\n", " 'occupation_Armed-Forces', 'occupation_Craft-repair',\n", " 'occupation_Exec-managerial', 'occupation_Farming-fishing',\n", " 'occupation_Handlers-cleaners', 'occupation_Machine-op-inspct',\n", " 'occupation_Other-service', 'occupation_Priv-house-serv',\n", " 'occupation_Prof-specialty', 'occupation_Protective-serv',\n", " 'occupation_Sales', 'occupation_Tech-support',\n", " 'occupation_Transport-moving', 'income_<=50K', 'income_>50K'],\n", " dtype='object')\n", "age int64\n", "hours-per-week int64\n", "workclass_? bool\n", "workclass_Federal-gov bool\n", "workclass_Local-gov bool\n", "workclass_Never-worked bool\n", "workclass_Private bool\n", "workclass_Self-emp-inc bool\n", "workclass_Self-emp-not-inc bool\n", "workclass_State-gov bool\n", "workclass_Without-pay bool\n", "education_10th bool\n", "education_11th bool\n", "education_12th bool\n", "education_1st-4th bool\n", "education_5th-6th bool\n", "education_7th-8th bool\n", "education_9th bool\n", "education_Assoc-acdm bool\n", "education_Assoc-voc bool\n", "education_Bachelors bool\n", "education_Doctorate bool\n", "education_HS-grad bool\n", "education_Masters bool\n", "education_Preschool bool\n", "education_Prof-school bool\n", "education_Some-college bool\n", "capital-gain-category_cat1 bool\n", "capital-gain-category_cat2 bool\n", "capital-gain-category_cat3 bool\n", "capital-gain-category_cat4 bool\n", "occupation_? bool\n", "occupation_Adm-clerical bool\n", "occupation_Armed-Forces bool\n", "occupation_Craft-repair bool\n", "occupation_Exec-managerial bool\n", "occupation_Farming-fishing bool\n", "occupation_Handlers-cleaners bool\n", "occupation_Machine-op-inspct bool\n", "occupation_Other-service bool\n", "occupation_Priv-house-serv bool\n", "occupation_Prof-specialty bool\n", "occupation_Protective-serv bool\n", "occupation_Sales bool\n", "occupation_Tech-support bool\n", "occupation_Transport-moving bool\n", "income_<=50K bool\n", "income_>50K bool\n", "dtype: object\n" ] } ], "source": [ "data_dummies = pd.get_dummies(data)\n", "print(data.shape)\n", "print(data_dummies.shape)\n", "print(data_dummies.columns)\n", "print(data_dummies.dtypes)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can see that the continuous features *age* and *hours-per-week* were not touched, while the categorical features were expanded into one new feature for each possible value. The *get_dummies* function in pandas treats all numbers as continuous and will not create dummy variables for them. If we have a categorical feature with values as numbers, we should then explicitely list it for dummy coding." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's expand the output display for pandas, such that all the columns are shown when we print the dataframe. By default, not all columns will be displayed." ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "pd.set_option('display.max_columns', None)" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "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", "
agehours-per-weekworkclass_?workclass_Federal-govworkclass_Local-govworkclass_Never-workedworkclass_Privateworkclass_Self-emp-incworkclass_Self-emp-not-incworkclass_State-govworkclass_Without-payeducation_10theducation_11theducation_12theducation_1st-4theducation_5th-6theducation_7th-8theducation_9theducation_Assoc-acdmeducation_Assoc-voceducation_Bachelorseducation_Doctorateeducation_HS-gradeducation_Masterseducation_Preschooleducation_Prof-schooleducation_Some-collegecapital-gain-category_cat1capital-gain-category_cat2capital-gain-category_cat3capital-gain-category_cat4occupation_?occupation_Adm-clericaloccupation_Armed-Forcesoccupation_Craft-repairoccupation_Exec-managerialoccupation_Farming-fishingoccupation_Handlers-cleanersoccupation_Machine-op-inspctoccupation_Other-serviceoccupation_Priv-house-servoccupation_Prof-specialtyoccupation_Protective-servoccupation_Salesoccupation_Tech-supportoccupation_Transport-movingincome_<=50Kincome_>50K
03940FalseFalseFalseFalseFalseFalseFalseTrueFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseTrueFalseFalseFalseFalseFalseFalseFalseTrueFalseFalseFalseTrueFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseTrueFalse
15013FalseFalseFalseFalseFalseFalseTrueFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseTrueFalseFalseFalseFalseFalseFalseTrueFalseFalseFalseFalseFalseFalseFalseTrueFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseTrueFalse
23840FalseFalseFalseFalseTrueFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseTrueFalseFalseFalseFalseTrueFalseFalseFalseFalseFalseFalseFalseFalseFalseTrueFalseFalseFalseFalseFalseFalseFalseFalseTrueFalse
35340FalseFalseFalseFalseTrueFalseFalseFalseFalseFalseTrueFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseTrueFalseFalseFalseFalseFalseFalseFalseFalseFalseTrueFalseFalseFalseFalseFalseFalseFalseFalseTrueFalse
42840FalseFalseFalseFalseTrueFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseTrueFalseFalseFalseFalseFalseFalseTrueFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseTrueFalseFalseFalseFalseTrueFalse
\n", "
" ], "text/plain": [ " age hours-per-week workclass_? workclass_Federal-gov \\\n", "0 39 40 False False \n", "1 50 13 False False \n", "2 38 40 False False \n", "3 53 40 False False \n", "4 28 40 False False \n", "\n", " workclass_Local-gov workclass_Never-worked workclass_Private \\\n", "0 False False False \n", "1 False False False \n", "2 False False True \n", "3 False False True \n", "4 False False True \n", "\n", " workclass_Self-emp-inc workclass_Self-emp-not-inc workclass_State-gov \\\n", "0 False False True \n", "1 False True False \n", "2 False False False \n", "3 False False False \n", "4 False False False \n", "\n", " workclass_Without-pay education_10th education_11th education_12th \\\n", "0 False False False False \n", "1 False False False False \n", "2 False False False False \n", "3 False False True False \n", "4 False False False False \n", "\n", " education_1st-4th education_5th-6th education_7th-8th education_9th \\\n", "0 False False False False \n", "1 False False False False \n", "2 False False False False \n", "3 False False False False \n", "4 False False False False \n", "\n", " education_Assoc-acdm education_Assoc-voc education_Bachelors \\\n", "0 False False True \n", "1 False False True \n", "2 False False False \n", "3 False False False \n", "4 False False True \n", "\n", " education_Doctorate education_HS-grad education_Masters \\\n", "0 False False False \n", "1 False False False \n", "2 False True False \n", "3 False False False \n", "4 False False False \n", "\n", " education_Preschool education_Prof-school education_Some-college \\\n", "0 False False False \n", "1 False False False \n", "2 False False False \n", "3 False False False \n", "4 False False False \n", "\n", " capital-gain-category_cat1 capital-gain-category_cat2 \\\n", "0 False True \n", "1 True False \n", "2 True False \n", "3 True False \n", "4 True False \n", "\n", " capital-gain-category_cat3 capital-gain-category_cat4 occupation_? \\\n", "0 False False False \n", "1 False False False \n", "2 False False False \n", "3 False False False \n", "4 False False False \n", "\n", " occupation_Adm-clerical occupation_Armed-Forces occupation_Craft-repair \\\n", "0 True False False \n", "1 False False False \n", "2 False False False \n", "3 False False False \n", "4 False False False \n", "\n", " occupation_Exec-managerial occupation_Farming-fishing \\\n", "0 False False \n", "1 True False \n", "2 False False \n", "3 False False \n", "4 False False \n", "\n", " occupation_Handlers-cleaners occupation_Machine-op-inspct \\\n", "0 False False \n", "1 False False \n", "2 True False \n", "3 True False \n", "4 False False \n", "\n", " occupation_Other-service occupation_Priv-house-serv \\\n", "0 False False \n", "1 False False \n", "2 False False \n", "3 False False \n", "4 False False \n", "\n", " occupation_Prof-specialty occupation_Protective-serv occupation_Sales \\\n", "0 False False False \n", "1 False False False \n", "2 False False False \n", "3 False False False \n", "4 True False False \n", "\n", " occupation_Tech-support occupation_Transport-moving income_<=50K \\\n", "0 False False True \n", "1 False False True \n", "2 False False True \n", "3 False False True \n", "4 False False True \n", "\n", " income_>50K \n", "0 False \n", "1 False \n", "2 False \n", "3 False \n", "4 False " ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data_dummies.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this example, we called *get_dummies* on a DataFrame containing both the training and the test data. This is important to ensure categorical values are represented in the same way in the training set and the test set. \n", "We could have done it separetely, but in that case we would need to ensure that both datasets contain the same categories for all features." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Method 2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*Sklearn* has also a function for one-hot encoding. *OneHotEncoder* assumes all features are categorical." ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [], "source": [ "from sklearn.preprocessing import OneHotEncoder" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us select only categorical features using `select_dtypes` method which returns a subset of the DataFrame’s columns based on the column dtypes. We can define with *include* or *exclude* a list of data types to be included or excluded." ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['workclass', 'education', 'capital-gain-category', 'occupation'], dtype='object')" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X=data.drop(columns='income')\n", "y=data['income']\n", "categorical=X.select_dtypes(exclude='number').columns\n", "categorical" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['age', 'hours-per-week'], dtype='object')" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "numerical= X.select_dtypes(include='number').columns\n", "numerical" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can now quickly visualize the different values that each categorical variable can take:" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXYAAAGtCAYAAAACp1+JAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAY2JJREFUeJztvQncVHP///8hrUIKhZSISqhblrKkTYko1Y3bUpSlVEruIpIUcpct2iwt3PZ9C5WQvbITsmW7aUEb7XV+j+fn//3M/1zTXFdzzpxppjOv5+NxHtfMmXN95sxZ3uf9ea/beZ7nGSGEELFh+1zvgBBCiGiRYBdCiJghwS6EEDFDgl0IIWKGBLsQQsQMCXYhhIgZEuxCCBEzJNiFECJmSLALIUTMkGAXIk+ZMmWK2W677cwPP/yQ610R2xgS7ELkmBtvvNE888wzud4NESO2U60YIXJLxYoVTefOna2G7mfjxo1m/fr1pmzZslZzFyJddkh7SyHEVqVUqVJ2ESIoMsWIvOWjjz4ybdu2NTvvvLPValu2bGnee++9ItssW7bMXHbZZWbfffe1mm316tVNly5dzO+//57YZs2aNWbo0KHmwAMPNOXKlTN77rmn6dixo/nuu+/s56+//rrViPnrB9s26/2a9HnnnWf35fvvvzdt2rQxO+64o9lrr73MsGHDTPLk9+abbzZHH320qVKliilfvrxp1KiReeKJJ4psw/h///23ue++++xrFr6jJBv7uHHjTP369e3v5bt79eplj4OfZs2amYMPPth88cUXpnnz5qZChQpm7733NiNHjgx5NsS2hDR2kZfMmzfPHHfccVaoDxw40JQuXdrcddddVmDNmjXLHHXUUeavv/6y23z55ZemW7du5rDDDrMC/bnnnjO//PKL2W233aw5o127dmbmzJnmzDPPNH379jUrV640M2bMMJ9//rnZf//9A+8bY5544ommcePGVlC+/PLL5tprrzUbNmywAt4xevRoc+qpp5qzzz7brFu3zjzyyCPmn//8p3nhhRfMySefbLf573//ay644AJz5JFHmosuusiuK2mfeEBdd911plWrVqZnz55m/vz5Zvz48Wbu3Lnm7bfftsfJsXTpUrufPMROP/10+1C54oorzCGHHGIfmCLGYGMXIt/o0KGDV6ZMGe+7775LrPv111+9nXbayWvatKl9P2TIEFRk76mnntrs/zdt2mT/Tpo0yW5z6623FrvNa6+9Zrfhr58FCxbY9ZMnT06s69q1q13Xp0+fIuOcfPLJdn+XLFmSWL9q1aoi461bt847+OCDvRYtWhRZv+OOO9pxk+F7+S72AxYvXmy/o3Xr1t7GjRsT240ZM8Zux291HH/88Xbd/fffn1i3du1ar1q1al6nTp02+y4RL2SKEXkHGvH06dNNhw4dzH777ZdYjwnlrLPOMm+99ZZZsWKFefLJJ02DBg3MaaedttkYztnINmjuffr0KXabMPTu3bvIOLxHK3/llVcS6zG/+LXn5cuX2xnGhx9+GOo7GZvv6Nevn9l++///1r3wwgvtzGbq1KlFtsdkdM455yTelylTxs4MMCOJeCPBLvKOJUuWmFWrVpk6deps9lm9evXMpk2bzM8//2xt5NiRS4JtGGeHHaKzOiJU/Q8cwH4Pfns4JhfMNdj1K1eubHbffXdrNkHAh+HHH3+0f5OPCwKb/XGfO/A3JD+8dt11V/uQEfFGgl0UPMVp7swcwvLmm29a+zpCHWfniy++aO36zDi2VoRxcRE1inCOP3KeirwDzZYoDhyDyXz11VdWY95nn32skxEHaEmwzezZs208uN+xmKzFQnJkSbIG7GDGgDnDaenw9ddf279E5zgTEEJ92rRpNnrFMXny5NAmoZo1a9q/HBf/jAHzzIIFC6xDVQiQxi7yDjTN1q1bm2effbaIaWPRokXmoYceMscee6y1KXfq1Ml88skn5umnny5WK2UbImXGjBlT7DYITL7zjTfeKPI5mnZx+MdjHN7z4CAk0/0GBLZf6+e3pMowJWQy+aGSCgQ3Zpc77rijiNY9ceJEa95xkTZCSGMXecn1119vTRcI8UsuucTayAl3XLt2bSIWe8CAATaEjxBCwh2JE//zzz9tuOOECROsY5WY9vvvv9/079/fzJkzxzoviRvHEcm47du3N7vssosd484777TCGC0f+/jixYtT7huaOCGOXbt2tWGXL730knVcXnXVVXa2AQjZW2+91YYbYn5hrLFjx5ratWubTz/9tMh47Df7w/bEpdeqVcuOmwxjDxo0yIY7Mi6mHrR3HkBHHHFEEUepKHByHZYjRHF8+OGHXps2bbyKFSt6FSpU8Jo3b+698847Rbb5448/vN69e3t77723DQWsXr26DR38/fffi4QdXn311V6tWrW80qVL25C/zp07FwmlJEyRMEC+Z9ddd/Uuvvhi7/PPP08Z7kh4Iv9L2CHbV61a1bv22muLhCDCxIkTvQMOOMArW7asV7duXTsO2yXfdl999ZUN4Sxfvrz9zIU+Joc7+sMbGY/fwnf37NnTW7p0aZFtCHesX7/+ZseUsWvWrBnwTIhtDdWKESIAZIUySyA5Soh8RTZ2IYSIGRLsQggRMyTYhRAiZsjGLoQQMUMauxBCxIzYxrGTHfjrr7+anXbaSd1nhBCxAAMLZafJd/AXgisYwY5QJ+1cCCHiBkXwKPJWcIIdTd0dANLPhRBiW4dy1SisTr4VnGB35heEugS7ECJObMm8LOepEELEDAl2IYSIGRLsQggRMyTYhRAiZkiwCyFEzJBgF0KImCHBLoQQMUOCXQghYkZsE5SKY98rp6a13Q83qTGwEGLbRBq7EELEDAl2IYSIGQVniskGMu8IIWKjsd900022GE2/fv0S69asWWN69eplqlSpYipWrGg6depkFi1aVOT/fvrpJ3PyySebChUqmD322MMMGDDAbNiwocg2r7/+ujnssMNM2bJlTe3atc2UKVNMIT0o0l2EECIywT537lxz1113mUMPPbTI+ssuu8w8//zz5vHHHzezZs2yddE7duyY+Hzjxo1WqK9bt86888475r777rNCe8iQIYltFixYYLdp3ry5+fjjj+2D44ILLjDTpk0Lu7tCCFEwhBLsf/31lzn77LPNPffcY3bdddfE+uXLl5uJEyeaW2+91bRo0cI0atTITJ482Qrw9957z24zffp088UXX5gHHnjANGzY0LRt29YMHz7cjB071gp7mDBhgqlVq5a55ZZbTL169Uzv3r1N586dzW233RbV7xZCiNgSSrBjakGjbtWqVZH1H3zwgVm/fn2R9XXr1jU1atQw7777rn3P30MOOcRUrVo1sU2bNm1sAfl58+Yltkkem23cGKlYu3atHcO/CCFEIRLYefrII4+YDz/80Jpiklm4cKEpU6aMqVSpUpH1CHE+c9v4hbr73H1W0jYI69WrV5vy5ctv9t0jRoww1113XdCfI4QQha2x02aub9++5sEHHzTlypUz+cSgQYOsKcgt7KsQQhQigQQ7ppbFixfbaJUddtjBLjhI77jjDvsarRo7+bJly4r8H1Ex1apVs6/5mxwl495v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YBdCiJghwS6EEDFDRcCE2EaKioEKi4l0kMYuhBAxQ4JdCCFihgS7EELEDAl2IYSIGRLsQggRMyTYhRAiZkiwCyFEzJBgF0KImCHBLoQQMUOCXQghYoYEuxBCxAzVihGigOvPqPZMPJHGLoQQMUOCXQghYoYEuxBCxAwJdiGEiBkS7EIIETMk2IUQImZIsAshRMyQYBdCiJghwS6EEDFDgl0IIWKGBLsQQsQMCXYhhIgZEuxCCBEzJNiFECJmSLALIUShC/Y33njDnHLKKWavvfYy2223nXnmmWeKfO55nhkyZIjZc889Tfny5U2rVq3MN998U2SbP//805x99tlm5513NpUqVTLdu3c3f/31V5FtPv30U3PccceZcuXKmX322ceMHDky7G8UQoiCIrBg//vvv02DBg3M2LFjU36OAL7jjjvMhAkTzOzZs82OO+5o2rRpY9asWZPYBqE+b948M2PGDPPCCy/Yh8VFF12U+HzFihWmdevWpmbNmuaDDz4wo0aNMkOHDjV333132N8phBAFQ+AOSm3btrVLKtDWb7/9djN48GDTvn17u+7+++83VatWtZr9mWeeab788kvz8ssvm7lz55rDDz/cbnPnnXeak046ydx88812JvDggw+adevWmUmTJpkyZcqY+vXrm48//tjceuutRR4AftauXWsX/8NBCCEKkUht7AsWLDALFy605hfHLrvsYo466ijz7rvv2vf8xfzihDqw/fbbb281fLdN06ZNrVB3oPXPnz/fLF26NOV3jxgxwn6XWzDfCCFEIRJpz1OEOqCh++G9+4y/e+yxR9Gd2GEHU7ly5SLb1KpVa7Mx3Ge77rrrZt89aNAg079//yIau4S7ENGhPqrbDrFpZl22bFm7CCFEoROpKaZatWr276JFi4qs5737jL+LFy8u8vmGDRtspIx/m1Rj+L9DCCHEVtDYMZ8geGfOnGkaNmyYMIlgO+/Zs6d936RJE7Ns2TIb7dKoUSO77tVXXzWbNm2ytni3zdVXX23Wr19vSpcubdcRQVOnTp2UZhghRHxNOyDzTpY1duLNiVBhcQ5TXv/00082rr1fv37m+uuvN88995z57LPPTJcuXWykS4cOHez29erVMyeeeKK58MILzZw5c8zbb79tevfubSNm2A7OOuss6zglvp2wyEcffdSMHj26iA1dCCFERBr7+++/b5o3b55474Rt165dzZQpU8zAgQNtrDthiWjmxx57rA1vJNHIQTgjwrxly5Y2GqZTp0429t1BVMv06dNNr169rFa/22672aSn4kIdhRBCZCDYmzVrZuPViwOtfdiwYXYpDiJgHnrooRK/59BDDzVvvvlm0N0TQoiCR7VihBAiZkiwCyFEzJBgF0KImCHBLoQQMUOCXQghYoYEuxBCxAwJdiGEiBkS7EIIETMk2IUQImZIsAshRMyQYBdCiJgRm0YbQgihLk//H9LYhRAiZkiwCyFEzJBgF0KImCHBLoQQMUOCXQghYoYEuxBCxAwJdiGEiBkS7EIIETMk2IUQImZIsAshRMyQYBdCiJghwS6EEDFDgl0IIWKGBLsQQsQMCXYhhIgZEuxCCBEzJNiFECJmSLALIUTMkGAXQoiYIcEuhBAxQ4JdCCFihgS7EELEDAl2IYSIGRLsQggRMyTYhRAiZkiwCyFEzNgh1zsghBD5zL5XTk1rux9uOtnkC9LYhRAiZkiwCyFEzJBgF0KImJHXgn3s2LFm3333NeXKlTNHHXWUmTNnTq53SQgh8p68FeyPPvqo6d+/v7n22mvNhx9+aBo0aGDatGljFi9enOtdE0KIvCZvo2JuvfVWc+GFF5rzzz/fvp8wYYKZOnWqmTRpkrnyyis3237t2rV2cSxfvtz+XbFiRZHtNq1dldb3J/9fSUQ9ZrrjZWNM/e6tP6Z+d2H97kxw3+F5XskbennI2rVrvVKlSnlPP/10kfVdunTxTj311JT/c+211/JLtWjRosWL+/Lzzz+XKEPzUmP//fffzcaNG03VqlWLrOf9V199lfJ/Bg0aZE03jk2bNpk///zTVKlSxWy33XYlPgH32Wcf8/PPP5udd945kv3fFsbcFvYxG2NuC/uYjTG3hX3MxpgrtoF9DDImmvrKlSvNXnvtVeJ4eSnYw1C2bFm7+KlUqVLa/8/BjOokbUtjbgv7mI0xt4V9zMaY28I+ZmPMnbeBfUx3zF122WXbdJ7utttuplSpUmbRokVF1vO+WrVqOdsvIYTYFshLwV6mTBnTqFEjM3PmzCKmFd43adIkp/smhBD5Tt6aYrCXd+3a1Rx++OHmyCOPNLfffrv5+++/E1EyUYH5hpDKZDNO3MfcFvYxG2NuC/uYjTG3hX3Mxphlt4F9zMaY2+FBNXnKmDFjzKhRo8zChQtNw4YNzR133GETlYQQQmyjgl0IIURMbOxCCCHCI8EuhBAxQ4JdCCFihgS7EELEDAn2CNiwYYO5//77N0uoEkKUzH777Wf++OOPzdYvW7bMfibCoaiYiKhQoYL58ssvTc2aNU0hQ42fzz77zB6HXXfdNfQ43377rfnuu+9M06ZNTfny5W2NjJJq/mxNfvjhB/Prr7/a/IoddogmFeS0005L+ftYRz+C2rVrm7POOsvUqVPHxIntt9/ehjPvscceRdajJNWoUaNIxVaRPtLYI4Kb/OOPPzb5BIK1cuXKaS1h6devn5k4cWJCqB9//PHmsMMOswWNXn/99cDjob21atXKHHjggeakk04yv/32m13fvXt3c/nll+dcM3z44YfNAQccYI499libPIdQigLqf7z66qu29wDCnOWjjz6y65gR0p+AngRvv/22iQPPPfecXWDatGmJ9yxPP/20GT58uG2yE5ZWrVqZKVOmRFZKd82aNSZKXn75ZfPWW28VaSpErg4P76VLl2Y8fsFq7Fw03bp1M+edd57VDDLlsccesxUmL7vsMlsOYccddyzy+aGHHprWOO5iT4dTTz21xM/vu+++tMciyzcM1atXN88884wVcvzt1auXee2118x///tfK5SCCqIuXbrYZir33nuvqVevnvnkk0+s4OXmJxt53rx5OdUM0ZjPOecc07t3b7s/7733nnn++eetRp0J9BhACJGUx766Mhp9+/Y1O+20k7nhhhtMjx497O/3C4R0BEjFihXtg8gJkHvuucccdNBB9nXQWVVUMwv3G1NRunRpe3/ecsstpl27diYMffv2tfckfRlOPvlke85QFBg7DBTm6tixozn77LNNy5YtS9z/dDjkkEPMf/7zH7tPzHCPOOIIez1x79StW9dMnjw5o/Hzsh771uC2227zGjRoYOu+t2rVynv44Ye9NWvWhB5vu+2222zZfvvtE38zGae4sfOBsmXLJmpDX3jhhV7fvn3t6++//97baaedAo9XtWpV7+OPP7avK1as6H333Xf2NX933HHHwOM9++yzduGY3X///Yn3LE899ZTXq1cv78ADD0x7vAoVKngLFixIvO/WrVvifHzwwQde3bp1Q52b3XbbzZs/f/5m61lXpUoV+/rTTz/1dtlll0DjHnzwwd7UqVMT/8/5GjRokNe4cWPvvPPOC7yfXbt2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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "for categorical_variable in categorical:\n", " X[categorical_variable].value_counts().plot(kind='bar', figsize=(4,3), title=categorical_variable)\n", " plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*OneHotEncoder* has a parameter *drop* with which we can specify whether we want to drop one of the dummy variables in order to avoid collinearity. We could do this with *OneHotEncoder(drop ='first')*. Note that this is useful in situations where perfectly collinear features cause problems, such as when feeding the resulting data into an unregularized linear regression model. (When features are highly correlated, small changes in the data can cause large fluctuations in the regression coefficients, and also it becomes harder to determine the importance of each feature). However, dropping one category breaks the symmetry of the original representation and can therefore induce a bias in downstream models, for instance for penalized linear classification or regression model or decision trees.\n", "Let's fit *OneHotEncoder* to categorical variables only.\n", "We will also change the default value of the parameter *sparse_output* which defines whether the encoder will return a sparse matrix or an array. Since we will later convert the output of the encoder to pandas dataframe, we want the output to be an array." ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[array(['?', 'Federal-gov', 'Local-gov', 'Never-worked', 'Private',\n", " 'Self-emp-inc', 'Self-emp-not-inc', 'State-gov', 'Without-pay'],\n", " dtype=object),\n", " array(['10th', '11th', '12th', '1st-4th', '5th-6th', '7th-8th', '9th',\n", " 'Assoc-acdm', 'Assoc-voc', 'Bachelors', 'Doctorate', 'HS-grad',\n", " 'Masters', 'Preschool', 'Prof-school', 'Some-college'],\n", " dtype=object),\n", " array(['cat1', 'cat2', 'cat3', 'cat4'], dtype=object),\n", " array(['?', 'Adm-clerical', 'Armed-Forces', 'Craft-repair',\n", " 'Exec-managerial', 'Farming-fishing', 'Handlers-cleaners',\n", " 'Machine-op-inspct', 'Other-service', 'Priv-house-serv',\n", " 'Prof-specialty', 'Protective-serv', 'Sales', 'Tech-support',\n", " 'Transport-moving'], dtype=object)]" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ohe = OneHotEncoder(drop='first', sparse_output=False)\n", "ohe.fit(X[categorical])\n", "ohe.categories_" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The attribute *categories_* lists the categories of each feature determined during fitting (in order of the features in X and corresponding with the output of transform). This includes the category specified in drop (if any)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let's do `transform`:" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array(['workclass_Federal-gov', 'workclass_Local-gov',\n", " 'workclass_Never-worked', 'workclass_Private',\n", " 'workclass_Self-emp-inc', 'workclass_Self-emp-not-inc',\n", " 'workclass_State-gov', 'workclass_Without-pay', 'education_11th',\n", " 'education_12th', 'education_1st-4th', 'education_5th-6th',\n", " 'education_7th-8th', 'education_9th', 'education_Assoc-acdm',\n", " 'education_Assoc-voc', 'education_Bachelors',\n", " 'education_Doctorate', 'education_HS-grad', 'education_Masters',\n", " 'education_Preschool', 'education_Prof-school',\n", " 'education_Some-college', 'capital-gain-category_cat2',\n", " 'capital-gain-category_cat3', 'capital-gain-category_cat4',\n", " 'occupation_Adm-clerical', 'occupation_Armed-Forces',\n", " 'occupation_Craft-repair', 'occupation_Exec-managerial',\n", " 'occupation_Farming-fishing', 'occupation_Handlers-cleaners',\n", " 'occupation_Machine-op-inspct', 'occupation_Other-service',\n", " 'occupation_Priv-house-serv', 'occupation_Prof-specialty',\n", " 'occupation_Protective-serv', 'occupation_Sales',\n", " 'occupation_Tech-support', 'occupation_Transport-moving'],\n", " dtype=object)" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_cat= ohe.transform(X[categorical])\n", "encoder_feature_names = ohe.get_feature_names_out(categorical)\n", "encoder_feature_names" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's now convert the array to pandas dataframe:" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [], "source": [ "X_cat= pd.DataFrame(X_cat, columns = encoder_feature_names)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's now concatenate the transformed categorical with unchanged numerical variables." ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(32561, 42)\n" ] } ], "source": [ "X_num = X[numerical]\n", "X_enc = pd.concat([X_num, X_cat], axis = 1)\n", "print(X_enc.shape)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us now see how the encoded data frame looks like. As we saw we now have 40 columns. " ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "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", "
agehours-per-weekworkclass_Federal-govworkclass_Local-govworkclass_Never-workedworkclass_Privateworkclass_Self-emp-incworkclass_Self-emp-not-incworkclass_State-govworkclass_Without-payeducation_11theducation_12theducation_1st-4theducation_5th-6theducation_7th-8theducation_9theducation_Assoc-acdmeducation_Assoc-voceducation_Bachelorseducation_Doctorateeducation_HS-gradeducation_Masterseducation_Preschooleducation_Prof-schooleducation_Some-collegecapital-gain-category_cat2capital-gain-category_cat3capital-gain-category_cat4occupation_Adm-clericaloccupation_Armed-Forcesoccupation_Craft-repairoccupation_Exec-managerialoccupation_Farming-fishingoccupation_Handlers-cleanersoccupation_Machine-op-inspctoccupation_Other-serviceoccupation_Priv-house-servoccupation_Prof-specialtyoccupation_Protective-servoccupation_Salesoccupation_Tech-supportoccupation_Transport-moving
039400.00.00.00.00.00.01.00.00.00.00.00.00.00.00.00.01.00.00.00.00.00.00.01.00.00.01.00.00.00.00.00.00.00.00.00.00.00.00.00.0
150130.00.00.00.00.01.00.00.00.00.00.00.00.00.00.00.01.00.00.00.00.00.00.00.00.00.00.00.00.01.00.00.00.00.00.00.00.00.00.00.0
238400.00.00.01.00.00.00.00.00.00.00.00.00.00.00.00.00.00.01.00.00.00.00.00.00.00.00.00.00.00.00.01.00.00.00.00.00.00.00.00.0
353400.00.00.01.00.00.00.00.01.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.01.00.00.00.00.00.00.00.00.0
428400.00.00.01.00.00.00.00.00.00.00.00.00.00.00.00.01.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.01.00.00.00.00.0
\n", "
" ], "text/plain": [ " age hours-per-week workclass_Federal-gov workclass_Local-gov \\\n", "0 39 40 0.0 0.0 \n", "1 50 13 0.0 0.0 \n", "2 38 40 0.0 0.0 \n", "3 53 40 0.0 0.0 \n", "4 28 40 0.0 0.0 \n", "\n", " workclass_Never-worked workclass_Private workclass_Self-emp-inc \\\n", "0 0.0 0.0 0.0 \n", "1 0.0 0.0 0.0 \n", "2 0.0 1.0 0.0 \n", "3 0.0 1.0 0.0 \n", "4 0.0 1.0 0.0 \n", "\n", " workclass_Self-emp-not-inc workclass_State-gov workclass_Without-pay \\\n", "0 0.0 1.0 0.0 \n", "1 1.0 0.0 0.0 \n", "2 0.0 0.0 0.0 \n", "3 0.0 0.0 0.0 \n", "4 0.0 0.0 0.0 \n", "\n", " education_11th education_12th education_1st-4th education_5th-6th \\\n", "0 0.0 0.0 0.0 0.0 \n", "1 0.0 0.0 0.0 0.0 \n", "2 0.0 0.0 0.0 0.0 \n", "3 1.0 0.0 0.0 0.0 \n", "4 0.0 0.0 0.0 0.0 \n", "\n", " education_7th-8th education_9th education_Assoc-acdm \\\n", "0 0.0 0.0 0.0 \n", "1 0.0 0.0 0.0 \n", "2 0.0 0.0 0.0 \n", "3 0.0 0.0 0.0 \n", "4 0.0 0.0 0.0 \n", "\n", " education_Assoc-voc education_Bachelors education_Doctorate \\\n", "0 0.0 1.0 0.0 \n", "1 0.0 1.0 0.0 \n", "2 0.0 0.0 0.0 \n", "3 0.0 0.0 0.0 \n", "4 0.0 1.0 0.0 \n", "\n", " education_HS-grad education_Masters education_Preschool \\\n", "0 0.0 0.0 0.0 \n", "1 0.0 0.0 0.0 \n", "2 1.0 0.0 0.0 \n", "3 0.0 0.0 0.0 \n", "4 0.0 0.0 0.0 \n", "\n", " education_Prof-school education_Some-college capital-gain-category_cat2 \\\n", "0 0.0 0.0 1.0 \n", "1 0.0 0.0 0.0 \n", "2 0.0 0.0 0.0 \n", "3 0.0 0.0 0.0 \n", "4 0.0 0.0 0.0 \n", "\n", " capital-gain-category_cat3 capital-gain-category_cat4 \\\n", "0 0.0 0.0 \n", "1 0.0 0.0 \n", "2 0.0 0.0 \n", "3 0.0 0.0 \n", "4 0.0 0.0 \n", "\n", " occupation_Adm-clerical occupation_Armed-Forces occupation_Craft-repair \\\n", "0 1.0 0.0 0.0 \n", "1 0.0 0.0 0.0 \n", "2 0.0 0.0 0.0 \n", "3 0.0 0.0 0.0 \n", "4 0.0 0.0 0.0 \n", "\n", " occupation_Exec-managerial occupation_Farming-fishing \\\n", "0 0.0 0.0 \n", "1 1.0 0.0 \n", "2 0.0 0.0 \n", "3 0.0 0.0 \n", "4 0.0 0.0 \n", "\n", " occupation_Handlers-cleaners occupation_Machine-op-inspct \\\n", "0 0.0 0.0 \n", "1 0.0 0.0 \n", "2 1.0 0.0 \n", "3 1.0 0.0 \n", "4 0.0 0.0 \n", "\n", " occupation_Other-service occupation_Priv-house-serv \\\n", "0 0.0 0.0 \n", "1 0.0 0.0 \n", "2 0.0 0.0 \n", "3 0.0 0.0 \n", "4 0.0 0.0 \n", "\n", " occupation_Prof-specialty occupation_Protective-serv occupation_Sales \\\n", "0 0.0 0.0 0.0 \n", "1 0.0 0.0 0.0 \n", "2 0.0 0.0 0.0 \n", "3 0.0 0.0 0.0 \n", "4 1.0 0.0 0.0 \n", "\n", " occupation_Tech-support occupation_Transport-moving \n", "0 0.0 0.0 \n", "1 0.0 0.0 \n", "2 0.0 0.0 \n", "3 0.0 0.0 \n", "4 0.0 0.0 " ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_enc.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "OneHotEncoder supports aggregating infrequent categories into a single output for each feature. The parameters to enable the gathering of infrequent categories are *min_frequency* and *max_categories*.\n", "\n", "- *min_frequency* is either an integer greater or equal to 1, or a float in the interval (0, 1). If *min_frequency* is an integer, categories with a cardinality smaller than *min_frequency* will be considered infrequent. If *min_frequency* is a float, categories with a cardinality smaller than this fraction of the total number of samples will be considered infrequent. The default value is 1, which means every category is encoded separately.\n", "\n", "- *max_categories* is either None or any integer greater than 1. This parameter sets an upper limit to the number of output features for each input feature. *max_categories* includes the feature that combines infrequent categories." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, let's set for our one-hot encoder that if a category appears in less than 1% of all the data, it should be considered infrequent." ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array(['workclass_?', 'workclass_Federal-gov', 'workclass_Local-gov',\n", " 'workclass_Private', 'workclass_Self-emp-inc',\n", " 'workclass_Self-emp-not-inc', 'workclass_State-gov',\n", " 'workclass_infrequent_sklearn', 'education_10th', 'education_11th',\n", " 'education_12th', 'education_5th-6th', 'education_7th-8th',\n", " 'education_9th', 'education_Assoc-acdm', 'education_Assoc-voc',\n", " 'education_Bachelors', 'education_Doctorate', 'education_HS-grad',\n", " 'education_Masters', 'education_Prof-school',\n", " 'education_Some-college', 'education_infrequent_sklearn',\n", " 'capital-gain-category_cat1', 'capital-gain-category_cat2',\n", " 'capital-gain-category_cat4',\n", " 'capital-gain-category_infrequent_sklearn', 'occupation_?',\n", " 'occupation_Adm-clerical', 'occupation_Craft-repair',\n", " 'occupation_Exec-managerial', 'occupation_Farming-fishing',\n", " 'occupation_Handlers-cleaners', 'occupation_Machine-op-inspct',\n", " 'occupation_Other-service', 'occupation_Prof-specialty',\n", " 'occupation_Protective-serv', 'occupation_Sales',\n", " 'occupation_Tech-support', 'occupation_Transport-moving',\n", " 'occupation_infrequent_sklearn'], dtype=object)" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ohe_inf = OneHotEncoder(min_frequency=0.01, sparse_output=False)\n", "ohe_inf.fit(X[categorical])\n", "ohe_inf.get_feature_names_out()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We see from the previous output that for the feature occupation we have now a category called 'occupation_infrequent_sklearn'. We can check which categories are aggregated in this category:" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[array(['Never-worked', 'Without-pay'], dtype=object),\n", " array(['1st-4th', 'Preschool'], dtype=object),\n", " array(['cat3'], dtype=object),\n", " array(['Armed-Forces', 'Priv-house-serv'], dtype=object)]" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ohe_inf.infrequent_categories_" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We see that two categories 'Armed-Forces' and 'Priv-house-serv' are grouped. Checking the presence of these categories in the data we can confirm that it is less than 1%." ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "occupation\n", "Prof-specialty 0.127146\n", "Craft-repair 0.125887\n", "Exec-managerial 0.124873\n", "Adm-clerical 0.115783\n", "Sales 0.112097\n", "Other-service 0.101195\n", "Machine-op-inspct 0.061485\n", "? 0.056601\n", "Transport-moving 0.049046\n", "Handlers-cleaners 0.042075\n", "Farming-fishing 0.030527\n", "Tech-support 0.028500\n", "Protective-serv 0.019932\n", "Priv-house-serv 0.004576\n", "Armed-Forces 0.000276\n", "Name: proportion, dtype: float64" ] }, "execution_count": 59, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X['occupation'].value_counts(normalize=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "These levels were grouped together not because they are similar, but because we don't really have enough data to say much about them." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If we fitted the *OneHotEncoder* on the training data, as we should do, if some category is very rare, it might appear only when we transform test data. The behavior for this case is handled with the parameter *handle_unknown*:\n", "- error: This is the default behavior, and an error is raised if an unknown category is present during transform.\n", "- ignore: When an unknown category is encountered during transform, the resulting one-hot encoded columns for this feature will be all zeros. This means that unknown categories will have the same mapping as the dropped category. For this case, we should not drop any category with the *drop* parameter (as the dropped category is represented with all the zeros of the dummy variables). \n", "- infrequent_if_exist: When an unknown category is encountered during transform, the resulting one-hot encoded columns for this feature will map to the infrequent category if it exists. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Ordinal encoding" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Categorical ordinal variables have categories that follow a logical ordering. Some examples of ordinal data include:\n", "- Socioeconomic status (low income, middle income or high income)\n", "- Education level (high school, bachelor’s degree, master’s degree or PhD)\n", "- Satisfaction rating (extremely dislike, dislike, neutral, like or extremely like).\n", "\n", "Ordinal variables are encoded using scikit-learn *OrdinalEncoder*. In order to use *OrdinalEncoder*, we have to first specify the order in which we would like to encode our ordinal variable. In our case let's encode education level with ordinal encoder (let's assume some ranking between the education levels), and capital-gain-category." ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [], "source": [ "from sklearn.preprocessing import OrdinalEncoder" ] }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "education\n", "HS-grad 10501\n", "Some-college 7291\n", "Bachelors 5355\n", "Masters 1723\n", "Assoc-voc 1382\n", "11th 1175\n", "Assoc-acdm 1067\n", "10th 933\n", "7th-8th 646\n", "Prof-school 576\n", "9th 514\n", "12th 433\n", "Doctorate 413\n", "5th-6th 333\n", "1st-4th 168\n", "Preschool 51\n", "Name: count, dtype: int64" ] }, "execution_count": 65, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X['education'].value_counts()" ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "capital-gain-category\n", "cat1 29849\n", "cat2 1942\n", "cat4 613\n", "cat3 157\n", "Name: count, dtype: int64" ] }, "execution_count": 66, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X['capital-gain-category'].value_counts()" ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[array(['Preschool', '1st-4th', '5th-6th', '7th-8th', '9th', '10th',\n", " '11th', '12th', 'HS-grad', 'Prof-school', 'Assoc-acdm',\n", " 'Assoc-voc', 'Some-college', 'Bachelors', 'Masters', 'Doctorate'],\n", " dtype=object),\n", " array(['cat1', 'cat2', 'cat3', 'cat4'], dtype=object)]" ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" } ], "source": [ "categories=[['Preschool','1st-4th','5th-6th','7th-8th','9th','10th','11th','12th','HS-grad','Prof-school','Assoc-acdm','Assoc-voc','Some-college','Bachelors','Masters','Doctorate'],\n", " ['cat1','cat2','cat3','cat4']]\n", "encoder = OrdinalEncoder(categories=categories)\n", "encoder.fit(X[['education','capital-gain-category']] )\n", "encoder.categories_" ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(32561, 6)" ] }, "execution_count": 68, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_enc = X.copy()\n", "X_enc[['education','capital-gain-category']] = encoder.transform(X[['education','capital-gain-category']] )\n", "X_enc.shape" ] }, { "cell_type": "code", "execution_count": 69, "metadata": {}, "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", "
ageworkclasseducationcapital-gain-categoryhours-per-weekoccupation
039State-gov13.01.040Adm-clerical
150Self-emp-not-inc13.00.013Exec-managerial
238Private8.00.040Handlers-cleaners
353Private6.00.040Handlers-cleaners
428Private13.00.040Prof-specialty
\n", "
" ], "text/plain": [ " age workclass education capital-gain-category hours-per-week \\\n", "0 39 State-gov 13.0 1.0 40 \n", "1 50 Self-emp-not-inc 13.0 0.0 13 \n", "2 38 Private 8.0 0.0 40 \n", "3 53 Private 6.0 0.0 40 \n", "4 28 Private 13.0 0.0 40 \n", "\n", " occupation \n", "0 Adm-clerical \n", "1 Exec-managerial \n", "2 Handlers-cleaners \n", "3 Handlers-cleaners \n", "4 Prof-specialty " ] }, "execution_count": 69, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_enc.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that here we remained with the same number of features as we had initially." ] }, { "cell_type": "code", "execution_count": 71, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "((32561, 6), (32561, 6))" ] }, "execution_count": 71, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X.shape, X_enc.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Target Encoding" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "When we have categorical features with high cardinality, using one-hot encoding would inflate the feature space making it more computationally expensive for modeling. A classical example of high cardinality categories are location based such as zip code or region. In this case we can use Target Encoding, where each category is encoded based on the average target values for observations belonging to the category, more specifically the encoding scheme mixes the global target mean with the target mean conditioned on the value of the category." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's check again how many categories does each categorical feature have using `nunique()` pandas method:" ] }, { "cell_type": "code", "execution_count": 75, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "workclass has 9 categories\n", "education has 16 categories\n", "capital-gain-category has 4 categories\n", "occupation has 15 categories\n" ] } ], "source": [ "for categorical_variable in categorical:\n", " print(f'{categorical_variable} has {X[categorical_variable].nunique()} categories')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's see how would we encode workclass and occupation with target encoding." ] }, { "cell_type": "code", "execution_count": 77, "metadata": {}, "outputs": [], "source": [ "from sklearn.preprocessing import TargetEncoder" ] }, { "cell_type": "code", "execution_count": 78, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(32561, 6)" ] }, "execution_count": 78, "metadata": {}, "output_type": "execute_result" } ], "source": [ "enc = TargetEncoder(target_type='binary')\n", "X_enc = X.copy()\n", "X_enc[['workclass','occupation']] = enc.fit_transform(X[['workclass','occupation']], y)\n", "X_enc.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can check what are the values that the categories were mapped to with the following: For feature i, encodings_[i] are the encodings matching the categories listed in categories_[i]." ] }, { "cell_type": "code", "execution_count": 80, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[array(['?', 'Federal-gov', 'Local-gov', 'Never-worked', 'Private',\n", " 'Self-emp-inc', 'Self-emp-not-inc', 'State-gov', 'Without-pay'],\n", " dtype=object),\n", " array(['?', 'Adm-clerical', 'Armed-Forces', 'Craft-repair',\n", " 'Exec-managerial', 'Farming-fishing', 'Handlers-cleaners',\n", " 'Machine-op-inspct', 'Other-service', 'Priv-house-serv',\n", " 'Prof-specialty', 'Protective-serv', 'Sales', 'Tech-support',\n", " 'Transport-moving'], dtype=object)]" ] }, "execution_count": 80, "metadata": {}, "output_type": "execute_result" } ], "source": [ "enc.categories_" ] }, { "cell_type": "code", "execution_count": 81, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[array([0.10406847, 0.38626183, 0.29476285, 0. , 0.21867381,\n", " 0.55696537, 0.28490785, 0.27193089, 0. ]),\n", " array([0.10367319, 0.13450071, 0.11845551, 0.22664396, 0.48393209,\n", " 0.11576456, 0.06281553, 0.12490973, 0.04159133, 0.00676869,\n", " 0.44896578, 0.32495995, 0.26930666, 0.30487686, 0.20039788])]" ] }, "execution_count": 81, "metadata": {}, "output_type": "execute_result" } ], "source": [ "enc.encodings_" ] }, { "attachments": { "546e8541-dffc-45db-b3e6-05bfbbbd6f4e.png": { "image/png": "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ddW1skLO9lPhT3ht7LtyruZefvll6/CB/fv344orrpBVcpa+fftah8i89957slJzAQEB2LlzJw4dOiQr5Cz5+fno1KmTdQiU0WiU1Zq76qqr4ObmJufI2c6ePcsgrwIf5L6HAz/l4KHOo2WFnOmj3MXo03EYHrhzkKzUTb0EeWXH2L17d+Tk5MgKOYsyjjc9Pd16QOvQoYOs1syPxd8hefvL6NVBh5uv6yir5Cw78tNx5s8/MPmBl2Sl5jhGvmHVZYw8g3zDqWuQ59CahsOhNeqRsS8V+3/4HEN8JsoKOcvZv0qwIfcdPOj1GDQdBspq3fCuNUREREREKsQgT0RERESkQgzyREREREQqxCBPRERERKRCDPJERERERCrEIE9EREREpEIM8kREREREKsQgT0RERESkQgzyREREREQqxCBPRERERKRCDPJERERERCrEIE9EREREpEIM8kREREREKsQgT0RERESkQgzyREREREQqxCBPRERERKRCDPJERERERCrEIE9EREREpEIM8kREREREKsQgT0RERESkQgzyREREREQqxCBPRERERKRCDPJERERERCrEIE9EREREpEIM8kRELi8bMW5ucKt2MiD1qNykDopWGurttYiIyHkY5ImIXJ47fGLjEHd+ikRgF1HuEohIh7oOns1tWxARUeOnniB/NBWGCnugyk4xyJabXLwipI4QrzUiVTyj2tgz727c5V7V9A72yHVr5jjS/y22m/elnK9MJev99i3SZz+JII3t5/d7IARz132Lk3Lx5S57Ttn3T8WTYWU9vBN2xFhfK2aHnKda8IRuRjjCz09h8Oskyp38EOZQN0LT0rZFXbgHpKG0NA2BbWWBaq5Bj1W8ekIqUJiOaeWygOM0bd1xuXINffGO2O5JpBfK+Up9ibcreP3jny3D84ah6Gf9+Q8j6Mll+PyYXKgy6gnyzcWBzKHnKRQ6pT441K6mTD5wt25Al05fBDwfgRkVTneitVzL6f4Qb+DAoZi5UfxGMxdiSdpCzHwI+GjyUEwSgf+MXO1y5t7F/r0Th8jRPqLqg8BnHes6z6a2DUgFZEfEnAxkz/VDexEa22uiYD5lW1pywISY4AHw9pCBspMvDDNTYZHLFeXCofUkTMwfsCB1pp/ctj18g+ORXcvjb6PHYxVRhbyGT6wgE9imvu2ayLWc7+i6p2EwLMNR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hu7duyMnJ0dWyFmGDBmC9PR05Ofno0OHDrJaMz8Wf4fk7S+jVwcdbr6uo6ySs+zIT8eZP//A5AdekpWaW7rgacTGxmLVqlWyQs4UGhqKPn364JWEdbJSc7feeiuOHDki58jZlEPW2LFjsWzZMlmpuXbt2qFfv35YsWKFrJCzLF++3NpOeXl58PLyklVyRR/veAX5P++Dz61aWSFn2nloE3q2fxD33TtJVuqm3oK8soPs2bOnrJCzKDvFr776Crt27UK3bt1ktWY2bt2AxPdfQ1uG+AZxqqQYf/59Fu+/mSErNbduoQFeV5nkHDWEfcdux/DnvpZzNXf77bfjp59+wm233SYr5Ex79+696CB/3XXXoWPHjmyrBrJmzRp89NFH8PPzkxVyRTkbHkSLnzLlHDWE0x0nwueBt+Vc3dRbkKeGdbFBXqcdKueoIbi3a43C736WczWX+d543FyyDG26viwr5Ew/7Y/Dz6X3wnesWVZqLiAgADt37sShQ4dkhZxFuRLZqVMnJCUlwWg0ymrNXXnllfj777/lHDUEBnnXZ9n8GK4s3IKbOj8jK+RMP+5+Dv/zmgbv3m/ISt3UW5C/5557sGTJElkhZ3n66aeRmZl5UUH+06yt6NdbixUr30WP+3rIKjnLjKdm4uuvv8bXB76RlZr79asEHMueho4P/gdXNrleVslZ8j9+GM1vexTufZJkpeYY5BtOXYP8zTffjF69euG5556TFXKW7du348knn8TWrVvxwAMPyCq5op8+m4zfD61Ep4HslXe2v//8DQc3D8CNPeNwXedwWa0bjpFXmbqMkVfCf48ePbB27VoYDAZZJWfR6/WwWCzWqbYY5BsWg7w61DXIc4x8w+EYefVgkG84zgjyvGsNEREREZEKMcgTEREREakQgzwRERERkQoxyBMRERERqRCDPBERERGRCjHIExERERGpEIM8EREREZEKMcgTEREREakQgzwRERERkQoxyBMRERERqRCDPBERERGRCjHIExERERGpEIM8EREREZEKMcgTEREREakQgzwRERERkQoxyBMRERERqRCDPBERERGRCjHIExERkYvLRoybG9zspxGpKJJLnc/28w0rq/mJO2LE72ZA6lE5T+RkDPJERETksopWGkQ49sXu1EKUlpbKqRApCIKHq4XmXpHid0tDYFs5T+RkDPJERETkmnbEwCPQhOjsUqQFuMuiwh2Bq0WYH25C0PSG7Jknci0M8kREROSCipA6LwoYngJjL1ly4A7t9CwUztPKeRtbD77dEJw52XKJ4twQmWykjrBbRw7TyZ5jV3OLEWuXZXYc4lN2eI/D0Brx+ys/Q/x8x9+poqsIcl27147ZIRcRVYFBnoiIiFxQAQrWiIfOniKyV8y9lwbubd3PL1eCuEcgkHLk3BCcLEQ/71sucJsCfVEwXa5zJAX6NcowHTfEdTw3fEfp7Y+Cb7ntguyG+MjhPdWN1Rc/PxSJdq9rQtAt9icJysmFh3ilFBRa1xFTdjSiNAzzVD0GeSIiInI9RwuwWzzoO3ra5qtzNBVxzwPR2fZj1DWIFKEYIqgn24fi2VmIPNfL31YLw3DxODwFieeH77hDO0wvthMnE7JiJba7MMTHHYHzbCcBDq9dVpnXDZwufh/xf1Yge+WLVsYhCnqkzAu8cMLSKxJZsyHCfEVXBYguYJAnIiIi9RPB3yQCsWfZD5r20sIanQsu9JvX+OSgjHLbyZOAqC1VxO0qrigoQ2rM60wi7BugLfN7awY6Bn6iijDIExERketp64mu4sGU79AnXqmiAqX/3rm6elYeyWvH5BjQ5dAe+zHybpoouZCocgzyRJelvYhp0x1uVU2v75Xr1pTtNQ3rf5Hzlal4vZJ8M2JChsND+dldhsMvehMsv8uFl70K7qFd4VQ/t+KzfTCP98KmS00D7WzxsK+g8jHo1g+X2saSu3sqsd+57Hv169XsLDmGvuzUCG5lWbgJhnPHlUqm6o8bZXyxRGw3E6mFcr5SFR9vineuRtioobaf7xuMCQtzUPSXXKgy6gnyR1NhKHfQqmiqj/Fk8tPj1X2AhSpU7o4BlU0OdxK4WDLg1MtrXYa0IxAX9WTF092t5UoN4MgmGB+biQV/9Ef8e4uQ/uJgNM2IgnfQEmT/Ide5rLnDJzYOceenSAR2EeUugYh0qOvg2dy2BV0iDXqsavwnXdbhJZWOQZd3tUE0tMp497ae0MOEtG1ljtw7zFDWqo/e9HJXB46akbZG/AYDNbJQW3Is/vPmcv8ebG3beMbI+zwWXPGxRky6W66SazlfiTgJ0D0ai903jBJttwhpEzxR8M5k+Ezf5Ph5CJVQT5Bv7gmdwwErFDqlPjjUrqZMPlWMRaOG0NRT59gmk60tBd1ku5oydWFLXXLdBiE8ZFTF08A2ciVnO4mMhVFIvSEEpndCEKjtIXaywUhLnQXdFwuxwFzLnppGSez/ZoQj/PwUBr9OotzJD2EOdSM0LW1b1IV7QFrj6Am8FHisql+9IlGYqrfewcXxW1WVDjcPBCkhOjsS1hjdNhARs5U7y4TandhkI0YZolLpLSxr6XlfuzvJiNe+JQimOr62e0CEOBUpc4cccUIYGmiCPlW8p2VJ7Ty1j1d8rBGTsVsLuZazfY3EZxYi2z8aptdHQN+7B/TBs5CeMApY+zpSv5SrqYh6gnxLDYwOB6wg+Cp1TZBdTZl04pBXV8oXTZSidLXdJ8ipxlr2Mjq2yRhrS8F3jF1Nmfzr3lLWOxIolx9nNZZdnYv66xeYl8TCT/uw9VKkh3YawpbsRbFcXLmzsKx/Q273MLxDViO3XA/7jygouAfa4b2haSJLiutaW9/LJX/bZqmmzt27OgPZc/3Q3s0N7UWQMZ+yLS05YEJM8AB4e8ie4U6+MMxMhUUuV5Tr5T13b+wDFqTO9JPbtodvcDyyj8t1yKZBj1WXx0mX9f/xSAoQ6GH7N2udLtyu8fzdZwTNrFIR/IGgW86tJ78Rtp6O5/pU8XuIk4pzrx2lDImp82srx7Fz31QrX1ucIHQt9yVYlwlnHm+OHUdhS0+EPtbboc2aXt8aHvhF/GxZUJFGOkbeNtzCsCIbpone4o3hAe8RybBYlxUje34YDJr28o0olmknIH67/T+RskNrzh0Ys1G8PR4T5LYenf0QsdKCEus6dFHOBYTtJkzoLHbSHt4wLLW1VM3aquzQGrZV/fsRqdMDMSDqADxGPY3MNW8i3r8JMqKC4TW16kuRue9MEjvTjSjpG4L0Nc8jqtMuBD272npLuQvuQOiqJciceIecF2Hz16+RGpuMxBsHIajn9bJKtbLQiKBtvogzpyM6xA9dlSE3+ckweBmQfEqLqCWZyDSnIcm/FbLmBkE7M6OaA2UBFoz3Q3KxDtGpmUhL0KLZxghxgp6sysvRrqGqY1UJLOtiMEGr1JX9n3JCZii3Hyt70nV+OMbxbMQH+1pP5JT9ql+ZkzXVaRuINIex45V3ttlObi6s5xiGbZ0/5b8ltvzr2V5H9vaf3y7Q1nl0birbidQrUtTPnVjJ161wHccTkPPr2r224/LLhZOPNzf2RtyaNVgw8MIVgJIjOYiJXYHcbiHQ3S2LKtKoP+yaNVOPuKbhSDYnIny0L7zE7s880wu+L1vQKjBOHMQykZ4qDkSnkxHRR4f4PbbtKpURDt34LHhOXYDMjBSEeVkQH6hF9FbGw7rJQvjwODSdnozMheEwarxEjW3lKoo3JiNobWtErn8LScFaaHv3RuBTsdj9nu1SZPJnZ+WaZfxqRuKLe6GZMRfpLz4Cndwuve9ZmOQq5dk+mNTs7iAELWmBuJTnofeQi6h2igxYkBoJfX8dAkdroIy4yd2SioJe0UhZHonAwaIt++thnJeGlGfdUbQoVwbIyuSiZGAK0t8JFa+phX5KElLm6YGNGcjmh2LrpPyxSpw2LTbAW5+ME/2jRF2cdJmSoL8hy7ofi9hQXd9kOsL9g5DlGYYF4kQuJcQLFuVk7WUzOzPIpTXo8UZ+CLdZz8mIKhiM9ORg+NhfFVaJRh3kizqLHWCCETrlYOUvdo3HzcjY1gz6eSlImqIXBzEtdAHhSFqRBB2ykWWp5qOtOzwQtiUNkQE6aAeLs/LVKYh2L0LM9ly5Al2cIng/n4wF48XfdZhorztFiW3VMOYG2z61X3Y6f8eak8j69AOg7wgY73P8MFJL7WBE3PULYrZ+WWE4KNm/F8noAeOwe9BU1hSe/sMRLp+X80cLaN5bhMzkWQgfeAARAych5otKdtxUteG+tl54Oz6TM5GnjCe2bxDROt6dlcEfJ3C6mpSne0jj0Ja2u4SUuY0e1Vq5Y5U4acpYUwDN7BSkzAoUdRFoxL4xTuzHIsV+LHFP1adcSk+/R0gm0qzbihO5WeJkbbY4WXslW7wyNWY7d+6Uz1yPKcQ2VKbsdOGOMg18vPnLE8Y1i5C+8EkYr30Pfg9FIfWIXKYijTrIo09Xa8/Gea11iMv+tswlNaGjt3UMY/Gp07b5ygwzQHObfG7lCc8+4qGqW2NRjWh9HFqKbdVQKrtrzfk71pxF8a/i4e42KN8x3hoe7cXDkV8qHJJR/OuP4r93wLPshk2ugcdd8nlZ//KEVttDnHw9grh3lyJJuxdRz6xm+KhnJcVFsOwQJ8srExEV4gftdKXPSrw3qhnv3uxK+YTqV9ljFXwQujkPWbMcT5zQ1Bveyn7s5Olqetb1MPRxHIHv2VHZc/LLhRq77Oxs3HfffUhPT5cV11HZXWsu3LGmgY83t9wBXW/l5gqjkLRqkQj8mxA0z1zNEEPX07iDfGX+KkHx4VyYt5qQPDcCEzRB1ltTmYuqiXjiINZMPqUGwrZyrsruWuPUO9a0QMsaDXtvA+2jWuCrvbBUe69gqpHDGYjQeqBZKw94ayYgeqkJRc11MI4Wf2dyQWL/V2RB9tYMpM6PQthQLcLXiPLhourDBk+6LksTJ07Ed999hyFDhqBbt2748MMP5ZJLr7K71jj3jjU1PN78qwcMQeLx/cPVDDF0PZdZkC9B7nwD2v+zGVp5dkXQ1ESk5pTAfaIRRrkGuQq2lWu4Ci2vEw/7f0T5LH0chd+Kh45tKvzAWcvrlJOBr1FQdsMzP8DyqXyuOPYZwrQPY8LGk7Jg54xSuwpNr7DNUl0UwzTbD/EngpB+5DRKS79F1uZMJMWGQq/cypJcSsGGCAzwEPs/D2/4ToxG8oYiNB1oRNBAuQJRBZo1a4aZM2dan+/evRuPPPKIywX6yjXA8ebL1fD1DUL8V3L+vLM4fUY83KgMNlSXyyvI70mEcaoJPgt348SfpSjcl4nM1QsQHWD7IBi5ELaVi2gB376PAJ+uRvJOx7HqxeaNiPvqeoR2q/gmek279EDojTlIXLPXYRhAwcYPkCKfW93YGp5X/ILkFLPjHQn+2IvUVTmAtgd8xM6V6soCy1Lx4G+Arq3doeovCzLWmeUMuYTjJsQMjceJ0ekoPF2K0oNZyNychLgp+jJDcIjKmzx5Mq677jrrnY4Uubm51kDfpUsXpKWlWWuuqQGON543o+vhrxG3LsdhPRwxI3kt4P54Z9W9xy6rIF9kyUKuMnZwsA9a2l12LN6a4djQdMmxrVxHy8FGpDx2HDGPTsKEJWaYP/sMqa/PRNdR7wGPPYVwbSWXRa/pjfAXB6Hw9Rnwm7Eaps9yYFo4EwNCNpX5nMIdCH01BBrzHAx4YglSzTkwb1yNCeNmIOrIIKS88ki93G+bvOAz2R2YEwTDXBPMW5Ux8jEI8tEi/iD/wi4l34Jk8aAbqoO7fffggQyYtsjnRJW4+uqr8fTTT1tvYak497hv3z489thjuPfee7F+/XprzdU4/XijrLdwELAw6vx6GeuXwPB4FFJvCYFpag/2yLsydy9faGBCeHAEkjeKfyBbTUhU7q8cbEKziq7V0CXDtnIlbRA4LxWZ0Xei8L3XMGD4NIRvOAP96ymwJAyqMmR7PhqN3DWj4XngPRiGT0bExhYIXR+LSLn8nKbdgpFhjoa+ZCPCR03GgGfXoLCjEZmboxF4i1yJ6qgldLFmpMzwgmWeAQO0QYhYXICusVnYvSYUPshC3sGqP0JJDaSjD0LFfi5mvAHx65T9XwZSxQmYd/94WDrKdVTi66+/xt69e2s1WSxqG6XsfMeOHavwb1XZ1LdvXzRv3vx8r7zif//7n/Vx//79GDZsGO655x6YTJXfDPjScP7xpux6frHb0Wp4LPJSgqH5l1xJRS6voTVdwpGxLQ5+p02YoBuAARPjYG6uR0puFhYME8uz8/jFJq6CbeVk9yDyx10ofeoeOV+NK6+HNngm0s3/QanYrtD8JuIev6PMMCfba6Y96vjJIvfeo5C04UPrdt9umIXw+7SIrmC9lncOQty7IsArv9eeNUh/ZQS0HFJTiaq+fbqKZc29EBibjrxC5QtnCpFnTkL4YE+0FO+33WI+ur+tL6rct4VW+AU2QmV1qhvlrl1bUxDuZUGcXuz/AiOQXNAVcdt2Iy3EB9iWhzyVnHMpgVHpAa7N9PDDD8utL4b8UkD5JVrlJ7tvLK6B81+wJecrZP1iQzfE7JDzTpCUlFTh36qySaPR4NSpU+d74+2dC/RKD73BYMCEWZvFetaSc3gMQloF+/xK1eR40y1YLItVvuzXQU2PN/brlWYtQdJTWnhdIxeqjJto5Do3n/IPuHv37sjJyZEVchblk+jKbaXy8/PRoUMHWa2ZXbt2oUePHli7dq31zUvOpdfrrT1LF9O79OtXCTiWPQ0dH/wPrmxSw50fXbT8jx9G89sehXufJFmpuYCAAOu9mw8dOiQr5CzKfq9Tp07WUGM01v5j7+3atUO/fv2wYsUKWSFnWb58OcaOHYu5c+fi5ptvltWaUYaGKGO6L44S5D0QhBQUVvLNr7WhBHmPwK7IOv8NrxVQgrwmCtHZzjup/eqrr6w97TWlRLvw8HD89NNP5cL8lVdeib/++gseHh548cUXMcRrN/4oWIVOAzPlGuQsf//5Gw5uHoAbe8bhus6V3uG+Vi6zu9YQERFRQ/Hz87Oe7NZmuvgQ33jdddddFf6tKpv+8Y9/oKioyCHEX3GF7fZfrVu3xvz583H48GHr7Sqv+MeF4TekPgzyREREdHmSw2LOTyNSq/3SQNtwG7uhOuXGeVYwvGdOlYNz6pUS3pWediXMK849tmrVCvPmzbMG+LCwMFx1leO3p5I6McgTERHRZccayOWQGCX8Kp8bSUEQPKoYE589xw0egUDKEbnNEQPSApWvKTzHbmiP9TWVKQvRz/vCsLK6U4T6odxiUvmQ8bmx8Ndeey1iY2OtXxT11FNPoUmTJtY6NQ4M8kRERNS4rFECeZlecYcPumYjOdAEfWqh3bh2dwTOS4EeUYirKHQfTUXc8xDbJF74IHjbQKRlR8sZRQEK1oh1hmntxudrECkCfVpAXUfsV085cXjhhResz1u0aIHo6Gh8//33mDFjhvWzB9T4MMgTERFR4zLcvkf83GR3J6ajBdgtHrp6lgnXbbUwDAdM+RXcF01sI6I/DH3KbuMpqudooJ0ttg/0ECcO1dztxgk++OADa8/7rFmzcOTIEURGRlpvQ0mNF4M8ERERXV6sobx2igqU6F8BEeS7yqcKzSxx0mDtpY+C7/mrAQ0T6ktKSqw98LNnz7YOqaHGj0GeiIiILi8Oveg14+5pH9ftyN59B/I7FqzTEdtwHd8GCPMjR47EddddJ+focsAgT0RERJcX2YsetaVMtD5qRpoyxr1jBd8hag3/JqRtKzN+vrre/baBSExVTht2o6AWX0ZFVBMM8kRERHSZ0cCohOvnfe2+kbUIqdODRCiPRkRFH0yVgdwUGOrwodkYjf1da8S8MpTG4XaTRTCvE1F/uAHac2P0ieoJgzwRERFddtwD0qxj2aM058axeyCocxZKq/gWV2WbwlQg6JZz2/gCqcrQmXOUO9TYbjd54W459fdNs0RlMcgTERFRI+GOwNWlKK1paLYfy65MsxwjvDXslwn2ttqFbSIDApGmPJ6/jaXtdpP269T49yGqJQZ5IiIiIiIVYpAnIiIiIlIhBnkiIiIiIhVikCciIiIiUiEGeSIiIiIiFWKQJyIiIiJSIQZ5IiIiIiIVYpAnIiIiIlIhBnkiIiIiIhVikCciIiIiUiEGeSIiIiIiFWKQJyIiIiJSIQZ5IiIiIiIVYpAnIiIiIlIhBnkiIiIiIhVyKxXk84vm5uaG7t27IycnR1bIWYYMGYL09HTk5+ejQ4cOslozu3btQo8ePbB27VoYDAZZJWfR6/WwWCzWqbZ+/SoBx7KnoeOD/8GVTa6XVXKW/I8fRvPbHoV7nyRZqblJI0di3759WLRokayQMyn7wDlz5mDstGmyUnPt2rVDv379sGLFClkhZ1m+fDnGjh2LvLw8eHl5ySq5op8+m4zfD61Ep4GZskLO8vefv+Hg5gG4sWccruscLqt1wyCvMgzy6lGXIP/6iyNx8tv3cc3Ng2WFnOnUT5+i6fVdEDF3u6zU3FsjDPAs/Z+co4bw6133IODFl+RczTHINxwGefX46q2xKPk5B81vekBWyJl+/2EjWng+hjvHzZWVuqm3IH/ttdeidevWskLOUlxcjF9++cUayrt16yarNaMcvMaMGVPrEwC6OH/++Sd+++03a5vV1qvPGfDsKyY5Rw0h0O92pHz0tZyruQ+fnIJr/zgFzz59ZYWcybLhQ/x2jw9GzHpeVmquefPmuOmmm6zHLHK+Q4cO4aOPPoKfn5+skCv6Yk4gju89LeeoIdwy0BPeE+fJubqptyCvTP/4B4fcO5vSXP/73//qFOSvuOIKWSFnU/7WZ86ckXM19/rcFzB95mx8s+8TWSFn6jPAAN0gLZa8+76s1NzeN+JRnPcVek4OlRVyltMnfsXnixbirkmhaDvgQVmtuSuvvFI+o4bw999/M8irwP6Fc3FsRy66jTfKCjnTjoUL0PHxoejw2HhZqRsOrVEZDq1Rj7oMrUlISMC0adNQWFgId3d3WSVnUf7GynsrKan2Y+QZ5BtOXYM8h9Y0HA6tUY+8xW+haNun6P1U/YzZpsr9dfo0tr8ejzvGjMNt/o/Iat2wC52IiIiISIUY5ImIiIiIVIhBnoiIiIhIhRjkiYiIiIhUiEGeiIiIiEiFGOSJiIiIiFSIQZ6IiIiISIUY5ImIiIiIVIhBnoiIiIhIhRjkiYiIiIhUiEGeiIiIiEiFGOSJiIiIiFSIQZ6IiIiISIUY5ImIiIiIVIhBnoiIiIhIhRjkiYiIiIhUiEGeiIiIiEiFGOSJiIiIiFSIQZ6IiIiISIUY5ImIiIiIVIhBnoiIiIhIhRjkiYiIiIhUiEGeiIiIiEiFGOSJiIiIiFSIQZ6IiIiISIUY5ImIiIiIVIhBnugylj3HDW5u1U+GlUVyizrYEWN9rZgdcp5q5qdNGNm1O5pWMY3c9ItcuYb2LRHbzcSqn+R8ZWqwXvGnsbi1Jq9FRJenS7kPw168Ws3rq30fpp4gfzQVhjLhouIpBtlyk4tXhNQR4rVGpIpnVFtFKw0VtEsF05y6t5SIooipt9e6/Lh3iUNc7IUpcrSPqPog8FnHus6zqW0DumS6+AXj1WlPVjgNuvkquVYD+3ETnpyzGszwdhr0WHVuf2tA6lFZIHJR3Ic5h3qCfHNP6OyCRVxsKHRKfXCoXU2ZfOBu3YAulaaeOsc2mWxtKegm29WUqQtb6lLz9A9H+IwLU9hgT6UKvxDHurFXS9sGddErEqWlpYjsJeepVm7r/TieHDuqwmlc5xZyrYb0I1a9GYWCNvfIebLisYqoQtyHOYd6gnxLDYx2wSJ8RhB8lbomyK6mTDoRQ+rKHYGrS1G6OpA72ovQspfRsU3GWFsKvmPsasrkX/eWEv8AECnCYeksjZwnZ7H1/MUgY0c8/Dq5wa2TL6K2lNgWHs9GYogBvkpd6W308MaA4HhkH7cttio3tMZ2NcWw0gLLygj4dfawLm+vmYD47cVyHaq1v3/B/62KxaMjHrZesr51xDQ8uWovqv2L/rdAHNSmocvA7mg6cDjGrfoasnUrcBafL47COETj3afulzWyatBjlThaBaSJE+Q0BLaVBSK1u9h9mNgvHdj0htzuYXR5bjX2/FcuKqfx7MMa6Rh5GRBWZMM00Rsebh7wHpEMi3VZMbLnh8GgaW8LHMoybdngUHZojZyfk43i7fGYILf16OyHCBFCKj/YUbWs4c6A1O0mTFCCnAiAhqW2lqpZW5UdWsO2cq4FMI42wzc2E+mzw+Dn0xQ4ZUZEZ19EH2iFIFHPNKcjZbovTi+NgK9/PHLllpUpSDDCb3ExdLNTkGlaAG2zdET0CUJyvlyBauFHrHoxEINiD8Bd/zQ2vf0mXhvYBJtig3HvrE04LNcq72u8MVmE94/OYtCUN7HpRSPuzI3CpNUH5HJHJfvew8zVbbBs2iDcdoUs0kWo6lhVAsu6GEzQKnVl/6ec5BrK7cfKDq05d8KdLU6u44N90V7ZVuxX/WamwnLKtg6R67rYfRiwJ2WSCO8bUdIzBOvffh7PeO7CuFdEmJfL7TWmfVij/rBr1kw94pqGI9mciPDRvvASuz/zTC/4vmxBq8A4EThEGEkVYeN0sggOOsRX1Nr2MsKhG58Fz6kLkJmRgjAvC+IDtYjeynhYN1kIHx6HptOTkbkwHEaNl6ixrVxTEQwJaYgcpoUuIBCa1uJ0a2sGsprrEb88CaGiru2vQ+CMJKQs0YkTtSxYqhm7m1uiRcqHctthoUhaHg89MpCRw0+o1Fbx1mSMS2+NZ5a8hbdGavFAj94Y+e9Y7Jg/Ckh/Hctyzso1HRVvXY1n9t2DF+e9iVeH9sYDvQfhmdfexKCzZrmGneLP8Mz09+Ez62mMbCNrVCflj1XiBHexAd76ZJzoHyXq4gTZlAT9DVnW/VjEhur6JtMR7h+ELM8wLFBOrEO8YJkbBO3LZnZmkEu72H0Yis14K34vek6ei/Xhj2CQ3G59r7NYL1c5r5Htwxp1kC/qLHaACUbo+uth9Be7xuNmZGxrBv28FCRN0YvAoYSRcCStSIIO2ciyVBMcdnggbIsIMQE6aAcHInJ1CqLdixCzvbo+R6paEbyfT8aC8eLvOky0152ixLZyUXr4dnb84GtL/zhkHSx/ad/TSxlQUIzT1SUHfz9omsvnirae6CoeTPkFtnmyWv+c7TJz2enC3RhOYseOD4BeIzCui+MHx1r2Hoyn7vgFr2Z9WUGQO4s9e5XtHsHIzvbbtcGjw8TB08GPWBU/G7kj5uLVvpdiTGvjVO5YhVxkrCmAZnYKUmYFirpykmtEnNiPRYr9WOKec1ctK5MNj5BMpFm3FSfWs9KQMtsdRa9kV3uFjMhZnLcPA0oO7MUy9MD4QffA/gh128DheFI+t2l8+7BGHeTRp6u1Z+O81jrEZX+LtIAyI987elvHMBafOm2br8wwAzS3yedWnvDsIx72FcghOHSxtD4OLcW2UqNTxSjYY4Z5XTLiZ06A7+goUTSjyH6cfEX+KR+pSpXd8eHC3R7OoljpqL2jTQWf7WkN93bi4cdf8JutYOckin4UDxVs17RVa3SRzxWHTa9h3PePIzbI8WBJdVT2WAUfhG7OQ9YsjePfuak3vJX92MnT1fSs62Ho4zgC37OjsufcjQLe3YYuEeftw4Dfiq07Mdx2k23+vKuugfsd8rnQGPdhjTvIV+avEhQfzoV5qwnJcyMwQRMEa+QoqibiXQk0k0+pgbCtXN+pXCSOaA+3Fq3Q3icIYfNTkXXKHcYxRrkC1YfK7vjg1Ls9XN0CF+5XtBeroj8TJ8ML0e9+ux61sQvFMjPGDVbml+Bz28pUL8T+r8iC7K0ZSJ0fhbChWoSvEeXDRdV/8E/sA4lcySXZh0Hsw1rJp410H3aZBfkS5M43oP0/m6GVZ1cETU1Eak4J3CcawcjhathWapG7yIiwNT5YkHsCpaWFyDNnIm1hNILq45aVVAtXoaXyJ//6xwquOh1H0ffi4bY2KNthpRzo3NuIhwq2K/mhAP8nnytXtR59exE2lZ2efUQs64FnXlPm+8Ou84vqoGBDBAZ4iP2fhzd8J0YjeUMRmg40ImigXIGo0bnYfRhwbUvrTgyHy94Q/uwPOHD+TmmNcx92eQX5PYkwTjXBZ+FunPizFIX7MpG5egGiAzR2vU7kEthWKlEES06udSiTrot9yxTDvCVFPqeG0QK9eokD0o7VWLbH8QNhxZ9txOtfX49J91R0w8Or0KX7CNxUbrsfsT59o3yuaIE7e/TAA2WnO2+2LbtHmffk+7M+HDchZmg8ToxOR+HpUpQezELm5iTETdGXGYJD1Jhc7D4MaHpXD0y6PgdvfbTXYdjZYfMHWCmfN9Z92GUV5IssWchVxg4O9kFLu8uOyl03GDlcC9tKLdzhpdEA68IxYXoyMrYqY+QTEabrCuO6ZvwehgbWsr8Ry/yO49XgSZi0yoz/y/kMqxbPRK8p7wF+T+HJ3hVfwm7ZexReU7abMU1uZ8YbT0/CuPRafm061Y98C5LFg26oDu72A3kPZMC0RT4naoQudh+GFr3xZPggFC6egUejV2N9Tg7WvzsTg57b1Oi/efqyCvLuXr7QwITw4AgkbxSBY6sJiSF+6BpsQjMmDpfCtlIPn6cykBXrh9MbJsBPOwATYs1oOjwFudsWwCCWZ1l495mG0wYjX0zFppl3osj0GgY9MQ1PbzmDR19MwZdzBsHh898O5Haj2sCyUhz8nngD65qNwCevBcvl1KA6+iBU7OdixhsQv07Z/2UgdU4QvPvHw9JRrkPUKF3sPgy4bVA0dr49GrcdfA8jn5iMZ8wtMGlJLJ6Ryxury2toTZdwZGyLg99pEyboBmDAxDiYm+uRkpuFBcPE8uw8MHK4CLbVJVHVt0RWvqwlNDOSkHWwVCwvxbfZaYgbr4G7uw4LxHz6eHkptFekdXlkL9ts5d/Ky2/rdXDTIKzavQurBl0vC9W44no8MHIm1q/+D0rEdt+tVu4Nf4fj5eLOwWJZLEbaDzZVths7C598sEss+xCfvDgKPQeGlF+vrIpei+pGuWvX1hSEe1kQpxf7v8AIJBd0Rdy23UgL8QG25SGvutu6ErmKhtqHCTf1GIW33v3Qut2Bd2fhyS5avFjdz1b5PsxNHFhL5fOLpnzjXPfu3ZGTkyMr5CxDhgxBeno68vPz0aFDB1mtmV27dqFHjx5Yu3YtDAalr5ScSa/Xw2KxWKfaSkhIwLRp01BYWCgCMS9BOJvyN1beW0lJSbJSc3vfiEdx3lfoOTlUVshZTp/4FZ8vWoi7JoWi7YAHZbXm2rVrh379+mHFihWyQs6yfPlyjB07Fnl5efDy4sh+V5a3+C0UbfsUvZ8KlxVylr9On8b21+Nxx5hxuM1f+ZBt3V1md60hIiIiImocGOSJiIiIiFSIQZ6IiIiISIUY5ImIiIiIVIhBnoiIiIhIhRjkiYiIiIhUiEGeiIiIiEiFGOSJiIiIiFSIQZ6IiIiISIUY5ImIiIiIVIhBnoiIiIhIhRjkiYiIiIhUiEGeiIiIiEiFGOSJiIiIiFSIQZ6IiIiISIUY5ImIiIiIVIhBnoiIiIhIhRjkiYiIiIhUiEGeiIiIiEiFGOSJiIiIiFSIQZ6IiIiISIUY5ImIiIiIVIhBnoiIiIhIhRjkiYiIiIhUiEGeiIiIiEiFGOSJiIiIiFTIrVSQzy+am5sbunfvjpycHFkhZxkyZAjS09ORn5+PDh06yGrN7Nq1Cz169MDatWthMBhklZxFr9fDYrFYp9pKSEjAtGnTUFhYCHd3d1klZ1H+xsp7KykpSVZqLjooAP/94Qe07nS7rJAz/fhlLm7uPwBPvRYrKzXXrl079OvXDytWrJAVcpbly5dj7NixyMvLg5eXl6ySK8pb/BaKtn2K3k+Fywo5y1+nT2P76/G4Y8w43Ob/iKzWDYO8yjDIq0ddgrzSPiaTCXfccYeskDN9//331pB34MABWam5wV19sCl3j5yjhjA3fDoi4uLlXM0xyDccBnn1+CB6Of4oLETTli1lhZzpv78cR5t774R2cv3ksHoL8ldccYV1Iuf6+++/rZMSyrt16yarNaMcvMaMGYOrrrpKVqghnDlzRj6ruXNB/h//4Oi3htKxY0d8/fXXcq7mhj/6CL4QQT5t+buyQs7U9YH+SJw7FyEREbJSc69MXoB/uPE91VDO/nkWuuAH0E3TRVbIFSlB/th/m4r3hiyQU5098zfu6HCV6wX55s2b45prrpEVcpZTp07h999/r1OQb9OmjayQs508edLaXrXFoTUNqy5DawICArBz504cOnRIVshZlCuRnTp1sraT0WiU1Zp7c/pStGvfVs6RsxUdPo77DF4M8i7u07Rd+Cb3MB4KvF9WyFnOnvkTW1K2Q+Pvgy797pTVuuHQGpXh0Br14Bh59WCQV4e6BvkVcz7AtTe0QJe+3rJCznL0YBG+3GbByBl+aHUTO/lcGYN8w3FGkOc1RiIiIiIiFWKQJyIiIiJSIQZ5IiIiIiIVYpAnIiIiIlIhBnkiIiIiIhVikCciIiIiUiEGeSIiIiIiFWKQJyIiIiJSIQZ5IiIiIiIVYpAnIiIiIlIhBnkiIiIiIhVikCciIiIiUiEGeSIiIiIiFWKQJyIiIiJSIQZ5IiIiIiIVYpAnIiIiIlIhBnkiIiIiIhVikCciIiIiUiEGeSIiIiIiFWKQJyIiIiJSIQZ5IiIiIiIVYpAnIiIiIlIhBnkiIiIiIhVikCciIiIiUiEGeSIiIiIiFWKQJ7qMZc9xg5tb9ZNhZZHcog52xFhfK2aHnKdayEZMmTapeDIg9ajcpA6KVhrq7bWI6DL3kwlP3OWBW6uYnsg4JleuoS/fFNsZ8cFPcr5SuzC/3Ovvx/x+9fR7uAAGeaLLmHuXOMTFXpgiR/uIqg8Cn3Ws6zyb2jagS8QdPnbtERcbicAuotwlEJEOdR08m9u2ICJyJXcNnYao8BcqnLQ3N+Ax5qdvsP840H/kJf496ol6gvzRVBgq7IEqO8UgW25y8YqQOkK81ohU8Yxqy9abV7ZdKpjm1L2lzvdU1strXX48/cMRPuPCFDbYU6nCL8SxbuzV0rZBXfSKRGlpKSJ7yXmqBU/o7NojfEYY/DqJcic/hDnUjdDUQ1O5B6SJtkpDYFtZoBr5OcNYYS/fhakmPYiObK/5JnbL+UpV1EP51ZvoXk+/B1Fd3dInGP8OnlTh9Pi918i1GsAP32ATdBh2qX+PeqKeIN9cHMgcep5CRTMIg0PtasrkA3frBnSpNPXUObbJZGtLQTfZrqZMXdhSamI7QYtBxo54ESLFyVMnX0RtKbEtPJ6NxBADfJW6cmLl4Y0BwfHIPm5bbFVuaI3tJMyw0gLLygj4dfawLm+vmYD47cVyHao92RExJwPZc/3Q3vo3jYL5lG1pyQETYoIHwNtDtpVoR8PMVFjkckW5oTXWthPzByxIneknt20P37JtTMLdeOTf5Xv6bNMA3HK1XK0B/PzdXvyMARhziX8Polr5+xiyUp7DuEfvtZ54dn90FGal7MLvcnHlziA/4yW53b0YMGMpvvqvXGTnyNGD4r/34JabbfNqp54g31IDo0PPUxB8lbomyK6mTDoofYp1447A1aUoXR3Ik4KL0LKX0bFNxlhbCr5j7GrK5F/3lhL/ABBZKtpqlkbOk3MtgHG0Gb6xmUifHQY/n6bAKTMiOvsi+kArBIl6pjkdKdN9cXppBHz945Ert6xMQYIRfouLoZudgkzTAmibpSOiTxCS8+UKdHEWGhG0zRdxoj2iQ/zQVRlyk58Mg5cByae0iFqitFUakvxbIWtuELQzM1D16VMBFoz3Q3KxDtGpmUhL0KLZRtHGY5LFErqgHQYElO/ps02B6NpCrtYAjhzKAB7UY+Il/j2Iau57fBA1EAEv78ONw1/ByqXvYdagJtj6sj+0z5pwRK5Vka+WPybCuwlnNE9j2dJ5mNphO6bOWYr9cvk5P38n3hdDb0CJEvoHK1eoemJY1FvIUmmnRCMdIy97+lZkwzTRGx5uHvAekQyLdVkxsueHwaBpb+uNUpZpy/YAlh1ac66HKxvF2+MxQW7r0dkPESstkH2SdDHO9fRtN2GC0iPr4Q3DUltL1aytyg6tYVs5VxEMCWmIHKaFLiAQmtailbZmIKu5HvHLkxAq6tr+OgTOSELKEp1o3yxYqvnAZG6JFikfym2HhSJpeTz0yEBGDge21UmRAQtSI6FX2mO0BsqIm9wtqSjoFY2U5ZEIHKy0lR7GeWlIedYdRYty5T6yMrkoGZiC9HdCxWtqoZ8i2nieHtiYgWx+KPbinDyITW+FY5g1THjg/sBwzP/4IM7IxZX670F8ED8KA5QP7PXri6kp+yvY5nscUU6GvdrhFluByOX9/vGbmPrhjZiyYi1ig3TwvW8AHpmUjIy3JgEfvoT3d1by7jiRgXdf24WuU5Kx7OlA9JfbLdOUYJNcxeZ7HNwrHj58DfM/b4eRL63BsrmBuPGLlxBgCMUHP9jWUpNG/WHXrJl6xDUNR7I5EeGjfeElYpx5phd8X7agVWAcMs2ZSE+NgO/pZET00SF+j227SmWEQzc+C55TFyAzIwVhXhbEB2oRvZXxsG6yED48Dk2nJyNzYTiMGi9RY1u5Jj18Ozt+GKilfxyyDpYfT+3ppVyJKcbp6v7k/n7Q2H9As60nuooHUz77eetkuK+tF96Oz+RM5GVHQuPQhE3h3VlpqxPVtpXuIY1Y+wJ3T2tLoYBBvvb+uwvzn+iLJ1b+hN5T3sPKpcmY2Ol7vDutL0a+tauKML8fiyeI8P7hGfR/UmwX/SQ6fRGCGauUdGLvGA5+DDzSusQa+u9XxsYP9sfMJdvx899yFaIGtGmGbahM2enCnWJ+xxfZqYDveDzetYms2VzTx4An7jyG+dtyKnxvnLHk4H3cj5G67rDf8paHx+Pf8rnV38fw+x/tbIH/pfEYdN/96K+bhrdXvyfWM2HqoowaDOFxLY06yBd1jkJyghE6pdfJX4TD42ZkbGsG/bwUJE3RQ9tf6VUMR9KKJOiQjSxLNT2AOzwQtiUNkQE6aAcHInJ1CqLdixCzvbrBA1S1Ing/n4wF48XfdZhorztFiW2lPqeKUbDHDPO6ZMTPnADf0VGiaEZRdZcr/ykfqcGUFBfBskO8x1YmIirED9rpJlEtqLatml0pn1CdfbXqWcR9qUNC6nuI0A2A7306jHlpDVbNGoDd89/A+u/limX8/vFSRH/ZHREJ7yFqmNiujx5T5r2HAWcy5BrS99/gC/Hwwfw38Zl7IGKXvoeER25EVvxwDI6qeogCkTNUdteaC3eKKcHvJ8TDne1wo61g50bceKt4+EEEcVvBwe/Fyhvmbtxyk23+vCYtcZOSKc65ojv+nfo51k1yDPxoMUBkDPFT1+Vgf7WXxFxLow7y6NMVSt/uea11iMv+FmkBZUa+d/S2jrcvPnXaNl+ZYQZobpPPrTzh2Uc87BMHQFuBLpLWx6Gl2FZqcioXiSPaw61FK7T3CULY/FRknXKHcYxRrkAu43AGIrQeaNbKA96aCYheakJRcx2Mo7VyBaq7DEwVf+PyPY/2d4rZj6z0/UDweAwq84G7jg8H4nFkYv3OipL8Gez/UumxDMCj99rHkHYY9Ngk+Vw68TtK2tkCf/khCqGY/7Ha+h1J7Sq7a41z7xRzDa65Tj6txg1tuov/fo+fVXavhcYd5CvzVwmKD+fCvNWE5LkRmKAJgrXvsKiaiHcl0Ew+pQbCtnJ5uYuMCFvjgwW5J1BaWog8cybSFkYjqD5uWUn1qBim2X6IPxGE9COnRVt9i6zNmUiKDYVeuZUl1ZPK7lpjf6eYEpQcEHn81naOvYKKVjdax7RnHa/oi2l+w8/KGN4KeiybXHcT7pLPre6dhHUbN2CKQ+BXhij4YWxr4P0v91Y/Fp+oQTXFNa3Ew4HvUf5f/zEc+048eLbDDbaCg2tathP/3Y8jZW+reuZ7HMySzxXW27R6IDqr7L/+MzhyMANofQ86lu3Vd3GXWZAvQe58A9r/sxlaeXZF0NREpOaUwH2iEew7dDVsK3UogiUn13oFRNfFPrgXw7wlRT4n12CBZal48Bdt1dZupPtfFmSsM8sZqrvK7lrj5DvFXH0NrpVPz6twLPyNaKd8mVglQxSILp1r0E0TKM5il+L93Y5B+/dtaXj7wI0Y0+V2WXHUpPP9GNN6O979wPHzJUcyV2K9fG51ZzdMESey6zekOw4v+yEd7y4B7ho7wPGEWAUuryC/JxHGqSb4LNyNE3+WonBfJjJXL0B0gO2ODuRC2FYq4Q4vjQZYF44J05ORsVUZI5+IMF1XGNc14+1bXYoXfCaLFpkTBMNcE8yirTJWxiDIR4v4g/VxK1iquaZoeqfIK999X75X/MQxa8AY1Kb8KGGIqH6DMhSngh7LM0cPwr7jcfdbHrj1npdQvuPxe+z7GLjB6/YKezaJLqVrHpyGhKHHMH/0Y5iZkoGsnZn44C0jdJPeAoa+gIl9KhmG02IAJj6txzGx7rgXlmLTzu3YtMSIgBkm/CxXsWpyPx4X6ynDywKmv2Vdb2vGqxgXGIpN9z6D6JF3yxXV47IK8kWWLORCD8NgH7S0+9CWcvs89h26FraVevg8JXa2sX44vWEC/LQDMCHWjKbDU5C7bQEMYnmWhXefcQ0toRNtkzLDC5Z5BgzQBiFicQG6xmZh95pQ+IgYmHeQd3VqGHfD108EhiUicJS53V3+f1LxPrqjt5cyVKCsJrj7vvG4oVyP5ffYtEH5wPIFd3WdJoK6CasyHcfaH/nPUiwWP/+JPuoLLHQ5aIdHordg5XOdcWzNswgYPwpzNp3BIFEzv6Kv8laqt+gSsXHpZNxy8C08MX44oj9uibErkjFFLj/Htt4L8C1aal1v3PzPcGNAMjKTpqGrCr8o7bIK8u5evtCIHVt4cASSN5qt464TlS9KCTahGbsOXQrb6tKo6qv5K1/WEpoZScg6WCqWl+Lb7DTEjdfA3V2HBWI+fbzs7e0VaV0e2cs2W/mXefFLvqpX1ZfWVbGsuRcCY9ORV6i0lfJ5hiSED/ZEyy7h2C3mo/vbhtyUa+tybSdVVqdq3TXyFUTcm4GpgaMQl5GJrJ0ZWP7CcIyck4muU17A45V8buGaPpMwS+mxfGqU7LHMwOLpwzH1Q8c++ib3BYr1gA9mDMcTS2TP5hujMOzZDPH6r2CM/Z08iJzpJj3e/qoQb+squspUgStuhG/Qy1i2/kt8J7bbtV65Q9PdcOiLv3eaWJaMR8qMZ7/hvkmITf3cut321Hj8u6sOERX8bPv1vtu4AbGTdOio0m87vryG1oiDVca2OPidNmGCbgAGTIyDubkeKblZWDBMLM/O4zcUugq2FRE1Zld3x5S3P8XbATfhs/mjEDDeiHcOtsMTb32OVWVvjedA9liObYeD7xnFdi8h4+rxWDdvmlx+jlwv/H4cW6OsNwpzd96EsW9+Ws3rE5GauJUq3Sl1pHxzZvfu3ZGTkyMr5CxDhgxBeno68vPz0aFDB1mtmV27dqFHjx5Yu3YtDAZl0AM5k16vh8VisU61lZCQgGnTpqGwsBDu7rwE4WzK31h5byUlJclKzQUEBGDnzp04dOiQrJCzKPu9Tp06WdvJaKz9x95XzPkA197QAl36essKOcvRg0X4cpsFI2f4odVNzry9INXVp2m78E3uYTwUeL+skLOcPfMntqRsh8bfB1361c9lscvsrjVERERERI0DgzwRERERkQoxyBMRERERqRCDPBERERGRCjHIExERERGpEIM8EREREZEKMcgTEREREakQgzwRERERkQoxyBMRERERqRCDPBERERGRCjHIExERERGpEIM8EREREZEKMcgTEREREakQgzwRERERkQoxyBMRERERqRCDPBERERGRCjHIExERERGpEIM8EREREZEKMcgTEREREakQgzwRERERkQoxyBMRERERqRCDPBERERGRCjHIExERERGpEIM8EREREZEKMcgTEREREakQgzwRERERkQq5lQry+UVzc3ND9+7dkZOTIyvkLEOGDEF6ejry8/PRoUMHWa2ZXbt2oUePHli7di0MBoOskrPo9XpYLBbrVFsJCQmYNm0aCgsL4e7uLqvkLMrfWHlvJSUlyUrNBQQEYOfOnRg8eLCskDMlJiZa28loNMpKza2Y8wGuvaEFuvT1lhVylqMHi/DlNgtGzvBDq5uukVVyRZ+m7cI3uYfxUOD9skLOcvbMn9iSsh0afx906XenrNZNvQb59evXywo5yxNPPFEvQX7gwIGySs4ybty4Ogf5e+65R1bImX766ac6BfmMjAw5Rw1h3rx5dQryd/e6XVbIWYq+O84grxLngnyzq5vICjnT77+ecs0gTw2rLkGeGs6dd9550UF+8+bNco4agtIrfzFBntRDCfKnfvuvnKOGwCDv+pQgf6r4DzlHDaFNx5tcK8g//PDD8hk1lIULF15UkN+yZYuco4by7LPPymdEdCntzvxKPqOG4nn3LQzyRE5UL0GeiIiIiIgaFu9aQ0RERESkQgzyREREREQqxCBPRERERKRCDPJERERERCrEIE9EREREpEIM8kREREREKsQgT0RERESkQgzyREREREQqxCBPRERERKQ6wP8DJ1Mqy3pXVe0AAAAASUVORK5CYII=" } }, "cell_type": "markdown", "metadata": {}, "source": [ "The method *fit_transform* internally relies on a cross fitting scheme to prevent target information from leaking into the train. Below is a diagram this process, but we will describe cross validation in more detail in the next section of this Notebook.\n", "\n", "
\n", "\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Multiple column transformations" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "What if we wanted to scale some numerical features, encode separately nominal and separately ordinal categorical features? So far, we have done column transformation steps separately.\n", "It would be more convenient to have a single transformer able to handle all columns, applying the appropriate transformations to each column. `sklearn` has `ColumnTransformer` for this purpose. Let's use it to apply all the transformations: " ] }, { "cell_type": "code", "execution_count": 85, "metadata": {}, "outputs": [], "source": [ "from sklearn.compose import ColumnTransformer\n", "\n", "ct = ColumnTransformer([\n", " ('scaling', MinMaxScaler(), ['age', 'hours-per-week']),\n", " ('one_hot', OneHotEncoder(sparse_output=False, drop='first', \n", " min_frequency=0.01, handle_unknown='infrequent_if_exist' ), ['workclass']),\n", " ('target_enc', TargetEncoder(target_type='binary'), ['occupation']),\n", " ('ordinal', OrdinalEncoder(categories=categories), ['education','capital-gain-category'] )\n", "], remainder='passthrough')\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The constructor of `ColumnTransfmer` requires a list of tuples, where each tuple contains a name of the transformation, user defined, a transformer and a list of names (or indices) of columns\n", "that the transformer should be applied to. In this example, we specify that the numerical\n", "columns should be transformed using the `MinMaxScaler`, that nominal feature workclass is encoded with `OneHotEncoder`, feature occupation will be encoded with `TargetEncoder` and the ordinal features with `OrdinalEncoder`. (We would also need to scale the ordinal encoded feature, but for now, we will ignore this step.)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here we listed all the columns in the dataframe, as we wished to transform all of them. But we could have had a feature which we did not need to process additionally. By default, only the specified columns in transformers are transformed and combined in the output, and the non-specified columns are dropped. We can change the default behaviour, by specifying the parameter *remainder='passthrough'*, and with this, all remaining columns that were not specified in transformers, but present in the data passed to fit will be automatically passed through." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The default configuration for displaying a `ColumnTransformer` is 'text' where set_config(display='text'). To visualize the diagram in the notebook, use can use `set_config(display='diagram')` and then output the `ColumnTransformer` object." ] }, { "cell_type": "code", "execution_count": 89, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
ColumnTransformer(remainder='passthrough',\n",
       "                  transformers=[('scaling', MinMaxScaler(),\n",
       "                                 ['age', 'hours-per-week']),\n",
       "                                ('one_hot',\n",
       "                                 OneHotEncoder(drop='first',\n",
       "                                               handle_unknown='infrequent_if_exist',\n",
       "                                               min_frequency=0.01,\n",
       "                                               sparse_output=False),\n",
       "                                 ['workclass']),\n",
       "                                ('target_enc',\n",
       "                                 TargetEncoder(target_type='binary'),\n",
       "                                 ['occupation']),\n",
       "                                ('ordinal',\n",
       "                                 OrdinalEncoder(categories=[['Preschool',\n",
       "                                                             '1st-4th',\n",
       "                                                             '5th-6th',\n",
       "                                                             '7th-8th', '9th',\n",
       "                                                             '10th', '11th',\n",
       "                                                             '12th', 'HS-grad',\n",
       "                                                             'Prof-school',\n",
       "                                                             'Assoc-acdm',\n",
       "                                                             'Assoc-voc',\n",
       "                                                             'Some-college',\n",
       "                                                             'Bachelors',\n",
       "                                                             'Masters',\n",
       "                                                             'Doctorate'],\n",
       "                                                            ['cat1', 'cat2',\n",
       "                                                             'cat3', 'cat4']]),\n",
       "                                 ['education', 'capital-gain-category'])])
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "ColumnTransformer(remainder='passthrough',\n", " transformers=[('scaling', MinMaxScaler(),\n", " ['age', 'hours-per-week']),\n", " ('one_hot',\n", " OneHotEncoder(drop='first',\n", " handle_unknown='infrequent_if_exist',\n", " min_frequency=0.01,\n", " sparse_output=False),\n", " ['workclass']),\n", " ('target_enc',\n", " TargetEncoder(target_type='binary'),\n", " ['occupation']),\n", " ('ordinal',\n", " OrdinalEncoder(categories=[['Preschool',\n", " '1st-4th',\n", " '5th-6th',\n", " '7th-8th', '9th',\n", " '10th', '11th',\n", " '12th', 'HS-grad',\n", " 'Prof-school',\n", " 'Assoc-acdm',\n", " 'Assoc-voc',\n", " 'Some-college',\n", " 'Bachelors',\n", " 'Masters',\n", " 'Doctorate'],\n", " ['cat1', 'cat2',\n", " 'cat3', 'cat4']]),\n", " ['education', 'capital-gain-category'])])" ] }, "execution_count": 89, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn import set_config\n", "set_config(display=\"diagram\")\n", "ct" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, let's split our data into train and test. Then, let's fit our *ColumnTransformer* to our train data and then transform it." ] }, { "cell_type": "code", "execution_count": 91, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(24420, 12)" ] }, "execution_count": 91, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.linear_model import LogisticRegression\n", "\n", "from sklearn.model_selection import train_test_split\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)\n", "\n", "ct.fit(X_train, y_train)\n", "X_train_trans = ct.transform(X_train)\n", "X_train_trans.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can see that we obtained 12 features: 2 numerical, 2 ordinal and (9-2) dummy features for workclass, here we did not drop one dummy variable, as we will be using a regularized model later, but we grouped 2 infrequent categories together, and 1 target encoded feature, occupation. Let's see the list of the features for our transformed dataset, using *get_feature_names_out()* method on the fitted ColumnTransformer." ] }, { "cell_type": "code", "execution_count": 93, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array(['scaling__age', 'scaling__hours-per-week',\n", " 'one_hot__workclass_Federal-gov', 'one_hot__workclass_Local-gov',\n", " 'one_hot__workclass_Private', 'one_hot__workclass_Self-emp-inc',\n", " 'one_hot__workclass_Self-emp-not-inc',\n", " 'one_hot__workclass_State-gov',\n", " 'one_hot__workclass_infrequent_sklearn', 'target_enc__occupation',\n", " 'ordinal__education', 'ordinal__capital-gain-category'],\n", " dtype=object)" ] }, "execution_count": 93, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ct.get_feature_names_out()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's access the one hot encoder inside the column transformer using the attribute `named_transformers_` to check that we did indeed end up with two categories grouped in *'one_hot__workclass_infrequent_sklearn'* category:" ] }, { "cell_type": "code", "execution_count": 95, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[array(['Never-worked', 'Without-pay'], dtype=object)]" ] }, "execution_count": 95, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ct.named_transformers_['one_hot'].infrequent_categories_" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that we fitted the column transformer with X and y. Here we needed y only because we used traget encoding. If we did not use it, we would fit with only X." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, we can build a *LogisticRegression* model. Since we transformed our train data, the same transformations must be done for the test data. As before, we only apply the *transform* on the test data." ] }, { "cell_type": "code", "execution_count": 98, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " precision recall f1-score support\n", "\n", " <=50K 0.82 0.94 0.88 6159\n", " >50K 0.66 0.38 0.48 1982\n", "\n", " accuracy 0.80 8141\n", " macro avg 0.74 0.66 0.68 8141\n", "weighted avg 0.78 0.80 0.78 8141\n", "\n" ] } ], "source": [ "from sklearn.metrics import classification_report\n", "logreg = LogisticRegression(solver=\"liblinear\", random_state=42)\n", "logreg.fit(X_train_trans, y_train)\n", "\n", "X_test_trans = ct.transform(X_test)\n", "y_pred=logreg.predict(X_test_trans)\n", "print(classification_report(y_test, y_pred))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Cross validation and Hyperparameter tuning" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To evaluate our supervised models, so far we have split our dataset into a training set and a test set using the `train_test_split` function, built a model on the training set by calling the `fit` method, and evaluated it on the test set using a variety of metrics.\n", "Note, the reason we split our data into training and test sets is that we are interested in measuring how well our model *generalizes* to new, previously unseen data. We are not interested in how well our model fit the training set, but rather in how\n", "well it can make predictions for data that was not observed during training." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Cross-validation is a statistical method of evaluating generalization performance that is more stable and thorough than using a split into a training and a test set. In cross-validation, the data is instead split repeatedly and multiple models are trained. The\n", "most commonly used version of cross-validation is k-fold cross-validation, where k is a user-specified number, usually 5 or 10. When performing five-fold cross-validation, the data is first partitioned into five parts of (approximately) equal size, called folds.\n", "Next, a sequence of models is trained. The first model is trained using the first fold as the test set, and the remaining folds (2–5) are used as the training set. The model is built using the data in folds 2–5, and then the accuracy is evaluated on fold 1. Then\n", "another model is built, this time using fold 2 as the test set and the data in folds 1, 3, 4, and 5 as the training set. This process is repeated using folds 3, 4, and 5 as test sets. For each of these five splits of the data into training and test sets, we compute the accuracy. In the end, we have collected five accuracy values. Usually, the first fifth of the data is the first fold, the second fifth of the data is the second fold, and so on. (Note: this is not valid for time series.)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's now import the iris dataset, using the parameter *return_X_y=True* to return the features and label directly. We will also shuffle the data, since the data is sorted by labels, and we want to have data instances of different labels in each fold. Later in this notebook, we will return to this and discuss better approach to achieve this, but for now, we will just shuffle the data." ] }, { "cell_type": "code", "execution_count": 103, "metadata": {}, "outputs": [], "source": [ "from sklearn.datasets import load_iris\n", "from sklearn.utils import shuffle\n", "X, y = load_iris(return_X_y=True)\n", "X, y = shuffle(X, y, random_state=0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's check the distribution of the target variable." ] }, { "cell_type": "code", "execution_count": 105, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Counter({2: 50, 1: 50, 0: 50})" ] }, "execution_count": 105, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from collections import Counter \n", "Counter(y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Cross-validation is implemented in `sklearn` using the `cross_val_score` function from the `model_selection` module. The parameters of the `cross_val_score` function are the model we want to evaluate, the training data, and the ground-truth labels. By default, the score computed at each CV iteration is the score method of the estimator. For logistic regression this is accuracy. The following link gives a list of all the possible options that scoring parameter of `cross_val` can take: \\\n", "https://scikit-learn.org/stable/modules/model_evaluation.html \\\n", "If we wanted to use another metric, we could pass another vale to `scoring` parameter, for example `scoring='f1'`. For now, let's keep the default option.\n", "\n", "Let’s evaluate LogisticRegression on the iris dataset: (we will not do scaling for now)." ] }, { "cell_type": "code", "execution_count": 107, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1. 0.86666667 0.96666667 0.96666667 0.96666667]\n" ] } ], "source": [ "from sklearn.model_selection import cross_val_score\n", "log_reg = LogisticRegression(solver=\"liblinear\", random_state=42 , max_iter=10000)\n", "scores = cross_val_score(log_reg, X, y)\n", "print(scores)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "By default, `cross_val_score` performs five-fold cross-validation, returning five\n", "accuracy values. The number of folds can be changed using `cv` parameter." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A common way to summarize the cross-validation accuracy is to compute the mean:\n" ] }, { "cell_type": "code", "execution_count": 110, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Average cross-validation score: 0.9533333333333334\n" ] } ], "source": [ "print(\"Average cross-validation score:\", scores.mean() )" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Using the mean cross-validation we can conclude that we expect the model to be around 95% accurate on average. Looking at all five scores produced by the five-fold cross-validation, we can also conclude that there is a relatively high variance in the\n", "accuracy between folds, ranging from 100% accuracy to 86% accuracy. This could imply that the model is very dependent on the particular folds used for training, but it could also just be a consequence of the small size of the dataset." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that in cross-validation, for each fold, the process can be done in parallel, so for 5-fold CV, if we have computational resources, we could run 5 processes in parallel. With the parameter `n_jobs`, we could specify the number of jobs (number of concurrent threads or processes) to run in parallel. If this parameter is not specified, it means only 1 job is run at a time, while `n_jobs=-1` means that all available CPUs should be used. However, if the training takes a lot of time, allocating all CPUs to cross-validation will leave us without any resources to do other things on the computer.\n", "\n", "To check how many *logical* CPUs we have, we can use `os.cpu_count()`:" ] }, { "cell_type": "code", "execution_count": 113, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "8" ] }, "execution_count": 113, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import os\n", "os.cpu_count()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We have used the default value of the hyperparameter C, which is inverse of regularization strength. However to try to get better model performance, we should try different values. Because hyperparameter tuning is such a common task, there are standard methods in `sklearn` that we can use. We can tune the parameters by using three sets: the training set to build the model, the validation set to select the parameters of the model, and the test set to evaluate the performance of the selected parameters. \n", "After selecting the best parameters using the validation set, **we can rebuild a model using the parameter settings we found, but now training on both the training data and the validation data.** This way, we can use as much data as possible to build our model. The performance of the final model is evaluated on the test set." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Grid search" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The most commonly used method is grid search, which basically means trying all possible combinations of the\n", "parameters of interest." ] }, { "cell_type": "code", "execution_count": 117, "metadata": {}, "outputs": [], "source": [ "X_trainval, X_test, y_trainval, y_test = train_test_split(X, y, random_state=0, test_size=0.2)\n", "# split train+validation set into training and validation sets\n", "X_train, X_val, y_train, y_val = train_test_split(X_trainval, y_trainval, random_state=1, test_size=0.3)" ] }, { "cell_type": "code", "execution_count": 118, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Size of training set: 84, size of validation set: 36 size of test set 30\n" ] } ], "source": [ "print(f'Size of training set: {X_train.shape[0]}, size of validation set: {X_val.shape[0]} size of test set {X_test.shape[0]}')" ] }, { "cell_type": "code", "execution_count": 119, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'C': 10, 'penalty': 'l1'}\n" ] } ], "source": [ "best_score = 0\n", "for penalty_value in ['l1','l2']:\n", " for C_value in [0.001, 0.01, 0.1, 1, 10]:\n", " # for each combination of parameters, train a model\n", " log_reg = LogisticRegression(solver=\"liblinear\", random_state=42, penalty=penalty_value, C=C_value, max_iter=10000)\n", " log_reg.fit(X_train, y_train)\n", " # evaluate the model on the validation set\n", " score = log_reg.score(X_val, y_val)\n", " # if we got a better score, store the score and parameters\n", " if score > best_score:\n", " best_score = score\n", " best_parameters = {'C': C_value, 'penalty': penalty_value}\n", "print(best_parameters)" ] }, { "cell_type": "code", "execution_count": 120, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Best score on validation set 0.9722222222222222\n", "Test set score with best parameters 0.9666666666666667\n" ] } ], "source": [ "# rebuild a model on the combined training and validation set,\n", "# and evaluate it on the test set\n", "log_reg = LogisticRegression(solver=\"liblinear\", random_state=42, penalty=best_parameters['penalty'], C=best_parameters['C'] , max_iter=10000)\n", "log_reg.fit(X_trainval, y_trainval)\n", "test_score = log_reg.score(X_test, y_test)\n", "print('Best score on validation set', best_score)\n", "print(\"Test set score with best parameters\", test_score)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The distinction between the training set, validation set, and test set is fundamentally important to applying machine learning methods in practice. Any choices made based on the test set accuracy \"leak\" information from the test set into the model.\n", "Therefore, it is important to keep a separate test set, which is only used for the final evaluation. It is good practice to do all exploratory analysis and model selection using the combination of a training and a validation set, and reserve the test set for a final evaluation." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "While the method of splitting the data into a training, a validation, and a test set that\n", "we just saw is workable, and relatively commonly used, it is quite sensitive to how\n", "exactly the data is split. For a better estimate of the generalization performance, instead of\n", "using a single split into a training and a validation set, we can use cross-validation to\n", "evaluate the performance of each parameter combination. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Because grid search with cross-validation is such a commonly used method to adjust parameters, `sklearn` provides the `GridSearchCV` class, which implements it in the form of an estimator. To use the `GridSearchCV` class, we first need to specify the\n", "parameters we want to search over using a dictionary. `GridSearchCV` will then perform all the necessary model fits. The keys of the dictionary are the names of parameters we want to adjust (as given when constructing the model, in this case, *C* and\n", "*penalty*), and the values are the parameter settings we want to try out. The default metric for evaluation used will be the default score of the estimator, but just like in `cross_val_score`, a different `scoring` metric can be set." ] }, { "cell_type": "code", "execution_count": 124, "metadata": {}, "outputs": [], "source": [ "from sklearn.model_selection import GridSearchCV" ] }, { "cell_type": "code", "execution_count": 125, "metadata": {}, "outputs": [], "source": [ "param_grid = {'C': [0.001, 0.01, 0.1, 1, 10],\n", " 'penalty': ['l1','l2']}" ] }, { "cell_type": "code", "execution_count": 126, "metadata": {}, "outputs": [], "source": [ "X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0, test_size=0.2)" ] }, { "cell_type": "code", "execution_count": 127, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Size of training set: 120, size of test set 30\n" ] } ], "source": [ "print(f'Size of training set: {X_train.shape[0]}, size of test set {X_test.shape[0]}')" ] }, { "cell_type": "code", "execution_count": 128, "metadata": {}, "outputs": [], "source": [ "grid_search = GridSearchCV(LogisticRegression(solver=\"liblinear\", random_state=42, max_iter=10000), param_grid, cv=5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The grid_search object that we created behaves just like a classifier; we can call the standard methods `fit`, `predict`, and `score` on it. However, when we call `fit`, it will run cross-validation for each combination of parameters we specified in the parameter grid. We have 5 different values for *C*, and 2 for *penalty*, giving in total 10 combinations. For each combination 5-fold CV is used, meaning in total 50 models are trained. And here we only have two parameters we want to tune. Hence, when running a grid search over many parameters and on large datasets it can be computationally challenging. One way to speed things up is with parallelization. Since using a particular parameter setting on a particular cross-validation split can be done completely independently from the other parameter settings and models, we can again parallelized just like we mentioned in `cross_val_score`. In GridSearchCV we could also use the parameter `n_jobs` to define how many jobs could be run in parallel." ] }, { "cell_type": "code", "execution_count": 130, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
GridSearchCV(cv=5,\n",
       "             estimator=LogisticRegression(max_iter=10000, random_state=42,\n",
       "                                          solver='liblinear'),\n",
       "             param_grid={'C': [0.001, 0.01, 0.1, 1, 10],\n",
       "                         'penalty': ['l1', 'l2']})
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "GridSearchCV(cv=5,\n", " estimator=LogisticRegression(max_iter=10000, random_state=42,\n", " solver='liblinear'),\n", " param_grid={'C': [0.001, 0.01, 0.1, 1, 10],\n", " 'penalty': ['l1', 'l2']})" ] }, "execution_count": 130, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grid_search.fit(X_train, y_train)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now that this is fit, we can ask for the best parameters as follows:" ] }, { "cell_type": "code", "execution_count": 132, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'C': 10, 'penalty': 'l2'}" ] }, "execution_count": 132, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grid_search.best_params_" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The best cross-validation accuracy (the mean accuracy over the different splits for this parameter setting) is stored in `best_score_`:" ] }, { "cell_type": "code", "execution_count": 134, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.975" ] }, "execution_count": 134, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grid_search.best_score_" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The results of a grid search can be found\n", "in the `cv_results_` attribute, which is a dictionary storing all aspects of the search. We can convert it to a pandas dataframe to view it:" ] }, { "cell_type": "code", "execution_count": 136, "metadata": {}, "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", "
mean_fit_timestd_fit_timemean_score_timestd_score_timeparam_Cparam_penaltyparamssplit0_test_scoresplit1_test_scoresplit2_test_scoresplit3_test_scoresplit4_test_scoremean_test_scorestd_test_scorerank_test_score
00.0029270.0016640.0031220.0013380.001l1{'C': 0.001, 'penalty': 'l1'}0.3333330.3333330.3333330.3333330.3333330.3333330.0000009
10.0041150.0020870.0039500.0019740.001l2{'C': 0.001, 'penalty': 'l2'}0.3333330.3333330.3333330.2916670.3333330.3250000.01666710
20.0034390.0020830.0011410.0008250.010l1{'C': 0.01, 'penalty': 'l1'}0.3333330.3333330.3333330.3750000.3750000.3500000.0204128
\n", "
" ], "text/plain": [ " mean_fit_time std_fit_time mean_score_time std_score_time param_C \\\n", "0 0.002927 0.001664 0.003122 0.001338 0.001 \n", "1 0.004115 0.002087 0.003950 0.001974 0.001 \n", "2 0.003439 0.002083 0.001141 0.000825 0.010 \n", "\n", " param_penalty params split0_test_score \\\n", "0 l1 {'C': 0.001, 'penalty': 'l1'} 0.333333 \n", "1 l2 {'C': 0.001, 'penalty': 'l2'} 0.333333 \n", "2 l1 {'C': 0.01, 'penalty': 'l1'} 0.333333 \n", "\n", " split1_test_score split2_test_score split3_test_score split4_test_score \\\n", "0 0.333333 0.333333 0.333333 0.333333 \n", "1 0.333333 0.333333 0.291667 0.333333 \n", "2 0.333333 0.333333 0.375000 0.375000 \n", "\n", " mean_test_score std_test_score rank_test_score \n", "0 0.333333 0.000000 9 \n", "1 0.325000 0.016667 10 \n", "2 0.350000 0.020412 8 " ] }, "execution_count": 136, "metadata": {}, "output_type": "execute_result" } ], "source": [ "results = pd.DataFrame(grid_search.cv_results_)\n", "results.head(3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "By default an estimator is retrained using the best found parameters on the whole train dataset. We can access the model with `.best_estimator_` attribute and test its perfromance on the test set:" ] }, { "cell_type": "code", "execution_count": 138, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.9666666666666667" ] }, "execution_count": 138, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grid_search.best_estimator_.score(X_test, y_test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Or we could have just used the score method directly on the grid_search:" ] }, { "cell_type": "code", "execution_count": 140, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.9666666666666667" ] }, "execution_count": 140, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grid_search.score(X_test, y_test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The important thing here is that **we did not use the test set to choose the parameters**, meaning the final test set was only used for the final model evaluation. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Randomized search" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If we had many different paramenters and many values to evaluate, randomized search would be a better option than grid. In contrast to `GridSearchCV`, not all parameter values are tried out, but rather a fixed number of parameter settings is sampled from the specified distributions. The number of parameter settings that are tried is given by *n_iter*." ] }, { "cell_type": "code", "execution_count": 144, "metadata": {}, "outputs": [], "source": [ "from sklearn.model_selection import RandomizedSearchCV" ] }, { "cell_type": "code", "execution_count": 145, "metadata": {}, "outputs": [], "source": [ "from scipy.stats import loguniform\n", "\n", "distributions= { 'C': loguniform(0.0001, 10), \n", " 'penalty': ['l1', 'l2']}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Using a loguniform distribution instead of a regular uniform distribution will ensure that in a sufficiently large number of trials, the same number of samples will be drawn from the [0.0001, 0.001] range as, for example, the [1, 10] range." ] }, { "cell_type": "code", "execution_count": 147, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'C': 4.600306804490298, 'penalty': 'l2'}" ] }, "execution_count": 147, "metadata": {}, "output_type": "execute_result" } ], "source": [ "random_search = RandomizedSearchCV(LogisticRegression(solver=\"liblinear\", random_state=42, max_iter=10000), distributions, cv=5, n_iter=10, random_state=1)\n", "random_search.fit(X_train, y_train)\n", "random_search.best_params_" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Running the results with a different seed especially for a small number of iterations might lead to different parameters selected. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we evaluate the performance of the model with the best parameters on the test set:" ] }, { "cell_type": "code", "execution_count": 150, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.9666666666666667" ] }, "execution_count": 150, "metadata": {}, "output_type": "execute_result" } ], "source": [ "random_search.score(X_test, y_test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Just like in `GridSearchCV` we could change the `scoring` method, use parallelization with `n_jobs`, view `cv_results_` and access the model through `best_estimator`.\n", "\n", "If we had a large number of parameters, would me much more practical choice than `GridSearchCV`. However, there are more efficient approached than `RandomizedSearchCV`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Successive Halving search" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*Sklearn* also provides the *HalvingGridSearchCV* and *HalvingRandomSearchCV* estimators that can be used to search a parameter space using successive halving . Successive halving (SH) is like a tournament among candidate hyperparameter combinations. It is an iterative selection process where all candidates (the hyperparameter combinations) are evaluated with a small amount of resources at the first iteration. Only some of these candidates are selected for the next iteration, which will be allocated more resources. For parameter tuning, the resource is typically the number of training samples, but it can also be an arbitrary numeric parameter." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can summarize the procedure via the following steps:\n", "\n", "1. Draw a large set of candidate configurations (hyperparameter combinations) via random sampling.\n", "2. Train the models (i.e., each set of hyperparameter combinations) with limited resources, for example, a small subset of the training data (as opposed to using the entire training set).\n", "3. Discard the bottom 50 percent (typical value) based on predictive performance.\n", "4. Go back to step 2 with an increased amount of available resources for each of the surviving configurations.\n", "\n", "The steps are repeated until only one hyperparameter configuration remains." ] }, { "cell_type": "code", "execution_count": 155, "metadata": {}, "outputs": [], "source": [ "from sklearn.experimental import enable_halving_search_cv" ] }, { "cell_type": "code", "execution_count": 156, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'C': 4.600306804490298, 'penalty': 'l2'}" ] }, "execution_count": 156, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.model_selection import HalvingRandomSearchCV\n", "hs = HalvingRandomSearchCV(LogisticRegression(solver=\"liblinear\", random_state=42, max_iter=10000), \n", " param_distributions=distributions, \n", "# specifies the resource that will be allocated to each candidate configuration during evaluation. \n", "# In this case, it's set to 'n_samples', indicating that the number of training samples will be used as the resource. \n", "# Each candidate configuration will be trained and evaluated using a subset of the training data.\n", " resource='n_samples', \n", "# select half of candidates in each iteration % (default is 3, select 1/3 of candidates) \n", " factor=2, \n", "# The number of candidate parameters to sample, at the first iteration.\n", " n_candidates=10,\n", " random_state=1)\n", "\n", "hs.fit(X_train, y_train)\n", "hs.best_params_" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Again, we evaluate the performance of the model with the best parameters on the test set:" ] }, { "cell_type": "code", "execution_count": 158, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.9666666666666667" ] }, "execution_count": 158, "metadata": {}, "output_type": "execute_result" } ], "source": [ "hs.score(X_test, y_test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The `cv_results_` attribute again contains useful information for analyzing the results of a search." ] }, { "cell_type": "code", "execution_count": 160, "metadata": {}, "outputs": [], "source": [ "pd.set_option('display.max_columns', None)" ] }, { "cell_type": "code", "execution_count": 161, "metadata": {}, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
itern_resourcesmean_fit_timestd_fit_timemean_score_timestd_score_timeparam_Cparam_penaltyparamssplit0_test_scoresplit1_test_scoresplit2_test_scoresplit3_test_scoresplit4_test_scoremean_test_scorestd_test_scorerank_test_scoresplit0_train_scoresplit1_train_scoresplit2_train_scoresplit3_train_scoresplit4_train_scoremean_train_scorestd_train_score
00300.0049110.0017390.0035970.0027060.012165l1{'C': 0.012164941464151846, 'penalty': 'l1'}0.5000000.5000000.3333330.3333330.5000000.4333330.08165070.3333330.2500000.3333330.3333330.2916670.3083330.033333
10300.0095510.0064140.0088870.0119554.600307l2{'C': 4.600306804490298, 'penalty': 'l2'}0.8333331.0000000.8333330.6666671.0000000.8666670.12472240.9166670.8750000.8750000.9583330.9583330.9166670.037268
20300.0115710.0164720.0041930.0048230.003248l2{'C': 0.003248350345086679, 'penalty': 'l2'}0.1666670.1666670.3333330.1666670.3333330.2333330.081650150.5000000.5416670.4583330.4583330.4583330.4833330.033333
30300.0067100.0062440.0016950.0014380.001515l2{'C': 0.0015151125123102904, 'penalty': 'l2'}0.1666670.1666670.3333330.1666670.3333330.2333330.081650150.5000000.5416670.4583330.4583330.4583330.4833330.033333
40300.0074520.0030270.0129580.0100960.000854l2{'C': 0.0008536916958038761, 'penalty': 'l2'}0.1666670.1666670.3333330.1666670.3333330.2333330.081650150.5000000.5416670.4583330.4583330.4583330.4833330.033333
50300.0036070.0039760.0056990.0020870.223218l2{'C': 0.223218499287176, 'penalty': 'l2'}0.6666670.6666670.6666670.5000000.8333330.6666670.10540960.8333330.7916670.7916670.7916670.7500000.7916670.026352
60300.0048120.0031950.0006300.0012600.049441l1{'C': 0.04944059287398676, 'penalty': 'l1'}0.1666670.1666670.3333330.1666670.3333330.2333330.081650150.5000000.5416670.4583330.4583330.4583330.4833330.033333
70300.0046580.0011810.0056180.0043660.003684l1{'C': 0.0036844068804921994, 'penalty': 'l1'}0.5000000.5000000.3333330.3333330.5000000.4333330.08165070.3333330.2500000.3333330.3333330.2916670.3083330.033333
80300.0041790.0037690.0043230.0061010.001053l1{'C': 0.001052594868979971, 'penalty': 'l1'}0.5000000.5000000.3333330.3333330.5000000.4333330.08165070.3333330.2500000.3333330.3333330.2916670.3083330.033333
90300.0080030.0052190.0028000.0037680.001406l1{'C': 0.0014056787147388348, 'penalty': 'l1'}0.5000000.5000000.3333330.3333330.5000000.4333330.08165070.3333330.2500000.3333330.3333330.2916670.3083330.033333
101600.0053310.0071960.0099760.0097960.003684l1{'C': 0.0036844068804921994, 'penalty': 'l1'}0.3333330.3333330.3333330.3333330.4166670.3500000.033333110.3125000.2916670.3750000.3125000.3125000.3208330.028260
111600.0062900.0055080.0048300.0052750.001053l1{'C': 0.001052594868979971, 'penalty': 'l1'}0.3333330.3333330.3333330.3333330.4166670.3500000.033333110.3125000.2916670.3750000.3125000.3125000.3208330.028260
121600.0061850.0045790.0038500.0043120.001406l1{'C': 0.0014056787147388348, 'penalty': 'l1'}0.3333330.3333330.3333330.3333330.4166670.3500000.033333110.3125000.2916670.3750000.3125000.3125000.3208330.028260
131600.0055310.0057630.0070230.0058310.223218l2{'C': 0.223218499287176, 'penalty': 'l2'}0.7500000.6666670.6666670.8333331.0000000.7833330.12472250.8125000.7916670.7916670.9375000.8541670.8375000.054962
141600.0076990.0023740.0035440.0016804.600307l2{'C': 4.600306804490298, 'penalty': 'l2'}0.9166671.0000000.8333330.9166671.0000000.9333330.06236120.9583330.9583330.9583331.0000000.9791670.9708330.016667
1521200.0072810.0026730.0074580.0032150.001406l1{'C': 0.0014056787147388348, 'penalty': 'l1'}0.3333330.3333330.3333330.3333330.3333330.3333330.000000140.3333330.3333330.3333330.3333330.3333330.3333330.000000
1621200.0054870.0032900.0065340.0059490.223218l2{'C': 0.223218499287176, 'penalty': 'l2'}0.8333330.9166670.9583330.8750000.9583330.9083330.04859130.9479170.9270830.9375000.9166670.8958330.9250000.017922
1721200.0063140.0046300.0029070.0014854.600307l2{'C': 4.600306804490298, 'penalty': 'l2'}0.9583331.0000000.9583330.9583330.9583330.9666670.01666710.9583330.9687500.9687500.9791670.9583330.9666670.007795
\n", "
" ], "text/plain": [ " iter n_resources mean_fit_time std_fit_time mean_score_time \\\n", "0 0 30 0.004911 0.001739 0.003597 \n", "1 0 30 0.009551 0.006414 0.008887 \n", "2 0 30 0.011571 0.016472 0.004193 \n", "3 0 30 0.006710 0.006244 0.001695 \n", "4 0 30 0.007452 0.003027 0.012958 \n", "5 0 30 0.003607 0.003976 0.005699 \n", "6 0 30 0.004812 0.003195 0.000630 \n", "7 0 30 0.004658 0.001181 0.005618 \n", "8 0 30 0.004179 0.003769 0.004323 \n", "9 0 30 0.008003 0.005219 0.002800 \n", "10 1 60 0.005331 0.007196 0.009976 \n", "11 1 60 0.006290 0.005508 0.004830 \n", "12 1 60 0.006185 0.004579 0.003850 \n", "13 1 60 0.005531 0.005763 0.007023 \n", "14 1 60 0.007699 0.002374 0.003544 \n", "15 2 120 0.007281 0.002673 0.007458 \n", "16 2 120 0.005487 0.003290 0.006534 \n", "17 2 120 0.006314 0.004630 0.002907 \n", "\n", " std_score_time param_C param_penalty \\\n", "0 0.002706 0.012165 l1 \n", "1 0.011955 4.600307 l2 \n", "2 0.004823 0.003248 l2 \n", "3 0.001438 0.001515 l2 \n", "4 0.010096 0.000854 l2 \n", "5 0.002087 0.223218 l2 \n", "6 0.001260 0.049441 l1 \n", "7 0.004366 0.003684 l1 \n", "8 0.006101 0.001053 l1 \n", "9 0.003768 0.001406 l1 \n", "10 0.009796 0.003684 l1 \n", "11 0.005275 0.001053 l1 \n", "12 0.004312 0.001406 l1 \n", "13 0.005831 0.223218 l2 \n", "14 0.001680 4.600307 l2 \n", "15 0.003215 0.001406 l1 \n", "16 0.005949 0.223218 l2 \n", "17 0.001485 4.600307 l2 \n", "\n", " params split0_test_score \\\n", "0 {'C': 0.012164941464151846, 'penalty': 'l1'} 0.500000 \n", "1 {'C': 4.600306804490298, 'penalty': 'l2'} 0.833333 \n", "2 {'C': 0.003248350345086679, 'penalty': 'l2'} 0.166667 \n", "3 {'C': 0.0015151125123102904, 'penalty': 'l2'} 0.166667 \n", "4 {'C': 0.0008536916958038761, 'penalty': 'l2'} 0.166667 \n", "5 {'C': 0.223218499287176, 'penalty': 'l2'} 0.666667 \n", "6 {'C': 0.04944059287398676, 'penalty': 'l1'} 0.166667 \n", "7 {'C': 0.0036844068804921994, 'penalty': 'l1'} 0.500000 \n", "8 {'C': 0.001052594868979971, 'penalty': 'l1'} 0.500000 \n", "9 {'C': 0.0014056787147388348, 'penalty': 'l1'} 0.500000 \n", "10 {'C': 0.0036844068804921994, 'penalty': 'l1'} 0.333333 \n", "11 {'C': 0.001052594868979971, 'penalty': 'l1'} 0.333333 \n", "12 {'C': 0.0014056787147388348, 'penalty': 'l1'} 0.333333 \n", "13 {'C': 0.223218499287176, 'penalty': 'l2'} 0.750000 \n", "14 {'C': 4.600306804490298, 'penalty': 'l2'} 0.916667 \n", "15 {'C': 0.0014056787147388348, 'penalty': 'l1'} 0.333333 \n", "16 {'C': 0.223218499287176, 'penalty': 'l2'} 0.833333 \n", "17 {'C': 4.600306804490298, 'penalty': 'l2'} 0.958333 \n", "\n", " split1_test_score split2_test_score split3_test_score \\\n", "0 0.500000 0.333333 0.333333 \n", "1 1.000000 0.833333 0.666667 \n", "2 0.166667 0.333333 0.166667 \n", "3 0.166667 0.333333 0.166667 \n", "4 0.166667 0.333333 0.166667 \n", "5 0.666667 0.666667 0.500000 \n", "6 0.166667 0.333333 0.166667 \n", "7 0.500000 0.333333 0.333333 \n", "8 0.500000 0.333333 0.333333 \n", "9 0.500000 0.333333 0.333333 \n", "10 0.333333 0.333333 0.333333 \n", "11 0.333333 0.333333 0.333333 \n", "12 0.333333 0.333333 0.333333 \n", "13 0.666667 0.666667 0.833333 \n", "14 1.000000 0.833333 0.916667 \n", "15 0.333333 0.333333 0.333333 \n", "16 0.916667 0.958333 0.875000 \n", "17 1.000000 0.958333 0.958333 \n", "\n", " split4_test_score mean_test_score std_test_score rank_test_score \\\n", "0 0.500000 0.433333 0.081650 7 \n", "1 1.000000 0.866667 0.124722 4 \n", "2 0.333333 0.233333 0.081650 15 \n", "3 0.333333 0.233333 0.081650 15 \n", "4 0.333333 0.233333 0.081650 15 \n", "5 0.833333 0.666667 0.105409 6 \n", "6 0.333333 0.233333 0.081650 15 \n", "7 0.500000 0.433333 0.081650 7 \n", "8 0.500000 0.433333 0.081650 7 \n", "9 0.500000 0.433333 0.081650 7 \n", "10 0.416667 0.350000 0.033333 11 \n", "11 0.416667 0.350000 0.033333 11 \n", "12 0.416667 0.350000 0.033333 11 \n", "13 1.000000 0.783333 0.124722 5 \n", "14 1.000000 0.933333 0.062361 2 \n", "15 0.333333 0.333333 0.000000 14 \n", "16 0.958333 0.908333 0.048591 3 \n", "17 0.958333 0.966667 0.016667 1 \n", "\n", " split0_train_score split1_train_score split2_train_score \\\n", "0 0.333333 0.250000 0.333333 \n", "1 0.916667 0.875000 0.875000 \n", "2 0.500000 0.541667 0.458333 \n", "3 0.500000 0.541667 0.458333 \n", "4 0.500000 0.541667 0.458333 \n", "5 0.833333 0.791667 0.791667 \n", "6 0.500000 0.541667 0.458333 \n", "7 0.333333 0.250000 0.333333 \n", "8 0.333333 0.250000 0.333333 \n", "9 0.333333 0.250000 0.333333 \n", "10 0.312500 0.291667 0.375000 \n", "11 0.312500 0.291667 0.375000 \n", "12 0.312500 0.291667 0.375000 \n", "13 0.812500 0.791667 0.791667 \n", "14 0.958333 0.958333 0.958333 \n", "15 0.333333 0.333333 0.333333 \n", "16 0.947917 0.927083 0.937500 \n", "17 0.958333 0.968750 0.968750 \n", "\n", " split3_train_score split4_train_score mean_train_score std_train_score \n", "0 0.333333 0.291667 0.308333 0.033333 \n", "1 0.958333 0.958333 0.916667 0.037268 \n", "2 0.458333 0.458333 0.483333 0.033333 \n", "3 0.458333 0.458333 0.483333 0.033333 \n", "4 0.458333 0.458333 0.483333 0.033333 \n", "5 0.791667 0.750000 0.791667 0.026352 \n", "6 0.458333 0.458333 0.483333 0.033333 \n", "7 0.333333 0.291667 0.308333 0.033333 \n", "8 0.333333 0.291667 0.308333 0.033333 \n", "9 0.333333 0.291667 0.308333 0.033333 \n", "10 0.312500 0.312500 0.320833 0.028260 \n", "11 0.312500 0.312500 0.320833 0.028260 \n", "12 0.312500 0.312500 0.320833 0.028260 \n", "13 0.937500 0.854167 0.837500 0.054962 \n", "14 1.000000 0.979167 0.970833 0.016667 \n", "15 0.333333 0.333333 0.333333 0.000000 \n", "16 0.916667 0.895833 0.925000 0.017922 \n", "17 0.979167 0.958333 0.966667 0.007795 " ] }, "execution_count": 161, "metadata": {}, "output_type": "execute_result" } ], "source": [ "results = pd.DataFrame(hs.cv_results_)\n", "results" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "From the results we can see that in the first round (iter 0), 10 different hyperparameter combinations were used. Since a factor of 2 was specified, this means only 5 combinations were selected for the next round with double the number of resources, i.e., the number of training data points used increased from 30 to 60. Then, half of these 5 combinations were selected, in our case, this is 3, to go to the next round, and the models were trained on all the samples. Out of those 3 combinations, the one with the highest *mean_test_score* (lowest `rank_test_score`) was selected as the best one." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Other libraries for hyperparameter tuning" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Since hyperparameter tuning is a very important step in modeling, many different approaches and libraries were developed to speed up the model tuning when there are many different parameters to be tuned. Here, we will illustrate one such simple library, `scikit-optimize`, which implements Bayesian optimization, which works by considering the previously seen hyperparameter combinations when determining the next set of hyperparameters to evaluate. Bayesian optimization reduces the number of evaluations needed to identify optimal hyperparameters, making it effective for optimizing complex models.\n", "Let's install the `scikit-optimize` library with:\n", "\n", "`pip install scikit-optimize`\n", "\n", "Note that when importing this library is referred to as: `skopt`." ] }, { "cell_type": "code", "execution_count": 165, "metadata": {}, "outputs": [], "source": [ "from skopt import BayesSearchCV\n", "from skopt.space import Real " ] }, { "cell_type": "code", "execution_count": 166, "metadata": {}, "outputs": [], "source": [ "distributions = {\n", " 'penalty': ['l1','l2'],\n", " 'C': Real(low=1e-4, high=10, prior='log-uniform'),\n", "}" ] }, { "cell_type": "code", "execution_count": 167, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
BayesSearchCV(estimator=LogisticRegression(max_iter=10000, random_state=42,\n",
       "                                           solver='liblinear'),\n",
       "              n_iter=10, random_state=1,\n",
       "              search_spaces={'C': Real(low=0.0001, high=10, prior='log-uniform', transform='normalize'),\n",
       "                             'penalty': ['l1', 'l2']})
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "BayesSearchCV(estimator=LogisticRegression(max_iter=10000, random_state=42,\n", " solver='liblinear'),\n", " n_iter=10, random_state=1,\n", " search_spaces={'C': Real(low=0.0001, high=10, prior='log-uniform', transform='normalize'),\n", " 'penalty': ['l1', 'l2']})" ] }, "execution_count": 167, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.int = int\n", "opt = BayesSearchCV(\n", " LogisticRegression(solver=\"liblinear\", random_state=42, max_iter=10000),\n", " distributions,\n", " n_iter=10,\n", " random_state=1\n", ")\n", "\n", "opt.fit(X_train, y_train)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can see the best parameters:" ] }, { "cell_type": "code", "execution_count": 169, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "OrderedDict([('C', 2.4458265756334576), ('penalty', 'l1')])" ] }, "execution_count": 169, "metadata": {}, "output_type": "execute_result" } ], "source": [ "opt.best_params_" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And, as before, we can access the best model with:" ] }, { "cell_type": "code", "execution_count": 171, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
LogisticRegression(C=2.4458265756334576, max_iter=10000, penalty='l1',\n",
       "                   random_state=42, solver='liblinear')
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "LogisticRegression(C=2.4458265756334576, max_iter=10000, penalty='l1',\n", " random_state=42, solver='liblinear')" ] }, "execution_count": 171, "metadata": {}, "output_type": "execute_result" } ], "source": [ "opt.best_estimator_" ] }, { "cell_type": "code", "execution_count": 172, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.9666666666666667" ] }, "execution_count": 172, "metadata": {}, "output_type": "execute_result" } ], "source": [ "opt.score(X_test, y_test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Practice question\n", "Using sklearn's make_regression, generate a toy dataset:\n", "\n", "X, y = make_regression(n_samples=100, n_features=10, noise=20, n_informative=5, random_state=1), \n", "\n", "split it into train and test. Then use Ridge regression with grid search cross validation to find the value of $\\alpha$ that minimizes the mean square error. Then evaluate this model on the test set. Hint: check the `scoring` parameter and the score method *'neg_root_mean_squared_error'*." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Note" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We have mentioned that no modeling decision should be done on the test dataset, and that we use validation data to make model selection and parameter tuning. Let's think about the preprocessing steps such as scaling. If we can use the `fit` method only on the train dataset, and not the validation dataset, how do we apply CV, without applying `fit` to the testing fold?\n", "\n", "Next, we will introduce `pipelines` which will help us with this issue. But without `pipelines`, in the above code, we did not apply the scaling stage before cross validation, even for the regularized models." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Algorithm chains and pipelines" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The following exercise is adapted from Chapter 6 of *Introduction to Machine Learning with Python* by Andreas C. Müller, Sarah Guido.\n", "\n", "In this section we will review how to chain together many different processing steps and machine learning models by using *Pipeline* class. \n", " \n", "Let's start with an example of using a scaler, before applying a machine learning model, this time to do regression. We will use house price dataset from `sklearn`, and apply Ridge Regression. Before applying the model, we will split the data into train and test, and fit the `MinMax` scaler on the training data, and then transform both the training and the testing data. Note that we are scaling here to ensure that the gradient descent moves smoothly towards the minima and that the steps for gradient descent are updated at the same rate for all the features." ] }, { "cell_type": "code", "execution_count": 178, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ ".. _california_housing_dataset:\n", "\n", "California Housing dataset\n", "--------------------------\n", "\n", "**Data Set Characteristics:**\n", "\n", ":Number of Instances: 20640\n", "\n", ":Number of Attributes: 8 numeric, predictive attributes and the target\n", "\n", ":Attribute Information:\n", " - MedInc median income in block group\n", " - HouseAge median house age in block group\n", " - AveRooms average number of rooms per household\n", " - AveBedrms average number of bedrooms per household\n", " - Population block group population\n", " - AveOccup average number of household members\n", " - Latitude block group latitude\n", " - Longitude block group longitude\n", "\n", ":Missing Attribute Values: None\n", "\n", "This dataset was obtained from the StatLib repository.\n", "https://www.dcc.fc.up.pt/~ltorgo/Regression/cal_housing.html\n", "\n", "The target variable is the median house value for California districts,\n", "expressed in hundreds of thousands of dollars ($100,000).\n", "\n", "This dataset was derived from the 1990 U.S. census, using one row per census\n", "block group. A block group is the smallest geographical unit for which the U.S.\n", "Census Bureau publishes sample data (a block group typically has a population\n", "of 600 to 3,000 people).\n", "\n", "A household is a group of people residing within a home. Since the average\n", "number of rooms and bedrooms in this dataset are provided per household, these\n", "columns may take surprisingly large values for block groups with few households\n", "and many empty houses, such as vacation resorts.\n", "\n", "It can be downloaded/loaded using the\n", ":func:`sklearn.datasets.fetch_california_housing` function.\n", "\n", ".. rubric:: References\n", "\n", "- Pace, R. Kelley and Ronald Barry, Sparse Spatial Autoregressions,\n", " Statistics and Probability Letters, 33 (1997) 291-297\n", "\n" ] } ], "source": [ "from sklearn.linear_model import Ridge\n", "from sklearn.metrics import classification_report\n", "\n", "# load the data\n", "from sklearn.datasets import fetch_california_housing\n", "housing = fetch_california_housing()\n", "print(housing.DESCR)" ] }, { "cell_type": "code", "execution_count": 179, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Ridge(alpha=0.01)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "Ridge(alpha=0.01)" ] }, "execution_count": 179, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_train, X_test, y_train, y_test = train_test_split(housing.data, housing.target, random_state=0)\n", "# compute minimum and maximum on the training data\n", "scaler = MinMaxScaler().fit(X_train)\n", "# rescale the training data\n", "X_train_scaled = scaler.transform(X_train)\n", "X_test_scaled = scaler.transform(X_test)\n", "\n", "\n", "ridge = Ridge(alpha=0.01)\n", "ridge.fit(X_train_scaled, y_train)" ] }, { "cell_type": "code", "execution_count": 180, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Mean squared error: 0.540554646703696\n", "Root mean squared error: 0.7352242152593289\n", "R2: 0.5910622391340353\n" ] } ], "source": [ "from sklearn.metrics import mean_squared_error, root_mean_squared_error\n", "from sklearn.metrics import r2_score\n", "\n", "y_pred=ridge.predict(X_test_scaled)\n", "print('Mean squared error:', mean_squared_error(y_test, y_pred))\n", "print('Root mean squared error:', root_mean_squared_error(y_test, y_pred))\n", "print('R2: ', r2_score(y_test, y_pred))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " For `RidgeRegression` the default scoring is the R2. Hence, if we were only interested in R2, we could have simply used the *score* function:" ] }, { "cell_type": "code", "execution_count": 182, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.5910622391340353" ] }, "execution_count": 182, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ridge.score(X_test_scaled, y_test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, let's say we want to find better parameters for the ridge using *GridSearchCV*. \n", " \n", "A naive and WRONG approach to doing a grid search with data scaling might look like this:" ] }, { "cell_type": "code", "execution_count": 184, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
GridSearchCV(cv=5, estimator=Ridge(),\n",
       "             param_grid={'alpha': [0.005, 0.01, 0.05, 0.1, 0.5, 1]},\n",
       "             scoring='neg_root_mean_squared_error')
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "GridSearchCV(cv=5, estimator=Ridge(),\n", " param_grid={'alpha': [0.005, 0.01, 0.05, 0.1, 0.5, 1]},\n", " scoring='neg_root_mean_squared_error')" ] }, "execution_count": 184, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.model_selection import GridSearchCV\n", "# for illustration purposes only, don't use this code!\n", "param_grid = {'alpha': [0.005, 0.01, 0.05, 0.1, 0.5, 1] }\n", "grid = GridSearchCV(Ridge(), param_grid=param_grid, cv=5, scoring='neg_root_mean_squared_error')\n", "grid.fit(X_train_scaled, y_train)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here, we ran the grid search over the parameter of *Ridge* using the scaled data. However, there is a subtle catch in what we just did. When scaling the data, we used ALL the data in the training set to compute the minimum and maximum of the data. We then used the scaled training data to run our grid search using cross-validation. For each split in the cross-validation, some part of the original training set will be declared the training part of the split, and some the test part of the split. The test part is used to measure the performance of a model trained on the training part when applied to new data. However, we already used the information contained in the test part of the split, when scaling the data. \n", "\n", "So, the splits in the cross-validation no longer correctly mirror how new data will look to the modeling process. We already leaked information from these parts of the data into our modeling process. This will lead to overly optimistic results during cross-validation, and possibly the selection of sub-optimal parameters.\n", "\n", "To get around this problem, the splitting of the dataset during cross-validation should be done BEFORE doing any pre-processing. Any process that extracts knowledge from the dataset should only ever be learned from the training portion of the dataset, and therefore be contained inside the cross-validation loop.\n", "\n", "To achieve this in `sklearn` with the `GridSearchCV` function, we can use the `Pipeline` class. The `Pipeline` class is a class that allows \"gluing\" together multiple processing steps into a single `sklearn` estimator.\n", "\n", "The `Pipeline` class itself has `fit`, `predict`, and `score` methods and behaves just like any other model in `sklearn`. The most common use case of the `Pipeline` class is in chaining pre-processing steps (like scaling of the data) together with a supervised model like a classifier." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Building Pipelines\n", " First, we build a pipeline object by providing it with a list of steps. Each step is a tuple containing a name (any string of our choosing) and an instance of an estimator:" ] }, { "cell_type": "code", "execution_count": 187, "metadata": {}, "outputs": [], "source": [ "from sklearn.pipeline import Pipeline\n", "pipe = Pipeline([('scaler', MinMaxScaler()), \n", " ('ridge', Ridge(alpha=0.01))])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Just like for `ColumnTransformer`, when the `sklearn` display setting is set to diagram, with `set_config(display='text')`, we can visualize the pipeline. Note that clicking on the diagram below allows us to see the details of each step:" ] }, { "cell_type": "code", "execution_count": 189, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Pipeline(steps=[('scaler', MinMaxScaler()), ('ridge', Ridge(alpha=0.01))])
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "Pipeline(steps=[('scaler', MinMaxScaler()), ('ridge', Ridge(alpha=0.01))])" ] }, "execution_count": 189, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pipe" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here, we created two steps: the first, called \"scaler\", is an instance of *MinMaxScaler*, and the second, called \"ridge\", is an instance of *Ridge*. Now, we can fit the pipeline, like any other `sklearn` estimator:" ] }, { "cell_type": "code", "execution_count": 191, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Pipeline(steps=[('scaler', MinMaxScaler()), ('ridge', Ridge(alpha=0.01))])
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "Pipeline(steps=[('scaler', MinMaxScaler()), ('ridge', Ridge(alpha=0.01))])" ] }, "execution_count": 191, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pipe.fit(X_train, y_train)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here, *pipe.fit* first calls fit on the first step (the scaler), then transforms the training data using the scaler, and finally fits the *Ridge* with the scaled data. To evaluate on the test data with the default scoring metric of the regressor, we simply call *pipe.score*:" ] }, { "cell_type": "code", "execution_count": 193, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.5910622391340353" ] }, "execution_count": 193, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pipe.score(X_test, y_test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Calling the `score` method on the pipeline first transforms the test data using the scaler, and then calls the `score` method on the `Ridge` using the scaled test data. As we can see, the result is identical to the one we got from the code by doing the transformations by hand. Using the pipeline, we reduced the code needed for our \"preprocessing + classification\" process. The main benefit of using the pipeline, however, is that we can now use this single estimator in *GridSearchCV*." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Using a pipeline in a grid search works the same way as using any other estimator. We define a parameter grid to search over, and construct a *GridSearchCV* from the pipeline and the parameter grid. When specifying the parameter grid, there is a slight change, though. We need to specify for each parameter which step of the pipeline it belongs to. The parameter that we want to adjust, *alpha*, is the parameter of *Ridge*, the second step. We gave this step the name \"ridge\". The syntax to define a parameter grid for a pipeline is to specify for each parameter the step name, followed by __ (a double underscore), followed by the parameter name. To search over the *alpha* parameter of \"ridge\" we therefore have to use \"ridge__max_alpha\" as the key in the parameter grid dictionary.\n", "\n", "We could also use the method `get_params` to see the names of all the parameters of an estimator:" ] }, { "cell_type": "code", "execution_count": 196, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'memory': None,\n", " 'steps': [('scaler', MinMaxScaler()), ('ridge', Ridge(alpha=0.01))],\n", " 'transform_input': None,\n", " 'verbose': False,\n", " 'scaler': MinMaxScaler(),\n", " 'ridge': Ridge(alpha=0.01),\n", " 'scaler__clip': False,\n", " 'scaler__copy': True,\n", " 'scaler__feature_range': (0, 1),\n", " 'ridge__alpha': 0.01,\n", " 'ridge__copy_X': True,\n", " 'ridge__fit_intercept': True,\n", " 'ridge__max_iter': None,\n", " 'ridge__positive': False,\n", " 'ridge__random_state': None,\n", " 'ridge__solver': 'auto',\n", " 'ridge__tol': 0.0001}" ] }, "execution_count": 196, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pipe.get_params()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can see what parameters of the pipeline that we built can be tuned. Parameters of the scaling step start with *scaler__*, parameters of ridge start with *ridge__*. Note that *scaler* and *ridge* are just names we gave to the steps of the pipeline, we could have given any other name." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, let's define the parameters that we wish to tune:" ] }, { "cell_type": "code", "execution_count": 199, "metadata": {}, "outputs": [], "source": [ "param_grid = {'ridge__alpha': [0.005, 0.01, 0.05, 0.1, 0.5, 1]}" ] }, { "cell_type": "code", "execution_count": 200, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Best cross-validation score (negative RMSE): -0.7243104320018825\n", "Test set score: -0.7363007117320173\n", "Best parameters: {'ridge__alpha': 0.1}\n" ] } ], "source": [ "grid = GridSearchCV(pipe, param_grid=param_grid, cv=5, scoring='neg_root_mean_squared_error')\n", "grid.fit(X_train, y_train)\n", "y_pred=grid.predict(X_test)\n", "\n", "print('Best cross-validation score (negative RMSE): ', grid.best_score_)\n", "print('Test set score: ', grid.score(X_test, y_test))\n", "print('Best parameters: ', grid.best_params_)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In contrast to the grid search we did before, now for each split in the cross-validation, the *MinMaxScaler* is refit with ONLY the training splits and no information is leaked from the test split into the parameter search." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this case since scaling is used to ensure smooth convergence of the gradient descent, there is not much difference when using the wrong and correct way of scaling. However, in many cases, if data leakage occurs it may actually lead to choosing sub-optimal parameters." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The General Pipeline Interface\n", "The `Pipeline` class is not restricted to pre-processing and classification or regression, but can, in fact, join any number of estimators together. For example, we could build a pipeline containing feature extraction, feature selection, scaling, and classification, for a total of four steps. Similarly, the last step could clustering instead of classification.\n", "\n", "The only requirement for estimators in a pipeline is that all but the last step need to have a `transform` method, so they can produce a new representation of the data that can be used in the next step.\n", "\n", "Internally, during the call to `Pipeline.fit`, the pipeline calls `fit` and then `transform` on each step in turn, with the input given by the output of the transform method of the previous step. For the last step in the pipeline, just `fit` is called." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pipeline is also adjusted for adequate use of sklearn's estimators and transformers. For example, when `TargetEncoder` is a part of a Pipeline and the pipeline is fitted, the pipeline will correctly call `TargetEncoder.fit_transform` and use cross fitting when encoding the training data." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Often, we will want to inspect attributes of one of the steps of the pipeline, say, the coefficients of a linear model. The easiest way to access the steps in a pipeline is via the *named_steps* attribute, which is a dictionary from the step names to the estimators:" ] }, { "cell_type": "code", "execution_count": 206, "metadata": {}, "outputs": [], "source": [ "pipe = Pipeline( [('scaler', StandardScaler()), ('ridge', Ridge(alpha=0.01))])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can check the steps of the pipeline:" ] }, { "cell_type": "code", "execution_count": 208, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[('scaler', StandardScaler()), ('ridge', Ridge(alpha=0.01))]" ] }, "execution_count": 208, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pipe.steps" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Visualize the pipeline:" ] }, { "cell_type": "code", "execution_count": 210, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Pipeline(steps=[('scaler', StandardScaler()), ('ridge', Ridge(alpha=0.01))])
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "Pipeline(steps=[('scaler', StandardScaler()), ('ridge', Ridge(alpha=0.01))])" ] }, "execution_count": 210, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pipe" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Or get pipe parameters:" ] }, { "cell_type": "code", "execution_count": 212, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'memory': None,\n", " 'steps': [('scaler', StandardScaler()), ('ridge', Ridge(alpha=0.01))],\n", " 'transform_input': None,\n", " 'verbose': False,\n", " 'scaler': StandardScaler(),\n", " 'ridge': Ridge(alpha=0.01),\n", " 'scaler__copy': True,\n", " 'scaler__with_mean': True,\n", " 'scaler__with_std': True,\n", " 'ridge__alpha': 0.01,\n", " 'ridge__copy_X': True,\n", " 'ridge__fit_intercept': True,\n", " 'ridge__max_iter': None,\n", " 'ridge__positive': False,\n", " 'ridge__random_state': None,\n", " 'ridge__solver': 'auto',\n", " 'ridge__tol': 0.0001}" ] }, "execution_count": 212, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pipe.get_params()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can access a certain step of the `pipeline`, using `named_steps`:" ] }, { "cell_type": "code", "execution_count": 214, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Ridge(alpha=0.01)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "Ridge(alpha=0.01)" ] }, "execution_count": 214, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pipe.named_steps['ridge']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next, we will fit the pipeline with the housing data. Since we wantto pass the feature names to the pipeline, we will convert the numpy array to a dataframe:" ] }, { "cell_type": "code", "execution_count": 216, "metadata": {}, "outputs": [], "source": [ "X_pipe = pd.DataFrame(housing.data, columns=housing.feature_names)\n", "y_pipe = housing.target" ] }, { "cell_type": "code", "execution_count": 217, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ridge coefficiets: [ 0.82961904 0.1187523 -0.26552558 0.30569451 -0.00450277 -0.0393263\n", " -0.89987946 -0.87053475]\n" ] } ], "source": [ "# fit the pipeline defined before to the housing dataset\n", "pipe.fit(X_pipe, y_pipe)\n", "# extract the coefficients from the \"ridge\" step\n", "ridge_coefficients = pipe.named_steps[\"ridge\"].coef_\n", "print('ridge coefficiets: ', ridge_coefficients)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In another example, we could access the names of the features that are going out of the scaler step, and into the ridge step." ] }, { "cell_type": "code", "execution_count": 219, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array(['MedInc', 'HouseAge', 'AveRooms', 'AveBedrms', 'Population',\n", " 'AveOccup', 'Latitude', 'Longitude'], dtype=object)" ] }, "execution_count": 219, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pipe.named_steps[\"scaler\"].get_feature_names_out()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Pipeline and ColumnTransformer" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "One of the steps in the `pipeline` can also be `ColumnTransformer`, and `pipeline` can also be a step in `ColumnTransformer`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's go back to the census dataset, but this time will import the csv with the dataset that has missing values:" ] }, { "cell_type": "code", "execution_count": 223, "metadata": {}, "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", "
ageworkclasseducationcapital-gain-categoryhours-per-weekoccupationincome
039.0State-govBachelorsNaN40.0Adm-clerical<=50K
150.0Self-emp-not-incBachelorscat113.0Exec-managerial<=50K
238.0PrivateHS-gradcat140.0Handlers-cleaners<=50K
353.0Private11thcat140.0Handlers-cleaners<=50K
428.0PrivateBachelorscat140.0Prof-specialty<=50K
\n", "
" ], "text/plain": [ " age workclass education capital-gain-category hours-per-week \\\n", "0 39.0 State-gov Bachelors NaN 40.0 \n", "1 50.0 Self-emp-not-inc Bachelors cat1 13.0 \n", "2 38.0 Private HS-grad cat1 40.0 \n", "3 53.0 Private 11th cat1 40.0 \n", "4 28.0 Private Bachelors cat1 40.0 \n", "\n", " occupation income \n", "0 Adm-clerical <=50K \n", "1 Exec-managerial <=50K \n", "2 Handlers-cleaners <=50K \n", "3 Handlers-cleaners <=50K \n", "4 Prof-specialty <=50K " ] }, "execution_count": 223, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.read_csv('census_data_missing.csv' )\n", "df.head()" ] }, { "cell_type": "code", "execution_count": 224, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "age 1628\n", "workclass 1628\n", "education 1628\n", "capital-gain-category 6189\n", "hours-per-week 1628\n", "occupation 1628\n", "income 0\n", "dtype: int64" ] }, "execution_count": 224, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.isnull().sum()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Recall that we used one hot encoding for feature 'workclass', target encoding for 'occupation', ordinal encoding for 'education' and 'capital-gain-category'. Now let us first impute the missing values of categorical features with mode, and of continuous with the median. Then, we will encode the categorical features, scale all with the StandardScaler and then train the model." ] }, { "cell_type": "code", "execution_count": 226, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Pipeline(steps=[('preprocessor',\n",
       "                 ColumnTransformer(transformers=[('numerical',\n",
       "                                                  Pipeline(steps=[('imputation_median',\n",
       "                                                                   SimpleImputer(strategy='median'))]),\n",
       "                                                  ['age', 'hours-per-week']),\n",
       "                                                 ('categorical',\n",
       "                                                  Pipeline(steps=[('imputation_mode',\n",
       "                                                                   SimpleImputer(strategy='most_frequent')),\n",
       "                                                                  ('onehot',\n",
       "                                                                   OneHotEncoder(drop='first',\n",
       "                                                                                 handle_unknown='infrequent_if_exist',\n",
       "                                                                                 min_frequ...\n",
       "                                                                   OrdinalEncoder(categories=[['Preschool',\n",
       "                                                                                               '1st-4th',\n",
       "                                                                                               '5th-6th',\n",
       "                                                                                               '7th-8th',\n",
       "                                                                                               '9th',\n",
       "                                                                                               '10th',\n",
       "                                                                                               '11th',\n",
       "                                                                                               '12th',\n",
       "                                                                                               'HS-grad',\n",
       "                                                                                               'Prof-school',\n",
       "                                                                                               'Assoc-acdm',\n",
       "                                                                                               'Assoc-voc',\n",
       "                                                                                               'Some-college',\n",
       "                                                                                               'Bachelors',\n",
       "                                                                                               'Masters',\n",
       "                                                                                               'Doctorate'],\n",
       "                                                                                              ['cat1',\n",
       "                                                                                               'cat2',\n",
       "                                                                                               'cat3',\n",
       "                                                                                               'cat4']]))]),\n",
       "                                                  ['education',\n",
       "                                                   'capital-gain-category'])])),\n",
       "                ('scaler', StandardScaler()),\n",
       "                ('classifier', LogisticRegression(solver='liblinear'))])
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "Pipeline(steps=[('preprocessor',\n", " ColumnTransformer(transformers=[('numerical',\n", " Pipeline(steps=[('imputation_median',\n", " SimpleImputer(strategy='median'))]),\n", " ['age', 'hours-per-week']),\n", " ('categorical',\n", " Pipeline(steps=[('imputation_mode',\n", " SimpleImputer(strategy='most_frequent')),\n", " ('onehot',\n", " OneHotEncoder(drop='first',\n", " handle_unknown='infrequent_if_exist',\n", " min_frequ...\n", " OrdinalEncoder(categories=[['Preschool',\n", " '1st-4th',\n", " '5th-6th',\n", " '7th-8th',\n", " '9th',\n", " '10th',\n", " '11th',\n", " '12th',\n", " 'HS-grad',\n", " 'Prof-school',\n", " 'Assoc-acdm',\n", " 'Assoc-voc',\n", " 'Some-college',\n", " 'Bachelors',\n", " 'Masters',\n", " 'Doctorate'],\n", " ['cat1',\n", " 'cat2',\n", " 'cat3',\n", " 'cat4']]))]),\n", " ['education',\n", " 'capital-gain-category'])])),\n", " ('scaler', StandardScaler()),\n", " ('classifier', LogisticRegression(solver='liblinear'))])" ] }, "execution_count": 226, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.impute import SimpleImputer\n", "numeric_preprocessor = Pipeline([ (\"imputation_median\", SimpleImputer( strategy=\"median\")) ])\n", "\n", "categorical_preprocessor = Pipeline([\n", " (\"imputation_mode\", SimpleImputer( strategy=\"most_frequent\")),\n", " (\"onehot\", OneHotEncoder(sparse_output=False, drop='first', \n", " min_frequency=0.01, handle_unknown='infrequent_if_exist'))\n", " ])\n", "\n", "ordinal_preprocessor = Pipeline([\n", " (\"imputation_mode\", SimpleImputer( strategy=\"most_frequent\")),\n", " (\"onehot\", OrdinalEncoder(categories=categories))\n", " ])\n", "\n", "target_enc_preprocessor = Pipeline([\n", " (\"imputation_mode\", SimpleImputer( strategy=\"most_frequent\")),\n", " ('target_enc', TargetEncoder(target_type='binary')) \n", " ])\n", " \n", "preprocessor = ColumnTransformer([\n", " (\"numerical\", numeric_preprocessor, ['age', 'hours-per-week']),\n", " (\"categorical\", categorical_preprocessor, ['workclass']),\n", " (\"cat_target\", target_enc_preprocessor, ['occupation']),\n", " (\"ordinal\", ordinal_preprocessor, ['education','capital-gain-category']),\n", " ])\n", "\n", "pipe = Pipeline([\n", " ('preprocessor', preprocessor),\n", " ('scaler', StandardScaler()), \n", " ('classifier', LogisticRegression(solver='liblinear'))])\n", "\n", "pipe" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that, while `ColumnTransformer` applies the assigned transformations simultaneously, the `Pipeline` executes its steps sequentially." ] }, { "cell_type": "code", "execution_count": 228, "metadata": {}, "outputs": [], "source": [ "X_train, X_test, y_train, y_test = train_test_split(df.drop(columns='income'), df['income'], random_state=0)" ] }, { "cell_type": "code", "execution_count": 229, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Pipeline(steps=[('preprocessor',\n",
       "                 ColumnTransformer(transformers=[('numerical',\n",
       "                                                  Pipeline(steps=[('imputation_median',\n",
       "                                                                   SimpleImputer(strategy='median'))]),\n",
       "                                                  ['age', 'hours-per-week']),\n",
       "                                                 ('categorical',\n",
       "                                                  Pipeline(steps=[('imputation_mode',\n",
       "                                                                   SimpleImputer(strategy='most_frequent')),\n",
       "                                                                  ('onehot',\n",
       "                                                                   OneHotEncoder(drop='first',\n",
       "                                                                                 handle_unknown='infrequent_if_exist',\n",
       "                                                                                 min_frequ...\n",
       "                                                                   OrdinalEncoder(categories=[['Preschool',\n",
       "                                                                                               '1st-4th',\n",
       "                                                                                               '5th-6th',\n",
       "                                                                                               '7th-8th',\n",
       "                                                                                               '9th',\n",
       "                                                                                               '10th',\n",
       "                                                                                               '11th',\n",
       "                                                                                               '12th',\n",
       "                                                                                               'HS-grad',\n",
       "                                                                                               'Prof-school',\n",
       "                                                                                               'Assoc-acdm',\n",
       "                                                                                               'Assoc-voc',\n",
       "                                                                                               'Some-college',\n",
       "                                                                                               'Bachelors',\n",
       "                                                                                               'Masters',\n",
       "                                                                                               'Doctorate'],\n",
       "                                                                                              ['cat1',\n",
       "                                                                                               'cat2',\n",
       "                                                                                               'cat3',\n",
       "                                                                                               'cat4']]))]),\n",
       "                                                  ['education',\n",
       "                                                   'capital-gain-category'])])),\n",
       "                ('scaler', StandardScaler()),\n",
       "                ('classifier', LogisticRegression(solver='liblinear'))])
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "Pipeline(steps=[('preprocessor',\n", " ColumnTransformer(transformers=[('numerical',\n", " Pipeline(steps=[('imputation_median',\n", " SimpleImputer(strategy='median'))]),\n", " ['age', 'hours-per-week']),\n", " ('categorical',\n", " Pipeline(steps=[('imputation_mode',\n", " SimpleImputer(strategy='most_frequent')),\n", " ('onehot',\n", " OneHotEncoder(drop='first',\n", " handle_unknown='infrequent_if_exist',\n", " min_frequ...\n", " OrdinalEncoder(categories=[['Preschool',\n", " '1st-4th',\n", " '5th-6th',\n", " '7th-8th',\n", " '9th',\n", " '10th',\n", " '11th',\n", " '12th',\n", " 'HS-grad',\n", " 'Prof-school',\n", " 'Assoc-acdm',\n", " 'Assoc-voc',\n", " 'Some-college',\n", " 'Bachelors',\n", " 'Masters',\n", " 'Doctorate'],\n", " ['cat1',\n", " 'cat2',\n", " 'cat3',\n", " 'cat4']]))]),\n", " ['education',\n", " 'capital-gain-category'])])),\n", " ('scaler', StandardScaler()),\n", " ('classifier', LogisticRegression(solver='liblinear'))])" ] }, "execution_count": 229, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pipe.fit(X_train, y_train)" ] }, { "cell_type": "code", "execution_count": 230, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.7940056504114974" ] }, "execution_count": 230, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pipe.score(X_test,y_test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We should also do a grid search and fine tune our model: it is also possible to search over the actual steps being performed in the pipeline (say whether to use *StandardScaler* or *MinMaxScaler*). We could also test different imputing strategies, and model parameters. We can also grid search different classifiers, as we will see in the next section. But note, trying all possible solutions is usually not a viable machine learning strategy." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Grid-Searching Which Model To Use\n", "\n", "Here is an example comparing a *Ridge*, *Lasso* and plain Linear Regression on the housing dataset.\n", "\n", "We start by defining the pipeline. Here, we explicitly name the steps. We want two steps, one for the pre-processing and then a regressor. We can instantiate this using *Ridge* and *MinMaxScaler*:" ] }, { "cell_type": "code", "execution_count": 233, "metadata": {}, "outputs": [], "source": [ "pipe = Pipeline([('preprocessing', MinMaxScaler()), \n", " ('regressor', Ridge())])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we can define the parameter_grid to search over. We want the regressor to be either *Ridge*, *Lasso* or *LinearRegression*. Because they have different parameters to tune, and may benefit from different pre-processing, we can make use of the list of search grids. To assign an estimator to a step, we use the name of the step as the parameter name. When we want to skip a step in the pipeline (for example, because we may not need pre-processing for the *LinearRegression*), we can set that step to *None*. Note that *GridSearchCV* allows the param_grid to be a list of dictionaries. Each dictionary in the list is expanded into an independent grid. If we are using *RandomizedSearchCV* with a list of dictionaries, first a dictionary is sampled uniformly, and then a parameter is sampled using that dictionary." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's see the pipe parameters:" ] }, { "cell_type": "code", "execution_count": 236, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'memory': None,\n", " 'steps': [('preprocessing', MinMaxScaler()), ('regressor', Ridge())],\n", " 'transform_input': None,\n", " 'verbose': False,\n", " 'preprocessing': MinMaxScaler(),\n", " 'regressor': Ridge(),\n", " 'preprocessing__clip': False,\n", " 'preprocessing__copy': True,\n", " 'preprocessing__feature_range': (0, 1),\n", " 'regressor__alpha': 1.0,\n", " 'regressor__copy_X': True,\n", " 'regressor__fit_intercept': True,\n", " 'regressor__max_iter': None,\n", " 'regressor__positive': False,\n", " 'regressor__random_state': None,\n", " 'regressor__solver': 'auto',\n", " 'regressor__tol': 0.0001}" ] }, "execution_count": 236, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pipe.get_params()" ] }, { "cell_type": "code", "execution_count": 237, "metadata": {}, "outputs": [], "source": [ "from sklearn.linear_model import Lasso, LinearRegression\n", "\n", "param_grid = [\n", " {'regressor': [Ridge()], 'preprocessing': [MinMaxScaler(),StandardScaler()],\n", " 'regressor__alpha': [0.01, 0.03, 0.05, 0.1, 0.3, 0.5, 1 ] },\n", " {'regressor': [Lasso()], 'preprocessing': [ MinMaxScaler(),StandardScaler()], \n", " 'regressor__alpha': [0.01, 0.03, 0.05, 0.1, 0.3, 0.5, 1 ]},\n", " {'regressor': [LinearRegression()], 'preprocessing': [None]}\n", "]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we can instantiate and run the grid search on the housing dataset:" ] }, { "cell_type": "code", "execution_count": 239, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Best params: {'preprocessing': MinMaxScaler(), 'regressor': Ridge(), 'regressor__alpha': 0.1}\n", "Best cross-validation score -0.7243104320018825\n", "Test-set score: -0.7363007117320173\n" ] } ], "source": [ "X_train, X_test, y_train, y_test = train_test_split(housing.data, housing.target, random_state=0)\n", "\n", "grid = GridSearchCV(pipe, param_grid, cv=5, scoring='neg_root_mean_squared_error', n_jobs=-1)\n", "grid.fit(X_train, y_train)\n", "\n", "print('Best params: ', grid.best_params_)\n", "print('Best cross-validation score ', grid.best_score_)\n", "print('Test-set score: ', grid.score(X_test, y_test))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The outcome of the grid search is that *Ridge* with *MinMaxScaler* preprocessing, *alpha=0.1* gave the best result." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Splitting data in cross-validation" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "During Cross-Validation, the data is split into k-folds. To specify how the data will be split, so far we have only passed the number of cross validation folds in the parameter `cv`. The default behavior of `GridSearchCV` and `RandomizedSearchCV`, when we pass the number of folds when the estimator is a classifier and y is either binary or multiclass, is the use of stratified stratified k-fold cross-validation. This will enforce the class distribution in each split of the data to match the distribution in the complete training dataset. If the data was just split without considering stratification, in the case of severe class imbalance, one or more folds could end up with a few or no examples from the minority class. This means that some or perhaps many of the model evaluations would be misleading, as the model need only predict the majority class correctly." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Hence, by default `StratifiedKFold`cross-validator is used that provides train/holdout indices to split data. The folds are made by preserving the percentage of samples for each class, without shuffling the data. Let's illustrate the workings of this cross-validator using the small imbalanced dataset we generated previously." ] }, { "cell_type": "code", "execution_count": 244, "metadata": {}, "outputs": [], "source": [ "from sklearn.datasets import make_classification\n", "\n", "X, y = make_classification(n_samples=1000, n_features=2, n_informative=2,\n", " n_redundant=0, n_repeated=0, n_classes=3,\n", " n_clusters_per_class=1,\n", " weights=[0.01, 0.05, 0.94],\n", " class_sep=0.8, random_state=0)" ] }, { "cell_type": "code", "execution_count": 245, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2 0.932\n", "1 0.055\n", "0 0.013\n", "Name: proportion, dtype: float64" ] }, "execution_count": 245, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.Series(y).value_counts(normalize=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`Split` method of this cross-validator generates indices to split data into training and holdout set. Let's see if we wanted to do 5-fold cross validation, what would be the class distribution for each holdout fold." ] }, { "cell_type": "code", "execution_count": 247, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Fold 0: Class distribution of validation instances\n", "2 0.935\n", "1 0.055\n", "0 0.010\n", "Name: proportion, dtype: float64\n", "Fold 1: Class distribution of validation instances\n", "2 0.935\n", "1 0.055\n", "0 0.010\n", "Name: proportion, dtype: float64\n", "Fold 2: Class distribution of validation instances\n", "2 0.930\n", "1 0.055\n", "0 0.015\n", "Name: proportion, dtype: float64\n", "Fold 3: Class distribution of validation instances\n", "2 0.930\n", "1 0.055\n", "0 0.015\n", "Name: proportion, dtype: float64\n", "Fold 4: Class distribution of validation instances\n", "2 0.930\n", "1 0.055\n", "0 0.015\n", "Name: proportion, dtype: float64\n" ] } ], "source": [ "from sklearn.model_selection import StratifiedKFold \n", "skf = StratifiedKFold(n_splits=5)\n", "for fold, (train_idx, val_idx) in enumerate(skf.split(X, y)):\n", " print(f'Fold {fold}: Class distribution of validation instances')\n", " print(pd.Series(y[val_idx]).value_counts(normalize=True))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let's compare this with K-Folds cross-validator that just split dataset into k consecutive folds (without shuffling by default)." ] }, { "cell_type": "code", "execution_count": 249, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Fold 0\n", "Class distribution of validation instances\n", "2 0.945\n", "1 0.050\n", "0 0.005\n", "Name: proportion, dtype: float64\n", "Fold 1\n", "Class distribution of validation instances\n", "2 0.935\n", "1 0.055\n", "0 0.010\n", "Name: proportion, dtype: float64\n", "Fold 2\n", "Class distribution of validation instances\n", "2 0.930\n", "1 0.055\n", "0 0.015\n", "Name: proportion, dtype: float64\n", "Fold 3\n", "Class distribution of validation instances\n", "2 0.92\n", "1 0.07\n", "0 0.01\n", "Name: proportion, dtype: float64\n", "Fold 4\n", "Class distribution of validation instances\n", "2 0.930\n", "1 0.045\n", "0 0.025\n", "Name: proportion, dtype: float64\n" ] } ], "source": [ "from sklearn.model_selection import KFold \n", "kf = KFold(n_splits=5)\n", "for fold, (train_idx, val_idx) in enumerate(kf.split(X, y)):\n", " print(f'Fold {fold}')\n", " print('Class distribution of validation instances')\n", " print(pd.Series(y[val_idx]).value_counts(normalize=True))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, the distribution of the rarest class varies in the validation folds." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Another important detail which we have not discussed so far is the shuffling of the data instances when the folds are made. By default, data is not shuffled, hence running cross-validation twice with the default parameters, will give exactly the same results. However, if the ordering of data instances in the dataset is not arbitrary, for example data points with the same class label are contiguous, shuffling it first may be essential to get a meaningful cross-validation result. In this case we can use `ShuffleSplit` and `StratifiedShuffleSplit`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Another common case of data that is ordered is time series. Usually today's stock price is correlated with yesterday's and tomorrow's. In applications, we usually have data up to some point, and then try to make predictions for the future, in other words, we are using past data to predict the future data. For this case we can use `TimeSeriesSplit` which simulates that, by taking increasing chunks of data from the past and making predictions on the next chunk. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now to visualize the workings of all this splits, we will use the code from: https://scikit-learn.org/stable/auto_examples/model_selection/plot_cv_indices.html\n", "\n", "Here, to goal is only to analyze the obtained plots with the code (no need to analyze or replicate the code)." ] }, { "cell_type": "code", "execution_count": 254, "metadata": {}, "outputs": [], "source": [ "from sklearn.model_selection import ShuffleSplit, StratifiedShuffleSplit, TimeSeriesSplit\n", "from matplotlib.patches import Patch\n", "cmap_data = plt.cm.Paired\n", "cmap_cv = plt.cm.coolwarm\n", "n_splits = 5\n", "cvs = [\n", " KFold,\n", " ShuffleSplit,\n", " StratifiedKFold,\n", " StratifiedShuffleSplit,\n", " TimeSeriesSplit\n", "]\n", "X = np.random.randn(100, 10)\n", "percentiles_classes = [0.1, 0.3, 0.6]\n", "y = np.hstack([[ii] * int(100 * perc) for ii, perc in enumerate(percentiles_classes)])" ] }, { "cell_type": "code", "execution_count": 255, "metadata": {}, "outputs": [], "source": [ "def plot_cv_indices(cv, X, y, ax, n_splits, lw=10):\n", " \"\"\"Create a sample plot for indices of a cross-validation object.\"\"\"\n", "\n", " # Generate the training/testing visualizations for each CV split\n", " for ii, (tr, tt) in enumerate(cv.split(X=X, y=y )):\n", " # Fill in indices with the training/test groups\n", " indices = np.array([np.nan] * len(X))\n", " indices[tt] = 1\n", " indices[tr] = 0\n", "\n", " # Visualize the results\n", " ax.scatter(\n", " range(len(indices)),\n", " [ii + 0.5] * len(indices),\n", " c=indices,\n", " marker=\"_\",\n", " lw=lw,\n", " cmap=cmap_cv,\n", " vmin=-0.2,\n", " vmax=1.2,\n", " )\n", "\n", " # Plot the data classes and groups at the end\n", " ax.scatter(\n", " range(len(X)), [ii + 1.5] * len(X), c=y, marker=\"_\", lw=lw, cmap=cmap_data\n", " )\n", "\n", "\n", " # Formatting\n", " yticklabels = list(range(n_splits)) + [\"class\"]\n", " ax.set(\n", " yticks=np.arange(n_splits + 1) + 0.5,\n", " yticklabels=yticklabels,\n", " xlabel=\"Data sample index\",\n", " ylabel=\"CV Iteration\",\n", " ylim=[n_splits + 2.2, -0.2],\n", " xlim=[0, 100],\n", " )\n", " ax.set_title(\"{}\".format(type(cv).__name__), fontsize=15)\n", " return ax" ] }, { "cell_type": "code", "execution_count": 256, "metadata": {}, "outputs": [ { "data": { "image/png": "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OnToIKdPn5b8+fObHh+KlwEAsJ8gy7IsbzfC1+mssfDwcPl49R7JliNnhv5sNin1TWxSCtzeJqXPfrHdTB6hhhIZjeCThuDDP1IAuH28p8Kb2LICAADYBsEHAADYBsEHAADYBsEHAADYBsEHAADYBsEHAADYBsEHAADYBsEHAADYBsEHAADYBsEHAADYBsEHAADYBsEHAADYBsEHAADYBsEHAADYBsEHAADYBsEHAADYBsEHAADYBsEHAADYBsEHAADYBsEHAADYBsEHAADYBsEHAADYBsEHAADYBsEHAADYBsEHAADYBsEHAADYBsEHAADYBsEHAADYBsEHAADYBsEHAADYBsEHAADYBsEHAADYBsEHAADYBsEHAADYBsEHAADYBsEHAADYBsEHAADYBsEHAADYRrC3G+APLMsy15cuXfJ2UwDA7zneSx3vrUBGIvh44PfffzfXJUqU8HZTACCg3lvDw8O93QzYDMHHA3nz5jXXx44d4x/pzb/WNAQeP35ccuXKJXbH+XDH+UiKc+Lu4sWLUrJkSed7K5CRCD4eyJTpRimUhh7etP5PzwXn4/84H+44H0lxTpJ/bwUyEr91AADANgg+AADANgg+HggNDZUhQ4aYa3A+EuN8uON8JMU5ccf5gDcFWcwnBAAANkGPDwAAsA2CDwAAsA2CDwAAsA2Czy18+OGHctddd0lYWJg8+OCDsmnTJrGDyMhIeeCBByRnzpxSsGBBadGihezbt8/tmOjoaOnRo4fky5dPcuTIIc8884ycPn1a7GDkyJESFBQkvXv3tvX5OHHihPztb38zrzlr1qxStWpV2bJli/NxLSEcPHiwFClSxDzesGFDOXDggASi69evy6BBg6R06dLmtZYpU0aGDx/uti1DIJ+P1atXS7NmzaRo0aLm38bXX3/t9rgnr/3cuXPSvn17s9ZR7ty55aWXXpLLly9n8CtBoCP4pGL27NnSt29fM/tg27ZtUr16dWnUqJGcOXNGAt2qVavMh/iGDRtk6dKlEhcXJ0888YRcuXLFeUyfPn3k22+/lblz55rjf/31V2nVqpUEus2bN8u///1vqVatmtv9djsf58+fl7p160qWLFlk0aJFsmfPHnnvvfckT548zmPeeecd+eCDD+Sjjz6SjRs3Svbs2c2/IQ2JgWbUqFEyceJEmTBhgkRFRZnb+vrHjx9v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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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55135MYbb5SIiAi5/fbbZePGjWIHY8aMkdtuu03y5csnxYoVk+joaNm3b5/bOXFxcdK7d28pXLiwREZGysMPPywnTpwQOxg7dqyEhIRI//79bV0fv//+uzzxxBPmmnPnzi01atSQzZs3O49rCuGwYcOkRIkS5nizZs3kwIEDEowuX74sQ4cOlfLly5trrVChgowaNcptWYZgro9Vq1ZJ69atpWTJkuZv48svv3Q77sm1//3339KxY0cz11GBAgXk6aeflnPnznn5ShDsCHzSMWfOHHn++efN6IOtW7dKrVq1pHnz5nLy5EkJditXrjRf4uvXr5clS5bIpUuX5P7775fz5887zxkwYIB88803Mm/ePHP+H3/8Ie3atZNgt2nTJvnf//4nNWvWdNtvt/o4ffq0NGrUSHLlyiWLFi2S3bt3y/jx46VgwYLOc9544w2ZNGmSvPvuu7JhwwbJmzev+RvSIDHYvP766zJ16lSZMmWK7Nmzx9zX6588ebIt6kM/G/QzUv+zmBpPrl2Dnp9//tl85ixcuNAEU88884wXrwK2oKO6kLr69etbvXv3dt6/fPmyVbJkSWvMmDGW3Zw8eVL/22qtXLnS3P/nn3+sXLlyWfPmzXOes2fPHnPOunXrrGB19uxZq1KlStaSJUusxo0bW/369bNtfQwaNMi688470zyelJRkFS9e3Bo3bpxzn9ZTeHi49dlnn1nBplWrVtZTTz3ltq9du3ZWx44dbVcf+nu/YMEC531Prn337t3mcZs2bXKes2jRIiskJMT6/fffvXwFCGa0+KQhISFBtmzZYppjXadX1/vr1q0TO66toxxr62jdaCuQa/1UqVLFrL8TzPWjrWCtWrVyu2671sfXX38t9erVk0ceecR0h9auXVumT5/uPB4TEyPHjx93qxNd9kW7jIOxTho2bChLly6V/fv3m/s7duyQNWvWSMuWLW1ZH648uXa91e4t/Z1y0PP1c1dbiICswlpdafjzzz9Nn/0NN9zgtl/v7927V+wkKSnJ5LJot0b16tXNPv0QCwsLMx9UyetHjwWj2bNnmy5P7epKzo718euvv5quHe0Ofumll0y99O3b19RD586dnded2t9QMNbJ4MGDzWKkGvDmzJnTfH6MHj3adN8ou9WHK0+uXW81gHYVGhpq/rMV7PUD7yLwgUetHLt27TL/e7UrXVW7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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "for cv in cvs:\n", " this_cv = cv(n_splits=n_splits)\n", " fig, ax = plt.subplots(figsize=(6, 3))\n", " plot_cv_indices(this_cv, X, y, ax, n_splits)\n", "\n", " ax.legend(\n", " [Patch(color=cmap_cv(0.8)), Patch(color=cmap_cv(0.02))],\n", " [\"Holdout fold\", \"Training folds\" ],\n", " loc=(1.02, 0.8),\n", " )\n", " # Make the legend fit\n", " plt.tight_layout()\n", " fig.subplots_adjust(right=0.7)\n", "plt.show()" ] } ], "metadata": { "kernelspec": { "display_name": "ml2025", "language": "python", "name": "ml2025" }, "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.12.8" } }, "nbformat": 4, "nbformat_minor": 4 }