{"cells":[{"metadata":{"papermill":{"duration":0.059866,"end_time":"2020-12-18T00:10:25.254956","exception":false,"start_time":"2020-12-18T00:10:25.19509","status":"completed"},"tags":[]},"cell_type":"markdown","source":"## Combining of  SAKT with Riiid LGBM bagging2 then remove some features"},{"metadata":{},"cell_type":"markdown","source":"* SAKT vail_auc 0.775\n* LGBM vaid_auc 0.776"},{"metadata":{"trusted":true},"cell_type":"code","source":"!pip install ../input/python-datatable/datatable-0.11.0-cp37-cp37m-manylinux2010_x86_64.whl > /dev/null 2>&1","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","execution":{"iopub.execute_input":"2020-12-18T00:10:56.78768Z","iopub.status.busy":"2020-12-18T00:10:56.786905Z","iopub.status.idle":"2020-12-18T00:10:58.100983Z","shell.execute_reply":"2020-12-18T00:10:58.100219Z"},"papermill":{"duration":1.381109,"end_time":"2020-12-18T00:10:58.101139","exception":false,"start_time":"2020-12-18T00:10:56.72003","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport datatable as dt\n\n\nimport psutil\nimport joblib\n\nfrom collections import defaultdict\nimport lightgbm as lgb\nfrom matplotlib import pyplot as plt\nimport random\nfrom sklearn.metrics import roc_auc_score\nimport gc\n\n_ = np.seterr(divide='ignore', invalid='ignore')","execution_count":null,"outputs":[]},{"metadata":{"papermill":{"duration":0.058396,"end_time":"2020-12-18T00:10:58.220923","exception":false,"start_time":"2020-12-18T00:10:58.162527","status":"completed"},"tags":[]},"cell_type":"markdown","source":"# Preprocess"},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:10:58.345383Z","iopub.status.busy":"2020-12-18T00:10:58.344621Z","iopub.status.idle":"2020-12-18T00:10:58.348786Z","shell.execute_reply":"2020-12-18T00:10:58.348185Z"},"papermill":{"duration":0.069488,"end_time":"2020-12-18T00:10:58.348913","exception":false,"start_time":"2020-12-18T00:10:58.279425","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"data_types_dict = {\n    'timestamp': 'int64',\n    'user_id': 'int32', \n    'content_id': 'int16', \n    'content_type_id':'int8', \n    'task_container_id': 'int16',\n    'answered_correctly': 'int8', \n    'prior_question_elapsed_time': 'float32', \n    'prior_question_had_explanation': 'bool'\n}\ntarget = 'answered_correctly'","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:10:58.473682Z","iopub.status.busy":"2020-12-18T00:10:58.472555Z","iopub.status.idle":"2020-12-18T00:12:35.989899Z","shell.execute_reply":"2020-12-18T00:12:35.989015Z"},"papermill":{"duration":97.583534,"end_time":"2020-12-18T00:12:35.990075","exception":false,"start_time":"2020-12-18T00:10:58.406541","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"%%time\ntrain_df = dt.fread('../input/riiid-test-answer-prediction/train.csv', columns=set(data_types_dict.keys())).to_pandas()","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:12:36.116229Z","iopub.status.busy":"2020-12-18T00:12:36.114952Z","iopub.status.idle":"2020-12-18T00:12:36.121071Z","shell.execute_reply":"2020-12-18T00:12:36.120268Z"},"papermill":{"duration":0.070621,"end_time":"2020-12-18T00:12:36.121215","exception":false,"start_time":"2020-12-18T00:12:36.050594","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"print(psutil.virtual_memory().percent)","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:12:36.2498Z","iopub.status.busy":"2020-12-18T00:12:36.248914Z","iopub.status.idle":"2020-12-18T00:12:36.26156Z","shell.execute_reply":"2020-12-18T00:12:36.260779Z"},"papermill":{"duration":0.081617,"end_time":"2020-12-18T00:12:36.261688","exception":false,"start_time":"2020-12-18T00:12:36.180071","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"#reading in lecture df\nlectures_df = pd.read_csv('../input/riiid-test-answer-prediction/lectures.csv')","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:12:36.417298Z","iopub.status.busy":"2020-12-18T00:12:36.415691Z","iopub.status.idle":"2020-12-18T00:12:36.4217Z","shell.execute_reply":"2020-12-18T00:12:36.421091Z"},"papermill":{"duration":0.101736,"end_time":"2020-12-18T00:12:36.421841","exception":false,"start_time":"2020-12-18T00:12:36.320105","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"lectures_df['type_of'] = lectures_df['type_of'].replace('solving question', 'solving_question')\n\nlectures_df = pd.get_dummies(lectures_df, columns=['part', 'type_of'])\n\npart_lectures_columns = [column for column in lectures_df.columns if column.startswith('part')]\n\ntypes_of_lectures_columns = [column for column in lectures_df.columns if column.startswith('type_of_')]","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:12:36.547306Z","iopub.status.busy":"2020-12-18T00:12:36.546368Z","iopub.status.idle":"2020-12-18T00:12:37.863985Z","shell.execute_reply":"2020-12-18T00:12:37.863316Z"},"papermill":{"duration":1.382563,"end_time":"2020-12-18T00:12:37.864129","exception":false,"start_time":"2020-12-18T00:12:36.481566","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"train_lectures = train_df[train_df.content_type_id == True].merge(lectures_df, left_on='content_id', right_on='lecture_id', how='left')","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:12:37.994525Z","iopub.status.busy":"2020-12-18T00:12:37.992903Z","iopub.status.idle":"2020-12-18T00:12:38.569084Z","shell.execute_reply":"2020-12-18T00:12:38.568375Z"},"papermill":{"duration":0.644372,"end_time":"2020-12-18T00:12:38.569218","exception":false,"start_time":"2020-12-18T00:12:37.924846","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"user_lecture_stats_part = train_lectures.groupby('user_id',as_index = False)[part_lectures_columns + types_of_lectures_columns].sum()","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:12:38.698028Z","iopub.status.busy":"2020-12-18T00:12:38.696719Z","iopub.status.idle":"2020-12-18T00:12:38.710257Z","shell.execute_reply":"2020-12-18T00:12:38.708295Z"},"papermill":{"duration":0.0818,"end_time":"2020-12-18T00:12:38.710414","exception":false,"start_time":"2020-12-18T00:12:38.628614","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"lecturedata_types_dict = {   \n    'user_id': 'int32', \n    'part_1': 'int8',\n    'part_2': 'int8',\n    'part_3': 'int8',\n    'part_4': 'int8',\n    'part_5': 'int8',\n    'part_6': 'int8',\n    'part_7': 'int8',\n    'type_of_concept': 'int8',\n    'type_of_intention': 'int8',\n    'type_of_solving_question': 'int8',\n    'type_of_starter': 'int8'\n}\nuser_lecture_stats_part = user_lecture_stats_part.astype(lecturedata_types_dict)","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:12:38.838083Z","iopub.status.busy":"2020-12-18T00:12:38.835663Z","iopub.status.idle":"2020-12-18T00:12:38.846462Z","shell.execute_reply":"2020-12-18T00:12:38.84711Z"},"papermill":{"duration":0.077429,"end_time":"2020-12-18T00:12:38.847277","exception":false,"start_time":"2020-12-18T00:12:38.769848","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"for column in user_lecture_stats_part.columns:\n    #bool_column = column + '_boolean'\n    if(column !='user_id'):\n        user_lecture_stats_part[column] = (user_lecture_stats_part[column] > 0).astype('int8')","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:12:38.972701Z","iopub.status.busy":"2020-12-18T00:12:38.9718Z","iopub.status.idle":"2020-12-18T00:12:39.014202Z","shell.execute_reply":"2020-12-18T00:12:39.013058Z"},"papermill":{"duration":0.104994,"end_time":"2020-12-18T00:12:39.014353","exception":false,"start_time":"2020-12-18T00:12:38.909359","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"train_lectures[train_lectures.user_id==5382]","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:12:39.140751Z","iopub.status.busy":"2020-12-18T00:12:39.139986Z","iopub.status.idle":"2020-12-18T00:12:39.151863Z","shell.execute_reply":"2020-12-18T00:12:39.152381Z"},"papermill":{"duration":0.077954,"end_time":"2020-12-18T00:12:39.152591","exception":false,"start_time":"2020-12-18T00:12:39.074637","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"user_lecture_stats_part[user_lecture_stats_part.user_id==5382]","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:12:39.27563Z","iopub.status.busy":"2020-12-18T00:12:39.274668Z","iopub.status.idle":"2020-12-18T00:12:39.290678Z","shell.execute_reply":"2020-12-18T00:12:39.290108Z"},"papermill":{"duration":0.078761,"end_time":"2020-12-18T00:12:39.29081","exception":false,"start_time":"2020-12-18T00:12:39.212049","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"user_lecture_stats_part.tail()","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:12:39.419984Z","iopub.status.busy":"2020-12-18T00:12:39.41921Z","iopub.status.idle":"2020-12-18T00:12:39.424733Z","shell.execute_reply":"2020-12-18T00:12:39.42416Z"},"papermill":{"duration":0.073947,"end_time":"2020-12-18T00:12:39.424868","exception":false,"start_time":"2020-12-18T00:12:39.350921","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"user_lecture_stats_part.dtypes","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:12:39.560865Z","iopub.status.busy":"2020-12-18T00:12:39.559982Z","iopub.status.idle":"2020-12-18T00:12:39.562597Z","shell.execute_reply":"2020-12-18T00:12:39.563187Z"},"papermill":{"duration":0.076699,"end_time":"2020-12-18T00:12:39.563357","exception":false,"start_time":"2020-12-18T00:12:39.486658","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"#clearing memory\ndel(train_lectures)","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:12:39.692592Z","iopub.status.busy":"2020-12-18T00:12:39.691743Z","iopub.status.idle":"2020-12-18T00:12:39.699078Z","shell.execute_reply":"2020-12-18T00:12:39.699849Z"},"papermill":{"duration":0.074811,"end_time":"2020-12-18T00:12:39.700107","exception":false,"start_time":"2020-12-18T00:12:39.625296","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"print(psutil.virtual_memory().percent)","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:12:39.838696Z","iopub.status.busy":"2020-12-18T00:12:39.837943Z","iopub.status.idle":"2020-12-18T00:12:58.362019Z","shell.execute_reply":"2020-12-18T00:12:58.362582Z"},"papermill":{"duration":18.589004,"end_time":"2020-12-18T00:12:58.362781","exception":false,"start_time":"2020-12-18T00:12:39.773777","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"cum = train_df.groupby('user_id')['content_type_id'].agg(['cumsum', 'cumcount'])\ntrain_df['user_lecture_cumsum'] = cum['cumsum'] \ntrain_df['user_lecture_lv'] = cum['cumsum'] / cum['cumcount']\n\n\ntrain_df.user_lecture_lv=train_df.user_lecture_lv.astype('float16')\ntrain_df.user_lecture_cumsum=train_df.user_lecture_cumsum.astype('int8')\nuser_lecture_agg = train_df.groupby('user_id')['content_type_id'].agg(['sum', 'count'])","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:12:58.489793Z","iopub.status.busy":"2020-12-18T00:12:58.4887Z","iopub.status.idle":"2020-12-18T00:13:28.565739Z","shell.execute_reply":"2020-12-18T00:13:28.564874Z"},"papermill":{"duration":30.142144,"end_time":"2020-12-18T00:13:28.565899","exception":false,"start_time":"2020-12-18T00:12:58.423755","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"train_df['prior_question_had_explanation'].fillna(False, inplace=True)\ntrain_df = train_df.astype(data_types_dict)\ntrain_df = train_df[train_df[target] != -1].reset_index(drop=True)\nprior_question_elapsed_time_mean=train_df['prior_question_elapsed_time'].mean()\ntrain_df['prior_question_elapsed_time'].fillna(prior_question_elapsed_time_mean, inplace=True)","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:13:30.106024Z","iopub.status.busy":"2020-12-18T00:13:29.108728Z","iopub.status.idle":"2020-12-18T00:13:32.599366Z","shell.execute_reply":"2020-12-18T00:13:32.598778Z"},"papermill":{"duration":3.972804,"end_time":"2020-12-18T00:13:32.599517","exception":false,"start_time":"2020-12-18T00:13:28.626713","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"max_timestamp_u = train_df[['user_id','timestamp']].groupby(['user_id']).agg(['max']).reset_index()\n#max_timestamp_u = train_df[['user_id','timestamp']].groupby(['user_id']).agg(['max'])\nmax_timestamp_u.columns = ['user_id', 'max_time_stamp']","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:13:32.79107Z","iopub.status.busy":"2020-12-18T00:13:32.78994Z","iopub.status.idle":"2020-12-18T00:13:39.200946Z","shell.execute_reply":"2020-12-18T00:13:39.201511Z"},"papermill":{"duration":6.53518,"end_time":"2020-12-18T00:13:39.201702","exception":false,"start_time":"2020-12-18T00:13:32.666522","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"\ntrain_df['lagtime'] = train_df.groupby('user_id')['timestamp'].shift()\ntrain_df['lagtime']=train_df['timestamp']-train_df['lagtime']\ntrain_df['lagtime'].fillna(0, inplace=True)\ntrain_df.lagtime=train_df.lagtime.astype('int32')\n#train_df.drop(columns=['timestamp'], inplace=True)","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:13:39.33308Z","iopub.status.busy":"2020-12-18T00:13:39.332293Z","iopub.status.idle":"2020-12-18T00:13:45.02463Z","shell.execute_reply":"2020-12-18T00:13:45.023868Z"},"papermill":{"duration":5.761101,"end_time":"2020-12-18T00:13:45.024753","exception":false,"start_time":"2020-12-18T00:13:39.263652","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"lagtime_agg = train_df.groupby('user_id')['lagtime'].agg(['mean'])\ntrain_df['lagtime_mean'] = train_df['user_id'].map(lagtime_agg['mean'])\ntrain_df.lagtime_mean=train_df.lagtime_mean.astype('int32')","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:13:45.155268Z","iopub.status.busy":"2020-12-18T00:13:45.154462Z","iopub.status.idle":"2020-12-18T00:13:54.313988Z","shell.execute_reply":"2020-12-18T00:13:54.313152Z"},"papermill":{"duration":9.228597,"end_time":"2020-12-18T00:13:54.314117","exception":false,"start_time":"2020-12-18T00:13:45.08552","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"user_prior_question_elapsed_time = train_df[['user_id','prior_question_elapsed_time']].groupby(['user_id']).tail(1)\n#max_timestamp_u = train_df[['user_id','timestamp']].groupby(['user_id']).agg(['max'])\nuser_prior_question_elapsed_time.columns = ['user_id', 'prior_question_elapsed_time']","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:13:54.444411Z","iopub.status.busy":"2020-12-18T00:13:54.443734Z","iopub.status.idle":"2020-12-18T00:13:59.055375Z","shell.execute_reply":"2020-12-18T00:13:59.056043Z"},"papermill":{"duration":4.681497,"end_time":"2020-12-18T00:13:59.056216","exception":false,"start_time":"2020-12-18T00:13:54.374719","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"\ntrain_df['delta_prior_question_elapsed_time'] = train_df.groupby('user_id')['prior_question_elapsed_time'].shift()\ntrain_df['delta_prior_question_elapsed_time']=train_df['prior_question_elapsed_time']-train_df['delta_prior_question_elapsed_time']\ntrain_df['delta_prior_question_elapsed_time'].fillna(0, inplace=True)\n","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:13:59.184391Z","iopub.status.busy":"2020-12-18T00:13:59.182623Z","iopub.status.idle":"2020-12-18T00:13:59.645831Z","shell.execute_reply":"2020-12-18T00:13:59.645226Z"},"papermill":{"duration":0.529679,"end_time":"2020-12-18T00:13:59.646003","exception":false,"start_time":"2020-12-18T00:13:59.116324","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"train_df.delta_prior_question_elapsed_time=train_df.delta_prior_question_elapsed_time.astype('int32')","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:13:59.785488Z","iopub.status.busy":"2020-12-18T00:13:59.784209Z","iopub.status.idle":"2020-12-18T00:14:00.848853Z","shell.execute_reply":"2020-12-18T00:14:00.84954Z"},"papermill":{"duration":1.142941,"end_time":"2020-12-18T00:14:00.849724","exception":false,"start_time":"2020-12-18T00:13:59.706783","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"train_df['timestamp']=train_df['timestamp']/(1000*3600)\ntrain_df.timestamp=train_df.timestamp.astype('int16')\n#","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:14:00.975597Z","iopub.status.busy":"2020-12-18T00:14:00.974918Z","iopub.status.idle":"2020-12-18T00:14:29.981207Z","shell.execute_reply":"2020-12-18T00:14:29.981923Z"},"papermill":{"duration":29.072237,"end_time":"2020-12-18T00:14:29.982111","exception":false,"start_time":"2020-12-18T00:14:00.909874","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"\ntrain_df['lag'] = train_df.groupby('user_id')[target].shift()\n\ncum = train_df.groupby('user_id')['lag'].agg(['cumsum', 'cumcount'])\ntrain_df['user_correctness'] = cum['cumsum'] / cum['cumcount']\ntrain_df['user_correct_cumsum'] = cum['cumsum']\ntrain_df['user_correct_cumcount'] = cum['cumcount']\ntrain_df.drop(columns=['lag'], inplace=True)\n\n# train_df['user_correctness'].fillna(1, inplace=True)\ntrain_df['user_correct_cumsum'].fillna(0, inplace=True)\n#train_df['user_correct_cumcount'].fillna(0, inplace=True)\ntrain_df.user_correctness=train_df.user_correctness.astype('float16')\ntrain_df.user_correct_cumcount=train_df.user_correct_cumcount.astype('int16')\ntrain_df.user_correct_cumsum=train_df.user_correct_cumsum.astype('int16')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"content_explation_agg=train_df[[\"content_id\",\"prior_question_had_explanation\",target]].groupby([\"content_id\",\"prior_question_had_explanation\"])[target].agg(['mean'])\ncontent_explation_agg=content_explation_agg.unstack()\ncontent_explation_agg=content_explation_agg.reset_index()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(content_explation_agg)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"content_explation_agg.columns = ['content_id', 'content_explation_false_mean','content_explation_true_mean']\ncontent_explation_agg.content_id=content_explation_agg.content_id.astype('int16')\ncontent_explation_agg.content_explation_false_mean=content_explation_agg.content_explation_false_mean.astype('float16')\ncontent_explation_agg.content_explation_true_mean=content_explation_agg.content_explation_true_mean.astype('float16')","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:14:30.110647Z","iopub.status.busy":"2020-12-18T00:14:30.109907Z","iopub.status.idle":"2020-12-18T00:14:34.743814Z","shell.execute_reply":"2020-12-18T00:14:34.743179Z"},"papermill":{"duration":4.701375,"end_time":"2020-12-18T00:14:34.743969","exception":false,"start_time":"2020-12-18T00:14:30.042594","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"train_df.prior_question_had_explanation=train_df.prior_question_had_explanation.astype('int8')\n\ntrain_df['lag'] = train_df.groupby('user_id')['prior_question_had_explanation'].shift()","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:14:34.878679Z","iopub.status.busy":"2020-12-18T00:14:34.877071Z","iopub.status.idle":"2020-12-18T00:14:55.070674Z","shell.execute_reply":"2020-12-18T00:14:55.069414Z"},"papermill":{"duration":20.265911,"end_time":"2020-12-18T00:14:55.070823","exception":false,"start_time":"2020-12-18T00:14:34.804912","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"\ncum = train_df.groupby('user_id')['lag'].agg(['cumsum', 'cumcount'])\ntrain_df['explanation_mean'] = cum['cumsum'] / cum['cumcount']\ntrain_df['explanation_cumsum'] = cum['cumsum'] \ntrain_df.drop(columns=['lag'], inplace=True)\n\ntrain_df['explanation_mean'].fillna(0, inplace=True)\ntrain_df['explanation_cumsum'].fillna(0, inplace=True)\ntrain_df.explanation_mean=train_df.explanation_mean.astype('float16')\ntrain_df.explanation_cumsum=train_df.explanation_cumsum.astype('int16')","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:14:55.302919Z","iopub.status.busy":"2020-12-18T00:14:55.301357Z","iopub.status.idle":"2020-12-18T00:14:55.30599Z","shell.execute_reply":"2020-12-18T00:14:55.306531Z"},"papermill":{"duration":0.174146,"end_time":"2020-12-18T00:14:55.306701","exception":false,"start_time":"2020-12-18T00:14:55.132555","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"del cum\ngc.collect()","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:14:55.508592Z","iopub.status.busy":"2020-12-18T00:14:55.507615Z","iopub.status.idle":"2020-12-18T00:15:57.54162Z","shell.execute_reply":"2020-12-18T00:15:57.540528Z"},"papermill":{"duration":62.103383,"end_time":"2020-12-18T00:15:57.541768","exception":false,"start_time":"2020-12-18T00:14:55.438385","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"\ntrain_df[\"attempt_no\"] = 1\ntrain_df.attempt_no=train_df.attempt_no.astype('int8')\ntrain_df[\"attempt_no\"] = train_df[[\"user_id\",\"content_id\",'attempt_no']].groupby([\"user_id\",\"content_id\"])[\"attempt_no\"].cumsum()","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:15:57.667244Z","iopub.status.busy":"2020-12-18T00:15:57.666455Z","iopub.status.idle":"2020-12-18T00:15:57.690546Z","shell.execute_reply":"2020-12-18T00:15:57.689935Z"},"papermill":{"duration":0.087858,"end_time":"2020-12-18T00:15:57.690717","exception":false,"start_time":"2020-12-18T00:15:57.602859","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"train_df.head()","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:15:57.821641Z","iopub.status.busy":"2020-12-18T00:15:57.820458Z","iopub.status.idle":"2020-12-18T00:15:57.824122Z","shell.execute_reply":"2020-12-18T00:15:57.824697Z"},"papermill":{"duration":0.07281,"end_time":"2020-12-18T00:15:57.824861","exception":false,"start_time":"2020-12-18T00:15:57.752051","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"train_df.dtypes","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:15:57.958387Z","iopub.status.busy":"2020-12-18T00:15:57.957671Z","iopub.status.idle":"2020-12-18T00:16:01.822976Z","shell.execute_reply":"2020-12-18T00:16:01.822294Z"},"papermill":{"duration":3.934155,"end_time":"2020-12-18T00:16:01.823102","exception":false,"start_time":"2020-12-18T00:15:57.888947","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"explanation_agg = train_df.groupby('user_id')['prior_question_had_explanation'].agg(['sum', 'count'])\nexplanation_agg=explanation_agg.astype('int16')\n#train_df.drop(columns=['prior_question_had_explanation'], inplace=True)","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:16:01.989134Z","iopub.status.busy":"2020-12-18T00:16:01.988035Z","iopub.status.idle":"2020-12-18T00:16:17.503988Z","shell.execute_reply":"2020-12-18T00:16:17.503201Z"},"papermill":{"duration":15.595704,"end_time":"2020-12-18T00:16:17.504115","exception":false,"start_time":"2020-12-18T00:16:01.908411","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"user_agg = train_df.groupby('user_id')[target].agg(['sum', 'count'])\ncontent_agg = train_df.groupby('content_id')[target].agg(['sum', 'count','var'])\ntask_container_agg = train_df.groupby('task_container_id')[target].agg(['sum', 'count','var'])\n\n#prior_question_elapsed_time_agg = train_df.groupby('user_id')['prior_question_elapsed_time'].agg(['sum', 'count'])","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:16:17.635375Z","iopub.status.busy":"2020-12-18T00:16:17.634308Z","iopub.status.idle":"2020-12-18T00:16:17.640428Z","shell.execute_reply":"2020-12-18T00:16:17.63988Z"},"papermill":{"duration":0.073648,"end_time":"2020-12-18T00:16:17.640572","exception":false,"start_time":"2020-12-18T00:16:17.566924","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"user_agg=user_agg.astype('int16')\ncontent_agg=content_agg.astype('float32')\ntask_container_agg=task_container_agg.astype('float32')","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:16:17.773008Z","iopub.status.busy":"2020-12-18T00:16:17.77184Z","iopub.status.idle":"2020-12-18T00:17:34.541579Z","shell.execute_reply":"2020-12-18T00:17:34.540393Z"},"papermill":{"duration":76.839383,"end_time":"2020-12-18T00:17:34.541738","exception":false,"start_time":"2020-12-18T00:16:17.702355","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"attempt_no_agg=train_df.groupby([\"user_id\",\"content_id\"])[\"attempt_no\"].agg(['sum'])\nattempt_no_agg=attempt_no_agg.astype('int8')\n#attempt_series = train_df[['user_id', 'content_id','attempt_no']].groupby(['user_id','content_id'])['attempt_no'].max()","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:17:34.676066Z","iopub.status.busy":"2020-12-18T00:17:34.675039Z","iopub.status.idle":"2020-12-18T00:17:45.594088Z","shell.execute_reply":"2020-12-18T00:17:45.594717Z"},"papermill":{"duration":10.99125,"end_time":"2020-12-18T00:17:45.594886","exception":false,"start_time":"2020-12-18T00:17:34.603636","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"train_df['content_count'] = train_df['content_id'].map(content_agg['count']).astype('int32')\ntrain_df['content_sum'] = train_df['content_id'].map(content_agg['sum']).astype('int32')\ntrain_df['content_correctness'] = train_df['content_id'].map(content_agg['sum'] / content_agg['count'])\ntrain_df.content_correctness=train_df.content_correctness.astype('float16')\ntrain_df['task_container_sum'] = train_df['task_container_id'].map(task_container_agg['sum']).astype('int32')\ntrain_df['task_container_std'] = train_df['task_container_id'].map(task_container_agg['var']).astype('float16')\ntrain_df['task_container_correctness'] = train_df['task_container_id'].map(task_container_agg['sum'] / task_container_agg['count'])\ntrain_df.task_container_correctness=train_df.task_container_correctness.astype('float16')","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:17:45.723716Z","iopub.status.busy":"2020-12-18T00:17:45.722579Z","iopub.status.idle":"2020-12-18T00:17:45.824775Z","shell.execute_reply":"2020-12-18T00:17:45.824154Z"},"papermill":{"duration":0.167888,"end_time":"2020-12-18T00:17:45.824925","exception":false,"start_time":"2020-12-18T00:17:45.657037","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"questions_df = pd.read_csv(\n    '../input/riiid-test-answer-prediction/questions.csv', \n    usecols=[0, 1,3,4],\n    dtype={'question_id': 'int16','bundle_id': 'int16', 'part': 'int8','tags': 'str'}\n)\nquestions_df['part_bundle_id']=questions_df['part']*100000+questions_df['bundle_id']\nquestions_df.part_bundle_id=questions_df.part_bundle_id.astype('int32')\ntag = questions_df[\"tags\"].str.split(\" \", n = 10, expand = True)\ntag.columns = ['tags1','tags2','tags3','tags4','tags5','tags6']\n#\n\ntag.fillna(0, inplace=True)\ntag = tag.astype('int16')\nquestions_df =  pd.concat([questions_df,tag],axis=1).drop(['tags'],axis=1)","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:17:45.957257Z","iopub.status.busy":"2020-12-18T00:17:45.956427Z","iopub.status.idle":"2020-12-18T00:17:45.960041Z","shell.execute_reply":"2020-12-18T00:17:45.959329Z"},"papermill":{"duration":0.072191,"end_time":"2020-12-18T00:17:45.960174","exception":false,"start_time":"2020-12-18T00:17:45.887983","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"questions_df.rename(columns={'question_id':'content_id'}, inplace=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"questions_df = pd.merge(questions_df, content_explation_agg, on='content_id', how='left',right_index=True)\ndel content_explation_agg","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:17:46.096286Z","iopub.status.busy":"2020-12-18T00:17:46.095097Z","iopub.status.idle":"2020-12-18T00:17:46.104827Z","shell.execute_reply":"2020-12-18T00:17:46.104031Z"},"papermill":{"duration":0.081722,"end_time":"2020-12-18T00:17:46.104967","exception":false,"start_time":"2020-12-18T00:17:46.023245","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"questions_df['content_correctness'] = questions_df['content_id'].map(content_agg['sum'] / content_agg['count'])\nquestions_df.content_correctness=questions_df.content_correctness.astype('float16')\nquestions_df['content_correctness_std'] = questions_df['content_id'].map(content_agg['var'])\nquestions_df.content_correctness_std=questions_df.content_correctness_std.astype('float16')","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:17:46.238199Z","iopub.status.busy":"2020-12-18T00:17:46.237206Z","iopub.status.idle":"2020-12-18T00:17:46.247804Z","shell.execute_reply":"2020-12-18T00:17:46.246877Z"},"papermill":{"duration":0.080398,"end_time":"2020-12-18T00:17:46.247948","exception":false,"start_time":"2020-12-18T00:17:46.16755","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"part_agg = questions_df.groupby('part')['content_correctness'].agg(['mean', 'var'])\nquestions_df['part_correctness_mean'] = questions_df['part'].map(part_agg['mean'])\nquestions_df['part_correctness_std'] = questions_df['part'].map(part_agg['var'])\nquestions_df.part_correctness_mean=questions_df.part_correctness_mean.astype('float16')\nquestions_df.part_correctness_std=questions_df.part_correctness_std.astype('float16')","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:17:46.381022Z","iopub.status.busy":"2020-12-18T00:17:46.379953Z","iopub.status.idle":"2020-12-18T00:17:46.391929Z","shell.execute_reply":"2020-12-18T00:17:46.391335Z"},"papermill":{"duration":0.080872,"end_time":"2020-12-18T00:17:46.392064","exception":false,"start_time":"2020-12-18T00:17:46.311192","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"bundle_agg = questions_df.groupby('bundle_id')['content_correctness'].agg(['mean'])\nquestions_df['bundle_correctness'] = questions_df['bundle_id'].map(bundle_agg['mean'])\nquestions_df.bundle_correctness=questions_df.bundle_correctness.astype('float16')","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:17:46.526149Z","iopub.status.busy":"2020-12-18T00:17:46.525396Z","iopub.status.idle":"2020-12-18T00:17:46.535341Z","shell.execute_reply":"2020-12-18T00:17:46.534784Z"},"papermill":{"duration":0.079571,"end_time":"2020-12-18T00:17:46.535503","exception":false,"start_time":"2020-12-18T00:17:46.455932","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"tags1_agg = questions_df.groupby('tags1')['content_correctness'].agg(['mean', 'var'])\nquestions_df['tags1_correctness_mean'] = questions_df['tags1'].map(tags1_agg['mean'])\nquestions_df['tags1_correctness_std'] = questions_df['tags1'].map(tags1_agg['var'])\nquestions_df.tags1_correctness_mean=questions_df.tags1_correctness_mean.astype('float16')\nquestions_df.tags1_correctness_std=questions_df.tags1_correctness_std.astype('float16')","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:17:46.666796Z","iopub.status.busy":"2020-12-18T00:17:46.665812Z","iopub.status.idle":"2020-12-18T00:17:46.670872Z","shell.execute_reply":"2020-12-18T00:17:46.671388Z"},"papermill":{"duration":0.073749,"end_time":"2020-12-18T00:17:46.671619","exception":false,"start_time":"2020-12-18T00:17:46.59787","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"questions_df.drop(columns=['content_correctness'], inplace=True)","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:17:46.80391Z","iopub.status.busy":"2020-12-18T00:17:46.802916Z","iopub.status.idle":"2020-12-18T00:17:46.808566Z","shell.execute_reply":"2020-12-18T00:17:46.807874Z"},"papermill":{"duration":0.075188,"end_time":"2020-12-18T00:17:46.808696","exception":false,"start_time":"2020-12-18T00:17:46.733508","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"questions_df.dtypes","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:17:47.026696Z","iopub.status.busy":"2020-12-18T00:17:47.025806Z","iopub.status.idle":"2020-12-18T00:17:47.029965Z","shell.execute_reply":"2020-12-18T00:17:47.03073Z"},"papermill":{"duration":0.159066,"end_time":"2020-12-18T00:17:47.030911","exception":false,"start_time":"2020-12-18T00:17:46.871845","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"del bundle_agg\ndel part_agg\ndel tags1_agg\ngc.collect()","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:17:47.168255Z","iopub.status.busy":"2020-12-18T00:17:47.167411Z","iopub.status.idle":"2020-12-18T00:17:47.170435Z","shell.execute_reply":"2020-12-18T00:17:47.169744Z"},"papermill":{"duration":0.073126,"end_time":"2020-12-18T00:17:47.170692","exception":false,"start_time":"2020-12-18T00:17:47.097566","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"#pd.set_option(\"display.max_columns\",500)","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:17:47.301384Z","iopub.status.busy":"2020-12-18T00:17:47.300516Z","iopub.status.idle":"2020-12-18T00:17:47.304152Z","shell.execute_reply":"2020-12-18T00:17:47.303619Z"},"papermill":{"duration":0.070407,"end_time":"2020-12-18T00:17:47.304276","exception":false,"start_time":"2020-12-18T00:17:47.233869","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"#questions_df.drop(columns=['tags4','tags5','tags6'], inplace=True)","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:17:47.436123Z","iopub.status.busy":"2020-12-18T00:17:47.435279Z","iopub.status.idle":"2020-12-18T00:17:47.438886Z","shell.execute_reply":"2020-12-18T00:17:47.439437Z"},"papermill":{"duration":0.071768,"end_time":"2020-12-18T00:17:47.439628","exception":false,"start_time":"2020-12-18T00:17:47.36786","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"len(train_df)","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:17:47.571654Z","iopub.status.busy":"2020-12-18T00:17:47.570918Z","iopub.status.idle":"2020-12-18T00:17:50.557852Z","shell.execute_reply":"2020-12-18T00:17:50.558416Z"},"papermill":{"duration":3.054661,"end_time":"2020-12-18T00:17:50.558633","exception":false,"start_time":"2020-12-18T00:17:47.503972","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"train_df['user_correctness'].fillna( 1, inplace=True)\ntrain_df['attempt_no'].fillna(1, inplace=True)\n#\ntrain_df.fillna(0, inplace=True)","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:17:50.688233Z","iopub.status.busy":"2020-12-18T00:17:50.68749Z","iopub.status.idle":"2020-12-18T00:17:50.717783Z","shell.execute_reply":"2020-12-18T00:17:50.718266Z"},"papermill":{"duration":0.097099,"end_time":"2020-12-18T00:17:50.718437","exception":false,"start_time":"2020-12-18T00:17:50.621338","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"train_df.head()","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:17:50.849981Z","iopub.status.busy":"2020-12-18T00:17:50.849248Z","iopub.status.idle":"2020-12-18T00:17:50.854412Z","shell.execute_reply":"2020-12-18T00:17:50.853819Z"},"papermill":{"duration":0.072601,"end_time":"2020-12-18T00:17:50.854564","exception":false,"start_time":"2020-12-18T00:17:50.781963","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"#train_df.drop(columns=['content_type_id'], inplace=True)","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:17:50.992707Z","iopub.status.busy":"2020-12-18T00:17:50.991886Z","iopub.status.idle":"2020-12-18T00:17:50.996048Z","shell.execute_reply":"2020-12-18T00:17:50.995342Z"},"papermill":{"duration":0.077782,"end_time":"2020-12-18T00:17:50.996171","exception":false,"start_time":"2020-12-18T00:17:50.918389","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"train_df.dtypes","execution_count":null,"outputs":[]},{"metadata":{"papermill":{"duration":0.064006,"end_time":"2020-12-18T00:18:41.903267","exception":false,"start_time":"2020-12-18T00:18:41.839261","status":"completed"},"tags":[]},"cell_type":"markdown","source":"# Train"},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:18:42.045348Z","iopub.status.busy":"2020-12-18T00:18:42.044243Z","iopub.status.idle":"2020-12-18T00:18:42.048285Z","shell.execute_reply":"2020-12-18T00:18:42.047688Z"},"papermill":{"duration":0.079178,"end_time":"2020-12-18T00:18:42.048418","exception":false,"start_time":"2020-12-18T00:18:41.96924","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"features = [\n#   'user_id',\n#HDKIM    \n    'timestamp',\n    'lagtime',\n    'lagtime_mean',\n    'content_id',\n   # 'task_container_id',\n    'user_lecture_cumsum', # X\n    'user_lecture_lv',\n    'prior_question_elapsed_time',\n    'delta_prior_question_elapsed_time',\n    'user_correctness',\n    'user_correct_cumcount', #X\n    'user_correct_cumsum', #X\n    'content_correctness',\n   # 'content_correctness_std',\n    'content_count',\n    'content_sum', #X\n    'task_container_correctness',\n   # 'task_container_std',\n   # 'task_container_sum',\n    'bundle_correctness',\n    'attempt_no',\n    'part',\n    'part_correctness_mean',\n   # 'part_correctness_std',\n    'tags1',\n    'tags1_correctness_mean',\n  #  'tags1_correctness_std',\n#HDKIM    \n    'tags2',\n#HDKIM    \n    'tags3',\n#HDKIM    \n    'tags4',\n#HDKIM    \n    'tags5',\n#HDKIM    \n    'tags6',\n    'bundle_id',\n  #  'part_bundle_id',\n    'explanation_mean', \n    'explanation_cumsum',\n    'prior_question_had_explanation',\n    'content_explation_false_mean',\n    'content_explation_true_mean',\n#     'part_1',\n#     'part_2',\n#     'part_3',\n#     'part_4',\n#     'part_5',\n#     'part_6',\n#     'part_7',\n#     'type_of_concept',\n#     'type_of_intention',\n#     'type_of_solving_question',\n#     'type_of_starter'\n]\ncategorical_columns= [\n#   'user_id',\n  #  'content_id',\n  # 'task_container_id',\n    'part',        \n    'tags1',\n#HDKIM    \n    'tags2',\n#HDKIM    \n    'tags3',\n#HDKIM    \n    'tags4',\n#HDKIM    \n    'tags5',\n#HDKIM    \n    'tags6',\n    'bundle_id',\n   # 'part_bundle_id',\n    'prior_question_had_explanation',\n#     'part_1',\n#     'part_2',\n#     'part_3',\n#     'part_4',\n#     'part_5',\n#     'part_6',\n#     'part_7',\n#     'type_of_concept',\n#     'type_of_intention',\n#     'type_of_solving_question',\n#     'type_of_starter'\n    \n]\n\n\n","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T00:18:42.212017Z","iopub.status.busy":"2020-12-18T00:18:42.211135Z","iopub.status.idle":"2020-12-18T00:19:33.534541Z","shell.execute_reply":"2020-12-18T00:19:33.535381Z"},"papermill":{"duration":51.416351,"end_time":"2020-12-18T00:19:33.535665","exception":false,"start_time":"2020-12-18T00:18:42.119314","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"flag_lgbm=True\nclfs = list()\nparams = {\n'num_leaves': 350,\n'max_bin':800,\n# 'min_child_weight': 0.03454472573214212,\n'feature_fraction': 0.52,\n'bagging_fraction': 0.52,\n#'min_data_in_leaf': 106,\n# 'max_depth': -1,\n'objective': 'binary',\n'learning_rate': 0.05,\n\"boosting_type\": \"gbdt\",\n\"metric\": 'auc',\n# \"bagging_seed\": 11,\n# \"verbosity\": -1,\n# 'reg_alpha': 0.3899927210061127,\n# 'reg_lambda': 0.6485237330340494,\n# 'random_state': 47\n}\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"lgbm_model = lgb.Booster(model_file=\"../input/ask180/model.txt\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"clfs = list()\nclfs.append(lgbm_model)","execution_count":null,"outputs":[]},{"metadata":{"papermill":{"duration":0.147223,"end_time":"2020-12-18T01:37:38.882298","exception":false,"start_time":"2020-12-18T01:37:38.735075","status":"completed"},"tags":[]},"cell_type":"markdown","source":"# Inference"},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T01:37:39.035535Z","iopub.status.busy":"2020-12-18T01:37:39.034795Z","iopub.status.idle":"2020-12-18T01:37:40.227648Z","shell.execute_reply":"2020-12-18T01:37:40.228194Z"},"papermill":{"duration":1.271225,"end_time":"2020-12-18T01:37:40.22838","exception":false,"start_time":"2020-12-18T01:37:38.957155","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"user_sum_dict = user_agg['sum'].astype('int16').to_dict(defaultdict(int))\nuser_count_dict = user_agg['count'].astype('int16').to_dict(defaultdict(int))\ncontent_sum_dict = content_agg['sum'].astype('int32').to_dict(defaultdict(int))\ncontent_count_dict = content_agg['count'].astype('int32').to_dict(defaultdict(int))\n\ndel user_agg\ndel content_agg\ngc.collect()\n\ntask_container_sum_dict = task_container_agg['sum'].astype('int32').to_dict(defaultdict(int))\ntask_container_count_dict = task_container_agg['count'].astype('int32').to_dict(defaultdict(int))\ntask_container_std_dict = task_container_agg['var'].astype('float16').to_dict(defaultdict(int))\n\nexplanation_sum_dict = explanation_agg['sum'].astype('int16').to_dict(defaultdict(int))\nexplanation_count_dict = explanation_agg['count'].astype('int16').to_dict(defaultdict(int))\ndel task_container_agg\ndel explanation_agg\ngc.collect()","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T01:37:40.384266Z","iopub.status.busy":"2020-12-18T01:37:40.383162Z","iopub.status.idle":"2020-12-18T01:37:41.246201Z","shell.execute_reply":"2020-12-18T01:37:41.245518Z"},"papermill":{"duration":0.944036,"end_time":"2020-12-18T01:37:41.246329","exception":false,"start_time":"2020-12-18T01:37:40.302293","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"user_lecture_sum_dict = user_lecture_agg['sum'].astype('int16').to_dict(defaultdict(int))\nuser_lecture_count_dict = user_lecture_agg['count'].astype('int16').to_dict(defaultdict(int))\n\nlagtime_mean_dict = lagtime_agg['mean'].astype('int32').to_dict(defaultdict(int))\n#del prior_question_elapsed_time_agg\ndel user_lecture_agg\ndel lagtime_agg\ngc.collect()","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T01:37:41.400981Z","iopub.status.busy":"2020-12-18T01:37:41.400221Z","iopub.status.idle":"2020-12-18T01:37:58.542721Z","shell.execute_reply":"2020-12-18T01:37:58.542069Z"},"papermill":{"duration":17.222787,"end_time":"2020-12-18T01:37:58.542847","exception":false,"start_time":"2020-12-18T01:37:41.32006","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"attempt_no_agg=attempt_no_agg[attempt_no_agg['sum'] >1]\nattempt_no_sum_dict = attempt_no_agg['sum'].to_dict(defaultdict(int))\n\ndel attempt_no_agg\ngc.collect()","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T01:37:58.698991Z","iopub.status.busy":"2020-12-18T01:37:58.697683Z","iopub.status.idle":"2020-12-18T01:37:59.523976Z","shell.execute_reply":"2020-12-18T01:37:59.523346Z"},"papermill":{"duration":0.907286,"end_time":"2020-12-18T01:37:59.524094","exception":false,"start_time":"2020-12-18T01:37:58.616808","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"max_timestamp_u_dict=max_timestamp_u.set_index('user_id').to_dict()\nuser_prior_question_elapsed_time_dict=user_prior_question_elapsed_time.set_index('user_id').to_dict()\n#del question_elapsed_time_agg\ndel max_timestamp_u\ndel user_prior_question_elapsed_time\ngc.collect()","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T01:37:59.677648Z","iopub.status.busy":"2020-12-18T01:37:59.676726Z","iopub.status.idle":"2020-12-18T01:37:59.681708Z","shell.execute_reply":"2020-12-18T01:37:59.681135Z"},"papermill":{"duration":0.084091,"end_time":"2020-12-18T01:37:59.681828","exception":false,"start_time":"2020-12-18T01:37:59.597737","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"len(max_timestamp_u_dict['max_time_stamp'])","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T01:37:59.839889Z","iopub.status.busy":"2020-12-18T01:37:59.83884Z","iopub.status.idle":"2020-12-18T01:37:59.84244Z","shell.execute_reply":"2020-12-18T01:37:59.841782Z"},"papermill":{"duration":0.086175,"end_time":"2020-12-18T01:37:59.84258","exception":false,"start_time":"2020-12-18T01:37:59.756405","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"def get_max_attempt(user_id,content_id):\n    k = (user_id,content_id)\n\n    if k in attempt_no_sum_dict.keys():\n        attempt_no_sum_dict[k]+=1\n        return attempt_no_sum_dict[k]\n\n    attempt_no_sum_dict[k] = 1\n    return attempt_no_sum_dict[k]","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T01:37:59.998678Z","iopub.status.busy":"2020-12-18T01:37:59.997907Z","iopub.status.idle":"2020-12-18T01:38:00.004903Z","shell.execute_reply":"2020-12-18T01:38:00.003898Z"},"papermill":{"duration":0.08828,"end_time":"2020-12-18T01:38:00.005186","exception":false,"start_time":"2020-12-18T01:37:59.916906","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"print(psutil.virtual_memory().percent)","execution_count":null,"outputs":[]},{"metadata":{"papermill":{"duration":0.074554,"end_time":"2020-12-18T01:38:00.155519","exception":false,"start_time":"2020-12-18T01:38:00.080965","status":"completed"},"tags":[]},"cell_type":"markdown","source":"# SAKT Part"},{"metadata":{"trusted":true},"cell_type":"code","source":"#HDKIM SAKT\nimport torch\nimport torch.nn as nn\nfrom torch.utils.data import Dataset, DataLoader\n\nMAX_SEQ = 180","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T01:38:00.325596Z","iopub.status.busy":"2020-12-18T01:38:00.320302Z","iopub.status.idle":"2020-12-18T01:38:04.766628Z","shell.execute_reply":"2020-12-18T01:38:04.767679Z"},"papermill":{"duration":4.537628,"end_time":"2020-12-18T01:38:04.768069","exception":false,"start_time":"2020-12-18T01:38:00.230441","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"class FFN(nn.Module):\n    def __init__(self, state_size=200):\n        super(FFN, self).__init__()\n        self.state_size = state_size\n\n        self.lr1 = nn.Linear(state_size, state_size)\n        self.relu = nn.ReLU()\n        self.lr2 = nn.Linear(state_size, state_size)\n        self.dropout = nn.Dropout(0.2)\n    \n    def forward(self, x):\n        x = self.lr1(x)\n        x = self.relu(x)\n        x = self.lr2(x)\n        return self.dropout(x)\n\ndef future_mask(seq_length):\n    future_mask = np.triu(np.ones((seq_length, seq_length)), k=1).astype('bool')\n    return torch.from_numpy(future_mask)\n\n\nclass SAKTModel(nn.Module):\n    def __init__(self, n_skill, max_seq=MAX_SEQ, embed_dim=128):\n        super(SAKTModel, self).__init__()\n        self.n_skill = n_skill\n        self.embed_dim = embed_dim\n\n        self.embedding = nn.Embedding(2*n_skill+1, embed_dim)\n        self.pos_embedding = nn.Embedding(max_seq-1, embed_dim)\n        self.e_embedding = nn.Embedding(n_skill+1, embed_dim)\n\n        self.multi_att = nn.MultiheadAttention(embed_dim=embed_dim, num_heads=8, dropout=0.2)\n\n        self.dropout = nn.Dropout(0.2)\n        self.layer_normal = nn.LayerNorm(embed_dim) \n\n        self.ffn = FFN(embed_dim)\n        self.pred = nn.Linear(embed_dim, 1)\n    \n    def forward(self, x, question_ids):\n        device = x.device        \n        x = self.embedding(x)\n        pos_id = torch.arange(x.size(1)).unsqueeze(0).to(device)\n\n        pos_x = self.pos_embedding(pos_id)\n        x = x + pos_x\n\n        e = self.e_embedding(question_ids)\n\n        x = x.permute(1, 0, 2) # x: [bs, s_len, embed] => [s_len, bs, embed]\n        e = e.permute(1, 0, 2)\n        att_mask = future_mask(x.size(0)).to(device)\n        att_output, att_weight = self.multi_att(e, x, x, attn_mask=att_mask)\n        att_output = self.layer_normal(att_output + e)\n        att_output = att_output.permute(1, 0, 2) # att_output: [s_len, bs, embed] => [bs, s_len, embed]\n\n        x = self.ffn(att_output)\n        x = self.layer_normal(x + att_output)\n        x = self.pred(x)\n\n        return x.squeeze(-1), att_weight\n    ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class TestDataset(Dataset):\n    def __init__(self, samples, test_df, skills, max_seq=MAX_SEQ): \n        super(TestDataset, self).__init__()\n        self.samples = samples\n        self.user_ids = [x for x in test_df[\"user_id\"].unique()]\n        self.test_df = test_df\n        self.skills = skills\n        self.n_skill = len(skills)\n        self.max_seq = max_seq\n\n    def __len__(self):\n        return self.test_df.shape[0]\n\n    def __getitem__(self, index):\n        test_info = self.test_df.iloc[index]\n\n        user_id = test_info[\"user_id\"]\n        target_id = test_info[\"content_id\"]\n\n        q = np.zeros(self.max_seq, dtype=int)\n        qa = np.zeros(self.max_seq, dtype=int)\n\n        if user_id in self.samples.index:\n            q_, qa_ = self.samples[user_id]\n            \n            seq_len = len(q_)\n\n            if seq_len >= self.max_seq:\n                q = q_[-self.max_seq:]\n                qa = qa_[-self.max_seq:]\n            else:\n                q[-seq_len:] = q_\n                qa[-seq_len:] = qa_          \n        \n        x = np.zeros(self.max_seq-1, dtype=int)\n        x = q[1:].copy()\n        x += (qa[1:] == 1) * self.n_skill\n        \n        questions = np.append(q[2:], [target_id])\n        \n        return x, questions\n\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"skills = joblib.load(\"../input/ask180/skills.pkl.zip\")\nn_skill = len(skills)\ngroup = joblib.load(\"../input/ask180/group.pkl.zip\")\n\nprint(psutil.virtual_memory().percent)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\nsakt_model = SAKTModel(n_skill, embed_dim=128)\n\n\ntry:\n    sakt_model.load_state_dict(torch.load(\"../input/ask180/sakt_model.pt\"))\nexcept:\n    sakt_model.load_state_dict(torch.load(\"../input/ask180/sakt_model.pt\", map_location='cpu'))\n\nsakt_model.to(device)\nsakt_model.eval()","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T01:38:04.927176Z","iopub.status.busy":"2020-12-18T01:38:04.9263Z","iopub.status.idle":"2020-12-18T01:38:04.929943Z","shell.execute_reply":"2020-12-18T01:38:04.929177Z"},"papermill":{"duration":0.084715,"end_time":"2020-12-18T01:38:04.930079","exception":false,"start_time":"2020-12-18T01:38:04.845364","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"import riiideducation\nenv = riiideducation.make_env()","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T01:38:05.087664Z","iopub.status.busy":"2020-12-18T01:38:05.086827Z","iopub.status.idle":"2020-12-18T01:38:05.091346Z","shell.execute_reply":"2020-12-18T01:38:05.0907Z"},"papermill":{"duration":0.084747,"end_time":"2020-12-18T01:38:05.091487","exception":false,"start_time":"2020-12-18T01:38:05.00674","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"iter_test = env.iter_test()\nprior_test_df = None","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-18T01:38:05.263112Z","iopub.status.busy":"2020-12-18T01:38:05.257447Z","iopub.status.idle":"2020-12-18T01:38:06.506316Z","shell.execute_reply":"2020-12-18T01:38:06.507148Z"},"papermill":{"duration":1.338688,"end_time":"2020-12-18T01:38:06.50736","exception":false,"start_time":"2020-12-18T01:38:05.168672","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"%%time\n\nfor (test_df, sample_prediction_df) in iter_test:    \n    if (prior_test_df is not None) & (psutil.virtual_memory().percent<90):\n        print(psutil.virtual_memory().percent)\n        prior_test_df[target] = eval(test_df['prior_group_answers_correct'].iloc[0])\n        prior_test_df = prior_test_df[prior_test_df[target] != -1].reset_index(drop=True)       \n        prior_test_df['prior_question_had_explanation'].fillna(False, inplace=True)       \n        prior_test_df.prior_question_had_explanation=prior_test_df.prior_question_had_explanation.astype('int8')\n        \n        ##SAKT\n        prev_group = prior_test_df[['user_id', 'content_id', 'answered_correctly']].groupby('user_id').apply(lambda r: (\n            r['content_id'].values,\n            r['answered_correctly'].values))\n        for prev_user_id in prev_group.index:\n            if prev_user_id in group.index:\n                group[prev_user_id] = (\n                    np.append(group[prev_user_id][0], prev_group[prev_user_id][0])[-MAX_SEQ:], \n                    np.append(group[prev_user_id][1], prev_group[prev_user_id][1])[-MAX_SEQ:]\n                )\n \n            else:\n                group[prev_user_id] = (\n                    prev_group[prev_user_id][0], \n                    prev_group[prev_user_id][1]\n                )\n\n        #END SAKT\n    \n        user_ids = prior_test_df['user_id'].values\n        content_ids = prior_test_df['content_id'].values\n        task_container_ids = prior_test_df['task_container_id'].values\n        prior_question_had_explanations = prior_test_df['prior_question_had_explanation'].values\n        targets = prior_test_df[target].values\n       \n        for user_id, content_id,prior_question_had_explanation,task_container_id,answered_correctly in zip(user_ids, content_ids, prior_question_had_explanations,task_container_ids,targets):\n            user_sum_dict[user_id] += answered_correctly\n            user_count_dict[user_id] += 1         \n            explanation_sum_dict[user_id] += prior_question_had_explanation\n            explanation_count_dict[user_id] += 1\n            \n\n    prior_test_df = test_df.copy()\n    lecture_test_df = test_df[test_df['content_type_id'] == 1].reset_index(drop=True)\n    \n    for i, (user_id,content_type_id, content_id) in enumerate(zip(lecture_test_df['user_id'].values,lecture_test_df['content_type_id'].values,lecture_test_df['content_id'].values)):\n      \n        user_lecture_sum_dict[user_id] += content_type_id\n        user_lecture_count_dict[user_id] += 1\n        #\n        if(len(user_lecture_stats_part[user_lecture_stats_part.user_id==user_id])==0):\n            user_lecture_stats_part = user_lecture_stats_part.append([{'user_id':user_id}], ignore_index=True)\n            user_lecture_stats_part.fillna(0, inplace=True)\n            user_lecture_stats_part.loc[user_lecture_stats_part.user_id==user_id,part_lectures_columns + types_of_lectures_columns]+=lectures_df[lectures_df.lecture_id==content_id][part_lectures_columns + types_of_lectures_columns].values\n        else:\n            user_lecture_stats_part.loc[user_lecture_stats_part.user_id==user_id,part_lectures_columns + types_of_lectures_columns]+=lectures_df[lectures_df.lecture_id==content_id][part_lectures_columns + types_of_lectures_columns].values\n  \n        \n    test_df = test_df[test_df['content_type_id'] == 0].reset_index(drop=True)\n   \n    #SAKT\n    test_dataset = TestDataset(group, test_df, skills)\n    test_dataloader = DataLoader(test_dataset, batch_size=51200, shuffle=False)\n    \n    outs = []\n\n    for item in test_dataloader:\n        x = item[0].to(device).long()\n        target_id = item[1].to(device).long()\n\n        with torch.no_grad():\n            output, att_weight = sakt_model(x, target_id)\n        outs.extend(torch.sigmoid(output)[:, -1].view(-1).data.cpu().numpy())\n    #END SAKT\n\n    test_df['prior_question_had_explanation'].fillna(False, inplace=True)\n    test_df.prior_question_had_explanation=test_df.prior_question_had_explanation.astype('int8')\n    test_df['prior_question_elapsed_time'].fillna(prior_question_elapsed_time_mean, inplace=True)\n    \n\n    user_lecture_sum = np.zeros(len(test_df), dtype=np.int16)\n    user_lecture_count = np.zeros(len(test_df), dtype=np.int16) \n    \n    user_sum = np.zeros(len(test_df), dtype=np.int16)\n    user_count = np.zeros(len(test_df), dtype=np.int16)\n    content_sum = np.zeros(len(test_df), dtype=np.int32)\n    content_count = np.zeros(len(test_df), dtype=np.int32)\n    task_container_sum = np.zeros(len(test_df), dtype=np.int32)\n    task_container_count = np.zeros(len(test_df), dtype=np.int32)\n    task_container_std = np.zeros(len(test_df), dtype=np.float16)\n    content_task_mean = np.zeros(len(test_df), dtype=np.float16)\n    explanation_sum = np.zeros(len(test_df), dtype=np.int32)\n    explanation_count = np.zeros(len(test_df), dtype=np.int32)\n    delta_prior_question_elapsed_time = np.zeros(len(test_df), dtype=np.int32)\n\n    attempt_no_count = np.zeros(len(test_df), dtype=np.int16)\n    lagtime = np.zeros(len(test_df), dtype=np.int32)\n    lagtime_mean = np.zeros(len(test_df), dtype=np.int32)\n   \n    \n    for i, (user_id,prior_question_had_explanation,content_type_id,prior_question_elapsed_time,timestamp, content_id,task_container_id) in enumerate(zip(test_df['user_id'].values,test_df['prior_question_had_explanation'].values,test_df['content_type_id'].values,test_df['prior_question_elapsed_time'].values,test_df['timestamp'].values, test_df['content_id'].values, test_df['task_container_id'].values)):\n         \n        user_lecture_sum_dict[user_id] += content_type_id\n        user_lecture_count_dict[user_id] += 1\n        \n        user_lecture_sum[i] = user_lecture_sum_dict[user_id]\n        user_lecture_count[i] = user_lecture_count_dict[user_id]\n        \n        user_sum[i] = user_sum_dict[user_id]\n        user_count[i] = user_count_dict[user_id]\n        content_sum[i] = content_sum_dict[content_id]\n        content_count[i] = content_count_dict[content_id]\n        task_container_sum[i] = task_container_sum_dict[task_container_id]\n        task_container_count[i] = task_container_count_dict[task_container_id]\n        task_container_std[i]=task_container_std_dict[task_container_id]\n      \n        explanation_sum[i] = explanation_sum_dict[user_id]\n        explanation_count[i] = explanation_count_dict[user_id]\n  \n        if user_id in max_timestamp_u_dict['max_time_stamp'].keys():\n            lagtime[i]=timestamp-max_timestamp_u_dict['max_time_stamp'][user_id]\n            max_timestamp_u_dict['max_time_stamp'][user_id]=timestamp\n            lagtime_mean[i]=(lagtime_mean_dict[user_id]+lagtime[i])/2           \n        else:\n            lagtime[i]=0\n            max_timestamp_u_dict['max_time_stamp'].update({user_id:timestamp})\n            lagtime_mean_dict.update({user_id:timestamp})\n            lagtime_mean[i]=(lagtime_mean_dict[user_id]+lagtime[i])/2\n            \n        if user_id in user_prior_question_elapsed_time_dict['prior_question_elapsed_time'].keys():            \n            delta_prior_question_elapsed_time[i]=prior_question_elapsed_time-user_prior_question_elapsed_time_dict['prior_question_elapsed_time'][user_id]\n            user_prior_question_elapsed_time_dict['prior_question_elapsed_time'][user_id]=prior_question_elapsed_time\n        else:           \n            delta_prior_question_elapsed_time[i]=0    \n            user_prior_question_elapsed_time_dict['prior_question_elapsed_time'].update({user_id:prior_question_elapsed_time})\n           \n        \n        \n    \n\n    test_df=test_df.merge(questions_df.loc[questions_df.index.isin(test_df['content_id'])],\n                  how='left', on='content_id', right_index=True)\n \n    test_df['user_lecture_lv'] = user_lecture_sum / user_lecture_count\n    test_df['user_lecture_cumsum'] = user_lecture_sum\n    test_df['user_correctness'] = user_sum / user_count\n    test_df['user_correct_cumcount'] =user_count\n    test_df['user_correct_cumsum'] =user_sum\n    \n    test_df['content_correctness'] = content_sum / content_count\n    test_df['content_count'] = content_count\n    test_df['content_sum'] = content_sum\n    \n    test_df['task_container_correctness'] = task_container_sum / task_container_count\n    test_df['task_container_sum'] = task_container_sum \n    test_df['task_container_std'] = task_container_std \n    #test_df['content_task_mean'] = content_task_mean \n    \n    test_df['explanation_mean'] = explanation_sum / explanation_count\n    test_df['explanation_cumsum'] = explanation_sum \n    \n    \n    test_df['delta_prior_question_elapsed_time'] = delta_prior_question_elapsed_time \n    \n  \n \n    test_df[\"attempt_no\"] = test_df[[\"user_id\", \"content_id\"]].apply(lambda row: get_max_attempt(row[\"user_id\"], row[\"content_id\"]), axis=1)\n    test_df[\"lagtime\"]=lagtime\n    test_df[\"lagtime_mean\"]=lagtime_mean\n\n    test_df['user_correctness'].fillna( 1, inplace=True)\n    test_df['attempt_no'].fillna(1, inplace=True)\n    #\n    test_df.fillna(0, inplace=True)\n    \n\n    test_df['timestamp']=test_df['timestamp']/(1000*3600)\n    test_df.timestamp=test_df.timestamp.astype('int16')\n\n\n    sub_preds = np.zeros(test_df.shape[0])\n    for i, lgbm_model in enumerate(clfs, 1):\n        test_preds  = lgbm_model.predict(test_df[features])\n        sub_preds += test_preds\n    #HDKIM\n    #test_df[target] = sub_preds / len(clfs) #HDKIM\n    \n    lgbm_final = sub_preds / len(clfs)   \n    test_df[target] = np.array(outs) * 0.5 +  lgbm_final * 0.5\n    test_df[target] = test_df[target].clip(0.005, 0.995)\n    # print(outs)\n    # * 0.5 + lgbm_final * 0.5\n    # HDKIMHDKIM\n\n    env.predict(test_df[['row_id', target]])","execution_count":null,"outputs":[]}],"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":4,"nbformat_minor":4}