{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Missing value imputation: RandomSampleImputer\n", "\n", "\n", "The RandomSampleImputer extracts a random sample of observations where data is available, and uses it to replace the NA. It is suitable for numerical and categorical variables.\n", "\n", "To control the random sample extraction, there are various ways to set a seed and ensure or maximize reproducibility.\n", "\n", "\n", "**For this demonstration, we use the Ames House Prices dataset produced by Professor Dean De Cock:**\n", "\n", "[Dean De Cock (2011) Ames, Iowa: Alternative to the Boston Housing\n", "Data as an End of Semester Regression Project, Journal of Statistics Education, Vol.19, No. 3](http://jse.amstat.org/v19n3/decock.pdf)\n", "\n", "The version of the dataset used in this notebook can be obtained from [Kaggle](https://www.kaggle.com/c/house-prices-advanced-regression-techniques/data)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Version" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'1.2.0'" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Make sure you are using this \n", "# Feature-engine version.\n", "\n", "import feature_engine\n", "\n", "feature_engine.__version__" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "\n", "from sklearn.model_selection import train_test_split\n", "\n", "from feature_engine.imputation import RandomSampleImputer" ] }, { "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
IdMSSubClassMSZoningLotFrontageLotAreaStreetAlleyLotShapeLandContourUtilities...PoolAreaPoolQCFenceMiscFeatureMiscValMoSoldYrSoldSaleTypeSaleConditionSalePrice
0160RL65.08450PaveNaNRegLvlAllPub...0NaNNaNNaN022008WDNormal208500
1220RL80.09600PaveNaNRegLvlAllPub...0NaNNaNNaN052007WDNormal181500
2360RL68.011250PaveNaNIR1LvlAllPub...0NaNNaNNaN092008WDNormal223500
3470RL60.09550PaveNaNIR1LvlAllPub...0NaNNaNNaN022006WDAbnorml140000
4560RL84.014260PaveNaNIR1LvlAllPub...0NaNNaNNaN0122008WDNormal250000
\n", "

5 rows × 81 columns

\n", "
" ], "text/plain": [ " Id MSSubClass MSZoning LotFrontage LotArea Street Alley LotShape \\\n", "0 1 60 RL 65.0 8450 Pave NaN Reg \n", "1 2 20 RL 80.0 9600 Pave NaN Reg \n", "2 3 60 RL 68.0 11250 Pave NaN IR1 \n", "3 4 70 RL 60.0 9550 Pave NaN IR1 \n", "4 5 60 RL 84.0 14260 Pave NaN IR1 \n", "\n", " LandContour Utilities ... PoolArea PoolQC Fence MiscFeature MiscVal MoSold \\\n", "0 Lvl AllPub ... 0 NaN NaN NaN 0 2 \n", "1 Lvl AllPub ... 0 NaN NaN NaN 0 5 \n", "2 Lvl AllPub ... 0 NaN NaN NaN 0 9 \n", "3 Lvl AllPub ... 0 NaN NaN NaN 0 2 \n", "4 Lvl AllPub ... 0 NaN NaN NaN 0 12 \n", "\n", " YrSold SaleType SaleCondition SalePrice \n", "0 2008 WD Normal 208500 \n", "1 2007 WD Normal 181500 \n", "2 2008 WD Normal 223500 \n", "3 2006 WD Abnorml 140000 \n", "4 2008 WD Normal 250000 \n", "\n", "[5 rows x 81 columns]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Download the data from Kaggle and store it\n", "# in the same folder as this notebook.\n", "\n", "data = pd.read_csv('houseprice.csv')\n", "\n", "data.head()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "((1022, 79), (438, 79))" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Separate the data into train and test sets.\n", "\n", "X_train, X_test, y_train, y_test = train_test_split(\n", " data.drop(['Id', 'SalePrice'], axis=1),\n", " data['SalePrice'],\n", " test_size=0.3,\n", " random_state=0,\n", ")\n", "\n", "X_train.shape, X_test.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Imputation in batch\n", "\n", "We can set the imputer to impute several observations in batch with a unique seed. This is the equivalent of setting the `random_state` to an integer in `pandas.sample()`." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "# Start the imputer\n", "\n", "imputer = RandomSampleImputer(\n", "\n", " # the variables to impute\n", " variables=['Alley', 'MasVnrType', 'LotFrontage', 'MasVnrArea'],\n", "\n", " # the random state for reproducibility\n", " random_state=10,\n", "\n", " # equialent to setting random_state in\n", " # pandas.sample()\n", " seed='general',\n", ")" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "RandomSampleImputer(random_state=10,\n", " variables=['Alley', 'MasVnrType', 'LotFrontage',\n", " 'MasVnrArea'])" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Stores a copy of the train set variables\n", "\n", "imputer.fit(X_train)" ] }, { "cell_type": "code", "execution_count": 7, "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", "
AlleyMasVnrTypeLotFrontageMasVnrArea
64NaNBrkFaceNaN573.0
682NaNNoneNaN0.0
960NaNNone50.00.0
1384NaNNone60.00.0
1100NaNNone60.00.0
\n", "
" ], "text/plain": [ " Alley MasVnrType LotFrontage MasVnrArea\n", "64 NaN BrkFace NaN 573.0\n", "682 NaN None NaN 0.0\n", "960 NaN None 50.0 0.0\n", "1384 NaN None 60.0 0.0\n", "1100 NaN None 60.0 0.0" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# the imputer saves a copy of the variables \n", "# from the training set to impute new data.\n", "\n", "imputer.X_.head()" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Alley 0.939335\n", "MasVnrType 0.004892\n", "LotFrontage 0.184932\n", "MasVnrArea 0.004892\n", "dtype: float64" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Check missing data in train set\n", "\n", "X_train[['Alley', 'MasVnrType', 'LotFrontage', 'MasVnrArea']].isnull().mean()" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "# impute data\n", "\n", "train_t = imputer.transform(X_train)\n", "test_t = imputer.transform(X_test)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Alley 0.0\n", "MasVnrType 0.0\n", "LotFrontage 0.0\n", "MasVnrArea 0.0\n", "dtype: float64" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Check missing data after the transformation\n", "\n", "train_t[['Alley', 'MasVnrType', 'LotFrontage', 'MasVnrArea']].isnull().mean()" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZUAAAD4CAYAAAAkRnsLAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAAA2qUlEQVR4nO3deXwc1ZXo8d/Rvi+W5FU2MthgDN6FMcMeApiE2PCAxEDAzBBIJnE2ssELcSATPkOGDJAMJBkIDg5hMOAEUPKYsBgIIWyWwYBtsC0bL/Kmfd+l8/6oatFut+SW1KXuls738+mPqm7dunVKlnVUt6ruFVXFGGOMCYe4SAdgjDFm5LCkYowxJmwsqRhjjAkbSyrGGGPCxpKKMcaYsEmIdACRlJ+fr0VFRZEOwxhjYsqGDRuqVLUg2LZRnVSKioooLS2NdBjGGBNTRGR3X9us+8sYY0zYWFIxxhgTNpZUjDHGhM2ovqdijIkNnZ2dlJeX09bWFulQRpWUlBQKCwtJTEwMeR9LKsaYqFdeXk5mZiZFRUWISKTDGRVUlerqasrLy5k6dWrI+1n3lzEm6rW1tZGXl2cJZRiJCHl5eQO+OvQ0qYjIYhHZKiJlInJzkO3JIvK4u/0tESlyy88XkQ0i8oH79VN++yxwy8tE5Jfi/pSJyBgReUFEtrtfc708N2PM8LKEMvwG8z33LKmISDxwP3ARMBO4UkRmBlS7HqhV1WnAPcDP3PIq4HOqOgtYDjzit8+vgRuA6e5nsVt+M7BOVacD69x1M4IdrG/j4X98TE1zR6RDMca4vLxSWQiUqepOVe0A1gBLA+osBVa7y2uB80REVPVdVd3vlm8GUt2rmglAlqq+qc5EML8HLgnS1mq/cjNCffXRDdz25y189dEN2LxAxmsZGRkh13344YfZv39/7/o555zDCSecwNy5c5k7dy5r164dcjxPP/00W7ZsGXI74eZlUpkE7PVbL3fLgtZR1S6gHsgLqHMZ8I6qtrv1y/toc5yqHnCXDwLjggUlIjeKSKmIlFZWVg7sjEzUKK9t4Z09dUzKSeXNnTW8ubPmk43NzbB9e+SCM6NeYFIBePTRR9m4cSMbN27k8ssvP2xbd3f3gI8xGpPKkInISThdYl8eyH7uVUzQP11V9QFVLVbV4oKCoEPXmBjwj7IqAB64+DjGJ/bwyJu7nA27dsHMmXD88fDAAxGLz4wOGzduZNGiRcyePZtLL72U2tpa1q5dS2lpKVdffTVz586ltbU16L5FRUX84Ac/YP78+Tz55JM89thjzJo1i5NPPpkf/OAHvfUyMjL44Q9/yJw5c1i0aBGHDh3i9ddfp6SkhO9973vMnTuXHTt28OCDD3LKKacwZ84cLrvsMlpaWgDYsWMHixYtYtasWdx6662HXXHdddddnHLKKcyePZsf//jHYfmeePlI8T5gst96oVsWrE65iCQA2UA1gIgUAk8B16rqDr/6hX20eUhEJqjqAbebrCKcJ2Oiyzu76zinejsziy/jxdQMvrr421ScfxxjP/95qKuD446D22+HL30J4qL6byczQLf/eTNb9jeEtc2ZE7P48edOGvB+1157Lf/1X//F2WefzcqVK7n99tu59957ue+++/j5z39OcXFxb92rr76a1NRUANatWwdAXl4e77zzDvv372fRokVs2LCB3NxcLrjgAp5++mkuueQSmpubWbRoEXfccQff//73efDBB7n11ltZsmQJF198ce9VT05ODjfccAMAt956Kw899BBf//rX+eY3v8k3v/lNrrzySn7zm9/0xvP888+zfft23n77bVSVJUuW8Oqrr3LWWWcN+vsI3l6prAemi8hUEUkClgElAXVKcG7EA1wOvKSqKiI5wP8DblbVf/gqu91bDSKyyH3q61rgmSBtLfcrNyPQjsomvv2P/0GSkkgaV8BDT/yYhFMWwPr1sHq1k1D274eNGyMdqhmh6uvrqaur4+yzzwZg+fLlvPrqq33W9+/+ystzevm/8IUvALB+/XrOOeccCgoKSEhI4Oqrr+5tKykpiYsvvhiABQsWsGvXrqDtb9q0iTPPPJNZs2bx6KOPsnnzZgDeeOMNrrjiCgCuuuqq3vrPP/88zz//PPPmzWP+/Pl89NFHbA9Dt7FnVyqq2iUiK4DngHhglapuFpGfAKWqWgI8BDwiImVADU7iAVgBTANWishKt+wCVa0Avgo8DKQC/+t+AO4EnhCR64HdwOe9OjcTeRV7DjDnw/WwciVJN93E6+dfwcRdW8n53cPEXXKJ0w0G8NZbMH9+JEM1YTaYK4polZ6eftQ6iYmJvY/2xsfH09XVFbTeddddx9NPP82cOXN4+OGHeeWVV/ptV1W55ZZb+PKXB3R34ag87RdQ1WdV9XhVPU5V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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# when using the random sample imputer, \n", "# the distribution of the variable does not change.\n", "\n", "# This imputation method is useful for models that \n", "# are sensitive to changes in the variable distributions.\n", "\n", "fig = plt.figure()\n", "ax = fig.add_subplot(111)\n", "X_train['LotFrontage'].plot(kind='kde', ax=ax)\n", "train_t['LotFrontage'].plot(kind='kde', ax=ax, color='red')\n", "lines, labels = ax.get_legend_handles_labels()\n", "ax.legend(lines, labels, loc='best')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Specific seeds for each observation\n", "\n", "Sometimes, we want to guarantee that the same observation is imputed with the same value, run after run. \n", "\n", "To achieve this, we need to always use the same seed for every particular observation. \n", "\n", "To do this, we can use the values in neighboring variables as seed.\n", "\n", "In this case, the seed will be calculated observation per observation, either by adding or multiplying the seeding variable values, and passed to the random_state of pandas.sample(), which is used under the hood by the imputer.\n", "Then, a value will be extracted from the train set using that seed and used to replace the NAN in particular observation.\n", "\n", "**To know more about how the observation per seed is used check this [notebook](https://github.com/solegalli/feature-engineering-for-machine-learning/blob/master/Section-04-Missing-Data-Imputation/04.07-Random-Sample-Imputation.ipynb)** " ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "imputer = RandomSampleImputer(\n", "\n", " # the values of these variables will be used as seed\n", " random_state=['MSSubClass', 'YrSold'],\n", "\n", " # 1 seed per observation\n", " seed='observation',\n", "\n", " # how to combine the values of the seeding variables\n", " seeding_method='add',\n", " \n", " # impute all variables, numerical and categorical\n", " variables=None,\n", ")" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "RandomSampleImputer(random_state=['MSSubClass', 'YrSold'], seed='observation')" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Stores a copy of the train set.\n", "\n", "imputer.fit(X_train)" ] }, { "cell_type": "code", "execution_count": 14, "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", "
MSSubClassMSZoningLotFrontageLotAreaStreetAlleyLotShapeLandContourUtilitiesLotConfig...ScreenPorchPoolAreaPoolQCFenceMiscFeatureMiscValMoSoldYrSoldSaleTypeSaleCondition
6460RLNaN9375PaveNaNRegLvlAllPubInside...00NaNGdPrvNaN022009WDNormal
682120RLNaN2887PaveNaNRegHLSAllPubInside...00NaNNaNNaN0112008WDNormal
96020RL50.07207PaveNaNIR1LvlAllPubInside...00NaNNaNNaN022010WDNormal
138450RL60.09060PaveNaNRegLvlAllPubInside...00NaNMnPrvNaN0102009WDNormal
110030RL60.08400PaveNaNRegBnkAllPubInside...00NaNNaNNaN012009WDNormal
..................................................................
76360RL82.09430PaveNaNRegLvlAllPubInside...1800NaNNaNNaN072009WDNormal
83520RL60.09600PaveNaNRegLvlAllPubInside...00NaNNaNNaN022010WDNormal
121690RM68.08930PaveNaNRegLvlAllPubInside...00NaNNaNNaN042010WDNormal
559120RLNaN3196PaveNaNRegLvlAllPubInside...00NaNNaNNaN0102006WDNormal
68460RL58.016770PaveNaNIR2LvlAllPubCulDSac...00NaNNaNNaN062010WDNormal
\n", "

1022 rows × 79 columns

\n", "
" ], "text/plain": [ " MSSubClass MSZoning LotFrontage LotArea Street Alley LotShape \\\n", "64 60 RL NaN 9375 Pave NaN Reg \n", "682 120 RL NaN 2887 Pave NaN Reg \n", "960 20 RL 50.0 7207 Pave NaN IR1 \n", "1384 50 RL 60.0 9060 Pave NaN Reg \n", "1100 30 RL 60.0 8400 Pave NaN Reg \n", "... ... ... ... ... ... ... ... \n", "763 60 RL 82.0 9430 Pave NaN Reg \n", "835 20 RL 60.0 9600 Pave NaN Reg \n", "1216 90 RM 68.0 8930 Pave NaN Reg \n", "559 120 RL NaN 3196 Pave NaN Reg \n", "684 60 RL 58.0 16770 Pave NaN IR2 \n", "\n", " LandContour Utilities LotConfig ... ScreenPorch PoolArea PoolQC Fence \\\n", "64 Lvl AllPub Inside ... 0 0 NaN GdPrv \n", "682 HLS AllPub Inside ... 0 0 NaN NaN \n", "960 Lvl AllPub Inside ... 0 0 NaN NaN \n", "1384 Lvl AllPub Inside ... 0 0 NaN MnPrv \n", "1100 Bnk AllPub Inside ... 0 0 NaN NaN \n", "... ... ... ... ... ... ... ... ... \n", "763 Lvl AllPub Inside ... 180 0 NaN NaN \n", "835 Lvl AllPub Inside ... 0 0 NaN NaN \n", "1216 Lvl AllPub Inside ... 0 0 NaN NaN \n", "559 Lvl AllPub Inside ... 0 0 NaN NaN \n", "684 Lvl AllPub CulDSac ... 0 0 NaN NaN \n", "\n", " MiscFeature MiscVal MoSold YrSold SaleType SaleCondition \n", "64 NaN 0 2 2009 WD Normal \n", "682 NaN 0 11 2008 WD Normal \n", "960 NaN 0 2 2010 WD Normal \n", "1384 NaN 0 10 2009 WD Normal \n", "1100 NaN 0 1 2009 WD Normal \n", "... ... ... ... ... ... ... \n", "763 NaN 0 7 2009 WD Normal \n", "835 NaN 0 2 2010 WD Normal \n", "1216 NaN 0 4 2010 WD Normal \n", "559 NaN 0 10 2006 WD Normal \n", "684 NaN 0 6 2010 WD Normal \n", "\n", "[1022 rows x 79 columns]" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# takes a copy of the entire train set\n", "\n", "imputer.X_" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "# imputes all variables.\n", "\n", "# this procedure takes a while because it is \n", "# done observation per observation.\n", "\n", "train_t = imputer.transform(X_train)\n", "test_t = imputer.transform(X_test)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "MSSubClass 0\n", "MSZoning 0\n", "LotFrontage 0\n", "LotArea 0\n", "Street 0\n", " ..\n", "MiscVal 0\n", "MoSold 0\n", "YrSold 0\n", "SaleType 0\n", "SaleCondition 0\n", "Length: 79, dtype: int64" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# No missing data in any variable\n", "# after the imputation.\n", "\n", "test_t.isnull().sum()" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# when using the random sample imputer, \n", "# the distribution of the variable does not change\n", "\n", "fig = plt.figure()\n", "ax = fig.add_subplot(111)\n", "X_train['LotFrontage'].plot(kind='kde', ax=ax)\n", "train_t['LotFrontage'].plot(kind='kde', ax=ax, color='red')\n", "lines, labels = ax.get_legend_handles_labels()\n", "ax.legend(lines, labels, loc='best')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "fenotebook", "language": "python", "name": "fenotebook" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.2" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": true, "toc_window_display": true } }, "nbformat": 4, "nbformat_minor": 4 }