{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":" New york taxi GRU_LSTM monthly_preprocessing .ipynb","provenance":[{"file_id":"15dcbg9FseoYPBRIO1F0dtjnP3P1Puniq","timestamp":1631964684465},{"file_id":"1q4otCUdBI8Y0yRo9Tp59GS-8NJpdBpjN","timestamp":1631960919368},{"file_id":"1sW5Y9qlaJuMCfPHwrWBG9qcBqQXuxi-4","timestamp":1631562729044}],"collapsed_sections":[]},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"}},"cells":[{"cell_type":"code","metadata":{"id":"ANisF3yfliXJ"},"source":["import numpy as np\n","import pandas as pd\n","import matplotlib.pyplot as plt\n","import seaborn as sns\n","from sklearn.model_selection import train_test_split\n","from sklearn.metrics import mean_squared_error,r2_score\n","from sklearn import linear_model\n","\n","import torch\n","import torch.nn as nn\n","from torch.autograd import Variable\n","import folium\n","from folium import FeatureGroup, LayerControl, Map, Marker\n","from folium.plugins import HeatMap\n","from folium.plugins import TimestampedGeoJson\n","from folium.plugins import MarkerCluster"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"ViBRhX2slsYR","executionInfo":{"status":"ok","timestamp":1641730076996,"user_tz":-60,"elapsed":18222,"user":{"displayName":"Faheem Ahmed Abbasi","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GhgtOF28sy7gFBpnhma6GfiWjvqUh1r3ss-fhJtog=s64","userId":"04247060777971177506"}},"outputId":"9e0bc7e6-4a39-44c1-d413-36bfd92b27df"},"source":["from google.colab import drive\n","drive.mount(\"/content/gdrive\")"],"execution_count":4,"outputs":[{"output_type":"stream","name":"stdout","text":["Mounted at /content/gdrive\n"]}]},{"cell_type":"code","metadata":{"id":"1R8YVA4MuWL6","executionInfo":{"status":"ok","timestamp":1641730101346,"user_tz":-60,"elapsed":24033,"user":{"displayName":"Faheem Ahmed Abbasi","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GhgtOF28sy7gFBpnhma6GfiWjvqUh1r3ss-fhJtog=s64","userId":"04247060777971177506"}}},"source":["df_july = pd.read_csv('/content/gdrive/My Drive/Taxi Demand Prediction/Datasets/yellow_tripdata_2016-07.csv')"],"execution_count":5,"outputs":[]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":444},"id":"pw9zxJTBuwTp","executionInfo":{"status":"ok","timestamp":1641730105177,"user_tz":-60,"elapsed":433,"user":{"displayName":"Faheem Ahmed Abbasi","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GhgtOF28sy7gFBpnhma6GfiWjvqUh1r3ss-fhJtog=s64","userId":"04247060777971177506"}},"outputId":"e1722d54-536b-4827-ffae-009269039791"},"source":["df_july.head()"],"execution_count":6,"outputs":[{"output_type":"execute_result","data":{"text/html":["\n","
\n","
\n","
\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
VendorIDtpep_pickup_datetimetpep_dropoff_datetimepassenger_counttrip_distanceRatecodeIDstore_and_fwd_flagPULocationIDDOLocationIDpayment_typefare_amountextramta_taxtip_amounttolls_amountimprovement_surchargetotal_amount
12016-07-10 06:56:052016-07-10 06:59:5310.501N26323614.51.00.52.700.00.39.00NaNNaN
22016-07-10 10:50:182016-07-10 10:55:2151.341N14216316.00.00.51.360.00.38.16NaNNaN
2016-07-10 10:50:182016-07-10 11:08:3819.481N7466127.00.00.50.000.00.327.80NaNNaN
12016-07-10 10:50:192016-07-10 10:55:1411.001N26426425.50.00.50.000.00.36.30NaNNaN
2016-07-10 10:50:192016-07-10 10:55:4710.901N486825.50.00.50.000.00.36.30NaNNaN
\n","
\n"," \n"," \n"," \n","\n"," \n","
\n","
\n"," "],"text/plain":[" VendorID ... total_amount\n","1 2016-07-10 06:56:05 2016-07-10 06:59:53 ... NaN\n","2 2016-07-10 10:50:18 2016-07-10 10:55:21 ... NaN\n"," 2016-07-10 10:50:18 2016-07-10 11:08:38 ... NaN\n","1 2016-07-10 10:50:19 2016-07-10 10:55:14 ... NaN\n"," 2016-07-10 10:50:19 2016-07-10 10:55:47 ... NaN\n","\n","[5 rows x 17 columns]"]},"metadata":{},"execution_count":6}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"SiDk1qvhdmNL","executionInfo":{"status":"ok","timestamp":1641730109263,"user_tz":-60,"elapsed":422,"user":{"displayName":"Faheem Ahmed Abbasi","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GhgtOF28sy7gFBpnhma6GfiWjvqUh1r3ss-fhJtog=s64","userId":"04247060777971177506"}},"outputId":"4a4b84f3-be7c-47c1-8e73-55ce7983716d"},"source":["df_july.shape[0]"],"execution_count":7,"outputs":[{"output_type":"execute_result","data":{"text/plain":["10294080"]},"metadata":{},"execution_count":7}]},{"cell_type":"code","metadata":{"id":"XFEZZxDzmBvc","executionInfo":{"status":"ok","timestamp":1641730113564,"user_tz":-60,"elapsed":421,"user":{"displayName":"Faheem Ahmed Abbasi","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GhgtOF28sy7gFBpnhma6GfiWjvqUh1r3ss-fhJtog=s64","userId":"04247060777971177506"}}},"source":["df_july = df_july.drop(['RatecodeID','payment_type','fare_amount','extra','mta_tax','tip_amount','tolls_amount','improvement_surcharge','total_amount'],1)"],"execution_count":8,"outputs":[]},{"cell_type":"code","metadata":{"id":"dPtcgGGKmZkD","executionInfo":{"status":"ok","timestamp":1641730117893,"user_tz":-60,"elapsed":1371,"user":{"displayName":"Faheem Ahmed Abbasi","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GhgtOF28sy7gFBpnhma6GfiWjvqUh1r3ss-fhJtog=s64","userId":"04247060777971177506"}}},"source":["df_july.dropna(how = 'any', inplace = True)"],"execution_count":9,"outputs":[]},{"cell_type":"code","metadata":{"id":"8tAjCysJmiMv"},"source":["# taxi_carry = np.array(np.where(df_jan['passenger_count']>4))"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"pXfZQENCmoWt","executionInfo":{"status":"ok","timestamp":1641730119835,"user_tz":-60,"elapsed":341,"user":{"displayName":"Faheem Ahmed Abbasi","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GhgtOF28sy7gFBpnhma6GfiWjvqUh1r3ss-fhJtog=s64","userId":"04247060777971177506"}}},"source":["df_july['pickup_datetime'] = pd.to_datetime(df_july['tpep_pickup_datetime'])"],"execution_count":10,"outputs":[]},{"cell_type":"code","metadata":{"id":"djmnkLqTvC1t","executionInfo":{"status":"ok","timestamp":1641730121569,"user_tz":-60,"elapsed":363,"user":{"displayName":"Faheem Ahmed Abbasi","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GhgtOF28sy7gFBpnhma6GfiWjvqUh1r3ss-fhJtog=s64","userId":"04247060777971177506"}}},"source":["df_july['demand'] = df_july['passenger_count']*(df_july['trip_distance']) #demand ratio"],"execution_count":11,"outputs":[]},{"cell_type":"code","metadata":{"id":"aY_12dWLz4-Q","executionInfo":{"status":"ok","timestamp":1641730403763,"user_tz":-60,"elapsed":280220,"user":{"displayName":"Faheem Ahmed Abbasi","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GhgtOF28sy7gFBpnhma6GfiWjvqUh1r3ss-fhJtog=s64","userId":"04247060777971177506"}}},"source":["df_july.to_csv('/content/gdrive/My Drive/Taxi Demand Prediction/Datasets/yellow_tripdata_2016-07_processed.csv')"],"execution_count":12,"outputs":[]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":337},"id":"oeK5ASrbvPzC","executionInfo":{"status":"ok","timestamp":1641730427738,"user_tz":-60,"elapsed":428,"user":{"displayName":"Faheem Ahmed Abbasi","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GhgtOF28sy7gFBpnhma6GfiWjvqUh1r3ss-fhJtog=s64","userId":"04247060777971177506"}},"outputId":"ddc37257-c753-4bb8-ac11-2bbd9eb3e756"},"source":["df_july.head()"],"execution_count":13,"outputs":[{"output_type":"execute_result","data":{"text/html":["\n","
\n","
\n","
\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
VendorIDtpep_pickup_datetimetpep_dropoff_datetimepassenger_counttrip_distancestore_and_fwd_flagPULocationIDDOLocationIDpickup_datetimedemand
12016-07-10 06:56:052016-07-10 06:59:5310.501N23614.51970-01-01 00:00:00.000000001N
22016-07-10 10:50:182016-07-10 10:55:2151.341N16316.01970-01-01 00:00:00.000000005N
2016-07-10 10:50:182016-07-10 11:08:3819.481N66127.01970-01-01 00:00:00.000000001N
12016-07-10 10:50:192016-07-10 10:55:1411.001N26425.51970-01-01 00:00:00.000000001N
2016-07-10 10:50:192016-07-10 10:55:4710.901N6825.51970-01-01 00:00:00.000000001N
\n","
\n"," \n"," \n"," \n","\n"," \n","
\n","
\n"," "],"text/plain":[" VendorID ... demand\n","1 2016-07-10 06:56:05 2016-07-10 06:59:53 ... N\n","2 2016-07-10 10:50:18 2016-07-10 10:55:21 ... N\n"," 2016-07-10 10:50:18 2016-07-10 11:08:38 ... N\n","1 2016-07-10 10:50:19 2016-07-10 10:55:14 ... N\n"," 2016-07-10 10:50:19 2016-07-10 10:55:47 ... N\n","\n","[5 rows x 10 columns]"]},"metadata":{},"execution_count":13}]},{"cell_type":"code","metadata":{"id":"njbijJnem1Fw","executionInfo":{"status":"ok","timestamp":1641730437526,"user_tz":-60,"elapsed":882,"user":{"displayName":"Faheem Ahmed Abbasi","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GhgtOF28sy7gFBpnhma6GfiWjvqUh1r3ss-fhJtog=s64","userId":"04247060777971177506"}}},"source":["X = df_july.drop(['VendorID','passenger_count','trip_distance','store_and_fwd_flag'], axis = 1)\n","\n","y = df_july['demand']"],"execution_count":14,"outputs":[]},{"cell_type":"code","metadata":{"id":"oeY2TOs7nBn0","executionInfo":{"status":"ok","timestamp":1641730441043,"user_tz":-60,"elapsed":404,"user":{"displayName":"Faheem Ahmed Abbasi","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GhgtOF28sy7gFBpnhma6GfiWjvqUh1r3ss-fhJtog=s64","userId":"04247060777971177506"}}},"source":["cont_cols = ['PULocationID',\n"," 'DOLocationID']\n"," \n","conts_data = np.stack([df_july[col].values for col in cont_cols], 1)"],"execution_count":15,"outputs":[]},{"cell_type":"code","metadata":{"id":"Wv-1z8hRnDRB","executionInfo":{"status":"ok","timestamp":1641730443420,"user_tz":-60,"elapsed":2,"user":{"displayName":"Faheem Ahmed Abbasi","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GhgtOF28sy7gFBpnhma6GfiWjvqUh1r3ss-fhJtog=s64","userId":"04247060777971177506"}}},"source":["X = torch.tensor(conts_data, dtype = torch.float)"],"execution_count":16,"outputs":[]},{"cell_type":"code","metadata":{"id":"JcD8AwCBnFLF","colab":{"base_uri":"https://localhost:8080/","height":170},"executionInfo":{"status":"error","timestamp":1641730481914,"user_tz":-60,"elapsed":572,"user":{"displayName":"Faheem Ahmed Abbasi","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GhgtOF28sy7gFBpnhma6GfiWjvqUh1r3ss-fhJtog=s64","userId":"04247060777971177506"}},"outputId":"d3a8e3e9-c24a-4fda-ed9c-bf71762ed9c1"},"source":["y = torch.tensor(df_july['demand'].values, dtype=torch.float).reshape(-1,1)"],"execution_count":18,"outputs":[{"output_type":"error","ename":"TypeError","evalue":"ignored","traceback":["\u001b[0;31m---------------------------------------------------------------------------\u001b[0m","\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)","\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0my\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtensor\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf_july\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'demand'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfloat\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreshape\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m","\u001b[0;31mTypeError\u001b[0m: can't convert np.ndarray of type numpy.object_. The only supported types are: float64, float32, float16, complex64, complex128, int64, int32, int16, int8, uint8, and bool."]}]},{"cell_type":"code","metadata":{"id":"tUdNi7JqnG1V"},"source":["class LSTM1(nn.Module):\n"," \"\"\"LSTM architecture\"\"\"\n","\n"," def __init__(self, input_size, hidden_size, num_layers, seq_length=1):\n"," super(LSTM1, self).__init__()\n"," self.input_size = input_size # input size\n"," self.hidden_size = hidden_size # hidden state\n"," self.num_layers = num_layers # number of layers\n"," self.seq_length = seq_length # sequence length\n","\n"," self.lstm = nn.LSTM(input_size=input_size, hidden_size=hidden_size, num_layers=num_layers, batch_first=True,\n"," dropout=0.1)\n"," self.fc_1 = nn.Linear(hidden_size, 16) # fully connected 1\n"," self.fc_2 = nn.Linear(16, 8) # fully connected 2\n"," self.fc = nn.Linear(8, 1) # fully connected last layer\n","\n"," self.dropout = nn.Dropout(0.1)\n"," self.relu = nn.ReLU()\n","\n"," def forward(self, x):\n"," \"\"\"\n","\n"," :param x: input features\n"," :return: prediction results\n"," \"\"\"\n"," x = x.unsqueeze(0)\n"," h_0 = Variable(torch.zeros(self.num_layers, x.size(0), self.hidden_size)) # hidden state\n"," c_0 = Variable(torch.zeros(self.num_layers, x.size(0), self.hidden_size)) # internal state\n"," output, (hn, cn) = self.lstm(x, (h_0, c_0)) # lstm with input, hidden, and internal state\n","\n"," hn_o = torch.Tensor(hn.detach().numpy()[-1, :, :])\n"," hn_o = hn_o.view(-1, self.hidden_size)\n"," hn_1 = torch.Tensor(hn.detach().numpy()[1, :, :])\n"," hn_1 = hn_1.view(-1, self.hidden_size)\n","\n"," out = self.relu(self.fc_1(self.relu(hn_o + hn_1)))\n"," out = self.relu(self.fc_2(out))\n"," out = self.dropout(out)\n"," out = self.fc(out)\n"," return out\n"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"W_jQ8Stjnw_3"},"source":["class GRUModel(nn.Module):\n"," def __init__(self, input_dim, hidden_dim, layer_dim, output_dim, dropout_prob):\n"," super(GRUModel, self).__init__()\n","\n"," # Defining the number of layers and the nodes in each layer\n"," self.layer_dim = layer_dim\n"," self.hidden_dim = hidden_dim\n","\n"," # GRU layers\n"," self.gru = nn.GRU(\n"," input_dim, hidden_dim, layer_dim, batch_first=True, dropout=dropout_prob\n"," )\n","\n"," # Fully connected layer\n"," self.fc = nn.Linear(hidden_dim, output_dim)\n","\n"," def forward(self, x):\n"," x = x.unsqueeze(0) #this removes the error \"input must have 3 dimensions, got 2\"\n"," # Initializing hidden state for first input with zeros\n"," h0 = torch.zeros(self.layer_dim, x.size(0), self.hidden_dim).requires_grad_()\n","\n"," # Forward propagation by passing in the input and hidden state into the model\n"," out, _ = self.gru(x, h0.detach())\n","\n"," # Reshaping the outputs in the shape of (batch_size, seq_length, hidden_size)\n"," # so that it can fit into the fully connected layer\n"," out = out[:, -1, :]\n","\n"," # Convert the final state to our desired output shape (batch_size, output_dim)\n"," out = self.fc(out)\n","\n"," return out"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"N6lXYb_DobtI","executionInfo":{"status":"ok","timestamp":1631964358537,"user_tz":-120,"elapsed":204,"user":{"displayName":"Faheem Ahmed Abbasi","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GhgtOF28sy7gFBpnhma6GfiWjvqUh1r3ss-fhJtog=s64","userId":"04247060777971177506"}},"outputId":"3e2c059c-ca42-4a7c-86fd-97af312485ae"},"source":["X.shape[1]"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["4"]},"metadata":{},"execution_count":27}]},{"cell_type":"code","metadata":{"id":"bXcFCk_snJhb"},"source":["model = LSTM1(X.shape[1], 16, 2)\n","model_2 = GRUModel(X.shape[1], 16, 2, 1, 0.1)"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"Ille-yPTnL4B"},"source":["criterion = nn.SmoothL1Loss()\n","optimizer = torch.optim.Adam(model.parameters(), lr = 0.01)"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"6ijsOfMinOfG"},"source":["batch_size = 10000\n","test_size = int(batch_size * .2)\n","\n","X_train = X[:batch_size-test_size]\n","X_test = X[batch_size-test_size:batch_size]\n","y_train = y[:batch_size-test_size]\n","y_test = y[batch_size-test_size:batch_size]"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"tg7wxTvwnQQQ","executionInfo":{"status":"ok","timestamp":1631964369747,"user_tz":-120,"elapsed":207,"user":{"displayName":"Faheem Ahmed Abbasi","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GhgtOF28sy7gFBpnhma6GfiWjvqUh1r3ss-fhJtog=s64","userId":"04247060777971177506"}},"outputId":"7303b89f-d7b1-4974-cb16-3bf567c85b51"},"source":["print(X_train.shape)\n","print(y_train.shape)\n","print(X_test.shape)\n","print(y_test.shape)"],"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["torch.Size([8000, 4])\n","torch.Size([8000, 1])\n","torch.Size([2000, 4])\n","torch.Size([2000, 1])\n"]}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"pqv5BBqgnSVf","executionInfo":{"status":"ok","timestamp":1631964381364,"user_tz":-120,"elapsed":9294,"user":{"displayName":"Faheem Ahmed Abbasi","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GhgtOF28sy7gFBpnhma6GfiWjvqUh1r3ss-fhJtog=s64","userId":"04247060777971177506"}},"outputId":"5f5e467b-614c-4bad-cd26-9ba05c270fdb"},"source":["import time\n","start_time = time.time()\n","\n","epochs = 10\n","losses = []\n","\n","for i in range(epochs):\n"," i+=1\n"," y_pred = model(X_train)\n"," loss = criterion(y_pred, y_train) # RMSE\n"," losses.append(loss)\n"," \n"," \n"," if i%25 == 1:\n"," print(f'epoch: {i:3} loss: {loss.item():10.8f}')\n","\n"," optimizer.zero_grad()\n"," loss.backward()\n"," optimizer.step()\n","\n","print(f'epoch: {i:3} loss: {loss.item():10.8f}') \n","print(f'\\nDuration: {time.time() - start_time:.0f} seconds') "],"execution_count":null,"outputs":[{"output_type":"stream","name":"stderr","text":["/usr/local/lib/python3.7/dist-packages/torch/nn/modules/loss.py:921: UserWarning: Using a target size (torch.Size([8000, 1])) that is different to the input size (torch.Size([1, 1])). This will likely lead to incorrect results due to broadcasting. Please ensure they have the same size.\n"," return F.smooth_l1_loss(input, target, reduction=self.reduction, beta=self.beta)\n"]},{"output_type":"stream","name":"stdout","text":["epoch: 1 loss: 4.69094992\n","epoch: 10 loss: 4.21567631\n","\n","Duration: 9 seconds\n"]}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":279},"id":"fTeXMiWynVE_","executionInfo":{"status":"ok","timestamp":1631964386029,"user_tz":-120,"elapsed":680,"user":{"displayName":"Faheem Ahmed Abbasi","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GhgtOF28sy7gFBpnhma6GfiWjvqUh1r3ss-fhJtog=s64","userId":"04247060777971177506"}},"outputId":"456d74bf-dd1e-46c1-ca62-f8bf7e088c46"},"source":["plt.plot(range(epochs), losses)\n","plt.ylabel('RMSE Loss')\n","plt.xlabel('epoch');"],"execution_count":null,"outputs":[{"output_type":"display_data","data":{"image/png":"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\n","text/plain":["
"]},"metadata":{"needs_background":"light"}}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"ejdxISrHnX6x","executionInfo":{"status":"ok","timestamp":1631964394543,"user_tz":-120,"elapsed":323,"user":{"displayName":"Faheem Ahmed Abbasi","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GhgtOF28sy7gFBpnhma6GfiWjvqUh1r3ss-fhJtog=s64","userId":"04247060777971177506"}},"outputId":"c284631a-f247-4e9c-98e0-b66274c29d06"},"source":["with torch.no_grad():\n"," y_val = model(X_test)\n"," loss = torch.sqrt(criterion(y_val, y_test))\n","print(f'RMSE: {loss:.8f}')"],"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["RMSE: 2.06053257\n"]},{"output_type":"stream","name":"stderr","text":["/usr/local/lib/python3.7/dist-packages/torch/nn/modules/loss.py:921: UserWarning: Using a target size (torch.Size([2000, 1])) that is different to the input size (torch.Size([1, 1])). This will likely lead to incorrect results due to broadcasting. Please ensure they have the same size.\n"," return F.smooth_l1_loss(input, target, reduction=self.reduction, beta=self.beta)\n"]}]},{"cell_type":"code","metadata":{"id":"njYQKeIEna2H","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1631964452125,"user_tz":-120,"elapsed":31975,"user":{"displayName":"Faheem Ahmed Abbasi","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GhgtOF28sy7gFBpnhma6GfiWjvqUh1r3ss-fhJtog=s64","userId":"04247060777971177506"}},"outputId":"0fa00239-691e-4ee2-c041-1e3b23a48170"},"source":["import time\n","start_time = time.time()\n","\n","epochs = 10\n","losses = []\n","\n","for i in range(epochs):\n"," i+=1\n"," y_pred = model_2(X_train)\n"," loss = criterion(y_pred, y_train) # RMSE\n"," losses.append(loss)\n"," \n"," \n"," if i%25 == 1:\n"," print(f'epoch: {i:3} loss: {loss.item():10.8f}')\n","\n"," optimizer.zero_grad()\n"," loss.backward()\n"," optimizer.step()\n","\n","print(f'epoch: {i:3} loss: {loss.item():10.8f}') \n","print(f'\\nDuration: {time.time() - start_time:.0f} seconds') "],"execution_count":null,"outputs":[{"output_type":"stream","name":"stderr","text":["/usr/local/lib/python3.7/dist-packages/torch/nn/modules/loss.py:921: UserWarning: Using a target size (torch.Size([8000, 1])) that is different to the input size (torch.Size([1, 1])). This will likely lead to incorrect results due to broadcasting. Please ensure they have the same size.\n"," return F.smooth_l1_loss(input, target, reduction=self.reduction, beta=self.beta)\n"]},{"output_type":"stream","name":"stdout","text":["epoch: 1 loss: 4.37387133\n","epoch: 10 loss: 4.35498524\n","\n","Duration: 32 seconds\n"]}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":279},"id":"7bsDQkzpwIYQ","executionInfo":{"status":"ok","timestamp":1631964469809,"user_tz":-120,"elapsed":284,"user":{"displayName":"Faheem Ahmed Abbasi","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GhgtOF28sy7gFBpnhma6GfiWjvqUh1r3ss-fhJtog=s64","userId":"04247060777971177506"}},"outputId":"1ce395c8-5698-46b7-92e3-236fb481cf4f"},"source":["plt.plot(range(epochs), losses)\n","plt.ylabel('RMSE Loss')\n","plt.xlabel('epoch');"],"execution_count":null,"outputs":[{"output_type":"display_data","data":{"image/png":"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\n","text/plain":["
"]},"metadata":{"needs_background":"light"}}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"K-2sN7t4wSoE","executionInfo":{"status":"ok","timestamp":1631964472345,"user_tz":-120,"elapsed":228,"user":{"displayName":"Faheem Ahmed Abbasi","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GhgtOF28sy7gFBpnhma6GfiWjvqUh1r3ss-fhJtog=s64","userId":"04247060777971177506"}},"outputId":"b1d6c193-67a0-44f2-ab84-4f0517d9aed1"},"source":["with torch.no_grad():\n"," y_val = model_2(X_test)\n"," loss = torch.sqrt(criterion(y_val, y_test))\n","print(f'RMSE: {loss:.8f}')"],"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["RMSE: 2.11522794\n"]},{"output_type":"stream","name":"stderr","text":["/usr/local/lib/python3.7/dist-packages/torch/nn/modules/loss.py:921: UserWarning: Using a target size (torch.Size([2000, 1])) that is different to the input size (torch.Size([1, 1])). This will likely lead to incorrect results due to broadcasting. Please ensure they have the same size.\n"," return F.smooth_l1_loss(input, target, reduction=self.reduction, beta=self.beta)\n"]}]},{"cell_type":"code","metadata":{"id":"YwY4VkdmwVzh"},"source":["import torch\n","def pf1(output,target,metric=None):\n"," d = output.data\n"," t = target.data\n"," TP = torch.nonzero(d*t).size(0)\n"," TN = torch.nonzero((d - 1) * (t - 1)).size(0)\n"," FP = torch.nonzero(d * (t - 1)).size(0)\n"," FN = torch.nonzero((d - 1) * t).size(0)\n"," precision = TP / (TP + FP)\n"," recall = TP / (TP + FN)\n"," F1 = 2 * precision * recall / (precision + recall)\n"," accuracy = (TP+TN)/(TP+TN+FP+FN)\n"," PPV = TP/(TP+FP)\n"," if metric=='precision':\n"," return precision\n"," elif metric=='recall':\n"," return recall\n"," elif metric=='PPV':\n"," return PPV\n"," elif metric=='accuracy':\n"," return accuracy\n"," else: return F1"],"execution_count":null,"outputs":[]},{"cell_type":"code","source":["print(pf1(y_pred,y_train,metric='accuracy'))\n","print(pf1(y_pred,y_train,metric='precision'))\n","print(pf1(y_pred,y_train,metric='recall'))\n","print(pf1(y_pred,y_train,metric=None))"],"metadata":{"id":"DLGXdb1HtnVd","executionInfo":{"status":"error","timestamp":1641729662201,"user_tz":-60,"elapsed":440,"user":{"displayName":"Faheem Ahmed Abbasi","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GhgtOF28sy7gFBpnhma6GfiWjvqUh1r3ss-fhJtog=s64","userId":"04247060777971177506"}},"outputId":"514c8264-0a4f-49d6-ff74-08eef7f100c6","colab":{"base_uri":"https://localhost:8080/","height":225}},"execution_count":null,"outputs":[{"output_type":"error","ename":"NameError","evalue":"ignored","traceback":["\u001b[0;31m---------------------------------------------------------------------------\u001b[0m","\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)","\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpf1\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my_pred\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0my_train\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mmetric\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'accuracy'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpf1\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my_pred\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0my_train\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mmetric\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'precision'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpf1\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my_pred\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0my_train\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mmetric\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'recall'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpf1\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my_pred\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0my_train\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mmetric\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;31mNameError\u001b[0m: name 'y_pred' is not defined"]}]}]}