{"cells":[{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_kg_hide-input":true,"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","execution":{"iopub.execute_input":"2020-12-17T09:47:55.277252Z","iopub.status.busy":"2020-12-17T09:47:55.276489Z","iopub.status.idle":"2020-12-17T09:47:56.374948Z","shell.execute_reply":"2020-12-17T09:47:56.373872Z"},"papermill":{"duration":1.184028,"end_time":"2020-12-17T09:47:56.375118","exception":false,"start_time":"2020-12-17T09:47:55.19109","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\n%matplotlib inline\nimport matplotlib.style as style\nstyle.use('fivethirtyeight')\nimport seaborn as sns\nimport os\nfrom matplotlib.ticker import FuncFormatter\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input/riiid-test-answer-prediction'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"execution":{"iopub.execute_input":"2020-12-17T09:47:56.683953Z","iopub.status.busy":"2020-12-17T09:47:56.68318Z","iopub.status.idle":"2020-12-17T09:48:41.917755Z","shell.execute_reply":"2020-12-17T09:48:41.918344Z"},"papermill":{"duration":45.316915,"end_time":"2020-12-17T09:48:41.918495","exception":false,"start_time":"2020-12-17T09:47:56.60158","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"%%time\n\ntrain = pd.read_pickle(\"../input/riiid-train-data-multiple-formats/riiid_train.pkl.gzip\")\n\nprint(\"Train size:\", train.shape)","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-17T09:49:13.821693Z","iopub.status.busy":"2020-12-17T09:49:13.820922Z","iopub.status.idle":"2020-12-17T09:49:34.910989Z","shell.execute_reply":"2020-12-17T09:49:34.911584Z"},"papermill":{"duration":32.19594,"end_time":"2020-12-17T09:49:34.911773","exception":false,"start_time":"2020-12-17T09:49:02.715833","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"train['prior_question_had_explanation'] = train['prior_question_had_explanation'].astype('boolean')\n\n# train.memory_usage(deep=True)","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"execution":{"iopub.execute_input":"2020-12-17T09:49:35.225102Z","iopub.status.busy":"2020-12-17T09:49:35.224395Z","iopub.status.idle":"2020-12-17T09:49:35.271272Z","shell.execute_reply":"2020-12-17T09:49:35.272088Z"},"papermill":{"duration":0.132324,"end_time":"2020-12-17T09:49:35.272284","exception":false,"start_time":"2020-12-17T09:49:35.13996","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"%%time\n\nquestions = pd.read_csv('/kaggle/input/riiid-test-answer-prediction/questions.csv')\nlectures = pd.read_csv('/kaggle/input/riiid-test-answer-prediction/lectures.csv')\nexample_test = pd.read_csv('/kaggle/input/riiid-test-answer-prediction/example_test.csv')\nexample_sample_submission = pd.read_csv('/kaggle/input/riiid-test-answer-prediction/example_sample_submission.csv')","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-17T09:53:17.445171Z","iopub.status.busy":"2020-12-17T09:53:17.444083Z","iopub.status.idle":"2020-12-17T09:53:17.448663Z","shell.execute_reply":"2020-12-17T09:53:17.448144Z"},"papermill":{"duration":0.126279,"end_time":"2020-12-17T09:53:17.44878","exception":false,"start_time":"2020-12-17T09:53:17.322501","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"example_test.head()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Sampling the data"},{"metadata":{"trusted":true},"cell_type":"code","source":"user_interactions = train.user_id.value_counts()\nSAMPLE_SIZE = 100000\nsampled_users, n_sampled = [], 0\nwhile n_sampled < SAMPLE_SIZE:\n    \n    user = user_interactions.sample(1)\n    user_id = user.index.values[0]\n    n_interactions = user.values[0]\n    sampled_users.append(user_id)\n    n_sampled += n_interactions\n#     print(user_id, n_interactions)\nprint(sampled_users[:10], '\\n', n_sampled)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train = train.loc[train.user_id.isin(sampled_users)]\ntrain.shape","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Cleaning the data"},{"metadata":{},"cell_type":"markdown","source":"Removing questions with low/high correct answers ratio"},{"metadata":{"trusted":true},"cell_type":"code","source":"answered_questions = train.groupby(['content_id', 'answered_correctly']).size().unstack()\ncorrect_ratio = answered_questions.iloc[:, 1].divide(answered_questions.sum(axis=1))\ncorrect_ratio.plot.hist(bins=100)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"easy_question_th = 0.95\nproblematic_question_th = 0.5\n\nnormal_questions = correct_ratio.loc[correct_ratio.between(problematic_question_th, easy_question_th)].index\ntrain = train.loc[train.content_id.isin(normal_questions)]\ntrain.shape","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Aggregated history"},{"metadata":{"trusted":true},"cell_type":"code","source":"cols = ['user_id', 'answered_correctly', 'prior_question_had_explanation']\ntrain = train.loc[:, cols]\ntrain.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train = train[train.answered_correctly != -1]\ntrain.shape","execution_count":null,"outputs":[]},{"metadata":{"papermill":{"duration":0.11022,"end_time":"2020-12-17T09:53:20.220868","exception":false,"start_time":"2020-12-17T09:53:20.110648","status":"completed"},"tags":[]},"cell_type":"markdown","source":"# 2. Baseline model"},{"metadata":{"execution":{"iopub.execute_input":"2020-12-17T09:53:20.571274Z","iopub.status.busy":"2020-12-17T09:53:20.57056Z","iopub.status.idle":"2020-12-17T09:53:20.885685Z","shell.execute_reply":"2020-12-17T09:53:20.886197Z"},"papermill":{"duration":0.555834,"end_time":"2020-12-17T09:53:20.886425","exception":false,"start_time":"2020-12-17T09:53:20.330591","status":"completed"},"tags":[],"trusted":false},"cell_type":"code","source":"# #this clears everything loaded in RAM, including the libraries\n# %reset -f","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_kg_hide-input":true,"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","execution":{"iopub.execute_input":"2020-12-17T09:53:21.110682Z","iopub.status.busy":"2020-12-17T09:53:21.109965Z","iopub.status.idle":"2020-12-17T09:53:21.35053Z","shell.execute_reply":"2020-12-17T09:53:21.349792Z"},"papermill":{"duration":0.354034,"end_time":"2020-12-17T09:53:21.350676","exception":false,"start_time":"2020-12-17T09:53:20.996642","status":"completed"},"tags":[],"trusted":false},"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport riiideducation\nimport matplotlib.pyplot as plt\n%matplotlib inline\nimport matplotlib.style as style\nstyle.use('fivethirtyeight')\nimport seaborn as sns\nimport os\nimport lightgbm as lgb\nfrom sklearn.metrics import roc_auc_score\nfrom sklearn.preprocessing import LabelEncoder\nimport gc\nimport sys\npd.set_option('display.max_rows', None)","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":false,"execution":{"iopub.execute_input":"2020-12-17T09:53:21.573407Z","iopub.status.busy":"2020-12-17T09:53:21.572535Z","iopub.status.idle":"2020-12-17T09:54:37.826044Z","shell.execute_reply":"2020-12-17T09:54:37.826648Z"},"papermill":{"duration":76.36909,"end_time":"2020-12-17T09:54:37.826807","exception":false,"start_time":"2020-12-17T09:53:21.457717","status":"completed"},"tags":[],"trusted":false},"cell_type":"code","source":"# %%time\n# cols_to_load = ['row_id', 'user_id', 'answered_correctly', 'content_id', 'prior_question_had_explanation', 'prior_question_elapsed_time']\n# train = pd.read_pickle(\"../input/riiid-train-data-multiple-formats/riiid_train.pkl.gzip\")[cols_to_load]\n# train['prior_question_had_explanation'] = train['prior_question_had_explanation'].astype('boolean')\n\n# print(\"Train size:\", train.shape)","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":false,"execution":{"iopub.execute_input":"2020-12-17T09:54:38.057237Z","iopub.status.busy":"2020-12-17T09:54:38.05652Z","iopub.status.idle":"2020-12-17T09:54:38.09299Z","shell.execute_reply":"2020-12-17T09:54:38.092153Z"},"papermill":{"duration":0.155606,"end_time":"2020-12-17T09:54:38.09315","exception":false,"start_time":"2020-12-17T09:54:37.937544","status":"completed"},"tags":[],"trusted":false},"cell_type":"code","source":"# %%time\n\n# questions = pd.read_csv('/kaggle/input/riiid-test-answer-prediction/questions.csv')\n# lectures = pd.read_csv('/kaggle/input/riiid-test-answer-prediction/lectures.csv')\n# example_test = pd.read_csv('/kaggle/input/riiid-test-answer-prediction/example_test.csv')\n# example_sample_submission = pd.read_csv('/kaggle/input/riiid-test-answer-prediction/example_sample_submission.csv')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"`current_user_data`"},{"metadata":{"trusted":true},"cell_type":"code","source":"total_q = train_train.groupby('user_id').size()\nn_correct = train_train.groupby('user_id')['answered_correctly'].sum()\nratio_q = n_correct.divide(total_q)\ncurrent_user_data = pd.DataFrame({'n_questions': total_q, 'ratio_q': ratio_q})\ncurrent_user_data.head()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Submission"},{"metadata":{"execution":{"iopub.execute_input":"2020-12-17T10:12:44.179163Z","iopub.status.busy":"2020-12-17T10:12:44.178407Z","iopub.status.idle":"2020-12-17T10:12:44.182263Z","shell.execute_reply":"2020-12-17T10:12:44.18165Z"},"papermill":{"duration":0.139347,"end_time":"2020-12-17T10:12:44.182382","exception":false,"start_time":"2020-12-17T10:12:44.043035","status":"completed"},"tags":[],"trusted":false},"cell_type":"code","source":"env = riiideducation.make_env()","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-17T10:12:44.42699Z","iopub.status.busy":"2020-12-17T10:12:44.426259Z","iopub.status.idle":"2020-12-17T10:12:44.429064Z","shell.execute_reply":"2020-12-17T10:12:44.429695Z"},"papermill":{"duration":0.127515,"end_time":"2020-12-17T10:12:44.429854","exception":false,"start_time":"2020-12-17T10:12:44.302339","status":"completed"},"tags":[],"trusted":false},"cell_type":"code","source":"iter_test = env.iter_test()","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-12-17T10:12:44.687512Z","iopub.status.busy":"2020-12-17T10:12:44.686838Z","iopub.status.idle":"2020-12-17T10:12:45.099142Z","shell.execute_reply":"2020-12-17T10:12:45.09989Z"},"papermill":{"duration":0.551387,"end_time":"2020-12-17T10:12:45.100077","exception":false,"start_time":"2020-12-17T10:12:44.54869","status":"completed"},"tags":[],"trusted":false},"cell_type":"code","source":"for i, (test_df, sample_prediction_df) in enumerate(iter_test):\n    # Create target (all-0.5-)column\n    test_df['answered_correctly'] = 0.5\n    \n    # Making predictions\n    for idx, row in test_df.iterrows():\n        if row.user_id in current_user_data.index:\n            pred = current_user_data.loc[row.user_id, 'ratio_q']\n        else:\n            pred = 0.5\n        test_df.loc[idx, 'answered_correctly'] = pred    \n    env.predict(test_df.loc[test_df['content_type_id'] == 0, ['row_id', 'answered_correctly']])\n\n    # Updating knowledge based on latest batch\n    if i > 0:\n        prev_group_answers_correct = test_df.prior_group_answers_correct.iloc[0]\n        if isinstance(prev_group_answers_correct, str):\n            answers = map(int, prev_group_answers_correct.split())\n            answers = pd.DataFrame(answers, index=prev_test_df.index)\n    prev_test_df = test_df.copy()","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}