{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np\nimport pandas as pd \n\nimport matplotlib.pyplot as plt\nimport matplotlib.patches as mpatches\nimport seaborn as sns\n\nimport tensorflow as tf\nimport tensorflow_addons as tfa\nimport tensorflow_decision_forests as tfdf\n","metadata":{"id":"Ot2VPUzCQSkb","execution":{"iopub.status.busy":"2023-06-03T04:53:27.736852Z","iopub.execute_input":"2023-06-03T04:53:27.738047Z","iopub.status.idle":"2023-06-03T04:53:39.960399Z","shell.execute_reply.started":"2023-06-03T04:53:27.737987Z","shell.execute_reply":"2023-06-03T04:53:39.959155Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dtypes={\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\ntrain_original = pd.read_csv('/kaggle/input/predict-student-performance-from-game-play/train.csv', dtype=dtypes)\nprint(\"Train dataset shape is {}\".format(train_original.shape))","metadata":{"id":"z2MKtrdeQpME","execution":{"iopub.status.busy":"2023-06-03T04:53:39.962575Z","iopub.execute_input":"2023-06-03T04:53:39.963460Z","iopub.status.idle":"2023-06-03T04:55:39.406387Z","shell.execute_reply.started":"2023-06-03T04:53:39.963413Z","shell.execute_reply":"2023-06-03T04:55:39.405429Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def feature_engineer(train_original):\n    train_original_gp = train_original.groupby(['session_id','level_group']\n      ,as_index=False).agg({'index':'count','elapsed_time':'max','level':'nunique','page':'sum',\n      'screen_coor_x':'mean','screen_coor_y':'mean','hover_duration':'mean','text':'nunique',\n      'fqid':'nunique','room_fqid':'nunique','text_fqid':'nunique'})\n    train_original_fullscreen = train_original[train_original.fullscreen=='1'].groupby(['session_id','level_group']\n      ,as_index=False).agg({'fullscreen':'count'})\n    train_original_hq = train_original[train_original.hq=='1'].groupby(['session_id','level_group']\n      ,as_index=False).agg({'hq':'count'})\n    train_original_music = train_original[train_original.music=='1'].groupby(['session_id','level_group']\n      ,as_index=False).agg({'music':'count'})\n\n    train_original_coorx = train_original.groupby(['session_id','level_group'])['room_coor_x'].agg('std').reset_index()\n    train_original_coory = train_original.groupby(['session_id','level_group'])['room_coor_y'].agg('std').reset_index()\n    \n    train_original_name = pd.pivot_table(train_original, values='index', index=['session_id', 'level_group'],\n                           columns=['name'], aggfunc='count').reset_index()\n    train_original_eventname = pd.pivot_table(train_original, values='index', index=['session_id', 'level_group'],\n                           columns=['event_name'], aggfunc='count').reset_index()\n    df_full = train_original_gp.merge(train_original_fullscreen, on=['session_id','level_group'],how='left')\n    df_full = df_full.merge(train_original_hq, on=['session_id','level_group'],how='left')\n    df_full = df_full.merge(train_original_music, on=['session_id','level_group'],how='left')\n    df_full = df_full.merge(train_original_coorx, on=['session_id','level_group'],how='left')\n    df_full = df_full.merge(train_original_coory, on=['session_id','level_group'],how='left')\n    df_full = df_full.merge(train_original_name, on=['session_id','level_group'],how='left')\n    df_full = df_full.merge(train_original_eventname, on=['session_id','level_group'],how='left')\n    df_full = df_full.drop(['next','prev','checkpoint'], axis=1, errors='ignore')\n    df_full[['index', 'elapsed_time', 'level', 'page',\n           'screen_coor_x', 'screen_coor_y', 'hover_duration', 'text', 'fqid',\n           'room_fqid', 'text_fqid', 'fullscreen', 'hq', 'music', 'room_coor_x',\n           'room_coor_y', 'basic', 'close', 'open', 'undefined',\n            'cutscene_click', 'map_click', 'map_hover',\n           'navigate_click', 'notebook_click', 'notification_click',\n           'object_click', 'object_hover', 'observation_click', 'person_click']].fillna(0,inplace=True)\n    df_full = df_full.set_index('session_id')\n    return df_full","metadata":{"execution":{"iopub.status.busy":"2023-06-03T04:55:39.414728Z","iopub.execute_input":"2023-06-03T04:55:39.415287Z","iopub.status.idle":"2023-06-03T04:55:39.435668Z","shell.execute_reply.started":"2023-06-03T04:55:39.415251Z","shell.execute_reply":"2023-06-03T04:55:39.434484Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# df_full['index'] = np.where(df_full.level_group=='0-4',1,\n#                            np.where(df_full.level_group=='5-12',2,3))\n# df_full=df_full.sort_values('index',ascending= True)\n# tmp = train_original.groupby(['session_id','level_group']\n#   ,as_index=False).agg({'hover_duration':'mean'})\n# sns.boxplot(data=tmp, x=\"level_group\", y=\"hover_duration\"\n#    , showfliers=False)\n# tmp = train_original.groupby(['session_id','level_group']\n#   ,as_index=False).agg({'hover_duration':'max'})\n# sns.boxplot(data=tmp, x=\"level_group\", y=\"hover_duration\"\n#    , showfliers=False)\n# tmp = train_original.groupby(['session_id','level_group','name']\n#   ).agg({'index':'count'}).reset_index()\n\n# sns.boxplot(data=tmp, x=\"name\", y=\"index\",hue='level_group'\n#    , showfliers=False)\n# tmp = train_original.groupby(['session_id','level_group','event_name']\n#   ).agg({'index':'count'}).reset_index()\n\n# a= sns.boxplot(data=tmp, x=\"event_name\", y=\"index\",hue='level_group'\n#    , showfliers=False)\n# a.set_xticklabels(a.get_xticklabels(),rotation=30)\n# tmp = train_original.groupby(['session_id','level_group']\n#   ,as_index=False)['room_coor_x'].agg(pd.Series.mode)\n# tmp.head()\n# tmp['mode_room_coor_x'] = tmp['room_coor_x'][0]\n# sns.boxplot(data=tmp, x=\"level_group\", y=\"mode_room_coor_x\"\n#    , showfliers=False)\n# tmp = train_original.groupby(['session_id','level_group'])['room_coor_y'].agg('std').reset_index()\n# sns.boxplot(data=tmp, x=\"level_group\", y=\"room_coor_y\"\n#    , showfliers=False)\n# tmp = train_original.groupby(['session_id','level_group'])['room_coor_x'].agg('std').reset_index()\n# sns.boxplot(data=tmp, x=\"level_group\", y=\"room_coor_x\"\n#    , showfliers=False)\n# sns.boxplot(data=df_full, x=\"level_group\", y=\"elapsed_time\"\n#    , showfliers=False)\n# sns.boxplot(data=df_full, x=\"level_group\", y=\"hover_duration\", showfliers=False)\n# sns.boxplot(data=df_full, x=\"level_group\", y=\"event_name\", showfliers=False)\n# sns.boxplot(data=df_full, x=\"level_group\", y=\"name\", showfliers=False)\n# sns.boxplot(data=df_full, x=\"level_group\", y=\"level\")\n# sns.boxplot(data=df_full, x=\"level_group\", y=\"page\", showfliers=False)\n# sns.boxplot(data=df_full, x=\"level_group\", y=\"room_coor_x\", showfliers=False)\n# sns.boxplot(data=df_full, x=\"level_group\", y=\"room_coor_y\", showfliers=False)\n# sns.boxplot(data=df_full, x=\"level_group\", y=\"screen_coor_x\", showfliers=False)\n# sns.boxplot(data=df_full, x=\"level_group\", y=\"screen_coor_y\", showfliers=False)\n# sns.boxplot(data=df_full, x=\"level_group\", y=\"text\", showfliers=False)\n# sns.boxplot(data=df_full, x=\"level_group\", y=\"fqid\", showfliers=False)\n# sns.boxplot(data=df_full, x=\"level_group\", y=\"room_fqid\", showfliers=False)\n# sns.boxplot(data=df_full, x=\"level_group\", y=\"text_fqid\", showfliers=False)\n# sns.boxplot(data=df_full, x=\"level_group\", y=\"fullscreen\", showfliers=False)\n# sns.boxplot(data=df_full, x=\"level_group\", y=\"hq\", showfliers=False)\n# sns.boxplot(data=df_full, x=\"level_group\", y=\"music\", showfliers=False)","metadata":{"jupyter":{"source_hidden":true},"execution":{"iopub.status.busy":"2023-06-03T04:55:39.437389Z","iopub.execute_input":"2023-06-03T04:55:39.438402Z","iopub.status.idle":"2023-06-03T04:55:39.454888Z","shell.execute_reply.started":"2023-06-03T04:55:39.438357Z","shell.execute_reply":"2023-06-03T04:55:39.453603Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_original = pd.read_csv('/kaggle/input/predict-student-performance-from-game-play/test.csv')\nsample_submission = pd.read_csv('/kaggle/input/predict-student-performance-from-game-play/sample_submission.csv')","metadata":{"execution":{"iopub.status.busy":"2023-06-03T04:55:39.456741Z","iopub.execute_input":"2023-06-03T04:55:39.457119Z","iopub.status.idle":"2023-06-03T04:55:39.518751Z","shell.execute_reply.started":"2023-06-03T04:55:39.457083Z","shell.execute_reply":"2023-06-03T04:55:39.517637Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\nlabels = 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['question'] = labels.session_id.apply(lambda x: int(x.split('_')[-1][1:]) )\n","metadata":{"id":"pYzHsaqxRVae","execution":{"iopub.status.busy":"2023-06-03T04:55:39.523274Z","iopub.execute_input":"2023-06-03T04:55:39.524891Z","iopub.status.idle":"2023-06-03T04:55:40.980964Z","shell.execute_reply.started":"2023-06-03T04:55:39.524795Z","shell.execute_reply":"2023-06-03T04:55:40.979978Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_full_ = feature_engineer(train_original)\ndf_full_.head()","metadata":{"execution":{"iopub.status.busy":"2023-06-03T04:55:40.982430Z","iopub.execute_input":"2023-06-03T04:55:40.983018Z","iopub.status.idle":"2023-06-03T04:56:14.056140Z","shell.execute_reply.started":"2023-06-03T04:55:40.982980Z","shell.execute_reply":"2023-06-03T04:56:14.055075Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def 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\ntrain_x, valid_x = split_dataset(df_full_)\nprint(\"{} examples in training, {} examples in testing.\".format(\n    len(train_x), len(valid_x)))","metadata":{"execution":{"iopub.status.busy":"2023-06-03T04:56:14.079167Z","iopub.execute_input":"2023-06-03T04:56:14.079964Z","iopub.status.idle":"2023-06-03T04:56:14.194545Z","shell.execute_reply.started":"2023-06-03T04:56:14.079917Z","shell.execute_reply":"2023-06-03T04:56:14.193330Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"VALID_USER_LIST = valid_x.index.unique()\nprediction_df = pd.DataFrame(data=np.zeros((len(VALID_USER_LIST),18)), index=VALID_USER_LIST)\n\nmodels = {}\n\nevaluation_dict ={}","metadata":{"execution":{"iopub.status.busy":"2023-06-03T04:56:14.196290Z","iopub.execute_input":"2023-06-03T04:56:14.196642Z","iopub.status.idle":"2023-06-03T04:56:14.204857Z","shell.execute_reply.started":"2023-06-03T04:56:14.196606Z","shell.execute_reply":"2023-06-03T04:56:14.203447Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Import necessary libraries\nfrom sklearn.model_selection import GridSearchCV\nimport xgboost as xgb\n\n# Set the model parameters for grid search\nparameters = {\n    'max_depth': [3, 4], \n    'n_estimators': [20, 50, 100],\n    'learning_rate': [0.01, 0.05, 0.1],\n    'max_depth': [1, 2]\n}\n\n# Initialize dictionaries to store models and f1 scores\nMODELS = {}\nF1 = {}\nfor question in range(1,19):\n\n    # Select level group for the question based on the question.\n    if question<=3: grp = '0-4'\n    elif question<=13: grp = '5-12'\n    elif question<=22: grp = '13-22'\n#     print(\"### question\", question, \"grp\", grp)\n    \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\n    # Select the labels for the related question.\n    train_labels = labels.loc[labels.question==question].set_index('session').loc[train_users]\n    valid_labels = labels.loc[labels.question==question].set_index('session').loc[valid_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\n    X= train_df.drop(['correct','level_group'], axis=1)\n    y=  train_labels.reset_index()['correct']\n    model_xgb = xgb.XGBClassifier(random_state = 1)\n    model_xgb = GridSearchCV(\n        model_xgb, \n        parameters, \n        cv=3,\n        scoring='f1')\n    model_xgb.fit(X, y)\n    \n    # Store the model and its f1 score in their respective dictionaries\n    MODELS[f\"question {question} model\"] = model_xgb\n    F1[f\"question {question} f1\"] = model_xgb.best_score_\n    \n    # Print the best f1 score and hyperparameters for the current question\n    print(f\"\\tf1 score is {model_xgb.best_score_:.3f}\")\n    print(f\"\\tbest params are {model_xgb.best_params_}\")\n    print(f'QUESTION {question} MODEL COMPLETE')","metadata":{"execution":{"iopub.status.busy":"2023-06-03T04:56:14.206486Z","iopub.execute_input":"2023-06-03T04:56:14.206982Z","iopub.status.idle":"2023-06-03T05:05:32.375741Z","shell.execute_reply.started":"2023-06-03T04:56:14.206935Z","shell.execute_reply":"2023-06-03T05:05:32.374639Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import jo_wilder\nenv = jo_wilder.make_env()\niter_test = env.iter_test()\n","metadata":{"execution":{"iopub.status.busy":"2023-06-03T05:05:32.380520Z","iopub.execute_input":"2023-06-03T05:05:32.382870Z","iopub.status.idle":"2023-06-03T05:05:32.410506Z","shell.execute_reply.started":"2023-06-03T05:05:32.382824Z","shell.execute_reply":"2023-06-03T05:05:32.408793Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"limits = {'0-4':(1,4), '5-12':(4,14), '13-22':(14,19)}\n\nfor (test, sample_submission) in iter_test: \n    \n    grp = test.level_group.values[0]\n    a,b = limits[grp]\n    models = list(MODELS.values())\n    predictions = []\n    \n    my_test = test[test[\"level_group\"] == grp]\n    df = feature_engineer(my_test)\n    \n    for t in range(a,b):\n        p = models[t-1].predict(df.drop(['level_group'], axis=1))\n        p = p[0]\n        predictions.append(p)\n    sample_submission['correct'] = predictions\n    \n    env.predict(sample_submission)","metadata":{"execution":{"iopub.status.busy":"2023-06-03T05:05:32.415548Z","iopub.execute_input":"2023-06-03T05:05:32.417107Z","iopub.status.idle":"2023-06-03T05:05:33.431317Z","shell.execute_reply.started":"2023-06-03T05:05:32.417047Z","shell.execute_reply":"2023-06-03T05:05:33.430398Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = pd.read_csv('submission.csv')\nprint( df.shape )","metadata":{"execution":{"iopub.status.busy":"2023-06-03T05:05:33.432921Z","iopub.execute_input":"2023-06-03T05:05:33.433584Z","iopub.status.idle":"2023-06-03T05:05:33.442637Z","shell.execute_reply.started":"2023-06-03T05:05:33.433545Z","shell.execute_reply":"2023-06-03T05:05:33.441382Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(df.correct.mean())","metadata":{},"execution_count":null,"outputs":[]}]}