{"metadata":{"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":45533,"databundleVersionId":5748852,"sourceType":"competition"},{"sourceId":5005978,"sourceType":"datasetVersion","datasetId":2902225},{"sourceId":5675701,"sourceType":"datasetVersion","datasetId":3244175},{"sourceId":7188996,"sourceType":"datasetVersion","datasetId":4154551}],"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true},"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.7.12"},"papermill":{"default_parameters":{},"duration":22332.767356,"end_time":"2023-12-15T13:52:40.827447","environment_variables":{},"exception":null,"input_path":"__notebook__.ipynb","output_path":"__notebook__.ipynb","parameters":{},"start_time":"2023-12-15T07:40:28.060091","version":"2.4.0"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd, numpy as np\nfrom catboost import CatBoostClassifier\nfrom sklearn.model_selection import GridSearchCV\nimport pickle\nimport sys\nimport random\nimport time\n\nimport warnings\nwarnings.filterwarnings('ignore')","metadata":{"execution":{"iopub.execute_input":"2023-12-15T07:40:38.354370Z","iopub.status.busy":"2023-12-15T07:40:38.353675Z","iopub.status.idle":"2023-12-15T07:40:39.493066Z","shell.execute_reply":"2023-12-15T07:40:39.492166Z"},"papermill":{"duration":1.157868,"end_time":"2023-12-15T07:40:39.495763","exception":false,"start_time":"2023-12-15T07:40:38.337895","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import xgboost as xgb\nfrom catboost import CatBoostRegressor\nimport numpy as np\nimport pandas as pd\nfrom sklearn.model_selection import KFold\nfrom sklearn.metrics import mean_squared_error, accuracy_score, roc_auc_score, f1_score\nfrom sklearn.model_selection import train_test_split\nimport matplotlib.patches as mpatches\nimport seaborn as sns\nimport optuna","metadata":{"execution":{"iopub.execute_input":"2023-12-15T07:40:39.524345Z","iopub.status.busy":"2023-12-15T07:40:39.524015Z","iopub.status.idle":"2023-12-15T07:40:40.057530Z","shell.execute_reply":"2023-12-15T07:40:40.056656Z"},"papermill":{"duration":0.550194,"end_time":"2023-12-15T07:40:40.059953","exception":false,"start_time":"2023-12-15T07:40:39.509759","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"NUM_TRIES = 100\nLOAD_MODELS = False\nMODEL_NAME = 'xgboost'\nTHRESHOLD = 0.63","metadata":{"execution":{"iopub.execute_input":"2023-12-15T07:40:40.087880Z","iopub.status.busy":"2023-12-15T07:40:40.087566Z","iopub.status.idle":"2023-12-15T07:40:40.092178Z","shell.execute_reply":"2023-12-15T07:40:40.091211Z"},"papermill":{"duration":0.021012,"end_time":"2023-12-15T07:40:40.094403","exception":false,"start_time":"2023-12-15T07:40:40.073391","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def reduce_mem_usage(df):\n    start_mem = df.memory_usage().sum() / 1024**2\n    print(f'Memory usage of dataframe is {start_mem:.2f} MB')\n    for col in df.columns:\n        if df[col].dtype == 'object':\n            df[col] = df[col].astype('category')\n        elif df[col].dtype == 'int':\n            int_types = [np.int8, np.int16, np.int32, np.int64]\n            for int_type in int_types:\n                if df[col].min() >= np.iinfo(int_type).min and df[col].max() <= np.iinfo(int_type).max:\n                    df[col] = df[col].astype(int_type)\n                    break\n        elif df[col].dtype == 'float':\n            float_types = [np.float16, np.float32, np.float64]\n            for float_type in float_types:\n                if df[col].min() >= np.finfo(float_type).min and df[col].max() <= np.finfo(float_type).max:\n                    df[col] = df[col].astype(float_type)\n                    break\n    mem_usage = df.memory_usage().sum() / 1024**2 \n    print(f\"Memory usage became: {mem_usage:.2f} MB\")\n    return df","metadata":{"execution":{"iopub.execute_input":"2023-12-15T07:40:40.123032Z","iopub.status.busy":"2023-12-15T07:40:40.122717Z","iopub.status.idle":"2023-12-15T07:40:40.133316Z","shell.execute_reply":"2023-12-15T07:40:40.132525Z"},"papermill":{"duration":0.027767,"end_time":"2023-12-15T07:40:40.135472","exception":false,"start_time":"2023-12-15T07:40:40.107705","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dtypes = {\n    'session_id':'int', \n    'elapsed_time':np.int32,\n    'event_name':'category',\n    'name':'category',\n    'level':np.int32,\n    'page':'category',\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}\n","metadata":{"execution":{"iopub.execute_input":"2023-12-15T07:40:40.163101Z","iopub.status.busy":"2023-12-15T07:40:40.162818Z","iopub.status.idle":"2023-12-15T07:40:40.169372Z","shell.execute_reply":"2023-12-15T07:40:40.168385Z"},"papermill":{"duration":0.022782,"end_time":"2023-12-15T07:40:40.171427","exception":false,"start_time":"2023-12-15T07:40:40.148645","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Read data, reduce memory consumption","metadata":{"papermill":{"duration":0.012939,"end_time":"2023-12-15T07:40:40.197556","exception":false,"start_time":"2023-12-15T07:40:40.184617","status":"completed"},"tags":[]}},{"cell_type":"code","source":"# %%time\n# train_full = pd.read_csv('/kaggle/input/predict-student-performance-from-game-play/train.csv', dtype=dtypes)\n# train_full = reduce_mem_usage(train_full)\n# train_full","metadata":{"execution":{"iopub.execute_input":"2023-12-15T07:40:40.225414Z","iopub.status.busy":"2023-12-15T07:40:40.224824Z","iopub.status.idle":"2023-12-15T07:40:40.228784Z","shell.execute_reply":"2023-12-15T07:40:40.227869Z"},"papermill":{"duration":0.020231,"end_time":"2023-12-15T07:40:40.230951","exception":false,"start_time":"2023-12-15T07:40:40.210720","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_full = pd.read_csv('/kaggle/input/predict-student-performance-from-game-play/test.csv', dtype=dtypes)\ntest_full = reduce_mem_usage(test_full)\ntest_full","metadata":{"execution":{"iopub.execute_input":"2023-12-15T07:40:40.258499Z","iopub.status.busy":"2023-12-15T07:40:40.258190Z","iopub.status.idle":"2023-12-15T07:40:40.376439Z","shell.execute_reply":"2023-12-15T07:40:40.375364Z"},"papermill":{"duration":0.135768,"end_time":"2023-12-15T07:40:40.379879","exception":false,"start_time":"2023-12-15T07:40:40.244111","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_full.describe()","metadata":{"execution":{"iopub.execute_input":"2023-12-15T07:40:40.409546Z","iopub.status.busy":"2023-12-15T07:40:40.408959Z","iopub.status.idle":"2023-12-15T07:40:40.454237Z","shell.execute_reply":"2023-12-15T07:40:40.453236Z"},"papermill":{"duration":0.062313,"end_time":"2023-12-15T07:40:40.456334","exception":false,"start_time":"2023-12-15T07:40:40.394021","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_full.info()","metadata":{"execution":{"iopub.execute_input":"2023-12-15T07:40:40.487617Z","iopub.status.busy":"2023-12-15T07:40:40.487303Z","iopub.status.idle":"2023-12-15T07:40:40.506515Z","shell.execute_reply":"2023-12-15T07:40:40.505192Z"},"papermill":{"duration":0.037133,"end_time":"2023-12-15T07:40:40.508658","exception":false,"start_time":"2023-12-15T07:40:40.471525","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# label_full = pd.read_csv('/kaggle/input/predict-student-performance-from-game-play/train_labels.csv')\n# label_full","metadata":{"execution":{"iopub.execute_input":"2023-12-15T07:40:40.538776Z","iopub.status.busy":"2023-12-15T07:40:40.538457Z","iopub.status.idle":"2023-12-15T07:40:40.542500Z","shell.execute_reply":"2023-12-15T07:40:40.541512Z"},"papermill":{"duration":0.021565,"end_time":"2023-12-15T07:40:40.544773","exception":false,"start_time":"2023-12-15T07:40:40.523208","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"feature_df = pd.read_csv('/kaggle/input/featur/feature_sort.csv', dtype=dtypes)\nfeature_df","metadata":{"execution":{"iopub.execute_input":"2023-12-15T07:40:40.574738Z","iopub.status.busy":"2023-12-15T07:40:40.574096Z","iopub.status.idle":"2023-12-15T07:40:40.743469Z","shell.execute_reply":"2023-12-15T07:40:40.742414Z"},"papermill":{"duration":0.186924,"end_time":"2023-12-15T07:40:40.745916","exception":false,"start_time":"2023-12-15T07:40:40.558992","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"These features are used to categorized and arranged to be convenient in masking and create some new feature","metadata":{"papermill":{"duration":0.01482,"end_time":"2023-12-15T07:40:40.775939","exception":false,"start_time":"2023-12-15T07:40:40.761119","status":"completed"},"tags":[]}},{"cell_type":"code","source":"feature_df.describe()","metadata":{"execution":{"iopub.execute_input":"2023-12-15T07:40:40.807656Z","iopub.status.busy":"2023-12-15T07:40:40.806393Z","iopub.status.idle":"2023-12-15T07:40:40.880743Z","shell.execute_reply":"2023-12-15T07:40:40.879750Z"},"papermill":{"duration":0.092308,"end_time":"2023-12-15T07:40:40.883008","exception":false,"start_time":"2023-12-15T07:40:40.790700","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"feature_df.info()","metadata":{"execution":{"iopub.execute_input":"2023-12-15T07:40:40.915421Z","iopub.status.busy":"2023-12-15T07:40:40.914838Z","iopub.status.idle":"2023-12-15T07:40:40.935809Z","shell.execute_reply":"2023-12-15T07:40:40.934547Z"},"papermill":{"duration":0.039339,"end_time":"2023-12-15T07:40:40.937976","exception":false,"start_time":"2023-12-15T07:40:40.898637","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"feature_df[0:1].to_dict()","metadata":{"execution":{"iopub.execute_input":"2023-12-15T07:40:40.970837Z","iopub.status.busy":"2023-12-15T07:40:40.969978Z","iopub.status.idle":"2023-12-15T07:40:40.979375Z","shell.execute_reply":"2023-12-15T07:40:40.978356Z"},"papermill":{"duration":0.027983,"end_time":"2023-12-15T07:40:40.981582","exception":false,"start_time":"2023-12-15T07:40:40.953599","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"feature_df[100:101].to_dict()","metadata":{"execution":{"iopub.execute_input":"2023-12-15T07:40:41.013894Z","iopub.status.busy":"2023-12-15T07:40:41.013590Z","iopub.status.idle":"2023-12-15T07:40:41.022497Z","shell.execute_reply":"2023-12-15T07:40:41.021545Z"},"papermill":{"duration":0.027534,"end_time":"2023-12-15T07:40:41.024707","exception":false,"start_time":"2023-12-15T07:40:40.997173","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"We split the data into each question for each session","metadata":{"papermill":{"duration":0.015362,"end_time":"2023-12-15T07:40:41.055636","exception":false,"start_time":"2023-12-15T07:40:41.040274","status":"completed"},"tags":[]}},{"cell_type":"code","source":"feature_df[200:201].to_dict()","metadata":{"execution":{"iopub.execute_input":"2023-12-15T07:40:41.088577Z","iopub.status.busy":"2023-12-15T07:40:41.087972Z","iopub.status.idle":"2023-12-15T07:40:41.096749Z","shell.execute_reply":"2023-12-15T07:40:41.095793Z"},"papermill":{"duration":0.027583,"end_time":"2023-12-15T07:40:41.099030","exception":false,"start_time":"2023-12-15T07:40:41.071447","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"feature_df[1000:1001].to_dict()","metadata":{"execution":{"iopub.execute_input":"2023-12-15T07:40:41.132138Z","iopub.status.busy":"2023-12-15T07:40:41.131657Z","iopub.status.idle":"2023-12-15T07:40:41.140667Z","shell.execute_reply":"2023-12-15T07:40:41.139776Z"},"papermill":{"duration":0.028083,"end_time":"2023-12-15T07:40:41.142841","exception":false,"start_time":"2023-12-15T07:40:41.114758","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"targets = pd.read_csv('/kaggle/input/predict-student-performance-from-game-play/train_labels.csv')\ntargets['session'] = targets.session_id.apply(lambda x: int(x.split('_')[0]) )\ntargets['q'] = targets.session_id.apply(lambda x: int(x.split('_')[-1][1:]) )\ntargets","metadata":{"execution":{"iopub.execute_input":"2023-12-15T07:40:41.176353Z","iopub.status.busy":"2023-12-15T07:40:41.175764Z","iopub.status.idle":"2023-12-15T07:40:42.558338Z","shell.execute_reply":"2023-12-15T07:40:42.557520Z"},"papermill":{"duration":1.401743,"end_time":"2023-12-15T07:40:42.560580","exception":false,"start_time":"2023-12-15T07:40:41.158837","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Feature Engineer","metadata":{"papermill":{"duration":0.016034,"end_time":"2023-12-15T07:40:42.593146","exception":false,"start_time":"2023-12-15T07:40:42.577112","status":"completed"},"tags":[]}},{"cell_type":"markdown","source":"In general, we reduce the size of the data by aggregate all the feature into data, each row represent the feature of each session. We also seperate the data into segments according to the level","metadata":{"papermill":{"duration":0.015985,"end_time":"2023-12-15T07:40:42.625241","exception":false,"start_time":"2023-12-15T07:40:42.609256","status":"completed"},"tags":[]}},{"cell_type":"markdown","source":"- Find the delta time between each record in each session\n- Fill na with zero since we use different function (first record will be nan)\n- Clip the delta time to make sure remove noise\n- Shift the data upward","metadata":{"papermill":{"duration":0.015909,"end_time":"2023-12-15T07:40:42.657241","exception":false,"start_time":"2023-12-15T07:40:42.641332","status":"completed"},"tags":[]}},{"cell_type":"code","source":"def delt_time_def(df):\n    df.sort_values(by=['session_id', 'elapsed_time'], inplace=True)\n    df['d_time'] = df['elapsed_time'].diff(1)\n    df['d_time'].fillna(0, inplace=True)\n    df['delt_time'] = df['d_time'].clip(0, 103000)\n    df['delt_time_next'] = df['delt_time'].shift(-1)\n    return df","metadata":{"execution":{"iopub.execute_input":"2023-12-15T07:40:42.691241Z","iopub.status.busy":"2023-12-15T07:40:42.690428Z","iopub.status.idle":"2023-12-15T07:40:42.696890Z","shell.execute_reply":"2023-12-15T07:40:42.695966Z"},"papermill":{"duration":0.025744,"end_time":"2023-12-15T07:40:42.699037","exception":false,"start_time":"2023-12-15T07:40:42.673293","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"- Add some column to the training data. Group by for each session id, then calculcate different quantiles of d_time feature of each events. Also calculate the mean, std of hover duration.\n- Further more, we split the session id into year, month, day ","metadata":{"papermill":{"duration":0.016014,"end_time":"2023-12-15T07:40:42.731135","exception":false,"start_time":"2023-12-15T07:40:42.715121","status":"completed"},"tags":[]}},{"cell_type":"code","source":"def feature_engineer(train, kol_f):\n    global kol_col, kol_col_max\n    kol_col = 9\n    kol_col_max = 11 + kol_f * 2 # set the number of columns\n    col = [i for i in range(0, kol_col_max)]\n    new_train = pd.DataFrame(index=train['session_id'].unique(), columns=col, dtype=np.float16)  \n    new_train[10] = new_train.index # \"session_id\"    \n\n    new_train[0] = train.groupby(['session_id'])['d_time'].quantile(q=0.3)\n    new_train[1] = train.groupby(['session_id'])['d_time'].quantile(q=0.8)\n    new_train[2] = train.groupby(['session_id'])['d_time'].quantile(q=0.5)\n    new_train[3] = train.groupby(['session_id'])['d_time'].quantile(q=0.65)\n    \n    new_train[4] = train.groupby(['session_id'])['hover_duration'].agg('mean')\n    new_train[5] = train.groupby(['session_id'])['hover_duration'].agg('std')    \n    \n    new_train[6] = new_train[10].apply(lambda x: int(str(x)[:2])).astype(np.uint8) # \"year\"\n    new_train[7] = new_train[10].apply(lambda x: int(str(x)[2:4]) + 1).astype(np.uint8) # \"month\"\n    new_train[8] = new_train[10].apply(lambda x: int(str(x)[4:6])).astype(np.uint8) # \"day\"\n    new_train[9] = new_train[10].apply(lambda x: int(str(x)[6:8])).astype(np.uint8)\\\n                                + new_train[10].apply(lambda x: int(str(x)[8:10])).astype(np.uint8) / 60\n    \n    new_train[10] = 0\n    \n    new_train = new_train.fillna(-1)\n    \n    return new_train","metadata":{"execution":{"iopub.execute_input":"2023-12-15T07:40:42.764550Z","iopub.status.busy":"2023-12-15T07:40:42.764235Z","iopub.status.idle":"2023-12-15T07:40:42.777968Z","shell.execute_reply":"2023-12-15T07:40:42.777071Z"},"papermill":{"duration":0.032823,"end_time":"2023-12-15T07:40:42.780081","exception":false,"start_time":"2023-12-15T07:40:42.747258","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Add new feature, which are some statistics: sum, mean, count base on some available feature. Since we aggregate all the feature field into a line, we must masking the data to calculate the feature, for example, delt_time correctly\n- kol_col == 1: aggregate base on session id\n- kol_col == 0: directly calculate the statistics","metadata":{"papermill":{"duration":0.015837,"end_time":"2023-12-15T07:40:42.811983","exception":false,"start_time":"2023-12-15T07:40:42.796146","status":"completed"},"tags":[]}},{"cell_type":"code","source":"def feature_next_t(row_f, new_train, train, gran_1, gran_2, i):\n    global kol_col\n    kol_col +=1\n    col1 = row_f['col1']\n    val1 = row_f['val1']\n    maska = (train[col1] == val1)\n    \n    if row_f['kol_col'] == 1:       \n        new_train[kol_col] = train[maska].groupby(['session_id'])['delt_time_next'].sum()\n        if gran_1:\n            kol_col +=1\n            new_train[kol_col] = train[maska].groupby(['session_id'])['delt_time'].mean()\n        if gran_2:\n            kol_col +=1\n            new_train[kol_col] = train[maska].groupby(['session_id'])['index'].count()  \n            \n    elif row_f['kol_col'] == 2: # masking different\n        col2 = row_f['col2']\n        val2 = row_f['val2']\n        maska = maska & (train[col2] == val2)        \n        new_train[kol_col] = train[maska].groupby(['session_id'])['delt_time_next'].sum()\n        if gran_1:\n            kol_col +=1\n            new_train[kol_col] = train[maska].groupby(['session_id'])['delt_time'].mean()\n        if gran_2:\n            kol_col +=1\n            new_train[kol_col] = train[maska].groupby(['session_id'])['index'].count()\n    return new_train\n\ndef feature_next_t_otvet(row_f, new_train, train, gran_1, gran_2, i):\n    global kol_col\n    kol_col +=1\n    col1 = row_f['col1']\n    val1 = row_f['val1']\n    maska = (train[col1] == val1)\n    \n    if row_f['kol_col'] == 1:      \n        new_train[kol_col] = train[maska]['delt_time_next'].sum()\n        if gran_1:\n            kol_col +=1\n            new_train[kol_col] = train[maska]['delt_time'].mean()\n        if gran_2:\n            kol_col +=1\n            new_train[kol_col] = train[maska]['index'].count() \n            \n    elif row_f['kol_col'] == 2: \n        col2 = row_f['col2']\n        val2 = row_f['val2']\n        maska = maska & (train[col2] == val2)        \n        new_train[kol_col] = train[maska]['delt_time_next'].sum()\n        if gran_1:\n            kol_col +=1\n            new_train[kol_col] = train[maska]['delt_time'].mean()\n        if gran_2:\n            kol_col +=1\n            new_train[kol_col] = train[maska]['index'].count()\n    return new_train\n\n\n\ndef feature_quest_otvet(new_train, train, quest, kol_f):\n    global kol_col\n    kol_col = 9\n    g1 = 0.7 \n    g2 = 0.3 \n\n    feature_q = feature_df[feature_df['quest'] == quest].copy()\n    feature_q.reset_index(drop=True, inplace=True)\n    \n    gran1 = round(kol_f * g1)\n    gran2 = round(kol_f * g2)    \n    for i in range(0, kol_f):         \n        row_f = feature_q.loc[i]\n        new_train = feature_next_t_otvet(row_f, new_train, train, i < gran1, i <  gran2, i) \n    col = [i for i in range(0,kol_col+1)]\n    return new_train[col]\n\n\ndef feature_engineer_new(new_train, train, feature_q, kol_f):\n    g1 = 0.7 \n    g2 = 0.3 \n    gran1 = round(kol_f * g1)\n    gran2 = round(kol_f * g2)    \n    for i in range(0, kol_f): \n        row_f = feature_q.loc[i]       \n        new_train = feature_next_t(row_f, new_train, train, i < gran1, i <  gran2, i)         \n    return new_train\n\n\n# interface\n\ndef feature_quest(new_train, train, quest, kol_f):\n    global kol_col\n    kol_col = 9\n    feature_q = feature_df[feature_df['quest'] == quest].copy()\n    feature_q.reset_index(drop=True, inplace=True)\n    new_train = feature_engineer_new(new_train, train, feature_q, kol_f)\n    col = [i for i in range(0,kol_col+1)]\n    return new_train[col]","metadata":{"execution":{"iopub.execute_input":"2023-12-15T07:40:42.845702Z","iopub.status.busy":"2023-12-15T07:40:42.845007Z","iopub.status.idle":"2023-12-15T07:40:42.868945Z","shell.execute_reply":"2023-12-15T07:40:42.868007Z"},"papermill":{"duration":0.043004,"end_time":"2023-12-15T07:40:42.871083","exception":false,"start_time":"2023-12-15T07:40:42.828079","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"models = {}","metadata":{"execution":{"iopub.execute_input":"2023-12-15T07:40:42.904539Z","iopub.status.busy":"2023-12-15T07:40:42.904197Z","iopub.status.idle":"2023-12-15T07:40:42.908233Z","shell.execute_reply":"2023-12-15T07:40:42.907414Z"},"papermill":{"duration":0.023175,"end_time":"2023-12-15T07:40:42.910365","exception":false,"start_time":"2023-12-15T07:40:42.887190","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"list_kol_f = {\n    1:140,3:110,\n    4:110, 5:220, 6:120, 7:110, 8:110, 9:100, 10:120, 11:120,\n    14: 110, 15:160, 16:105, 17:140             \n}","metadata":{"execution":{"iopub.execute_input":"2023-12-15T07:40:42.944077Z","iopub.status.busy":"2023-12-15T07:40:42.943793Z","iopub.status.idle":"2023-12-15T07:40:42.948917Z","shell.execute_reply":"2023-12-15T07:40:42.948055Z"},"papermill":{"duration":0.024251,"end_time":"2023-12-15T07:40:42.951051","exception":false,"start_time":"2023-12-15T07:40:42.926800","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Searching for Best Parameters","metadata":{"papermill":{"duration":0.015865,"end_time":"2023-12-15T07:40:42.982994","exception":false,"start_time":"2023-12-15T07:40:42.967129","status":"completed"},"tags":[]}},{"cell_type":"markdown","source":"We use Optuna to choose the hyperparameters","metadata":{"papermill":{"duration":0.016009,"end_time":"2023-12-15T07:40:43.015178","exception":false,"start_time":"2023-12-15T07:40:42.999169","status":"completed"},"tags":[]}},{"cell_type":"code","source":"def get_trial(trial):\n    params_range = {\n#         'tree_method':'hist',  # this parameter means using the GPU when training our model to speedup the training process\n        'lambda': trial.suggest_float('lambda', 1e-3, 10.0, log=True),\n        'alpha': trial.suggest_float('alpha', 1e-3, 10.0, log=True),\n        'colsample_bytree': trial.suggest_float('colsample_bytree', 0.3, 1.0),\n        'subsample': trial.suggest_float('subsample', 0.4, 1.0),\n        'learning_rate': trial.suggest_float('learning_rate', 1e-3, 1e-1, log=True),\n        'n_estimators': trial.suggest_int('n_estimators', 10, 200),\n        'max_depth': trial.suggest_int('max_depth', 5, 12),\n        'random_state': trial.suggest_categorical('random_state', [43]),\n        'min_child_weight': trial.suggest_int('min_child_weight', 1, 300),\n        'early_stopping_rounds': 15,\n#         'objective': 'binary:logistic',\n\n    }\n    \n#     params_range = {\n#         'learning_rate': trial.suggest_float('learning_rate', 1e-5, 5e-2),\n#         'depth': trial.suggest_int('depth', 1, 10),\n#         'iterations': trial.suggest_int('iterations', 20, 200),\n        \n#         'l2_leaf_reg': trial.suggest_float('l2_leaf_reg', 1, 10),\n#         'bagging_temperature': trial.suggest_float('bagging_temperature', 0, 1),\n\n#     }\n    return params_range #params_range_catboost # params_range_xgboost","metadata":{"execution":{"iopub.execute_input":"2023-12-15T07:40:43.049087Z","iopub.status.busy":"2023-12-15T07:40:43.048382Z","iopub.status.idle":"2023-12-15T07:40:43.056289Z","shell.execute_reply":"2023-12-15T07:40:43.055379Z"},"papermill":{"duration":0.027019,"end_time":"2023-12-15T07:40:43.058320","exception":false,"start_time":"2023-12-15T07:40:43.031301","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"list_best_hyperparams = {}","metadata":{"execution":{"iopub.execute_input":"2023-12-15T07:40:43.092034Z","iopub.status.busy":"2023-12-15T07:40:43.091366Z","iopub.status.idle":"2023-12-15T07:40:43.095329Z","shell.execute_reply":"2023-12-15T07:40:43.094470Z"},"papermill":{"duration":0.022968,"end_time":"2023-12-15T07:40:43.097408","exception":false,"start_time":"2023-12-15T07:40:43.074440","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Load model for each session - also seperate by level to reduce the size","metadata":{"papermill":{"duration":0.016033,"end_time":"2023-12-15T07:40:43.129620","exception":false,"start_time":"2023-12-15T07:40:43.113587","status":"completed"},"tags":[]}},{"cell_type":"code","source":"%%time\n\nif not LOAD_MODELS:\n    df0_4 = pd.read_csv('/kaggle/input/featur/train_0_4t.csv', dtype=dtypes) \n\n    print('leng', len(df0_4))\n\n    kol_lvl = (df0_4 .groupby(['session_id'])['level'].agg('nunique') < 5)\n    list_session = kol_lvl[kol_lvl].index\n    df0_4  = df0_4 [~df0_4 ['session_id'].isin(list_session)]\n    df0_4 = delt_time_def(df0_4)\n\n    quests_0_4 = [1, 3] \n    # list_kol_f = {1:140,3:110}\n\n    kol_quest = len(quests_0_4)\n    # ITERATE THRU QUESTIONS\n    for q in quests_0_4:\n        print('### quest ', q, end='')\n        new_train = feature_engineer(df0_4, list_kol_f[q])\n        train_x = feature_quest(new_train, df0_4, q, list_kol_f[q])\n        print (' ---- ', 'train_q.shape = ', train_x.shape)\n\n        # TRAIN DATA\n        train_users = train_x.index.values\n        train_y = targets.loc[targets.q==q].set_index('session').loc[train_users]\n\n\n        def objective(trial, data=train_x.astype('float32'), target=train_y['correct'].astype('int')):\n\n            training_set, validation_set, training_label, validation_label = train_test_split(\n                data, \n                target, \n                test_size=0.2,\n                random_state=42\n            )\n            param = get_trial(trial)\n            model = xgb.XGBClassifier(**param)  \n#             model = CatBoostClassifier(**param)\n\n            model.fit(\n                training_set,\n                training_label,\n                eval_set=[(validation_set, validation_label)],\n                verbose=20\n            )\n\n            preds = model.predict_proba(validation_set)[:, 1]\n            print(preds)\n    \n            preds = np.array(preds > THRESHOLD).astype(int)\n\n            acc = accuracy_score(validation_label, preds)\n            roc_auc = roc_auc_score(validation_label, preds)\n            f1 = f1_score(validation_label, preds)\n            \n            print('accuracy', acc)\n            print('roc_auc', roc_auc)\n            print('f1_score', f1)\n\n            return acc\n\n        study = optuna.create_study(direction='maximize')\n        study.optimize(objective, n_trials=NUM_TRIES)\n\n\n        print('Number of finished trials:', len(study.trials))\n        print('Best trial:', study.best_trial.params)\n\n        list_best_hyperparams[f'{q}'] = study.best_trial.params\n\n    del df0_4","metadata":{"execution":{"iopub.execute_input":"2023-12-15T07:40:43.163306Z","iopub.status.busy":"2023-12-15T07:40:43.162726Z","iopub.status.idle":"2023-12-15T08:52:42.740363Z","shell.execute_reply":"2023-12-15T08:52:42.739119Z"},"papermill":{"duration":4319.597169,"end_time":"2023-12-15T08:52:42.742971","exception":false,"start_time":"2023-12-15T07:40:43.145802","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"list_best_hyperparams","metadata":{"execution":{"iopub.execute_input":"2023-12-15T08:52:43.126370Z","iopub.status.busy":"2023-12-15T08:52:43.125537Z","iopub.status.idle":"2023-12-15T08:52:43.133547Z","shell.execute_reply":"2023-12-15T08:52:43.132512Z"},"papermill":{"duration":0.174238,"end_time":"2023-12-15T08:52:43.135733","exception":false,"start_time":"2023-12-15T08:52:42.961495","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if not LOAD_MODELS:\n\n    df5_12 = pd.read_csv('/kaggle/input/featur/train_5_12t.csv', dtype=dtypes)\n    print('leng', len(df5_12))\n\n    kol_lvl = (df5_12.groupby(['session_id'])['level'].agg('nunique') < 8)\n    list_session = kol_lvl[kol_lvl].index\n    df5_12 = df5_12[~df5_12['session_id'].isin(list_session)]\n    df5_12 = delt_time_def(df5_12)\n    quests_5_12 = [4, 5, 6, 7, 8, 9, 10, 11] \n\n    # list_kol_f = {4:110, 5:220, 6:120, 7:110, 8:110, 9:100, 10:120, 11:120}\n\n    kol_quest = len(quests_5_12)\n    # ITERATE THRU QUESTIONS\n    for q in quests_5_12:\n        print('### quest ', q, end='')\n        new_train = feature_engineer(df5_12, list_kol_f[q])\n        train_x = feature_quest(new_train, df5_12, q, list_kol_f[q])\n        print (' ---- ', 'train_q.shape = ', train_x.shape)\n\n        # TRAIN DATA\n        train_users = train_x.index.values\n        train_y = targets.loc[targets.q==q].set_index('session').loc[train_users]\n\n\n        def objective(trial, data=train_x.astype('float32'), target=train_y['correct'].astype('int')):\n\n            training_set, validation_set, training_label, validation_label = train_test_split(\n                data, \n                target, \n                test_size=0.2,\n                random_state=42\n            )\n            param = get_trial(trial)\n            model = xgb.XGBClassifier(**param)  \n#             model = CatBoostClassifier(**param)\n\n            model.fit(\n                training_set,\n                training_label,\n                eval_set=[(validation_set, validation_label)],\n                verbose=20\n            )\n\n            preds = model.predict_proba(validation_set)[:, 1]\n#             print(preds)\n#             print(np.array(preds > best_threshold).astype(int))\n            preds = np.array(preds > THRESHOLD).astype(int)\n\n            acc = accuracy_score(validation_label, preds)\n            roc_auc = roc_auc_score(validation_label, preds)\n            f1 = f1_score(validation_label, preds)\n            \n            print('accuracy', acc)\n            print('roc_auc', roc_auc)\n            print('f1_score', f1)\n            \n            return acc\n\n        study = optuna.create_study(direction='maximize')\n        study.optimize(objective, n_trials=NUM_TRIES)\n\n\n        print('Number of finished trials:', len(study.trials))\n        print('Best trial:', study.best_trial.params)\n\n        list_best_hyperparams[f'{q}'] = study.best_trial.params\n\n\n    del df5_12","metadata":{"execution":{"iopub.execute_input":"2023-12-15T08:52:43.468636Z","iopub.status.busy":"2023-12-15T08:52:43.468272Z","iopub.status.idle":"2023-12-15T12:00:15.882335Z","shell.execute_reply":"2023-12-15T12:00:15.881073Z"},"papermill":{"duration":11252.584797,"end_time":"2023-12-15T12:00:15.884991","exception":false,"start_time":"2023-12-15T08:52:43.300194","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if not LOAD_MODELS:\n    df13_22 = pd.read_csv('/kaggle/input/featur/train_13_22t.csv', dtype=dtypes) \n    print('leng', len(df13_22))\n\n    kol_lvl = (df13_22 .groupby(['session_id'])['level'].agg('nunique') < 10)\n    list_session = kol_lvl[kol_lvl].index\n    df13_22  = df13_22 [~df13_22 ['session_id'].isin(list_session)]\n    df13_22 = delt_time_def(df13_22)\n\n    quests_13_22 = [14, 15, 16, 17] \n    # list_kol_f = {14: 110, 15:160, 16:105, 17:140}\n\n    kol_quest = len(quests_13_22)\n    # ITERATE THRU QUESTIONS\n    for q in quests_13_22:\n        print('### quest ', q, end='')\n        new_train = feature_engineer(df13_22, list_kol_f[q])\n        train_x = feature_quest(new_train, df13_22, q, list_kol_f[q])\n        print (' ---- ', 'train_q.shape = ', train_x.shape)\n\n        # TRAIN DATA\n        train_users = train_x.index.values\n        train_y = targets.loc[targets.q==q].set_index('session').loc[train_users]\n\n\n        def objective(trial, data=train_x.astype('float32'), target=train_y['correct'].astype('int')):\n\n            training_set, validation_set, training_label, validation_label = train_test_split(\n                data, \n                target, \n                test_size=0.2,\n                random_state=42\n            )\n            param = get_trial(trial)\n            model = xgb.XGBClassifier(**param)  \n#             model = CatBoostClassifier(**param)\n            model.fit(\n                training_set,\n                training_label,\n                eval_set=[(validation_set, validation_label)],\n                verbose=20\n            )\n\n            preds = model.predict_proba(validation_set)[:, 1]\n            print(preds)\n            preds = np.array(preds > THRESHOLD).astype(int)\n\n            acc = accuracy_score(validation_label, preds)\n            roc_auc = roc_auc_score(validation_label, preds)\n            f1 = f1_score(validation_label, preds)\n            \n            print('accuracy', acc)\n            print('roc_auc', roc_auc)\n            print('f1_score', f1)\n            \n            return acc\n\n\n        study = optuna.create_study(direction='maximize')\n        study.optimize(objective, n_trials=NUM_TRIES)\n\n\n        print('Number of finished trials:', len(study.trials))\n        print('Best trial:', study.best_trial.params)\n\n        list_best_hyperparams[f'{q}'] = study.best_trial.params\n\n\n    del df13_22","metadata":{"execution":{"iopub.execute_input":"2023-12-15T12:00:17.442453Z","iopub.status.busy":"2023-12-15T12:00:17.442083Z","iopub.status.idle":"2023-12-15T13:39:25.293717Z","shell.execute_reply":"2023-12-15T13:39:25.292495Z"},"papermill":{"duration":5948.565735,"end_time":"2023-12-15T13:39:25.295866","exception":false,"start_time":"2023-12-15T12:00:16.730131","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Create model with best parameters","metadata":{"papermill":{"duration":0.980575,"end_time":"2023-12-15T13:39:27.228441","exception":false,"start_time":"2023-12-15T13:39:26.247866","status":"completed"},"tags":[]}},{"cell_type":"code","source":"list_best_hyperparams","metadata":{"execution":{"iopub.execute_input":"2023-12-15T13:39:29.212003Z","iopub.status.busy":"2023-12-15T13:39:29.211040Z","iopub.status.idle":"2023-12-15T13:39:29.222640Z","shell.execute_reply":"2023-12-15T13:39:29.221655Z"},"papermill":{"duration":1.045006,"end_time":"2023-12-15T13:39:29.224978","exception":false,"start_time":"2023-12-15T13:39:28.179972","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def create_model(old_train, quests, models, list_kol_f):\n    \n    kol_quest = len(quests)\n    # ITERATE THRU QUESTIONS\n    print(quests)\n    for q in quests:\n        print('### quest ', q, end='')\n        new_train = feature_engineer(old_train, list_kol_f[q])\n        train_x = feature_quest(new_train, old_train, q, list_kol_f[q])\n        print (' ---- ', 'train_q.shape = ', train_x.shape)\n           \n        # TRAIN DATA\n        train_users = train_x.index.values\n        train_y = targets.loc[targets.q==q].set_index('session').loc[train_users]\n\n        # TRAIN MODEL \n        if not LOAD_MODELS:\n            model = xgb.XGBClassifier(**list_best_hyperparams[f'{q}'])  \n            model.fit(train_x.astype('float32'), train_y['correct'], verbose=False)\n            model.save_model(f'{MODEL_NAME}_{q}')\n        else:\n            model = xgb.XGBClassifier()\n            model.load_model(f'/kaggle/input/gameplay-prediction/{MODEL_NAME}_{q}')\n\n        # SAVE MODEL, PREDICT VALID OOF\n        models[f'{q}'] = model\n\n    return models","metadata":{"execution":{"iopub.execute_input":"2023-12-15T13:39:31.149755Z","iopub.status.busy":"2023-12-15T13:39:31.149121Z","iopub.status.idle":"2023-12-15T13:39:31.158673Z","shell.execute_reply":"2023-12-15T13:39:31.157730Z"},"papermill":{"duration":0.986879,"end_time":"2023-12-15T13:39:31.160913","exception":false,"start_time":"2023-12-15T13:39:30.174034","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Load models for each quests. We only use session that play a lot, which sastify some number of played level","metadata":{"papermill":{"duration":0.947803,"end_time":"2023-12-15T13:39:33.151471","exception":false,"start_time":"2023-12-15T13:39:32.203668","status":"completed"},"tags":[]}},{"cell_type":"code","source":"models = {}\n\nlist_kol_f = {\n    1:140,3:110,\n    4:120, 5:220, 6:130, 7:110, 8:110, 9:100, 10:140, 11:120,\n    14: 160, 15:160, 16:130, 17:140             \n}","metadata":{"execution":{"iopub.execute_input":"2023-12-15T13:39:35.140307Z","iopub.status.busy":"2023-12-15T13:39:35.139543Z","iopub.status.idle":"2023-12-15T13:39:35.145639Z","shell.execute_reply":"2023-12-15T13:39:35.144608Z"},"papermill":{"duration":1.053431,"end_time":"2023-12-15T13:39:35.148095","exception":false,"start_time":"2023-12-15T13:39:34.094664","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df0_4 = pd.read_csv('/kaggle/input/featur/train_0_4t.csv', dtype=dtypes) \nkol_lvl = (df0_4 .groupby(['session_id'])['level'].agg('nunique') < 5)\nlist_session = kol_lvl[kol_lvl].index\ndf0_4  = df0_4 [~df0_4 ['session_id'].isin(list_session)]\ndf0_4 = delt_time_def(df0_4)\n\nquests_0_4 = [1, 3] \n# list_kol_f = {1:140,3:110}\n\nmodels = create_model(df0_4, quests_0_4, models, list_kol_f)\ndel df0_4","metadata":{"execution":{"iopub.execute_input":"2023-12-15T13:39:37.072183Z","iopub.status.busy":"2023-12-15T13:39:37.071388Z","iopub.status.idle":"2023-12-15T13:41:13.279057Z","shell.execute_reply":"2023-12-15T13:41:13.278119Z"},"papermill":{"duration":97.179163,"end_time":"2023-12-15T13:41:13.281704","exception":false,"start_time":"2023-12-15T13:39:36.102541","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df5_12 = pd.read_csv('/kaggle/input/featur/train_5_12t.csv', dtype=dtypes)\nkol_lvl = (df5_12.groupby(['session_id'])['level'].agg('nunique') < 8)\nlist_session = kol_lvl[kol_lvl].index\ndf5_12 = df5_12[~df5_12['session_id'].isin(list_session)]\ndf5_12 = delt_time_def(df5_12)\nquests_5_12 = [4, 5, 6, 7, 8, 9, 10, 11] \n\n# list_kol_f = {4:110, 5:220, 6:120, 7:110, 8:110, 9:100, 10:120, 11:120}\n\nmodels = create_model(df5_12, quests_5_12, models, list_kol_f)\ndel df5_12","metadata":{"execution":{"iopub.execute_input":"2023-12-15T13:41:15.289429Z","iopub.status.busy":"2023-12-15T13:41:15.288347Z","iopub.status.idle":"2023-12-15T13:47:54.055123Z","shell.execute_reply":"2023-12-15T13:47:54.054079Z"},"papermill":{"duration":399.728163,"end_time":"2023-12-15T13:47:54.059010","exception":false,"start_time":"2023-12-15T13:41:14.330847","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df13_22 = pd.read_csv('/kaggle/input/featur/train_13_22t.csv', dtype=dtypes) \nkol_lvl = (df13_22 .groupby(['session_id'])['level'].agg('nunique') < 10)\nlist_session = kol_lvl[kol_lvl].index\ndf13_22  = df13_22 [~df13_22 ['session_id'].isin(list_session)]\ndf13_22 = delt_time_def(df13_22)\n\nquests_13_22 = [14, 15, 16, 17] \n# list_kol_f = {14: 110, 15:160, 16:105, 17:140}\n\nmodels = create_model(df13_22, quests_13_22, models, list_kol_f)\ndel df13_22 ","metadata":{"execution":{"iopub.execute_input":"2023-12-15T13:47:56.065009Z","iopub.status.busy":"2023-12-15T13:47:56.064008Z","iopub.status.idle":"2023-12-15T13:52:11.545839Z","shell.execute_reply":"2023-12-15T13:52:11.544890Z"},"papermill":{"duration":256.535686,"end_time":"2023-12-15T13:52:11.548549","exception":false,"start_time":"2023-12-15T13:47:55.012863","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(models)","metadata":{"execution":{"iopub.execute_input":"2023-12-15T13:52:13.756209Z","iopub.status.busy":"2023-12-15T13:52:13.755543Z","iopub.status.idle":"2023-12-15T13:52:13.801502Z","shell.execute_reply":"2023-12-15T13:52:13.800385Z"},"papermill":{"duration":1.082395,"end_time":"2023-12-15T13:52:13.804073","exception":false,"start_time":"2023-12-15T13:52:12.721678","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Infer Test Data**","metadata":{"papermill":{"duration":0.951814,"end_time":"2023-12-15T13:52:15.777471","exception":false,"start_time":"2023-12-15T13:52:14.825657","status":"completed"},"tags":[]}},{"cell_type":"code","source":"import jo_wilder\n\ntry:\n    jo_wilder.make_env.__called__ = False\n    env.__called__ = False\n    type(env)._state = type(type(env)._state).__dict__['INIT']\nexcept:\n    pass\n\nenv = jo_wilder.make_env()\niter_test = env.iter_test()    ","metadata":{"execution":{"iopub.execute_input":"2023-12-15T13:52:17.782527Z","iopub.status.busy":"2023-12-15T13:52:17.782160Z","iopub.status.idle":"2023-12-15T13:52:17.821563Z","shell.execute_reply":"2023-12-15T13:52:17.820723Z"},"papermill":{"duration":0.985889,"end_time":"2023-12-15T13:52:17.823762","exception":false,"start_time":"2023-12-15T13:52:16.837873","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"models","metadata":{"execution":{"iopub.execute_input":"2023-12-15T13:52:19.904123Z","iopub.status.busy":"2023-12-15T13:52:19.903011Z","iopub.status.idle":"2023-12-15T13:52:19.951944Z","shell.execute_reply":"2023-12-15T13:52:19.950786Z"},"papermill":{"duration":1.137584,"end_time":"2023-12-15T13:52:19.954621","exception":false,"start_time":"2023-12-15T13:52:18.817037","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Split the data into segment, using suitable model to predict on the engineered feature","metadata":{"papermill":{"duration":0.965163,"end_time":"2023-12-15T13:52:22.077202","exception":false,"start_time":"2023-12-15T13:52:21.112039","status":"completed"},"tags":[]}},{"cell_type":"code","source":"%%time\ng_end4 = 0\ng_end5 = 0\n\nlist_q = {'0-4':quests_0_4, '5-12':quests_5_12, '13-22':quests_13_22}\nfor (test, sam_sub) in iter_test:\n    sam_sub['question'] = [int(label.split('_')[1][1:]) for label in sam_sub['session_id']]    \n    grp = test.level_group.values[0]   \n    sam_sub['correct'] = 1\n    sam_sub.loc[sam_sub.question.isin([5, 8, 10, 13, 15]), 'correct'] = 0  \n    old_train = delt_time_def(test[test.level_group == grp])\n       \n    for q in list_q[grp]:\n        \n        start4 = time.time()\n        new_train = feature_engineer(old_train, list_kol_f[q])\n        new_train = feature_quest_otvet(new_train, old_train, q, list_kol_f[q])\n#       new_train = feature_quest(new_train, old_train, q, kol_f)\n        \n        end4 = time.time() - start4\n        g_end4 += end4\n        \n        start5 = time.time()        \n        \n        clf = models[f'{q}']\n        p = clf.predict_proba(new_train.astype('float32'))[:,1]        \n        \n        end5 = time.time() - start5\n        g_end5 += end5\n             \n        \n        mask = sam_sub.question == q \n        x = int(p[0] > THRESHOLD)\n        sam_sub.loc[mask,'correct'] = x      \n        \n    convert_dict = {\n        'correct': int,\n    }\n        \n    sam_sub = sam_sub[['session_id', 'correct']].astype(convert_dict)\n    sam_sub.fillna(1)\n    print(sam_sub)\n    env.predict(sam_sub)","metadata":{"execution":{"iopub.execute_input":"2023-12-15T13:52:24.057085Z","iopub.status.busy":"2023-12-15T13:52:24.055412Z","iopub.status.idle":"2023-12-15T13:52:34.573797Z","shell.execute_reply":"2023-12-15T13:52:34.572557Z"},"papermill":{"duration":11.555325,"end_time":"2023-12-15T13:52:34.576715","exception":false,"start_time":"2023-12-15T13:52:23.021390","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# EDA submission.csv","metadata":{"papermill":{"duration":0.991297,"end_time":"2023-12-15T13:52:36.557591","exception":false,"start_time":"2023-12-15T13:52:35.566294","status":"completed"},"tags":[]}},{"cell_type":"code","source":"df = pd.read_csv('submission.csv')\nprint( df.shape )\ndf.head(60)","metadata":{"execution":{"iopub.execute_input":"2023-12-15T13:52:38.572211Z","iopub.status.busy":"2023-12-15T13:52:38.571419Z","iopub.status.idle":"2023-12-15T13:52:38.588551Z","shell.execute_reply":"2023-12-15T13:52:38.587539Z"},"papermill":{"duration":1.06497,"end_time":"2023-12-15T13:52:38.590855","exception":false,"start_time":"2023-12-15T13:52:37.525885","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]}]}