{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# MeanEncoder\n", "\n", "The MeanEncoder() replaces the labels of the variables by the mean value of the target for that label.
For example, in the variable colour, if the mean value of the binary target is 0.5 for the label blue, then blue is replaced by 0.5" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "from sklearn.model_selection import train_test_split\n", "from feature_engine.encoding import MeanEncoder" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# Load titanic dataset from OpenML\n", "\n", "def load_titanic():\n", " data = pd.read_csv('https://www.openml.org/data/get_csv/16826755/phpMYEkMl')\n", " data = data.replace('?', np.nan)\n", " data['cabin'] = data['cabin'].astype(str).str[0]\n", " data['pclass'] = data['pclass'].astype('O')\n", " data['age'] = data['age'].astype('float')\n", " data['fare'] = data['fare'].astype('float')\n", " data['embarked'].fillna('C', inplace=True)\n", " data.drop(labels=['boat', 'body', 'home.dest'], axis=1, inplace=True)\n", " return data" ] }, { "cell_type": "code", "execution_count": 3, "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", "
pclasssurvivednamesexagesibspparchticketfarecabinembarked
011Allen, Miss. Elisabeth Waltonfemale29.00000024160211.3375BS
111Allison, Master. Hudson Trevormale0.916712113781151.5500CS
210Allison, Miss. Helen Lorainefemale2.000012113781151.5500CS
310Allison, Mr. Hudson Joshua Creightonmale30.000012113781151.5500CS
410Allison, Mrs. Hudson J C (Bessie Waldo Daniels)female25.000012113781151.5500CS
\n", "
" ], "text/plain": [ " pclass survived name sex \\\n", "0 1 1 Allen, Miss. Elisabeth Walton female \n", "1 1 1 Allison, Master. Hudson Trevor male \n", "2 1 0 Allison, Miss. Helen Loraine female \n", "3 1 0 Allison, Mr. Hudson Joshua Creighton male \n", "4 1 0 Allison, Mrs. Hudson J C (Bessie Waldo Daniels) female \n", "\n", " age sibsp parch ticket fare cabin embarked \n", "0 29.0000 0 0 24160 211.3375 B S \n", "1 0.9167 1 2 113781 151.5500 C S \n", "2 2.0000 1 2 113781 151.5500 C S \n", "3 30.0000 1 2 113781 151.5500 C S \n", "4 25.0000 1 2 113781 151.5500 C S " ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data = load_titanic()\n", "data.head()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "X = data.drop(['survived', 'name', 'ticket'], axis=1)\n", "y = data.survived" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "cabin 0\n", "pclass 0\n", "embarked 0\n", "dtype: int64" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# we will encode the below variables, they have no missing values\n", "X[['cabin', 'pclass', 'embarked']].isnull().sum()" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "cabin object\n", "pclass object\n", "embarked object\n", "dtype: object" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "''' Make sure that the variables are type (object).\n", "if not, cast it as object , otherwise the transformer will either send an error (if we pass it as argument) \n", "or not pick it up (if we leave variables=None). '''\n", "\n", "X[['cabin', 'pclass', 'embarked']].dtypes" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "((916, 8), (393, 8))" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# let's separate into training and testing set\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)\n", "\n", "X_train.shape, X_test.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The MeanEncoder() replaces categories by the mean value of the\n", "target for each category.

\n", "For example in the variable colour, if the mean of the target for blue, red\n", "and grey is 0.5, 0.8 and 0.1 respectively, blue is replaced by 0.5, red by 0.8\n", "and grey by 0.1.

\n", "The encoder will encode only categorical variables (type 'object'). A list\n", "of variables can be passed as an argument. If no variables are passed as \n", "argument, the encoder will find and encode all categorical variables\n", "(object type)." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "MeanEncoder(variables=['cabin', 'pclass', 'embarked'])" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# we will transform 3 variables\n", "'''\n", "Parameters\n", "---------- \n", "variables : list, default=None\n", " The list of categorical variables that will be encoded. If None, the \n", " encoder will find and select all object type variables.\n", "'''\n", "\n", "mean_enc = MeanEncoder(variables=['cabin', 'pclass', 'embarked'])\n", "\n", "# Note: the MeanCategoricalEncoder needs the target to fit\n", "mean_enc.fit(X_train, y_train)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'cabin': {'A': 0.5294117647058824,\n", " 'B': 0.7619047619047619,\n", " 'C': 0.5633802816901409,\n", " 'D': 0.71875,\n", " 'E': 0.71875,\n", " 'F': 0.6666666666666666,\n", " 'G': 0.5,\n", " 'T': 0.0,\n", " 'n': 0.30484330484330485},\n", " 'pclass': {1: 0.6173913043478261,\n", " 2: 0.43617021276595747,\n", " 3: 0.25903614457831325},\n", " 'embarked': {'C': 0.5580110497237569,\n", " 'Q': 0.37349397590361444,\n", " 'S': 0.3389570552147239}}" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# see the dictionary with the mappings per variable\n", "\n", "mean_enc.encoder_dict_" ] }, { "cell_type": "code", "execution_count": 10, "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", "
pclasssexagesibspparchfarecabinembarked
11390.259036male38.0007.89580.3048430.338957
5330.436170female21.00121.00000.3048430.338957
4590.436170male42.01027.00000.3048430.338957
11500.259036maleNaN0014.50000.3048430.338957
3930.436170male25.00031.50000.3048430.338957
\n", "
" ], "text/plain": [ " pclass sex age sibsp parch fare cabin embarked\n", "1139 0.259036 male 38.0 0 0 7.8958 0.304843 0.338957\n", "533 0.436170 female 21.0 0 1 21.0000 0.304843 0.338957\n", "459 0.436170 male 42.0 1 0 27.0000 0.304843 0.338957\n", "1150 0.259036 male NaN 0 0 14.5000 0.304843 0.338957\n", "393 0.436170 male 25.0 0 0 31.5000 0.304843 0.338957" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# we can see the transformed variables in the head view\n", "\n", "train_t = mean_enc.transform(X_train)\n", "test_t = mean_enc.transform(X_test)\n", "\n", "test_t.head()" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "''' The MeanEncoder has the characteristic that return monotonic\n", " variables, that is, encoded variables which values increase as the target increases'''\n", "\n", "# let's explore the monotonic relationship\n", "plt.figure(figsize=(7,5))\n", "pd.concat([test_t,y_test], axis=1).groupby(\"pclass\")[\"survived\"].mean().plot()\n", "#plt.xticks([0,1,2])\n", "plt.yticks(np.arange(0,1.1,0.1))\n", "plt.title(\"Relationship between pclass and target\")\n", "plt.xlabel(\"Pclass\")\n", "plt.ylabel(\"Mean of target\")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Automatically select the variables\n", "\n", "This encoder will select all categorical variables to encode, when no variables are specified when calling the encoder." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "MeanEncoder(variables=['pclass', 'sex', 'cabin', 'embarked'])" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mean_enc = MeanEncoder()\n", "\n", "mean_enc.fit(X_train, y_train)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['pclass', 'sex', 'cabin', 'embarked']" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mean_enc.variables" ] }, { "cell_type": "code", "execution_count": 13, "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", "
pclasssexagesibspparchfarecabinembarked
11390.2590360.18760838.0007.89580.3048430.338957
5330.4361700.72835821.00121.00000.3048430.338957
4590.4361700.18760842.01027.00000.3048430.338957
11500.2590360.187608NaN0014.50000.3048430.338957
3930.4361700.18760825.00031.50000.3048430.338957
\n", "
" ], "text/plain": [ " pclass sex age sibsp parch fare cabin embarked\n", "1139 0.259036 0.187608 38.0 0 0 7.8958 0.304843 0.338957\n", "533 0.436170 0.728358 21.0 0 1 21.0000 0.304843 0.338957\n", "459 0.436170 0.187608 42.0 1 0 27.0000 0.304843 0.338957\n", "1150 0.259036 0.187608 NaN 0 0 14.5000 0.304843 0.338957\n", "393 0.436170 0.187608 25.0 0 0 31.5000 0.304843 0.338957" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# we can see the transformed variables in the head view\n", "\n", "train_t = mean_enc.transform(X_train)\n", "test_t = mean_enc.transform(X_test)\n", "\n", "test_t.head()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" } }, "nbformat": 4, "nbformat_minor": 4 }