{"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 pandas as pd\nimport os\nimport numpy as np\nfrom sklearn.tree import DecisionTreeClassifier\nfrom sklearn.preprocessing import StandardScaler\nfrom sklearn.pipeline import make_pipeline\nfrom sklearn.datasets import make_moons, make_circles, make_classification\nfrom sklearn.neural_network import MLPClassifier\nfrom sklearn.neighbors import KNeighborsClassifier\nfrom sklearn.svm import SVC\nfrom sklearn.gaussian_process import GaussianProcessClassifier\nfrom sklearn.gaussian_process.kernels import RBF\nfrom sklearn.tree import DecisionTreeClassifier\nfrom sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier\nfrom sklearn.naive_bayes import GaussianNB, ComplementNB\nfrom sklearn.metrics import accuracy_score, f1_score\nfrom sklearn.feature_extraction import FeatureHasher\nfrom sklearn.impute import SimpleImputer\nfrom sklearn.feature_selection import SelectKBest, mutual_info_classif\nfrom sklearn.pipeline import Pipeline\nfrom sklearn.model_selection import train_test_split\nfrom xgboost import XGBClassifier\n\nimport warnings\nwarnings.filterwarnings('ignore')\n\nquestion_models = {}","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-05-14T22:18:30.638428Z","iopub.execute_input":"2023-05-14T22:18:30.639236Z","iopub.status.idle":"2023-05-14T22:18:32.591861Z","shell.execute_reply.started":"2023-05-14T22:18:30.639188Z","shell.execute_reply":"2023-05-14T22:18:32.590519Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dtypes={'session_id': np.str,\n'elapsed_time':np.int32,\n    'event_name':'category',\n    'name':'category',\n    'level':np.uint8,\n    'page': np.float64,\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': np.str}\n\nroot = \"/kaggle/input/predict-student-performance-from-game-play/\"\ntrain_file = 'train.csv'\ntrain_labels_file = 'train_labels.csv'\ntrain_df = pd.read_csv(os.path.join(root, train_file), dtype=dtypes)\ntrain_df = train_df.drop(['fullscreen', 'hq', 'music'], axis=1)","metadata":{"execution":{"iopub.status.busy":"2023-05-14T22:18:32.598219Z","iopub.execute_input":"2023-05-14T22:18:32.600940Z","iopub.status.idle":"2023-05-14T22:20:44.583250Z","shell.execute_reply.started":"2023-05-14T22:18:32.600888Z","shell.execute_reply":"2023-05-14T22:20:44.581915Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dtype = {'session_id': np.str, 'correct': np.float32}\ntargets = pd.read_csv(os.path.join(root, train_labels_file))\ntargets['q'] = targets.session_id.apply(lambda i: int(i.split('_')[-1][1:]) )\ntargets['session_id'] = targets.session_id.apply(lambda i: int(i.split('_')[0]))","metadata":{"execution":{"iopub.status.busy":"2023-05-14T22:20:44.585448Z","iopub.execute_input":"2023-05-14T22:20:44.585918Z","iopub.status.idle":"2023-05-14T22:20:46.208788Z","shell.execute_reply.started":"2023-05-14T22:20:44.585873Z","shell.execute_reply":"2023-05-14T22:20:46.207482Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"CATS = ['event_name', 'fqid', 'room_fqid', 'text']\nNUMS = ['elapsed_time','level','page','room_coor_x', 'room_coor_y',\n        'screen_coor_x', 'screen_coor_y', 'hover_duration']\n# https://www.kaggle.com/code/kimtaehun/lightgbm-baseline-with-aggregated-log-data\nEVENTS = ['navigate_click','person_click','cutscene_click','object_click',\n          'map_hover','notification_click','map_click','observation_click',\n          'checkpoint']\n\ndef features(train):\n    dfs = []\n    for c in CATS:\n        tmp = train.groupby(['session_id','level_group'])[c].agg('nunique')\n        tmp.name = tmp.name + '_nunique'\n        dfs.append(tmp)\n    for c in NUMS:\n        tmp = train.groupby(['session_id','level_group'])[c].agg('mean')\n        tmp.name = tmp.name + '_mean'\n        dfs.append(tmp)\n    for c in NUMS:\n        tmp = train.groupby(['session_id','level_group'])[c].agg('std')\n        tmp.name = tmp.name + '_std'\n        dfs.append(tmp)\n    for c in EVENTS:\n        train[c] = (train.event_name == c).astype('int8')\n    for c in EVENTS + ['elapsed_time']:\n        tmp = train.groupby(['session_id','level_group'])[c].agg('sum')\n        tmp.name = tmp.name + '_sum'\n        dfs.append(tmp)\n    train = train.drop(EVENTS,axis=1)\n\n    df = pd.concat(dfs,axis=1)\n    df = df.fillna(-1)\n    df = df.reset_index()\n    df = df.set_index('session_id')\n    return df","metadata":{"execution":{"iopub.status.busy":"2023-05-14T22:20:46.211742Z","iopub.execute_input":"2023-05-14T22:20:46.212178Z","iopub.status.idle":"2023-05-14T22:20:46.232007Z","shell.execute_reply.started":"2023-05-14T22:20:46.212137Z","shell.execute_reply":"2023-05-14T22:20:46.230520Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# train_df_1 = train_df.groupby([\"session_id\", \"level_group\"]).agg({\"elapsed_time\": [\"min\", \"max\"], \"event_name\": [\"size\"]})\n# train_df_1[\"time_taken\"] = train_df_1[\"elapsed_time\"][\"max\"] - train_df_1[\"elapsed_time\"][\"min\"]\n# train_df_1[\"no_events\"] = train_df_1[\"event_name\"][\"size\"]\n# cols = pd.MultiIndex.from_tuples([(\"elapsed_time\", \"min\"), (\"elapsed_time\", \"max\"), (\"event_name\", \"size\")])\n# train_df_1 = train_df_1.drop(columns=cols).reset_index()\n\ntrain_df_1 = features(train_df)\n\nprint(train_df_1.head())\nprint(train_df_1.columns.tolist())","metadata":{"execution":{"iopub.status.busy":"2023-05-14T22:20:46.233461Z","iopub.execute_input":"2023-05-14T22:20:46.233855Z","iopub.status.idle":"2023-05-14T22:24:27.010441Z","shell.execute_reply.started":"2023-05-14T22:20:46.233799Z","shell.execute_reply":"2023-05-14T22:24:27.009174Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"targets[\"session_id\"] = targets[\"session_id\"].astype(int)\nt = targets.set_index(\"session_id\")\nprint(t.head())\n","metadata":{"execution":{"iopub.status.busy":"2023-05-14T22:24:27.012214Z","iopub.execute_input":"2023-05-14T22:24:27.012594Z","iopub.status.idle":"2023-05-14T22:24:27.030312Z","shell.execute_reply.started":"2023-05-14T22:24:27.012556Z","shell.execute_reply":"2023-05-14T22:24:27.029023Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Model","metadata":{}},{"cell_type":"code","source":"from sklearn.model_selection import GridSearchCV\nfrom xgboost import XGBClassifier\n\nmodel_params = [{'gamma': 0.03, 'learning_rate': 0.1, 'max_depth': 3, 'reg_alpha': 1}, {'gamma': 0, 'learning_rate': 0.1, 'max_depth': 3, 'reg_alpha': 1}, {'gamma': 0, 'learning_rate': 0.05, 'max_depth': 3, 'reg_alpha': 1}, {'gamma': 0, 'learning_rate': 0.1, 'max_depth': 3, 'reg_alpha': 1}, {'gamma': 0.01, 'learning_rate': 0.1, 'max_depth': 3, 'reg_alpha': 1}, {'gamma': 0, 'learning_rate': 0.1, 'max_depth': 2, 'reg_alpha': 0.1}, {'gamma': 0, 'learning_rate': 0.05, 'max_depth': 3, 'reg_alpha': 1}, {'gamma': 0, 'learning_rate': 0.05, 'max_depth': 2, 'reg_alpha': 1}, {'gamma': 0, 'learning_rate': 0.05, 'max_depth': 3, 'reg_alpha': 1}, {'gamma': 0, 'learning_rate': 0.05, 'max_depth': 3, 'reg_alpha': 1}, {'gamma': 0, 'learning_rate': 0.05, 'max_depth': 3, 'reg_alpha': 1e-05}, {'gamma': 0, 'learning_rate': 0.1, 'max_depth': 2, 'reg_alpha': 0.01}, {'gamma': 0, 'learning_rate': 0.1, 'max_depth': 2, 'reg_alpha': 1}, {'gamma': 0.04, 'learning_rate': 0.1, 'max_depth': 3, 'reg_alpha': 1}, {'gamma': 0, 'learning_rate': 0.1, 'max_depth': 3, 'reg_alpha': 0.1}, {'gamma': 0, 'learning_rate': 0.1, 'max_depth': 2, 'reg_alpha': 0.01}, {'gamma': 0, 'learning_rate': 0.05, 'max_depth': 2, 'reg_alpha': 1}, {'gamma': 0, 'learning_rate': 0.1, 'max_depth': 2, 'reg_alpha': 1e-05}]\n\nfor x in range(1, 19):\n    print(f\"training for question {x}\")\n    # clf = DecisionTreeClassifier(random_state=69)\n\n    if x < 4:\n        level_group = \"0-4\"\n    elif x < 14:\n        level_group = \"5-12\"\n    else:\n        level_group = \"13-22\"\n\n    train_level_group = train_df_1.loc[train_df_1[\"level_group\"] == level_group]\n    train_question = t.loc[t[\"q\"] == x]\n\n    # train_level_group[\"session_id\"] = train_level_group[\"session_id\"].astype(int)\n    # train_question[\"session_id\"] = train_question[\"session_id\"].astype(int)\n    train_level_group.index = train_level_group.index.astype(int)\n\n    training = pd.merge(train_level_group, train_question, how=\"left\", on=\"session_id\")\n\n    train_x = training.drop([\"correct\"], axis=1)\n    # train_x[\"time_taken\"] = train_x[(\"time_taken\", \"\")]\n    # train_x[\"no_events\"] = train_x[(\"no_events\", \"\")]\n    # train_x = train_x.drop([(\"level_group\", \"\"), (\"session_id\", \"\"), (\"no_events\", \"\"), (\"time_taken\", \"\")], axis=1)\n    train_x = train_x.drop([\"level_group\"], axis=1)\n\n    train_y = training[\"correct\"]\n    \n    mp = model_params[x - 1]\n    mp[\"eta\"] = 0.01\n    mp[\"eval_metric\"] = \"logloss\"\n    mp[\"scale_pos_weight\"] = 1\n    mp[\"subsample\"] = 0.8\n    mp[\"colsample_bytree\"] = 0.4\n    mp[\"n_estimators\"] = 1000\n\n    clf = XGBClassifier(**mp)\n    clf.fit(train_x, train_y)\n    question_models[f\"q{x}\"] = clf","metadata":{"execution":{"iopub.status.busy":"2023-05-14T22:24:27.032008Z","iopub.execute_input":"2023-05-14T22:24:27.032391Z","iopub.status.idle":"2023-05-14T22:29:15.546895Z","shell.execute_reply.started":"2023-05-14T22:24:27.032353Z","shell.execute_reply":"2023-05-14T22:29:15.545792Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import jo_wilder\n\n\n# if jo_wilder.make_env.__called__:\n#     jo_wilder.make_env.__called__ = False\n#     env.__called__ = False\n#     type(env)._state = type(type(env)._state).__dict__['INIT']\n\nenv = jo_wilder.make_env()\niter_test = env.iter_test()\nlimits = {'0-4':(1,4), '5-12':(4,14), '13-22':(14,19)}\n\nfor (test, sample_submission) in iter_test:\n    test_df = test.drop(['fullscreen', 'hq', 'music'], axis=1)\n    test_df = features(test_df)\n\n    test_df_1 = test_df.drop([\"level_group\"], axis=1)\n    # test_df_1[\"time_taken\"] = test_df_1[(\"time_taken\", \"\")]\n    # test_df_1[\"no_events\"] = test_df_1[(\"no_events\", \"\")]\n    # test_df_1 = test_df_1.drop([(\"level_group\", \"\"), (\"session_id\", \"\"), (\"no_events\", \"\"), (\"time_taken\", \"\")], axis=1)\n\n    q_start, q_end = limits[test.level_group.values[0]]\n    for q in range(q_start, q_end):\n        test_df_1[\"q\"] = [q]\n        print(test_df_1.head())\n        clf = question_models[f\"q{q}\"]\n\n        row = sample_submission.session_id.str.contains(f'q{q}')\n        sample_submission.loc[row, \"correct\"] = clf.predict(test_df_1)[0]\n\n    env.predict(sample_submission)\n\nprint(\"predicted all\")","metadata":{"execution":{"iopub.status.busy":"2023-05-14T22:29:15.548659Z","iopub.execute_input":"2023-05-14T22:29:15.549427Z","iopub.status.idle":"2023-05-14T22:29:16.950942Z","shell.execute_reply.started":"2023-05-14T22:29:15.549384Z","shell.execute_reply":"2023-05-14T22:29:16.949893Z"},"trusted":true},"execution_count":null,"outputs":[]}]}