diff --git a/SGDRegressor/SGDregressor_without_combinations.ipynb b/SGDRegressor/SGDregressor_without_combinations.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..63ee093d5af1cd313e934e5f483a78b3fe1816db --- /dev/null +++ b/SGDRegressor/SGDregressor_without_combinations.ipynb @@ -0,0 +1,2735 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "uxa8uaiWhPuw" + }, + "source": [ + "# Read data into a dataframe" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "id": "pYYleLjJhr_o" + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.preprocessing import OneHotEncoder \n", + "import numpy as np\n", + "from sklearn.ensemble import RandomForestRegressor \n", + "from matplotlib import pyplot as plt " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "id": "RP4jhT3Chr_u" + }, + "outputs": [], + "source": [ + "#!unzip 'final_dataset_2.zip'\n", + "df = pd.read_csv(\"new_dataset.csv\")" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Index(['Unnamed: 0', 'Unnamed: 0.1', 'id', 'vendor_id', 'pickup_datetime',\n", + " 'dropoff_datetime', 'passenger_count', 'pickup_longitude',\n", + " 'pickup_latitude', 'dropoff_longitude', 'dropoff_latitude',\n", + " 'store_and_fwd_flag', 'trip_duration', 'visi', 'vism', 'fog', 'rain',\n", + " 'snow', 'hail', 'thunder', 'tornado', 'holiday_or_not', 'turns'],\n", + " dtype='object')\n" + ] + } + ], + "source": [ + "print(df.columns)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "80n8bJeDhPuy" + }, + "source": [ + "# Data cleaning" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 338 + }, + "id": "Cgw2yRgU5zBZ", + "outputId": "5d3a3e40-008f-4321-fee8-8b52ae89d257" + }, + "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>Unnamed: 0</th>\n", + " <th>Unnamed: 0.1</th>\n", + " <th>vendor_id</th>\n", + " <th>passenger_count</th>\n", + " <th>pickup_longitude</th>\n", + " <th>pickup_latitude</th>\n", + " <th>dropoff_longitude</th>\n", + " <th>dropoff_latitude</th>\n", + " <th>trip_duration</th>\n", + " <th>visi</th>\n", + " <th>vism</th>\n", + " <th>fog</th>\n", + " <th>rain</th>\n", + " <th>snow</th>\n", + " <th>hail</th>\n", + " <th>thunder</th>\n", + " <th>tornado</th>\n", + " <th>holiday_or_not</th>\n", + " <th>turns</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>count</th>\n", + " <td>1.458644e+06</td>\n", + " <td>1.458644e+06</td>\n", + " <td>1.458644e+06</td>\n", + " <td>1.458644e+06</td>\n", + " <td>1.458644e+06</td>\n", + " <td>1.458644e+06</td>\n", + " <td>1.458644e+06</td>\n", + " <td>1.458644e+06</td>\n", + " <td>1.458644e+06</td>\n", + " <td>1.406904e+06</td>\n", + " <td>1.406904e+06</td>\n", + " <td>1.458644e+06</td>\n", + " <td>1.458644e+06</td>\n", + " <td>1.458644e+06</td>\n", + " <td>1458644.0</td>\n", + " <td>1458644.0</td>\n", + " <td>1458644.0</td>\n", + " <td>1.458644e+06</td>\n", + " <td>1.458643e+06</td>\n", + " </tr>\n", + " <tr>\n", + " <th>mean</th>\n", + " <td>7.293215e+05</td>\n", + " <td>7.293215e+05</td>\n", + " <td>1.534950e+00</td>\n", + " <td>1.664530e+00</td>\n", + " <td>-7.397349e+01</td>\n", + " <td>4.075092e+01</td>\n", + " <td>-7.397342e+01</td>\n", + " <td>4.075180e+01</td>\n", + " <td>9.594923e+02</td>\n", + " <td>9.083394e+00</td>\n", + " <td>1.462562e+01</td>\n", + " <td>6.512898e-03</td>\n", + " <td>9.604811e-02</td>\n", + " <td>2.387149e-02</td>\n", + " <td>0.0</td>\n", + " <td>0.0</td>\n", + " <td>0.0</td>\n", + " <td>1.868242e-02</td>\n", + " <td>7.547126e+00</td>\n", + " </tr>\n", + " <tr>\n", + " <th>std</th>\n", + " <td>4.210744e+05</td>\n", + " <td>4.210744e+05</td>\n", + " <td>4.987772e-01</td>\n", + " <td>1.314242e+00</td>\n", + " <td>7.090186e-02</td>\n", + " <td>3.288119e-02</td>\n", + " <td>7.064327e-02</td>\n", + " <td>3.589056e-02</td>\n", + " <td>5.237432e+03</td>\n", + " <td>1.931623e+00</td>\n", + " <td>3.114066e+00</td>\n", + " <td>1.123877e-01</td>\n", + " <td>5.186301e-01</td>\n", + " <td>2.773470e-01</td>\n", + " <td>0.0</td>\n", + " <td>0.0</td>\n", + " <td>0.0</td>\n", + " <td>1.354009e-01</td>\n", + " <td>4.432504e+00</td>\n", + " </tr>\n", + " <tr>\n", + " <th>min</th>\n", + " <td>0.000000e+00</td>\n", + " <td>0.000000e+00</td>\n", + " <td>1.000000e+00</td>\n", + " <td>0.000000e+00</td>\n", + " <td>-1.219333e+02</td>\n", + " <td>3.435970e+01</td>\n", + " <td>-1.219333e+02</td>\n", + " <td>3.218114e+01</td>\n", + " <td>1.000000e+00</td>\n", + " <td>2.000000e-01</td>\n", + " <td>4.000000e-01</td>\n", + " <td>0.000000e+00</td>\n", + " <td>0.000000e+00</td>\n", + " <td>0.000000e+00</td>\n", + " <td>0.0</td>\n", + " <td>0.0</td>\n", + " <td>0.0</td>\n", + " <td>0.000000e+00</td>\n", + " <td>2.000000e+00</td>\n", + " </tr>\n", + " <tr>\n", + " <th>25%</th>\n", + " <td>3.646608e+05</td>\n", + " <td>3.646608e+05</td>\n", + " <td>1.000000e+00</td>\n", + " <td>1.000000e+00</td>\n", + " <td>-7.399187e+01</td>\n", + " <td>4.073735e+01</td>\n", + " <td>-7.399133e+01</td>\n", + " <td>4.073588e+01</td>\n", + " <td>3.970000e+02</td>\n", + " <td>9.000000e+00</td>\n", + " <td>1.450000e+01</td>\n", + " <td>0.000000e+00</td>\n", + " <td>0.000000e+00</td>\n", + " <td>0.000000e+00</td>\n", + " <td>0.0</td>\n", + " <td>0.0</td>\n", + " <td>0.0</td>\n", + " <td>0.000000e+00</td>\n", + " <td>5.000000e+00</td>\n", + " </tr>\n", + " <tr>\n", + " <th>50%</th>\n", + " <td>7.293215e+05</td>\n", + " <td>7.293215e+05</td>\n", + " <td>2.000000e+00</td>\n", + " <td>1.000000e+00</td>\n", + " <td>-7.398174e+01</td>\n", + " <td>4.075410e+01</td>\n", + " <td>-7.397975e+01</td>\n", + " <td>4.075452e+01</td>\n", + " <td>6.620000e+02</td>\n", + " <td>1.000000e+01</td>\n", + " <td>1.610000e+01</td>\n", + " <td>0.000000e+00</td>\n", + " <td>0.000000e+00</td>\n", + " <td>0.000000e+00</td>\n", + " <td>0.0</td>\n", + " <td>0.0</td>\n", + " <td>0.0</td>\n", + " <td>0.000000e+00</td>\n", + " <td>6.000000e+00</td>\n", + " </tr>\n", + " <tr>\n", + " <th>75%</th>\n", + " <td>1.093982e+06</td>\n", + " <td>1.093982e+06</td>\n", + " <td>2.000000e+00</td>\n", + " <td>2.000000e+00</td>\n", + " <td>-7.396733e+01</td>\n", + " <td>4.076836e+01</td>\n", + " <td>-7.396301e+01</td>\n", + " <td>4.076981e+01</td>\n", + " <td>1.075000e+03</td>\n", + " <td>1.000000e+01</td>\n", + " <td>1.610000e+01</td>\n", + " <td>0.000000e+00</td>\n", + " <td>0.000000e+00</td>\n", + " <td>0.000000e+00</td>\n", + " <td>0.0</td>\n", + " <td>0.0</td>\n", + " <td>0.0</td>\n", + " <td>0.000000e+00</td>\n", + " <td>9.000000e+00</td>\n", + " </tr>\n", + " <tr>\n", + " <th>max</th>\n", + " <td>1.458643e+06</td>\n", + " <td>1.458643e+06</td>\n", + " <td>2.000000e+00</td>\n", + " <td>9.000000e+00</td>\n", + " <td>-6.133553e+01</td>\n", + " <td>5.188108e+01</td>\n", + " <td>-6.133553e+01</td>\n", + " <td>4.392103e+01</td>\n", + " <td>3.526282e+06</td>\n", + " <td>1.000000e+01</td>\n", + " <td>1.610000e+01</td>\n", + " <td>4.000000e+00</td>\n", + " <td>7.000000e+00</td>\n", + " <td>6.000000e+00</td>\n", + " <td>0.0</td>\n", + " <td>0.0</td>\n", + " <td>0.0</td>\n", + " <td>1.000000e+00</td>\n", + " <td>4.600000e+01</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " Unnamed: 0 Unnamed: 0.1 vendor_id passenger_count \\\n", + "count 1.458644e+06 1.458644e+06 1.458644e+06 1.458644e+06 \n", + "mean 7.293215e+05 7.293215e+05 1.534950e+00 1.664530e+00 \n", + "std 4.210744e+05 4.210744e+05 4.987772e-01 1.314242e+00 \n", + "min 0.000000e+00 0.000000e+00 1.000000e+00 0.000000e+00 \n", + "25% 3.646608e+05 3.646608e+05 1.000000e+00 1.000000e+00 \n", + "50% 7.293215e+05 7.293215e+05 2.000000e+00 1.000000e+00 \n", + "75% 1.093982e+06 1.093982e+06 2.000000e+00 2.000000e+00 \n", + "max 1.458643e+06 1.458643e+06 2.000000e+00 9.000000e+00 \n", + "\n", + " pickup_longitude pickup_latitude dropoff_longitude dropoff_latitude \\\n", + "count 1.458644e+06 1.458644e+06 1.458644e+06 1.458644e+06 \n", + "mean -7.397349e+01 4.075092e+01 -7.397342e+01 4.075180e+01 \n", + "std 7.090186e-02 3.288119e-02 7.064327e-02 3.589056e-02 \n", + "min -1.219333e+02 3.435970e+01 -1.219333e+02 3.218114e+01 \n", + "25% -7.399187e+01 4.073735e+01 -7.399133e+01 4.073588e+01 \n", + "50% -7.398174e+01 4.075410e+01 -7.397975e+01 4.075452e+01 \n", + "75% -7.396733e+01 4.076836e+01 -7.396301e+01 4.076981e+01 \n", + "max -6.133553e+01 5.188108e+01 -6.133553e+01 4.392103e+01 \n", + "\n", + " trip_duration visi vism fog rain \\\n", + "count 1.458644e+06 1.406904e+06 1.406904e+06 1.458644e+06 1.458644e+06 \n", + "mean 9.594923e+02 9.083394e+00 1.462562e+01 6.512898e-03 9.604811e-02 \n", + "std 5.237432e+03 1.931623e+00 3.114066e+00 1.123877e-01 5.186301e-01 \n", + "min 1.000000e+00 2.000000e-01 4.000000e-01 0.000000e+00 0.000000e+00 \n", + "25% 3.970000e+02 9.000000e+00 1.450000e+01 0.000000e+00 0.000000e+00 \n", + "50% 6.620000e+02 1.000000e+01 1.610000e+01 0.000000e+00 0.000000e+00 \n", + "75% 1.075000e+03 1.000000e+01 1.610000e+01 0.000000e+00 0.000000e+00 \n", + "max 3.526282e+06 1.000000e+01 1.610000e+01 4.000000e+00 7.000000e+00 \n", + "\n", + " snow hail thunder tornado holiday_or_not \\\n", + "count 1.458644e+06 1458644.0 1458644.0 1458644.0 1.458644e+06 \n", + "mean 2.387149e-02 0.0 0.0 0.0 1.868242e-02 \n", + "std 2.773470e-01 0.0 0.0 0.0 1.354009e-01 \n", + "min 0.000000e+00 0.0 0.0 0.0 0.000000e+00 \n", + "25% 0.000000e+00 0.0 0.0 0.0 0.000000e+00 \n", + "50% 0.000000e+00 0.0 0.0 0.0 0.000000e+00 \n", + "75% 0.000000e+00 0.0 0.0 0.0 0.000000e+00 \n", + "max 6.000000e+00 0.0 0.0 0.0 1.000000e+00 \n", + "\n", + " turns \n", + "count 1.458643e+06 \n", + "mean 7.547126e+00 \n", + "std 4.432504e+00 \n", + "min 2.000000e+00 \n", + "25% 5.000000e+00 \n", + "50% 6.000000e+00 \n", + "75% 9.000000e+00 \n", + "max 4.600000e+01 " + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.describe()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "id": "2z07A2gvqUeI" + }, + "outputs": [], + "source": [ + "df = df.drop('Unnamed: 0', axis=1)\n", + "df = df.drop('Unnamed: 0.1', axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "id": "xy5yhwjG58iQ" + }, + "outputs": [], + "source": [ + "df = df.drop('hail', axis=1)\n", + "df = df.drop('thunder', axis=1)\n", + "df = df.drop('tornado', axis=1)\n", + "df = df.drop('visi', axis=1)\n", + "# df = df.fillna(16.1)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "WoLvPXIXIrTl", + "outputId": "8ced79b1-47ac-471d-b388-4bcf30662c6b" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "id 0\n", + "vendor_id 0\n", + "pickup_datetime 0\n", + "dropoff_datetime 0\n", + "passenger_count 0\n", + "pickup_longitude 0\n", + "pickup_latitude 0\n", + "dropoff_longitude 0\n", + "dropoff_latitude 0\n", + "store_and_fwd_flag 0\n", + "trip_duration 0\n", + "vism 51740\n", + "fog 0\n", + "rain 0\n", + "snow 0\n", + "holiday_or_not 0\n", + "turns 1\n", + "dtype: int64\n" + ] + } + ], + "source": [ + "missing_val_count_by_column = (df.isnull().sum())\n", + "print(missing_val_count_by_column)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "wF7xm26tJlh0", + "outputId": "8d756971-fac1-4f15-9244-06a19fef23fb" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "id 0\n", + "vendor_id 0\n", + "pickup_datetime 0\n", + "dropoff_datetime 0\n", + "passenger_count 0\n", + "pickup_longitude 0\n", + "pickup_latitude 0\n", + "dropoff_longitude 0\n", + "dropoff_latitude 0\n", + "store_and_fwd_flag 0\n", + "trip_duration 0\n", + "vism 0\n", + "fog 0\n", + "rain 0\n", + "snow 0\n", + "holiday_or_not 0\n", + "turns 0\n", + "dtype: int64\n" + ] + } + ], + "source": [ + "values = {'vism': 16.1, 'turns': np.round(np.mean(df['turns']))}\n", + "df = df.fillna(value=values)\n", + "missing_val_count_by_column = (df.isnull().sum())\n", + "print(missing_val_count_by_column)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ymGBKkTlhPu1" + }, + "source": [ + "Max value of trip duration : 3526282 second ~ 41 days which is impossible\n", + "\n", + "Clearly there are some outliers in the data" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "nahwlpHAKmMD" + }, + "source": [ + "# Outlier detection and removal" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 415 + }, + "id": "uTuo_KlphPu1", + "outputId": "594a720b-1ae3-4a15-9c91-a44b1f4499d1" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'whiskers': [<matplotlib.lines.Line2D at 0x7f97877f68b0>,\n", + " <matplotlib.lines.Line2D at 0x7f97877f6c10>],\n", + " 'caps': [<matplotlib.lines.Line2D at 0x7f97877f6f70>,\n", + " <matplotlib.lines.Line2D at 0x7f9787809310>],\n", + " 'boxes': [<matplotlib.lines.Line2D at 0x7f97877f6550>],\n", + " 'medians': [<matplotlib.lines.Line2D at 0x7f9787809670>],\n", + " 'fliers': [<matplotlib.lines.Line2D at 0x7f9787809970>],\n", + " 'means': []}" + ] + }, + "execution_count": 9, + "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": [ + "plt.boxplot(df['trip_duration'])" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "YMHAxF7h7W1m", + "outputId": "afb1f264-df51-48db-a4c1-a59fc9e551d8" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Instances with trip duration greater than 2092.0 are outliers as per Boxplot analysis.\n" + ] + } + ], + "source": [ + "Q1 = np.percentile(df['trip_duration'], 25, interpolation = 'midpoint') \n", + "Q2 = np.percentile(df['trip_duration'], 50, interpolation = 'midpoint') \n", + "Q3 = np.percentile(df['trip_duration'], 75, interpolation = 'midpoint') \n", + "IQR = Q3 - Q1\n", + "low_lim = Q1 - 1.5 * IQR \n", + "up_lim = Q3 + 1.5 * IQR\n", + "print(\"Instances with trip duration greater than {} are outliers as per Boxplot analysis.\".format(up_lim))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "4igtTKF7hPu2" + }, + "source": [ + "Hence we can safely consider instances with trip duration > 5900 second as outliers.\n", + "Also trip duration < 60 second(~ 1 min) does not make any sense. Hence we will remove such instances as well. " + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "id": "sxsY-b-IGWFl" + }, + "outputs": [], + "source": [ + "df = df[(df.trip_duration < 5900)]\n", + "df = df[(df.trip_duration > 60)]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "KkVIECiehPu2" + }, + "source": [ + "Instances with passenger_count = 0 also need to be removed." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "id": "YWyc3pQjhPu2" + }, + "outputs": [], + "source": [ + "df = df[(df.passenger_count > 0)]" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 320 + }, + "id": "TvMqWf8jT1ab", + "outputId": "0442f604-7179-41a3-87a4-13b02f2ec111" + }, + "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>vendor_id</th>\n", + " <th>passenger_count</th>\n", + " <th>pickup_longitude</th>\n", + " <th>pickup_latitude</th>\n", + " <th>dropoff_longitude</th>\n", + " <th>dropoff_latitude</th>\n", + " <th>trip_duration</th>\n", + " <th>vism</th>\n", + " <th>fog</th>\n", + " <th>rain</th>\n", + " <th>snow</th>\n", + " <th>holiday_or_not</th>\n", + " <th>turns</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>count</th>\n", + " <td>1.447222e+06</td>\n", + " <td>1.447222e+06</td>\n", + " <td>1.447222e+06</td>\n", + " <td>1.447222e+06</td>\n", + " <td>1.447222e+06</td>\n", + " <td>1.447222e+06</td>\n", + " <td>1.447222e+06</td>\n", + " <td>1.447222e+06</td>\n", + " <td>1.447222e+06</td>\n", + " <td>1.447222e+06</td>\n", + " <td>1.447222e+06</td>\n", + " <td>1.447222e+06</td>\n", + " <td>1.447222e+06</td>\n", + " </tr>\n", + " <tr>\n", + " <th>mean</th>\n", + " <td>1.535028e+00</td>\n", + " <td>1.665402e+00</td>\n", + " <td>-7.397364e+01</td>\n", + " <td>4.075099e+01</td>\n", + " <td>-7.397355e+01</td>\n", + " <td>4.075186e+01</td>\n", + " <td>8.395405e+02</td>\n", + " <td>1.467807e+01</td>\n", + " <td>6.509022e-03</td>\n", + " <td>9.603572e-02</td>\n", + " <td>2.380699e-02</td>\n", + " <td>1.866680e-02</td>\n", + " <td>7.570809e+00</td>\n", + " </tr>\n", + " <tr>\n", + " <th>std</th>\n", + " <td>4.987717e-01</td>\n", + " <td>1.314749e+00</td>\n", + " <td>7.060205e-02</td>\n", + " <td>3.254072e-02</td>\n", + " <td>7.032910e-02</td>\n", + " <td>3.559071e-02</td>\n", + " <td>6.472183e+02</td>\n", + " <td>3.070053e+00</td>\n", + " <td>1.124087e-01</td>\n", + " <td>5.185249e-01</td>\n", + " <td>2.769076e-01</td>\n", + " <td>1.353453e-01</td>\n", + " <td>4.424144e+00</td>\n", + " </tr>\n", + " <tr>\n", + " <th>min</th>\n", + " <td>1.000000e+00</td>\n", + " <td>1.000000e+00</td>\n", + " <td>-1.219333e+02</td>\n", + " <td>3.435970e+01</td>\n", + " <td>-1.219333e+02</td>\n", + " <td>3.218114e+01</td>\n", + " <td>6.100000e+01</td>\n", + " <td>4.000000e-01</td>\n", + " <td>0.000000e+00</td>\n", + " <td>0.000000e+00</td>\n", + " <td>0.000000e+00</td>\n", + " <td>0.000000e+00</td>\n", + " <td>2.000000e+00</td>\n", + " </tr>\n", + " <tr>\n", + " <th>25%</th>\n", + " <td>1.000000e+00</td>\n", + " <td>1.000000e+00</td>\n", + " <td>-7.399187e+01</td>\n", + " <td>4.073742e+01</td>\n", + " <td>-7.399133e+01</td>\n", + " <td>4.073595e+01</td>\n", + " <td>4.010000e+02</td>\n", + " <td>1.450000e+01</td>\n", + " <td>0.000000e+00</td>\n", + " <td>0.000000e+00</td>\n", + " <td>0.000000e+00</td>\n", + " <td>0.000000e+00</td>\n", + " <td>5.000000e+00</td>\n", + " </tr>\n", + " <tr>\n", + " <th>50%</th>\n", + " <td>2.000000e+00</td>\n", + " <td>1.000000e+00</td>\n", + " <td>-7.398177e+01</td>\n", + " <td>4.075414e+01</td>\n", + " <td>-7.397977e+01</td>\n", + " <td>4.075456e+01</td>\n", + " <td>6.650000e+02</td>\n", + " <td>1.610000e+01</td>\n", + " <td>0.000000e+00</td>\n", + " <td>0.000000e+00</td>\n", + " <td>0.000000e+00</td>\n", + " <td>0.000000e+00</td>\n", + " <td>6.000000e+00</td>\n", + " </tr>\n", + " <tr>\n", + " <th>75%</th>\n", + " <td>2.000000e+00</td>\n", + " <td>2.000000e+00</td>\n", + " <td>-7.396744e+01</td>\n", + " <td>4.076837e+01</td>\n", + " <td>-7.396310e+01</td>\n", + " <td>4.076983e+01</td>\n", + " <td>1.076000e+03</td>\n", + " <td>1.610000e+01</td>\n", + " <td>0.000000e+00</td>\n", + " <td>0.000000e+00</td>\n", + " <td>0.000000e+00</td>\n", + " <td>0.000000e+00</td>\n", + " <td>9.000000e+00</td>\n", + " </tr>\n", + " <tr>\n", + " <th>max</th>\n", + " <td>2.000000e+00</td>\n", + " <td>9.000000e+00</td>\n", + " <td>-6.133553e+01</td>\n", + " <td>5.188108e+01</td>\n", + " <td>-6.133553e+01</td>\n", + " <td>4.392103e+01</td>\n", + " <td>5.897000e+03</td>\n", + " <td>1.610000e+01</td>\n", + " <td>4.000000e+00</td>\n", + " <td>7.000000e+00</td>\n", + " <td>6.000000e+00</td>\n", + " <td>1.000000e+00</td>\n", + " <td>4.600000e+01</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " vendor_id passenger_count pickup_longitude pickup_latitude \\\n", + "count 1.447222e+06 1.447222e+06 1.447222e+06 1.447222e+06 \n", + "mean 1.535028e+00 1.665402e+00 -7.397364e+01 4.075099e+01 \n", + "std 4.987717e-01 1.314749e+00 7.060205e-02 3.254072e-02 \n", + "min 1.000000e+00 1.000000e+00 -1.219333e+02 3.435970e+01 \n", + "25% 1.000000e+00 1.000000e+00 -7.399187e+01 4.073742e+01 \n", + "50% 2.000000e+00 1.000000e+00 -7.398177e+01 4.075414e+01 \n", + "75% 2.000000e+00 2.000000e+00 -7.396744e+01 4.076837e+01 \n", + "max 2.000000e+00 9.000000e+00 -6.133553e+01 5.188108e+01 \n", + "\n", + " dropoff_longitude dropoff_latitude trip_duration vism \\\n", + "count 1.447222e+06 1.447222e+06 1.447222e+06 1.447222e+06 \n", + "mean -7.397355e+01 4.075186e+01 8.395405e+02 1.467807e+01 \n", + "std 7.032910e-02 3.559071e-02 6.472183e+02 3.070053e+00 \n", + "min -1.219333e+02 3.218114e+01 6.100000e+01 4.000000e-01 \n", + "25% -7.399133e+01 4.073595e+01 4.010000e+02 1.450000e+01 \n", + "50% -7.397977e+01 4.075456e+01 6.650000e+02 1.610000e+01 \n", + "75% -7.396310e+01 4.076983e+01 1.076000e+03 1.610000e+01 \n", + "max -6.133553e+01 4.392103e+01 5.897000e+03 1.610000e+01 \n", + "\n", + " fog rain snow holiday_or_not turns \n", + "count 1.447222e+06 1.447222e+06 1.447222e+06 1.447222e+06 1.447222e+06 \n", + "mean 6.509022e-03 9.603572e-02 2.380699e-02 1.866680e-02 7.570809e+00 \n", + "std 1.124087e-01 5.185249e-01 2.769076e-01 1.353453e-01 4.424144e+00 \n", + "min 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 2.000000e+00 \n", + "25% 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 5.000000e+00 \n", + "50% 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 6.000000e+00 \n", + "75% 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 9.000000e+00 \n", + "max 4.000000e+00 7.000000e+00 6.000000e+00 1.000000e+00 4.600000e+01 " + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.describe()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "nDl5UVbAhPu2" + }, + "source": [ + "# Feature Extraction" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "id": "i2SF-MV1hr_z" + }, + "outputs": [], + "source": [ + "y = df['trip_duration'] \n", + "X = df.drop(['trip_duration'], axis=1)\n", + "X = X.drop('id',axis=1)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "UbsYDCWfsV6a" + }, + "source": [ + "### Encoding vendor_id" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "rD0BmhbJhPu3", + "outputId": "71dc642c-3c0a-4fcb-cd3f-988aaad46bb2", + "scrolled": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Vendor list : [2 1]\n" + ] + } + ], + "source": [ + "vendor_id_list = pd.unique(X['vendor_id'])\n", + "print(\"Vendor list :\", vendor_id_list)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "SYoAyI12hPu3" + }, + "source": [ + "There are two unique vendors in the dataset.\n", + "Since this is categorical data, we can perform one hot encoding on it." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "id": "rWHK4tinhr_8", + "scrolled": true + }, + "outputs": [], + "source": [ + "#encoding vendor_id ={1,2} to vendor_id_1 and vendor_id_2 columns\n", + "encoded_vendor_id=pd.get_dummies(X['vendor_id'], prefix='vendor_id')\n", + "# Drop column vendor_id as it is now encoded\n", + "X = X.drop('vendor_id',axis = 1)\n", + "# Join original with encoded \n", + "X = X.join(encoded_vendor_id)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "_ualwbX7yq6k" + }, + "source": [ + "### Encoding store_and_fwd_flag" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "GHWPtsgfhPu3", + "outputId": "fdf527bb-4770-4db3-8d8b-53350157d91d" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Flag Values : ['N' 'Y']\n" + ] + } + ], + "source": [ + "flag_values = pd.unique(X['store_and_fwd_flag'])\n", + "print(\"Flag Values :\", flag_values)" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "id": "R5LDruDZx7TM" + }, + "outputs": [], + "source": [ + "#encoding store_and_fwd_flag = {Y,N} to flag_1 and flag_2 columns\n", + "encoded_flag_id=pd.get_dummies(X['store_and_fwd_flag'], prefix='flag')\n", + "# Drop column store_and_fwd_flag as it is now encoded\n", + "X = X.drop('store_and_fwd_flag',axis = 1)\n", + "# Join original with encoded \n", + "X = X.join(encoded_flag_id)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "O1WUDPE1hPu3" + }, + "source": [ + "### Calculating distance related features" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "id": "6GIJD3IGhsAA" + }, + "outputs": [], + "source": [ + "X['lat_diff'] = abs(X['pickup_latitude'] - X['dropoff_latitude'])\n", + "X['long_diff'] = abs(X['pickup_longitude'] - X['dropoff_longitude'])" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "id": "OhMPK8SZhPu3" + }, + "outputs": [], + "source": [ + "def get_euclidean_dist(p_lat, p_long, d_lat, d_long):\n", + " return np.sqrt(np.power(p_lat-d_lat, 2) + np.power(p_long-d_long, 2))" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "id": "pWybkDgQhPu3" + }, + "outputs": [], + "source": [ + "def get_haversine_dist(lat1, lng1, lat2, lng2):\n", + " lat1, lng1, lat2, lng2 = map(np.radians, (lat1, lng1, lat2, lng2))\n", + " AVG_EARTH_RADIUS = 6371 # in km\n", + " lat = lat2 - lat1\n", + " lng = lng2 - lng1\n", + " d = np.sin(lat * 0.5) ** 2 + np.cos(lat1) * np.cos(lat2) * np.sin(lng * 0.5) ** 2\n", + " h = 2 * AVG_EARTH_RADIUS * np.arcsin(np.sqrt(d))\n", + " return(h)" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "id": "ZBKo6Af6hPu3" + }, + "outputs": [], + "source": [ + "def get_manhattan_distance(lat1, lng1, lat2, lng2):\n", + " a = get_haversine_dist(lat1, lng1, lat1, lng2)\n", + " b = get_haversine_dist(lat1, lng1, lat2, lng1)\n", + " return a + b" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "id": "ooqpy-bghPu3" + }, + "outputs": [], + "source": [ + "X['euclidean_dist'] = get_euclidean_dist(X['pickup_latitude'].to_numpy(), X['pickup_longitude'].to_numpy(), X['dropoff_latitude'].to_numpy(), X['dropoff_longitude'].to_numpy())\n", + "X['haversine_dist'] = get_haversine_dist(X['pickup_latitude'].to_numpy(), X['pickup_longitude'].to_numpy(), X['dropoff_latitude'].to_numpy(), X['dropoff_longitude'].to_numpy())\n", + "X['manhattan_dist'] = get_manhattan_distance(X['pickup_latitude'].to_numpy(), X['pickup_longitude'].to_numpy(), X['dropoff_latitude'].to_numpy(), X['dropoff_longitude'].to_numpy())\n", + "# X['speed_haversine'] = X['manhattan_dist'] / y\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ON03y96nhPu3" + }, + "source": [ + "### Calculating time related features" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "id": "Rt3E99CkhsAP" + }, + "outputs": [], + "source": [ + "X['pickup_datetime'] = pd.to_datetime(X['pickup_datetime'], \n", + "format = '%Y-%m-%d %H:%M:%S', \n", + " errors = 'coerce')" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "iBjPHG7m7g6v", + "outputId": "b31054ef-ec62-44f6-f067-2086cdd38436" + }, + "outputs": [], + "source": [ + "X['pickup_day_of_the_week'] = X['pickup_datetime'].dt.dayofweek\n", + "# X['week_sin'] = np.sin(X['pickup_day_of_the_week']*(2*np.pi/7))\n", + "# X['week_cos'] = np.cos(X['pickup_day_of_the_week']*(2*np.pi/7))\n", + "\n", + "\n", + "X['pickup_hour'] = X['pickup_datetime'].dt.hour\n", + "# X['hr_sin'] = np.sin(X['pickup_hour']*(2*np.pi/24))\n", + "# X['hr_cos'] = np.cos(X['pickup_hour']*(2*np.pi/24))\n", + "\n", + "\n", + "X['pickup_month'] = X['pickup_datetime'].dt.month\n", + "# X['month_sin'] = np.sin(X['pickup_month']*(2*np.pi/12))\n", + "# X['month_cos'] = np.cos(X['pickup_month']*(2*np.pi/12))\n", + "\n", + "X['pickup_day_of_year'] = X['pickup_datetime'].dt.dayofyear\n", + "X['pickup_week_of_year'] = X['pickup_datetime'].dt.weekofyear\n" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 383 + }, + "id": "Q5n8YUbKWQUU", + "outputId": "cc0e26e9-402d-4e2d-dd8a-ec333b67af03" + }, + "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>passenger_count</th>\n", + " <th>pickup_longitude</th>\n", + " <th>pickup_latitude</th>\n", + " <th>dropoff_longitude</th>\n", + " <th>dropoff_latitude</th>\n", + " <th>vism</th>\n", + " <th>fog</th>\n", + " <th>rain</th>\n", + " <th>snow</th>\n", + " <th>holiday_or_not</th>\n", + " <th>...</th>\n", + " <th>lat_diff</th>\n", + " <th>long_diff</th>\n", + " <th>euclidean_dist</th>\n", + " <th>haversine_dist</th>\n", + " <th>manhattan_dist</th>\n", + " <th>pickup_day_of_the_week</th>\n", + " <th>pickup_hour</th>\n", + " <th>pickup_month</th>\n", + " <th>pickup_day_of_year</th>\n", + " <th>pickup_week_of_year</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>1</td>\n", + " <td>-73.982155</td>\n", + " <td>40.767937</td>\n", + " <td>-73.964630</td>\n", + " <td>40.765602</td>\n", + " <td>12.90</td>\n", + " <td>0.0</td>\n", + " <td>0.0</td>\n", + " <td>0.0</td>\n", + " <td>0</td>\n", + " <td>...</td>\n", + " <td>0.002335</td>\n", + " <td>0.017525</td>\n", + " <td>0.017680</td>\n", + " <td>1.498521</td>\n", + " <td>1.735433</td>\n", + " <td>0</td>\n", + " <td>17</td>\n", + " <td>3</td>\n", + " <td>74</td>\n", + " <td>11</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>1</td>\n", + " <td>-73.980415</td>\n", + " <td>40.738564</td>\n", + " <td>-73.999481</td>\n", + " <td>40.731152</td>\n", + " <td>16.10</td>\n", + " <td>0.0</td>\n", + " <td>0.0</td>\n", + " <td>0.0</td>\n", + " <td>0</td>\n", + " <td>...</td>\n", + " <td>0.007412</td>\n", + " <td>0.019066</td>\n", + " <td>0.020456</td>\n", + " <td>1.805507</td>\n", + " <td>2.430506</td>\n", + " <td>6</td>\n", + " <td>0</td>\n", + " <td>6</td>\n", + " <td>164</td>\n", + " <td>23</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>1</td>\n", + " <td>-73.979027</td>\n", + " <td>40.763939</td>\n", + " <td>-74.005333</td>\n", + " <td>40.710087</td>\n", + " <td>16.10</td>\n", + " <td>0.0</td>\n", + " <td>0.0</td>\n", + " <td>0.0</td>\n", + " <td>0</td>\n", + " <td>...</td>\n", + " <td>0.053852</td>\n", + " <td>0.026306</td>\n", + " <td>0.059934</td>\n", + " <td>6.385098</td>\n", + " <td>8.203575</td>\n", + " <td>1</td>\n", + " <td>11</td>\n", + " <td>1</td>\n", + " <td>19</td>\n", + " <td>3</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3</th>\n", + " <td>1</td>\n", + " <td>-74.010040</td>\n", + " <td>40.719971</td>\n", + " <td>-74.012268</td>\n", + " <td>40.706718</td>\n", + " <td>2.64</td>\n", + " <td>0.0</td>\n", + " <td>3.0</td>\n", + " <td>0.0</td>\n", + " <td>0</td>\n", + " <td>...</td>\n", + " <td>0.013252</td>\n", + " <td>0.002228</td>\n", + " <td>0.013438</td>\n", + " <td>1.485498</td>\n", + " <td>1.661331</td>\n", + " <td>2</td>\n", + " <td>19</td>\n", + " <td>4</td>\n", + " <td>97</td>\n", + " <td>14</td>\n", + " </tr>\n", + " <tr>\n", + " <th>4</th>\n", + " <td>1</td>\n", + " <td>-73.973053</td>\n", + " <td>40.793209</td>\n", + " <td>-73.972923</td>\n", + " <td>40.782520</td>\n", + " <td>16.10</td>\n", + " <td>0.0</td>\n", + " <td>0.0</td>\n", + " <td>0.0</td>\n", + " <td>0</td>\n", + " <td>...</td>\n", + " <td>0.010689</td>\n", + " <td>0.000130</td>\n", + " <td>0.010690</td>\n", + " <td>1.188588</td>\n", + " <td>1.199457</td>\n", + " <td>5</td>\n", + " <td>13</td>\n", + " <td>3</td>\n", + " <td>86</td>\n", + " <td>12</td>\n", + " </tr>\n", + " <tr>\n", + " <th>5</th>\n", + " <td>6</td>\n", + " <td>-73.982857</td>\n", + " <td>40.742195</td>\n", + " <td>-73.992081</td>\n", + " <td>40.749184</td>\n", + " <td>16.10</td>\n", + " <td>0.0</td>\n", + " <td>0.0</td>\n", + " <td>0.0</td>\n", + " <td>0</td>\n", + " <td>...</td>\n", + " <td>0.006989</td>\n", + " <td>0.009224</td>\n", + " <td>0.011572</td>\n", + " <td>1.098942</td>\n", + " <td>1.554180</td>\n", + " <td>5</td>\n", + " <td>22</td>\n", + " <td>1</td>\n", + " <td>30</td>\n", + " <td>4</td>\n", + " </tr>\n", + " <tr>\n", + " <th>6</th>\n", + " <td>4</td>\n", + " <td>-73.969017</td>\n", + " <td>40.757839</td>\n", + " <td>-73.957405</td>\n", + " <td>40.765896</td>\n", + " <td>16.10</td>\n", + " <td>0.0</td>\n", + " <td>0.0</td>\n", + " <td>0.0</td>\n", + " <td>0</td>\n", + " <td>...</td>\n", + " <td>0.008057</td>\n", + " <td>0.011612</td>\n", + " <td>0.014133</td>\n", + " <td>1.326279</td>\n", + " <td>1.873902</td>\n", + " <td>4</td>\n", + " <td>22</td>\n", + " <td>6</td>\n", + " <td>169</td>\n", + " <td>24</td>\n", + " </tr>\n", + " <tr>\n", + " <th>7</th>\n", + " <td>1</td>\n", + " <td>-73.969276</td>\n", + " <td>40.797779</td>\n", + " <td>-73.922470</td>\n", + " <td>40.760559</td>\n", + " <td>16.10</td>\n", + " <td>0.0</td>\n", + " <td>0.0</td>\n", + " <td>0.0</td>\n", + " <td>0</td>\n", + " <td>...</td>\n", + " <td>0.037220</td>\n", + " <td>0.046806</td>\n", + " <td>0.059801</td>\n", + " <td>5.714981</td>\n", + " <td>8.078684</td>\n", + " <td>5</td>\n", + " <td>7</td>\n", + " <td>5</td>\n", + " <td>142</td>\n", + " <td>20</td>\n", + " </tr>\n", + " <tr>\n", + " <th>8</th>\n", + " <td>1</td>\n", + " <td>-73.999481</td>\n", + " <td>40.738400</td>\n", + " <td>-73.985786</td>\n", + " <td>40.732815</td>\n", + " <td>12.90</td>\n", + " <td>0.0</td>\n", + " <td>0.0</td>\n", + " <td>0.0</td>\n", + " <td>0</td>\n", + " <td>...</td>\n", + " <td>0.005585</td>\n", + " <td>0.013695</td>\n", + " <td>0.014790</td>\n", + " <td>1.310353</td>\n", + " <td>1.774804</td>\n", + " <td>4</td>\n", + " <td>23</td>\n", + " <td>5</td>\n", + " <td>148</td>\n", + " <td>21</td>\n", + " </tr>\n", + " <tr>\n", + " <th>9</th>\n", + " <td>1</td>\n", + " <td>-73.981049</td>\n", + " <td>40.744339</td>\n", + " <td>-73.973000</td>\n", + " <td>40.789989</td>\n", + " <td>14.50</td>\n", + " <td>0.0</td>\n", + " <td>0.0</td>\n", + " <td>0.0</td>\n", + " <td>0</td>\n", + " <td>...</td>\n", + " <td>0.045650</td>\n", + " <td>0.008049</td>\n", + " <td>0.046355</td>\n", + " <td>5.121162</td>\n", + " <td>5.754187</td>\n", + " <td>3</td>\n", + " <td>21</td>\n", + " <td>3</td>\n", + " <td>70</td>\n", + " <td>10</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "<p>10 rows × 25 columns</p>\n", + "</div>" + ], + "text/plain": [ + " passenger_count pickup_longitude pickup_latitude dropoff_longitude \\\n", + "0 1 -73.982155 40.767937 -73.964630 \n", + "1 1 -73.980415 40.738564 -73.999481 \n", + "2 1 -73.979027 40.763939 -74.005333 \n", + "3 1 -74.010040 40.719971 -74.012268 \n", + "4 1 -73.973053 40.793209 -73.972923 \n", + "5 6 -73.982857 40.742195 -73.992081 \n", + "6 4 -73.969017 40.757839 -73.957405 \n", + "7 1 -73.969276 40.797779 -73.922470 \n", + "8 1 -73.999481 40.738400 -73.985786 \n", + "9 1 -73.981049 40.744339 -73.973000 \n", + "\n", + " dropoff_latitude vism fog rain snow holiday_or_not ... lat_diff \\\n", + "0 40.765602 12.90 0.0 0.0 0.0 0 ... 0.002335 \n", + "1 40.731152 16.10 0.0 0.0 0.0 0 ... 0.007412 \n", + "2 40.710087 16.10 0.0 0.0 0.0 0 ... 0.053852 \n", + "3 40.706718 2.64 0.0 3.0 0.0 0 ... 0.013252 \n", + "4 40.782520 16.10 0.0 0.0 0.0 0 ... 0.010689 \n", + "5 40.749184 16.10 0.0 0.0 0.0 0 ... 0.006989 \n", + "6 40.765896 16.10 0.0 0.0 0.0 0 ... 0.008057 \n", + "7 40.760559 16.10 0.0 0.0 0.0 0 ... 0.037220 \n", + "8 40.732815 12.90 0.0 0.0 0.0 0 ... 0.005585 \n", + "9 40.789989 14.50 0.0 0.0 0.0 0 ... 0.045650 \n", + "\n", + " long_diff euclidean_dist haversine_dist manhattan_dist \\\n", + "0 0.017525 0.017680 1.498521 1.735433 \n", + "1 0.019066 0.020456 1.805507 2.430506 \n", + "2 0.026306 0.059934 6.385098 8.203575 \n", + "3 0.002228 0.013438 1.485498 1.661331 \n", + "4 0.000130 0.010690 1.188588 1.199457 \n", + "5 0.009224 0.011572 1.098942 1.554180 \n", + "6 0.011612 0.014133 1.326279 1.873902 \n", + "7 0.046806 0.059801 5.714981 8.078684 \n", + "8 0.013695 0.014790 1.310353 1.774804 \n", + "9 0.008049 0.046355 5.121162 5.754187 \n", + "\n", + " pickup_day_of_the_week pickup_hour pickup_month pickup_day_of_year \\\n", + "0 0 17 3 74 \n", + "1 6 0 6 164 \n", + "2 1 11 1 19 \n", + "3 2 19 4 97 \n", + "4 5 13 3 86 \n", + "5 5 22 1 30 \n", + "6 4 22 6 169 \n", + "7 5 7 5 142 \n", + "8 4 23 5 148 \n", + "9 3 21 3 70 \n", + "\n", + " pickup_week_of_year \n", + "0 11 \n", + "1 23 \n", + "2 3 \n", + "3 14 \n", + "4 12 \n", + "5 4 \n", + "6 24 \n", + "7 20 \n", + "8 21 \n", + "9 10 \n", + "\n", + "[10 rows x 25 columns]" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X = X.drop('pickup_datetime',axis=1)\n", + "# X = X.drop('pickup_month',axis=1)\n", + "# X = X.drop('pickup_hour',axis=1)\n", + "# X = X.drop('pickup_day_of_the_week',axis=1)\n", + "X = X.drop('dropoff_datetime', axis=1)\n", + "X[:10]" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "JsXogqJlWQUW", + "outputId": "1026fa0e-3383-49ed-d082-1b66b5716558", + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "List of features : ['passenger_count' 'pickup_longitude' 'pickup_latitude'\n", + " 'dropoff_longitude' 'dropoff_latitude' 'vism' 'fog' 'rain' 'snow'\n", + " 'holiday_or_not' 'turns' 'vendor_id_1' 'vendor_id_2' 'flag_N' 'flag_Y'\n", + " 'lat_diff' 'long_diff' 'euclidean_dist' 'haversine_dist' 'manhattan_dist'\n", + " 'pickup_day_of_the_week' 'pickup_hour' 'pickup_month'\n", + " 'pickup_day_of_year' 'pickup_week_of_year']\n" + ] + } + ], + "source": [ + "feature_list = X.columns.values\n", + "print(\"List of features : {}\".format(feature_list))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "bQMrzdyGhPu4" + }, + "source": [ + "# Training" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "X3cvffRoUYJE" + }, + "source": [ + "**SGD Regressor**" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": { + "id": "eEEy6Yqj7g6v" + }, + "outputs": [], + "source": [ + "# from sklearn.preprocessing import StandardScaler\n", + "# s = StandardScaler()\n", + "X_temp = X\n", + "X_temp = X_temp.drop('flag_Y', axis=1)\n", + "X_temp = X_temp.drop('flag_N', axis=1)\n", + "X_temp = X_temp.drop('pickup_month', axis=1)\n", + "X_temp = X_temp.drop('pickup_week_of_year', axis=1)\n", + "\n", + "# X_temp = s.fit_transform(X_temp)" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.preprocessing import StandardScaler\n", + "s = StandardScaler()\n", + "#X_temp = X\n", + "X_temp = s.fit_transform(X_temp)" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": { + "id": "LRtGHpn_7g6x" + }, + "outputs": [], + "source": [ + "X_train, X_test, y_train, y_test = train_test_split(X_temp, y, test_size = 0.2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Analysing Performance of SGDRegressor with different initial learning_rates given by 'invscaling' with parameters eta0 = 0.001,0.01,0.1,0.5,0.8,1.0,1.5,2.0 and constant of regularization = 0.0001**" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": { + "id": "cKgvCqtVa1KB" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loop 1\n", + "Loop 2\n", + "Loop 3\n", + "Loop 4\n", + "Loop 5\n", + "Loop 6\n", + "Loop 7\n", + "Loop 8\n", + "Done\n", + "[0.5018087889966956, 3.6664808497880257, 0.5295705430059086, 4.711339897366976, 5.694038052853398, 13.499750147610504, 16.216268050256677, 16.371195752967424]\n" + ] + } + ], + "source": [ + "from sklearn.linear_model import SGDRegressor\n", + "\n", + "from sklearn.metrics import mean_squared_log_error\n", + "losses = []\n", + "loop = 0\n", + "eta0 = [0.001,0.01,0.1,0.5,0.8,1.0,1.5,2.0]\n", + "for i in eta0 :\n", + " loop = loop + 1\n", + " print(\"Loop \",loop)\n", + " model = SGDRegressor(max_iter = 5000,eta0=i,random_state = 42)\n", + " model.fit(X_train,y_train)\n", + " y_pred = model.predict(X_test)\n", + " y_temp_pred = y_pred.flatten()\n", + " losses.append(np.sqrt(mean_squared_log_error(y_test,abs(y_temp_pred))))\n", + "print(\"Done\")\n", + "print(losses)" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [], + "source": [ + "i = losses.index(min(losses))\n", + "min_eta = eta0[i]" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "PVHcFd-NWQUY", + "outputId": "e6a47f95-241e-4a81-a13c-ab8f97009de0", + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/png": "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zKIAABBT9m3efKSxvzE3V+vnztUB79fEE5KT1bZvX6X99KdHGvute/VSQhKbQgBA/OBbD0CddWjXLm3wGvlljf09a9dKkiwhQa169VL3Sy9Ve6+x37ZvXyXVq+dzagAA/EUBAKBOKNy/X5u+/vqoxv6OZcuODG/etas6nX32kcZ+u/79ldKokY+JAQConSgAANQ6JYWF2rxw4ZG9+xvmztXWggK50lJJUuMOHdRh0CCdesstgQb/wIFckQcAgBBRAADwVWlJibYtWXLUSbqbFyxQSWGhJKl+y5bqMGiQel55ZaCxn56uxu3a+ZwaAIC6iwIAQNQ457Tzu++OviLPvHkq2r9fkpTSuLHaDxyo03/5S7VPT1f7QYPUrHNnLr8JAEANogAAEDF71q8/qrG/ITdXh3bulCQl1qundv37q//IkUca+6169ODymwAARBgFAIAacWD79h9cfnPfxo2SJEtMVNtTTlHvESOONPbbpKUpMTnZ59QAAMQfCgAAYTu8d6825uUd1djftXJlYKCZWvXooS5Dhx5p7J9w6qlKrl/f39AAAEASBQCAahQfOqRN8+drQ27ukT3825YskZyTJDXr3Fnt09OVPnbskSvy1GvSxOfUAACgMhQAAI4oKSrS1oKCoy6/ueWbb1RaXCxJati2rToMGqS0zMwjV+Rp2Lq1z6kBAEA4KACAOOVKS7V92bKjTtLd9PXXKj50SJKU2qyZ2qen66z77lP7QYPUYdAgNe7QgSvyAABQx1EAAHHAOafda9YcffnNvDwd3rNHkpTcoIHaDRig9DvuONLYb961K419AABiEAUAEIP2bd78g8tvHti6VZKUkJysE/r10yk33HCksd+qVy8lJCb6nBoAAEQDBQBQxx3ateuoPvsbcnO1Z+1aSZIlJKh1797qftllRxr7bU45RUn16vmcGgAA+IUCAKhDig8f/sG19ncsW3ZkeItu3dRp8OAjjf0T+vdXSsOGPiYGAAC1DQUAUEes/Ne/9N6oUdr53XeSpCYdO6r9oEE69dZb1WHQILUbOFD1mzf3OSUAAKjtKACAWu7w3r368P77lZeVpRbduunaqVPVafBgNTrhBL+jAQCAOogCAKjFVsycqfdGj9butWt1xt136/zf/U7JDRr4HQsAANRhFABALXRo1y59cM89mj9pklr17KmR//63TjzzTL9jAQCA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\n", + "text/plain": [ + "<Figure size 720x360 with 1 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig = plt.figure(figsize = (10, 5))\n", + "ax = fig.add_axes([0,0,1,1])\n", + "ax.plot(eta0,losses,color ='maroon') \n", + "ax.set_ylabel(\"Loss(RMSLE)\") \n", + "ax.set_xlabel(\"Value of learning rate\") \n", + "ax.set_title(\"Performance of gradient descent with different values of learning rate\") \n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Analyzing the performance of SGDRegressor with different values of regularization constant and initial learning rate = 'invscaling' with default values (eta0 = 0.01,power_t = 0.25)**" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loop 1\n", + "Loop 2\n", + "Loop 3\n", + "Loop 4\n", + "Loop 5\n", + "Loop 6\n", + "Loop 7\n", + "Loop 8\n", + "Loop 9\n", + "Loop 10\n", + "Loop 11\n", + "Done\n", + "[3.6888212534807114, 3.686525112072632, 3.6664808497880257, 3.505660412205236, 2.9378016245296945, 0.9694406239700845, 0.536173854912625, 0.519936439881697, 0.5219244640520138, 0.538681300065003, 0.5530030358591688]\n" + ] + } + ], + "source": [ + "from sklearn.linear_model import SGDRegressor\n", + "\n", + "from sklearn.metrics import mean_squared_error\n", + "losses_1 = []\n", + "loop = 0\n", + "alpha = [1e-9,1e-5,0.0001,0.001,0.01,0.1,0.5,0.8,1.0,1.5,2.0]\n", + "for i in alpha :\n", + " loop = loop + 1\n", + " print(\"Loop \",loop)\n", + " model = SGDRegressor(max_iter = 5000,alpha = i,random_state = 42)\n", + " model.fit(X_train,y_train)\n", + " y_pred = model.predict(X_test)\n", + " y_temp_pred = y_pred.flatten()\n", + " losses_1.append(np.sqrt(mean_squared_log_error(y_test,abs(y_temp_pred))))\n", + "print(\"Done\")\n", + "print(losses_1)" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [], + "source": [ + "i = losses_1.index(min(losses_1))\n", + "min_alpha = alpha[i]" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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frm2P/64Jk2ZosVnn60l3d3KnXWWWqZMyTpMAACAmkMygJoSAwN69Be/UF9vr+674grtfPpptU6bpqPOOUdLurq06LWv1aS2tqzDBAAAqAkkA6hZA/39Wvezn2llT4/uv/JK7dq8WZNnzNDRb36zlnZ36/DTT1fTpElZhwkAAFC1SAZQF/bt2aOHfvIT9fX2atUPfqA927frgJkzdcz552tpV5fmv+Y1ampuzjpMAACAqkIygLrT//zzWvOjH2llT49W//CH2vvcc5o2Z46OveACLe3u1tyTT5btrMMEAADIHMkA6tqenTu1+tpr1dfbqwevu077du/WgfPnJ0897urSnBNOIDEAAAANi2QADWP3tm26/+qr1dfTo7U33KCB/n51HHmklnR1aWl3tw5eujTrEAEAACYUyQAa0q7Nm7XqyivV19urh2+6STEwoFnHHqsl3d1a2tWlzsWLsw4RAACg4kgG0PB2PPWUVn3/+1rZ06NHb71VitDsV7wiqTHo6tKMhQuzDhEAAKAiSAaAPNvWr1ffFVeor7dXj99+uyTpsJNO0tLubh17wQWafthhGUcIAABQPiQDwDCeffhh9V1+ufp6evTkXXdJtha85jVa0tWlY88/X1MPPjjrEAEAAMaFZAAowjMPPKC+3l6t7OnRM6tWyU1NOvz007Wku1vHvPnNmtLRkXWIAAAAJSMZAEoQEXp65coXEoNn165VU0uLFr32tVrS1aWjzzlHbdOnZx0mAABAUUgGgDGKCG244w6t7OnRfZdfrq2PPqrmtjblzjpLS7u7lTv7bLVOnZp1mAAAAMMiGQDKIAYGtP6227Syt1f3XX65djz5pFoOOEBHvelNWtLVpSPPPFOTJk/OOkwAAID9kAwAZTawb58e/fnPtbKnR6u+/30998wzaps+XUefe66WdHfriDPOUHNLS9ZhAgAAkAwAlbRv7149fNNN6uvt1aorr9TurVs1paNDx5x3npZ0dWnh8uVqam7OOkwAANCgSAaACdK/e7fW3nCD+np79cDVV2vPjh2aesghOvb887W0u1vzXv1quakp6zABAEADIRkAMrB31y49eN116uvp0eprr1X/889r+ty5OvbCC7W0q0uHvvKVsp11mAAAoM6RDAAZ2719u1b/8Ifq6+3Vg9dfr4G9ezXj8MO1pKtLS7u7dchxx5EYAACAiiAZAKrI81u26P6rrtLKnh499JOfKPbtU+dRR2lpd7eWdHVp1jHHZB0iAACoIyQDQJXauXGjVl15pfp6e7Xu5pulCB1y3HFa0tWlJV1d6li0KOsQAQBAjSMZAGrA9g0bdN/3vqe+nh499stfSpIOXbZMS7q7teTCC3XgvHkZRwgAAGoRyQBQY7Y++qj6Lr9cfb29eiI93uedckpSY3DBBZo2e3bGEQIAGkFESBGKgQEN7NunGBhIXnnDw02fqHUGhqxf8jolvr/GsP6Zn/98ps2ASQaAGrZ5zRqt7O1VX2+vnr73XrmpSQtOO01Lu7t1zFveogNmzsw6RAAo2X4XTvv2vXgBNdpwOl5oOH/ZLC4SS1mnVi6MY2Ag60Ol4tzUlLyam18YbsobLmb6aOucffHFOuRlL8tuH0kGgPqw8b77ksSgp0ebVq+WJDW1tKhp0iQ1p3+bJk16Ydp+0wtNy5s+3PqV3n6x69PbEioh0l88y3UBWpFtjLBeqduophjrTf5FYSkXiaNOr+A6ZX3PrPd5rO/fIP9bMksGbJ8p6XOSmiV9NSL+ccj85ZKulvRwOunKiPj0SNskGQCSC5in7r5bD153nfbs2KGB/n7t27tXA/39yWtwOG9aofkF18mfXmBaVv/E3dxc0WRjvMlM/mejiBf+jmfaC+fnck4bZ0wjxZn/y+JwF4XVdqE9uE81y37xAqe5+cULndGG0/FCw2NdryzbL3eME3RhKbthLipRm0ZKBiYVmlimN22W9O+S/kDSekm/sX1NRNw3ZNGfR8QbKhUHUI9sa/bxx2v28cdP+HtHRMkJxHgTkFHXH2WdPTt3lv6ee/dOeNnWnMELoLy/lbi4a2pulltbS9rGhF+ATsCFdsH95AIUwDhVLBmQdKKkNRHxkCTZ7pF0jqShyQCAGmJbzS0tam5pkaZMyTqcihrYt6/oBELSixdmQy+SxzMtnV7OaWWJEwBQFyqZDBwm6bG88fWSTiqw3Kts3y3pCUkfjoi+oQvYvkjSRZI0f/78CoQKAC81+Ku02tqyDgUAgIpoquC2C/18NLRx5h2SFkTEyyV9QdJVhTYUEZdExLKIWDZr1qwyhwkAAAA0pkomA+sl5T8laa6SX/9fEBHbImJHOnydpBbb9JMIAAAATIBKJgO/kZSzfbjtVkndkq7JX8D2bKcNUG2fmMazqYIxAQAAAEhV7J6BiOi3/eeSfqyka9FLI6LP9nvT+RdLOl/S+2z3S9olqTtq7cEHAAAAQI3ioWMAAABAHRvpOQOVbCYEAAAAoIqRDAAAAAANimQAAAAAaFAkAwAAAECDIhkAAAAAGhTJAAAAANCgSAYAAACABkUyAAAAADQokgEAAACgQdXcE4htb5T0SMZhzJT0TMYx1APKsTwox/GjDMuDciwPyrE8KMfyoBzHrxrKcEFEzCo0o+aSgWpge8Vwj3RG8SjH8qAcx48yLA/KsTwox/KgHMuDchy/ai9DmgkBAAAADYpkAAAAAGhQJANjc0nWAdQJyrE8KMfxowzLg3IsD8qxPCjH8qAcx6+qy5B7BgAAAIAGRc0AAAAA0KBIBvLYPtP2A7bX2P7rAvNt+/Pp/Htsn1Dsuo2kiHL847T87rH9S9svz5u3zva9tu+yvWJiI68uRZTjcttb07K6y/bHi123kRRRjn+ZV4Yrbe+z3ZHO43iUZPtS20/bXjnMfM6NRSiiHDk3FqGIcuTcWIQiypFz4yhsz7P9U9urbPfZ/kCBZar//BgRvJKmUs2S1ko6QlKrpLslHTtkmbMkXS/Jkk6WdHux6zbKq8hyfLWkg9Lh1w+WYzq+TtLMrPcj61eR5bhc0rVjWbdRXqWWhaQ3Sropb5zjMSmH35V0gqSVw8zn3FiecuTcWJ5y5NxYhnIcsiznxsLlMkfSCelwu6TVtXjtSM3Ai06UtCYiHoqIPZJ6JJ0zZJlzJF0WidskzbA9p8h1G8WoZRERv4yIZ9PR2yTNneAYa8F4jimOxxeVWhZ/KOm7ExJZDYmIWyRtHmERzo1FGK0cOTcWp4jjcTgcj3lKLEfOjQVExIaIuCMd3i5plaTDhixW9edHkoEXHSbpsbzx9XrpBzrcMsWs2yhKLYt3KcmYB4WkG2z/1vZFFYivVhRbjq+yfbft620vKXHdRlB0Wdg+QNKZkr6fN5njsTicG8uPc+P4cG4sE86NxbG9UNIrJN0+ZFbVnx8nZfGmVcoFpg3tamm4ZYpZt1EUXRa2f0/JP7xT8yafEhFP2D5Y0o22709/vWg0xZTjHUoeL77D9lmSrpKUK3LdRlFKWbxR0i8iIv+XMo7H4nBuLCPOjePGubG8ODeOwvY0JcnSByNi29DZBVapqvMjNQMvWi9pXt74XElPFLlMMes2iqLKwvZxkr4q6ZyI2DQ4PSKeSP8+LekHSqrRGtGo5RgR2yJiRzp8naQW2zOLWbeBlFIW3RpSDc7xWDTOjWXCuXH8ODeWHefGEdhuUZIIfDsiriywSNWfH0kGXvQbSTnbh9tuVXLwXzNkmWskvS29M/xkSVsjYkOR6zaKUcvC9nxJV0p6a0Sszps+1Xb74LCk10oq2MtBAyimHGfbdjp8opLv86Zi1m0gRZWF7QMlnSbp6rxpHI/F49xYBpwby4NzY/lwbhxZepx9TdKqiPjsMItV/fmRZkKpiOi3/eeSfqzkDu9LI6LP9nvT+RdLuk7JXeFrJD0n6Z0jrZvBbmSuyHL8uKROSV9Kz9f9EbFM0iGSfpBOmyTpOxHxowx2I3NFluP5kt5nu1/SLkndkXRRwPGYKrIcJenNkm6IiJ15q3M8pmx/V0kPLTNtr5f0CUktEufGUhRRjpwbi1BEOXJuLEIR5ShxbhzNKZLeKule23el0z4mab5UO+dHnkAMAAAANCiaCQEAAAANimQAAAAAaFAkAwAAAECDIhkAAAAAGhTJAAAAANCgSAYAYALZvtn264ZM+6DtL42yzrIKx/Vd2/fY/v+GTP+k7Q+nw/9i+/50uR/YnlHJmArE+A7bXyxxnWW2P1+pmACg1pEMAMDE+q6Sh8vke8kTPieS7dmSXh0Rx0XE/x1h0RslLY2I4yStlvTRUbbbXMYwS2Z7UkSsiIj3j3M7me4HAFQSyQAATKzvSXqD7TZJsr1Q0qGSbrX9ZdsrbPfZ/lShlW3vyBs+3/Y30uFZtr9v+zfp65QC6062/XXb99q+0/bvpbNukHSw7btsv2a4wCPihojoT0dvkzS3wHsst/1T299R8iCe5rRG4TdpjcKfpss12f5Suq/X2r7O9vnpvHW2Z6bDy2zfXOB93mj79nQ/fmL7kHT6J21fYvsGSZel8Vybzrsu3ce7bG+1/fYR4ttvP4YrEwCodTyBGAAmUERssv1rSWdKulpJrUBvRITtv4mIzekv0f9t+7iIuKfITX9O0v+NiFttz1fyVMtjhizzZ2kML7N9tKQbbC+W9CZJ10bE8SXsyp9I6h1m3olKahAetn2RpK0R8co0AfpFeqH+O5IWSnqZpIMlrZJ0aQnvf6ukk9Nye7ekj0j6UDrvdySdGhG7bC8fXCEizpIk278j6euSrpL0rmHi228/SogLAGoKyQAATLzBpkKDycCfpNMvTC+eJ0maI+lYScUmA2dIOtb24Ph02+0RsT1vmVMlfUGSIuJ+249IWixpWynB2/4bSf2Svj3MIr/Ou4B+raTjBn/1l3SgpFwayxURMSDpSds/LSUGJbUSvbbnSGqVlH/Bfk1E7Bom9pmS/lPShRGx1fZw8e0Zsh8AUJdIBgBg4l0l6bO2T5A0JSLusH24pA9LemVEPJs2/5lcYN3IG86f3yTpVcNdBKc8wryi2H67pDdI+v2IiGEW2znkPf9XRPx4yHbOHuFt+vViM9ZCZSAlSc1nI+Ka9Nf/Tw7z/vnv2SypR9KnI2LlKPEtH247AFBPuGcAACZYROyQdLOSZjGDNw5PV3LxuTVt//76YVZ/yvYxtpskvTlv+g2S/nxwxHahJj+3SPrjdP5iSfMlPVBs3LbPlPRXkt4UEc8VudqPJb3Pdsvg+9qeqqSZz3npvQOHSFqet846JU19JOm8YbZ7oKTH0+G3FxnLP0q6JyJ6iogPABoCyQAAZOO7kl6u5JdqRcTdku6U1KckSfjFMOv9taRrJd0kaUPe9PdLWpbeBHufpPcWWPdLkppt36ukvf87ImJ3CTF/UVK7pBvTm3AvLmKdr0q6T9IdtldK+oqSWunvS1ovaXDa7ZK2put8StLnbP9c0r5htvtJSf+vvTvEIgAKogD6pkia5eii1diB5ahWYSWCqI9AUDgKwtybf3j1/Tlz5vB4c/kw/y7J5mmJePsmH8AI9XrKCwDfU1XL7r5W1SrJKcm6u8//zgUwid8PAP7lWPfDZYske0UA4PdMBgAAYCg7AwAAMJQyAAAAQykDAAAwlDIAAABDKQMAADCUMgAAAEPdANiPwEmKSH6cAAAAAElFTkSuQmCC\n", + "text/plain": [ + "<Figure size 720x360 with 1 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig = plt.figure(figsize = (10, 5))\n", + "ax = fig.add_axes([0,0,1,1])\n", + "ax.plot(alpha,losses_1,color ='maroon') \n", + "ax.set_ylabel(\"Loss(RMSLE)\") \n", + "ax.set_xlabel(\"Value of l2 regularizer\") \n", + "ax.set_title(\"Performance of gradient descent with different values of l2 regularizer\") \n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Fixing the parameters : regularization constant = 0.0001 , and value for initial learning rate ('invscaling',eta0 = 0.001,power_t = 0.25)**" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.linear_model import SGDRegressor\n", + "from sklearn.metrics import mean_squared_error,mean_squared_log_error\n", + "model = SGDRegressor(max_iter = 5000,alpha = min_alpha,eta0=min_eta,random_state = 42)\n", + "model.fit(X_train,y_train)\n", + "y_pred = model.predict(X_test)\n", + "y_temp_pred = y_pred.flatten()" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.546414874705318\n" + ] + } + ], + "source": [ + "from sklearn.metrics import mean_squared_error,mean_squared_log_error\n", + "print(np.sqrt(mean_squared_log_error(y_test,abs(y_temp_pred))))" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.001 0.8\n" + ] + } + ], + "source": [ + "print(min_eta,min_alpha)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "reocx_zPmchc" + }, + "source": [ + "# Feature Extraction on test data" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": { + "id": "gyqmdO6IUln3" + }, + "outputs": [], + "source": [ + "# !unzip 'extended_test.csv.zip'\n", + "df_test = pd.read_csv('extended_test.csv')" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 338 + }, + "id": "wulg-B6jC-pQ", + "outputId": "14bbaea8-d09f-4e3b-8e82-b3b004536c3e" + }, + "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>Unnamed: 0</th>\n", + " <th>Unnamed: 0.1</th>\n", + " <th>vendor_id</th>\n", + " <th>passenger_count</th>\n", + " <th>pickup_longitude</th>\n", + " <th>pickup_latitude</th>\n", + " <th>dropoff_longitude</th>\n", + " <th>dropoff_latitude</th>\n", + " <th>holiday_or_not</th>\n", + " <th>number_of_steps</th>\n", + " <th>visi</th>\n", + " <th>vism</th>\n", + " <th>fog</th>\n", + " <th>rain</th>\n", + " <th>snow</th>\n", + " <th>hail</th>\n", + " <th>thunder</th>\n", + " <th>tornado</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>count</th>\n", + " <td>625134.000000</td>\n", + " <td>625134.000000</td>\n", + " <td>625134.000000</td>\n", + " <td>625134.000000</td>\n", + " <td>625134.000000</td>\n", + " <td>625134.000000</td>\n", + " <td>625134.000000</td>\n", + " <td>625134.000000</td>\n", + " <td>625134.000000</td>\n", + " <td>625134.000000</td>\n", + " <td>602975.000000</td>\n", + " <td>602975.000000</td>\n", + " <td>625134.000000</td>\n", + " <td>625134.000000</td>\n", + " <td>625134.000000</td>\n", + " <td>625134.0</td>\n", + " <td>625134.0</td>\n", + " <td>625134.0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>mean</th>\n", + " <td>312566.500000</td>\n", + " <td>312566.500000</td>\n", + " <td>1.534884</td>\n", + " <td>1.661765</td>\n", + " <td>-73.973614</td>\n", + " <td>40.750927</td>\n", + " <td>-73.973458</td>\n", + " <td>40.751816</td>\n", + " <td>0.018710</td>\n", + " <td>7.545392</td>\n", + " <td>9.081615</td>\n", + " <td>14.622785</td>\n", + " <td>0.006514</td>\n", + " <td>0.094818</td>\n", + " <td>0.024284</td>\n", + " <td>0.0</td>\n", + " <td>0.0</td>\n", + " <td>0.0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>std</th>\n", + " <td>180460.785927</td>\n", + " <td>180460.785927</td>\n", + " <td>0.498782</td>\n", + " <td>1.311293</td>\n", + " <td>0.073389</td>\n", + " <td>0.029848</td>\n", + " <td>0.072565</td>\n", + " <td>0.035824</td>\n", + " <td>0.135497</td>\n", + " <td>4.435818</td>\n", + " <td>1.931477</td>\n", + " <td>3.113787</td>\n", + " <td>0.111340</td>\n", + " <td>0.514837</td>\n", + " <td>0.280462</td>\n", + " <td>0.0</td>\n", + " <td>0.0</td>\n", + " <td>0.0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>min</th>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>1.000000</td>\n", + " <td>0.000000</td>\n", + " <td>-121.933128</td>\n", + " <td>37.389587</td>\n", + " <td>-121.933327</td>\n", + " <td>36.601322</td>\n", + " <td>0.000000</td>\n", + " <td>2.000000</td>\n", + " <td>0.200000</td>\n", + " <td>0.400000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.0</td>\n", + " <td>0.0</td>\n", + " <td>0.0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>25%</th>\n", + " <td>156283.250000</td>\n", + " <td>156283.250000</td>\n", + " <td>1.000000</td>\n", + " <td>1.000000</td>\n", + " <td>-73.991852</td>\n", + " <td>40.737392</td>\n", + " <td>-73.991318</td>\n", + " <td>40.736000</td>\n", + " <td>0.000000</td>\n", + " <td>5.000000</td>\n", + " <td>9.000000</td>\n", + " <td>14.500000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.0</td>\n", + " <td>0.0</td>\n", + " <td>0.0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>50%</th>\n", + " <td>312566.500000</td>\n", + " <td>312566.500000</td>\n", + " <td>2.000000</td>\n", + " <td>1.000000</td>\n", + " <td>-73.981743</td>\n", + " <td>40.754093</td>\n", + " <td>-73.979774</td>\n", + " <td>40.754543</td>\n", + " <td>0.000000</td>\n", + " <td>6.000000</td>\n", + " <td>10.000000</td>\n", + " <td>16.100000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.0</td>\n", + " <td>0.0</td>\n", + " <td>0.0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>75%</th>\n", + " <td>468849.750000</td>\n", + " <td>468849.750000</td>\n", + " <td>2.000000</td>\n", + " <td>2.000000</td>\n", + " <td>-73.967400</td>\n", + " <td>40.768394</td>\n", + " <td>-73.963013</td>\n", + " <td>40.769852</td>\n", + " <td>0.000000</td>\n", + " <td>9.000000</td>\n", + " <td>10.000000</td>\n", + " <td>16.100000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.0</td>\n", + " <td>0.0</td>\n", + " <td>0.0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>max</th>\n", + " <td>625133.000000</td>\n", + " <td>625133.000000</td>\n", + " <td>2.000000</td>\n", + " <td>9.000000</td>\n", + " <td>-69.248917</td>\n", + " <td>42.814938</td>\n", + " <td>-67.496796</td>\n", + " <td>48.857597</td>\n", + " <td>1.000000</td>\n", + " <td>50.000000</td>\n", + " <td>10.000000</td>\n", + " <td>16.100000</td>\n", + " <td>4.000000</td>\n", + " <td>7.000000</td>\n", + " <td>6.000000</td>\n", + " <td>0.0</td>\n", + " <td>0.0</td>\n", + " <td>0.0</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " Unnamed: 0 Unnamed: 0.1 vendor_id passenger_count \\\n", + "count 625134.000000 625134.000000 625134.000000 625134.000000 \n", + "mean 312566.500000 312566.500000 1.534884 1.661765 \n", + "std 180460.785927 180460.785927 0.498782 1.311293 \n", + "min 0.000000 0.000000 1.000000 0.000000 \n", + "25% 156283.250000 156283.250000 1.000000 1.000000 \n", + "50% 312566.500000 312566.500000 2.000000 1.000000 \n", + "75% 468849.750000 468849.750000 2.000000 2.000000 \n", + "max 625133.000000 625133.000000 2.000000 9.000000 \n", + "\n", + " pickup_longitude pickup_latitude dropoff_longitude dropoff_latitude \\\n", + "count 625134.000000 625134.000000 625134.000000 625134.000000 \n", + "mean -73.973614 40.750927 -73.973458 40.751816 \n", + "std 0.073389 0.029848 0.072565 0.035824 \n", + "min -121.933128 37.389587 -121.933327 36.601322 \n", + "25% -73.991852 40.737392 -73.991318 40.736000 \n", + "50% -73.981743 40.754093 -73.979774 40.754543 \n", + "75% -73.967400 40.768394 -73.963013 40.769852 \n", + "max -69.248917 42.814938 -67.496796 48.857597 \n", + "\n", + " holiday_or_not number_of_steps visi vism \\\n", + "count 625134.000000 625134.000000 602975.000000 602975.000000 \n", + "mean 0.018710 7.545392 9.081615 14.622785 \n", + "std 0.135497 4.435818 1.931477 3.113787 \n", + "min 0.000000 2.000000 0.200000 0.400000 \n", + "25% 0.000000 5.000000 9.000000 14.500000 \n", + "50% 0.000000 6.000000 10.000000 16.100000 \n", + "75% 0.000000 9.000000 10.000000 16.100000 \n", + "max 1.000000 50.000000 10.000000 16.100000 \n", + "\n", + " fog rain snow hail thunder \\\n", + "count 625134.000000 625134.000000 625134.000000 625134.0 625134.0 \n", + "mean 0.006514 0.094818 0.024284 0.0 0.0 \n", + "std 0.111340 0.514837 0.280462 0.0 0.0 \n", + "min 0.000000 0.000000 0.000000 0.0 0.0 \n", + "25% 0.000000 0.000000 0.000000 0.0 0.0 \n", + "50% 0.000000 0.000000 0.000000 0.0 0.0 \n", + "75% 0.000000 0.000000 0.000000 0.0 0.0 \n", + "max 4.000000 7.000000 6.000000 0.0 0.0 \n", + "\n", + " tornado \n", + "count 625134.0 \n", + "mean 0.0 \n", + "std 0.0 \n", + "min 0.0 \n", + "25% 0.0 \n", + "50% 0.0 \n", + "75% 0.0 \n", + "max 0.0 " + ] + }, + "execution_count": 51, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_test.describe()" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "xvUraj46DGNs", + "outputId": "1ad44957-b6f2-44dd-def9-b8d9925728bb" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "id 0\n", + "vendor_id 0\n", + "pickup_datetime 0\n", + "passenger_count 0\n", + "pickup_longitude 0\n", + "pickup_latitude 0\n", + "dropoff_longitude 0\n", + "dropoff_latitude 0\n", + "store_and_fwd_flag 0\n", + "pickup_datetime_temp 0\n", + "holiday_or_not 0\n", + "number_of_steps 0\n", + "vism 22159\n", + "fog 0\n", + "rain 0\n", + "snow 0\n", + "dtype: int64\n" + ] + } + ], + "source": [ + "df_test = df_test.drop('Unnamed: 0', axis=1)\n", + "df_test = df_test.drop('Unnamed: 0.1', axis=1)\n", + "df_test = df_test.drop('hail', axis=1)\n", + "df_test = df_test.drop('thunder', axis=1)\n", + "df_test = df_test.drop('tornado', axis=1)\n", + "df_test = df_test.drop('visi', axis=1)\n", + "# df = df.fillna(16.1)\n", + "missing_val_count_by_column = (df_test.isnull().sum())\n", + "print(missing_val_count_by_column)" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "7_LUhtnwMMNB", + "outputId": "e86aac1f-a688-4157-bf48-6cbd75692b47" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "id 0\n", + "vendor_id 0\n", + "pickup_datetime 0\n", + "passenger_count 0\n", + "pickup_longitude 0\n", + "pickup_latitude 0\n", + "dropoff_longitude 0\n", + "dropoff_latitude 0\n", + "store_and_fwd_flag 0\n", + "pickup_datetime_temp 0\n", + "holiday_or_not 0\n", + "number_of_steps 0\n", + "vism 0\n", + "fog 0\n", + "rain 0\n", + "snow 0\n", + "dtype: int64\n" + ] + } + ], + "source": [ + "values = {'vism': 16.1}\n", + "df_test = df_test.fillna(value=values)\n", + "missing_val_count_by_column = (df_test.isnull().sum())\n", + "print(missing_val_count_by_column)" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 320 + }, + "id": "kt-tZKzLMdFe", + "outputId": "2bfe76c7-7333-421d-e05a-d4d0ea475131" + }, + "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>vendor_id</th>\n", + " <th>passenger_count</th>\n", + " <th>pickup_longitude</th>\n", + " <th>pickup_latitude</th>\n", + " <th>dropoff_longitude</th>\n", + " <th>dropoff_latitude</th>\n", + " <th>holiday_or_not</th>\n", + " <th>vism</th>\n", + " <th>fog</th>\n", + " <th>rain</th>\n", + " <th>snow</th>\n", + " <th>turns</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>count</th>\n", + " <td>625134.000000</td>\n", + " <td>625134.000000</td>\n", + " <td>625134.000000</td>\n", + " <td>625134.000000</td>\n", + " <td>625134.000000</td>\n", + " <td>625134.000000</td>\n", + " <td>625134.000000</td>\n", + " <td>625134.000000</td>\n", + " <td>625134.000000</td>\n", + " <td>625134.000000</td>\n", + " <td>625134.000000</td>\n", + " <td>625134.000000</td>\n", + " </tr>\n", + " <tr>\n", + " <th>mean</th>\n", + " <td>1.534884</td>\n", + " <td>1.661765</td>\n", + " <td>-73.973614</td>\n", + " <td>40.750927</td>\n", + " <td>-73.973458</td>\n", + " <td>40.751816</td>\n", + " <td>0.018710</td>\n", + " <td>14.675148</td>\n", + " <td>0.006514</td>\n", + " <td>0.094818</td>\n", + " <td>0.024284</td>\n", + " <td>7.545392</td>\n", + " </tr>\n", + " <tr>\n", + " <th>std</th>\n", + " <td>0.498782</td>\n", + " <td>1.311293</td>\n", + " <td>0.073389</td>\n", + " <td>0.029848</td>\n", + " <td>0.072565</td>\n", + " <td>0.035824</td>\n", + " <td>0.135497</td>\n", + " <td>3.070276</td>\n", + " <td>0.111340</td>\n", + " <td>0.514837</td>\n", + " <td>0.280462</td>\n", + " <td>4.435818</td>\n", + " </tr>\n", + " <tr>\n", + " <th>min</th>\n", + " <td>1.000000</td>\n", + " <td>0.000000</td>\n", + " <td>-121.933128</td>\n", + " <td>37.389587</td>\n", + " <td>-121.933327</td>\n", + " <td>36.601322</td>\n", + " <td>0.000000</td>\n", + " <td>0.400000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>2.000000</td>\n", + " </tr>\n", + " <tr>\n", + " <th>25%</th>\n", + " <td>1.000000</td>\n", + " <td>1.000000</td>\n", + " <td>-73.991852</td>\n", + " <td>40.737392</td>\n", + " <td>-73.991318</td>\n", + " <td>40.736000</td>\n", + " <td>0.000000</td>\n", + " <td>14.500000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>5.000000</td>\n", + " </tr>\n", + " <tr>\n", + " <th>50%</th>\n", + " <td>2.000000</td>\n", + " <td>1.000000</td>\n", + " <td>-73.981743</td>\n", + " <td>40.754093</td>\n", + " <td>-73.979774</td>\n", + " <td>40.754543</td>\n", + " <td>0.000000</td>\n", + " <td>16.100000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>6.000000</td>\n", + " </tr>\n", + " <tr>\n", + " <th>75%</th>\n", + " <td>2.000000</td>\n", + " <td>2.000000</td>\n", + " <td>-73.967400</td>\n", + " <td>40.768394</td>\n", + " <td>-73.963013</td>\n", + " <td>40.769852</td>\n", + " <td>0.000000</td>\n", + " <td>16.100000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>0.000000</td>\n", + " <td>9.000000</td>\n", + " </tr>\n", + " <tr>\n", + " <th>max</th>\n", + " <td>2.000000</td>\n", + " <td>9.000000</td>\n", + " <td>-69.248917</td>\n", + " <td>42.814938</td>\n", + " <td>-67.496796</td>\n", + " <td>48.857597</td>\n", + " <td>1.000000</td>\n", + " <td>16.100000</td>\n", + " <td>4.000000</td>\n", + " <td>7.000000</td>\n", + " <td>6.000000</td>\n", + " <td>50.000000</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " vendor_id passenger_count pickup_longitude pickup_latitude \\\n", + "count 625134.000000 625134.000000 625134.000000 625134.000000 \n", + "mean 1.534884 1.661765 -73.973614 40.750927 \n", + "std 0.498782 1.311293 0.073389 0.029848 \n", + "min 1.000000 0.000000 -121.933128 37.389587 \n", + "25% 1.000000 1.000000 -73.991852 40.737392 \n", + "50% 2.000000 1.000000 -73.981743 40.754093 \n", + "75% 2.000000 2.000000 -73.967400 40.768394 \n", + "max 2.000000 9.000000 -69.248917 42.814938 \n", + "\n", + " dropoff_longitude dropoff_latitude holiday_or_not vism \\\n", + "count 625134.000000 625134.000000 625134.000000 625134.000000 \n", + "mean -73.973458 40.751816 0.018710 14.675148 \n", + "std 0.072565 0.035824 0.135497 3.070276 \n", + "min -121.933327 36.601322 0.000000 0.400000 \n", + "25% -73.991318 40.736000 0.000000 14.500000 \n", + "50% -73.979774 40.754543 0.000000 16.100000 \n", + "75% -73.963013 40.769852 0.000000 16.100000 \n", + "max -67.496796 48.857597 1.000000 16.100000 \n", + "\n", + " fog rain snow turns \n", + "count 625134.000000 625134.000000 625134.000000 625134.000000 \n", + "mean 0.006514 0.094818 0.024284 7.545392 \n", + "std 0.111340 0.514837 0.280462 4.435818 \n", + "min 0.000000 0.000000 0.000000 2.000000 \n", + "25% 0.000000 0.000000 0.000000 5.000000 \n", + "50% 0.000000 0.000000 0.000000 6.000000 \n", + "75% 0.000000 0.000000 0.000000 9.000000 \n", + "max 4.000000 7.000000 6.000000 50.000000 " + ] + }, + "execution_count": 54, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_test['turns'] = df_test['number_of_steps']\n", + "df_test = df_test.drop('number_of_steps', axis = 1)\n", + "df_test.describe()" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Oe62ewNmUzxu", + "outputId": "a40c6250-98f8-4857-d8ce-2dc7077bda8b" + }, + "outputs": [], + "source": [ + "Xt = df_test\n", + "\n", + "Xt = Xt.drop('id', axis = 1)\n", + "\n", + "#encoding vendor_id ={1,2} to vendor_id_1 and vendor_id_2 columns\n", + "encoded_vendor_id=pd.get_dummies(Xt['vendor_id'], prefix='vendor_id')\n", + "# Drop column vendor_id as it is now encoded\n", + "Xt = Xt.drop('vendor_id',axis = 1)\n", + "# Join original with encoded \n", + "Xt = Xt.join(encoded_vendor_id)\n", + "\n", + "#encoding store_and_fwd_flag = {Y,N} to flag_1 and flag_2 columns\n", + "encoded_flag_id=pd.get_dummies(Xt['store_and_fwd_flag'], prefix='flag')\n", + "# Drop column store_and_fwd_flag as it is now encoded\n", + "Xt = Xt.drop('store_and_fwd_flag',axis = 1)\n", + "# Join original with encoded \n", + "Xt = Xt.join(encoded_flag_id)\n", + "\n", + "Xt['lat_diff'] = abs( Xt['pickup_latitude'] - Xt['dropoff_latitude'] )\n", + "Xt['long_diff'] = abs( Xt['pickup_longitude'] - Xt['dropoff_longitude'] )\n", + "\n", + "Xt['euclidean_dist'] = get_euclidean_dist(Xt['pickup_latitude'].to_numpy(), Xt['pickup_longitude'].to_numpy(), Xt['dropoff_latitude'].to_numpy(), Xt['dropoff_longitude'].to_numpy())\n", + "Xt['haversine_dist'] = get_haversine_dist(Xt['pickup_latitude'].to_numpy(), Xt['pickup_longitude'].to_numpy(), Xt['dropoff_latitude'].to_numpy(), Xt['dropoff_longitude'].to_numpy())\n", + "Xt['manhattan_dist'] = get_manhattan_distance(Xt['pickup_latitude'].to_numpy(), Xt['pickup_longitude'].to_numpy(), Xt['dropoff_latitude'].to_numpy(), Xt['dropoff_longitude'].to_numpy())\n", + "\n", + "Xt['pickup_datetime'] = pd.to_datetime(Xt['pickup_datetime'], \n", + "format = '%Y-%m-%d %H:%M:%S', \n", + " errors = 'coerce')\n", + "\n", + "Xt['pickup_day_of_the_week'] = Xt['pickup_datetime'].dt.dayofweek\n", + "Xt['pickup_hour'] = Xt['pickup_datetime'].dt.hour\n", + "Xt['pickup_month'] = Xt['pickup_datetime'].dt.month\n", + "Xt['pickup_day_of_year'] = Xt['pickup_datetime'].dt.dayofyear\n", + "Xt['pickup_week_of_year'] = Xt['pickup_datetime'].dt.weekofyear\n", + "\n", + "Xt = Xt.drop('pickup_datetime',axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "26\n" + ] + } + ], + "source": [ + "print(len(Xt.columns))" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": { + "id": "hGR1Rw0xM2pQ" + }, + "outputs": [], + "source": [ + "Xt_temp = Xt\n", + "Xt_temp = Xt_temp.drop('flag_Y', axis=1)\n", + "Xt_temp = Xt_temp.drop('flag_N', axis=1)\n", + "Xt_temp = Xt_temp.drop('pickup_month', axis=1)\n", + "Xt_temp = Xt_temp.drop('pickup_week_of_year', axis=1)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "22\n" + ] + } + ], + "source": [ + "print(len(Xt_temp.columns))" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": {}, + "outputs": [], + "source": [ + "Xt_temp = Xt_temp.drop('pickup_datetime_temp',axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.preprocessing import StandardScaler\n", + "s = StandardScaler()\n", + "X_scaled = Xt_temp\n", + "X_scaled = s.fit_transform(X_scaled)" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(625134, 21)\n" + ] + } + ], + "source": [ + "print(X_scaled.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 169 + }, + "id": "rO_NDhHkremd", + "outputId": "7c3a1c95-a462-46ea-fcd9-a2a2c65dcd33" + }, + "outputs": [], + "source": [ + "yt = model.predict(X_scaled)" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "e3MjSMbGss-S", + "outputId": "5eda426d-05c4-411f-96bf-248026a1a8b1" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ 710.09110043 919.68555512 671.3967358 ... 1280.76319759 2195.55298278\n", + " 1099.90807674]\n" + ] + } + ], + "source": [ + "ytfinal = abs(yt)\n", + "print(ytfinal)" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": { + "id": "jfpYtSeVs-l5" + }, + "outputs": [], + "source": [ + "df_test['trip_duration'] = ytfinal.astype(int)\n", + "df_test.to_csv('rf_nd_20est.csv', columns=['id', 'trip_duration'], index=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Feature: 0, Score: 3.62800\n", + "Feature: 1, Score: 33.33213\n", + "Feature: 2, Score: -23.67813\n", + "Feature: 3, Score: 66.41244\n", + "Feature: 4, Score: -44.28288\n", + "Feature: 5, Score: 0.80179\n", + "Feature: 6, Score: 4.56215\n", + "Feature: 7, Score: -0.70621\n", + "Feature: 8, Score: -3.91210\n", + "Feature: 9, Score: -12.70778\n", + "Feature: 10, Score: 146.14990\n", + "Feature: 11, Score: 0.49766\n", + "Feature: 12, Score: -0.49766\n", + "Feature: 13, Score: 57.43980\n", + "Feature: 14, Score: 38.61776\n", + "Feature: 15, Score: 53.04868\n", + "Feature: 16, Score: 56.92650\n", + "Feature: 17, Score: 53.81935\n", + "Feature: 18, Score: -14.27262\n", + "Feature: 19, Score: 13.87973\n", + "Feature: 20, Score: 16.18774\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<Figure size 720x360 with 1 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "importance = model.coef_\n", + "for i,v in enumerate(importance):\n", + " print('Feature: %0d, Score: %.5f' % (i,v))\n", + "\n", + "fig = plt.figure(figsize = (10, 5))\n", + "ax = fig.add_axes([0,0,1,1])\n", + "ax.barh(Xt_temp.columns,importance,color ='maroon') \n", + "ax.set_ylabel(\"Features\") \n", + "ax.set_xlabel(\"Importance\") \n", + "ax.set_title(\"Feature Importance\") \n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "FrCAAhDV78uc", + "outputId": "19fb8899-878c-44a3-aa70-bc6781833d43" + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 282 + }, + "id": "6ErJA2PH6lub", + "outputId": "9f0bc0a5-11f3-457b-ace7-abde02cc6ec1" + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": { + "id": "_9P7iZMGxMjK" + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "collapsed_sections": [], + "name": "rf_new_data_20est.ipynb", + "provenance": [] + }, + "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.8.3" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +}