{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "### The Instacart Case Study\n", "Instacart is an American company that operates as a same-day grocery delivery service. Customers select groceries through a web application from various retailers and delivered by a personal shopper. Instacart's service is mainly provided through a smartphone app, available on iOS and Android platforms, apart from its website.\n", "\n", "The objective is to predict which previously purchased products will be in a user’s next order." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Problem definition\n", "The data that Instacart opened up include orders of 200,000 Instacart users with each user having between 4 and 100 orders. Instacart indicates each order in the data as prior, train or test. Prior orders describe the past behaviour of a user while train and test orders regard the future behaviour that we need to predict.\n", "\n", "As a result, we want to predict which previously purchased products (prior orders) will be in a user’s next order (train and test orders).\n", "\n", "For the train orders Instacart reveals the results (i.e., the ordered products) while for the test orders we do not have this piece of information. Moreover, the future order of each user can be either train or test meaning that each user will be either a train or a test user." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Factors that can lead to reorder:\n", "+ Number of times product was ordered (frequency)\n", "+ Time/day of order\n", "+ Category\n", "+ Quantity\n", "+ Date since last order" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# Importing packages\n", "\n", "import pandas as pd \n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "import seaborn as sns\n", "import gc # Garbage Collector to free up memory\n", "gc.enable() # Activate " ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# Importing all the data sets\n", "\n", "orders = pd.read_csv(r'C:\\Users\\Madhvi\\Desktop\\IVY - Project\\Session 6\\orders.csv')\n", "order_products_train = pd.read_csv(r'C:\\Users\\Madhvi\\Desktop\\IVY - Project\\Session 6\\order_products_train.csv')\n", "order_products_prior = pd.read_csv(r'C:\\Users\\Madhvi\\Desktop\\IVY - Project\\Session 6\\order_products_prior.csv')\n", "products = pd.read_csv(r'C:\\Users\\Madhvi\\Desktop\\IVY - Project\\Session 6\\products.csv')\n", "aisles = pd.read_csv(r'C:\\Users\\Madhvi\\Desktop\\IVY - Project\\Session 6\\aisles.csv')\n", "departments = pd.read_csv(r'C:\\Users\\Madhvi\\Desktop\\IVY - Project\\Session 6\\departments.csv')" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "### COMMANDS FOR CODING TESTING - Get 10% of users because data is big and might take some time to process\n", "### Comment it if you want to run analysis on all the users\n", "\n", "orders = orders.loc[orders.user_id.isin(orders.user_id.drop_duplicates().sample(frac=0.1, random_state=25))]" ] }, { "cell_type": "code", "execution_count": 4, "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", "
order_iduser_ideval_setorder_numberorder_doworder_hour_of_daydays_since_prior_order
5425655717prior139NaN
5524020087prior211930.0
561210537prior301830.0
5716957427prior42109.0
5833211097prior55183.0
\n", "
" ], "text/plain": [ " order_id user_id eval_set order_number order_dow order_hour_of_day \\\n", "54 2565571 7 prior 1 3 9 \n", "55 2402008 7 prior 2 1 19 \n", "56 121053 7 prior 3 0 18 \n", "57 1695742 7 prior 4 2 10 \n", "58 3321109 7 prior 5 5 18 \n", "\n", " days_since_prior_order \n", "54 NaN \n", "55 30.0 \n", "56 30.0 \n", "57 9.0 \n", "58 3.0 " ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Understanding data\n", "\n", "orders.head()" ] }, { "cell_type": "code", "execution_count": 5, "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", "
order_idproduct_idadd_to_cart_orderreordered
014930211
111110921
211024630
314968340
414363351
\n", "
" ], "text/plain": [ " order_id product_id add_to_cart_order reordered\n", "0 1 49302 1 1\n", "1 1 11109 2 1\n", "2 1 10246 3 0\n", "3 1 49683 4 0\n", "4 1 43633 5 1" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "order_products_train.head()" ] }, { "cell_type": "code", "execution_count": 6, "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", "
order_idproduct_idadd_to_cart_orderreordered
023312011
122898521
22932730
324591841
423003550
\n", "
" ], "text/plain": [ " order_id product_id add_to_cart_order reordered\n", "0 2 33120 1 1\n", "1 2 28985 2 1\n", "2 2 9327 3 0\n", "3 2 45918 4 1\n", "4 2 30035 5 0" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "order_products_prior.head()" ] }, { "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", "
product_idproduct_nameaisle_iddepartment_id
01Chocolate Sandwich Cookies6119
12All-Seasons Salt10413
23Robust Golden Unsweetened Oolong Tea947
34Smart Ones Classic Favorites Mini Rigatoni Wit...381
45Green Chile Anytime Sauce513
\n", "
" ], "text/plain": [ " product_id product_name aisle_id \\\n", "0 1 Chocolate Sandwich Cookies 61 \n", "1 2 All-Seasons Salt 104 \n", "2 3 Robust Golden Unsweetened Oolong Tea 94 \n", "3 4 Smart Ones Classic Favorites Mini Rigatoni Wit... 38 \n", "4 5 Green Chile Anytime Sauce 5 \n", "\n", " department_id \n", "0 19 \n", "1 13 \n", "2 7 \n", "3 1 \n", "4 13 " ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "products.head()" ] }, { "cell_type": "code", "execution_count": 8, "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", "
aisle_idaisle
01prepared soups salads
12specialty cheeses
23energy granola bars
34instant foods
45marinades meat preparation
\n", "
" ], "text/plain": [ " aisle_id aisle\n", "0 1 prepared soups salads\n", "1 2 specialty cheeses\n", "2 3 energy granola bars\n", "3 4 instant foods\n", "4 5 marinades meat preparation" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "aisles.head()" ] }, { "cell_type": "code", "execution_count": 9, "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", "
department_iddepartment
01frozen
12other
23bakery
34produce
45alcohol
\n", "
" ], "text/plain": [ " department_id department\n", "0 1 frozen\n", "1 2 other\n", "2 3 bakery\n", "3 4 produce\n", "4 5 alcohol" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "departments.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us see how the ordering habit changes with day of week." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(12,8))\n", "sns.countplot(x=\"order_dow\", data=orders, color = 'grey')\n", "plt.ylabel('Count', fontsize=12)\n", "plt.xlabel('Day of week', fontsize=12)\n", "plt.xticks(rotation='vertical')\n", "plt.title(\"Frequency of order by week day\", fontsize=15)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Seems like 0 and 1 is Saturday and Sunday when the orders are high and low during Wednesday.\n", "\n", "Now we shall see how the distribution is with respect to time of the day." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(12,8))\n", "sns.countplot(x=\"order_hour_of_day\", data=orders)\n", "plt.ylabel('Count', fontsize=12)\n", "plt.xlabel('Hour of day', fontsize=12)\n", "plt.xticks(rotation='vertical')\n", "plt.title(\"Frequency of order by hour of day\", fontsize=15)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So majority of the orders are made during day time. Now let us combine the day of week and hour of day to see the distribution." ] }, { "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": [ "grouped_df = orders.groupby([\"order_dow\", \"order_hour_of_day\"])[\"order_number\"].aggregate(\"count\").reset_index()\n", "grouped_df = grouped_df.pivot('order_dow', 'order_hour_of_day', 'order_number')\n", "\n", "plt.figure(figsize=(12,6))\n", "sns.heatmap(grouped_df)\n", "plt.title(\"Frequency of Day of week Vs Hour of day\")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Seems Satuday evenings and Sunday mornings are the prime time for orders.\n", "\n", "Now let us check the time interval between the orders." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(12,8))\n", "sns.countplot(x=\"days_since_prior_order\", data=orders)\n", "plt.ylabel('Count', fontsize=12)\n", "plt.xlabel('Days since prior order', fontsize=12)\n", "plt.xticks(rotation='vertical')\n", "plt.title(\"Frequency distribution by days since prior order\", fontsize=15)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Looks like customers order once in every week (check the peak at 7 days) or once in a month (peak at 30 days). We could also see smaller peaks at 14, 21 and 28 days (weekly intervals).\n", "\n", "Since our objective is to figure out the re-orders, let us check out the re-order percentage in prior set and train set." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.5896974667922161" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# percentage of re-orders in prior set #\n", "order_products_prior.reordered.sum() / order_products_prior.shape[0]" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.5985944127509629" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# percentage of re-orders in train set #\n", "order_products_train.reordered.sum() / order_products_train.shape[0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On an average, about 59% of the products in an order are re-ordered products." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### No re-ordered products:\n", "\n", "Now that we have seen 59% of the products are re-ordered, there will also be situations when none of the products are re-ordered. Let us check that now." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "D:\\Anaconda\\lib\\site-packages\\ipykernel_launcher.py:2: DeprecationWarning: \n", ".ix is deprecated. Please use\n", ".loc for label based indexing or\n", ".iloc for positional indexing\n", "\n", "See the documentation here:\n", "http://pandas.pydata.org/pandas-docs/stable/indexing.html#ix-indexer-is-deprecated\n", " \n" ] }, { "data": { "text/plain": [ "1 0.879151\n", "0 0.120849\n", "Name: reordered, dtype: float64" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grouped_df = order_products_prior.groupby(\"order_id\")[\"reordered\"].aggregate(\"sum\").reset_index()\n", "grouped_df[\"reordered\"].ix[grouped_df[\"reordered\"]>1] = 1\n", "grouped_df.reordered.value_counts() / grouped_df.shape[0]" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "D:\\Anaconda\\lib\\site-packages\\ipykernel_launcher.py:2: DeprecationWarning: \n", ".ix is deprecated. Please use\n", ".loc for label based indexing or\n", ".iloc for positional indexing\n", "\n", "See the documentation here:\n", "http://pandas.pydata.org/pandas-docs/stable/indexing.html#ix-indexer-is-deprecated\n", " \n" ] }, { "data": { "text/plain": [ "1 0.93444\n", "0 0.06556\n", "Name: reordered, dtype: float64" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grouped_df = order_products_train.groupby(\"order_id\")[\"reordered\"].aggregate(\"sum\").reset_index()\n", "grouped_df[\"reordered\"].ix[grouped_df[\"reordered\"]>1] = 1\n", "grouped_df.reordered.value_counts() / grouped_df.shape[0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "About 12% of the orders in prior set has no re-ordered items while in the train set it is 7%.\n", "\n", "Now let us see the number of products bought in each order." ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "grouped_df = order_products_train.groupby(\"order_id\")[\"add_to_cart_order\"].aggregate(\"max\").reset_index()\n", "cnt_srs = grouped_df.add_to_cart_order.value_counts()\n", "\n", "plt.figure(figsize=(12,8))\n", "sns.barplot(cnt_srs.index, cnt_srs.values, alpha=0.8)\n", "plt.ylabel('Number of Occurrences', fontsize=12)\n", "plt.xlabel('Number of products in the given order', fontsize=12)\n", "plt.xticks(rotation='vertical')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A right tailed distribution with the maximum value at 5.!" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "# We convert character variables into category. \n", "# In Python, a categorical variable is called category and has a fixed number of different values\n", "\n", "aisles['aisle'] = aisles['aisle'].astype('category')\n", "departments['department'] = departments['department'].astype('category')\n", "orders['eval_set'] = orders['eval_set'].astype('category')\n", "products['product_name'] = products['product_name'].astype('category')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Create a DataFrame with the orders and the products that have been purchased on prior orders (op)" ] }, { "cell_type": "code", "execution_count": 20, "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", "
order_iduser_ideval_setorder_numberorder_doworder_hour_of_daydays_since_prior_orderproduct_idadd_to_cart_orderreordered
025655717prior139NaN4562810
125655717prior139NaN3927520
225655717prior139NaN636130
325655717prior139NaN4506640
425655717prior139NaN1324950
\n", "
" ], "text/plain": [ " order_id user_id eval_set order_number order_dow order_hour_of_day \\\n", "0 2565571 7 prior 1 3 9 \n", "1 2565571 7 prior 1 3 9 \n", "2 2565571 7 prior 1 3 9 \n", "3 2565571 7 prior 1 3 9 \n", "4 2565571 7 prior 1 3 9 \n", "\n", " days_since_prior_order product_id add_to_cart_order reordered \n", "0 NaN 45628 1 0 \n", "1 NaN 39275 2 0 \n", "2 NaN 6361 3 0 \n", "3 NaN 45066 4 0 \n", "4 NaN 13249 5 0 " ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#Merge the orders DF with order_products_prior by their order_id, keep only these rows with order_id that they are appear on both DFs\n", "\n", "op = orders.merge(order_products_prior, on='order_id', how='inner')\n", "op.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Create Predictor Variables\n", "We are now ready to identify and calculate predictor variables based on the provided data. We can create various types of predictors such as:\n", "\n", "User predictors describing the behavior of a user e.g. total number of orders of a user.\n", "Product predictors describing characteristics of a product e.g. total number of times a product has been purchased.\n", "User & product predictors describing the behavior of a user towards a specific product e.g. total times a user ordered a specific product." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Create user predictors\n", "###### Number of orders per customer \n", "We calculate the total number of placed orders per customer. We create a user DataFrame to store the results." ] }, { "cell_type": "code", "execution_count": 21, "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", "
user_t_orders
user_id
720
1413
2215
2418
2918
\n", "
" ], "text/plain": [ " user_t_orders\n", "user_id \n", "7 20\n", "14 13\n", "22 15\n", "24 18\n", "29 18" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "## First approach in one step:\n", "# Create distinct groups for each user, identify the highest order number in each group, save the new column to a DataFrame\n", "user = op.groupby('user_id')['order_number'].max().to_frame('user_t_orders') #\n", "user.head()\n", "\n", "## Second approach in two steps: \n", "#1. Save the result as DataFrame with Double brackets --> [[ ]] \n", "#user = op.groupby('user_id')[['order_number']].max()\n", "#2. Rename the label of the column\n", "#user.columns = ['user_t_orders']\n", "#user.head()" ] }, { "cell_type": "code", "execution_count": 22, "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", "
user_iduser_t_orders
0720
11413
22215
32418
42918
\n", "
" ], "text/plain": [ " user_id user_t_orders\n", "0 7 20\n", "1 14 13\n", "2 22 15\n", "3 24 18\n", "4 29 18" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Reset the index of the DF so to bring user_id from index to column (pre-requisite for step 2.4)\n", "\n", "user = user.reset_index()\n", "user.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Create product predictors\n", "###### Number of purchases for each product \n", "We calculate the total number of purchases for each product (from all customers). We create a prd DataFrame to store the results." ] }, { "cell_type": "code", "execution_count": 23, "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", "
prd_t_purchases
product_id
1205
213
315
437
61
\n", "
" ], "text/plain": [ " prd_t_purchases\n", "product_id \n", "1 205\n", "2 13\n", "3 15\n", "4 37\n", "6 1" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Create distinct groups for each product, count the orders, save the result for each product to a new DataFrame \n", "\n", "prd = op.groupby('product_id')['order_id'].count().to_frame('prd_t_purchases') #\n", "prd.head()" ] }, { "cell_type": "code", "execution_count": 24, "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", "
product_idprd_t_purchases
01205
1213
2315
3437
461
\n", "
" ], "text/plain": [ " product_id prd_t_purchases\n", "0 1 205\n", "1 2 13\n", "2 3 15\n", "3 4 37\n", "4 6 1" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Reset the index of the DF so to bring product_id rom index to column (pre-requisite for step 2.4)\n", "\n", "prd = prd.reset_index()\n", "prd.head()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Create user-product predictors\n", "###### How many times a user bought a product \n", "We create different groups that contain all the rows for each combination of user and product. Then with the aggregation function .count( ) we get how many times each user bought a product. We save the results on new uxp DataFrame." ] }, { "cell_type": "code", "execution_count": 25, "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", "
uxp_t_bought
user_idproduct_id
72741
5192
49207
49453
63615
\n", "
" ], "text/plain": [ " uxp_t_bought\n", "user_id product_id \n", "7 274 1\n", " 519 2\n", " 4920 7\n", " 4945 3\n", " 6361 5" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Create distinct groups for each combination of user and product, count orders, save the result for each user X product to a new DataFrame\n", "\n", "uxp = op.groupby(['user_id', 'product_id'])['order_id'].count().to_frame('uxp_t_bought') #\n", "uxp.head()" ] }, { "cell_type": "code", "execution_count": 26, "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", "
user_idproduct_iduxp_t_bought
072741
175192
2749207
3749453
4763615
\n", "
" ], "text/plain": [ " user_id product_id uxp_t_bought\n", "0 7 274 1\n", "1 7 519 2\n", "2 7 4920 7\n", "3 7 4945 3\n", "4 7 6361 5" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Reset the index of the DF so to bring user_id & product_id rom indices to columns (pre-requisite for step 2.4)\n", "\n", "uxp = uxp.reset_index()\n", "uxp.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Merge all features\n", "We now merge the DataFrames with the three types of predictors that we have created (i.e., for the users, the products and the combinations of users and products)." ] }, { "cell_type": "code", "execution_count": 27, "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", "
user_idproduct_iduxp_t_boughtuser_t_orders
07274120
17519220
274920720
374945320
476361520
\n", "
" ], "text/plain": [ " user_id product_id uxp_t_bought user_t_orders\n", "0 7 274 1 20\n", "1 7 519 2 20\n", "2 7 4920 7 20\n", "3 7 4945 3 20\n", "4 7 6361 5 20" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#Merge uxp features with the user features\n", "#Store the results on a new DataFrame\n", "\n", "data = uxp.merge(user, on='user_id', how='left')\n", "data.head()\n" ] }, { "cell_type": "code", "execution_count": 28, "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", "
user_idproduct_iduxp_t_boughtuser_t_ordersprd_t_purchases
07274120232
17519220111
2749207208126
374945320599
476361520333
\n", "
" ], "text/plain": [ " user_id product_id uxp_t_bought user_t_orders prd_t_purchases\n", "0 7 274 1 20 232\n", "1 7 519 2 20 111\n", "2 7 4920 7 20 8126\n", "3 7 4945 3 20 599\n", "4 7 6361 5 20 333" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#Merge uxp & user features (the new DataFrame) with prd features\n", "\n", "data = data.merge(prd, on='product_id', how='left') \n", "data.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Delete previous DataFrames\n", "The information from the DataFrames that we have created to store our features (op, user, prd, uxp) is now stored on data.\n", "\n", "As we won't use them anymore, we now delete them." ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "61" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "del op, user, prd, uxp\n", "gc.collect()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Create train and test DataFrames" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "+ We select the orders DataFrame to keep only the future orders (labeled as \"train\" & \"test).\n", "+ Keep only the columns of our desire ['eval_set', 'order_id'] **AND** 'user_id' as is the matching key with our data DataFrame\n", "+ Merge data DataFrame with the information for the future order of each customer using as matching key the 'user_id'\n", "\n", "To filter and select the columns of our desire on orders (the 2 first steps) there are numerous approaches:" ] }, { "cell_type": "code", "execution_count": 30, "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", "
user_ideval_setorder_idorder_hour_of_daydays_since_prior_order
747train525192116.0
12914train23161781911.0
27222test13965561.0
29624train965160160.0
43929train31102521113.0
48534train6986041330.0
57038train3173750930.0
58840test243102487.0
66948train29246971814.0
99964train26390131327.0
\n", "
" ], "text/plain": [ " user_id eval_set order_id order_hour_of_day days_since_prior_order\n", "74 7 train 525192 11 6.0\n", "129 14 train 2316178 19 11.0\n", "272 22 test 139655 6 1.0\n", "296 24 train 965160 16 0.0\n", "439 29 train 3110252 11 13.0\n", "485 34 train 698604 13 30.0\n", "570 38 train 3173750 9 30.0\n", "588 40 test 2431024 8 7.0\n", "669 48 train 2924697 18 14.0\n", "999 64 train 2639013 13 27.0" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "## First approach:\n", "# In two steps keep only the future orders from all customers: train & test \n", "orders_future = orders[((orders.eval_set=='train') | (orders.eval_set=='test'))]\n", "orders_future = orders_future[ ['user_id', 'eval_set', 'order_id','order_hour_of_day','days_since_prior_order'] ]\n", "orders_future.head(10)\n", "\n", "## Second approach (if you want to test it you have to re-run the notebook):\n", "# In one step keep only the future orders from all customers: train & test \n", "#orders_future = orders.loc[((orders.eval_set=='train') | (orders.eval_set=='test')), ['user_id', 'eval_set', 'order_id'] ]\n", "#orders_future.head(10)\n", "\n", "## Third approach (if you want to test it you have to re-run the notebook):\n", "# In one step exclude all the prior orders so to deal with the future orders from all customers\n", "#orders_future = orders.loc[orders.eval_set!='prior', ['user_id', 'eval_set', 'order_id'] ]\n", "#orders_future.head(10)" ] }, { "cell_type": "code", "execution_count": 31, "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", "
user_idproduct_iduxp_t_boughtuser_t_ordersprd_t_purchaseseval_setorder_idorder_hour_of_daydays_since_prior_order
07274120232train525192116.0
17519220111train525192116.0
2749207208126train525192116.0
374945320599train525192116.0
476361520333train525192116.0
5782773208990train525192116.0
6785183206828train525192116.0
779598320523train525192116.0
8710504120731train525192116.0
9710895320547train525192116.0
\n", "
" ], "text/plain": [ " user_id product_id uxp_t_bought user_t_orders prd_t_purchases eval_set \\\n", "0 7 274 1 20 232 train \n", "1 7 519 2 20 111 train \n", "2 7 4920 7 20 8126 train \n", "3 7 4945 3 20 599 train \n", "4 7 6361 5 20 333 train \n", "5 7 8277 3 20 8990 train \n", "6 7 8518 3 20 6828 train \n", "7 7 9598 3 20 523 train \n", "8 7 10504 1 20 731 train \n", "9 7 10895 3 20 547 train \n", "\n", " order_id order_hour_of_day days_since_prior_order \n", "0 525192 11 6.0 \n", "1 525192 11 6.0 \n", "2 525192 11 6.0 \n", "3 525192 11 6.0 \n", "4 525192 11 6.0 \n", "5 525192 11 6.0 \n", "6 525192 11 6.0 \n", "7 525192 11 6.0 \n", "8 525192 11 6.0 \n", "9 525192 11 6.0 " ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# bring the info of the future orders to data DF\n", "\n", "data = data.merge(orders_future, on='user_id', how='left')\n", "data.head(10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Prepare the train DataFrame" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "+ We keep only the customers who are labelled as \"train\" from the competition\n", "+ For these customers we get from order_products_train the products that they have bought, in order to create the response variable (reordered:1 or 0)\n", "+ We make all the required manipulations on that dataset and we remove the columns that are not predictors\n", "\n", "So now we filter the data DataFrame so to keep only the train users:" ] }, { "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", "
user_idproduct_iduxp_t_boughtuser_t_ordersprd_t_purchaseseval_setorder_idorder_hour_of_daydays_since_prior_order
07274120232train525192116.0
17519220111train525192116.0
2749207208126train525192116.0
374945320599train525192116.0
476361520333train525192116.0
\n", "
" ], "text/plain": [ " user_id product_id uxp_t_bought user_t_orders prd_t_purchases eval_set \\\n", "0 7 274 1 20 232 train \n", "1 7 519 2 20 111 train \n", "2 7 4920 7 20 8126 train \n", "3 7 4945 3 20 599 train \n", "4 7 6361 5 20 333 train \n", "\n", " order_id order_hour_of_day days_since_prior_order \n", "0 525192 11 6.0 \n", "1 525192 11 6.0 \n", "2 525192 11 6.0 \n", "3 525192 11 6.0 \n", "4 525192 11 6.0 " ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#Keep only the customers who we know what they bought in their future order\n", "\n", "data_train = data[data.eval_set=='train'] #\n", "data_train.head()" ] }, { "cell_type": "code", "execution_count": 33, "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", "
user_idproduct_iduxp_t_boughtuser_t_ordersprd_t_purchaseseval_setorder_idorder_hour_of_daydays_since_prior_orderreordered
07274120232train525192116.0NaN
17519220111train525192116.0NaN
2749207208126train525192116.0NaN
374945320599train525192116.0NaN
476361520333train525192116.0NaN
5782773208990train525192116.0NaN
6785183206828train525192116.0NaN
779598320523train525192116.0NaN
8710504120731train525192116.0NaN
9710895320547train525192116.0NaN
107115201204005train525192116.0NaN
1171219622097train525192116.0NaN
1271317612038499train525192116.0NaN
137131988201240train525192116.01.0
147132491201446train525192116.0NaN
\n", "
" ], "text/plain": [ " user_id product_id uxp_t_bought user_t_orders prd_t_purchases \\\n", "0 7 274 1 20 232 \n", "1 7 519 2 20 111 \n", "2 7 4920 7 20 8126 \n", "3 7 4945 3 20 599 \n", "4 7 6361 5 20 333 \n", "5 7 8277 3 20 8990 \n", "6 7 8518 3 20 6828 \n", "7 7 9598 3 20 523 \n", "8 7 10504 1 20 731 \n", "9 7 10895 3 20 547 \n", "10 7 11520 1 20 4005 \n", "11 7 12196 2 20 97 \n", "12 7 13176 1 20 38499 \n", "13 7 13198 8 20 1240 \n", "14 7 13249 1 20 1446 \n", "\n", " eval_set order_id order_hour_of_day days_since_prior_order reordered \n", "0 train 525192 11 6.0 NaN \n", "1 train 525192 11 6.0 NaN \n", "2 train 525192 11 6.0 NaN \n", "3 train 525192 11 6.0 NaN \n", "4 train 525192 11 6.0 NaN \n", "5 train 525192 11 6.0 NaN \n", "6 train 525192 11 6.0 NaN \n", "7 train 525192 11 6.0 NaN \n", "8 train 525192 11 6.0 NaN \n", "9 train 525192 11 6.0 NaN \n", "10 train 525192 11 6.0 NaN \n", "11 train 525192 11 6.0 NaN \n", "12 train 525192 11 6.0 NaN \n", "13 train 525192 11 6.0 1.0 \n", "14 train 525192 11 6.0 NaN " ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#Get from order_products_train all the products that the train users bought bought in their future order\n", "\n", "data_train = data_train.merge(order_products_train[['product_id','order_id', 'reordered']], on=['product_id','order_id'], how='left' )\n", "data_train.head(15)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Data Preparation" ] }, { "cell_type": "code", "execution_count": 34, "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", "
user_idproduct_iduxp_t_boughtuser_t_ordersprd_t_purchaseseval_setorder_idorder_hour_of_daydays_since_prior_orderreordered
07274120232train525192116.00.0
17519220111train525192116.00.0
2749207208126train525192116.00.0
374945320599train525192116.00.0
476361520333train525192116.00.0
5782773208990train525192116.00.0
6785183206828train525192116.00.0
779598320523train525192116.00.0
8710504120731train525192116.00.0
9710895320547train525192116.00.0
107115201204005train525192116.00.0
1171219622097train525192116.00.0
1271317612038499train525192116.00.0
137131988201240train525192116.01.0
147132491201446train525192116.00.0
\n", "
" ], "text/plain": [ " user_id product_id uxp_t_bought user_t_orders prd_t_purchases \\\n", "0 7 274 1 20 232 \n", "1 7 519 2 20 111 \n", "2 7 4920 7 20 8126 \n", "3 7 4945 3 20 599 \n", "4 7 6361 5 20 333 \n", "5 7 8277 3 20 8990 \n", "6 7 8518 3 20 6828 \n", "7 7 9598 3 20 523 \n", "8 7 10504 1 20 731 \n", "9 7 10895 3 20 547 \n", "10 7 11520 1 20 4005 \n", "11 7 12196 2 20 97 \n", "12 7 13176 1 20 38499 \n", "13 7 13198 8 20 1240 \n", "14 7 13249 1 20 1446 \n", "\n", " eval_set order_id order_hour_of_day days_since_prior_order reordered \n", "0 train 525192 11 6.0 0.0 \n", "1 train 525192 11 6.0 0.0 \n", "2 train 525192 11 6.0 0.0 \n", "3 train 525192 11 6.0 0.0 \n", "4 train 525192 11 6.0 0.0 \n", "5 train 525192 11 6.0 0.0 \n", "6 train 525192 11 6.0 0.0 \n", "7 train 525192 11 6.0 0.0 \n", "8 train 525192 11 6.0 0.0 \n", "9 train 525192 11 6.0 0.0 \n", "10 train 525192 11 6.0 0.0 \n", "11 train 525192 11 6.0 0.0 \n", "12 train 525192 11 6.0 0.0 \n", "13 train 525192 11 6.0 1.0 \n", "14 train 525192 11 6.0 0.0 " ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#Where the previous merge, left a NaN value on reordered column means that the customers they haven't bought the product. We change the value on them to 0.\n", "\n", "data_train['reordered'] = data_train['reordered'].fillna(0)\n", "data_train.head(15)" ] }, { "cell_type": "code", "execution_count": 35, "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", "
uxp_t_boughtuser_t_ordersprd_t_purchaseseval_setorder_idorder_hour_of_daydays_since_prior_orderreordered
user_idproduct_id
7274120232train525192116.00.0
519220111train525192116.00.0
49207208126train525192116.00.0
4945320599train525192116.00.0
6361520333train525192116.00.0
82773208990train525192116.00.0
85183206828train525192116.00.0
9598320523train525192116.00.0
10504120731train525192116.00.0
10895320547train525192116.00.0
115201204005train525192116.00.0
1219622097train525192116.00.0
1317612038499train525192116.00.0
131988201240train525192116.01.0
132491201446train525192116.00.0
\n", "
" ], "text/plain": [ " uxp_t_bought user_t_orders prd_t_purchases eval_set \\\n", "user_id product_id \n", "7 274 1 20 232 train \n", " 519 2 20 111 train \n", " 4920 7 20 8126 train \n", " 4945 3 20 599 train \n", " 6361 5 20 333 train \n", " 8277 3 20 8990 train \n", " 8518 3 20 6828 train \n", " 9598 3 20 523 train \n", " 10504 1 20 731 train \n", " 10895 3 20 547 train \n", " 11520 1 20 4005 train \n", " 12196 2 20 97 train \n", " 13176 1 20 38499 train \n", " 13198 8 20 1240 train \n", " 13249 1 20 1446 train \n", "\n", " order_id order_hour_of_day days_since_prior_order \\\n", "user_id product_id \n", "7 274 525192 11 6.0 \n", " 519 525192 11 6.0 \n", " 4920 525192 11 6.0 \n", " 4945 525192 11 6.0 \n", " 6361 525192 11 6.0 \n", " 8277 525192 11 6.0 \n", " 8518 525192 11 6.0 \n", " 9598 525192 11 6.0 \n", " 10504 525192 11 6.0 \n", " 10895 525192 11 6.0 \n", " 11520 525192 11 6.0 \n", " 12196 525192 11 6.0 \n", " 13176 525192 11 6.0 \n", " 13198 525192 11 6.0 \n", " 13249 525192 11 6.0 \n", "\n", " reordered \n", "user_id product_id \n", "7 274 0.0 \n", " 519 0.0 \n", " 4920 0.0 \n", " 4945 0.0 \n", " 6361 0.0 \n", " 8277 0.0 \n", " 8518 0.0 \n", " 9598 0.0 \n", " 10504 0.0 \n", " 10895 0.0 \n", " 11520 0.0 \n", " 12196 0.0 \n", " 13176 0.0 \n", " 13198 1.0 \n", " 13249 0.0 " ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#We set user_id and product_id as the index of the DF\n", "\n", "data_train = data_train.set_index(['user_id', 'product_id'])\n", "data_train.head(15)" ] }, { "cell_type": "code", "execution_count": 36, "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", "
uxp_t_boughtuser_t_ordersprd_t_purchasesorder_hour_of_daydays_since_prior_orderreordered
user_idproduct_id
7274120232116.00.0
519220111116.00.0
49207208126116.00.0
4945320599116.00.0
6361520333116.00.0
82773208990116.00.0
85183206828116.00.0
9598320523116.00.0
10504120731116.00.0
10895320547116.00.0
115201204005116.00.0
1219622097116.00.0
1317612038499116.00.0
131988201240116.01.0
132491201446116.00.0
\n", "
" ], "text/plain": [ " uxp_t_bought user_t_orders prd_t_purchases \\\n", "user_id product_id \n", "7 274 1 20 232 \n", " 519 2 20 111 \n", " 4920 7 20 8126 \n", " 4945 3 20 599 \n", " 6361 5 20 333 \n", " 8277 3 20 8990 \n", " 8518 3 20 6828 \n", " 9598 3 20 523 \n", " 10504 1 20 731 \n", " 10895 3 20 547 \n", " 11520 1 20 4005 \n", " 12196 2 20 97 \n", " 13176 1 20 38499 \n", " 13198 8 20 1240 \n", " 13249 1 20 1446 \n", "\n", " order_hour_of_day days_since_prior_order reordered \n", "user_id product_id \n", "7 274 11 6.0 0.0 \n", " 519 11 6.0 0.0 \n", " 4920 11 6.0 0.0 \n", " 4945 11 6.0 0.0 \n", " 6361 11 6.0 0.0 \n", " 8277 11 6.0 0.0 \n", " 8518 11 6.0 0.0 \n", " 9598 11 6.0 0.0 \n", " 10504 11 6.0 0.0 \n", " 10895 11 6.0 0.0 \n", " 11520 11 6.0 0.0 \n", " 12196 11 6.0 0.0 \n", " 13176 11 6.0 0.0 \n", " 13198 11 6.0 1.0 \n", " 13249 11 6.0 0.0 " ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#We remove all non-predictor variables\n", "\n", "data_train = data_train.drop(['eval_set', 'order_id'], axis=1)\n", "data_train.head(15)" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(837686, 6)" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data_train.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Prepare the test DataFrame\n", "+ Keep only the customers who are labelled as test\n", "+ Set as index the column(s) that uniquely describe each row (in our case \"user_id\" & \"product_id\")\n", "+ Remove the columns that are predictors (in our case:'eval_set', 'order_id')" ] }, { "cell_type": "code", "execution_count": 38, "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", "
user_idproduct_iduxp_t_boughtuser_t_ordersprd_t_purchaseseval_setorder_idorder_hour_of_daydays_since_prior_order
2102224522151096test13965561.0
21122421711568test13965561.0
2122244211151238test13965561.0
2132252121152379test13965561.0
2142254501155120test13965561.0
\n", "
" ], "text/plain": [ " user_id product_id uxp_t_bought user_t_orders prd_t_purchases \\\n", "210 22 2452 2 15 1096 \n", "211 22 4217 1 15 68 \n", "212 22 4421 1 15 1238 \n", "213 22 5212 1 15 2379 \n", "214 22 5450 1 15 5120 \n", "\n", " eval_set order_id order_hour_of_day days_since_prior_order \n", "210 test 139655 6 1.0 \n", "211 test 139655 6 1.0 \n", "212 test 139655 6 1.0 \n", "213 test 139655 6 1.0 \n", "214 test 139655 6 1.0 " ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#Keep only the future orders from customers who are labelled as test\n", "\n", "data_test = data[data.eval_set=='test'] #\n", "data_test.head()" ] }, { "cell_type": "code", "execution_count": 39, "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", "
uxp_t_boughtuser_t_ordersprd_t_purchaseseval_setorder_idorder_hour_of_daydays_since_prior_order
user_idproduct_id
2224522151096test13965561.0
421711568test13965561.0
44211151238test13965561.0
52121152379test13965561.0
54501155120test13965561.0
\n", "
" ], "text/plain": [ " uxp_t_bought user_t_orders prd_t_purchases eval_set \\\n", "user_id product_id \n", "22 2452 2 15 1096 test \n", " 4217 1 15 68 test \n", " 4421 1 15 1238 test \n", " 5212 1 15 2379 test \n", " 5450 1 15 5120 test \n", "\n", " order_id order_hour_of_day days_since_prior_order \n", "user_id product_id \n", "22 2452 139655 6 1.0 \n", " 4217 139655 6 1.0 \n", " 4421 139655 6 1.0 \n", " 5212 139655 6 1.0 \n", " 5450 139655 6 1.0 " ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#We set user_id and product_id as the index of the DF\n", "\n", "data_test = data_test.set_index(['user_id', 'product_id']) \n", "data_test.head()" ] }, { "cell_type": "code", "execution_count": 40, "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", "
uxp_t_boughtuser_t_ordersprd_t_purchasesorder_hour_of_daydays_since_prior_order
user_idproduct_id
222452215109661.0
42171156861.0
4421115123861.0
5212115237961.0
5450115512061.0
\n", "
" ], "text/plain": [ " uxp_t_bought user_t_orders prd_t_purchases \\\n", "user_id product_id \n", "22 2452 2 15 1096 \n", " 4217 1 15 68 \n", " 4421 1 15 1238 \n", " 5212 1 15 2379 \n", " 5450 1 15 5120 \n", "\n", " order_hour_of_day days_since_prior_order \n", "user_id product_id \n", "22 2452 6 1.0 \n", " 4217 6 1.0 \n", " 4421 6 1.0 \n", " 5212 6 1.0 \n", " 5450 6 1.0 " ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#We remove all non-predictor variables\n", "data_test = data_test.drop(['eval_set','order_id'], axis=1)\n", "#Check if the data_test DF, has the same number of columns as the data_train DF, excluding the response variable\n", "data_test.head()" ] }, { "cell_type": "code", "execution_count": 41, "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", "
uxp_t_boughtuser_t_ordersprd_t_purchasesorder_hour_of_daydays_since_prior_orderreordered
user_idproduct_id
7274120232116.00.0
519220111116.00.0
49207208126116.00.0
4945320599116.00.0
6361520333116.00.0
\n", "
" ], "text/plain": [ " uxp_t_bought user_t_orders prd_t_purchases \\\n", "user_id product_id \n", "7 274 1 20 232 \n", " 519 2 20 111 \n", " 4920 7 20 8126 \n", " 4945 3 20 599 \n", " 6361 5 20 333 \n", "\n", " order_hour_of_day days_since_prior_order reordered \n", "user_id product_id \n", "7 274 11 6.0 0.0 \n", " 519 11 6.0 0.0 \n", " 4920 11 6.0 0.0 \n", " 4945 11 6.0 0.0 \n", " 6361 11 6.0 0.0 " ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data_train.head()" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.0 0.901994\n", "1.0 0.098006\n", "Name: reordered, dtype: float64" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data_train['reordered'].value_counts()/len(data_train)" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: imbalanced-learn in d:\\anaconda\\lib\\site-packages (0.7.0)\n", "Requirement already satisfied: joblib>=0.11 in d:\\anaconda\\lib\\site-packages (from imbalanced-learn) (0.13.2)\n", "Requirement already satisfied: scikit-learn>=0.23 in d:\\anaconda\\lib\\site-packages (from imbalanced-learn) (0.23.1)\n", "Requirement already satisfied: scipy>=0.19.1 in d:\\anaconda\\lib\\site-packages (from imbalanced-learn) (1.2.1)\n", "Requirement already satisfied: numpy>=1.13.3 in d:\\anaconda\\lib\\site-packages (from imbalanced-learn) (1.16.4)\n", "Requirement already satisfied: threadpoolctl>=2.0.0 in d:\\anaconda\\lib\\site-packages (from scikit-learn>=0.23->imbalanced-learn) (2.1.0)\n" ] } ], "source": [ "!pip install imbalanced-learn" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Create predictive model\n", "\n", "To create the predictive model we:\n", "\n", "+ We create a DataFrame with all the predictors, named X_train and a Series with the response, named y_train\n", "+ We initiata a Logistic regression model with a specific random_state (so we can reproduce if we want to our model).\n", "+ Finally we train our model with the X_train and y_train data." ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [], "source": [ "#IMPORT REQUIRED PACKAGES\n", "\n", "from sklearn.linear_model import LogisticRegression\n", "from sklearn.model_selection import train_test_split #validate algorithm\n", "from sklearn.metrics import accuracy_score, confusion_matrix, recall_score, precision_score,f1_score, roc_auc_score #validate algorithm" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [], "source": [ "#CREATE X_train, y_train\n", "\n", "X_train, y_train = data_train.drop('reordered', axis=1), data_train.reordered\n", "X_train, X_val, y_train, y_val = train_test_split(data_train.drop('reordered', axis=1), data_train.reordered, test_size=0.2, random_state=42)\n", " " ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: imblearn in d:\\anaconda\\lib\\site-packages (0.0)\n", "Requirement already satisfied: imbalanced-learn in d:\\anaconda\\lib\\site-packages (from imblearn) (0.7.0)\n", "Requirement already satisfied: numpy>=1.13.3 in d:\\anaconda\\lib\\site-packages (from imbalanced-learn->imblearn) (1.16.4)\n", "Requirement already satisfied: scikit-learn>=0.23 in d:\\anaconda\\lib\\site-packages (from imbalanced-learn->imblearn) (0.23.1)\n", "Requirement already satisfied: joblib>=0.11 in d:\\anaconda\\lib\\site-packages (from imbalanced-learn->imblearn) (0.13.2)\n", "Requirement already satisfied: scipy>=0.19.1 in d:\\anaconda\\lib\\site-packages (from imbalanced-learn->imblearn) (1.2.1)\n", "Requirement already satisfied: threadpoolctl>=2.0.0 in d:\\anaconda\\lib\\site-packages (from scikit-learn>=0.23->imbalanced-learn->imblearn) (2.1.0)\n" ] } ], "source": [ "! pip install imblearn" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "After OverSampling, the shape of train_X: (1209014, 5)\n", "After OverSampling, the shape of train_y: (1209014,) \n", "\n", "After OverSampling, counts of label '1': 604507\n", "After OverSampling, counts of label '0': 604507\n" ] } ], "source": [ "# Applying SMOT (Synthetic Minority Oversampling Technique) to balance the data\n", "from imblearn.over_sampling import SMOTE \n", "sm = SMOTE(random_state = 2) \n", "X_train_res, y_train_res = sm.fit_sample(X_train, y_train.ravel()) \n", " \n", "print('After OverSampling, the shape of train_X: {}'.format(X_train_res.shape)) \n", "print('After OverSampling, the shape of train_y: {} \\n'.format(y_train_res.shape)) \n", " \n", "print(\"After OverSampling, counts of label '1': {}\".format(sum(y_train_res == 1))) \n", "print(\"After OverSampling, counts of label '0': {}\".format(sum(y_train_res == 0))) \n" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [], "source": [ "# INITIATE AND TRAIN MODEL\n", "\n", "log = LogisticRegression(random_state=42)\n", "model = log.fit(X_train_res, y_train_res)" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.716398667764925" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# SCORE MODEL\n", "\n", "log.score(X_val,y_val ) # validate algorithm\n" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0., 0., 1., ..., 0., 0., 0.])" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Predicting values\n", "\n", "y_pred = model.predict(X_val)\n", "y_pred" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Trainig accuracy 0.7170087801500564\n", "Testing accuracy 0.716398667764925\n" ] } ], "source": [ "print(\"Trainig accuracy\",log.score(X_train,y_train)) \n", "print(\"Testing accuracy\",log.score(X_val, y_val))" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0])" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Predict values for test data with our model the results are saved as a Python array\n", "test_pred = model.predict(data_test).astype(int)\n", "test_pred[0:20] #display the first 20 predictions of the numpy array" ] }, { "cell_type": "code", "execution_count": 53, "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", "
uxp_t_boughtuser_t_ordersprd_t_purchasesorder_hour_of_daydays_since_prior_orderprediction
user_idproduct_id
222452215109661.00
42171156861.00
4421115123861.00
5212115237961.00
5450115512061.00
\n", "
" ], "text/plain": [ " uxp_t_bought user_t_orders prd_t_purchases \\\n", "user_id product_id \n", "22 2452 2 15 1096 \n", " 4217 1 15 68 \n", " 4421 1 15 1238 \n", " 5212 1 15 2379 \n", " 5450 1 15 5120 \n", "\n", " order_hour_of_day days_since_prior_order prediction \n", "user_id product_id \n", "22 2452 6 1.0 0 \n", " 4217 6 1.0 0 \n", " 4421 6 1.0 0 \n", " 5212 6 1.0 0 \n", " 5450 6 1.0 0 " ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#Save the prediction in a new column in the data_test DF\n", "data_test['prediction'] = test_pred\n", "data_test.head()" ] }, { "cell_type": "code", "execution_count": 54, "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", "
product_iduser_idprediction
02452220
14217220
24421220
35212220
45450220
57088220
67948220
78518221
813176221
914678220
1014966220
1115392220
1215984220
1316987220
1417794221
1521903221
1622115220
1722935221
1822963220
1924506220
2024964221
2127171220
2227845221
2332096221
2432655221
2535221221
2636311220
2736724220
2838312220
2939040220
3041950220
3144359220
3244968220
3349533220
342238400
354193400
365322401
375450401
385699401
396975401
409290400
4111777400
4213176401
4313740401
4413870400
\n", "
" ], "text/plain": [ " product_id user_id prediction\n", "0 2452 22 0\n", "1 4217 22 0\n", "2 4421 22 0\n", "3 5212 22 0\n", "4 5450 22 0\n", "5 7088 22 0\n", "6 7948 22 0\n", "7 8518 22 1\n", "8 13176 22 1\n", "9 14678 22 0\n", "10 14966 22 0\n", "11 15392 22 0\n", "12 15984 22 0\n", "13 16987 22 0\n", "14 17794 22 1\n", "15 21903 22 1\n", "16 22115 22 0\n", "17 22935 22 1\n", "18 22963 22 0\n", "19 24506 22 0\n", "20 24964 22 1\n", "21 27171 22 0\n", "22 27845 22 1\n", "23 32096 22 1\n", "24 32655 22 1\n", "25 35221 22 1\n", "26 36311 22 0\n", "27 36724 22 0\n", "28 38312 22 0\n", "29 39040 22 0\n", "30 41950 22 0\n", "31 44359 22 0\n", "32 44968 22 0\n", "33 49533 22 0\n", "34 2238 40 0\n", "35 4193 40 0\n", "36 5322 40 1\n", "37 5450 40 1\n", "38 5699 40 1\n", "39 6975 40 1\n", "40 9290 40 0\n", "41 11777 40 0\n", "42 13176 40 1\n", "43 13740 40 1\n", "44 13870 40 0" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#Reset the index\n", "final = data_test.reset_index()\n", "#Keep only the required columns to create our submission file\n", "final = final[['product_id', 'user_id', 'prediction']]\n", "\n", "gc.collect()\n", "final.head(45)" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 0.678946\n", "1 0.321054\n", "Name: prediction, dtype: float64" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "final['prediction'].value_counts()/len(final)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Another Method" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "D:\\Anaconda\\lib\\site-packages\\numpy\\core\\fromnumeric.py:2389: FutureWarning: Method .ptp is deprecated and will be removed in a future version. Use numpy.ptp instead.\n", " return ptp(axis=axis, out=out, **kwargs)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Optimization terminated successfully.\n", " Current function value: 0.283209\n", " Iterations 7\n" ] } ], "source": [ "# #Build the logistic regression model\n", "import statsmodels.api as sm\n", "logit = sm.Logit(y_train, sm.add_constant(X_train))\n", "lg = logit.fit()" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " Logit Regression Results \n", "==============================================================================\n", "Dep. Variable: reordered No. Observations: 670148\n", "Model: Logit Df Residuals: 670142\n", "Method: MLE Df Model: 5\n", "Date: Mon, 06 Jul 2020 Pseudo R-squ.: 0.1165\n", "Time: 20:12:25 Log-Likelihood: -1.8979e+05\n", "converged: True LL-Null: -2.1482e+05\n", "Covariance Type: nonrobust LLR p-value: 0.000\n", "==========================================================================================\n", " coef std err z P>|z| [0.025 0.975]\n", "------------------------------------------------------------------------------------------\n", "const -1.9897 0.018 -109.092 0.000 -2.025 -1.954\n", "uxp_t_bought 0.2027 0.001 169.468 0.000 0.200 0.205\n", "user_t_orders -0.0420 0.000 -115.099 0.000 -0.043 -0.041\n", "prd_t_purchases 3.017e-05 5.59e-07 53.961 0.000 2.91e-05 3.13e-05\n", "order_hour_of_day -0.0045 0.001 -4.388 0.000 -0.007 -0.003\n", "days_since_prior_order -0.0009 0.000 -2.035 0.042 -0.002 -3.35e-05\n", "==========================================================================================\n" ] } ], "source": [ "#Summary of logistic regression\n", "from scipy import stats\n", "stats.chisqprob = lambda chisq, df: stats.chi2.sf(chisq, df)\n", "print(lg.summary())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Interpretation of Pseudo R^2\n", "\n", "A pseudo R^2 of 11.9% indicates that 11.9% of the uncertainty of the intercept only model is explained by the full model" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Calculate the odds ratio from the coef using the formula odds ratio=exp(coef)\n", "\n", "#### Calculate the probability from the odds ratio using the formula probability = odds / (1+odds)" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [], "source": [ "#Calculate Odds Ratio, probability\n", "#create a data frame to collate Odds ratio, probability and p-value of the coef\n", "import numpy as np\n", "lgcoef = pd.DataFrame(lg.params, columns=['coef'])\n", "lgcoef.loc[:, \"Odds_ratio\"] = np.exp(lgcoef.coef)\n", "lgcoef['probability'] = lgcoef['Odds_ratio']/(1+lgcoef['Odds_ratio'])\n", "lgcoef['pval']=lg.pvalues\n", "pd.options.display.float_format = '{:.2f}'.format" ] }, { "cell_type": "code", "execution_count": 59, "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", "
coefOdds_ratioprobabilitypval
uxp_t_bought0.201.220.550.00
prd_t_purchases0.001.000.500.00
days_since_prior_order-0.001.000.500.04
order_hour_of_day-0.001.000.500.00
user_t_orders-0.040.960.490.00
const-1.990.140.120.00
\n", "
" ], "text/plain": [ " coef Odds_ratio probability pval\n", "uxp_t_bought 0.20 1.22 0.55 0.00\n", "prd_t_purchases 0.00 1.00 0.50 0.00\n", "days_since_prior_order -0.00 1.00 0.50 0.04\n", "order_hour_of_day -0.00 1.00 0.50 0.00\n", "user_t_orders -0.04 0.96 0.49 0.00\n", "const -1.99 0.14 0.12 0.00" ] }, "execution_count": 59, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# FIlter by significant p-value (pval <0.1) and sort descending by Odds ratio\n", "lgcoef = lgcoef.sort_values(by=\"Odds_ratio\", ascending=False)\n", "pval_filter = lgcoef['pval']<=0.1\n", "lgcoef[pval_filter]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Measures of Accuracy" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "AIC: -95086\n" ] } ], "source": [ " print('AIC:', (2*-47547)+(2*4))" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [], "source": [ "## function to get confusion matrix in a proper format\n", "import seaborn as sns\n", "import matplotlib.pyplot as plt\n", "def draw_cm( actual, predicted ):\n", " cm = confusion_matrix( actual, predicted)\n", " sns.heatmap(cm, annot=True, fmt='.2f', xticklabels = [0,1] , yticklabels = [0,1] )\n", " plt.ylabel('Observed')\n", " plt.xlabel('Predicted')\n", " plt.show()" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Confusion Matrix\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "None\n" ] } ], "source": [ "print('Confusion Matrix')\n", "print(draw_cm(y_val,y_pred))" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Recall: 0.6895545968280975\n" ] } ], "source": [ "print(\"Recall:\",recall_score(y_val,y_pred))" ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Precision: 0.21111379829962978\n" ] } ], "source": [ "print(\"Precision:\",precision_score(y_val,y_pred))" ] }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "F1 Score: 0.3232587950434411\n" ] } ], "source": [ "print(\"F1 Score:\",f1_score(y_val,y_pred))" ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Roc Auc Score: 0.7044386721142493\n" ] } ], "source": [ "print(\"Roc Auc Score:\",roc_auc_score(y_val,y_pred))" ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "#AUC ROC curve\n", "from sklearn.metrics import roc_auc_score\n", "from sklearn.metrics import roc_curve\n", "\n", "logit_roc_auc = roc_auc_score(y_val, log.predict(X_val))\n", "fpr, tpr, thresholds = roc_curve(y_val, log.predict_proba(X_val)[:,1])\n", "plt.figure()\n", "plt.plot(fpr, tpr, label='Logistic Regression (area = %0.2f)' % logit_roc_auc)\n", "plt.plot([0, 1], [0, 1],'r--')\n", "plt.xlim([0.0, 1.0])\n", "plt.ylim([0.0, 1.05])\n", "plt.xlabel('False Positive Rate')\n", "plt.ylabel('True Positive Rate')\n", "plt.title('Receiver operating characteristic')\n", "plt.legend(loc=\"lower right\")\n", "plt.savefig('Log_ROC')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(837686, 6)" ] }, "execution_count": 68, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data_train.shape" ] }, { "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.3" } }, "nbformat": 4, "nbformat_minor": 2 }