{"metadata":{"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":45533,"databundleVersionId":5748852,"sourceType":"competition"},{"sourceId":7897818,"sourceType":"datasetVersion","datasetId":4637935},{"sourceId":7907422,"sourceType":"datasetVersion","datasetId":4644977},{"sourceId":7907497,"sourceType":"datasetVersion","datasetId":4645038},{"sourceId":7907531,"sourceType":"datasetVersion","datasetId":4645066}],"dockerImageVersionId":30665,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true},"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"papermill":{"default_parameters":{},"duration":4542.980001,"end_time":"2024-01-19T16:57:35.919248","environment_variables":{},"exception":null,"input_path":"__notebook__.ipynb","output_path":"__notebook__.ipynb","parameters":{},"start_time":"2024-01-19T15:41:52.939247","version":"2.4.0"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Predict Student Performance from Game Play","metadata":{"papermill":{"duration":0.019449,"end_time":"2024-01-19T15:42:07.380655","exception":false,"start_time":"2024-01-19T15:42:07.361206","status":"completed"},"tags":[]}},{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","papermill":{"duration":0.055682,"end_time":"2024-01-19T15:42:07.452928","exception":false,"start_time":"2024-01-19T15:42:07.397246","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-03-28T13:53:00.477148Z","iopub.execute_input":"2024-03-28T13:53:00.478074Z","iopub.status.idle":"2024-03-28T13:53:00.871754Z","shell.execute_reply.started":"2024-03-28T13:53:00.478037Z","shell.execute_reply":"2024-03-28T13:53:00.870785Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import IPython.display as py_display\npy_display.Image(\"/kaggle/input/guru-hub-data/main.jpg\")","metadata":{"execution":{"iopub.status.busy":"2024-03-28T13:53:00.873456Z","iopub.execute_input":"2024-03-28T13:53:00.873837Z","iopub.status.idle":"2024-03-28T13:53:00.901607Z","shell.execute_reply.started":"2024-03-28T13:53:00.873811Z","shell.execute_reply":"2024-03-28T13:53:00.900848Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Part 1: Importing Libraries","metadata":{"papermill":{"duration":0.015625,"end_time":"2024-01-19T15:42:07.484417","exception":false,"start_time":"2024-01-19T15:42:07.468792","status":"completed"},"tags":[]}},{"cell_type":"code","source":"# Importing Libraries\nimport tensorflow as tf\n#import tensorflow_addons as tfa  # Uncomment this line if you need to use tensorflow_addons\nimport tensorflow_decision_forests as tfdf\nfrom tensorflow import keras\nfrom keras.callbacks import ModelCheckpoint, EarlyStopping\nfrom tensorflow.keras.layers import Conv1D, BatchNormalization, LeakyReLU, MaxPooling1D, Flatten, Dense, GlobalAvgPool2D, GlobalAvgPool1D\n\nimport pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\n\nfrom sklearn.metrics import f1_score\n\n\nimport pandas as pd  # Importing pandas library for data manipulation\nimport numpy as np   # Importing numpy library for numerical computations\n\nimport seaborn as sns  # Importing seaborn library for data visualization\nimport matplotlib.pyplot as plt  # Importing matplotlib library for plotting\nfrom matplotlib.colors import ListedColormap  # Importing ListedColormap for creating custom colormaps\nfrom matplotlib.patches import ConnectionPatch  # Importing ConnectionPatch for drawing connections\n\nimport warnings  # Importing warnings module to suppress warnings\nwarnings.filterwarnings(\"ignore\")  # Suppressing warnings\n","metadata":{"papermill":{"duration":16.442832,"end_time":"2024-01-19T15:42:23.944192","exception":false,"start_time":"2024-01-19T15:42:07.50136","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-03-28T13:53:00.902606Z","iopub.execute_input":"2024-03-28T13:53:00.902852Z","iopub.status.idle":"2024-03-28T13:53:13.831104Z","shell.execute_reply.started":"2024-03-28T13:53:00.90283Z","shell.execute_reply":"2024-03-28T13:53:13.830332Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Data Visualisation","metadata":{}},{"cell_type":"code","source":"# Disabling chained assignment warnings in pandas\npd.options.mode.chained_assignment = None  # default='warn'\n\n# Setting random seeds for reproducibility\ntf.random.set_seed(42)  # Setting random seed for TensorFlow\nnp.random.seed(42)      # Setting random seed for NumPy\n\n# Clearing TensorFlow backend session\nkeras.backend.clear_session()  # Clearing Keras backend session to start fresh\n","metadata":{"papermill":{"duration":0.046048,"end_time":"2024-01-19T15:42:24.009717","exception":false,"start_time":"2024-01-19T15:42:23.963669","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-03-28T13:53:13.833033Z","iopub.execute_input":"2024-03-28T13:53:13.833537Z","iopub.status.idle":"2024-03-28T13:53:13.839023Z","shell.execute_reply.started":"2024-03-28T13:53:13.83351Z","shell.execute_reply":"2024-03-28T13:53:13.837956Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import plotly.graph_objects as go\n\ndays = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']\ndays_abb = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']\ny_ticks = ['Low', 'Medium', 'High']\n\ndef create_perf_graph(perf, y_tick_labels=y_ticks, y_tick_positions=[1, 2, 3], y_label='Performance', title='Students Performance Throughout The Week', marker_color='blue'):\n    fig = go.Figure()\n\n    fig.add_trace(go.Scatter(x=days, y=perf, mode='markers', marker=dict(size=10, color=marker_color), name='Performance'))\n\n    fig.update_layout(title=title, xaxis_title='Day', yaxis_title=y_label, yaxis=dict(tickmode='array', tickvals=y_tick_positions, ticktext=y_tick_labels), yaxis_range=[0, 3.5])\n\n    return fig","metadata":{"execution":{"iopub.status.busy":"2024-03-28T13:53:13.84027Z","iopub.execute_input":"2024-03-28T13:53:13.840624Z","iopub.status.idle":"2024-03-28T13:53:13.868905Z","shell.execute_reply.started":"2024-03-28T13:53:13.840591Z","shell.execute_reply":"2024-03-28T13:53:13.867989Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import plotly.graph_objects as go\n\ndef create_perf_graph(perf_data, line_color='blue'):\n    fig = go.Figure()\n\n    # Add line plot\n    fig.add_trace(go.Scatter(x=list(range(len(perf_data))), y=perf_data, mode='lines', \n                             line=dict(color=line_color, width=2), name='Performance'))\n\n    # Add scatter plot\n    fig.add_trace(go.Scatter(x=list(range(len(perf_data))), y=perf_data, mode='markers', \n                             marker=dict(color='red', size=8), name='Performance'))\n\n    fig.update_layout(\n        title='Performance Over Time',\n        xaxis=dict(\n            title='Day of Week',\n            tickvals=list(range(len(perf_data))),\n            ticktext=['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'],\n            tickfont=dict(size=12),\n            gridcolor='lightgrey'\n        ),\n        yaxis=dict(\n            title='Performance',\n            tickfont=dict(size=12),\n            gridcolor='lightgrey',\n            tickvals=[1, 2, 3],\n            ticktext=['Low', 'Medium', 'High']\n        ),\n        plot_bgcolor='rgba(0,0,0,0)',\n        paper_bgcolor='rgba(0,0,0,0)',\n    )\n\n    fig.show()","metadata":{"execution":{"iopub.status.busy":"2024-03-28T13:53:13.870995Z","iopub.execute_input":"2024-03-28T13:53:13.871571Z","iopub.status.idle":"2024-03-28T13:53:13.881549Z","shell.execute_reply.started":"2024-03-28T13:53:13.871538Z","shell.execute_reply":"2024-03-28T13:53:13.880645Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Example usage\nperf_data = [3, 3, 2, 2, 1, 2, 3]  # Example performance data\ncreate_perf_graph(perf_data,line_color='red')\n","metadata":{"execution":{"iopub.status.busy":"2024-03-28T13:53:13.882672Z","iopub.execute_input":"2024-03-28T13:53:13.882998Z","iopub.status.idle":"2024-03-28T13:53:14.333166Z","shell.execute_reply.started":"2024-03-28T13:53:13.882965Z","shell.execute_reply":"2024-03-28T13:53:14.332334Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Example usage\nperf_data = [3, 3, 2, 2, 1, 2, 3]  # Example performance data\ncreate_perf_graph(perf_data,line_color='black')\n","metadata":{"execution":{"iopub.status.busy":"2024-03-28T13:53:14.334235Z","iopub.execute_input":"2024-03-28T13:53:14.334779Z","iopub.status.idle":"2024-03-28T13:53:14.35965Z","shell.execute_reply.started":"2024-03-28T13:53:14.334751Z","shell.execute_reply":"2024-03-28T13:53:14.358617Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = pd.read_csv('/kaggle/input/predict-student-performance-from-game-play/train.csv', \n                 usecols=['session_id'],\n                 dtype = {'session_id':'object'})\ndf.head()","metadata":{"execution":{"iopub.status.busy":"2024-03-28T13:53:14.361113Z","iopub.execute_input":"2024-03-28T13:53:14.361413Z","iopub.status.idle":"2024-03-28T13:54:59.055888Z","shell.execute_reply.started":"2024-03-28T13:53:14.361389Z","shell.execute_reply":"2024-03-28T13:54:59.054892Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"labels = pd.read_csv('/kaggle/input/predict-student-performance-from-game-play/train_labels.csv')\n\nlabels[['session_id', 'question']] = labels['session_id'].str.split('_', expand=True)\nlabels = labels.pivot(columns='question', index='session_id', values='correct')\n\nscores = labels.sum(axis=1)\nscores = scores.rename('score')\n\nscores.head()","metadata":{"execution":{"iopub.status.busy":"2024-03-28T13:54:59.059577Z","iopub.execute_input":"2024-03-28T13:54:59.059942Z","iopub.status.idle":"2024-03-28T13:55:01.099649Z","shell.execute_reply.started":"2024-03-28T13:54:59.059919Z","shell.execute_reply":"2024-03-28T13:55:01.098633Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sessions = pd.DataFrame(df['session_id'].unique(), columns=['session_id'])\nsessions.head()","metadata":{"execution":{"iopub.status.busy":"2024-03-28T13:55:01.100675Z","iopub.execute_input":"2024-03-28T13:55:01.100939Z","iopub.status.idle":"2024-03-28T13:55:03.206161Z","shell.execute_reply.started":"2024-03-28T13:55:01.100917Z","shell.execute_reply":"2024-03-28T13:55:03.205302Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sessions['year'] = sessions['session_id'].str.slice(start=0, stop=2).astype(np.int8)\nsessions['month'] = sessions['session_id'].str.slice(start=2, stop=4).astype(np.int8)\n\nsessions['day'] = sessions['session_id'].str.slice(start=4, stop=6).astype(np.int8)\n\nsessions['hour'] = sessions[\"hour\"] = sessions[\"session_id\"].str.slice(start=6, stop=8).astype(np.uint8)\n\nsessions = sessions.set_index('session_id')\nsessions.head()","metadata":{"execution":{"iopub.status.busy":"2024-03-28T13:55:03.207121Z","iopub.execute_input":"2024-03-28T13:55:03.20743Z","iopub.status.idle":"2024-03-28T13:55:03.262497Z","shell.execute_reply.started":"2024-03-28T13:55:03.207404Z","shell.execute_reply":"2024-03-28T13:55:03.261472Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Moving Sunday from the beggining of the week to its end\nt = sessions['day']\nsessions['day'] = sessions['day'].map({0:7}).fillna(t)\nsessions.head()","metadata":{"execution":{"iopub.status.busy":"2024-03-28T13:55:03.263646Z","iopub.execute_input":"2024-03-28T13:55:03.263895Z","iopub.status.idle":"2024-03-28T13:55:03.279232Z","shell.execute_reply.started":"2024-03-28T13:55:03.263874Z","shell.execute_reply":"2024-03-28T13:55:03.278352Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"date_score = pd.concat([sessions, scores], axis=1)\ndate_score.head()","metadata":{"execution":{"iopub.status.busy":"2024-03-28T13:55:03.280345Z","iopub.execute_input":"2024-03-28T13:55:03.280641Z","iopub.status.idle":"2024-03-28T13:55:03.308405Z","shell.execute_reply.started":"2024-03-28T13:55:03.280616Z","shell.execute_reply":"2024-03-28T13:55:03.307583Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"date_score.year.unique()","metadata":{"execution":{"iopub.status.busy":"2024-03-28T13:55:03.309588Z","iopub.execute_input":"2024-03-28T13:55:03.310185Z","iopub.status.idle":"2024-03-28T13:55:03.318029Z","shell.execute_reply.started":"2024-03-28T13:55:03.310154Z","shell.execute_reply":"2024-03-28T13:55:03.316984Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"game_activity = date_score.groupby(['year', 'month']).size()\ngame_activity.head()","metadata":{"execution":{"iopub.status.busy":"2024-03-28T13:55:03.319129Z","iopub.execute_input":"2024-03-28T13:55:03.319411Z","iopub.status.idle":"2024-03-28T13:55:03.333301Z","shell.execute_reply.started":"2024-03-28T13:55:03.319388Z","shell.execute_reply":"2024-03-28T13:55:03.332211Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig, ax = plt.subplots(figsize=(13, 5))\n\nsns.lineplot(x=range(9), y=game_activity[:9], ax=ax, color='orange')\nsns.lineplot(x=range(8, len(game_activity)), y=game_activity[8:], ax=ax, color='grey')\n\ny_label = ax.set_ylabel('Number Of Sessions', y=0.832)\n\nax.set_xlim(-0.5)\nax.set_ylim(0, 2250)\n\nax.set_xticks([-0.5,2.5,5.5,8.5,11.5,14.5,17.5,20.5,23.5,26.5])\nax.set_xticklabels([])\n\nax.set_xticks([1, 4, 7, 10, 13, 16, 19, 22, 25], minor=True)\nplt.tick_params(which='minor', bottom=False, top=False, left=False, right=False)\nax.set_xticklabels(['2020 Q4','2021 Q1','2021 Q2','2021 Q3', '2021 Q4','2022 Q1','2022 Q2','2022 Q3', '2022 Q4'],\n                   minor=True)\n\nax.set_title('Total Game Activity In Three Years', x=0.122, y=1.085, size=16)\nax.text(x=-2.25, y=2350, s=\"The assumed\", color='grey')\nax.text(x=0.35, y=2350, s='start of data collection', color='orange')\nax.text(x=4.75, y=2350, s='in 2020 may reveal the popularity in beggining', color='grey')\n\nsns.despine(top=True, right=True)","metadata":{"execution":{"iopub.status.busy":"2024-03-28T13:55:03.334537Z","iopub.execute_input":"2024-03-28T13:55:03.334922Z","iopub.status.idle":"2024-03-28T13:55:03.725487Z","shell.execute_reply.started":"2024-03-28T13:55:03.334896Z","shell.execute_reply":"2024-03-28T13:55:03.724545Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"date_score['year_month'] = date_score['year'].astype('str') + '_' + date_score['month'].astype('str')\ndate_score.head()","metadata":{"execution":{"iopub.status.busy":"2024-03-28T13:55:03.72671Z","iopub.execute_input":"2024-03-28T13:55:03.727009Z","iopub.status.idle":"2024-03-28T13:55:03.764044Z","shell.execute_reply.started":"2024-03-28T13:55:03.726984Z","shell.execute_reply":"2024-03-28T13:55:03.763141Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig, ax = plt.subplots(figsize=(13, 5))\n                   \nsns.pointplot(data=date_score, x='year_month', y='score', \n              ax=ax, \n              errorbar='se',\n              color='grey')\n\ny_label = ax.set_ylabel('Mean Quiz Score', y=0.86,size=10)\n\nax.set_xlim(-0.5)\nax.set_ylim(11, 14)\n\nax.set_xticks([-0.5, 2.5,5.5,8.5,11.5,14.5,17.5,20.5,23.5,26.5])\nax.set_xticklabels([])\n\nax.set_xticks([1, 4, 7, 10, 13, 16, 19, 22,25], minor=True)\nplt.tick_params(which='minor', bottom=False, top=False, left=False, right=False)\nax.set_xticklabels(['2020 Q4','2021 Q1','2021 Q2','2021 Q3', '2021 Q4','2022 Q1','2022 Q2','2022 Q3', '2022 Q4'],\n                   minor=True,size=10)\n\nax.set_xlabel('')\n\nax.set_title('Quiz Perfomance Activity In Three Years', x=0.16, y=1.085, size=10)\nax.text(x=-2.08, y=14.15, color='grey', s='Over the course of three years, there was only a ',size=10)\nax.text(x=7.125, y=14.15, s='slight increase by 0.75 point', color='orange',size=10)\nax.text(x=12.6, y=14.15, s='in the quiz score', color='grey',size=10)\n\nsns.lineplot(x=[-1,26], y=[11.97,12.76], color='red', linewidth=3)\n\nsns.despine(top=True, right=True)","metadata":{"execution":{"iopub.status.busy":"2024-03-28T13:55:03.765193Z","iopub.execute_input":"2024-03-28T13:55:03.765732Z","iopub.status.idle":"2024-03-28T13:55:04.183197Z","shell.execute_reply.started":"2024-03-28T13:55:03.765703Z","shell.execute_reply":"2024-03-28T13:55:04.182244Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"game_activity = date_score.groupby(['day']).size()\ngame_activity.head()","metadata":{"execution":{"iopub.status.busy":"2024-03-28T13:55:04.184568Z","iopub.execute_input":"2024-03-28T13:55:04.185195Z","iopub.status.idle":"2024-03-28T13:55:04.194403Z","shell.execute_reply.started":"2024-03-28T13:55:04.185161Z","shell.execute_reply":"2024-03-28T13:55:04.19344Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nimport seaborn as sns\n\n# Assuming game_activity and days are defined elsewhere\n\nfig, ax = plt.subplots(figsize=(7, 5))\n\nsns.lineplot(x=game_activity.index[4:], y=game_activity.iloc[4:],\n             ax=ax, color='blue', marker='o', markersize=8, markerfacecolor='cyan', linewidth=2)\nsns.lineplot(x=game_activity.index[:5], y=game_activity.iloc[:5],\n             ax=ax, color='red', marker='o', markersize=8, markerfacecolor='orange', linewidth=2)\n\nax.set_xlabel('')\n\nax.set_ylabel('Number Of Sessions', y=0.84)\nax.set_xticks(range(1, 8))\nax.set_xticklabels(days)\n\nax.set_ylim(1000, 4500)\n\nax.set_title('Game Activity Throughout The Week', x=0.215, y=1.085, size=14)\nax.text(-1.09 + 1, 4675, 'Work hard on', color='grey', fontsize=12)\nax.text(0.1 + 1, 4675, 'weekday', color='orange', fontsize=12)\nax.text(0.88 + 1, 4675, '- rest on', color='grey', fontsize=12)\nax.text(1.65 + 1, 4675, 'weekends', color='cyan', fontsize=12)\n\nsns.despine(top=True, right=True)\n\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-03-28T13:55:04.195985Z","iopub.execute_input":"2024-03-28T13:55:04.196336Z","iopub.status.idle":"2024-03-28T13:55:04.408981Z","shell.execute_reply.started":"2024-03-28T13:55:04.196304Z","shell.execute_reply":"2024-03-28T13:55:04.408Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import plotly.graph_objects as go\n\n# Assuming 'date_score' is your DataFrame and 'days' is a list containing day labels\n\n# Create the box plot\nfig = go.Figure()\n\n# Add box plot trace\nfig.add_trace(go.Box(\n    y=date_score['day'],  # Day data\n    x=date_score['score'],  # Score data\n    orientation='h',  # Horizontal orientation\n    marker_color='#ADD8E6',  # Marker color\n    boxmean=True  # Display mean\n))\n\n# Customize layout\nfig.update_layout(\n    title='Variance Homogeneity',\n    yaxis_title='Day',\n    xaxis_title='Score',\n    yaxis=dict(tickmode='array', tickvals=list(range(len(days))), ticktext=days),  # Customize y-axis tick labels\n    showlegend=False\n)\n\n# Show the plot\nfig.show()\n","metadata":{"execution":{"iopub.status.busy":"2024-03-28T13:55:04.410051Z","iopub.execute_input":"2024-03-28T13:55:04.410352Z","iopub.status.idle":"2024-03-28T13:55:04.455718Z","shell.execute_reply.started":"2024-03-28T13:55:04.410327Z","shell.execute_reply":"2024-03-28T13:55:04.454881Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from scipy.stats import f_oneway\n\ngroups = []\nfor day in range(1,8):\n    groups.append(date_score.loc[date_score['day'] == day, 'score'].values)\nf_oneway(*groups)","metadata":{"execution":{"iopub.status.busy":"2024-03-28T13:55:04.45685Z","iopub.execute_input":"2024-03-28T13:55:04.457112Z","iopub.status.idle":"2024-03-28T13:55:04.470686Z","shell.execute_reply.started":"2024-03-28T13:55:04.457089Z","shell.execute_reply":"2024-03-28T13:55:04.469827Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Performing multiple t-tests\nfrom scipy.stats import ttest_ind\n\np_value = 0.05\ncomparisons = 7*6/2\np_value = p_value/comparisons\n\np_matrix = pd.DataFrame(index=days_abb, columns=days_abb, dtype=float)\nf_matrix = pd.DataFrame(index=days_abb, columns=days_abb, dtype=float)\n\nfor i in range(len(groups)):\n    for j in range(i+1, len(groups)):\n        results = ttest_ind(groups[i], groups[j])\n        p_matrix.iloc[i,j] = results[1]\n        f_matrix.iloc[i,j] = results[0]\n            \np_matrix = p_matrix.fillna(0)\np_matrix = p_matrix.transpose() + p_matrix\nnp.fill_diagonal(p_matrix.values, 1)\nsignif_matrix = p_matrix < p_value","metadata":{"execution":{"iopub.status.busy":"2024-03-28T13:55:04.471965Z","iopub.execute_input":"2024-03-28T13:55:04.472637Z","iopub.status.idle":"2024-03-28T13:55:04.508542Z","shell.execute_reply.started":"2024-03-28T13:55:04.4726Z","shell.execute_reply":"2024-03-28T13:55:04.507843Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"code","source":"cyan = (0, 100/256, 100/256,1)\ngrey = (0.9,0.9,0.9,1)\ncmap = ListedColormap([grey, cyan])\n\nax = sns.heatmap(signif_matrix, cbar=False, cmap=cmap)\n\nplt.yticks(rotation=0)\nax.tick_params(left=False, bottom=False)\n\nax.set_title('Significant Difference', color=cyan, x=0.11)","metadata":{"execution":{"iopub.status.busy":"2024-03-28T13:55:04.509513Z","iopub.execute_input":"2024-03-28T13:55:04.509767Z","iopub.status.idle":"2024-03-28T13:55:04.813011Z","shell.execute_reply.started":"2024-03-28T13:55:04.509744Z","shell.execute_reply":"2024-03-28T13:55:04.812108Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig, ax = plt.subplots(figsize=(7, 5))\n\nsns.pointplot(data=date_score, x='day', y='score', ax=ax,color='red')\n\nax.set_xlabel('')\nax.set_xticks(range(7))\nax.set_xticklabels(days_abb)\n\nax.set_title('Quiz Perfomance Throughout the day', x=0.179, y=1.05,color='red')\n\nax.set_ylim(12.4,13.4)\nax.set_ylabel('score',y=0.967)\n\nsns.despine(right=False, top=False)","metadata":{"execution":{"iopub.status.busy":"2024-03-28T13:55:04.814458Z","iopub.execute_input":"2024-03-28T13:55:04.815244Z","iopub.status.idle":"2024-03-28T13:55:05.325945Z","shell.execute_reply.started":"2024-03-28T13:55:04.815208Z","shell.execute_reply":"2024-03-28T13:55:05.324979Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"game_activity = date_score.groupby('hour').size()\ngame_activity.head()","metadata":{"execution":{"iopub.status.busy":"2024-03-28T13:55:05.327222Z","iopub.execute_input":"2024-03-28T13:55:05.328558Z","iopub.status.idle":"2024-03-28T13:55:05.337765Z","shell.execute_reply.started":"2024-03-28T13:55:05.328521Z","shell.execute_reply":"2024-03-28T13:55:05.336729Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import plotly.graph_objects as go\n\n# Assuming 'game_activity' is your DataFrame or Series containing the hourly activity data\n\nfig = go.Figure()\n\nfig.add_trace(go.Scatter(x=game_activity.index, y=game_activity, mode='lines', line=dict(color='grey', width=2)))\n\nfig.update_layout(\n    title='Game Activity Throughout the Day',\n    xaxis=dict(\n        title='Hour',\n        tickvals=list(range(24)),\n        range=[0, 23],\n        tickfont=dict(size=12),\n        tickangle=-45\n    ),\n    yaxis=dict(\n        title='Number Of Sessions',\n        range=[0, 3000],\n        tickfont=dict(size=12),\n        gridcolor='lightgrey'\n    ),\n    annotations=[\n        dict(\n            x=-1.59,\n            y=3170,\n            xref=\"x\",\n            yref=\"y\",\n            text=\"Players' activity aligns with the\",\n            showarrow=False,\n            font=dict(color='grey', size=12)\n        ),\n        dict(\n            x=3.78,\n            y=3170,\n            xref=\"x\",\n            yref=\"y\",\n            text=\"human biological rhythm\",\n            showarrow=False,\n            font=dict(color='orange', size=12)\n        )\n    ],\n    plot_bgcolor='rgba(0,0,0,0)',\n    paper_bgcolor='rgba(0,0,0,0)',\n)\n\nfig.show()\n","metadata":{"execution":{"iopub.status.busy":"2024-03-28T13:55:05.347359Z","iopub.execute_input":"2024-03-28T13:55:05.347629Z","iopub.status.idle":"2024-03-28T13:55:05.403122Z","shell.execute_reply.started":"2024-03-28T13:55:05.347605Z","shell.execute_reply":"2024-03-28T13:55:05.40232Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig, ax = plt.subplots(figsize=(12,4))\n\nsns.pointplot(data=date_score, x='hour', y='score', \n              errorbar='se',\n              color='grey')\n\nax.set_title('Quiz Perfomance throughout the day', size=14, x=0.128, y=1.1)\nax.text(x=-2.05, y=15.2,s='For simplicity of our analysis we do categorical', color='grey')\nax.text(x=6.52, y=15.2,s='projection', color='black')\nax.set_ylabel('score', y=0.962)\nax.set_ylim(11.5,15)\n\nplt.axvline(x = 5.5, color = 'black', linestyle='--')\nplt.axvline(x = 11.5, color = 'black', linestyle='--')\nplt.axvline(x = 17.5, color = 'black', linestyle='--')\n\nax.text(x=0.5,y=14.5,s='Night')\nax.text(x=6.5,y=14.5,s='Morning')\nax.text(x=12.5,y=14.5,s='Day')\nax.text(18.5,y=14.5,s='Evening')\n\nsns.despine(right=True, top=True)","metadata":{"execution":{"iopub.status.busy":"2024-03-28T13:55:05.404055Z","iopub.execute_input":"2024-03-28T13:55:05.404322Z","iopub.status.idle":"2024-03-28T13:55:05.767952Z","shell.execute_reply.started":"2024-03-28T13:55:05.404272Z","shell.execute_reply":"2024-03-28T13:55:05.766989Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"day_time = {}\n\nfor i in range(24):\n    if i < 6:\n        day_time[i] = 0\n    elif i < 12:\n        day_time[i] = 1\n    elif i < 18:\n        day_time[i] = 2\n    else:\n        day_time[i] = 3\n\ndate_score['day_time'] = date_score['hour'].map(day_time)\ndate_score.head()","metadata":{"execution":{"iopub.status.busy":"2024-03-28T13:55:05.769088Z","iopub.execute_input":"2024-03-28T13:55:05.769398Z","iopub.status.idle":"2024-03-28T13:55:05.786235Z","shell.execute_reply.started":"2024-03-28T13:55:05.769373Z","shell.execute_reply":"2024-03-28T13:55:05.785248Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"performance = date_score.groupby('day_time')['score'].mean()\nperformance","metadata":{"execution":{"iopub.status.busy":"2024-03-28T13:55:05.787275Z","iopub.execute_input":"2024-03-28T13:55:05.787597Z","iopub.status.idle":"2024-03-28T13:55:05.797671Z","shell.execute_reply.started":"2024-03-28T13:55:05.787562Z","shell.execute_reply":"2024-03-28T13:55:05.796786Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig, ax = plt.subplots(figsize=(9,4))\n\nsns.pointplot(data=date_score, x='day_time', y='score', \n              errorbar='se',\n              color='grey')\n\nax.set_title('Quiz Perfomance throughout the day', size=12, x=0.172, y=1.1)\nax.text(x=-0.83,y=13.45,s='Statistically significant', color='grey',size=10)\nax.text(x=0.1,y=13.45,s='difference', color='orange',size=10)\nax.text(x=0.53,y=13.45,s='observed in 2 pairs', color='grey',size=10)\n\nax.set_ylabel('score', y=0.96,size=10)\nax.set_ylim(12.5,13.4,)\n\nax.set_xticklabels(['Night', 'Morning', 'Day', 'Evening'],size=10)\nax.set_xlabel('')\n\narrow = ConnectionPatch(xyA=(1, performance[1]),\n                        xyB=(3, performance[3]),\n                        coordsA=\"data\",\n                        coordsB=\"data\",\n                        arrowstyle='<|-|>,head_width=0.4,head_length=0.8',\n                        linewidth=1.5,\n                        edgecolor='orange',\n                        facecolor='orange',\n                        connectionstyle='arc3,rad=.4')\nax.add_artist(arrow)\n                        \narrow = ConnectionPatch(xyA=(2, performance[2]),\n                        xyB=(3, performance[3]),\n                        coordsA=\"data\",\n                        coordsB=\"data\",\n                        arrowstyle='<|-|>,head_width=0.4,head_length=0.8',\n                        linewidth=1.5,\n                        edgecolor='orange',\n                        facecolor='orange',\n                        connectionstyle='arc3,rad=.3')\nax.add_artist(arrow)\n\nsns.despine(right=True, top=True)","metadata":{"execution":{"iopub.status.busy":"2024-03-28T13:55:05.799034Z","iopub.execute_input":"2024-03-28T13:55:05.799525Z","iopub.status.idle":"2024-03-28T13:55:05.997727Z","shell.execute_reply.started":"2024-03-28T13:55:05.799492Z","shell.execute_reply":"2024-03-28T13:55:05.996809Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd \n\nfrom string import Template\nfrom IPython.core.display import display, HTML, Javascript\nimport imageio\nfrom PIL import Image\nimport os","metadata":{"execution":{"iopub.status.busy":"2024-03-28T13:55:05.998916Z","iopub.execute_input":"2024-03-28T13:55:06.001173Z","iopub.status.idle":"2024-03-28T13:55:06.059069Z","shell.execute_reply.started":"2024-03-28T13:55:06.00114Z","shell.execute_reply":"2024-03-28T13:55:06.058336Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%javascript\nrequire.config({\n    paths: { \n        d3: 'https://d3js.org/d3.v6.min'\n    }\n});","metadata":{"execution":{"iopub.status.busy":"2024-03-28T13:55:06.060098Z","iopub.execute_input":"2024-03-28T13:55:06.060449Z","iopub.status.idle":"2024-03-28T13:55:06.067057Z","shell.execute_reply.started":"2024-03-28T13:55:06.060416Z","shell.execute_reply":"2024-03-28T13:55:06.066085Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"img_dir = '/kaggle/input/guru-hub-data/'\nfor img in os.listdir(img_dir):\n    img_path = os.path.join(img_dir, img)\n    im = imageio.imread(img_path)\n    Image.fromarray(im).save(img)","metadata":{"execution":{"iopub.status.busy":"2024-03-28T13:55:06.068188Z","iopub.execute_input":"2024-03-28T13:55:06.068531Z","iopub.status.idle":"2024-03-28T13:55:24.981389Z","shell.execute_reply.started":"2024-03-28T13:55:06.068507Z","shell.execute_reply":"2024-03-28T13:55:24.980493Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = pd.read_csv('/kaggle/input/predict-student-performance-from-game-play/train.csv')\ntrain_df.head()","metadata":{"execution":{"iopub.status.busy":"2024-03-28T13:55:24.982551Z","iopub.execute_input":"2024-03-28T13:55:24.982849Z","iopub.status.idle":"2024-03-28T13:56:40.33447Z","shell.execute_reply.started":"2024-03-28T13:55:24.982824Z","shell.execute_reply":"2024-03-28T13:56:40.333462Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"unique_rooms = train_df.room_fqid.unique()\nprint(\"Number of unique rooms - \", len(unique_rooms))\nprint(unique_rooms)","metadata":{"execution":{"iopub.status.busy":"2024-03-28T13:56:40.335853Z","iopub.execute_input":"2024-03-28T13:56:40.336218Z","iopub.status.idle":"2024-03-28T13:56:42.792594Z","shell.execute_reply.started":"2024-03-28T13:56:40.336185Z","shell.execute_reply":"2024-03-28T13:56:42.791639Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Find the size of each room\nroom_bounds = {room:\n{\"x_min\": train_df.loc[train_df.room_fqid==room, 'room_coor_x'].min(),\n \"x_max\": train_df.loc[train_df.room_fqid==room,\"room_coor_x\"].max(),\n  \"y_min\": train_df.loc[train_df.room_fqid==room,\"room_coor_y\"].min(),\n  \"y_max\": train_df.loc[train_df.room_fqid==room,\"room_coor_y\"].max()\n  } for room in unique_rooms}","metadata":{"execution":{"iopub.status.busy":"2024-03-28T13:56:42.793859Z","iopub.execute_input":"2024-03-28T13:56:42.794244Z","iopub.status.idle":"2024-03-28T14:01:42.018422Z","shell.execute_reply.started":"2024-03-28T13:56:42.794209Z","shell.execute_reply":"2024-03-28T14:01:42.017308Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Set room sizes for each record\ntrain_df['room_x_max'] = train_df.room_fqid.map(lambda x: room_bounds[x]['x_max'])\ntrain_df['room_x_min'] = train_df.room_fqid.map(lambda x: room_bounds[x]['x_min'])\ntrain_df['room_y_max'] = train_df.room_fqid.map(lambda x: room_bounds[x]['y_max'])\ntrain_df['room_y_min'] = train_df.room_fqid.map(lambda x: room_bounds[x]['y_min'])","metadata":{"execution":{"iopub.status.busy":"2024-03-28T14:01:42.019829Z","iopub.execute_input":"2024-03-28T14:01:42.02017Z","iopub.status.idle":"2024-03-28T14:02:37.86538Z","shell.execute_reply.started":"2024-03-28T14:01:42.020132Z","shell.execute_reply":"2024-03-28T14:02:37.864317Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"Unique events - \", train_df.event_name.unique())\n# Select only click events\nclick_events = [event for event in train_df.event_name.unique() if 'click' in event]","metadata":{"execution":{"iopub.status.busy":"2024-03-28T14:02:37.866793Z","iopub.execute_input":"2024-03-28T14:02:37.867524Z","iopub.status.idle":"2024-03-28T14:02:41.983074Z","shell.execute_reply.started":"2024-03-28T14:02:37.867488Z","shell.execute_reply":"2024-03-28T14:02:41.982298Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# The list of columns that we want to save. \n# Only the info related to clicks\ncolumns=['room_fqid','elapsed_time', 'event_name', 'room_coor_x', 'room_coor_y', 'screen_coor_x', 'screen_coor_y' , 'room_x_max', 'room_x_min', 'room_y_max', 'room_y_min']","metadata":{"execution":{"iopub.status.busy":"2024-03-28T14:02:41.984188Z","iopub.execute_input":"2024-03-28T14:02:41.984473Z","iopub.status.idle":"2024-03-28T14:02:41.98932Z","shell.execute_reply.started":"2024-03-28T14:02:41.984449Z","shell.execute_reply":"2024-03-28T14:02:41.988177Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# select session which you want to display\nsession_id = 20090312431273200\none_session_events = train_df.loc[(train_df.session_id==session_id)&(train_df.event_name.isin(click_events))]\none_session_events.head()\n# save session \none_session_events.sort_values(by='elapsed_time').loc[:,columns].to_csv('one_session_events.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2024-03-28T14:02:41.990391Z","iopub.execute_input":"2024-03-28T14:02:41.990632Z","iopub.status.idle":"2024-03-28T14:02:43.668693Z","shell.execute_reply.started":"2024-03-28T14:02:41.990611Z","shell.execute_reply":"2024-03-28T14:02:43.667847Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"css_text = Template('''\n#functionality {\n    display: flex;\n    justify-content: center;\n    flex-wrap: wrap;\n    padding-top: 20px; /* Increase padding for better spacing */\n}\n\n#scene {\n    padding-top: 30px; /* Increase padding for better separation */\n}\n\nselect {\n    font-size: 18px; /* Slightly increase font size */\n    margin-left: 20px; /* Adjust margin for better alignment */\n    padding: 10px; /* Add padding for better spacing */\n    border: 1px solid #4CAF50; /* Add border with a green color */\n    border-radius: 8px; /* Add border radius for rounded corners */\n    background-color: #E8F6EF; /* Light green background color */\n    color: #333; /* Darken font color */\n}\n\nbutton {\n    font-size: 18px; /* Slightly increase font size */\n    margin-left: 20px; /* Adjust margin for better alignment */\n    padding: 10px 20px; /* Add padding for better spacing */\n    border: none; /* Remove border */\n    border-radius: 8px; /* Add border radius for rounded corners */\n    background-color: #4CAF50; /* Green background color */\n    color: white; /* Font color */\n    cursor: pointer; /* Add pointer cursor */\n    transition: background-color 0.3s; /* Smooth transition for background color */\n}\n\nbutton:hover {\n    background-color: #45a049; /* Darken background color on hover */\n}\n\n#all{\n    background-color: #F5F5F5; /* Light gray background color */\n    padding: 30px; /* Add padding for better spacing */\n    border-radius: 12px; /* Add border radius for rounded corners */\n    box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.2); /* Add subtle box shadow */\n}\n\n\n''')\n","metadata":{"execution":{"iopub.status.busy":"2024-03-28T14:02:43.670071Z","iopub.execute_input":"2024-03-28T14:02:43.670501Z","iopub.status.idle":"2024-03-28T14:02:43.677Z","shell.execute_reply.started":"2024-03-28T14:02:43.670465Z","shell.execute_reply":"2024-03-28T14:02:43.676129Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"htmlt = Template('''\n<!-- Style -->\n<style>\n$css_file\n</style>\n<img id=\"baseimg\" src=\"tunic.historicalsociety.closet.jpg\" style=\"display:none\" />\n<div id=\"all\">\n    <div id=\"functionality\">\n            <select id=\"room\">\n                <option value=\"tunic.historicalsociety.closet\" selected>tunic.historicalsociety.closet</option>\n                <option value=\"tunic.historicalsociety.basement\">tunic.historicalsociety.basement</option>\n                <option value=\"tunic.historicalsociety.entry\">tunic.historicalsociety.entry</option>\n                <option value=\"tunic.historicalsociety.collection\">tunic.historicalsociety.collection</option>\n                <option value=\"tunic.historicalsociety.stacks\">tunic.historicalsociety.stacks</option>\n                <option value=\"tunic.kohlcenter.halloffame\">tunic.kohlcenter.halloffame</option>\n                <option value=\"tunic.capitol_0.hall\">tunic.capitol_0.hall</option>\n                <option value=\"tunic.historicalsociety.closet_dirty\">tunic.historicalsociety.closet_dirty</option>\n                <option value=\"tunic.historicalsociety.frontdesk\">tunic.historicalsociety.frontdesk</option>\n                <option value=\"tunic.humanecology.frontdesk\">tunic.humanecology.frontdesk</option>\n                <option value=\"tunic.drycleaner.frontdesk\">tunic.drycleaner.frontdesk</option>\n                <option value=\"tunic.library.frontdesk\">tunic.library.frontdesk</option>\n                <option value=\"tunic.library.microfiche\">tunic.library.microfiche</option>\n                <option value=\"tunic.capitol_1.hall\">tunic.capitol_1.hall</option>\n                <option value=\"tunic.historicalsociety.cage\">tunic.historicalsociety.cage</option>\n                <option value=\"tunic.historicalsociety.collection_flag\">tunic.historicalsociety.collection_flag</option>\n                <option value=\"tunic.wildlife.center\">tunic.wildlife.center</option>\n                <option value=\"tunic.flaghouse.entry\">tunic.flaghouse.entry</option>\n                <option value=\"tunic.capitol_2.hall\">tunic.capitol_2.hall</option>\n            </select>\n            <select id=\"event_type\">\n                <option value=\"all\" selected>All</option>\n                <option value=\"cutscene_click\">cutscene_click</option>\n                <option value=\"person_click\">person_click</option>\n                <option value=\"navigate_click\">navigate_click</option>\n                <option value=\"observation_click\">observation_click</option>\n                <option value=\"notification_click\">notification_click</option>\n                <option value=\"object_click\">object_click</option>\n                <option value=\"map_click\">map_click</option>\n                <option value=\"notebook_click\">notebook_click</option>\n            </select>\n            <button id=\"start_stop\">START</button>\n            <button id=\"reset\">RESET</button>\n    </div>\n    <div id=\"scene\"></div>\n    <div id=\"legend\"></div>\n</div>\n''')","metadata":{"execution":{"iopub.status.busy":"2024-03-28T14:02:43.67801Z","iopub.execute_input":"2024-03-28T14:02:43.678263Z","iopub.status.idle":"2024-03-28T14:02:43.688653Z","shell.execute_reply.started":"2024-03-28T14:02:43.678241Z","shell.execute_reply":"2024-03-28T14:02:43.687781Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"js_t = Template('''\nrequire([\"d3\"], function(d3) {\n\n    // Get Assets URL set by Kaggle\n    const baseAssetsUrl = document.getElementById('baseimg').src.replace(/tunic.historicalsociety.closet.jpg.*$/, '');\n\n    function draw_scene(room=document.getElementById(\"room\").value) {\n    \n        d3.csv(baseAssetsUrl + \"one_session_events.csv\").then(\n            function (dataset) {\n            \n               dataset =  dataset.filter(d => d.room_fqid == room)\n               \n               const xAccessor = d => +d.room_coor_x\n                const yAccessor = d => +d.room_coor_y\n                const userXCoor = d => +d.screen_coor_x\n                const userYCoor = d => +d.screen_coor_y\n                const eventName = d => d.event_name\n\n                const xMin = +dataset[0].room_x_min\n                const xMax = +dataset[0].room_x_max\n                const yMin = +dataset[0].room_y_min\n                const yMax = +dataset[0].room_y_max\n\n                const dimensions = {\n                    width: 850,\n                    height: 400,\n                    margins: 50,\n                    userWidth: 380,\n                    userHeight: 360\n                }\n\n                const xScale = d3.scaleLinear()\n                    .domain([xMin, xMax])\n                    .range([0, dimensions.width])\n\n                const yScale = d3.scaleLinear()\n                    .domain([yMin, yMax])\n                    .range([dimensions.height, 0])\n\n                const eventColors = d3.scaleOrdinal()\n                    .domain(dataset.map(d => d.event_name))\n                    .range(d3.schemeCategory10)\n\n                // Draw scene\n                const svg = d3.select(\"#scene\")\n                    .append(\"svg\")\n                    .attr(\"width\", dimensions.width)\n                    .attr(\"height\", dimensions.height)\n                    .style(\"background-image\", `url(\"${baseAssetsUrl}${room}.jpg\")`)\n                    .style(\"background-size\", \"100% 100%\")\n                    \n                //Draw legend\n                const legendContainer = d3.select(\"#legend\").append(\"svg\")\n                    .attr(\"width\", dimensions.width)\n                    .attr(\"height\", 75)\n\n                legendContainer.append('rect')\n                    .attr(\"x\", 0)\n                    .attr(\"y\", 0)\n                    .attr(\"width\", dimensions.width)\n                    .attr(\"height\", 70)\n                    .attr(\"fill\", \"none\")\n                    .attr(\"stroke\", \"black\")\n                    .attr(\"stroke-width\", 3)\n                    .attr(\"stroke-dasharray\", \"10 10\")\n\n                legendContainer.selectAll(\"circle\")\n                    .data(eventColors.domain())\n                    .join(\"circle\")\n                    .attr(\"cx\", (d, i) => 100 * (i+1) )\n                    .attr(\"cy\", 25)\n                    .attr(\"r\", 7)\n                    .attr(\"fill\", \"none\")\n                    .attr(\"stroke\", d => eventColors(d))\n                    .attr(\"stroke-width\", 5)\n                    \n\n                legendContainer.append('rect')\n                    .attr(\"x\", 100 * (eventColors.domain().length+1))\n                    .attr(\"y\", 15)\n                    .attr(\"width\", 14)\n                    .attr(\"height\", 14)\n                    .attr(\"fill\", \"none\")\n                    .attr(\"stroke\", \"red\")\n                    .attr(\"stroke-width\", 5)\n\n                legendContainer.selectAll(\"text\")\n                    .data(eventColors.domain())\n                    .join(\"text\")\n                    .attr(\"x\", (d, i) => 100 * (i+0.7))\n                    .attr(\"y\", 50)\n                    .attr(\"font-size\", 11)\n                    .attr(\"font-weight\", \"bold\")\n                    .text(d => d)\n\n                legendContainer.append(\"text\")\n                    .attr(\"x\", 100 * (eventColors.domain().length+0.7))\n                    .attr(\"y\", 50)\n                    .attr(\"font-size\", 11)\n                    .attr(\"font-weight\", \"bold\")\n                    .text(\"user screen\")\n                    \n                    \n                function draw_touches(event_type) {\n                    let data;\n                    if (event_type != \"all\") {\n                        data = dataset.filter(d => d.event_name === event_type)\n                    }else{\n                        data = dataset;\n                    }\n\n                    // Draw all touches and screens\n                    const touches = svg.selectAll(\"circle\")\n                        .data(data)\n                        .join(enter => enter.append(\"circle\")\n                            .attr(\"cx\", d => xScale(xAccessor(d)))\n                            .attr(\"cy\", d => yScale(yAccessor(d)))\n                            .attr(\"r\", 20)\n                            .attr(\"fill\", \"none\")\n                            .attr(\"stroke\", d => eventColors(eventName(d)))\n                            .attr(\"stroke-width\", 3)\n                            .attr('opacity', 0)\n                        )\n\n                    const screens = svg.selectAll(\"rect\")\n                        .data(data)\n                        .join(\n                            enter => enter.append(\"rect\")\n                                .attr(\"x\", d => xScale(xAccessor(d)) - (userXCoor(d)*0.42))\n                                .attr(\"y\", d => dimensions.height - dimensions.userHeight - (yScale(yAccessor(d)) - (userYCoor(d)*0.55)))\n                                .attr(\"width\", dimensions.userWidth)\n                                .attr(\"height\", dimensions.userHeight)\n                                .attr(\"fill\", \"none\") \n                                .attr(\"stroke\", \"red\")\n                                .attr(\"stroke-width\", 3)\n                                .attr('opacity', 0)\n                        )\n\n                    d3.select(\"#start_stop\").on(\"click\", function () {\n                        // Show touches by order\n                        touches\n                            .transition(500)\n                            .delay((d, i) => i * 1000)\n                            .attr('opacity', 1)\n                            .transition()\n                            .duration(1000)\n                            .attr(\"r\", 10)\n                            .attr(\"opacity\", 0.45)\n\n                        screens\n                            .transition()\n                            .attr('opacity', 1)\n                            .delay((d, i) => i * 1000)\n                            .transition()\n                            .duration(1050)\n                            .remove()\n                    });\n                }\n            draw_touches(document.querySelector(\"#event_type\").value)\n            \n            // Event listeners\n            d3.select(\"#reset\").on(\"click\", function () {\n                svg.selectAll(\"*\").remove()\n                draw_touches(document.querySelector(\"#event_type\").value)\n                })\n                \n            d3.select(\"#event_type\")\n                .on(\"change\", function (e) {\n                    e.preventDefault()\n                    svg.selectAll(\"*\").remove()\n                    draw_touches(this.value)\n                })\n    \n                    \n        })\n        d3.select(\"#room\")\n            .on(\"change\", function (e) {\n                e.preventDefault()\n                d3.select(\"#scene\").selectAll(\"*\").remove()\n                d3.select(\"#legend\").selectAll(\"*\").remove()\n                draw_scene(this.value)\n            })\n    }\n    draw_scene()  \n});\n'''\n)","metadata":{"execution":{"iopub.status.busy":"2024-03-28T14:02:43.690097Z","iopub.execute_input":"2024-03-28T14:02:43.690446Z","iopub.status.idle":"2024-03-28T14:02:43.706897Z","shell.execute_reply.started":"2024-03-28T14:02:43.690416Z","shell.execute_reply":"2024-03-28T14:02:43.705948Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Display game\nh = display(HTML(htmlt.safe_substitute(\n    {\"css_file\":css_text.substitute()})))\n\nj = py_display.Javascript(js_t.safe_substitute())\npy_display.display_javascript(j)","metadata":{"execution":{"iopub.status.busy":"2024-03-28T14:02:43.707995Z","iopub.execute_input":"2024-03-28T14:02:43.708346Z","iopub.status.idle":"2024-03-28T14:02:43.723905Z","shell.execute_reply.started":"2024-03-28T14:02:43.708313Z","shell.execute_reply":"2024-03-28T14:02:43.723031Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Part 2: Loading Dataset for Creating Data Pipeline for Preprocessing\n\n### Note: Changing the Datatypes to fascilitate faster loading of the data. The reference for datatypes is: https://www.kaggle.com/competitions/predict-student-performance-from-game-play/discussion/384359","metadata":{"papermill":{"duration":0.016747,"end_time":"2024-01-19T15:42:24.044486","exception":false,"start_time":"2024-01-19T15:42:24.027739","status":"completed"},"tags":[]}},{"cell_type":"code","source":"# Reference: https://www.kaggle.com/competitions/predict-student-performance-from-game-play/discussion/384359\ndtypes={\n    'elapsed_time':np.int32,\n    'event_name':'category',\n    'name':'category',\n    'level':np.uint8,\n    'room_coor_x':np.float32,\n    'room_coor_y':np.float32,\n    'screen_coor_x':np.float32,\n    'screen_coor_y':np.float32,\n    'hover_duration':np.float32,\n    'text':'category',\n    'fqid':'category',\n    'room_fqid':'category',\n    'text_fqid':'category',\n    'fullscreen':'category',\n    'hq':'category',\n    'music':'category',\n    'level_group':'category'}\n\ndataset_df = pd.read_csv('/kaggle/input/predict-student-performance-from-game-play/train.csv', dtype=dtypes)\nprint(\"Full train dataset shape is {}\".format(dataset_df.shape))","metadata":{"papermill":{"duration":133.61806,"end_time":"2024-01-19T15:44:37.679487","exception":false,"start_time":"2024-01-19T15:42:24.061427","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-03-28T14:02:43.724938Z","iopub.execute_input":"2024-03-28T14:02:43.725218Z","iopub.status.idle":"2024-03-28T14:04:11.203814Z","shell.execute_reply.started":"2024-03-28T14:02:43.725188Z","shell.execute_reply":"2024-03-28T14:04:11.202872Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Loading Labels: Please note that Labels have Question Number appended with Session ID. ","metadata":{"papermill":{"duration":0.015369,"end_time":"2024-01-19T15:44:37.710924","exception":false,"start_time":"2024-01-19T15:44:37.695555","status":"completed"},"tags":[]}},{"cell_type":"code","source":"labels = pd.read_csv('/kaggle/input/predict-student-performance-from-game-play/train_labels.csv')\nlabels['session'] = labels.session_id.apply(lambda x: int(x.split('_')[0]) )\nlabels['q'] = labels.session_id.apply(lambda x: int(x.split('_')[-1][1:]) )","metadata":{"papermill":{"duration":1.435194,"end_time":"2024-01-19T15:44:39.16255","exception":false,"start_time":"2024-01-19T15:44:37.727356","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-03-28T14:04:11.20503Z","iopub.execute_input":"2024-03-28T14:04:11.205323Z","iopub.status.idle":"2024-03-28T14:04:12.359038Z","shell.execute_reply.started":"2024-03-28T14:04:11.205276Z","shell.execute_reply":"2024-03-28T14:04:12.357997Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Step 1: Preprocessing the Data as per the Kaggle Discussion Forums\n\n#### The reference for preprocessing is the below description from the Competition Abstract\n<br>\nTo preprocess the data according to the information provided in the Kaggle discussion forums and the competition abstract, we need to group our dataset based on the level groups. The association between level groups and questions is as follows:\n\n1.Questions 1 to 3 correspond to level group 0-4.\n\n2.Questions 4 to 13 correspond to level group 5-12.\n\n3.Questions 14 to 18 correspond to level group 13-22.\n\nTherefore, we'll need to split our dataset into these three groups based on the level group each question belongs to.\n\nHere's how we can proceed with preprocessing the data:\n\nGroup the dataset based on the level groups specified above.\nAccess the data for each question group and further process it as needed.","metadata":{"papermill":{"duration":0.017839,"end_time":"2024-01-19T15:44:39.19903","exception":false,"start_time":"2024-01-19T15:44:39.181191","status":"completed"},"tags":[]}},{"cell_type":"code","source":"# Categorizing Features on the Type\nCATEGORICAL = ['event_name', 'name','fqid', 'room_fqid', 'text_fqid']\nNUMERICAL = ['elapsed_time','level','page','room_coor_x', 'room_coor_y', \n        'screen_coor_x', 'screen_coor_y', 'hover_duration']","metadata":{"papermill":{"duration":0.027763,"end_time":"2024-01-19T15:44:39.245846","exception":false,"start_time":"2024-01-19T15:44:39.218083","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-03-28T14:04:12.360131Z","iopub.execute_input":"2024-03-28T14:04:12.360443Z","iopub.status.idle":"2024-03-28T14:04:12.365172Z","shell.execute_reply.started":"2024-03-28T14:04:12.360417Z","shell.execute_reply":"2024-03-28T14:04:12.364339Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Reference: https://www.kaggle.com/code/cdeotte/random-forest-baseline-0-664/notebook\n\ndef feature_engineer(dataset_df):\n    dfs = []\n    for c in CATEGORICAL:\n        tmp = dataset_df.groupby(['session_id','level_group'])[c].agg('nunique')\n        tmp.name = tmp.name + '_nunique'\n        dfs.append(tmp)\n    for c in NUMERICAL:\n        tmp = dataset_df.groupby(['session_id','level_group'])[c].agg('mean')\n        dfs.append(tmp)\n    for c in NUMERICAL:\n        tmp = dataset_df.groupby(['session_id','level_group'])[c].agg('std')\n        tmp.name = tmp.name + '_std'\n        dfs.append(tmp)\n    dataset_df = pd.concat(dfs,axis=1)\n    dataset_df = dataset_df.fillna(-1)\n    dataset_df = dataset_df.reset_index()\n    dataset_df = dataset_df.set_index('session_id')\n    return dataset_df","metadata":{"papermill":{"duration":0.030669,"end_time":"2024-01-19T15:44:39.293922","exception":false,"start_time":"2024-01-19T15:44:39.263253","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-03-28T14:04:12.366254Z","iopub.execute_input":"2024-03-28T14:04:12.366578Z","iopub.status.idle":"2024-03-28T14:04:12.377245Z","shell.execute_reply.started":"2024-03-28T14:04:12.366545Z","shell.execute_reply":"2024-03-28T14:04:12.376451Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Pre-Processing whole Dataset at Once to avoid any Data Errors while Training and Testing","metadata":{"papermill":{"duration":0.016235,"end_time":"2024-01-19T15:44:39.326691","exception":false,"start_time":"2024-01-19T15:44:39.310456","status":"completed"},"tags":[]}},{"cell_type":"code","source":"dataset_df = feature_engineer(dataset_df)\nprint(\"Dataset shape is {}\".format(dataset_df.shape))","metadata":{"papermill":{"duration":38.247907,"end_time":"2024-01-19T15:45:17.591016","exception":false,"start_time":"2024-01-19T15:44:39.343109","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-03-28T14:04:12.378276Z","iopub.execute_input":"2024-03-28T14:04:12.378559Z","iopub.status.idle":"2024-03-28T14:04:36.561237Z","shell.execute_reply.started":"2024-03-28T14:04:12.378536Z","shell.execute_reply":"2024-03-28T14:04:36.560257Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Plotting the division of Correct and Incorrect answers at Question Level","metadata":{"papermill":{"duration":0.016781,"end_time":"2024-01-19T15:45:17.62543","exception":false,"start_time":"2024-01-19T15:45:17.608649","status":"completed"},"tags":[]}},{"cell_type":"code","source":"import plotly.express as px\n\n# Assuming you have already imported 'labels' DataFrame and have performed necessary operations\n\n# Group the data\ngrouped_data = labels.groupby(['q', 'correct']).size().unstack(fill_value=0)\n\n# Reset the index to ensure 'q' and 'correct' become columns\ngrouped_data = grouped_data.reset_index()\n\n# Rename the columns to match the expected names in the Plotly code\ngrouped_data = grouped_data.rename(columns={False: 'Incorrect', True: 'Correct'})\n\n# Melt the DataFrame to create a tidy format for Plotly\ngrouped_data_melted = grouped_data.melt(id_vars=['q'], value_vars=['Correct', 'Incorrect'], var_name='Correctness', value_name='Count')\n\n# Plot the data as a grouped bar chart using Plotly Express\nfig = px.bar(grouped_data_melted, x='q', y='Count', color='Correctness', barmode='group',\n             labels={'q': 'Question', 'Count': 'Count', 'Correctness': 'Correctness'},\n             title='Number of Correct and Incorrect Answers by Question')\n\n# Show the plot\nfig.show()\n","metadata":{"papermill":{"duration":0.470567,"end_time":"2024-01-19T15:45:18.113193","exception":false,"start_time":"2024-01-19T15:45:17.642626","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-03-28T14:04:36.56256Z","iopub.execute_input":"2024-03-28T14:04:36.564455Z","iopub.status.idle":"2024-03-28T14:04:38.143061Z","shell.execute_reply.started":"2024-03-28T14:04:36.564426Z","shell.execute_reply":"2024-03-28T14:04:38.142105Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Step 2: Splitting Data into Training, Validation, and Testing","metadata":{"papermill":{"duration":0.017266,"end_time":"2024-01-19T15:45:18.147768","exception":false,"start_time":"2024-01-19T15:45:18.130502","status":"completed"},"tags":[]}},{"cell_type":"markdown","source":"#### We are first dividing Data into Training and Testing, where 80% is Training and 20% is Testing. Then we are using Training Data to again Split it into Validation Data with same Ratio","metadata":{"papermill":{"duration":0.016803,"end_time":"2024-01-19T15:45:18.181756","exception":false,"start_time":"2024-01-19T15:45:18.164953","status":"completed"},"tags":[]}},{"cell_type":"code","source":"# Splitting DataSet into Train and Valid\ndef split_dataset(dataset, test_ratio=0.20):\n    USER_LIST = dataset.index.unique()\n    split = int(len(USER_LIST) * (1 - 0.20))\n    return dataset.loc[USER_LIST[:split]], dataset.loc[USER_LIST[split:]]\n\n# Generating Split DataSet\ntrain_x, test_x = split_dataset(dataset_df)\nprint(\"{} examples in training, {} examples in validation.\".format(\n    len(train_x), len(test_x)))","metadata":{"papermill":{"duration":0.112034,"end_time":"2024-01-19T15:45:18.310802","exception":false,"start_time":"2024-01-19T15:45:18.198768","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-03-28T14:04:38.14409Z","iopub.execute_input":"2024-03-28T14:04:38.14436Z","iopub.status.idle":"2024-03-28T14:04:38.235466Z","shell.execute_reply.started":"2024-03-28T14:04:38.144337Z","shell.execute_reply":"2024-03-28T14:04:38.234569Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Splitting the Data into Train and Test\ntrain_x, valid_x = split_dataset(train_x)\nprint(\"{} examples in training, {} examples in testing.\".format(\n    len(train_x), len(valid_x)))","metadata":{"papermill":{"duration":0.091244,"end_time":"2024-01-19T15:45:18.419811","exception":false,"start_time":"2024-01-19T15:45:18.328567","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-03-28T14:04:38.23647Z","iopub.execute_input":"2024-03-28T14:04:38.236744Z","iopub.status.idle":"2024-03-28T14:04:38.307579Z","shell.execute_reply.started":"2024-03-28T14:04:38.23672Z","shell.execute_reply":"2024-03-28T14:04:38.306635Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Step 3: Creating an input pipeline as per techniques mentioned in W5.\n\n#### We need to train 18 Models for 18 Questions. So we will be generating pipeline for dataset of each Question. ","metadata":{"papermill":{"duration":0.017004,"end_time":"2024-01-19T15:45:18.454075","exception":false,"start_time":"2024-01-19T15:45:18.437071","status":"completed"},"tags":[]}},{"cell_type":"code","source":"# Function to Split DataSet into Parts\ndef save_to_multiple_csv_files(data, name_prefix, question, header=None, n_parts=5):\n    # Setting the Directory\n    # Creating Directory for Each Question\n    game_prediction_dir = os.path.join(\"/kaggle/working/datasets_\"+str(question), \"student_performance_data\")\n    os.makedirs(game_prediction_dir, exist_ok=True)\n    path_format = os.path.join(game_prediction_dir, \"my_{}_{:02d}.csv\")\n\n    filepaths = []\n    m = len(data)\n    for file_idx, row_indices in enumerate(np.array_split(np.arange(m), n_parts)):\n        part_csv = path_format.format(name_prefix, file_idx)\n        filepaths.append(part_csv)\n        with open(part_csv, \"wt\", encoding=\"utf-8\") as f:\n            if header is not None:\n                f.write(header)\n                f.write(\"\\n\")\n            for row_idx in row_indices:\n                f.write(\",\".join([repr(col) for col in data[row_idx]]))\n                f.write(\"\\n\")\n    return filepaths","metadata":{"papermill":{"duration":0.030164,"end_time":"2024-01-19T15:45:18.50117","exception":false,"start_time":"2024-01-19T15:45:18.471006","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-03-28T14:04:38.308828Z","iopub.execute_input":"2024-03-28T14:04:38.309192Z","iopub.status.idle":"2024-03-28T14:04:38.317861Z","shell.execute_reply.started":"2024-03-28T14:04:38.309159Z","shell.execute_reply":"2024-03-28T14:04:38.316952Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Generating CSV files for Each Question and Saving them\ntrain_file_paths_for_questions = []\nvalid_file_paths_for_questions = []\ntest_file_paths_for_questions = []\n\nheader_cols = train_x.columns\nheader = \",\".join(header_cols)\n\nfor q_no in range(1,19):\n    \n    # Selecting the Group based on Question Number\n    if q_no<=3: grp = '0-4'\n    elif q_no<=13: grp = '5-12'\n    elif q_no<=22: grp = '13-22'\n    print(\"##### Generating CSV for quetion_number\", q_no, \"group\", grp)\n    \n    # Filter the rows in the datasets based on the selected level group. \n    train_df = train_x.loc[train_x.level_group == grp]\n    train_users = train_df.index.values\n    valid_df = valid_x.loc[valid_x.level_group == grp]\n    valid_users = valid_df.index.values\n    test_df = test_x.loc[test_x.level_group == grp]\n    test_users = test_df.index.values\n    \n    # Select the labels for the related q_no.\n    train_labels = labels.loc[labels.q==q_no].set_index('session').loc[train_users]\n    valid_labels = labels.loc[labels.q==q_no].set_index('session').loc[valid_users]\n    test_labels = labels.loc[labels.q==q_no].set_index('session').loc[test_users]\n    \n     # Add the label to the filtered datasets.\n    train_df[\"correct\"] = train_labels[\"correct\"]\n    valid_df[\"correct\"] = valid_labels[\"correct\"]\n    test_df[\"correct\"] = test_labels[\"correct\"]\n    \n    # Dropping Column Level Group\n    train_ds_data = train_df.drop(columns=['level_group'])\n    valid_ds_data = valid_df.drop(columns=['level_group'])\n    test_ds_data = test_df.drop(columns=['level_group'])\n    train_ds_data.reset_index()\n    valid_ds_data.reset_index()\n    test_ds_data.reset_index()\n    \n    # Calling function to generate CSVs\n    train_filepaths = save_to_multiple_csv_files(train_ds_data.to_numpy(), \"train\", \"q_no_\"+str(q_no), header, n_parts=5)\n    valid_filepaths = save_to_multiple_csv_files(valid_ds_data.to_numpy(), \"valid\", \"q_no_\"+str(q_no), header, n_parts=5)\n    test_filepaths = save_to_multiple_csv_files(test_ds_data.to_numpy(), \"test\", \"q_no_\"+str(q_no), header, n_parts=5)\n    \n    # Saving File Paths\n    train_file_paths_for_questions.append(train_filepaths)\n    valid_file_paths_for_questions.append(valid_filepaths)\n    test_file_paths_for_questions.append(test_filepaths)","metadata":{"papermill":{"duration":8.803522,"end_time":"2024-01-19T15:45:27.322025","exception":false,"start_time":"2024-01-19T15:45:18.518503","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-03-28T14:04:38.3194Z","iopub.execute_input":"2024-03-28T14:04:38.31975Z","iopub.status.idle":"2024-03-28T14:04:46.896883Z","shell.execute_reply.started":"2024-03-28T14:04:38.319718Z","shell.execute_reply":"2024-03-28T14:04:46.895803Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Pre Process Function\nn_inputs = 21\ndef preprocess(line):\n\n    defs = [0.] * n_inputs + [tf.constant([], dtype=tf.float32)]\n\n    fields = tf.io.decode_csv(line, record_defaults=defs)\n    X = tf.stack(fields[:-1])\n    y = tf.stack(fields[-1:])\n    return X, y","metadata":{"papermill":{"duration":0.028619,"end_time":"2024-01-19T15:45:27.368863","exception":false,"start_time":"2024-01-19T15:45:27.340244","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-03-28T14:04:46.898335Z","iopub.execute_input":"2024-03-28T14:04:46.898753Z","iopub.status.idle":"2024-03-28T14:04:46.904483Z","shell.execute_reply.started":"2024-03-28T14:04:46.898711Z","shell.execute_reply":"2024-03-28T14:04:46.90356Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# CSV Reader for Train\ndef csv_reader_dataset(filepaths, repeat=1, n_readers=5,  # number of files or filepaths\n                       n_read_threads=None, shuffle_buffer_size=10000,\n                       n_parse_threads=5, batch_size=32):\n    \n    dataset = tf.data.Dataset.list_files(filepaths).repeat(repeat)\n    \n    \n    \n    dataset = dataset.interleave(\n        lambda filepath: tf.data.TextLineDataset(filepath).skip(1), # skip the header row via map_func\n        cycle_length=n_readers, # 'interleave' pull cycle_length(=n_readers) file paths(1 by 1) from the 'dataset'\n        num_parallel_calls=n_read_threads) \n    dataset = dataset.shuffle(shuffle_buffer_size)\n    dataset = dataset.map(preprocess, num_parallel_calls=n_parse_threads)\n    dataset = dataset.batch(batch_size)\n    \n    return dataset.prefetch(1)","metadata":{"papermill":{"duration":0.02955,"end_time":"2024-01-19T15:45:27.416347","exception":false,"start_time":"2024-01-19T15:45:27.386797","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-03-28T14:04:46.90564Z","iopub.execute_input":"2024-03-28T14:04:46.905903Z","iopub.status.idle":"2024-03-28T14:04:46.918543Z","shell.execute_reply.started":"2024-03-28T14:04:46.90588Z","shell.execute_reply":"2024-03-28T14:04:46.917622Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Using the Saved CSV Loading the Data and saving them to a List\ntrain_set_list = []\nvalid_set_list = []\ntest_set_list = []\n\n\nfor q_no in range(1,19):\n\n    # Select level group for the question based on the q_no.\n    if q_no<=3: grp = '0-4'\n    elif q_no<=13: grp = '5-12'\n    elif q_no<=22: grp = '13-22'\n    print(\"##### Loading CSV for quetion_number\", q_no, \"group\", grp)\n    \n    train_set = csv_reader_dataset(train_file_paths_for_questions[q_no - 1])\n    valid_set = csv_reader_dataset(valid_file_paths_for_questions[q_no - 1]) \n    test_set = csv_reader_dataset(test_file_paths_for_questions[q_no - 1])   \n    \n    train_set_list.append(train_set)\n    valid_set_list.append(valid_set)\n    test_set_list.append(test_set)","metadata":{"papermill":{"duration":6.8658,"end_time":"2024-01-19T15:45:34.300342","exception":false,"start_time":"2024-01-19T15:45:27.434542","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-03-28T14:04:46.919713Z","iopub.execute_input":"2024-03-28T14:04:46.919984Z","iopub.status.idle":"2024-03-28T14:04:52.115522Z","shell.execute_reply.started":"2024-03-28T14:04:46.919961Z","shell.execute_reply":"2024-03-28T14:04:52.114482Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Extras: Functions for Generating Graphs","metadata":{"papermill":{"duration":0.01845,"end_time":"2024-01-19T15:45:34.338011","exception":false,"start_time":"2024-01-19T15:45:34.319561","status":"completed"},"tags":[]}},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nimport pandas as pd\n\ndef plotGridGraphs(history_models_list):\n    # Loss and Accuracy Update Plots\n    # create a 3x6 grid of plots\n    fig, axes = plt.subplots(nrows=6, ncols=3, figsize=(30, 30))\n\n    # loop over each plot and generate the learning curve for each model\n    for i, ax in enumerate(axes.flatten()):\n        if i < len(history_models_list):  # Check if index is within the range of history_models_list\n            # get the history object for the current model\n            history = history_models_list[i]\n\n            # generate the learning curve for the current model\n            pd.DataFrame(history.history).plot(ax=ax, figsize=(20, 20))\n            ax.grid(True)\n            ax.set_ylim(0, 1)\n            ax.set_title(f\"Question {i+1}\")\n        else:\n            # If there are fewer models than plots, remove empty subplots\n            fig.delaxes(ax)\n\n    fig.subplots_adjust(wspace=0.4, hspace=0.4)\n    # save and show the plot\n    # plt.tight_layout()\nplt.show()\n","metadata":{"papermill":{"duration":0.029739,"end_time":"2024-01-19T15:45:34.386478","exception":false,"start_time":"2024-01-19T15:45:34.356739","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-03-28T14:04:52.116843Z","iopub.execute_input":"2024-03-28T14:04:52.118597Z","iopub.status.idle":"2024-03-28T14:04:52.126609Z","shell.execute_reply.started":"2024-03-28T14:04:52.118564Z","shell.execute_reply":"2024-03-28T14:04:52.125535Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def accuracy_bar_plot(test_loss_and_accuracy_list):\n    # Accuracy Plot\n    accuracy_list_dnn_1 = [accuracy[1] for accuracy in test_loss_and_accuracy_list]\n    loss_list_dnn_1 = [loss[0] for loss in test_loss_and_accuracy_list]\n    fig, ax = plt.subplots()\n    ax.bar(range(len(accuracy_list_dnn_1)), accuracy_list_dnn_1)\n    ax.set_xticks(range(len(accuracy_list_dnn_1)))\n\n    ax.set_xticklabels(['Q {}'.format(i) for i in range(1, len(accuracy_list_dnn_1) + 1)], rotation = 90)\n\n\n    ax.set_xlabel('Questions')\n    ax.set_ylabel('Accuracy')\n    ax.set_title('Accuracy for each Question')\n    plt.show()\n\n    average_accuracy = np.mean(accuracy_list_dnn_1)\n    print(\"Average accuracy is: \", average_accuracy*100, \"%\")\n","metadata":{"papermill":{"duration":0.02982,"end_time":"2024-01-19T15:45:34.434541","exception":false,"start_time":"2024-01-19T15:45:34.404721","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-03-28T14:04:52.128103Z","iopub.execute_input":"2024-03-28T14:04:52.128478Z","iopub.status.idle":"2024-03-28T14:04:52.143582Z","shell.execute_reply.started":"2024-03-28T14:04:52.128444Z","shell.execute_reply":"2024-03-28T14:04:52.142614Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def f1_score_bar_plot(f1_score_list):\n    # F1 Score Plot\n    fig, ax = plt.subplots()\n    ax.bar(range(len(f1_score_list)), f1_score_list, color=(0.2, 0.4, 0.6, 0.6))\n    ax.set_xticks(range(len(f1_score_list)))\n\n    ax.set_xticklabels(['Q {}'.format(i) for i in range(1, len(f1_score_list) + 1)], rotation = 90)\n\n\n    ax.set_xlabel('Questions')\n    ax.set_ylabel('F1 Score')\n    ax.set_title('F1 Score for each Question')\n    plt.show()\n\n    average_f1_score = np.mean(f1_score_list)\n    print(\"Average F1 Score is: \", average_f1_score*100)","metadata":{"papermill":{"duration":0.029613,"end_time":"2024-01-19T15:45:34.482485","exception":false,"start_time":"2024-01-19T15:45:34.452872","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-03-28T14:04:52.14467Z","iopub.execute_input":"2024-03-28T14:04:52.144938Z","iopub.status.idle":"2024-03-28T14:04:52.153699Z","shell.execute_reply.started":"2024-03-28T14:04:52.144915Z","shell.execute_reply":"2024-03-28T14:04:52.152915Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Part 3: Deep Networks Model Training and Testing","metadata":{"papermill":{"duration":0.018971,"end_time":"2024-01-19T15:45:34.520255","exception":false,"start_time":"2024-01-19T15:45:34.501284","status":"completed"},"tags":[]}},{"cell_type":"markdown","source":"## Step 1: Using W2 to create a Deep Neural Network with 1 I/P Layer, 1 O/P Layer, and 3 Hidden Layers, without any Normalization or Drop Outs. \n### Note: Keeping Epochs as 20 for all the Questions with an Early Stop with patience of 7","metadata":{"papermill":{"duration":0.020034,"end_time":"2024-01-19T15:45:34.559584","exception":false,"start_time":"2024-01-19T15:45:34.53955","status":"completed"},"tags":[]}},{"cell_type":"code","source":"# Training Models for Each Question\ntest_loss_and_accuracy_list = []\nhistory_models = []\nmodels = {}\nf1_score_list = []\n\nfor q_no in range(1,19):\n\n    # Select level group for the question based on the q_no.\n    if q_no<=3: grp = '0-4'\n    elif q_no<=13: grp = '5-12'\n    elif q_no<=22: grp = '13-22'\n    print(\"##### Training for quetion_number\", q_no, \"group\", grp)\n    \n    train_set = train_set_list[q_no - 1]\n    valid_set = valid_set_list[q_no - 1]\n    test_set = test_set_list[q_no - 1]\n    \n    model = keras.models.Sequential([\n        keras.layers.Dense(400, activation='relu', input_shape=(21,)),\n        keras.layers.Dense(200, activation='relu'),\n        keras.layers.Dense(100, activation='relu'),\n        keras.layers.Dense(50, activation='relu'),\n        keras.layers.Dense(1, activation=\"sigmoid\")\n    ])\n\n    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])\n    early_stopping = EarlyStopping(monitor='val_accuracy', mode='max', patience=7,  restore_best_weights=True)\n    history = model.fit(train_set, epochs=3, validation_data=(valid_set), callbacks=[early_stopping])\n    \n    # Store the model\n    models[f'{grp}_{q_no}'] = model    \n    \n    # Saving Accuracies\n    results = model.evaluate(test_set)\n    test_loss_and_accuracy_list.append(results)\n    \n    # Saving History of Models\n    history_models.append(history)\n    \n    # F1 Score\n    y_true_numpy_list = []\n    \n    predictions = model.predict(test_set, verbose=0)\n    predictions = predictions.round().astype(int).flatten()\n    \n    for x_batch, y_batch in test_set:\n    \n        y_batch = y_batch.numpy()\n        y_batch = y_batch.round().astype(int).flatten()\n\n        y_true_numpy_list.append(y_batch)\n        \n    y_true_numpy = np.concatenate(y_true_numpy_list)\n    f1_score_list.append(f1_score(y_true_numpy, predictions))","metadata":{"papermill":{"duration":203.701619,"end_time":"2024-01-19T15:48:58.280879","exception":false,"start_time":"2024-01-19T15:45:34.57926","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-03-28T14:04:52.154939Z","iopub.execute_input":"2024-03-28T14:04:52.155209Z","iopub.status.idle":"2024-03-28T14:07:21.927765Z","shell.execute_reply.started":"2024-03-28T14:04:52.155186Z","shell.execute_reply":"2024-03-28T14:07:21.926786Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"","metadata":{"papermill":{"duration":0.275726,"end_time":"2024-01-19T15:48:58.775106","exception":false,"start_time":"2024-01-19T15:48:58.49938","status":"completed"},"tags":[]}},{"cell_type":"code","source":"plotGridGraphs(history_models)\naccuracy_bar_plot(test_loss_and_accuracy_list, title=\"Accuracy of Models\")\nf1_score_bar_plot(f1_score_list, title=\"F1 Score of Models\")\n","metadata":{"papermill":{"duration":0.215571,"end_time":"2024-01-19T15:48:59.204005","exception":false,"start_time":"2024-01-19T15:48:58.988434","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-03-28T14:07:21.928933Z","iopub.execute_input":"2024-03-28T14:07:21.929214Z","iopub.status.idle":"2024-03-28T14:07:28.040121Z","shell.execute_reply.started":"2024-03-28T14:07:21.929191Z","shell.execute_reply":"2024-03-28T14:07:28.038729Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"papermill":{"duration":0.250908,"end_time":"2024-01-19T15:48:59.686355","exception":false,"start_time":"2024-01-19T15:48:59.435447","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Plotting Learning Curve, Accuracy Comparisons, and F1 Score Comparisons","metadata":{"papermill":{"duration":0.232508,"end_time":"2024-01-19T15:49:00.158624","exception":false,"start_time":"2024-01-19T15:48:59.926116","status":"completed"},"tags":[]}},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"code","source":"plotGridGraphs(history_models)\naccuracy_bar_plot(test_loss_and_accuracy_list)\nf1_score_bar_plot(f1_score_list)","metadata":{"papermill":{"duration":3.891632,"end_time":"2024-01-19T15:49:04.266012","exception":false,"start_time":"2024-01-19T15:49:00.37438","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-03-28T14:09:45.225234Z","iopub.execute_input":"2024-03-28T14:09:45.225705Z","iopub.status.idle":"2024-03-28T14:09:49.868795Z","shell.execute_reply.started":"2024-03-28T14:09:45.225672Z","shell.execute_reply":"2024-03-28T14:09:49.867831Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Step 2: Using W2 to create a Deep Neural Network with 1 I/P Layer, 1 O/P Layer, and 5 Hidden Layers, with Batch Normalization Layer. \n### Note: Keeping Epochs as 20 for all the Questions with an Early Stop with patience of 7","metadata":{"papermill":{"duration":0.215782,"end_time":"2024-01-19T15:49:04.700632","exception":false,"start_time":"2024-01-19T15:49:04.48485","status":"completed"},"tags":[]}},{"cell_type":"code","source":"# Training Models for Each Question\ntest_loss_and_accuracy_list = []\nhistory_models = []\nmodels = {}\nf1_score_list = []\n\nfor q_no in range(1,19):\n\n    # Select level group for the question based on the q_no.\n    if q_no<=3: grp = '0-4'\n    elif q_no<=13: grp = '5-12'\n    elif q_no<=22: grp = '13-22'\n    print(\"##### Training for quetion_number\", q_no, \"group\", grp)\n    \n    train_set = train_set_list[q_no - 1]\n    valid_set = valid_set_list[q_no - 1]\n    test_set = test_set_list[q_no - 1]\n    \n    \n    model = keras.models.Sequential([\n        keras.layers.Dense(512, activation='relu', input_shape=(21,)),\n        keras.layers.BatchNormalization(),\n        keras.layers.Dense(256, activation='relu'),\n        keras.layers.BatchNormalization(),\n        keras.layers.Dense(128, activation='relu'),\n        keras.layers.BatchNormalization(),\n        keras.layers.Dense(64, activation='relu'),\n        keras.layers.BatchNormalization(),\n        keras.layers.Dense(32, activation='relu'),\n        keras.layers.BatchNormalization(),\n        keras.layers.Dense(16, activation='relu'),\n        keras.layers.BatchNormalization(),\n        keras.layers.Dense(1, activation=\"sigmoid\")\n    ])\n\n    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])\n    early_stopping = EarlyStopping(monitor='val_accuracy', mode='max', patience=7,  restore_best_weights=True)\n    history = model.fit(train_set, epochs=20, validation_data=(valid_set), callbacks=[early_stopping])\n    \n    # Store the model\n    models[f'{grp}_{q_no}'] = model    \n    \n    # Saving Accuracies\n    results = model.evaluate(test_set)\n    test_loss_and_accuracy_list.append(results)\n    \n    # Saving History of Models\n    history_models.append(history)\n    \n    # F1 Score\n    y_true_numpy_list = []\n    \n    predictions = model.predict(test_set, verbose=0)\n    predictions = predictions.round().astype(int).flatten()\n    \n    for x_batch, y_batch in test_set:\n    \n        y_batch = y_batch.numpy()\n        y_batch = y_batch.round().astype(int).flatten()\n\n        y_true_numpy_list.append(y_batch)\n        \n    y_true_numpy = np.concatenate(y_true_numpy_list)\n    f1_score_list.append(f1_score(y_true_numpy, predictions))","metadata":{"papermill":{"duration":1094.013747,"end_time":"2024-01-19T16:07:18.93401","exception":false,"start_time":"2024-01-19T15:49:04.920263","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-03-28T14:12:59.666064Z","iopub.execute_input":"2024-03-28T14:12:59.666733Z","iopub.status.idle":"2024-03-28T14:13:04.722973Z","shell.execute_reply.started":"2024-03-28T14:12:59.666694Z","shell.execute_reply":"2024-03-28T14:13:04.721652Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plotGridGraphs(history_models)\naccuracy_bar_plot(test_loss_and_accuracy_list)\nf1_score_bar_plot(f1_score_list)","metadata":{"papermill":{"duration":5.306528,"end_time":"2024-01-19T16:07:25.897487","exception":false,"start_time":"2024-01-19T16:07:20.590959","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-03-28T14:07:28.045365Z","iopub.status.idle":"2024-03-28T14:07:28.045756Z","shell.execute_reply.started":"2024-03-28T14:07:28.045566Z","shell.execute_reply":"2024-03-28T14:07:28.045582Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Step 3:\n## 1.Using W2 to create a Deep Neural Network with 1 I/P Layer, 1 O/P Layer, and 5 Hidden Layers, with Batch Normalization Layer and Drop Outs. \n\n### Note: Keeping Epochs as 20 for all the Questions with an Early Stop with patience of 7","metadata":{"papermill":{"duration":1.729253,"end_time":"2024-01-19T16:07:29.329025","exception":false,"start_time":"2024-01-19T16:07:27.599772","status":"completed"},"tags":[]}},{"cell_type":"code","source":"# Training Models for Each Question\ntest_loss_and_accuracy_list = []\nhistory_models = []\nmodels = {}\nf1_score_list = []\n\nfor q_no in range(1,19):\n\n    # Select level group for the question based on the q_no.\n    if q_no<=3: grp = '0-4'\n    elif q_no<=13: grp = '5-12'\n    elif q_no<=22: grp = '13-22'\n    print(\"##### Training for quetion_number\", q_no, \"group\", grp)\n    \n    train_set = train_set_list[q_no - 1]\n    valid_set = valid_set_list[q_no - 1]\n    test_set = test_set_list[q_no - 1]\n    \n    \n    model = keras.models.Sequential([\n        keras.layers.Dense(512, activation='relu', input_shape=(21,)),\n        keras.layers.BatchNormalization(),\n        keras.layers.Dense(256, activation='relu'),\n        keras.layers.BatchNormalization(),\n        keras.layers.Dropout(0.2),\n        keras.layers.Dense(128, activation='relu'),\n        keras.layers.BatchNormalization(),\n        keras.layers.Dropout(0.2),\n        keras.layers.Dense(64, activation='relu'),\n        keras.layers.BatchNormalization(),\n        keras.layers.Dropout(0.2),\n        keras.layers.Dense(32, activation='relu'),\n        keras.layers.BatchNormalization(),\n        keras.layers.Dropout(0.2),\n        keras.layers.Dense(16, activation='relu'),\n        keras.layers.BatchNormalization(),\n        keras.layers.Dense(1, activation=\"sigmoid\")\n    ])\n\n    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])\n    early_stopping = EarlyStopping(monitor='val_accuracy', mode='max', patience=7,  restore_best_weights=True)\n    history = model.fit(train_set, epochs=20, validation_data=(valid_set), callbacks=[early_stopping])\n    \n    # Store the model\n    models[f'{grp}_{q_no}'] = model    \n    \n    # Saving Accuracies\n    results = model.evaluate(test_set)\n    test_loss_and_accuracy_list.append(results)\n    \n    # Saving History of Models\n    history_models.append(history)\n    \n    # F1 Score\n    y_true_numpy_list = []\n    \n    predictions = model.predict(test_set, verbose=0)\n    predictions = predictions.round().astype(int).flatten()\n    \n    for x_batch, y_batch in test_set:\n    \n        y_batch = y_batch.numpy()\n        y_batch = y_batch.round().astype(int).flatten()\n\n        y_true_numpy_list.append(y_batch)\n        \n    y_true_numpy = np.concatenate(y_true_numpy_list)\n    f1_score_list.append(f1_score(y_true_numpy, predictions))","metadata":{"papermill":{"duration":1083.129365,"end_time":"2024-01-19T16:25:34.125163","exception":false,"start_time":"2024-01-19T16:07:30.995798","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-03-28T14:07:28.047596Z","iopub.status.idle":"2024-03-28T14:07:28.047973Z","shell.execute_reply.started":"2024-03-28T14:07:28.047787Z","shell.execute_reply":"2024-03-28T14:07:28.047803Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plotGridGraphs(history_models)\naccuracy_bar_plot(test_loss_and_accuracy_list)\nf1_score_bar_plot(f1_score_list)","metadata":{"papermill":{"duration":6.573151,"end_time":"2024-01-19T16:25:43.634812","exception":false,"start_time":"2024-01-19T16:25:37.061661","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-03-28T14:07:28.048883Z","iopub.status.idle":"2024-03-28T14:07:28.049263Z","shell.execute_reply.started":"2024-03-28T14:07:28.049067Z","shell.execute_reply":"2024-03-28T14:07:28.049083Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Step 4: Using W2 to create a Deep Neural Network with 1 I/P Layer, 1 O/P Layer, and 5 Hidden Layers, with Batch Normalization Layer and Drop Outs. Using SGD Optimizer\n\n### Note: Keeping Epochs as 20 for all the Questions with an Early Stop with patience of 3. We reduced the Patience Since no meaningful increase in accuracy is observed with Epochs","metadata":{"papermill":{"duration":2.984272,"end_time":"2024-01-19T16:25:49.707807","exception":false,"start_time":"2024-01-19T16:25:46.723535","status":"completed"},"tags":[]}},{"cell_type":"code","source":"from sklearn.metrics import f1_score\nfrom keras.callbacks import EarlyStopping\nimport numpy as np\n\ntest_loss_and_accuracy_list = []\nhistory_models = []\nmodels = {}\nf1_score_list = []\n\n# Training Models for Each Question\nfor q_no in range(1, 19):\n    if q_no <= 3:\n        grp = '0-4'\n    elif q_no <= 13:\n        grp = '5-12'\n    else:\n        grp = '13-22'\n\n    print(\"##### Training for quetion-number\", q_no, \"group\", grp)\n    \n    train_set = train_set_list[q_no - 1]\n    valid_set = valid_set_list[q_no - 1]\n    test_set = test_set_list[q_no - 1]\n    \n    model = keras.models.Sequential([\n        keras.layers.Dense(512, activation='relu', input_shape=(21,)),\n        keras.layers.BatchNormalization(),\n        keras.layers.Dense(256, activation='relu'),\n        keras.layers.BatchNormalization(),\n        keras.layers.Dropout(0.2),\n        keras.layers.Dense(128, activation='relu'),\n        keras.layers.BatchNormalization(),\n        keras.layers.Dropout(0.2),\n        keras.layers.Dense(64, activation='relu'),\n        keras.layers.BatchNormalization(),\n        keras.layers.Dropout(0.2),\n        keras.layers.Dense(32, activation='relu'),\n        keras.layers.BatchNormalization(),\n        keras.layers.Dropout(0.2),\n        keras.layers.Dense(16, activation='relu'),\n        keras.layers.BatchNormalization(),\n        keras.layers.Dense(1, activation=\"sigmoid\")\n    ])\n\n    model.compile(loss='binary_crossentropy', optimizer='sgd', metrics=['accuracy'])\n    early_stopping = EarlyStopping(monitor='val_accuracy', mode='max', patience=3,  restore_best_weights=True)\n    history = model.fit(train_set, epochs=20, validation_data=valid_set, callbacks=[early_stopping])\n    \n    # Store the model\n    models[f'{grp}_{q_no}'] = model    \n    \n    # Saving Accuracies\n    results = model.evaluate(test_set)\n    test_loss_and_accuracy_list.append(results)\n    \n    # Saving History of Models\n    history_models.append(history)\n    \n    # F1 Score\n    y_true_numpy_list = []\n    predictions = model.predict(test_set, verbose=0)\n    predictions = predictions.round().astype(int).flatten()\n    \n    for x_batch, y_batch in test_set:\n        y_batch = y_batch.numpy()\n        y_batch = y_batch.round().astype(int).flatten()\n        y_true_numpy_list.append(y_batch)\n        \n    y_true_numpy = np.concatenate(y_true_numpy_list)\n    f1_score_list.append(f1_score(y_true_numpy, predictions))\n","metadata":{"papermill":{"duration":701.172764,"end_time":"2024-01-19T16:37:33.845005","exception":false,"start_time":"2024-01-19T16:25:52.672241","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-03-28T14:07:28.050664Z","iopub.status.idle":"2024-03-28T14:07:28.051013Z","shell.execute_reply.started":"2024-03-28T14:07:28.050837Z","shell.execute_reply":"2024-03-28T14:07:28.050851Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plotGridGraphs(history_models)\naccuracy_bar_plot(test_loss_and_accuracy_list)\nf1_score_bar_plot(f1_score_list)","metadata":{"papermill":{"duration":7.388844,"end_time":"2024-01-19T16:37:45.079392","exception":false,"start_time":"2024-01-19T16:37:37.690548","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-03-28T14:07:28.053042Z","iopub.status.idle":"2024-03-28T14:07:28.05344Z","shell.execute_reply.started":"2024-03-28T14:07:28.053224Z","shell.execute_reply":"2024-03-28T14:07:28.053239Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Part 4: Using W6 for Convolution Neural Networks Model Training and Testing","metadata":{"papermill":{"duration":3.821624,"end_time":"2024-01-19T16:37:52.871332","exception":false,"start_time":"2024-01-19T16:37:49.049708","status":"completed"},"tags":[]}},{"cell_type":"code","source":"# Training Models for Each Question\ntest_loss_and_accuracy_list = []\nhistory_models = []\nmodels = {}\nf1_score_list = []\n\nfor q_no in range(1,19):\n\n    # Select level group for the question based on the q_no.\n    if q_no<=3: grp = '0-4'\n    elif q_no<=13: grp = '5-12'\n    elif q_no<=22: grp = '13-22'\n    print(\"##### Training for group-number\", q_no, \"group\", grp)\n    \n    train_set = train_set_list[q_no - 1]\n    valid_set = valid_set_list[q_no - 1]\n    test_set = test_set_list[q_no - 1]\n    \n    \n    model = keras.models.Sequential([\n        keras.layers.Conv1D(filters=32, kernel_size=3, input_shape=(21, 1)),\n        keras.layers.BatchNormalization(),\n        keras.layers.LeakyReLU(),\n        keras.layers.MaxPooling1D(pool_size=2),\n\n        keras.layers.Conv1D(filters=64, kernel_size=3),\n        keras.layers.BatchNormalization(),\n        keras.layers.LeakyReLU(),\n        keras.layers.MaxPooling1D(pool_size=2),\n        \n        keras.layers.Flatten(),\n        keras.layers.Dense(128, activation='relu'),\n        keras.layers.Dense(1, activation=\"sigmoid\")\n    ])\n\n    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])\n    early_stopping = EarlyStopping(monitor='val_accuracy', mode='max', patience=3,  restore_best_weights=True)\n    history = model.fit(train_set, epochs=20, validation_data=(valid_set), callbacks=[early_stopping])\n    \n    # Store the model\n    models[f'{grp}_{q_no}'] = model    \n    \n    # Saving Accuracies\n    results = model.evaluate(test_set)\n    test_loss_and_accuracy_list.append(results)\n    \n    # Saving History of Models\n    history_models.append(history)\n    \n    # F1 Score\n    y_true_numpy_list = []\n    \n    predictions = model.predict(test_set, verbose=0)\n    predictions = predictions.round().astype(int).flatten()\n    \n    for x_batch, y_batch in test_set:\n    \n        y_batch = y_batch.numpy()\n        y_batch = y_batch.round().astype(int).flatten()\n\n        y_true_numpy_list.append(y_batch)\n        \n    y_true_numpy = np.concatenate(y_true_numpy_list)\n    f1_score_list.append(f1_score(y_true_numpy, predictions))","metadata":{"papermill":{"duration":428.274248,"end_time":"2024-01-19T16:45:05.049744","exception":false,"start_time":"2024-01-19T16:37:56.775496","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-03-28T14:42:58.619337Z","iopub.execute_input":"2024-03-28T14:42:58.619729Z","iopub.status.idle":"2024-03-28T14:46:51.914997Z","shell.execute_reply.started":"2024-03-28T14:42:58.619692Z","shell.execute_reply":"2024-03-28T14:46:51.91412Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plotGridGraphs(history_models)\naccuracy_bar_plot(test_loss_and_accuracy_list)\nf1_score_bar_plot(f1_score_list)","metadata":{"papermill":{"duration":8.188324,"end_time":"2024-01-19T16:45:17.531781","exception":false,"start_time":"2024-01-19T16:45:09.343457","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-03-28T14:50:03.861718Z","iopub.execute_input":"2024-03-28T14:50:03.862481Z","iopub.status.idle":"2024-03-28T14:50:08.900051Z","shell.execute_reply.started":"2024-03-28T14:50:03.862448Z","shell.execute_reply":"2024-03-28T14:50:08.899099Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Part 5: Using W7 LSTM Model Training and Testing","metadata":{"papermill":{"duration":4.3374,"end_time":"2024-01-19T16:45:26.293761","exception":false,"start_time":"2024-01-19T16:45:21.956361","status":"completed"},"tags":[]}},{"cell_type":"code","source":"# Training Models for Each Question\ntest_loss_and_accuracy_list = []\nhistory_models = []\nmodels = {}\nf1_score_list = []\n\nfor q_no in range(1,19):\n\n    # Select level group for the question based on the q_no.\n    if q_no<=3: grp = '0-4'\n    elif q_no<=13: grp = '5-12'\n    elif q_no<=22: grp = '13-22'\n    print(\"##### Training for group-number\", q_no, \"group\", grp)\n    \n    train_set = train_set_list[q_no - 1]\n    valid_set = valid_set_list[q_no - 1]\n    test_set = test_set_list[q_no - 1]\n    \n    \n    model = keras.models.Sequential([\n        keras.layers.LSTM(20, return_sequences=True, input_shape=(21, 1)),\n        keras.layers.LSTM(20, return_sequences=True),\n        keras.layers.TimeDistributed(keras.layers.Dense(1))\n    ])\n\n    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])\n    early_stopping = EarlyStopping(monitor='val_accuracy', mode='max', patience=3,  restore_best_weights=True)\n    history = model.fit(train_set, epochs=20, validation_data=(valid_set), callbacks=[early_stopping])\n    \n    # Store the model\n    models[f'{grp}_{q_no}'] = model    \n    \n    # Saving Accuracies\n    results = model.evaluate(test_set)\n    test_loss_and_accuracy_list.append(results)\n    \n    # Saving History of Models\n    history_models.append(history)\n    \n    # F1 Score\n    y_true_numpy_list = []\n    \n    predictions = model.predict(test_set, verbose=0)[:, -1][..., np.newaxis]\n    predictions = predictions.round().astype(int).flatten()\n    \n    for x_batch, y_batch in test_set:\n    \n        y_batch = y_batch.numpy()\n        y_batch = y_batch.round().astype(int).flatten()\n\n        y_true_numpy_list.append(y_batch)\n        \n    y_true_numpy = np.concatenate(y_true_numpy_list)\n    f1_score_list.append(f1_score(y_true_numpy, predictions, average='weighted'))","metadata":{"papermill":{"duration":643.136363,"end_time":"2024-01-19T16:56:13.815467","exception":false,"start_time":"2024-01-19T16:45:30.679104","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-03-28T14:50:16.23998Z","iopub.execute_input":"2024-03-28T14:50:16.240679Z","iopub.status.idle":"2024-03-28T14:50:16.799298Z","shell.execute_reply.started":"2024-03-28T14:50:16.24064Z","shell.execute_reply":"2024-03-28T14:50:16.797829Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plotGridGraphs(history_models)\naccuracy_bar_plot(test_loss_and_accuracy_list)\nf1_score_bar_plot(f1_score_list)","metadata":{"papermill":{"duration":8.771573,"end_time":"2024-01-19T16:56:27.515439","exception":false,"start_time":"2024-01-19T16:56:18.743866","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-03-28T14:07:28.059495Z","iopub.status.idle":"2024-03-28T14:07:28.059837Z","shell.execute_reply.started":"2024-03-28T14:07:28.059665Z","shell.execute_reply":"2024-03-28T14:07:28.059679Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Code to Submit the Results.","metadata":{"papermill":{"duration":4.969308,"end_time":"2024-01-19T16:56:37.466619","exception":false,"start_time":"2024-01-19T16:56:32.497311","status":"completed"},"tags":[]}},{"cell_type":"markdown","source":"# Conclusions\n\n* As part of the Project we implemented total 6 Models which includes **4 DNNs, 1 CNN and 1 RNN**. We inferred that the Data is such that model complexity was not affecting the accuracy. \n\n* As the Data we had was imbalanced we considered F1 Score as our Evaluation Metric. All the Accuracies and F1 Scores are available in the Charts plotted. \n\n\n* After conducting extensive experiments and evaluations, we can conclude that the deep learning models we have developed have performed almost similarly. The performance differences between the models were negligible, and all models demonstrated excellent accuracy and precision in their predictions.\n\n* It is important to note that achieving such results was not an easy feat, and our team put in a tremendous amount of hard work and effort to develop these models. We faced several challenges throughout the development process, including data preprocessing, feature engineering, hyperparameter tuning, and model selection.\n\n* Despite these challenges, our team persevered and employed various techniques and methodologies to overcome each obstacle, resulting in highly performing models that can effectively predict various real-world scenarios. We are extremely proud of our achievements and confident in the applicability and usefulness of our machine learning models in practical settings.","metadata":{"papermill":{"duration":5.117003,"end_time":"2024-01-19T16:57:17.425837","exception":false,"start_time":"2024-01-19T16:57:12.308834","status":"completed"},"tags":[]}},{"cell_type":"code","source":"","metadata":{"papermill":{"duration":4.979641,"end_time":"2024-01-19T16:57:27.497294","exception":false,"start_time":"2024-01-19T16:57:22.517653","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]}]}