{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.7.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":45533,"databundleVersionId":5748852,"sourceType":"competition"},{"sourceId":5675701,"sourceType":"datasetVersion","datasetId":3244175}],"dockerImageVersionId":30407,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"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\nfrom xgboost import XGBClassifier ","metadata":{"execution":{"iopub.status.busy":"2023-12-18T17:18:31.664864Z","iopub.execute_input":"2023-12-18T17:18:31.666123Z","iopub.status.idle":"2023-12-18T17:18:33.675017Z","shell.execute_reply.started":"2023-12-18T17:18:31.666079Z","shell.execute_reply":"2023-12-18T17:18:33.673365Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"THRESHOLD = 0.68\nRATIO = [3, 2, 5]\nR = 0\nfor h in RATIO:\n    R += h","metadata":{"execution":{"iopub.status.busy":"2023-12-18T17:18:33.680721Z","iopub.execute_input":"2023-12-18T17:18:33.682957Z","iopub.status.idle":"2023-12-18T17:18:33.690882Z","shell.execute_reply.started":"2023-12-18T17:18:33.682906Z","shell.execute_reply":"2023-12-18T17:18:33.689618Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Load Train Data and Labels","metadata":{"papermill":{"duration":0.004542,"end_time":"2023-02-07T00:59:59.189777","exception":false,"start_time":"2023-02-07T00:59:59.185235","status":"completed"},"tags":[]}},{"cell_type":"code","source":"dtypes = {\"session_id\": 'int64',\n          \"index\": np.int16,\n          \"elapsed_time\": np.int32,\n          \"event_name\": 'category',\n          \"name\": 'category',\n          \"level\": np.int8,\n          \"page\": np.float16,\n          \"room_coor_x\": np.float16,\n          \"room_coor_y\": np.float16,\n          \"screen_coor_x\": np.float16,\n          \"screen_coor_y\": np.float16,\n          \"hover_duration\": np.float32,\n          \"text\": 'category',\n          \"fqid\": 'category',\n          \"room_fqid\": 'category',\n          \"text_fqid\": 'category',\n          \"fullscreen\": np.int8,\n          \"hq\": np.int8,\n          \"music\": np.int8,\n          \"level_group\": 'category'\n          }\nuse_col = ['session_id', 'index', 'elapsed_time', 'event_name', 'name', 'level', 'page',\n           'room_coor_x', 'room_coor_y', 'hover_duration', 'text', 'fqid', 'room_fqid', 'text_fqid', 'level_group']","metadata":{"papermill":{"duration":59.284316,"end_time":"2023-02-07T01:00:58.478743","exception":false,"start_time":"2023-02-07T00:59:59.194427","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-12-18T17:18:33.692656Z","iopub.execute_input":"2023-12-18T17:18:33.695353Z","iopub.status.idle":"2023-12-18T17:18:33.713225Z","shell.execute_reply.started":"2023-12-18T17:18:33.695307Z","shell.execute_reply":"2023-12-18T17:18:33.712061Z"},"trusted":true},"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:]) )\n# print( targets.shape )\n# targets.head()","metadata":{"papermill":{"duration":0.598155,"end_time":"2023-02-07T01:00:59.082015","exception":false,"start_time":"2023-02-07T01:00:58.48386","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-12-18T17:18:33.715296Z","iopub.execute_input":"2023-12-18T17:18:33.716799Z","iopub.status.idle":"2023-12-18T17:18:34.985398Z","shell.execute_reply.started":"2023-12-18T17:18:33.716706Z","shell.execute_reply":"2023-12-18T17:18:34.983977Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"feature_df = pd.read_csv('/kaggle/input/featur/feature_sort.csv')","metadata":{"execution":{"iopub.status.busy":"2023-12-18T17:18:34.987386Z","iopub.execute_input":"2023-12-18T17:18:34.987817Z","iopub.status.idle":"2023-12-18T17:18:35.173574Z","shell.execute_reply.started":"2023-12-18T17:18:34.987759Z","shell.execute_reply":"2023-12-18T17:18:35.171725Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Feature Engineer","metadata":{"papermill":{"duration":0.005196,"end_time":"2023-02-07T01:00:59.092865","exception":false,"start_time":"2023-02-07T01:00:59.087669","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.status.busy":"2023-12-18T17:18:35.175454Z","iopub.execute_input":"2023-12-18T17:18:35.177114Z","iopub.status.idle":"2023-12-18T17:18:35.183706Z","shell.execute_reply.started":"2023-12-18T17:18:35.177073Z","shell.execute_reply":"2023-12-18T17:18:35.182851Z"},"trusted":true},"execution_count":null,"outputs":[]},{"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\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    new_train[4] = train.groupby(['session_id'])['hover_duration'].agg('mean')\n    new_train[5] = train.groupby(['session_id'])['hover_duration'].agg('std')    \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) + new_train[10].apply(lambda x: int(str(x)[8:10])).astype(np.uint8)/60\n    new_train[10] = 0\n    new_train = new_train.fillna(-1)\n    \n    return new_train","metadata":{"execution":{"iopub.status.busy":"2023-12-18T17:18:35.186361Z","iopub.execute_input":"2023-12-18T17:18:35.187348Z","iopub.status.idle":"2023-12-18T17:18:35.209373Z","shell.execute_reply.started":"2023-12-18T17:18:35.187280Z","shell.execute_reply":"2023-12-18T17:18:35.206742Z"},"trusted":true},"execution_count":null,"outputs":[]},{"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    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    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].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","metadata":{"execution":{"iopub.status.busy":"2023-12-18T17:18:35.214724Z","iopub.execute_input":"2023-12-18T17:18:35.216154Z","iopub.status.idle":"2023-12-18T17:18:35.238482Z","shell.execute_reply.started":"2023-12-18T17:18:35.216029Z","shell.execute_reply":"2023-12-18T17:18:35.237112Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def 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    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    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","metadata":{"execution":{"iopub.status.busy":"2023-12-18T17:18:35.239863Z","iopub.execute_input":"2023-12-18T17:18:35.241091Z","iopub.status.idle":"2023-12-18T17:18:35.262441Z","shell.execute_reply.started":"2023-12-18T17:18:35.241033Z","shell.execute_reply":"2023-12-18T17:18:35.260960Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def experiment_feature_next_t_otvet(row_f, new_train, train, gran_1, gran_2, i):\n    global kol_col\n    kol_col +=1\n    if row_f['kol_col'] == 1: \n        maska = train[row_f['col1']] == row_f['val1']\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    elif row_f['kol_col'] == 2: \n        col2 = row_f['col2']\n        val2 = row_f['val2']\n        maska = (train[col1] == val1) & (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","metadata":{"execution":{"iopub.status.busy":"2023-12-18T17:18:35.267274Z","iopub.execute_input":"2023-12-18T17:18:35.267733Z","iopub.status.idle":"2023-12-18T17:18:35.279968Z","shell.execute_reply.started":"2023-12-18T17:18:35.267699Z","shell.execute_reply":"2023-12-18T17:18:35.278877Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def 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]","metadata":{"execution":{"iopub.status.busy":"2023-12-18T17:18:35.281399Z","iopub.execute_input":"2023-12-18T17:18:35.282016Z","iopub.status.idle":"2023-12-18T17:18:35.293660Z","shell.execute_reply.started":"2023-12-18T17:18:35.281975Z","shell.execute_reply":"2023-12-18T17:18:35.291544Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def 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","metadata":{"execution":{"iopub.status.busy":"2023-12-18T17:18:35.296888Z","iopub.execute_input":"2023-12-18T17:18:35.297405Z","iopub.status.idle":"2023-12-18T17:18:35.310535Z","shell.execute_reply.started":"2023-12-18T17:18:35.297359Z","shell.execute_reply":"2023-12-18T17:18:35.309310Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def 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.status.busy":"2023-12-18T17:18:35.312130Z","iopub.execute_input":"2023-12-18T17:18:35.314014Z","iopub.status.idle":"2023-12-18T17:18:35.321713Z","shell.execute_reply.started":"2023-12-18T17:18:35.313980Z","shell.execute_reply":"2023-12-18T17:18:35.320626Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"models = {}","metadata":{"execution":{"iopub.status.busy":"2023-12-18T17:18:35.323125Z","iopub.execute_input":"2023-12-18T17:18:35.323594Z","iopub.status.idle":"2023-12-18T17:18:35.336243Z","shell.execute_reply.started":"2023-12-18T17:18:35.323563Z","shell.execute_reply":"2023-12-18T17:18:35.335068Z"},"trusted":true},"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.status.busy":"2023-12-18T17:18:35.338351Z","iopub.execute_input":"2023-12-18T17:18:35.339157Z","iopub.status.idle":"2023-12-18T17:18:35.350471Z","shell.execute_reply.started":"2023-12-18T17:18:35.339118Z","shell.execute_reply":"2023-12-18T17:18:35.349377Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Create model with best parameters","metadata":{}},{"cell_type":"code","source":"best_manual_catboost = {\n    '0': {\n        'depth': 7, \n        'learning_rate': 0.05,\n        'iterations': 60,\n    }\n}\n\nbest_models_catboost = {'1': {'learning_rate': 0.15063862186483024,\n  'depth': 3,\n  'iterations': 160,\n  'l2_leaf_reg': 5.632621516630103,\n  'bagging_temperature': 0.8475905765166509},\n '3': {'learning_rate': 0.39683707580388816,\n  'depth': 5,\n  'iterations': 227,\n  'l2_leaf_reg': 1.9407578411770436,\n  'bagging_temperature': 0.21181902344955256},\n '4': {'learning_rate': 0.11370255064412357,\n  'depth': 4,\n  'iterations': 287,\n  'l2_leaf_reg': 1.4708224964483256,\n  'bagging_temperature': 0.08773073917358103},\n '5': {'learning_rate': 0.28580849460145274,\n  'depth': 4,\n  'iterations': 279,\n  'l2_leaf_reg': 9.313553518482287,\n  'bagging_temperature': 0.7015608347859229},\n '6': {'learning_rate': 0.3588122908909329,\n  'depth': 1,\n  'iterations': 289,\n  'l2_leaf_reg': 8.49461253893662,\n  'bagging_temperature': 0.08791486616990786},\n '7': {'learning_rate': 0.21955870092229585,\n  'depth': 2,\n  'iterations': 237,\n  'l2_leaf_reg': 2.9004678039268246,\n  'bagging_temperature': 0.46515593518923903},\n '8': {'learning_rate': 0.21285154230320583,\n  'depth': 3,\n  'iterations': 67,\n  'l2_leaf_reg': 9.68459076158,\n  'bagging_temperature': 0.33488605259322324},\n '9': {'learning_rate': 0.22225796848152754,\n  'depth': 1,\n  'iterations': 140,\n  'l2_leaf_reg': 6.467913566374147,\n  'bagging_temperature': 0.7557847695065302},\n '10': {'learning_rate': 0.2603098279873326,\n  'depth': 4,\n  'iterations': 218,\n  'l2_leaf_reg': 2.522614672462557,\n  'bagging_temperature': 0.40225382272833377},\n '11': {'learning_rate': 0.2147074168526353,\n  'depth': 4,\n  'iterations': 206,\n  'l2_leaf_reg': 4.704643243892196,\n  'bagging_temperature': 0.9087599399580963},\n '14': {'learning_rate': 0.04999252951975951,\n  'depth': 9,\n  'iterations': 277,\n  'l2_leaf_reg': 8.80635313451722,\n  'bagging_temperature': 0.8078075901085974},\n '15': {'learning_rate': 0.4855383116927843,\n  'depth': 2,\n  'iterations': 173,\n  'l2_leaf_reg': 5.1275949109635315,\n  'bagging_temperature': 0.05056041583937895},\n '16': {'learning_rate': 0.21938751933885722,\n  'depth': 2,\n  'iterations': 95,\n  'l2_leaf_reg': 5.559420339718281,\n  'bagging_temperature': 0.21788116072468514},\n '17': {'learning_rate': 0.1208392638918446,\n  'depth': 3,\n  'iterations': 148,\n  'l2_leaf_reg': 7.590509481454825,\n  'bagging_temperature': 0.7126282415384895}}\n\nbest_models_xgboost = {'1': {'lambda': 0.46054517645273085,\n  'alpha': 0.309558813625558,\n  'colsample_bytree': 0.9709961001194,\n  'subsample': 0.9052814877282959,\n  'learning_rate': 0.08686131203926269,\n  'n_estimators': 190,\n  'max_depth': 6,\n  'random_state': 43,\n  'min_child_weight': 178},\n '3': {'lambda': 6.2609010302722545,\n  'alpha': 0.008829712142944927,\n  'colsample_bytree': 0.5078281069068661,\n  'subsample': 0.44876173983966705,\n  'learning_rate': 0.034607737521525656,\n  'n_estimators': 78,\n  'max_depth': 6,\n  'random_state': 43,\n  'min_child_weight': 59},\n '4': {'lambda': 0.002196089697117182,\n  'alpha': 0.4703891420410998,\n  'colsample_bytree': 0.40546996430905335,\n  'subsample': 0.5472557114670465,\n  'learning_rate': 0.06645703968198914,\n  'n_estimators': 193,\n  'max_depth': 11,\n  'random_state': 43,\n  'min_child_weight': 117},\n '5': {'lambda': 0.4016076024798144,\n  'alpha': 0.1487324337790175,\n  'colsample_bytree': 0.3205167435878081,\n  'subsample': 0.6884038266869779,\n  'learning_rate': 0.091678720357652,\n  'n_estimators': 170,\n  'max_depth': 6,\n  'random_state': 43,\n  'min_child_weight': 193},\n '6': {'lambda': 1.2872639184328254,\n  'alpha': 0.060756540772177806,\n  'colsample_bytree': 0.6920337325359551,\n  'subsample': 0.6257752628204902,\n  'learning_rate': 0.045563802597348414,\n  'n_estimators': 146,\n  'max_depth': 5,\n  'random_state': 43,\n  'min_child_weight': 26},\n '7': {'lambda': 0.011770641180749943,\n  'alpha': 0.10586519922535292,\n  'colsample_bytree': 0.6400326168356286,\n  'subsample': 0.8462498734950723,\n  'learning_rate': 0.054388047649770024,\n  'n_estimators': 103,\n  'max_depth': 9,\n  'random_state': 43,\n  'min_child_weight': 30},\n '8': {'lambda': 0.030668823995119495,\n  'alpha': 1.1125013487633146,\n  'colsample_bytree': 0.8629095355208878,\n  'subsample': 0.578262211729344,\n  'learning_rate': 0.09931266352240624,\n  'n_estimators': 134,\n  'max_depth': 12,\n  'random_state': 43,\n  'min_child_weight': 227},\n '9': {'lambda': 1.5426806141512248,\n  'alpha': 0.004072987773410624,\n  'colsample_bytree': 0.445090005358303,\n  'subsample': 0.8948075773729335,\n  'learning_rate': 0.030438014747969238,\n  'n_estimators': 200,\n  'max_depth': 11,\n  'random_state': 43,\n  'min_child_weight': 130},\n '10': {'lambda': 0.0553495445787293,\n  'alpha': 5.788509297588221,\n  'colsample_bytree': 0.5399990122978464,\n  'subsample': 0.7088493612881469,\n  'learning_rate': 0.06727351053609328,\n  'n_estimators': 173,\n  'max_depth': 5,\n  'random_state': 43,\n  'min_child_weight': 230},\n '11': {'lambda': 0.8019596519294295,\n  'alpha': 0.03925571758705697,\n  'colsample_bytree': 0.5216842034997399,\n  'subsample': 0.9266073303947991,\n  'learning_rate': 0.09735759359169276,\n  'n_estimators': 184,\n  'max_depth': 5,\n  'random_state': 43,\n  'min_child_weight': 280},\n '14': {'lambda': 3.1612189232216377,\n  'alpha': 0.002595500561666517,\n  'colsample_bytree': 0.5373445714004844,\n  'subsample': 0.7231861712486606,\n  'learning_rate': 0.0829129781675211,\n  'n_estimators': 86,\n  'max_depth': 5,\n  'random_state': 43,\n  'min_child_weight': 53},\n '15': {'lambda': 4.08305659058426,\n  'alpha': 0.04376799826247082,\n  'colsample_bytree': 0.7756749380431447,\n  'subsample': 0.7620157557114705,\n  'learning_rate': 0.07326787669639384,\n  'n_estimators': 143,\n  'max_depth': 11,\n  'random_state': 43,\n  'min_child_weight': 193},\n '16': {'lambda': 0.0013552889932012958,\n  'alpha': 0.03945051058600412,\n  'colsample_bytree': 0.9753446984501696,\n  'subsample': 0.4169089569935959,\n  'learning_rate': 0.06346024696190851,\n  'n_estimators': 171,\n  'max_depth': 11,\n  'random_state': 43,\n  'min_child_weight': 255},\n '17': {'lambda': 0.06376234358327733,\n  'alpha': 0.8555674514711957,\n  'colsample_bytree': 0.3105210407135366,\n  'subsample': 0.7322592658249376,\n  'learning_rate': 0.08269861154443374,\n  'n_estimators': 146,\n  'max_depth': 6,\n  'random_state': 43,\n  'min_child_weight': 293}}\n\n\ndef create_model_catboost_(old_train, quests, models, list_kol_f):\n    \n    kol_quest = len(quests)\n    # ITERATE THRU QUESTIONS\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\n        \n        model = CatBoostClassifier(**best_manual_catboost[f'0'])\n\n        model.fit(train_x.astype('float32'), train_y['correct'], verbose=False)\n\n        # SAVE MODEL, PREDICT VALID OOF\n        models[f'{q}'] = model\n    print('***')\n    \n    return models\n\ndef create_model_catboost(old_train, quests, models, list_kol_f):\n    \n    kol_quest = len(quests)\n    # ITERATE THRU QUESTIONS\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\n        \n        model = CatBoostClassifier(**best_models_catboost[f'{q}'])\n\n        model.fit(train_x.astype('float32'), train_y['correct'], verbose=False)\n\n        # SAVE MODEL, PREDICT VALID OOF\n        models[f'{q}'] = model\n    print('***')\n    \n    return models\n\n\ndef create_model_xgboost(old_train, quests, models, list_kol_f):\n    \n    kol_quest = len(quests)\n    # ITERATE THRU QUESTIONS\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\n        \n        model = XGBClassifier(**best_models_xgboost[f'{q}'])\n\n        model.fit(train_x.astype('float32'), train_y['correct'], verbose=False)\n\n        # SAVE MODEL, PREDICT VALID OOF\n        models[f'{q}'] = model\n    print('***')\n    \n    return models","metadata":{"execution":{"iopub.status.busy":"2023-12-18T17:18:35.351923Z","iopub.execute_input":"2023-12-18T17:18:35.352469Z","iopub.status.idle":"2023-12-18T17:18:35.398432Z","shell.execute_reply.started":"2023-12-18T17:18:35.352435Z","shell.execute_reply":"2023-12-18T17:18:35.395463Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"models_catboost_ = {}\nmodels_catboost = {}\nmodels_xgboost = {}\n\n\n#score0.7\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.status.busy":"2023-12-18T17:18:35.401674Z","iopub.execute_input":"2023-12-18T17:18:35.404152Z","iopub.status.idle":"2023-12-18T17:18:35.414633Z","shell.execute_reply.started":"2023-12-18T17:18:35.404072Z","shell.execute_reply":"2023-12-18T17:18:35.413754Z"},"trusted":true},"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_catboost = create_model_catboost(df0_4, quests_0_4, models, list_kol_f)\nmodels_catboost_ = create_model_catboost_(df0_4, quests_0_4, models, list_kol_f)\nmodels_xgboost = create_model_xgboost(df0_4, quests_0_4, models, list_kol_f)\n\n\ndel df0_4","metadata":{"execution":{"iopub.status.busy":"2023-12-18T17:18:35.415899Z","iopub.execute_input":"2023-12-18T17:18:35.416331Z","iopub.status.idle":"2023-12-18T17:22:16.897285Z","shell.execute_reply.started":"2023-12-18T17:18:35.416301Z","shell.execute_reply":"2023-12-18T17:22:16.894356Z"},"trusted":true},"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\n\nmodels_catboost = create_model_catboost(df5_12, quests_5_12, models, list_kol_f)\nmodels_catboost_ = create_model_catboost_(df5_12, quests_5_12, models, list_kol_f)\nmodels_xgboost = create_model_xgboost(df5_12, quests_5_12, models, list_kol_f)\ndel df5_12","metadata":{"execution":{"iopub.status.busy":"2023-12-18T17:22:16.901347Z","iopub.execute_input":"2023-12-18T17:22:16.901853Z","iopub.status.idle":"2023-12-18T17:39:48.961113Z","shell.execute_reply.started":"2023-12-18T17:22:16.901809Z","shell.execute_reply":"2023-12-18T17:39:48.959368Z"},"trusted":true},"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_catboost_ = create_model_catboost_(df13_22, quests_13_22, models, list_kol_f)\nmodels_catboost = create_model_catboost(df13_22, quests_13_22, models, list_kol_f)\nmodels_xgboost = create_model_xgboost(df13_22, quests_13_22, models, list_kol_f)\n\ndel df13_22 ","metadata":{"execution":{"iopub.status.busy":"2023-12-18T17:39:48.962698Z","iopub.execute_input":"2023-12-18T17:39:48.964493Z","iopub.status.idle":"2023-12-18T17:52:09.488314Z","shell.execute_reply.started":"2023-12-18T17:39:48.964392Z","shell.execute_reply":"2023-12-18T17:52:09.487126Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Infer Test Data**","metadata":{}},{"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.status.busy":"2023-12-18T17:52:09.490626Z","iopub.execute_input":"2023-12-18T17:52:09.491334Z","iopub.status.idle":"2023-12-18T17:52:09.528462Z","shell.execute_reply.started":"2023-12-18T17:52:09.491288Z","shell.execute_reply":"2023-12-18T17:52:09.526988Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import time","metadata":{"execution":{"iopub.status.busy":"2023-12-18T17:52:09.532889Z","iopub.execute_input":"2023-12-18T17:52:09.534424Z","iopub.status.idle":"2023-12-18T17:52:09.541652Z","shell.execute_reply.started":"2023-12-18T17:52:09.534330Z","shell.execute_reply":"2023-12-18T17:52:09.539829Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"g_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        \n        clf_catboost_ = models_catboost_[f'{q}']\n        p_catboost_ = clf_catboost_.predict_proba(new_train.astype('float32'))[:,1]        \n\n        clf_catboost = models_catboost[f'{q}']\n        p_catboost = clf_catboost.predict_proba(new_train.astype('float32'))[:,1]        \n        \n        clf_xgboost = models_xgboost[f'{q}']\n        p_xgboost = clf_xgboost.predict_proba(new_train.astype('float32'))[:,1]        \n        \n        p = RATIO[0] / R * p_catboost + RATIO[1] / R * p_catboost_ + RATIO[2] / R * p_xgboost \n        \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        \n    sam_sub = sam_sub[['session_id', 'correct']]\n    print(sam_sub)\n    env.predict(sam_sub)","metadata":{"execution":{"iopub.status.busy":"2023-12-18T17:52:09.544506Z","iopub.execute_input":"2023-12-18T17:52:09.545326Z","iopub.status.idle":"2023-12-18T17:52:19.619728Z","shell.execute_reply.started":"2023-12-18T17:52:09.545290Z","shell.execute_reply":"2023-12-18T17:52:19.617903Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# EDA submission.csv","metadata":{"papermill":{"duration":0.011427,"end_time":"2023-02-07T01:02:45.502331","exception":false,"start_time":"2023-02-07T01:02:45.490904","status":"completed"},"tags":[]}},{"cell_type":"code","source":"df = pd.read_csv('submission.csv')\nprint( df.shape )\ndf.head(60)","metadata":{"papermill":{"duration":0.027432,"end_time":"2023-02-07T01:02:45.541022","exception":false,"start_time":"2023-02-07T01:02:45.51359","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-12-18T17:52:19.621283Z","iopub.execute_input":"2023-12-18T17:52:19.622242Z","iopub.status.idle":"2023-12-18T17:52:19.649817Z","shell.execute_reply.started":"2023-12-18T17:52:19.622190Z","shell.execute_reply":"2023-12-18T17:52:19.648869Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}