{"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, numpy as np\nfrom catboost import CatBoostClassifier\nimport joblib\nimport pickle\nimport sys\n\n# Asthetics\nimport warnings\nimport sklearn.exceptions\nwarnings.filterwarnings('ignore', category=DeprecationWarning)\nwarnings.filterwarnings('ignore', category=FutureWarning)\nwarnings.filterwarnings('ignore', category=RuntimeWarning)\nwarnings.filterwarnings('ignore', category=UserWarning)\nwarnings.filterwarnings(\"ignore\", category=sklearn.exceptions.UndefinedMetricWarning)","metadata":{"papermill":{"duration":1.603625,"end_time":"2023-06-09T03:40:40.818835","exception":false,"start_time":"2023-06-09T03:40:39.21521","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-06-28T22:09:24.399052Z","iopub.execute_input":"2023-06-28T22:09:24.399554Z","iopub.status.idle":"2023-06-28T22:09:25.270873Z","shell.execute_reply.started":"2023-06-28T22:09:24.399450Z","shell.execute_reply":"2023-06-28T22:09:25.269203Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Load Train Data and Labels","metadata":{"papermill":{"duration":0.009149,"end_time":"2023-06-09T03:40:40.837837","exception":false,"start_time":"2023-06-09T03:40:40.828688","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":0.02232,"end_time":"2023-06-09T03:40:40.869708","exception":false,"start_time":"2023-06-09T03:40:40.847388","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-06-28T22:09:25.272892Z","iopub.execute_input":"2023-06-28T22:09:25.273220Z","iopub.status.idle":"2023-06-28T22:09:25.281021Z","shell.execute_reply.started":"2023-06-28T22:09:25.273191Z","shell.execute_reply":"2023-06-28T22:09:25.279644Z"},"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:]) )\nprint( targets.shape )\ntargets.head()","metadata":{"papermill":{"duration":1.621235,"end_time":"2023-06-09T03:40:42.500672","exception":false,"start_time":"2023-06-09T03:40:40.879437","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-06-28T22:09:25.282391Z","iopub.execute_input":"2023-06-28T22:09:25.282961Z","iopub.status.idle":"2023-06-28T22:09:26.306643Z","shell.execute_reply.started":"2023-06-28T22:09:25.282931Z","shell.execute_reply":"2023-06-28T22:09:26.305652Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"feature_df = pd.read_csv('/kaggle/input/featur/feature_sort.csv')","metadata":{"papermill":{"duration":0.172873,"end_time":"2023-06-09T03:40:42.683618","exception":false,"start_time":"2023-06-09T03:40:42.510745","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-06-28T22:09:26.309132Z","iopub.execute_input":"2023-06-28T22:09:26.309667Z","iopub.status.idle":"2023-06-28T22:09:26.421037Z","shell.execute_reply.started":"2023-06-28T22:09:26.309633Z","shell.execute_reply":"2023-06-28T22:09:26.420273Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Feature Engineer","metadata":{"papermill":{"duration":0.009618,"end_time":"2023-06-09T03:40:42.703284","exception":false,"start_time":"2023-06-09T03:40:42.693666","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":{"papermill":{"duration":0.020539,"end_time":"2023-06-09T03:40:42.734026","exception":false,"start_time":"2023-06-09T03:40:42.713487","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-06-28T22:09:26.424462Z","iopub.execute_input":"2023-06-28T22:09:26.426017Z","iopub.status.idle":"2023-06-28T22:09:26.433458Z","shell.execute_reply.started":"2023-06-28T22:09:26.425990Z","shell.execute_reply":"2023-06-28T22:09:26.432350Z"},"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":{"papermill":{"duration":0.031246,"end_time":"2023-06-09T03:40:42.77541","exception":false,"start_time":"2023-06-09T03:40:42.744164","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-06-28T22:09:26.434754Z","iopub.execute_input":"2023-06-28T22:09:26.435119Z","iopub.status.idle":"2023-06-28T22:09:26.452753Z","shell.execute_reply.started":"2023-06-28T22:09:26.435089Z","shell.execute_reply":"2023-06-28T22:09:26.451882Z"},"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":{"papermill":{"duration":0.026331,"end_time":"2023-06-09T03:40:42.811929","exception":false,"start_time":"2023-06-09T03:40:42.785598","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-06-28T22:09:26.454193Z","iopub.execute_input":"2023-06-28T22:09:26.454737Z","iopub.status.idle":"2023-06-28T22:09:26.464183Z","shell.execute_reply.started":"2023-06-28T22:09:26.454710Z","shell.execute_reply":"2023-06-28T22:09:26.463274Z"},"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":{"papermill":{"duration":0.025038,"end_time":"2023-06-09T03:40:42.847178","exception":false,"start_time":"2023-06-09T03:40:42.82214","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-06-28T22:09:26.465386Z","iopub.execute_input":"2023-06-28T22:09:26.465868Z","iopub.status.idle":"2023-06-28T22:09:26.479493Z","shell.execute_reply.started":"2023-06-28T22:09:26.465843Z","shell.execute_reply":"2023-06-28T22:09:26.478828Z"},"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":{"papermill":{"duration":0.024469,"end_time":"2023-06-09T03:40:42.881703","exception":false,"start_time":"2023-06-09T03:40:42.857234","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-06-28T22:09:26.480854Z","iopub.execute_input":"2023-06-28T22:09:26.481320Z","iopub.status.idle":"2023-06-28T22:09:26.496611Z","shell.execute_reply.started":"2023-06-28T22:09:26.481295Z","shell.execute_reply":"2023-06-28T22:09:26.495873Z"},"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":{"papermill":{"duration":0.022073,"end_time":"2023-06-09T03:40:42.913858","exception":false,"start_time":"2023-06-09T03:40:42.891785","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-06-28T22:09:26.503037Z","iopub.execute_input":"2023-06-28T22:09:26.504653Z","iopub.status.idle":"2023-06-28T22:09:26.512961Z","shell.execute_reply.started":"2023-06-28T22:09:26.504618Z","shell.execute_reply":"2023-06-28T22:09:26.512247Z"},"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        new_train = new_train.fillna(-1)\n    return new_train","metadata":{"papermill":{"duration":0.02019,"end_time":"2023-06-09T03:40:42.944055","exception":false,"start_time":"2023-06-09T03:40:42.923865","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-06-28T22:09:26.516297Z","iopub.execute_input":"2023-06-28T22:09:26.516799Z","iopub.status.idle":"2023-06-28T22:09:26.529246Z","shell.execute_reply.started":"2023-06-28T22:09:26.516770Z","shell.execute_reply":"2023-06-28T22:09:26.528454Z"},"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":{"papermill":{"duration":0.021014,"end_time":"2023-06-09T03:40:42.975183","exception":false,"start_time":"2023-06-09T03:40:42.954169","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-06-28T22:09:26.533449Z","iopub.execute_input":"2023-06-28T22:09:26.534207Z","iopub.status.idle":"2023-06-28T22:09:26.542552Z","shell.execute_reply.started":"2023-06-28T22:09:26.534177Z","shell.execute_reply":"2023-06-28T22:09:26.541858Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.linear_model import LogisticRegression\nfrom xgboost import XGBClassifier\nfrom sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier, GradientBoostingClassifier, ExtraTreesClassifier, VotingClassifier\nfrom sklearn.discriminant_analysis import LinearDiscriminantAnalysis\nfrom sklearn.neighbors import KNeighborsClassifier\nfrom sklearn.tree import DecisionTreeClassifier\nfrom sklearn.neural_network import MLPClassifier\n\ndef create_model(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        gbr_model = GradientBoostingClassifier(loss=\"deviance\",\n                                 n_estimators = 300,\n                                 learning_rate= 0.05,\n                                 max_depth=4,\n                                 min_samples_leaf=100,\n                                 max_features=0.3,\n                                          )\n        \n        gbr_model.fit(train_x.astype('float32'), train_y['correct']) \n\n        # SAVE MODEL, PREDICT VALID OOF\n        models[f'{q}_gbr'] = gbr_model\n    print('***')\n    \n    return models","metadata":{"papermill":{"duration":0.023079,"end_time":"2023-06-09T03:40:43.008244","exception":false,"start_time":"2023-06-09T03:40:42.985165","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-06-28T22:09:26.545129Z","iopub.execute_input":"2023-06-28T22:09:26.546059Z","iopub.status.idle":"2023-06-28T22:09:26.802922Z","shell.execute_reply.started":"2023-06-28T22:09:26.546028Z","shell.execute_reply":"2023-06-28T22:09:26.801870Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"models = {}\nbest_threshold = 0.63","metadata":{"papermill":{"duration":0.019119,"end_time":"2023-06-09T03:40:43.037441","exception":false,"start_time":"2023-06-09T03:40:43.018322","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-06-28T22:09:26.804463Z","iopub.execute_input":"2023-06-28T22:09:26.804877Z","iopub.status.idle":"2023-06-28T22:09:26.812855Z","shell.execute_reply.started":"2023-06-28T22:09:26.804844Z","shell.execute_reply":"2023-06-28T22:09:26.811382Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"list_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":{"papermill":{"duration":0.019279,"end_time":"2023-06-09T03:40:43.066958","exception":false,"start_time":"2023-06-09T03:40:43.047679","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-06-28T22:09:26.814154Z","iopub.execute_input":"2023-06-28T22:09:26.814500Z","iopub.status.idle":"2023-06-28T22:09:26.822957Z","shell.execute_reply.started":"2023-06-28T22:09:26.814464Z","shell.execute_reply":"2023-06-28T22:09:26.821923Z"},"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 = create_model(df0_4, quests_0_4, models, list_kol_f)\ndel df0_4","metadata":{"papermill":{"duration":87.158188,"end_time":"2023-06-09T03:42:10.235162","exception":false,"start_time":"2023-06-09T03:40:43.076974","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-06-28T22:09:26.824183Z","iopub.execute_input":"2023-06-28T22:09:26.824482Z","iopub.status.idle":"2023-06-28T22:15:21.522172Z","shell.execute_reply.started":"2023-06-28T22:09:26.824458Z","shell.execute_reply":"2023-06-28T22:15:21.520997Z"},"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:140, 11:120}\n\nmodels = create_model(df5_12, quests_5_12, models, list_kol_f)\ndel df5_12","metadata":{"papermill":{"duration":448.186573,"end_time":"2023-06-09T03:49:38.432208","exception":false,"start_time":"2023-06-09T03:42:10.245635","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-06-28T22:15:21.523618Z","iopub.execute_input":"2023-06-28T22:15:21.524147Z","iopub.status.idle":"2023-06-28T22:44:47.930750Z","shell.execute_reply.started":"2023-06-28T22:15:21.524115Z","shell.execute_reply":"2023-06-28T22:44:47.929892Z"},"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: 160, 15:160, 16:105, 17:140}\n\nmodels = create_model(df13_22, quests_13_22, models, list_kol_f)\n","metadata":{"papermill":{"duration":313.467992,"end_time":"2023-06-09T03:54:51.912359","exception":false,"start_time":"2023-06-09T03:49:38.444367","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-06-28T22:44:47.932065Z","iopub.execute_input":"2023-06-28T22:44:47.932621Z","iopub.status.idle":"2023-06-28T23:01:33.383617Z","shell.execute_reply.started":"2023-06-28T22:44:47.932591Z","shell.execute_reply":"2023-06-28T23:01:33.381218Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Saving a Model\ndir = '/kaggle/working/'\n\nfor q in quests_0_4 + quests_5_12 + quests_13_22:\n    joblib.dump(models[str(q)+\"_gbr\"], dir+f'gbr_model_{q}.joblib')","metadata":{"papermill":{"duration":0.022067,"end_time":"2023-06-09T03:54:51.947378","exception":false,"start_time":"2023-06-09T03:54:51.925311","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-06-28T23:01:33.388718Z","iopub.execute_input":"2023-06-28T23:01:33.389165Z","iopub.status.idle":"2023-06-28T23:01:33.544932Z","shell.execute_reply.started":"2023-06-28T23:01:33.389128Z","shell.execute_reply":"2023-06-28T23:01:33.544025Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # Model Reading\ndir = '/kaggle/input/gbr_model/'\nfor q in quests_0_4 + quests_5_12 + quests_13_22:\n    models[str(q)+\"_gbr\"] = joblib.load(dir+f'/gbr_model_{q}.joblib')","metadata":{"papermill":{"duration":0.020395,"end_time":"2023-06-09T03:54:51.980853","exception":false,"start_time":"2023-06-09T03:54:51.960458","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-06-28T23:01:33.546265Z","iopub.execute_input":"2023-06-28T23:01:33.546750Z","iopub.status.idle":"2023-06-28T23:01:33.657570Z","shell.execute_reply.started":"2023-06-28T23:01:33.546721Z","shell.execute_reply":"2023-06-28T23:01:33.656021Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Infer Test Data**","metadata":{"papermill":{"duration":0.012106,"end_time":"2023-06-09T03:54:52.005241","exception":false,"start_time":"2023-06-09T03:54:51.993135","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":{"papermill":{"duration":0.055104,"end_time":"2023-06-09T03:54:52.072758","exception":false,"start_time":"2023-06-09T03:54:52.017654","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-06-28T23:01:33.658566Z","iopub.status.idle":"2023-06-28T23:01:33.658941Z","shell.execute_reply.started":"2023-06-28T23:01:33.658753Z","shell.execute_reply":"2023-06-28T23:01:33.658768Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import time","metadata":{"papermill":{"duration":0.020917,"end_time":"2023-06-09T03:54:52.106235","exception":false,"start_time":"2023-06-09T03:54:52.085318","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-06-28T23:01:33.659957Z","iopub.status.idle":"2023-06-28T23:01:33.660264Z","shell.execute_reply.started":"2023-06-28T23:01:33.660116Z","shell.execute_reply":"2023-06-28T23:01:33.660130Z"},"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 = new_train.fillna(-1)\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}_gbr']\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]>best_threshold)\n        sam_sub.loc[mask,'correct'] = x      \n        \n        \n    sam_sub = sam_sub[['session_id', 'correct']]      \n    env.predict(sam_sub)","metadata":{"papermill":{"duration":12.336681,"end_time":"2023-06-09T03:55:04.455695","exception":false,"start_time":"2023-06-09T03:54:52.119014","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-06-28T23:01:33.661265Z","iopub.status.idle":"2023-06-28T23:01:33.661551Z","shell.execute_reply.started":"2023-06-28T23:01:33.661408Z","shell.execute_reply":"2023-06-28T23:01:33.661421Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# EDA submission.csv","metadata":{"papermill":{"duration":0.012715,"end_time":"2023-06-09T03:55:04.481961","exception":false,"start_time":"2023-06-09T03:55:04.469246","status":"completed"},"tags":[]}},{"cell_type":"code","source":"df = pd.read_csv('submission.csv')\nprint( df.shape )\ndf.head(60)","metadata":{"papermill":{"duration":0.020568,"end_time":"2023-06-09T03:55:04.515293","exception":false,"start_time":"2023-06-09T03:55:04.494725","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-06-28T23:01:33.662544Z","iopub.status.idle":"2023-06-28T23:01:33.662858Z","shell.execute_reply.started":"2023-06-28T23:01:33.662693Z","shell.execute_reply":"2023-06-28T23:01:33.662707Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df['correct'].value_counts()","metadata":{"execution":{"iopub.status.busy":"2023-06-28T23:01:33.664185Z","iopub.status.idle":"2023-06-28T23:01:33.664477Z","shell.execute_reply.started":"2023-06-28T23:01:33.664331Z","shell.execute_reply":"2023-06-28T23:01:33.664344Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}