diff --git a/model_base.ipynb b/model_base.ipynb
index 189305a..4a1f83f 100644
--- a/model_base.ipynb
+++ b/model_base.ipynb
@@ -2,7 +2,7 @@
"cells": [
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
@@ -13,7 +13,353 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "with h5py.File('./data/TrainingData.h5', 'r') as f:\n",
+ " # Access the trip dataset and their corresponding timestamps\n",
+ " traffic_data = f['trip'][()]\n",
+ " dates = f['timeslot'][()]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "formatted_dates = []\n",
+ "\n",
+ "for date_string in dates:\n",
+ " formatted_date = datetime.strptime(date_string.decode(), '%Y%m%d%H%M')\n",
+ "\n",
+ " year = formatted_date.year\n",
+ " month = formatted_date.month\n",
+ " day = formatted_date.day\n",
+ " hour = formatted_date.hour\n",
+ " minute = formatted_date.minute\n",
+ "\n",
+ " formatted_dates.append(np.array([year, month, day, hour, minute]))\n",
+ "\n",
+ "formatted_dates = np.array(formatted_dates).reshape(1488, 5, 1)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "test_size = 240\n",
+ "\n",
+ "train_traffic_data = traffic_data[:-test_size]\n",
+ "test_traffic_data = traffic_data[-test_size:]\n",
+ "\n",
+ "train_formatted_dates = formatted_dates[:-test_size]\n",
+ "test_formatted_dates = formatted_dates[-test_size:]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "X_train, X_test = train_formatted_dates, test_formatted_dates\n",
+ "y_train, y_test = train_traffic_data, test_traffic_data"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import pandas as pd\n",
+ "import numpy as np"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " Join_Count | \n",
+ " TARGET_FID | \n",
+ " BlockID | \n",
+ " BikeLane_miles | \n",
+ " AADT | \n",
+ " SpeedLimit | \n",
+ " AvgSpeed | \n",
+ " Pop2019 | \n",
+ " Pop_Density | \n",
+ " Shape_Length | \n",
+ " Shape_Area | \n",
+ " StationNum | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 1 | \n",
+ " NaN | \n",
+ " 32638.666667 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0.0 | \n",
+ " 0.000000 | \n",
+ " 7840.490288 | \n",
+ " 3.787844e+06 | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 2 | \n",
+ " 2 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0.0 | \n",
+ " 0.000000 | \n",
+ " 7840.686448 | \n",
+ " 3.787843e+06 | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " 3 | \n",
+ " 3 | \n",
+ " 3 | \n",
+ " 0.807055 | \n",
+ " 21234.741935 | \n",
+ " 25.0 | \n",
+ " 15.0 | \n",
+ " 1049.0 | \n",
+ " 0.029594 | \n",
+ " 7840.882970 | \n",
+ " 3.787843e+06 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " 3 | \n",
+ " 4 | \n",
+ " 4 | \n",
+ " 2.096221 | \n",
+ " 5915.125000 | \n",
+ " 25.0 | \n",
+ " 19.0 | \n",
+ " 1816.0 | \n",
+ " 0.030252 | \n",
+ " 7841.080477 | \n",
+ " 3.787844e+06 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " 3 | \n",
+ " 5 | \n",
+ " 5 | \n",
+ " 0.984320 | \n",
+ " 23940.078947 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 1892.0 | \n",
+ " 0.022647 | \n",
+ " 7841.277327 | \n",
+ " 3.787843e+06 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " 123 | \n",
+ " 3 | \n",
+ " 124 | \n",
+ " 124 | \n",
+ " 1.955707 | \n",
+ " 9050.487805 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 1986.0 | \n",
+ " 0.046045 | \n",
+ " 7840.280937 | \n",
+ " 3.787843e+06 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " 124 | \n",
+ " 3 | \n",
+ " 125 | \n",
+ " 125 | \n",
+ " 1.440449 | \n",
+ " 9121.500000 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 1198.0 | \n",
+ " 0.039726 | \n",
+ " 7840.085072 | \n",
+ " 3.787843e+06 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " 125 | \n",
+ " 2 | \n",
+ " 126 | \n",
+ " 126 | \n",
+ " 0.985704 | \n",
+ " 8770.901961 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 555.0 | \n",
+ " 0.015125 | \n",
+ " 7839.890518 | \n",
+ " 3.787843e+06 | \n",
+ " 2 | \n",
+ "
\n",
+ " \n",
+ " 126 | \n",
+ " 4 | \n",
+ " 127 | \n",
+ " 127 | \n",
+ " 0.228593 | \n",
+ " 12266.085714 | \n",
+ " 25.0 | \n",
+ " 16.0 | \n",
+ " 814.0 | \n",
+ " 0.031125 | \n",
+ " 7839.696621 | \n",
+ " 3.787844e+06 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " 127 | \n",
+ " 4 | \n",
+ " 128 | \n",
+ " 128 | \n",
+ " 1.619940 | \n",
+ " 11077.037037 | \n",
+ " 25.0 | \n",
+ " 16.0 | \n",
+ " 1385.0 | \n",
+ " 0.059671 | \n",
+ " 7839.501980 | \n",
+ " 3.787843e+06 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
128 rows × 12 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Join_Count TARGET_FID BlockID BikeLane_miles AADT \\\n",
+ "0 0 1 1 NaN 32638.666667 \n",
+ "1 0 2 2 NaN NaN \n",
+ "2 3 3 3 0.807055 21234.741935 \n",
+ "3 3 4 4 2.096221 5915.125000 \n",
+ "4 3 5 5 0.984320 23940.078947 \n",
+ ".. ... ... ... ... ... \n",
+ "123 3 124 124 1.955707 9050.487805 \n",
+ "124 3 125 125 1.440449 9121.500000 \n",
+ "125 2 126 126 0.985704 8770.901961 \n",
+ "126 4 127 127 0.228593 12266.085714 \n",
+ "127 4 128 128 1.619940 11077.037037 \n",
+ "\n",
+ " SpeedLimit AvgSpeed Pop2019 Pop_Density Shape_Length Shape_Area \\\n",
+ "0 NaN NaN 0.0 0.000000 7840.490288 3.787844e+06 \n",
+ "1 NaN NaN 0.0 0.000000 7840.686448 3.787843e+06 \n",
+ "2 25.0 15.0 1049.0 0.029594 7840.882970 3.787843e+06 \n",
+ "3 25.0 19.0 1816.0 0.030252 7841.080477 3.787844e+06 \n",
+ "4 NaN NaN 1892.0 0.022647 7841.277327 3.787843e+06 \n",
+ ".. ... ... ... ... ... ... \n",
+ "123 NaN NaN 1986.0 0.046045 7840.280937 3.787843e+06 \n",
+ "124 NaN NaN 1198.0 0.039726 7840.085072 3.787843e+06 \n",
+ "125 NaN NaN 555.0 0.015125 7839.890518 3.787843e+06 \n",
+ "126 25.0 16.0 814.0 0.031125 7839.696621 3.787844e+06 \n",
+ "127 25.0 16.0 1385.0 0.059671 7839.501980 3.787843e+06 \n",
+ "\n",
+ " StationNum \n",
+ "0 0 \n",
+ "1 0 \n",
+ "2 3 \n",
+ "3 3 \n",
+ "4 3 \n",
+ ".. ... \n",
+ "123 3 \n",
+ "124 3 \n",
+ "125 2 \n",
+ "126 4 \n",
+ "127 4 \n",
+ "\n",
+ "[128 rows x 12 columns]"
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "spatio_data_file = \"./data/SpatialFeatures.csv\"\n",
+ "raw_spatio_feature = pd.read_csv(spatio_data_file)\n",
+ "raw_spatio_feature"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "bikeLane_matrix = raw_spatio_feature[\"BikeLane_miles\"]\n",
+ "bikeLane_matrix = bikeLane_matrix.fillna(0).to_numpy()\n",
+ "bikeLane_matrix = bikeLane_matrix/bikeLane_matrix.max()\n",
+ "bikeLane_matrix_board = bikeLane_matrix[np.newaxis,:] * np.ones((1248,1))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
@@ -27,7 +373,7 @@
"\n",
"left_inputs = layers.Input(shape = input_shape)\n",
"\n",
- "x = models.layers.LSTM(50, activation = \"tanh\")(left_inputs)\n",
+ "x = layers.LSTM(50, activation = \"tanh\")(left_inputs)\n",
"\n",
"x = layers.Dense(2*16*8, activation = \"linear\")(x)\n",
"\n",
@@ -39,12 +385,220 @@
"\n"
]
},
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[[2019],\n",
+ " [ 10],\n",
+ " [ 1],\n",
+ " [ 0],\n",
+ " [ 30]],\n",
+ "\n",
+ " [[2019],\n",
+ " [ 10],\n",
+ " [ 1],\n",
+ " [ 1],\n",
+ " [ 0]],\n",
+ "\n",
+ " [[2019],\n",
+ " [ 10],\n",
+ " [ 1],\n",
+ " [ 1],\n",
+ " [ 30]],\n",
+ "\n",
+ " ...,\n",
+ "\n",
+ " [[2019],\n",
+ " [ 10],\n",
+ " [ 26],\n",
+ " [ 23],\n",
+ " [ 0]],\n",
+ "\n",
+ " [[2019],\n",
+ " [ 10],\n",
+ " [ 26],\n",
+ " [ 23],\n",
+ " [ 30]],\n",
+ "\n",
+ " [[2019],\n",
+ " [ 10],\n",
+ " [ 27],\n",
+ " [ 0],\n",
+ " [ 0]]])"
+ ]
+ },
+ "execution_count": 13,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "X_train"
+ ]
+ },
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
- "source": []
+ "source": [
+ "X_train_scaled = X_train[:,3:]\n",
+ "X_test_scaled = X_test[:,3:]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Epoch 1/50\n",
+ "39/39 [==============================] - 1s 9ms/step - loss: 213.0473 - val_loss: 144.8039\n",
+ "Epoch 2/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 184.4646 - val_loss: 119.2632\n",
+ "Epoch 3/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 158.5347 - val_loss: 105.8267\n",
+ "Epoch 4/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 143.7741 - val_loss: 98.0472\n",
+ "Epoch 5/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 134.0348 - val_loss: 93.0242\n",
+ "Epoch 6/50\n",
+ "39/39 [==============================] - 0s 1ms/step - loss: 127.1140 - val_loss: 89.8005\n",
+ "Epoch 7/50\n",
+ "39/39 [==============================] - 0s 1ms/step - loss: 122.1602 - val_loss: 87.7104\n",
+ "Epoch 8/50\n",
+ "39/39 [==============================] - 0s 1ms/step - loss: 118.5489 - val_loss: 86.4234\n",
+ "Epoch 9/50\n",
+ "39/39 [==============================] - 0s 1ms/step - loss: 115.9217 - val_loss: 85.6522\n",
+ "Epoch 10/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 114.0212 - val_loss: 85.3681\n",
+ "Epoch 11/50\n",
+ "39/39 [==============================] - 0s 1ms/step - loss: 112.5865 - val_loss: 85.1347\n",
+ "Epoch 12/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 111.6269 - val_loss: 85.2543\n",
+ "Epoch 13/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 110.8616 - val_loss: 85.2738\n",
+ "Epoch 14/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 110.3609 - val_loss: 85.4121\n",
+ "Epoch 15/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 110.0156 - val_loss: 85.7094\n",
+ "Epoch 16/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 109.7098 - val_loss: 85.6584\n",
+ "Epoch 17/50\n",
+ "39/39 [==============================] - 0s 1ms/step - loss: 109.5667 - val_loss: 86.0608\n",
+ "Epoch 18/50\n",
+ "39/39 [==============================] - 0s 1ms/step - loss: 109.3852 - val_loss: 86.0898\n",
+ "Epoch 19/50\n",
+ "39/39 [==============================] - 0s 1ms/step - loss: 109.3077 - val_loss: 86.1924\n",
+ "Epoch 20/50\n",
+ "39/39 [==============================] - 0s 1ms/step - loss: 109.2454 - val_loss: 86.4365\n",
+ "Epoch 21/50\n",
+ "39/39 [==============================] - 0s 1ms/step - loss: 109.1953 - val_loss: 86.2306\n",
+ "Epoch 22/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 108.7120 - val_loss: 85.5497\n",
+ "Epoch 23/50\n",
+ "39/39 [==============================] - 0s 1ms/step - loss: 107.9923 - val_loss: 84.8486\n",
+ "Epoch 24/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 106.5528 - val_loss: 83.9956\n",
+ "Epoch 25/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 105.1779 - val_loss: 81.6498\n",
+ "Epoch 26/50\n",
+ "39/39 [==============================] - 0s 1ms/step - loss: 103.8916 - val_loss: 81.1214\n",
+ "Epoch 27/50\n",
+ "39/39 [==============================] - 0s 1ms/step - loss: 102.9861 - val_loss: 81.5862\n",
+ "Epoch 28/50\n",
+ "39/39 [==============================] - 0s 1ms/step - loss: 100.8951 - val_loss: 79.1956\n",
+ "Epoch 29/50\n",
+ "39/39 [==============================] - 0s 1ms/step - loss: 97.6820 - val_loss: 75.3084\n",
+ "Epoch 30/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 94.0599 - val_loss: 71.8201\n",
+ "Epoch 31/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 89.8942 - val_loss: 68.2872\n",
+ "Epoch 32/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 86.6234 - val_loss: 68.3562\n",
+ "Epoch 33/50\n",
+ "39/39 [==============================] - 0s 1ms/step - loss: 83.7273 - val_loss: 66.8059\n",
+ "Epoch 34/50\n",
+ "39/39 [==============================] - 0s 1ms/step - loss: 81.5555 - val_loss: 65.0340\n",
+ "Epoch 35/50\n",
+ "39/39 [==============================] - 0s 1ms/step - loss: 79.8541 - val_loss: 64.4435\n",
+ "Epoch 36/50\n",
+ "39/39 [==============================] - 0s 1ms/step - loss: 78.2599 - val_loss: 64.8526\n",
+ "Epoch 37/50\n",
+ "39/39 [==============================] - 0s 1ms/step - loss: 76.9122 - val_loss: 63.9882\n",
+ "Epoch 38/50\n",
+ "39/39 [==============================] - 0s 1ms/step - loss: 75.8087 - val_loss: 63.5033\n",
+ "Epoch 39/50\n",
+ "39/39 [==============================] - 0s 1ms/step - loss: 75.1495 - val_loss: 63.4638\n",
+ "Epoch 40/50\n",
+ "39/39 [==============================] - 0s 1ms/step - loss: 74.5850 - val_loss: 64.1694\n",
+ "Epoch 41/50\n",
+ "39/39 [==============================] - 0s 1ms/step - loss: 74.6376 - val_loss: 65.1026\n",
+ "Epoch 42/50\n",
+ "39/39 [==============================] - 0s 1ms/step - loss: 73.7184 - val_loss: 63.3465\n",
+ "Epoch 43/50\n",
+ "39/39 [==============================] - 0s 1ms/step - loss: 73.0771 - val_loss: 62.3124\n",
+ "Epoch 44/50\n",
+ "39/39 [==============================] - 0s 1ms/step - loss: 72.4952 - val_loss: 62.8214\n",
+ "Epoch 45/50\n",
+ "39/39 [==============================] - 0s 1ms/step - loss: 72.1373 - val_loss: 62.8891\n",
+ "Epoch 46/50\n",
+ "39/39 [==============================] - 0s 1ms/step - loss: 71.4127 - val_loss: 63.0681\n",
+ "Epoch 47/50\n",
+ "39/39 [==============================] - 0s 1ms/step - loss: 71.1406 - val_loss: 63.8471\n",
+ "Epoch 48/50\n",
+ "39/39 [==============================] - 0s 1ms/step - loss: 70.7038 - val_loss: 62.8992\n",
+ "Epoch 49/50\n",
+ "39/39 [==============================] - 0s 1ms/step - loss: 70.3270 - val_loss: 62.5290\n",
+ "Epoch 50/50\n",
+ "39/39 [==============================] - 0s 1ms/step - loss: 70.1907 - val_loss: 63.5971\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 11,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "model.compile(optimizer='adam', loss='mse')\n",
+ "model.fit([X_train], y_train, epochs=50, batch_size=32, validation_data=([X_test], y_test))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "8/8 [==============================] - 0s 1ms/step - loss: 63.5971\n",
+ "Root Mean Squared Error: 7.9747811027309465\n"
+ ]
+ }
+ ],
+ "source": [
+ "mse = model.evaluate(X_test, y_test)\n",
+ "\n",
+ "# Show rmse to see how model performs on the test set\n",
+ "rmse = np.sqrt(mse)\n",
+ "print(f'Root Mean Squared Error: {rmse}')"
+ ]
}
],
"metadata": {
@@ -54,8 +608,16 @@
"name": "python3"
},
"language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
"name": "python",
- "version": "3.10.13"
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.8.18"
}
},
"nbformat": 4,
diff --git a/model_v1.ipynb b/model_v1.ipynb
index db6c599..6e84e8c 100644
--- a/model_v1.ipynb
+++ b/model_v1.ipynb
@@ -2,7 +2,7 @@
"cells": [
{
"cell_type": "code",
- "execution_count": 15,
+ "execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
@@ -13,7 +13,7 @@
},
{
"cell_type": "code",
- "execution_count": 16,
+ "execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
@@ -25,7 +25,7 @@
},
{
"cell_type": "code",
- "execution_count": 17,
+ "execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
@@ -47,7 +47,7 @@
},
{
"cell_type": "code",
- "execution_count": 18,
+ "execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
@@ -62,7 +62,7 @@
},
{
"cell_type": "code",
- "execution_count": 19,
+ "execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
@@ -72,7 +72,295 @@
},
{
"cell_type": "code",
- "execution_count": 20,
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import pandas as pd\n",
+ "import numpy as np\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " Join_Count | \n",
+ " TARGET_FID | \n",
+ " BlockID | \n",
+ " BikeLane_miles | \n",
+ " AADT | \n",
+ " SpeedLimit | \n",
+ " AvgSpeed | \n",
+ " Pop2019 | \n",
+ " Pop_Density | \n",
+ " Shape_Length | \n",
+ " Shape_Area | \n",
+ " StationNum | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 1 | \n",
+ " NaN | \n",
+ " 32638.666667 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0.0 | \n",
+ " 0.000000 | \n",
+ " 7840.490288 | \n",
+ " 3.787844e+06 | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 2 | \n",
+ " 2 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0.0 | \n",
+ " 0.000000 | \n",
+ " 7840.686448 | \n",
+ " 3.787843e+06 | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " 3 | \n",
+ " 3 | \n",
+ " 3 | \n",
+ " 0.807055 | \n",
+ " 21234.741935 | \n",
+ " 25.0 | \n",
+ " 15.0 | \n",
+ " 1049.0 | \n",
+ " 0.029594 | \n",
+ " 7840.882970 | \n",
+ " 3.787843e+06 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " 3 | \n",
+ " 4 | \n",
+ " 4 | \n",
+ " 2.096221 | \n",
+ " 5915.125000 | \n",
+ " 25.0 | \n",
+ " 19.0 | \n",
+ " 1816.0 | \n",
+ " 0.030252 | \n",
+ " 7841.080477 | \n",
+ " 3.787844e+06 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " 3 | \n",
+ " 5 | \n",
+ " 5 | \n",
+ " 0.984320 | \n",
+ " 23940.078947 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 1892.0 | \n",
+ " 0.022647 | \n",
+ " 7841.277327 | \n",
+ " 3.787843e+06 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " 123 | \n",
+ " 3 | \n",
+ " 124 | \n",
+ " 124 | \n",
+ " 1.955707 | \n",
+ " 9050.487805 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 1986.0 | \n",
+ " 0.046045 | \n",
+ " 7840.280937 | \n",
+ " 3.787843e+06 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " 124 | \n",
+ " 3 | \n",
+ " 125 | \n",
+ " 125 | \n",
+ " 1.440449 | \n",
+ " 9121.500000 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 1198.0 | \n",
+ " 0.039726 | \n",
+ " 7840.085072 | \n",
+ " 3.787843e+06 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " 125 | \n",
+ " 2 | \n",
+ " 126 | \n",
+ " 126 | \n",
+ " 0.985704 | \n",
+ " 8770.901961 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 555.0 | \n",
+ " 0.015125 | \n",
+ " 7839.890518 | \n",
+ " 3.787843e+06 | \n",
+ " 2 | \n",
+ "
\n",
+ " \n",
+ " 126 | \n",
+ " 4 | \n",
+ " 127 | \n",
+ " 127 | \n",
+ " 0.228593 | \n",
+ " 12266.085714 | \n",
+ " 25.0 | \n",
+ " 16.0 | \n",
+ " 814.0 | \n",
+ " 0.031125 | \n",
+ " 7839.696621 | \n",
+ " 3.787844e+06 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " 127 | \n",
+ " 4 | \n",
+ " 128 | \n",
+ " 128 | \n",
+ " 1.619940 | \n",
+ " 11077.037037 | \n",
+ " 25.0 | \n",
+ " 16.0 | \n",
+ " 1385.0 | \n",
+ " 0.059671 | \n",
+ " 7839.501980 | \n",
+ " 3.787843e+06 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
128 rows × 12 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Join_Count TARGET_FID BlockID BikeLane_miles AADT \\\n",
+ "0 0 1 1 NaN 32638.666667 \n",
+ "1 0 2 2 NaN NaN \n",
+ "2 3 3 3 0.807055 21234.741935 \n",
+ "3 3 4 4 2.096221 5915.125000 \n",
+ "4 3 5 5 0.984320 23940.078947 \n",
+ ".. ... ... ... ... ... \n",
+ "123 3 124 124 1.955707 9050.487805 \n",
+ "124 3 125 125 1.440449 9121.500000 \n",
+ "125 2 126 126 0.985704 8770.901961 \n",
+ "126 4 127 127 0.228593 12266.085714 \n",
+ "127 4 128 128 1.619940 11077.037037 \n",
+ "\n",
+ " SpeedLimit AvgSpeed Pop2019 Pop_Density Shape_Length Shape_Area \\\n",
+ "0 NaN NaN 0.0 0.000000 7840.490288 3.787844e+06 \n",
+ "1 NaN NaN 0.0 0.000000 7840.686448 3.787843e+06 \n",
+ "2 25.0 15.0 1049.0 0.029594 7840.882970 3.787843e+06 \n",
+ "3 25.0 19.0 1816.0 0.030252 7841.080477 3.787844e+06 \n",
+ "4 NaN NaN 1892.0 0.022647 7841.277327 3.787843e+06 \n",
+ ".. ... ... ... ... ... ... \n",
+ "123 NaN NaN 1986.0 0.046045 7840.280937 3.787843e+06 \n",
+ "124 NaN NaN 1198.0 0.039726 7840.085072 3.787843e+06 \n",
+ "125 NaN NaN 555.0 0.015125 7839.890518 3.787843e+06 \n",
+ "126 25.0 16.0 814.0 0.031125 7839.696621 3.787844e+06 \n",
+ "127 25.0 16.0 1385.0 0.059671 7839.501980 3.787843e+06 \n",
+ "\n",
+ " StationNum \n",
+ "0 0 \n",
+ "1 0 \n",
+ "2 3 \n",
+ "3 3 \n",
+ "4 3 \n",
+ ".. ... \n",
+ "123 3 \n",
+ "124 3 \n",
+ "125 2 \n",
+ "126 4 \n",
+ "127 4 \n",
+ "\n",
+ "[128 rows x 12 columns]"
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "spatio_data_file = \"./data/SpatialFeatures.csv\"\n",
+ "raw_spatio_feature = pd.read_csv(spatio_data_file)\n",
+ "raw_spatio_feature"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 45,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "bikeLane_matrix = raw_spatio_feature[\"BikeLane_miles\"]\n",
+ "bikeLane_matrix = bikeLane_matrix.fillna(0).to_numpy()\n",
+ "bikeLane_matrix = bikeLane_matrix/bikeLane_matrix.max()\n",
+ "bikeLane_matrix_board = bikeLane_matrix[np.newaxis,:] * np.ones((1248,1))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 43,
"metadata": {},
"outputs": [],
"source": [
@@ -84,15 +372,25 @@
"\n",
"input_shape = (5,1)\n",
"\n",
+ "static_features = 128\n",
+ "\n",
"left_inputs = layers.Input(shape = input_shape)\n",
"\n",
+ "static_input = layers.Input(shape = static_features,)\n",
+ "\n",
"x = layers.LSTM(50, activation = \"tanh\")(left_inputs)\n",
"\n",
- "x = layers.Dense(2*16*8, activation = \"linear\")(x)\n",
+ "# x = layers.Dense(128,activation= \"relu\")(x)\n",
+ "\n",
+ "\n",
+ "x = layers.concatenate([x,static_input])\n",
+ "\n",
+ "x = layers.Dense(2*16*8, activation = \"relu\")(x)\n",
"\n",
"output = layers.Reshape((2,16,8))(x)\n",
"\n",
- "model = models.Model([left_inputs],outputs = output)\n",
+ "model = models.Model([left_inputs,static_input],outputs = output)\n",
+ "\n",
"\n",
"\n",
"\n"
@@ -100,7 +398,7 @@
},
{
"cell_type": "code",
- "execution_count": 21,
+ "execution_count": 47,
"metadata": {},
"outputs": [
{
@@ -108,134 +406,39 @@
"output_type": "stream",
"text": [
"Epoch 1/50\n",
- "39/39 [==============================] - 1s 9ms/step - loss: 212.9115 - val_loss: 144.5777\n",
- "Epoch 2/50\n",
- "39/39 [==============================] - 0s 2ms/step - loss: 183.6068 - val_loss: 118.8507\n",
- "Epoch 3/50\n",
- "39/39 [==============================] - 0s 2ms/step - loss: 158.2998 - val_loss: 105.8254\n",
- "Epoch 4/50\n",
- "39/39 [==============================] - 0s 2ms/step - loss: 143.8591 - val_loss: 98.0465\n",
- "Epoch 5/50\n",
- "39/39 [==============================] - 0s 2ms/step - loss: 134.1396 - val_loss: 93.0498\n",
- "Epoch 6/50\n",
- "39/39 [==============================] - 0s 2ms/step - loss: 127.2775 - val_loss: 89.7777\n",
- "Epoch 7/50\n",
- "39/39 [==============================] - 0s 2ms/step - loss: 122.2552 - val_loss: 87.7291\n",
- "Epoch 8/50\n",
- "39/39 [==============================] - 0s 2ms/step - loss: 118.6310 - val_loss: 86.4313\n",
- "Epoch 9/50\n",
- "39/39 [==============================] - 0s 2ms/step - loss: 115.9718 - val_loss: 85.7162\n",
- "Epoch 10/50\n",
- "39/39 [==============================] - 0s 2ms/step - loss: 114.0570 - val_loss: 85.3153\n",
- "Epoch 11/50\n",
- "39/39 [==============================] - 0s 2ms/step - loss: 112.6366 - val_loss: 85.1707\n",
- "Epoch 12/50\n",
- "39/39 [==============================] - 0s 2ms/step - loss: 111.6274 - val_loss: 85.1579\n",
- "Epoch 13/50\n",
- "39/39 [==============================] - 0s 2ms/step - loss: 110.8910 - val_loss: 85.2295\n",
- "Epoch 14/50\n",
- "39/39 [==============================] - 0s 2ms/step - loss: 110.3705 - val_loss: 85.3980\n",
- "Epoch 15/50\n",
- "39/39 [==============================] - 0s 2ms/step - loss: 109.9801 - val_loss: 85.5780\n",
- "Epoch 16/50\n",
- "39/39 [==============================] - 0s 2ms/step - loss: 109.7158 - val_loss: 85.8827\n",
- "Epoch 17/50\n",
- "39/39 [==============================] - 0s 2ms/step - loss: 109.5257 - val_loss: 86.0089\n",
- "Epoch 18/50\n",
- "39/39 [==============================] - 0s 2ms/step - loss: 109.4247 - val_loss: 86.1505\n",
- "Epoch 19/50\n",
- "39/39 [==============================] - 0s 2ms/step - loss: 109.0258 - val_loss: 85.7924\n",
- "Epoch 20/50\n",
- "39/39 [==============================] - 0s 2ms/step - loss: 108.8352 - val_loss: 85.9186\n",
- "Epoch 21/50\n",
- "39/39 [==============================] - 0s 2ms/step - loss: 108.5763 - val_loss: 85.5510\n",
- "Epoch 22/50\n",
- "39/39 [==============================] - 0s 2ms/step - loss: 108.1767 - val_loss: 85.3380\n",
- "Epoch 23/50\n",
- "39/39 [==============================] - 0s 2ms/step - loss: 107.4323 - val_loss: 84.9938\n",
- "Epoch 24/50\n",
- "39/39 [==============================] - 0s 2ms/step - loss: 106.1936 - val_loss: 82.6167\n",
- "Epoch 25/50\n",
- "39/39 [==============================] - 0s 2ms/step - loss: 104.6931 - val_loss: 81.7814\n",
- "Epoch 26/50\n",
- "39/39 [==============================] - 0s 2ms/step - loss: 102.9895 - val_loss: 79.9620\n",
- "Epoch 27/50\n",
- "39/39 [==============================] - 0s 2ms/step - loss: 101.5745 - val_loss: 78.4792\n",
- "Epoch 28/50\n",
- "39/39 [==============================] - 0s 2ms/step - loss: 98.5761 - val_loss: 76.5478\n",
- "Epoch 29/50\n",
- "39/39 [==============================] - 0s 2ms/step - loss: 94.6209 - val_loss: 72.0995\n",
- "Epoch 30/50\n",
- "39/39 [==============================] - 0s 2ms/step - loss: 90.4683 - val_loss: 70.5429\n",
- "Epoch 31/50\n",
- "39/39 [==============================] - 0s 2ms/step - loss: 86.6393 - val_loss: 67.5324\n",
- "Epoch 32/50\n",
- "39/39 [==============================] - 0s 2ms/step - loss: 83.6719 - val_loss: 66.9005\n",
- "Epoch 33/50\n",
- "39/39 [==============================] - 0s 2ms/step - loss: 81.2981 - val_loss: 65.7497\n",
- "Epoch 34/50\n",
- "39/39 [==============================] - 0s 2ms/step - loss: 79.8582 - val_loss: 65.4873\n",
- "Epoch 35/50\n",
- "39/39 [==============================] - 0s 2ms/step - loss: 78.4644 - val_loss: 64.4355\n",
- "Epoch 36/50\n",
- "39/39 [==============================] - 0s 2ms/step - loss: 77.4534 - val_loss: 65.0040\n",
- "Epoch 37/50\n",
- "39/39 [==============================] - 0s 2ms/step - loss: 76.9951 - val_loss: 65.3200\n",
- "Epoch 38/50\n",
- "39/39 [==============================] - 0s 2ms/step - loss: 76.4038 - val_loss: 64.2204\n",
- "Epoch 39/50\n",
- "39/39 [==============================] - 0s 2ms/step - loss: 75.8992 - val_loss: 64.0133\n",
- "Epoch 40/50\n",
- "39/39 [==============================] - 0s 2ms/step - loss: 75.4885 - val_loss: 64.4360\n",
- "Epoch 41/50\n",
- "39/39 [==============================] - 0s 2ms/step - loss: 75.2467 - val_loss: 64.6135\n",
- "Epoch 42/50\n",
- "39/39 [==============================] - 0s 2ms/step - loss: 74.6445 - val_loss: 64.3743\n",
- "Epoch 43/50\n",
- "39/39 [==============================] - 0s 2ms/step - loss: 74.2044 - val_loss: 63.9837\n",
- "Epoch 44/50\n",
- "39/39 [==============================] - 0s 2ms/step - loss: 73.8331 - val_loss: 64.3629\n",
- "Epoch 45/50\n",
- "39/39 [==============================] - 0s 2ms/step - loss: 73.4110 - val_loss: 63.6357\n",
- "Epoch 46/50\n",
- "39/39 [==============================] - 0s 2ms/step - loss: 72.9355 - val_loss: 63.7812\n",
- "Epoch 47/50\n",
- "39/39 [==============================] - 0s 2ms/step - loss: 72.2754 - val_loss: 63.3691\n",
- "Epoch 48/50\n",
- "39/39 [==============================] - 0s 2ms/step - loss: 71.8866 - val_loss: 64.9375\n",
- "Epoch 49/50\n",
- "39/39 [==============================] - 0s 2ms/step - loss: 71.0808 - val_loss: 63.7018\n",
- "Epoch 50/50\n",
- "39/39 [==============================] - 0s 2ms/step - loss: 70.5971 - val_loss: 62.9802\n"
+ " 1/39 [..............................] - ETA: 23s - loss: 131.9053"
]
},
{
- "data": {
- "text/plain": [
- ""
- ]
- },
- "execution_count": 21,
- "metadata": {},
- "output_type": "execute_result"
+ "ename": "ValueError",
+ "evalue": "in user code:\n\n File \"d:\\Anoconda\\envs\\py38\\lib\\site-packages\\keras\\src\\engine\\training.py\", line 1972, in test_function *\n return step_function(self, iterator)\n File \"d:\\Anoconda\\envs\\py38\\lib\\site-packages\\keras\\src\\engine\\training.py\", line 1956, in step_function **\n outputs = model.distribute_strategy.run(run_step, args=(data,))\n File \"d:\\Anoconda\\envs\\py38\\lib\\site-packages\\keras\\src\\engine\\training.py\", line 1944, in run_step **\n outputs = model.test_step(data)\n File \"d:\\Anoconda\\envs\\py38\\lib\\site-packages\\keras\\src\\engine\\training.py\", line 1850, in test_step\n y_pred = self(x, training=False)\n File \"d:\\Anoconda\\envs\\py38\\lib\\site-packages\\keras\\src\\utils\\traceback_utils.py\", line 70, in error_handler\n raise e.with_traceback(filtered_tb) from None\n File \"d:\\Anoconda\\envs\\py38\\lib\\site-packages\\keras\\src\\engine\\input_spec.py\", line 219, in assert_input_compatibility\n raise ValueError(\n\n ValueError: Layer \"model_6\" expects 2 input(s), but it received 1 input tensors. Inputs received: []\n",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)",
+ "Cell \u001b[1;32mIn[47], line 2\u001b[0m\n\u001b[0;32m 1\u001b[0m model\u001b[38;5;241m.\u001b[39mcompile(optimizer\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124madam\u001b[39m\u001b[38;5;124m'\u001b[39m, loss\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmse\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m----> 2\u001b[0m \u001b[43mmodel\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfit\u001b[49m\u001b[43m(\u001b[49m\u001b[43m[\u001b[49m\u001b[43mX_train\u001b[49m\u001b[43m,\u001b[49m\u001b[43mbikeLane_matrix_board\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43my_train\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mepochs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m50\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mbatch_size\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m32\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mvalidation_data\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m[\u001b[49m\u001b[43mX_test\u001b[49m\u001b[43m,\u001b[49m\u001b[43mbikeLane_matrix_board\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43my_test\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n",
+ "File \u001b[1;32md:\\Anoconda\\envs\\py38\\lib\\site-packages\\keras\\src\\utils\\traceback_utils.py:70\u001b[0m, in \u001b[0;36mfilter_traceback..error_handler\u001b[1;34m(*args, **kwargs)\u001b[0m\n\u001b[0;32m 67\u001b[0m filtered_tb \u001b[38;5;241m=\u001b[39m _process_traceback_frames(e\u001b[38;5;241m.\u001b[39m__traceback__)\n\u001b[0;32m 68\u001b[0m \u001b[38;5;66;03m# To get the full stack trace, call:\u001b[39;00m\n\u001b[0;32m 69\u001b[0m \u001b[38;5;66;03m# `tf.debugging.disable_traceback_filtering()`\u001b[39;00m\n\u001b[1;32m---> 70\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m e\u001b[38;5;241m.\u001b[39mwith_traceback(filtered_tb) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m 71\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[0;32m 72\u001b[0m \u001b[38;5;28;01mdel\u001b[39;00m filtered_tb\n",
+ "File \u001b[1;32m~\\AppData\\Local\\Temp\\__autograph_generated_file8nzlr_ef.py:15\u001b[0m, in \u001b[0;36mouter_factory..inner_factory..tf__test_function\u001b[1;34m(iterator)\u001b[0m\n\u001b[0;32m 13\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m 14\u001b[0m do_return \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mTrue\u001b[39;00m\n\u001b[1;32m---> 15\u001b[0m retval_ \u001b[38;5;241m=\u001b[39m ag__\u001b[38;5;241m.\u001b[39mconverted_call(ag__\u001b[38;5;241m.\u001b[39mld(step_function), (ag__\u001b[38;5;241m.\u001b[39mld(\u001b[38;5;28mself\u001b[39m), ag__\u001b[38;5;241m.\u001b[39mld(iterator)), \u001b[38;5;28;01mNone\u001b[39;00m, fscope)\n\u001b[0;32m 16\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m:\n\u001b[0;32m 17\u001b[0m do_return \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m\n",
+ "\u001b[1;31mValueError\u001b[0m: in user code:\n\n File \"d:\\Anoconda\\envs\\py38\\lib\\site-packages\\keras\\src\\engine\\training.py\", line 1972, in test_function *\n return step_function(self, iterator)\n File \"d:\\Anoconda\\envs\\py38\\lib\\site-packages\\keras\\src\\engine\\training.py\", line 1956, in step_function **\n outputs = model.distribute_strategy.run(run_step, args=(data,))\n File \"d:\\Anoconda\\envs\\py38\\lib\\site-packages\\keras\\src\\engine\\training.py\", line 1944, in run_step **\n outputs = model.test_step(data)\n File \"d:\\Anoconda\\envs\\py38\\lib\\site-packages\\keras\\src\\engine\\training.py\", line 1850, in test_step\n y_pred = self(x, training=False)\n File \"d:\\Anoconda\\envs\\py38\\lib\\site-packages\\keras\\src\\utils\\traceback_utils.py\", line 70, in error_handler\n raise e.with_traceback(filtered_tb) from None\n File \"d:\\Anoconda\\envs\\py38\\lib\\site-packages\\keras\\src\\engine\\input_spec.py\", line 219, in assert_input_compatibility\n raise ValueError(\n\n ValueError: Layer \"model_6\" expects 2 input(s), but it received 1 input tensors. Inputs received: []\n"
+ ]
}
],
"source": [
"model.compile(optimizer='adam', loss='mse')\n",
- "model.fit(X_train, y_train, epochs=50, batch_size=32, validation_data=(X_test, y_test))"
+ "model.fit([X_train,bikeLane_matrix_board], y_train, epochs=50, batch_size=32, validation_data=([X_test,bikeLane_matrix_board], y_test))"
]
},
{
"cell_type": "code",
- "execution_count": 22,
+ "execution_count": 38,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "8/8 [==============================] - 0s 1000us/step - loss: 62.9802\n",
- "Root Mean Squared Error: 7.936009544951329\n"
+ "8/8 [==============================] - 0s 714us/step - loss: 50.3341\n",
+ "Root Mean Squared Error: 7.094656058773051\n"
]
}
],
@@ -271,7 +474,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.10.13"
+ "version": "3.8.18"
}
},
"nbformat": 4,
diff --git a/model_v2.ipynb b/model_v2.ipynb
new file mode 100644
index 0000000..6c61c70
--- /dev/null
+++ b/model_v2.ipynb
@@ -0,0 +1,533 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import h5py\n",
+ "import numpy as np\n",
+ "from datetime import datetime\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "with h5py.File('./data/TrainingData.h5', 'r') as f:\n",
+ " # Access the trip dataset and their corresponding timestamps\n",
+ " traffic_data = f['trip'][()]\n",
+ " dates = f['timeslot'][()]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "formatted_dates = []\n",
+ "\n",
+ "for date_string in dates:\n",
+ " formatted_date = datetime.strptime(date_string.decode(), '%Y%m%d%H%M')\n",
+ "\n",
+ " year = formatted_date.year\n",
+ " month = formatted_date.month\n",
+ " day = formatted_date.day\n",
+ " hour = formatted_date.hour\n",
+ " minute = formatted_date.minute\n",
+ "\n",
+ " formatted_dates.append(np.array([year, month, day, hour, minute]))\n",
+ "\n",
+ "formatted_dates = np.array(formatted_dates).reshape(1488, 5, 1)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "test_size = 240\n",
+ "\n",
+ "train_traffic_data = traffic_data[:-test_size]\n",
+ "test_traffic_data = traffic_data[-test_size:]\n",
+ "\n",
+ "train_formatted_dates = formatted_dates[:-test_size]\n",
+ "test_formatted_dates = formatted_dates[-test_size:]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 46,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "X_train, X_test = train_formatted_dates, test_formatted_dates\n",
+ "y_train, y_test = train_traffic_data, test_traffic_data"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 47,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import pandas as pd\n",
+ "import numpy as np\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 48,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " Join_Count | \n",
+ " TARGET_FID | \n",
+ " BlockID | \n",
+ " BikeLane_miles | \n",
+ " AADT | \n",
+ " SpeedLimit | \n",
+ " AvgSpeed | \n",
+ " Pop2019 | \n",
+ " Pop_Density | \n",
+ " Shape_Length | \n",
+ " Shape_Area | \n",
+ " StationNum | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 1 | \n",
+ " NaN | \n",
+ " 32638.666667 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0.0 | \n",
+ " 0.000000 | \n",
+ " 7840.490288 | \n",
+ " 3.787844e+06 | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 2 | \n",
+ " 2 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0.0 | \n",
+ " 0.000000 | \n",
+ " 7840.686448 | \n",
+ " 3.787843e+06 | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " 3 | \n",
+ " 3 | \n",
+ " 3 | \n",
+ " 0.807055 | \n",
+ " 21234.741935 | \n",
+ " 25.0 | \n",
+ " 15.0 | \n",
+ " 1049.0 | \n",
+ " 0.029594 | \n",
+ " 7840.882970 | \n",
+ " 3.787843e+06 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " 3 | \n",
+ " 4 | \n",
+ " 4 | \n",
+ " 2.096221 | \n",
+ " 5915.125000 | \n",
+ " 25.0 | \n",
+ " 19.0 | \n",
+ " 1816.0 | \n",
+ " 0.030252 | \n",
+ " 7841.080477 | \n",
+ " 3.787844e+06 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " 3 | \n",
+ " 5 | \n",
+ " 5 | \n",
+ " 0.984320 | \n",
+ " 23940.078947 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 1892.0 | \n",
+ " 0.022647 | \n",
+ " 7841.277327 | \n",
+ " 3.787843e+06 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " 123 | \n",
+ " 3 | \n",
+ " 124 | \n",
+ " 124 | \n",
+ " 1.955707 | \n",
+ " 9050.487805 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 1986.0 | \n",
+ " 0.046045 | \n",
+ " 7840.280937 | \n",
+ " 3.787843e+06 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " 124 | \n",
+ " 3 | \n",
+ " 125 | \n",
+ " 125 | \n",
+ " 1.440449 | \n",
+ " 9121.500000 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 1198.0 | \n",
+ " 0.039726 | \n",
+ " 7840.085072 | \n",
+ " 3.787843e+06 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " 125 | \n",
+ " 2 | \n",
+ " 126 | \n",
+ " 126 | \n",
+ " 0.985704 | \n",
+ " 8770.901961 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 555.0 | \n",
+ " 0.015125 | \n",
+ " 7839.890518 | \n",
+ " 3.787843e+06 | \n",
+ " 2 | \n",
+ "
\n",
+ " \n",
+ " 126 | \n",
+ " 4 | \n",
+ " 127 | \n",
+ " 127 | \n",
+ " 0.228593 | \n",
+ " 12266.085714 | \n",
+ " 25.0 | \n",
+ " 16.0 | \n",
+ " 814.0 | \n",
+ " 0.031125 | \n",
+ " 7839.696621 | \n",
+ " 3.787844e+06 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " 127 | \n",
+ " 4 | \n",
+ " 128 | \n",
+ " 128 | \n",
+ " 1.619940 | \n",
+ " 11077.037037 | \n",
+ " 25.0 | \n",
+ " 16.0 | \n",
+ " 1385.0 | \n",
+ " 0.059671 | \n",
+ " 7839.501980 | \n",
+ " 3.787843e+06 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
128 rows × 12 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Join_Count TARGET_FID BlockID BikeLane_miles AADT \\\n",
+ "0 0 1 1 NaN 32638.666667 \n",
+ "1 0 2 2 NaN NaN \n",
+ "2 3 3 3 0.807055 21234.741935 \n",
+ "3 3 4 4 2.096221 5915.125000 \n",
+ "4 3 5 5 0.984320 23940.078947 \n",
+ ".. ... ... ... ... ... \n",
+ "123 3 124 124 1.955707 9050.487805 \n",
+ "124 3 125 125 1.440449 9121.500000 \n",
+ "125 2 126 126 0.985704 8770.901961 \n",
+ "126 4 127 127 0.228593 12266.085714 \n",
+ "127 4 128 128 1.619940 11077.037037 \n",
+ "\n",
+ " SpeedLimit AvgSpeed Pop2019 Pop_Density Shape_Length Shape_Area \\\n",
+ "0 NaN NaN 0.0 0.000000 7840.490288 3.787844e+06 \n",
+ "1 NaN NaN 0.0 0.000000 7840.686448 3.787843e+06 \n",
+ "2 25.0 15.0 1049.0 0.029594 7840.882970 3.787843e+06 \n",
+ "3 25.0 19.0 1816.0 0.030252 7841.080477 3.787844e+06 \n",
+ "4 NaN NaN 1892.0 0.022647 7841.277327 3.787843e+06 \n",
+ ".. ... ... ... ... ... ... \n",
+ "123 NaN NaN 1986.0 0.046045 7840.280937 3.787843e+06 \n",
+ "124 NaN NaN 1198.0 0.039726 7840.085072 3.787843e+06 \n",
+ "125 NaN NaN 555.0 0.015125 7839.890518 3.787843e+06 \n",
+ "126 25.0 16.0 814.0 0.031125 7839.696621 3.787844e+06 \n",
+ "127 25.0 16.0 1385.0 0.059671 7839.501980 3.787843e+06 \n",
+ "\n",
+ " StationNum \n",
+ "0 0 \n",
+ "1 0 \n",
+ "2 3 \n",
+ "3 3 \n",
+ "4 3 \n",
+ ".. ... \n",
+ "123 3 \n",
+ "124 3 \n",
+ "125 2 \n",
+ "126 4 \n",
+ "127 4 \n",
+ "\n",
+ "[128 rows x 12 columns]"
+ ]
+ },
+ "execution_count": 48,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "spatio_data_file = \"./data/SpatialFeatures.csv\"\n",
+ "raw_spatio_feature = pd.read_csv(spatio_data_file)\n",
+ "raw_spatio_feature"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 49,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "bikeLane_matrix = raw_spatio_feature[\"BikeLane_miles\"]\n",
+ "bikeLane_matrix = bikeLane_matrix.fillna(0).to_numpy()\n",
+ "bikeLane_matrix = bikeLane_matrix/bikeLane_matrix.max()\n",
+ "bikeLane_matrix_board = bikeLane_matrix[np.newaxis,:] * np.ones((1248,1))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 60,
+ "metadata": {},
+ "outputs": [
+ {
+ "ename": "ValueError",
+ "evalue": "Graph disconnected: cannot obtain value for tensor KerasTensor(type_spec=TensorSpec(shape=(None, 128), dtype=tf.float32, name='input_31'), name='input_31', description=\"created by layer 'input_31'\") at layer \"concatenate_16\". The following previous layers were accessed without issue: ['lstm_25', 'dense_23']",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)",
+ "Cell \u001b[1;32mIn[60], line 24\u001b[0m\n\u001b[0;32m 20\u001b[0m x \u001b[38;5;241m=\u001b[39m layers\u001b[38;5;241m.\u001b[39mDense(\u001b[38;5;241m2\u001b[39m\u001b[38;5;241m*\u001b[39m\u001b[38;5;241m16\u001b[39m\u001b[38;5;241m*\u001b[39m\u001b[38;5;241m8\u001b[39m,activation\u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mrelu\u001b[39m\u001b[38;5;124m\"\u001b[39m) (x)\n\u001b[0;32m 22\u001b[0m output \u001b[38;5;241m=\u001b[39m layers\u001b[38;5;241m.\u001b[39mReshape((\u001b[38;5;241m2\u001b[39m,\u001b[38;5;241m16\u001b[39m,\u001b[38;5;241m8\u001b[39m))(x)\n\u001b[1;32m---> 24\u001b[0m model \u001b[38;5;241m=\u001b[39m \u001b[43mmodels\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mModel\u001b[49m\u001b[43m(\u001b[49m\u001b[43m[\u001b[49m\u001b[43mleft_inputs\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43moutputs\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43moutput\u001b[49m\u001b[43m)\u001b[49m\n",
+ "File \u001b[1;32md:\\Anoconda\\envs\\py38\\lib\\site-packages\\tensorflow\\python\\trackable\\base.py:204\u001b[0m, in \u001b[0;36mno_automatic_dependency_tracking.._method_wrapper\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 202\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_self_setattr_tracking \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m \u001b[38;5;66;03m# pylint: disable=protected-access\u001b[39;00m\n\u001b[0;32m 203\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m--> 204\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[43mmethod\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 205\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[0;32m 206\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_self_setattr_tracking \u001b[38;5;241m=\u001b[39m previous_value \u001b[38;5;66;03m# pylint: disable=protected-access\u001b[39;00m\n",
+ "File \u001b[1;32md:\\Anoconda\\envs\\py38\\lib\\site-packages\\keras\\src\\engine\\functional.py:167\u001b[0m, in \u001b[0;36mFunctional.__init__\u001b[1;34m(self, inputs, outputs, name, trainable, **kwargs)\u001b[0m\n\u001b[0;32m 158\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mall\u001b[39m(\n\u001b[0;32m 159\u001b[0m [\n\u001b[0;32m 160\u001b[0m functional_utils\u001b[38;5;241m.\u001b[39mis_input_keras_tensor(t)\n\u001b[0;32m 161\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m t \u001b[38;5;129;01min\u001b[39;00m tf\u001b[38;5;241m.\u001b[39mnest\u001b[38;5;241m.\u001b[39mflatten(inputs)\n\u001b[0;32m 162\u001b[0m ]\n\u001b[0;32m 163\u001b[0m ):\n\u001b[0;32m 164\u001b[0m inputs, outputs \u001b[38;5;241m=\u001b[39m functional_utils\u001b[38;5;241m.\u001b[39mclone_graph_nodes(\n\u001b[0;32m 165\u001b[0m inputs, outputs\n\u001b[0;32m 166\u001b[0m )\n\u001b[1;32m--> 167\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_init_graph_network\u001b[49m\u001b[43m(\u001b[49m\u001b[43minputs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43moutputs\u001b[49m\u001b[43m)\u001b[49m\n",
+ "File \u001b[1;32md:\\Anoconda\\envs\\py38\\lib\\site-packages\\tensorflow\\python\\trackable\\base.py:204\u001b[0m, in \u001b[0;36mno_automatic_dependency_tracking.._method_wrapper\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 202\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_self_setattr_tracking \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m \u001b[38;5;66;03m# pylint: disable=protected-access\u001b[39;00m\n\u001b[0;32m 203\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m--> 204\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[43mmethod\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 205\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[0;32m 206\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_self_setattr_tracking \u001b[38;5;241m=\u001b[39m previous_value \u001b[38;5;66;03m# pylint: disable=protected-access\u001b[39;00m\n",
+ "File \u001b[1;32md:\\Anoconda\\envs\\py38\\lib\\site-packages\\keras\\src\\engine\\functional.py:266\u001b[0m, in \u001b[0;36mFunctional._init_graph_network\u001b[1;34m(self, inputs, outputs)\u001b[0m\n\u001b[0;32m 263\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_input_coordinates\u001b[38;5;241m.\u001b[39mappend((layer, node_index, tensor_index))\n\u001b[0;32m 265\u001b[0m \u001b[38;5;66;03m# Keep track of the network's nodes and layers.\u001b[39;00m\n\u001b[1;32m--> 266\u001b[0m nodes, nodes_by_depth, layers, _ \u001b[38;5;241m=\u001b[39m \u001b[43m_map_graph_network\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 267\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minputs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moutputs\u001b[49m\n\u001b[0;32m 268\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 269\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_network_nodes \u001b[38;5;241m=\u001b[39m nodes\n\u001b[0;32m 270\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_nodes_by_depth \u001b[38;5;241m=\u001b[39m nodes_by_depth\n",
+ "File \u001b[1;32md:\\Anoconda\\envs\\py38\\lib\\site-packages\\keras\\src\\engine\\functional.py:1142\u001b[0m, in \u001b[0;36m_map_graph_network\u001b[1;34m(inputs, outputs)\u001b[0m\n\u001b[0;32m 1140\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m x \u001b[38;5;129;01min\u001b[39;00m tf\u001b[38;5;241m.\u001b[39mnest\u001b[38;5;241m.\u001b[39mflatten(node\u001b[38;5;241m.\u001b[39mkeras_inputs):\n\u001b[0;32m 1141\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mid\u001b[39m(x) \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m computable_tensors:\n\u001b[1;32m-> 1142\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[0;32m 1143\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mGraph disconnected: cannot obtain value for \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 1144\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mtensor \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mx\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m at layer \u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mlayer\u001b[38;5;241m.\u001b[39mname\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m. \u001b[39m\u001b[38;5;124m'\u001b[39m\n\u001b[0;32m 1145\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mThe following previous layers were accessed \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 1146\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mwithout issue: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mlayers_with_complete_input\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 1147\u001b[0m )\n\u001b[0;32m 1148\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m x \u001b[38;5;129;01min\u001b[39;00m tf\u001b[38;5;241m.\u001b[39mnest\u001b[38;5;241m.\u001b[39mflatten(node\u001b[38;5;241m.\u001b[39moutputs):\n\u001b[0;32m 1149\u001b[0m computable_tensors\u001b[38;5;241m.\u001b[39madd(\u001b[38;5;28mid\u001b[39m(x))\n",
+ "\u001b[1;31mValueError\u001b[0m: Graph disconnected: cannot obtain value for tensor KerasTensor(type_spec=TensorSpec(shape=(None, 128), dtype=tf.float32, name='input_31'), name='input_31', description=\"created by layer 'input_31'\") at layer \"concatenate_16\". The following previous layers were accessed without issue: ['lstm_25', 'dense_23']"
+ ]
+ }
+ ],
+ "source": [
+ "import keras\n",
+ "from keras import layers\n",
+ "from keras import models\n",
+ "\n",
+ "spatio_feature = None\n",
+ "\n",
+ "input_shape = (5,1)\n",
+ "\n",
+ "left_inputs = layers.Input(shape = (input_shape))\n",
+ "\n",
+ "right_inputs = layers.Input(shape = (128))\n",
+ "\n",
+ "x = layers.LSTM(128, activation = \"tanh\")(left_inputs)\n",
+ "\n",
+ "x = layers.Dense(2*16*8, activation = \"linear\")(x)\n",
+ "\n",
+ "\n",
+ "x = layers.concatenate([x,right_inputs])\n",
+ "\n",
+ "x = layers.Dense(2*16*8,activation= \"relu\") (x)\n",
+ "\n",
+ "output = layers.Reshape((2,16,8))(x)\n",
+ "\n",
+ "model = models.Model([left_inputs],outputs = output)\n",
+ "\n",
+ "\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 56,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Model: \"model_7\"\n",
+ "_________________________________________________________________\n",
+ " Layer (type) Output Shape Param # \n",
+ "=================================================================\n",
+ " input_24 (InputLayer) [(None, 5, 1)] 0 \n",
+ " \n",
+ " lstm_22 (LSTM) (None, 128) 66560 \n",
+ " \n",
+ " dense_17 (Dense) (None, 256) 33024 \n",
+ " \n",
+ " concatenate_13 (Concatenat (2, 384) 0 \n",
+ " e) \n",
+ " \n",
+ " dense_18 (Dense) (2, 256) 98560 \n",
+ " \n",
+ " reshape_8 (Reshape) (2, 2, 16, 8) 0 \n",
+ " \n",
+ "=================================================================\n",
+ "Total params: 198144 (774.00 KB)\n",
+ "Trainable params: 198144 (774.00 KB)\n",
+ "Non-trainable params: 0 (0.00 Byte)\n",
+ "_________________________________________________________________\n"
+ ]
+ }
+ ],
+ "source": [
+ "model.summary()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 55,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Epoch 1/50\n"
+ ]
+ },
+ {
+ "ename": "ValueError",
+ "evalue": "in user code:\n\n File \"d:\\Anoconda\\envs\\py38\\lib\\site-packages\\keras\\src\\engine\\training.py\", line 1338, in train_function *\n return step_function(self, iterator)\n File \"d:\\Anoconda\\envs\\py38\\lib\\site-packages\\keras\\src\\engine\\training.py\", line 1322, in step_function **\n outputs = model.distribute_strategy.run(run_step, args=(data,))\n File \"d:\\Anoconda\\envs\\py38\\lib\\site-packages\\keras\\src\\engine\\training.py\", line 1303, in run_step **\n outputs = model.train_step(data)\n File \"d:\\Anoconda\\envs\\py38\\lib\\site-packages\\keras\\src\\engine\\training.py\", line 1080, in train_step\n y_pred = self(x, training=True)\n File \"d:\\Anoconda\\envs\\py38\\lib\\site-packages\\keras\\src\\utils\\traceback_utils.py\", line 70, in error_handler\n raise e.with_traceback(filtered_tb) from None\n File \"d:\\Anoconda\\envs\\py38\\lib\\site-packages\\keras\\src\\backend.py\", line 3582, in concatenate\n return tf.concat([to_dense(x) for x in tensors], axis)\n\n ValueError: Exception encountered when calling layer 'concatenate_13' (type Concatenate).\n \n Dimension 0 in both shapes must be equal, but are 32 and 2. Shapes are [32] and [2]. for '{{node model_7/concatenate_13/concat}} = ConcatV2[N=2, T=DT_FLOAT, Tidx=DT_INT32](model_7/dense_17/BiasAdd, model_7/concatenate_13/Cast, model_7/concatenate_13/concat/axis)' with input shapes: [32,256], [2,128], [] and with computed input tensors: input[2] = <1>.\n \n Call arguments received by layer 'concatenate_13' (type Concatenate):\n • inputs=['tf.Tensor(shape=(32, 256), dtype=float32)', 'tf.Tensor(shape=(2, 128), dtype=float32)']\n",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)",
+ "Cell \u001b[1;32mIn[55], line 2\u001b[0m\n\u001b[0;32m 1\u001b[0m model\u001b[38;5;241m.\u001b[39mcompile(optimizer\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124madam\u001b[39m\u001b[38;5;124m'\u001b[39m, loss\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmse\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m----> 2\u001b[0m \u001b[43mmodel\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfit\u001b[49m\u001b[43m(\u001b[49m\u001b[43m[\u001b[49m\u001b[43mX_train\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43my_train\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mepochs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m50\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mbatch_size\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m32\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mvalidation_data\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m[\u001b[49m\u001b[43mX_test\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43my_test\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n",
+ "File \u001b[1;32md:\\Anoconda\\envs\\py38\\lib\\site-packages\\keras\\src\\utils\\traceback_utils.py:70\u001b[0m, in \u001b[0;36mfilter_traceback..error_handler\u001b[1;34m(*args, **kwargs)\u001b[0m\n\u001b[0;32m 67\u001b[0m filtered_tb \u001b[38;5;241m=\u001b[39m _process_traceback_frames(e\u001b[38;5;241m.\u001b[39m__traceback__)\n\u001b[0;32m 68\u001b[0m \u001b[38;5;66;03m# To get the full stack trace, call:\u001b[39;00m\n\u001b[0;32m 69\u001b[0m \u001b[38;5;66;03m# `tf.debugging.disable_traceback_filtering()`\u001b[39;00m\n\u001b[1;32m---> 70\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m e\u001b[38;5;241m.\u001b[39mwith_traceback(filtered_tb) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m 71\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[0;32m 72\u001b[0m \u001b[38;5;28;01mdel\u001b[39;00m filtered_tb\n",
+ "File \u001b[1;32m~\\AppData\\Local\\Temp\\__autograph_generated_fileootg_h1c.py:15\u001b[0m, in \u001b[0;36mouter_factory..inner_factory..tf__train_function\u001b[1;34m(iterator)\u001b[0m\n\u001b[0;32m 13\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m 14\u001b[0m do_return \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mTrue\u001b[39;00m\n\u001b[1;32m---> 15\u001b[0m retval_ \u001b[38;5;241m=\u001b[39m ag__\u001b[38;5;241m.\u001b[39mconverted_call(ag__\u001b[38;5;241m.\u001b[39mld(step_function), (ag__\u001b[38;5;241m.\u001b[39mld(\u001b[38;5;28mself\u001b[39m), ag__\u001b[38;5;241m.\u001b[39mld(iterator)), \u001b[38;5;28;01mNone\u001b[39;00m, fscope)\n\u001b[0;32m 16\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m:\n\u001b[0;32m 17\u001b[0m do_return \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m\n",
+ "\u001b[1;31mValueError\u001b[0m: in user code:\n\n File \"d:\\Anoconda\\envs\\py38\\lib\\site-packages\\keras\\src\\engine\\training.py\", line 1338, in train_function *\n return step_function(self, iterator)\n File \"d:\\Anoconda\\envs\\py38\\lib\\site-packages\\keras\\src\\engine\\training.py\", line 1322, in step_function **\n outputs = model.distribute_strategy.run(run_step, args=(data,))\n File \"d:\\Anoconda\\envs\\py38\\lib\\site-packages\\keras\\src\\engine\\training.py\", line 1303, in run_step **\n outputs = model.train_step(data)\n File \"d:\\Anoconda\\envs\\py38\\lib\\site-packages\\keras\\src\\engine\\training.py\", line 1080, in train_step\n y_pred = self(x, training=True)\n File \"d:\\Anoconda\\envs\\py38\\lib\\site-packages\\keras\\src\\utils\\traceback_utils.py\", line 70, in error_handler\n raise e.with_traceback(filtered_tb) from None\n File \"d:\\Anoconda\\envs\\py38\\lib\\site-packages\\keras\\src\\backend.py\", line 3582, in concatenate\n return tf.concat([to_dense(x) for x in tensors], axis)\n\n ValueError: Exception encountered when calling layer 'concatenate_13' (type Concatenate).\n \n Dimension 0 in both shapes must be equal, but are 32 and 2. Shapes are [32] and [2]. for '{{node model_7/concatenate_13/concat}} = ConcatV2[N=2, T=DT_FLOAT, Tidx=DT_INT32](model_7/dense_17/BiasAdd, model_7/concatenate_13/Cast, model_7/concatenate_13/concat/axis)' with input shapes: [32,256], [2,128], [] and with computed input tensors: input[2] = <1>.\n \n Call arguments received by layer 'concatenate_13' (type Concatenate):\n • inputs=['tf.Tensor(shape=(32, 256), dtype=float32)', 'tf.Tensor(shape=(2, 128), dtype=float32)']\n"
+ ]
+ }
+ ],
+ "source": [
+ "model.compile(optimizer='adam', loss='mse')\n",
+ "model.fit([X_train], y_train, epochs=50, batch_size=32, validation_data=([X_test], y_test))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 39,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "8/8 [==============================] - 0s 1ms/step - loss: 56.9645\n",
+ "Root Mean Squared Error: 7.5474830524649805\n"
+ ]
+ }
+ ],
+ "source": [
+ "mse = model.evaluate(X_test, y_test)\n",
+ "\n",
+ "# Show rmse to see how model performs on the test set\n",
+ "rmse = np.sqrt(mse)\n",
+ "print(f'Root Mean Squared Error: {rmse}')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "py38",
+ "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.18"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/model_v3_yshape.ipynb b/model_v3_yshape.ipynb
new file mode 100644
index 0000000..e901e48
--- /dev/null
+++ b/model_v3_yshape.ipynb
@@ -0,0 +1,628 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import h5py\n",
+ "import numpy as np\n",
+ "from datetime import datetime\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "with h5py.File('./data/TrainingData.h5', 'r') as f:\n",
+ " # Access the trip dataset and their corresponding timestamps\n",
+ " traffic_data = f['trip'][()]\n",
+ " dates = f['timeslot'][()]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "formatted_dates = []\n",
+ "\n",
+ "for date_string in dates:\n",
+ " formatted_date = datetime.strptime(date_string.decode(), '%Y%m%d%H%M')\n",
+ "\n",
+ " year = formatted_date.year\n",
+ " month = formatted_date.month\n",
+ " day = formatted_date.day\n",
+ " hour = formatted_date.hour\n",
+ " minute = formatted_date.minute\n",
+ "\n",
+ " formatted_dates.append(np.array([year, month, day, hour, minute]))\n",
+ "\n",
+ "formatted_dates = np.array(formatted_dates).reshape(1488, 5, 1)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "test_size = 240\n",
+ "\n",
+ "train_traffic_data = traffic_data[:-test_size]\n",
+ "test_traffic_data = traffic_data[-test_size:]\n",
+ "\n",
+ "train_formatted_dates = formatted_dates[:-test_size]\n",
+ "test_formatted_dates = formatted_dates[-test_size:]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "X_train, X_test = train_formatted_dates, test_formatted_dates\n",
+ "y_train, y_test = train_traffic_data, test_traffic_data"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import pandas as pd\n",
+ "import numpy as np\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " Join_Count | \n",
+ " TARGET_FID | \n",
+ " BlockID | \n",
+ " BikeLane_miles | \n",
+ " AADT | \n",
+ " SpeedLimit | \n",
+ " AvgSpeed | \n",
+ " Pop2019 | \n",
+ " Pop_Density | \n",
+ " Shape_Length | \n",
+ " Shape_Area | \n",
+ " StationNum | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 1 | \n",
+ " NaN | \n",
+ " 32638.666667 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0.0 | \n",
+ " 0.000000 | \n",
+ " 7840.490288 | \n",
+ " 3.787844e+06 | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 2 | \n",
+ " 2 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0.0 | \n",
+ " 0.000000 | \n",
+ " 7840.686448 | \n",
+ " 3.787843e+06 | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " 3 | \n",
+ " 3 | \n",
+ " 3 | \n",
+ " 0.807055 | \n",
+ " 21234.741935 | \n",
+ " 25.0 | \n",
+ " 15.0 | \n",
+ " 1049.0 | \n",
+ " 0.029594 | \n",
+ " 7840.882970 | \n",
+ " 3.787843e+06 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " 3 | \n",
+ " 4 | \n",
+ " 4 | \n",
+ " 2.096221 | \n",
+ " 5915.125000 | \n",
+ " 25.0 | \n",
+ " 19.0 | \n",
+ " 1816.0 | \n",
+ " 0.030252 | \n",
+ " 7841.080477 | \n",
+ " 3.787844e+06 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " 3 | \n",
+ " 5 | \n",
+ " 5 | \n",
+ " 0.984320 | \n",
+ " 23940.078947 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 1892.0 | \n",
+ " 0.022647 | \n",
+ " 7841.277327 | \n",
+ " 3.787843e+06 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " 123 | \n",
+ " 3 | \n",
+ " 124 | \n",
+ " 124 | \n",
+ " 1.955707 | \n",
+ " 9050.487805 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 1986.0 | \n",
+ " 0.046045 | \n",
+ " 7840.280937 | \n",
+ " 3.787843e+06 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " 124 | \n",
+ " 3 | \n",
+ " 125 | \n",
+ " 125 | \n",
+ " 1.440449 | \n",
+ " 9121.500000 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 1198.0 | \n",
+ " 0.039726 | \n",
+ " 7840.085072 | \n",
+ " 3.787843e+06 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " 125 | \n",
+ " 2 | \n",
+ " 126 | \n",
+ " 126 | \n",
+ " 0.985704 | \n",
+ " 8770.901961 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 555.0 | \n",
+ " 0.015125 | \n",
+ " 7839.890518 | \n",
+ " 3.787843e+06 | \n",
+ " 2 | \n",
+ "
\n",
+ " \n",
+ " 126 | \n",
+ " 4 | \n",
+ " 127 | \n",
+ " 127 | \n",
+ " 0.228593 | \n",
+ " 12266.085714 | \n",
+ " 25.0 | \n",
+ " 16.0 | \n",
+ " 814.0 | \n",
+ " 0.031125 | \n",
+ " 7839.696621 | \n",
+ " 3.787844e+06 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " 127 | \n",
+ " 4 | \n",
+ " 128 | \n",
+ " 128 | \n",
+ " 1.619940 | \n",
+ " 11077.037037 | \n",
+ " 25.0 | \n",
+ " 16.0 | \n",
+ " 1385.0 | \n",
+ " 0.059671 | \n",
+ " 7839.501980 | \n",
+ " 3.787843e+06 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
128 rows × 12 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Join_Count TARGET_FID BlockID BikeLane_miles AADT \\\n",
+ "0 0 1 1 NaN 32638.666667 \n",
+ "1 0 2 2 NaN NaN \n",
+ "2 3 3 3 0.807055 21234.741935 \n",
+ "3 3 4 4 2.096221 5915.125000 \n",
+ "4 3 5 5 0.984320 23940.078947 \n",
+ ".. ... ... ... ... ... \n",
+ "123 3 124 124 1.955707 9050.487805 \n",
+ "124 3 125 125 1.440449 9121.500000 \n",
+ "125 2 126 126 0.985704 8770.901961 \n",
+ "126 4 127 127 0.228593 12266.085714 \n",
+ "127 4 128 128 1.619940 11077.037037 \n",
+ "\n",
+ " SpeedLimit AvgSpeed Pop2019 Pop_Density Shape_Length Shape_Area \\\n",
+ "0 NaN NaN 0.0 0.000000 7840.490288 3.787844e+06 \n",
+ "1 NaN NaN 0.0 0.000000 7840.686448 3.787843e+06 \n",
+ "2 25.0 15.0 1049.0 0.029594 7840.882970 3.787843e+06 \n",
+ "3 25.0 19.0 1816.0 0.030252 7841.080477 3.787844e+06 \n",
+ "4 NaN NaN 1892.0 0.022647 7841.277327 3.787843e+06 \n",
+ ".. ... ... ... ... ... ... \n",
+ "123 NaN NaN 1986.0 0.046045 7840.280937 3.787843e+06 \n",
+ "124 NaN NaN 1198.0 0.039726 7840.085072 3.787843e+06 \n",
+ "125 NaN NaN 555.0 0.015125 7839.890518 3.787843e+06 \n",
+ "126 25.0 16.0 814.0 0.031125 7839.696621 3.787844e+06 \n",
+ "127 25.0 16.0 1385.0 0.059671 7839.501980 3.787843e+06 \n",
+ "\n",
+ " StationNum \n",
+ "0 0 \n",
+ "1 0 \n",
+ "2 3 \n",
+ "3 3 \n",
+ "4 3 \n",
+ ".. ... \n",
+ "123 3 \n",
+ "124 3 \n",
+ "125 2 \n",
+ "126 4 \n",
+ "127 4 \n",
+ "\n",
+ "[128 rows x 12 columns]"
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "spatio_data_file = \"./data/SpatialFeatures.csv\"\n",
+ "raw_spatio_feature = pd.read_csv(spatio_data_file)\n",
+ "raw_spatio_feature"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "bikeLane_matrix = raw_spatio_feature[\"BikeLane_miles\"]\n",
+ "bikeLane_matrix = bikeLane_matrix.fillna(0).to_numpy()\n",
+ "bikeLane_matrix = bikeLane_matrix/bikeLane_matrix.max()\n",
+ "bikeLane_matrix_board = bikeLane_matrix[np.newaxis,:] * np.ones((1248,1))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import keras\n",
+ "from keras import layers\n",
+ "from keras import models\n",
+ "\n",
+ "spatio_feature = None\n",
+ "\n",
+ "input_shape = (5,1)\n",
+ "\n",
+ "left_inputs = layers.Input(shape = (input_shape))\n",
+ "\n",
+ "x = layers.LSTM(128, activation = \"tanh\")(left_inputs)\n",
+ "\n",
+ "x = layers.Dense(2*16*8, activation = \"linear\")(x)\n",
+ "\n",
+ "right_inputs = layers.Input(shape = (input_shape))\n",
+ "\n",
+ "y = layers.LSTM(128,activation= \"tanh\")(right_inputs)\n",
+ "\n",
+ "y = layers.Dense(2*16*8,activation= \"relu\")(y)\n",
+ "\n",
+ "x = layers.concatenate([x,y])\n",
+ "\n",
+ "x = layers.Dense(2*16*8,activation= \"relu\") (x)\n",
+ "\n",
+ "output = layers.Reshape((2,16,8))(x)\n",
+ "\n",
+ "model = models.Model([left_inputs,right_inputs],outputs = output)\n",
+ "\n",
+ "\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Model: \"model_2\"\n",
+ "__________________________________________________________________________________________________\n",
+ " Layer (type) Output Shape Param # Connected to \n",
+ "==================================================================================================\n",
+ " input_5 (InputLayer) [(None, 5, 1)] 0 [] \n",
+ " \n",
+ " input_6 (InputLayer) [(None, 5, 1)] 0 [] \n",
+ " \n",
+ " lstm_4 (LSTM) (None, 128) 66560 ['input_5[0][0]'] \n",
+ " \n",
+ " lstm_5 (LSTM) (None, 128) 66560 ['input_6[0][0]'] \n",
+ " \n",
+ " dense_6 (Dense) (None, 256) 33024 ['lstm_4[0][0]'] \n",
+ " \n",
+ " dense_7 (Dense) (None, 256) 33024 ['lstm_5[0][0]'] \n",
+ " \n",
+ " concatenate_2 (Concatenate (None, 512) 0 ['dense_6[0][0]', \n",
+ " ) 'dense_7[0][0]'] \n",
+ " \n",
+ " dense_8 (Dense) (None, 256) 131328 ['concatenate_2[0][0]'] \n",
+ " \n",
+ " reshape_2 (Reshape) (None, 2, 16, 8) 0 ['dense_8[0][0]'] \n",
+ " \n",
+ "==================================================================================================\n",
+ "Total params: 330496 (1.26 MB)\n",
+ "Trainable params: 330496 (1.26 MB)\n",
+ "Non-trainable params: 0 (0.00 Byte)\n",
+ "__________________________________________________________________________________________________\n"
+ ]
+ }
+ ],
+ "source": [
+ "model.summary()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Epoch 1/50\n",
+ "39/39 [==============================] - 2s 15ms/step - loss: 54.8777 - val_loss: 51.2985\n",
+ "Epoch 2/50\n",
+ "39/39 [==============================] - 0s 4ms/step - loss: 55.1405 - val_loss: 54.7360\n",
+ "Epoch 3/50\n",
+ "39/39 [==============================] - 0s 4ms/step - loss: 55.2071 - val_loss: 52.4979\n",
+ "Epoch 4/50\n",
+ "39/39 [==============================] - 0s 4ms/step - loss: 53.2430 - val_loss: 64.0301\n",
+ "Epoch 5/50\n",
+ "39/39 [==============================] - 0s 4ms/step - loss: 53.3346 - val_loss: 49.7368\n",
+ "Epoch 6/50\n",
+ "39/39 [==============================] - 0s 4ms/step - loss: 53.5821 - val_loss: 53.5882\n",
+ "Epoch 7/50\n",
+ "39/39 [==============================] - 0s 4ms/step - loss: 54.0866 - val_loss: 57.8746\n",
+ "Epoch 8/50\n",
+ "39/39 [==============================] - 0s 4ms/step - loss: 55.6869 - val_loss: 64.1826\n",
+ "Epoch 9/50\n",
+ "39/39 [==============================] - 0s 4ms/step - loss: 53.7663 - val_loss: 61.7465\n",
+ "Epoch 10/50\n",
+ "39/39 [==============================] - 0s 4ms/step - loss: 54.7494 - val_loss: 65.6936\n",
+ "Epoch 11/50\n",
+ "39/39 [==============================] - 0s 4ms/step - loss: 53.1544 - val_loss: 52.5802\n",
+ "Epoch 12/50\n",
+ "39/39 [==============================] - 0s 4ms/step - loss: 55.2133 - val_loss: 56.6710\n",
+ "Epoch 13/50\n",
+ "39/39 [==============================] - 0s 4ms/step - loss: 54.6228 - val_loss: 55.5211\n",
+ "Epoch 14/50\n",
+ "39/39 [==============================] - 0s 4ms/step - loss: 52.1401 - val_loss: 58.5715\n",
+ "Epoch 15/50\n",
+ "39/39 [==============================] - 0s 4ms/step - loss: 52.5612 - val_loss: 58.7202\n",
+ "Epoch 16/50\n",
+ "39/39 [==============================] - 0s 4ms/step - loss: 53.4948 - val_loss: 59.2302\n",
+ "Epoch 17/50\n",
+ "39/39 [==============================] - 0s 4ms/step - loss: 52.5986 - val_loss: 48.9652\n",
+ "Epoch 18/50\n",
+ "39/39 [==============================] - 0s 4ms/step - loss: 51.9470 - val_loss: 64.2186\n",
+ "Epoch 19/50\n",
+ "39/39 [==============================] - 0s 4ms/step - loss: 55.1345 - val_loss: 53.9188\n",
+ "Epoch 20/50\n",
+ "39/39 [==============================] - 0s 4ms/step - loss: 52.8832 - val_loss: 66.7527\n",
+ "Epoch 21/50\n",
+ "39/39 [==============================] - 0s 4ms/step - loss: 53.5199 - val_loss: 48.4578\n",
+ "Epoch 22/50\n",
+ "39/39 [==============================] - 0s 4ms/step - loss: 53.8766 - val_loss: 51.3250\n",
+ "Epoch 23/50\n",
+ "39/39 [==============================] - 0s 4ms/step - loss: 50.4563 - val_loss: 60.5626\n",
+ "Epoch 24/50\n",
+ "39/39 [==============================] - 0s 4ms/step - loss: 51.8139 - val_loss: 52.1807\n",
+ "Epoch 25/50\n",
+ "39/39 [==============================] - 0s 4ms/step - loss: 49.4824 - val_loss: 60.1553\n",
+ "Epoch 26/50\n",
+ "39/39 [==============================] - 0s 4ms/step - loss: 49.2602 - val_loss: 60.9033\n",
+ "Epoch 27/50\n",
+ "39/39 [==============================] - 0s 4ms/step - loss: 51.0772 - val_loss: 58.1736\n",
+ "Epoch 28/50\n",
+ "39/39 [==============================] - 0s 4ms/step - loss: 49.2613 - val_loss: 58.5493\n",
+ "Epoch 29/50\n",
+ "39/39 [==============================] - 0s 4ms/step - loss: 49.6795 - val_loss: 65.7093\n",
+ "Epoch 30/50\n",
+ "39/39 [==============================] - 0s 4ms/step - loss: 50.2725 - val_loss: 58.2873\n",
+ "Epoch 31/50\n",
+ "39/39 [==============================] - 0s 4ms/step - loss: 52.4984 - val_loss: 65.8380\n",
+ "Epoch 32/50\n",
+ "39/39 [==============================] - 0s 4ms/step - loss: 52.5961 - val_loss: 63.5864\n",
+ "Epoch 33/50\n",
+ "39/39 [==============================] - 0s 4ms/step - loss: 49.4923 - val_loss: 51.8561\n",
+ "Epoch 34/50\n",
+ "39/39 [==============================] - 0s 4ms/step - loss: 51.5506 - val_loss: 60.6100\n",
+ "Epoch 35/50\n",
+ "39/39 [==============================] - 0s 4ms/step - loss: 48.5454 - val_loss: 70.8238\n",
+ "Epoch 36/50\n",
+ "39/39 [==============================] - 0s 4ms/step - loss: 49.0989 - val_loss: 67.8033\n",
+ "Epoch 37/50\n",
+ "39/39 [==============================] - 0s 4ms/step - loss: 48.3473 - val_loss: 50.0989\n",
+ "Epoch 38/50\n",
+ "39/39 [==============================] - 0s 4ms/step - loss: 48.2508 - val_loss: 54.6217\n",
+ "Epoch 39/50\n",
+ "39/39 [==============================] - 0s 4ms/step - loss: 48.6460 - val_loss: 65.7264\n",
+ "Epoch 40/50\n",
+ "39/39 [==============================] - 0s 4ms/step - loss: 48.6715 - val_loss: 66.6947\n",
+ "Epoch 41/50\n",
+ "39/39 [==============================] - 0s 4ms/step - loss: 49.4361 - val_loss: 50.9359\n",
+ "Epoch 42/50\n",
+ "39/39 [==============================] - 0s 4ms/step - loss: 47.1807 - val_loss: 55.0176\n",
+ "Epoch 43/50\n",
+ "39/39 [==============================] - 0s 4ms/step - loss: 51.3290 - val_loss: 45.2042\n",
+ "Epoch 44/50\n",
+ "39/39 [==============================] - 0s 4ms/step - loss: 48.1886 - val_loss: 48.6589\n",
+ "Epoch 45/50\n",
+ "39/39 [==============================] - 0s 4ms/step - loss: 47.7480 - val_loss: 54.7440\n",
+ "Epoch 46/50\n",
+ "39/39 [==============================] - 0s 4ms/step - loss: 47.5081 - val_loss: 56.8295\n",
+ "Epoch 47/50\n",
+ "39/39 [==============================] - 0s 4ms/step - loss: 46.0584 - val_loss: 50.8201\n",
+ "Epoch 48/50\n",
+ "39/39 [==============================] - 0s 4ms/step - loss: 45.7069 - val_loss: 52.5394\n",
+ "Epoch 49/50\n",
+ "39/39 [==============================] - 0s 4ms/step - loss: 46.6425 - val_loss: 52.1247\n",
+ "Epoch 50/50\n",
+ "39/39 [==============================] - 0s 4ms/step - loss: 47.2073 - val_loss: 51.9383\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 15,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "model.compile(optimizer='adam', loss='mse')\n",
+ "model.fit([X_train,X_train], y_train, epochs=50, batch_size=32, validation_data=([X_test,X_test], y_test))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "8/8 [==============================] - 0s 1ms/step - loss: 51.9383\n",
+ "Root Mean Squared Error: 7.206825348515386\n"
+ ]
+ }
+ ],
+ "source": [
+ "mse = model.evaluate([X_test,X_test], y_test)\n",
+ "\n",
+ "# Show rmse to see how model performs on the test set\n",
+ "rmse = np.sqrt(mse)\n",
+ "print(f'Root Mean Squared Error: {rmse}')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "py38",
+ "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.18"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/model_v4_static_feature.ipynb b/model_v4_static_feature.ipynb
new file mode 100644
index 0000000..28769ad
--- /dev/null
+++ b/model_v4_static_feature.ipynb
@@ -0,0 +1,634 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import h5py\n",
+ "import numpy as np\n",
+ "from datetime import datetime\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "with h5py.File('./data/TrainingData.h5', 'r') as f:\n",
+ " # Access the trip dataset and their corresponding timestamps\n",
+ " traffic_data = f['trip'][()]\n",
+ " dates = f['timeslot'][()]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "formatted_dates = []\n",
+ "\n",
+ "for date_string in dates:\n",
+ " formatted_date = datetime.strptime(date_string.decode(), '%Y%m%d%H%M')\n",
+ "\n",
+ " year = formatted_date.year\n",
+ " month = formatted_date.month\n",
+ " day = formatted_date.day\n",
+ " hour = formatted_date.hour\n",
+ " minute = formatted_date.minute\n",
+ "\n",
+ " formatted_dates.append(np.array([year, month, day, hour, minute]))\n",
+ "\n",
+ "formatted_dates = np.array(formatted_dates).reshape(1488, 5, 1)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "test_size = 240\n",
+ "\n",
+ "train_traffic_data = traffic_data[:-test_size]\n",
+ "test_traffic_data = traffic_data[-test_size:]\n",
+ "\n",
+ "train_formatted_dates = formatted_dates[:-test_size]\n",
+ "test_formatted_dates = formatted_dates[-test_size:]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "X_train, X_test = train_formatted_dates, test_formatted_dates\n",
+ "y_train, y_test = train_traffic_data, test_traffic_data"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import pandas as pd\n",
+ "import numpy as np\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " Join_Count | \n",
+ " TARGET_FID | \n",
+ " BlockID | \n",
+ " BikeLane_miles | \n",
+ " AADT | \n",
+ " SpeedLimit | \n",
+ " AvgSpeed | \n",
+ " Pop2019 | \n",
+ " Pop_Density | \n",
+ " Shape_Length | \n",
+ " Shape_Area | \n",
+ " StationNum | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 1 | \n",
+ " NaN | \n",
+ " 32638.666667 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0.0 | \n",
+ " 0.000000 | \n",
+ " 7840.490288 | \n",
+ " 3.787844e+06 | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 2 | \n",
+ " 2 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0.0 | \n",
+ " 0.000000 | \n",
+ " 7840.686448 | \n",
+ " 3.787843e+06 | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " 3 | \n",
+ " 3 | \n",
+ " 3 | \n",
+ " 0.807055 | \n",
+ " 21234.741935 | \n",
+ " 25.0 | \n",
+ " 15.0 | \n",
+ " 1049.0 | \n",
+ " 0.029594 | \n",
+ " 7840.882970 | \n",
+ " 3.787843e+06 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " 3 | \n",
+ " 4 | \n",
+ " 4 | \n",
+ " 2.096221 | \n",
+ " 5915.125000 | \n",
+ " 25.0 | \n",
+ " 19.0 | \n",
+ " 1816.0 | \n",
+ " 0.030252 | \n",
+ " 7841.080477 | \n",
+ " 3.787844e+06 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " 3 | \n",
+ " 5 | \n",
+ " 5 | \n",
+ " 0.984320 | \n",
+ " 23940.078947 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 1892.0 | \n",
+ " 0.022647 | \n",
+ " 7841.277327 | \n",
+ " 3.787843e+06 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " 123 | \n",
+ " 3 | \n",
+ " 124 | \n",
+ " 124 | \n",
+ " 1.955707 | \n",
+ " 9050.487805 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 1986.0 | \n",
+ " 0.046045 | \n",
+ " 7840.280937 | \n",
+ " 3.787843e+06 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " 124 | \n",
+ " 3 | \n",
+ " 125 | \n",
+ " 125 | \n",
+ " 1.440449 | \n",
+ " 9121.500000 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 1198.0 | \n",
+ " 0.039726 | \n",
+ " 7840.085072 | \n",
+ " 3.787843e+06 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " 125 | \n",
+ " 2 | \n",
+ " 126 | \n",
+ " 126 | \n",
+ " 0.985704 | \n",
+ " 8770.901961 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 555.0 | \n",
+ " 0.015125 | \n",
+ " 7839.890518 | \n",
+ " 3.787843e+06 | \n",
+ " 2 | \n",
+ "
\n",
+ " \n",
+ " 126 | \n",
+ " 4 | \n",
+ " 127 | \n",
+ " 127 | \n",
+ " 0.228593 | \n",
+ " 12266.085714 | \n",
+ " 25.0 | \n",
+ " 16.0 | \n",
+ " 814.0 | \n",
+ " 0.031125 | \n",
+ " 7839.696621 | \n",
+ " 3.787844e+06 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " 127 | \n",
+ " 4 | \n",
+ " 128 | \n",
+ " 128 | \n",
+ " 1.619940 | \n",
+ " 11077.037037 | \n",
+ " 25.0 | \n",
+ " 16.0 | \n",
+ " 1385.0 | \n",
+ " 0.059671 | \n",
+ " 7839.501980 | \n",
+ " 3.787843e+06 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
128 rows × 12 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Join_Count TARGET_FID BlockID BikeLane_miles AADT \\\n",
+ "0 0 1 1 NaN 32638.666667 \n",
+ "1 0 2 2 NaN NaN \n",
+ "2 3 3 3 0.807055 21234.741935 \n",
+ "3 3 4 4 2.096221 5915.125000 \n",
+ "4 3 5 5 0.984320 23940.078947 \n",
+ ".. ... ... ... ... ... \n",
+ "123 3 124 124 1.955707 9050.487805 \n",
+ "124 3 125 125 1.440449 9121.500000 \n",
+ "125 2 126 126 0.985704 8770.901961 \n",
+ "126 4 127 127 0.228593 12266.085714 \n",
+ "127 4 128 128 1.619940 11077.037037 \n",
+ "\n",
+ " SpeedLimit AvgSpeed Pop2019 Pop_Density Shape_Length Shape_Area \\\n",
+ "0 NaN NaN 0.0 0.000000 7840.490288 3.787844e+06 \n",
+ "1 NaN NaN 0.0 0.000000 7840.686448 3.787843e+06 \n",
+ "2 25.0 15.0 1049.0 0.029594 7840.882970 3.787843e+06 \n",
+ "3 25.0 19.0 1816.0 0.030252 7841.080477 3.787844e+06 \n",
+ "4 NaN NaN 1892.0 0.022647 7841.277327 3.787843e+06 \n",
+ ".. ... ... ... ... ... ... \n",
+ "123 NaN NaN 1986.0 0.046045 7840.280937 3.787843e+06 \n",
+ "124 NaN NaN 1198.0 0.039726 7840.085072 3.787843e+06 \n",
+ "125 NaN NaN 555.0 0.015125 7839.890518 3.787843e+06 \n",
+ "126 25.0 16.0 814.0 0.031125 7839.696621 3.787844e+06 \n",
+ "127 25.0 16.0 1385.0 0.059671 7839.501980 3.787843e+06 \n",
+ "\n",
+ " StationNum \n",
+ "0 0 \n",
+ "1 0 \n",
+ "2 3 \n",
+ "3 3 \n",
+ "4 3 \n",
+ ".. ... \n",
+ "123 3 \n",
+ "124 3 \n",
+ "125 2 \n",
+ "126 4 \n",
+ "127 4 \n",
+ "\n",
+ "[128 rows x 12 columns]"
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "spatio_data_file = \"./data/SpatialFeatures.csv\"\n",
+ "raw_spatio_feature = pd.read_csv(spatio_data_file)\n",
+ "raw_spatio_feature"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "bikeLane_matrix = raw_spatio_feature[\"BikeLane_miles\"]\n",
+ "bikeLane_matrix = bikeLane_matrix.fillna(0).to_numpy()\n",
+ "bikeLane_matrix = bikeLane_matrix/bikeLane_matrix.max()\n",
+ "bikeLane_matrix_board = bikeLane_matrix[np.newaxis,:] * np.ones((1248,1))\n",
+ "\n",
+ "\n",
+ "static_input = bikeLane_matrix_board\n",
+ "static_input_test = bikeLane_matrix[np.newaxis,:] * np.ones((240,1))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 32,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import keras\n",
+ "from keras import layers\n",
+ "from keras import models\n",
+ "\n",
+ "spatio_feature = None\n",
+ "\n",
+ "input_shape = (5,1)\n",
+ "\n",
+ "static_input_shape = (128)\n",
+ "\n",
+ "left_inputs = layers.Input(shape = (input_shape))\n",
+ "\n",
+ "x = layers.LSTM(128, activation = \"tanh\")(left_inputs)\n",
+ "\n",
+ "# x = layers.Dense(16*8, activation = \"linear\")(x)\n",
+ "\n",
+ "right_inputs = layers.Input(shape = (static_input_shape))\n",
+ "\n",
+ "y = right_inputs\n",
+ "\n",
+ "\n",
+ "x = layers.concatenate([x,y])\n",
+ "\n",
+ "x = layers.Dense(2*16*8,activation= \"relu\") (x)\n",
+ "\n",
+ "output = layers.Reshape((2,16,8))(x)\n",
+ "\n",
+ "model = models.Model([left_inputs,right_inputs],outputs = output)\n",
+ "\n",
+ "\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 33,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Model: \"model_2\"\n",
+ "__________________________________________________________________________________________________\n",
+ " Layer (type) Output Shape Param # Connected to \n",
+ "==================================================================================================\n",
+ " input_9 (InputLayer) [(None, 5, 1)] 0 [] \n",
+ " \n",
+ " lstm_4 (LSTM) (None, 128) 66560 ['input_9[0][0]'] \n",
+ " \n",
+ " input_10 (InputLayer) [(None, 128)] 0 [] \n",
+ " \n",
+ " concatenate_4 (Concatenate (None, 256) 0 ['lstm_4[0][0]', \n",
+ " ) 'input_10[0][0]'] \n",
+ " \n",
+ " dense_6 (Dense) (None, 256) 65792 ['concatenate_4[0][0]'] \n",
+ " \n",
+ " reshape_2 (Reshape) (None, 2, 16, 8) 0 ['dense_6[0][0]'] \n",
+ " \n",
+ "==================================================================================================\n",
+ "Total params: 132352 (517.00 KB)\n",
+ "Trainable params: 132352 (517.00 KB)\n",
+ "Non-trainable params: 0 (0.00 Byte)\n",
+ "__________________________________________________________________________________________________\n"
+ ]
+ }
+ ],
+ "source": [
+ "model.summary()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 34,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Epoch 1/50\n",
+ "39/39 [==============================] - 1s 7ms/step - loss: 195.3423 - val_loss: 122.7748\n",
+ "Epoch 2/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 159.8013 - val_loss: 111.0790\n",
+ "Epoch 3/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 149.2726 - val_loss: 109.4974\n",
+ "Epoch 4/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 146.6860 - val_loss: 109.9132\n",
+ "Epoch 5/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 145.9674 - val_loss: 110.0577\n",
+ "Epoch 6/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 145.7595 - val_loss: 110.2798\n",
+ "Epoch 7/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 145.6669 - val_loss: 110.4378\n",
+ "Epoch 8/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 145.5251 - val_loss: 110.3182\n",
+ "Epoch 9/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 145.5142 - val_loss: 110.0210\n",
+ "Epoch 10/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 145.2310 - val_loss: 109.9615\n",
+ "Epoch 11/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 143.9531 - val_loss: 108.3879\n",
+ "Epoch 12/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 141.4673 - val_loss: 106.4769\n",
+ "Epoch 13/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 138.7005 - val_loss: 102.2574\n",
+ "Epoch 14/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 131.1469 - val_loss: 96.1004\n",
+ "Epoch 15/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 119.1949 - val_loss: 87.1408\n",
+ "Epoch 16/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 109.1737 - val_loss: 82.5326\n",
+ "Epoch 17/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 102.8606 - val_loss: 80.7252\n",
+ "Epoch 18/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 100.3107 - val_loss: 78.7766\n",
+ "Epoch 19/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 99.4495 - val_loss: 79.5350\n",
+ "Epoch 20/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 98.5605 - val_loss: 78.4435\n",
+ "Epoch 21/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 97.5860 - val_loss: 81.1774\n",
+ "Epoch 22/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 96.2666 - val_loss: 79.1634\n",
+ "Epoch 23/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 94.7172 - val_loss: 78.6962\n",
+ "Epoch 24/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 92.0947 - val_loss: 77.0280\n",
+ "Epoch 25/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 91.2972 - val_loss: 76.0381\n",
+ "Epoch 26/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 90.9750 - val_loss: 76.7729\n",
+ "Epoch 27/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 89.8379 - val_loss: 76.8481\n",
+ "Epoch 28/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 89.7722 - val_loss: 77.1863\n",
+ "Epoch 29/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 88.6945 - val_loss: 76.4976\n",
+ "Epoch 30/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 87.9703 - val_loss: 75.7619\n",
+ "Epoch 31/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 87.8983 - val_loss: 76.3760\n",
+ "Epoch 32/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 86.7892 - val_loss: 75.5612\n",
+ "Epoch 33/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 87.2548 - val_loss: 75.8207\n",
+ "Epoch 34/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 86.6262 - val_loss: 74.3852\n",
+ "Epoch 35/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 83.0383 - val_loss: 71.6389\n",
+ "Epoch 36/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 81.3606 - val_loss: 72.0317\n",
+ "Epoch 37/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 80.9233 - val_loss: 72.5051\n",
+ "Epoch 38/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 80.5564 - val_loss: 73.2485\n",
+ "Epoch 39/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 79.3356 - val_loss: 70.0708\n",
+ "Epoch 40/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 79.0890 - val_loss: 69.8045\n",
+ "Epoch 41/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 78.2170 - val_loss: 69.6172\n",
+ "Epoch 42/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 77.9804 - val_loss: 69.9331\n",
+ "Epoch 43/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 77.2316 - val_loss: 69.1138\n",
+ "Epoch 44/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 76.6667 - val_loss: 67.2575\n",
+ "Epoch 45/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 76.3032 - val_loss: 69.4175\n",
+ "Epoch 46/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 75.8204 - val_loss: 66.3227\n",
+ "Epoch 47/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 75.5402 - val_loss: 67.3108\n",
+ "Epoch 48/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 74.5297 - val_loss: 66.1790\n",
+ "Epoch 49/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 74.2953 - val_loss: 65.7092\n",
+ "Epoch 50/50\n",
+ "39/39 [==============================] - 0s 2ms/step - loss: 73.6489 - val_loss: 66.4811\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 34,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "model.compile(optimizer='adam', loss='mse')\n",
+ "model.fit([X_train,static_input], y_train, epochs=50, batch_size=32, validation_data=([X_test,static_input_test], y_test))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 35,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "8/8 [==============================] - 0s 1ms/step - loss: 66.4811\n",
+ "Root Mean Squared Error: 8.153597228592622\n"
+ ]
+ }
+ ],
+ "source": [
+ "mse = model.evaluate([X_test,static_input_test], y_test)\n",
+ "\n",
+ "# Show rmse to see how model performs on the test set\n",
+ "rmse = np.sqrt(mse)\n",
+ "print(f'Root Mean Squared Error: {rmse}')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "py38",
+ "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.18"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}