{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "<center><a href=\"https://www.featuretools.com/\"><img src=\"http://www.featuretools.com/wp-content/uploads/2017/12/FeatureLabs-Logo-Tangerine-2000.png\" width=\"400\" height=\"200\" /></a></center>" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Predict Taxi Trip Duration using Premium Primitives\n", "\n", "The following tutorial illustrates using [premium primitives](http://primitives.featurelabs.com) in Featuretools to predict the duration of a taxi trip in New York City. An accurate predictive model would provide passengers informative time estimate before they begin their trip. \n", "\n", "In this notebook we will:\n", "\n", "1. [Load Data](#Step-1:-Load-Data)\n", "2. [Select Primitives](#Step-2.-Selecting-Premium-Primitives)\n", "3. [Run Featuretools](#Step-3.-Running-Featuretools)\n", "4. [Build a model](#Step-4:-Building-the-Model)\n", "5. [Interpret features](#Step-5:-Interpretting-Features)\n", "6. [Apply to new data](#Step-6:-Apply-feature-engineering-and-modeling-to-new-data)\n", "\n", "To learn more about Featuretools, visit our [documentation](http://featuretools.featurelabs.com)." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import featuretools as ft\n", "import pandas as pd\n", "import numpy as np\n", "from sklearn.ensemble import RandomForestRegressor\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.metrics import mean_squared_error\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Step 1: Load Data\n", "\n", "First, we load in a copy of the data. It is 175 MB, so it may take a few minutes to download" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "es = ft.entityset.read_entityset(\"s3://featurelabs-static/nyc_taxi_entityset_train.tar\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this entity set, there is data on nearly **1.5 million taxi trips** in New York City across a several month period. For each trip, we have a handful of columns about it shown below.\n", "\n", "With [graphviz installed](https://docs.featuretools.com/getting_started/install.html#installing-graphviz) we can generate a visualization of the entity set." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", "<!-- Generated by graphviz version 2.40.1 (20161225.0304)\n", " -->\n", "<!-- Title: taxi Pages: 1 -->\n", "<svg width=\"246pt\" height=\"151pt\"\n", " viewBox=\"0.00 0.00 246.38 151.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 147)\">\n", "<title>taxi</title>\n", "<polygon fill=\"#ffffff\" stroke=\"transparent\" points=\"-4,4 -4,-147 242.3799,-147 242.3799,4 -4,4\"/>\n", "<!-- trips -->\n", "<g id=\"node1\" class=\"node\">\n", "<title>trips</title>\n", "<polygon fill=\"none\" stroke=\"#000000\" points=\"0,-.5 0,-142.5 238.3799,-142.5 238.3799,-.5 0,-.5\"/>\n", "<text text-anchor=\"middle\" x=\"119.1899\" y=\"-127.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">trips</text>\n", "<polyline fill=\"none\" stroke=\"#000000\" points=\"0,-120.5 238.3799,-120.5 \"/>\n", "<text text-anchor=\"start\" x=\"8\" y=\"-105.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">id : index</text>\n", "<text text-anchor=\"start\" x=\"8\" y=\"-91.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">pickup_datetime : datetime_time_index</text>\n", "<text text-anchor=\"start\" x=\"8\" y=\"-77.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">store_and_fwd_flag : boolean</text>\n", "<text text-anchor=\"start\" x=\"8\" y=\"-63.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">trip_duration : numeric</text>\n", "<text text-anchor=\"start\" x=\"8\" y=\"-49.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">passenger_count : ordinal</text>\n", "<text text-anchor=\"start\" x=\"8\" y=\"-35.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">vendor_id : categorical</text>\n", "<text text-anchor=\"start\" x=\"8\" y=\"-21.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">pickup_latlong : latlong</text>\n", "<text text-anchor=\"start\" x=\"8\" y=\"-7.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">dropoff_latlong : latlong</text>\n", "</g>\n", "</g>\n", "</svg>\n" ], "text/plain": [ "<graphviz.dot.Digraph at 0x1048b6ef0>" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "es.plot()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The primary data types for this problem are **geospatial** (latitude and longitude) and **temporal**. By default, most machine learning algorithms have a difficult time processing these data types. Therefore, in order get the most out of this data, we need perform feature engineering to extract predictive signals before applying machine learning." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Step 2. Selecting Premium Primitives" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Featuretools has several premium primitives that can be used to assist with preparing this data as numeric feature vectors for machine learning. \n", "\n", "Below we've selected several primitives that apply to the data types in this dataset. To learn more about any of the primitives, click on the links to view the documentation.\n", "\n", "* [City Block Distance](https://primitives.featurelabs.com/#CityblockDistance) - Cars cannot travel diagonally through a city block, so this primitive can be used to give us the most accurate estimate of the distance the passenger has to travel during there trip. \n", "\n", "\n", "* [Lat Long To City](https://primitives.featurelabs.com/#LatLongToCity) - An important factor for the length of a trip is where it begins or ends. This primitive can convert the pick up and drop of locations to the borough e.g this trip began in Manhattan, but ends Brooklyn so we must cross the east river\n", "\n", "\n", "* [Is In Geo Box](https://primitives.featurelabs.com/#IsInGeoBox) - Trips starting and ending by points of interesting can also be relevent. To extract this we can use a geobox to detect trips that start or end within a couple important areas in New York City that have a lot of taxi trips.\n", "\n", " * Area around JFK Airport - (40.62, -73.85), (40.70, -73.75)\n", " * Area around La Guardia Airport - (40.76, -73.89), (40.78, -73.85)\n", " \n", "\n", "* [Part Of Day](https://primitives.featurelabs.com/#PartOfDay) - The traffic conditions greatly affect the duration of the trip. We know traffic varies by time of day, so we can use this primitive to extract if the trip occurs during the morning, afternoon, evening, or night.\n", "\n", "\n", "* [Is Federal Holiday](https://primitives.featurelabs.com/#IsFirstWeekOfMonth) - A typical Monday morning may have heavy traffic going into the city, but if it is a federal holiday, the traffic conditions are likely lighter.\n", "\n", "\n", "* [Season](https://primitives.featurelabs.com/#Season), [Quarter](https://primitives.featurelabs.com/#Quarter) - The weather outside may determine street conditions. Using these primitives we can extract the time of year. Note: this demo data only spans a few months, but these primitives may be very relevent when we expand the dataset.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Step 3. Running Featuretools\n", "\n", "Next, we run Featuretools using the primitives " ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "from featuretools.primitives import (CityblockDistance, LatLongToCity, IsInGeoBox, PartOfDay, \n", " IsFederalHoliday, Season, NthWeekOfMonth, Quarter)\n", "\n", "trans_primitives = [CityblockDistance,\n", " LatLongToCity,\n", " IsInGeoBox((40.62, -73.85), (40.70, -73.75)), # JFK Airport\n", " IsInGeoBox((40.76, -73.89), (40.78, -73.85)), # La Guardia Airport\n", " IsFederalHoliday,\n", " PartOfDay,\n", " Season,\n", " NthWeekOfMonth,\n", " Quarter]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, we can create the feature matrix using [Deep Feature Synthesis](https://featuretools.featurelabs.com/automated_feature_engineering/afe.html)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Built 16 features\n", "Elapsed: 04:55 | Progress: 100%|██████████| Remaining: 00:00\n" ] } ], "source": [ "fm, features = ft.dfs(entityset=es,\n", " target_entity=\"trips\",\n", " trans_primitives=trans_primitives,\n", " chunk_size=.1, # lowering this gives more frequent updates\n", " verbose=True)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>store_and_fwd_flag</th>\n", " <th>trip_duration</th>\n", " <th>passenger_count</th>\n", " <th>vendor_id</th>\n", " <th>CITYBLOCK_DISTANCE(dropoff_latlong, pickup_latlong)</th>\n", " <th>LATLONG_TO_CITY(pickup_latlong)</th>\n", " <th>LATLONG_TO_CITY(dropoff_latlong)</th>\n", " <th>IS_IN_GEOBOX(pickup_latlong, point1=(40.62, -73.85), point2=(40.7, -73.75))</th>\n", " <th>IS_IN_GEOBOX(dropoff_latlong, point1=(40.62, -73.85), point2=(40.7, -73.75))</th>\n", " <th>IS_IN_GEOBOX(pickup_latlong, point1=(40.76, -73.89), point2=(40.78, -73.85))</th>\n", " <th>IS_IN_GEOBOX(dropoff_latlong, point1=(40.76, -73.89), point2=(40.78, -73.85))</th>\n", " <th>IS_FEDERAL_HOLIDAY(pickup_datetime)</th>\n", " <th>PART_OF_DAY(pickup_datetime)</th>\n", " <th>SEASON(pickup_datetime)</th>\n", " <th>NTH_WEEK_OF_MONTH(pickup_datetime)</th>\n", " <th>QUARTER(pickup_datetime)</th>\n", " </tr>\n", " <tr>\n", " <th>id</th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <td>id0000001</td>\n", " <td>False</td>\n", " <td>1105</td>\n", " <td>1</td>\n", " <td>2</td>\n", " <td>4.457185</td>\n", " <td>New York City</td>\n", " <td>Long Island City</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>Morning</td>\n", " <td>summer</td>\n", " <td>3.0</td>\n", " <td>2</td>\n", " </tr>\n", " <tr>\n", " <td>id0000003</td>\n", " <td>False</td>\n", " <td>1046</td>\n", " <td>5</td>\n", " <td>2</td>\n", " <td>1.770763</td>\n", " <td>Weehawken</td>\n", " <td>Hoboken</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>Morning</td>\n", " <td>spring</td>\n", " <td>3.0</td>\n", " <td>1</td>\n", " </tr>\n", " <tr>\n", " <td>id0000005</td>\n", " <td>False</td>\n", " <td>368</td>\n", " <td>1</td>\n", " <td>2</td>\n", " <td>0.904869</td>\n", " <td>Manhattan</td>\n", " <td>Manhattan</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>Morning</td>\n", " <td>spring</td>\n", " <td>5.0</td>\n", " <td>2</td>\n", " </tr>\n", " <tr>\n", " <td>id0000008</td>\n", " <td>False</td>\n", " <td>303</td>\n", " <td>1</td>\n", " <td>1</td>\n", " <td>0.967836</td>\n", " <td>New York City</td>\n", " <td>New York City</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>Morning</td>\n", " <td>summer</td>\n", " <td>3.0</td>\n", " <td>2</td>\n", " </tr>\n", " <tr>\n", " <td>id0000009</td>\n", " <td>False</td>\n", " <td>547</td>\n", " <td>1</td>\n", " <td>1</td>\n", " <td>4.147816</td>\n", " <td>Manhattan</td>\n", " <td>Manhattan</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>Night</td>\n", " <td>spring</td>\n", " <td>2.0</td>\n", " <td>2</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " store_and_fwd_flag trip_duration passenger_count vendor_id \\\n", "id \n", "id0000001 False 1105 1 2 \n", "id0000003 False 1046 5 2 \n", "id0000005 False 368 1 2 \n", "id0000008 False 303 1 1 \n", "id0000009 False 547 1 1 \n", "\n", " CITYBLOCK_DISTANCE(dropoff_latlong, pickup_latlong) \\\n", "id \n", "id0000001 4.457185 \n", "id0000003 1.770763 \n", "id0000005 0.904869 \n", "id0000008 0.967836 \n", "id0000009 4.147816 \n", "\n", " LATLONG_TO_CITY(pickup_latlong) LATLONG_TO_CITY(dropoff_latlong) \\\n", "id \n", "id0000001 New York City Long Island City \n", "id0000003 Weehawken Hoboken \n", "id0000005 Manhattan Manhattan \n", "id0000008 New York City New York City \n", "id0000009 Manhattan Manhattan \n", "\n", " IS_IN_GEOBOX(pickup_latlong, point1=(40.62, -73.85), point2=(40.7, -73.75)) \\\n", "id \n", "id0000001 False \n", "id0000003 False \n", "id0000005 False \n", "id0000008 False \n", "id0000009 False \n", "\n", " IS_IN_GEOBOX(dropoff_latlong, point1=(40.62, -73.85), point2=(40.7, -73.75)) \\\n", "id \n", "id0000001 False \n", "id0000003 False \n", "id0000005 False \n", "id0000008 False \n", "id0000009 False \n", "\n", " IS_IN_GEOBOX(pickup_latlong, point1=(40.76, -73.89), point2=(40.78, -73.85)) \\\n", "id \n", "id0000001 False \n", "id0000003 False \n", "id0000005 False \n", "id0000008 False \n", "id0000009 False \n", "\n", " IS_IN_GEOBOX(dropoff_latlong, point1=(40.76, -73.89), point2=(40.78, -73.85)) \\\n", "id \n", "id0000001 False \n", "id0000003 False \n", "id0000005 False \n", "id0000008 False \n", "id0000009 False \n", "\n", " IS_FEDERAL_HOLIDAY(pickup_datetime) PART_OF_DAY(pickup_datetime) \\\n", "id \n", "id0000001 False Morning \n", "id0000003 False Morning \n", "id0000005 False Morning \n", "id0000008 False Morning \n", "id0000009 False Night \n", "\n", " SEASON(pickup_datetime) NTH_WEEK_OF_MONTH(pickup_datetime) \\\n", "id \n", "id0000001 summer 3.0 \n", "id0000003 spring 3.0 \n", "id0000005 spring 5.0 \n", "id0000008 summer 3.0 \n", "id0000009 spring 2.0 \n", "\n", " QUARTER(pickup_datetime) \n", "id \n", "id0000001 2 \n", "id0000003 1 \n", "id0000005 2 \n", "id0000008 2 \n", "id0000009 2 " ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fm.head(5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Using the primitives above, we created many new features to feed into our machine learning algorithm. Because some of these features are categorical, we will perform [categorical encoding](https://featuretools.featurelabs.com/generated/featuretools.encode_features.html#featuretools.encode_features) (with one-hot encoding) using featuretools before continuing. " ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Encoding pass 1: 100%|██████████| 16/16 [00:08<00:00, 1.96feature/s]\n", "Encoding pass 2: 100%|██████████| 35/35 [00:00<00:00, 235.92feature/s]\n" ] } ], "source": [ "fm_encoded, features_encoded = ft.encode_features(fm, features, top_n=5, verbose=True, include_unknown=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Step 4: Building the Model\n", "\n", "After applying Featuretools, we have a feature matrix of all numeric data that is ready for machine learning. \n", "\n", "The final step we will do is apply a `log` transform to our trip durations. By doing this we can better distiguish short trips when training our models. We can later undo this transform to generate final predictions." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "X = fm_encoded.copy()\n", "y = (X.pop('trip_duration') + 1).apply(np.log)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "to validate our model, we will do a simple train/test split" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, we are ready to train and score our model. For the purposes of this example, we will not perform any hyper parameter tuning of our model." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "[Parallel(n_jobs=-1)]: Using backend ThreadingBackend with 8 concurrent workers.\n", "[Parallel(n_jobs=-1)]: Done 34 tasks | elapsed: 58.9s\n", "[Parallel(n_jobs=-1)]: Done 100 out of 100 | elapsed: 2.5min finished\n" ] }, { "data": { "text/plain": [ "RandomForestRegressor(bootstrap=True, criterion='mse', max_depth=None,\n", " max_features='auto', max_leaf_nodes=None,\n", " min_impurity_decrease=0.0, min_impurity_split=None,\n", " min_samples_leaf=1, min_samples_split=2,\n", " min_weight_fraction_leaf=0.0, n_estimators=100, n_jobs=-1,\n", " oob_score=False, random_state=0, verbose=True,\n", " warm_start=False)" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "estimator = RandomForestRegressor(n_estimators=100,\n", " n_jobs=-1,\n", " random_state=0,\n", " verbose=True)\n", "estimator.fit(X_train, y_train)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Using the trained model, we can look at the mean squared error on the test set" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "[Parallel(n_jobs=8)]: Using backend ThreadingBackend with 8 concurrent workers.\n", "[Parallel(n_jobs=8)]: Done 34 tasks | elapsed: 6.1s\n", "[Parallel(n_jobs=8)]: Done 100 out of 100 | elapsed: 15.9s finished\n" ] }, { "data": { "text/plain": [ "0.2237187249878536" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y_pred = estimator.predict(X_test)\n", "mean_squared_error(y_pred, y_test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Step 5: Interpretting Features\n", "\n", "Featuretools primitives are valueable because they transform the raw data (e.g dates, latitude and longitudes) into meaningful attributes a machine learning model can learn from. Compared to other techniques for feature engineering, they are also more interpretable by humans looking to understand the model.\n", "\n", "\n", "To understand the model better, let's take a look at the most important features discovered when we trained the random forest" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/html": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>feature</th>\n", " <th>importance</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <td>8</td>\n", " <td>CITYBLOCK_DISTANCE(dropoff_latlong, pickup_lat...</td>\n", " <td>0.797597</td>\n", " </tr>\n", " <tr>\n", " <td>31</td>\n", " <td>NTH_WEEK_OF_MONTH(pickup_datetime)</td>\n", " <td>0.041128</td>\n", " </tr>\n", " <tr>\n", " <td>27</td>\n", " <td>PART_OF_DAY(pickup_datetime) = Night</td>\n", " <td>0.011538</td>\n", " </tr>\n", " <tr>\n", " <td>6</td>\n", " <td>vendor_id = 2</td>\n", " <td>0.011130</td>\n", " </tr>\n", " <tr>\n", " <td>7</td>\n", " <td>vendor_id = 1</td>\n", " <td>0.010091</td>\n", " </tr>\n", " <tr>\n", " <td>1</td>\n", " <td>passenger_count = 1</td>\n", " <td>0.008714</td>\n", " </tr>\n", " <tr>\n", " <td>28</td>\n", " <td>SEASON(pickup_datetime) = spring</td>\n", " <td>0.008686</td>\n", " </tr>\n", " <tr>\n", " <td>24</td>\n", " <td>PART_OF_DAY(pickup_datetime) = Afternoon</td>\n", " <td>0.008539</td>\n", " </tr>\n", " <tr>\n", " <td>2</td>\n", " <td>passenger_count = 2</td>\n", " <td>0.007104</td>\n", " </tr>\n", " <tr>\n", " <td>30</td>\n", " <td>SEASON(pickup_datetime) = summer</td>\n", " <td>0.006361</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " feature importance\n", "8 CITYBLOCK_DISTANCE(dropoff_latlong, pickup_lat... 0.797597\n", "31 NTH_WEEK_OF_MONTH(pickup_datetime) 0.041128\n", "27 PART_OF_DAY(pickup_datetime) = Night 0.011538\n", "6 vendor_id = 2 0.011130\n", "7 vendor_id = 1 0.010091\n", "1 passenger_count = 1 0.008714\n", "28 SEASON(pickup_datetime) = spring 0.008686\n", "24 PART_OF_DAY(pickup_datetime) = Afternoon 0.008539\n", "2 passenger_count = 2 0.007104\n", "30 SEASON(pickup_datetime) = summer 0.006361" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "importances = pd.DataFrame(zip(X.columns, estimator.feature_importances_), columns=[\"feature\", \"importance\"]).sort_values(\"importance\", ascending=False)\n", "importances.head(10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As you might expect, **a majority of the top features are the result of applying the premium primitives**. Let's take a closer look at some features in particular" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### As the distance increases, the trip duration increase\n", "\n", "Unsuprisingly the city block distance of the trip is the most important feature. The longer the trip's distance, the longer it will take. However, we will see below this isn't always the case." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "<matplotlib.axes._subplots.AxesSubplot at 0x138793e10>" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "<Figure size 432x288 with 1 Axes>" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fm.sample(1000).plot.scatter(x='CITYBLOCK_DISTANCE(dropoff_latlong, pickup_latlong)', y ='trip_duration')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Average trips are shorter in duration during winter, and longer during the summer\n", "\n", "This may be because people are more likely to take a taxi when it is cold outside in New York City" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "<matplotlib.axes._subplots.AxesSubplot at 0x13859c908>" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "<Figure size 432x288 with 1 Axes>" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fm.groupby(\"SEASON(pickup_datetime)\")[\"trip_duration\"].mean().plot.bar(title=\"Trip duration by Season\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "### Trips are longer in duration in the afternoon even though they cover a shorter distance\n", "\n", "This is counter to what we saw earlier that longer distance trips take a longer amount of time. This is why it is important to extract numerous features from your data so your model and can learn multivariate relationships. \n", "\n", "The likely explaination for this is that there is more traffic in the afternoon than at night. " ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "<matplotlib.axes._subplots.AxesSubplot at 0x1572b0a20>" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "<Figure size 1080x288 with 2 Axes>" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig, axs = plt.subplots(ncols=2, figsize=(15, 4))\n", "fm.groupby(\"PART_OF_DAY(pickup_datetime)\")[\"trip_duration\"].mean().plot.bar(title=\"Trip duration by Time of Day\", ax=axs[0])\n", "fm.groupby(\"PART_OF_DAY(pickup_datetime)\")[\"CITYBLOCK_DISTANCE(dropoff_latlong, pickup_latlong)\"].mean().plot.bar(title=\"Trip Distance by Time of Day\", ax=axs[1])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Trips are shorter in time during federal holidays\n", "\n", "This may be because fewer people are one the road when it is a holiday." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "<matplotlib.axes._subplots.AxesSubplot at 0x15faa82e8>" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "<Figure size 432x288 with 1 Axes>" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fm.groupby(\"IS_FEDERAL_HOLIDAY(pickup_datetime)\")[\"trip_duration\"].mean().plot.bar(title=\"Trip duration by Is Federal Holiday\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Step 6: Apply feature engineering and modeling to new data\n", "\n", "Once we are happy with our model, we can apply it to new data. Below we load in 600,000 new trips, where we don't know the duration (note: duration is no longer a column in the data)." ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "es_test = ft.entityset.read_entityset(\"s3://featurelabs-static/nyc_taxi_entityset_test.tar\")" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", "<!-- Generated by graphviz version 2.40.1 (20161225.0304)\n", " -->\n", "<!-- Title: taxi Pages: 1 -->\n", "<svg width=\"246pt\" height=\"137pt\"\n", " viewBox=\"0.00 0.00 246.38 137.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 133)\">\n", "<title>taxi</title>\n", "<polygon fill=\"#ffffff\" stroke=\"transparent\" points=\"-4,4 -4,-133 242.3799,-133 242.3799,4 -4,4\"/>\n", "<!-- trips -->\n", "<g id=\"node1\" class=\"node\">\n", "<title>trips</title>\n", "<polygon fill=\"none\" stroke=\"#000000\" points=\"0,-.5 0,-128.5 238.3799,-128.5 238.3799,-.5 0,-.5\"/>\n", "<text text-anchor=\"middle\" x=\"119.1899\" y=\"-113.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">trips</text>\n", "<polyline fill=\"none\" stroke=\"#000000\" points=\"0,-106.5 238.3799,-106.5 \"/>\n", "<text text-anchor=\"start\" x=\"8\" y=\"-91.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">id : index</text>\n", "<text text-anchor=\"start\" x=\"8\" y=\"-77.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">pickup_datetime : datetime_time_index</text>\n", "<text text-anchor=\"start\" x=\"8\" y=\"-63.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">store_and_fwd_flag : boolean</text>\n", "<text text-anchor=\"start\" x=\"8\" y=\"-49.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">passenger_count : ordinal</text>\n", "<text text-anchor=\"start\" x=\"8\" y=\"-35.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">vendor_id : categorical</text>\n", "<text text-anchor=\"start\" x=\"8\" y=\"-21.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">pickup_latlong : latlong</text>\n", "<text text-anchor=\"start\" x=\"8\" y=\"-7.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">dropoff_latlong : latlong</text>\n", "</g>\n", "</g>\n", "</svg>\n" ], "text/plain": [ "<graphviz.dot.Digraph at 0x148ad9198>" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "es_test.plot()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "we can use the feature definitions that we created before to reperform feature engineering on this dataset. You can read more about saving and loading feature definitions [here](https://featuretools.featurelabs.com/guides/deployment.html#saving-features). " ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Elapsed: 02:17 | Progress: 100%|██████████| Remaining: 00:00\n" ] } ], "source": [ "# remove trip_duration from the features to calculate\n", "features = [f for f in features_encoded if f.get_name() != \"trip_duration\"]\n", "\n", "fm_test = ft.calculate_feature_matrix(entityset=es_test,\n", " features=features,\n", " chunk_size=.1,\n", " verbose=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "with the new feature matrix in hand, we are ready to reapply our estimator that was previously trained to generate predictions" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "[Parallel(n_jobs=8)]: Using backend ThreadingBackend with 8 concurrent workers.\n", "[Parallel(n_jobs=8)]: Done 34 tasks | elapsed: 4.2s\n", "[Parallel(n_jobs=8)]: Done 100 out of 100 | elapsed: 12.2s finished\n" ] }, { "data": { "text/plain": [ "id\n", "id0000002 1026.497582\n", "id0000006 681.823890\n", "id0000007 791.126881\n", "id0000017 1029.409864\n", "id0000018 2454.557293\n", " ... \n", "id3999960 562.255700\n", "id3999966 1464.219648\n", "id3999967 244.016590\n", "id3999981 649.003684\n", "id3999997 1333.935868\n", "Length: 625134, dtype: float64" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "preds = estimator.predict(fm_test)\n", "preds = np.exp(preds) - 1 # undo log transform\n", "preds = pd.Series(preds, index=fm_test.index)\n", "preds" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "<p>\n", " <img src=\"https://www.featurelabs.com/wp-content/uploads/2017/12/logo.png\" alt=\"Featuretools\" />\n", "</p>\n", "\n", "Featuretools was created by the developers at [Feature Labs](https://www.featurelabs.com/). If building impactful data science pipelines is important to you or your business, please [get in touch](https://www.featurelabs.com/contact/)." ] } ], "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.6.8" } }, "nbformat": 4, "nbformat_minor": 2 }