{"cells":[{"metadata":{},"cell_type":"markdown","source":"# Imports"},{"metadata":{"trusted":true},"cell_type":"code","source":"import os\nimport pandas as pd\n\n# neural nets\nimport tensorflow as tf\nimport tensorflow.keras.models as M\nimport tensorflow.keras.layers as L\n\nimport riiideducation","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Globals"},{"metadata":{"trusted":true},"cell_type":"code","source":"INPUT_DIR = '/kaggle/input/riiid-test-answer-prediction/'\nTRAIN_FILE = os.path.join(INPUT_DIR,'train.csv')\nTEST_FILE = os.path.join(INPUT_DIR,'test.csv')\nQUES_FILE = os.path.join(INPUT_DIR,'questions.csv')\nLEC_FILE = os.path.join(INPUT_DIR,'lectures.csv')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# TRAIN DATA"},{"metadata":{},"cell_type":"markdown","source":"## Read"},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"tr = pd.read_csv(TRAIN_FILE, low_memory=False, nrows=10**7)\ntr.head()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Info"},{"metadata":{"trusted":true},"cell_type":"code","source":"tr.info()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Dir"},{"metadata":{"trusted":true},"cell_type":"code","source":"dir(tr)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Rows, Cols"},{"metadata":{"trusted":true},"cell_type":"code","source":"print('Num rows, cols:',tr.shape)\nprint('Num rows:',len(tr))\nprint('Num cols:',len(tr.columns))\nprint('Num elements:',tr.size)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Columns"},{"metadata":{"trusted":true},"cell_type":"code","source":"print('COLUMNS:\\n----------------------------------')\n\nfor column in tr.columns:\n    print(column)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Column Dir"},{"metadata":{"trusted":true},"cell_type":"code","source":"for column in tr.columns:\n    print('\\n\\n\\nThis column is ',column)\n    print(tr[column].shape)\n    print(dir(tr[column]))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Column counts"},{"metadata":{"trusted":true},"cell_type":"code","source":"for column in tr.columns:\n    print('\\n\\n\\nThis column is ',column)\n    print('Num elements: ',tr[column].shape,tr[column].values.shape,tr[column].size)\n    print('Num non null elements:',tr[column].count())\n    print('Num null elements:',tr[column].isna().sum())\n    print('Num unique elements:',tr[column].unique().shape)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Column useful Uniques"},{"metadata":{"trusted":true},"cell_type":"code","source":"print('User answers:',tr['user_answer'].unique())\nprint('Answered correctly:',tr['answered_correctly'].unique())\nprint('Prior ques had explanation',tr['prior_question_had_explanation'].unique())","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# QUESTIONS"},{"metadata":{},"cell_type":"markdown","source":"## Read"},{"metadata":{"trusted":true},"cell_type":"code","source":"qu = pd.read_csv(QUES_FILE)\nqu.head()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Rows, Cols"},{"metadata":{"trusted":true},"cell_type":"code","source":"print('Num rows',len(qu))\nprint('Num cols',len(qu.columns))\nprint('Shape:',qu.shape)\nprint('Num elements:',qu.size)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print('Num unique questions:',qu['question_id'].unique().shape)\nprint('Num unique bundles:',qu['bundle_id'].unique().shape)\nprint('Num unique correct answers:',qu['correct_answer'].unique().shape, 'Unique correct answers:',qu['correct_answer'].unique())\nprint('Num unique parts:',qu['part'].unique().shape, 'Unique parts:',qu['part'].unique())\nprint('Num unique tags:',qu['tags'].unique().shape)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Lectures"},{"metadata":{"trusted":true},"cell_type":"code","source":"le = pd.read_csv(LEC_FILE)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Rows, Cols"},{"metadata":{"trusted":true},"cell_type":"code","source":"print('Num rows',len(le))\nprint('Num cols',len(le.columns))\nprint('Shape:',le.shape)\nprint('Num elements:',le.size)\nprint(le.columns)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print('Num unique lec ids:',le['lecture_id'].unique().shape)\nprint('Num unique tags:',le['tag'].unique().shape)\nprint('Num unique parts:',le['part'].unique().shape, 'Unique parts:',le['part'].unique())\nprint('Num unique type of:',le['type_of'].unique().shape, 'Unique type of:', le['type_of'].unique())","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Pre-process"},{"metadata":{"trusted":true},"cell_type":"code","source":"# piv1 = tr.loc[tr.answered_correctly!=-1].groupby(\"content_id\")[\"answered_correctly\"].mean().reset_index()\nprint(tr[:10].loc[tr.answered_correctly!=-1])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# print(dir(tr.loc[tr.answered_correctly!=-1].groupby(\"content_id\")))\n# print(type(tr.loc[tr.answered_correctly!=-1].groupby(\"content_id\")))\n# print(tr.loc[tr.answered_correctly!=-1].groupby(\"content_id\")['answered_correctly'].sum())\nprint(tr.loc[tr.answered_correctly!=-1].groupby(\"content_id\")['answered_correctly'].sum().reset_index())","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(tr.loc[tr.answered_correctly!=-1].groupby(\"task_container_id\")['answered_correctly'].sum().reset_index())","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(tr.loc[tr.answered_correctly!=-1].groupby(\"user_id\")['answered_correctly'].sum().reset_index().sort_values(by=[\"answered_correctly\"], ascending=False))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(tr.loc[tr.answered_correctly!=-1].groupby([\"task_container_id\",\"user_id\"])['answered_correctly'].max().reset_index())","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Group data"},{"metadata":{"trusted":true},"cell_type":"code","source":"%%time\npiv1 = tr.loc[tr.answered_correctly!=-1].groupby(\"content_id\")[\"answered_correctly\"].mean().reset_index()\npiv1.columns = [\"content_id\", \"content_emb\"]\npiv2 = tr.loc[tr.answered_correctly!=-1].groupby(\"task_container_id\")[\"answered_correctly\"].mean().reset_index()\npiv2.columns = [\"task_container_id\", \"task_container_emb\"]\npiv3 = tr.loc[tr.answered_correctly!=-1].groupby(\"user_id\")[\"answered_correctly\"].mean().reset_index()\npiv3.columns = [\"user_id\", \"user_emb\"]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"TIME_MEAN = tr.prior_question_elapsed_time.median()\nTIME_MIN = tr.prior_question_elapsed_time.min()\nTIME_MAX = tr.prior_question_elapsed_time.max()\nprint(TIME_MEAN,TIME_MAX, TIME_MIN)\nmap_prior = {True:1, False:0}","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def preprocess(df):\n#     print('before merging:\\n',df[:10])\n    df = df.merge(piv1, how=\"left\", on=\"content_id\")\n#     print('merged piv1:\\n',df[:10])\n    df[\"content_emb\"] = df[\"content_emb\"].fillna(0.5)\n    df = df.merge(piv2, how=\"left\", on=\"task_container_id\")\n    df[\"task_container_emb\"] = df[\"task_container_emb\"].fillna(0.5)\n    df = df.merge(piv3, how=\"left\", on=\"user_id\")\n    df[\"user_emb\"] = df[\"user_emb\"].fillna(0.5)\n    df[\"prior_question_elapsed_time\"] = df[\"prior_question_elapsed_time\"].fillna(TIME_MEAN)\n    df[\"duration\"] = (df[\"prior_question_elapsed_time\"] - TIME_MIN) / (TIME_MAX - TIME_MIN)\n    df[\"prior_answer\"] = df[\"prior_question_had_explanation\"].map(map_prior)\n    df[\"prior_answer\"] = df[\"prior_answer\"].fillna(0.5)\n    return df","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"%%time\ntr_preprocessed = preprocess(tr)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# print(tr_preprocessed.content_type_id==0)\n# print(tr_preprocessed.loc[tr_preprocessed.content_type_id==0])\nprint(tr_preprocessed.loc[tr_preprocessed.content_type_id==1][:1])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(tr_preprocessed.loc[tr_preprocessed.content_type_id==0].count())\nprint(tr_preprocessed.loc[tr_preprocessed.content_type_id==1].count())","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"FE = [\"content_emb\", \"task_container_emb\", \"user_emb\", \"duration\", \"prior_answer\"]\nTARGET = \"answered_correctly\"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"x = tr_preprocessed.loc[tr_preprocessed.answered_correctly!=-1, FE].values\ny = tr_preprocessed.loc[tr_preprocessed.answered_correctly!=-1, TARGET].values","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(x.shape)\nprint(y.shape)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(y[10:100])","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Model"},{"metadata":{},"cell_type":"markdown","source":"## Training"},{"metadata":{"trusted":true},"cell_type":"code","source":"def make_ann(n_in):\n    inp = L.Input(shape=(n_in,), name=\"inp\")\n    d1 = L.Dense(100, activation=\"relu\", name=\"d1\")(inp)\n    d2 = L.Dense(100, activation=\"relu\", name=\"d2\")(d1)\n    preds = L.Dense(1, activation=\"sigmoid\", name=\"preds\")(d2)\n    \n    model = M.Model(inp, preds, name=\"ANN\")\n    model.compile(loss=\"binary_crossentropy\", optimizer=\"adam\", metrics=[\"accuracy\"])\n    return model","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"net = make_ann(x.shape[1])\nprint(net.summary())\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"net.fit(x, y, validation_split=0.2, batch_size=30_000, epochs=5)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(\"just to see\")\nprint(x[0], y[0])","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Prediction"},{"metadata":{"trusted":true,"collapsed":true},"cell_type":"code","source":"\nenv = riiideducation.make_env()\niter_test = env.iter_test()\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"it = 0\n\nfor test_df, sample_prediction_df in iter_test:\n    print(it)\n    it += 1\n    if it % 100 == 0:\n       print(it)\n    test_df = preprocess(test_df)\n    x_te = test_df[FE].values\n    test_df['answered_correctly'] = net.predict(x_te, batch_size=50_000, verbose=0)[:, 0]\n    print(env.predict(test_df.loc[test_df['content_type_id'] == 0, ['row_id', 'answered_correctly']]))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print('hi')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(dir(env))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# print(env.features)\nprint(len(list(iter_test)))\nprint(list(iter_test))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_df.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\niter_test = env.iter_test()\n(test_df, sample_prediction_df) = next(iter_test)\ntest_df\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","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}