{"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 numpy as np\nimport pandas as pd\n\nimport tensorflow as tf\nimport tensorflow.keras.models as M\nimport tensorflow.keras.layers as L\n\nimport riiideducation","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**CONSTANTS**","metadata":{}},{"cell_type":"code","source":"# PIVOT DATAFRAMES\npiv1 = pd.read_csv(\"../input/riiid-fixed-infos/content.csv\")\npiv2 = pd.read_csv(\"../input/riiid-fixed-infos/task.csv\")\npiv3 = pd.read_csv(\"../input/riiid-fixed-infos/user.csv\")\n\nfor col, df in zip([\"content_sum\", \"task_container_sum\", \"user_sum\"], [piv1, piv2, piv3]):\n    df[col] = (df[col] - df[col].min()) / (df[col].max() - df[col].min())\n#\nm1 = piv1[\"content_sum\"].mean()\nm2 = piv2[\"task_container_sum\"].mean()\nm3 = piv3[\"user_sum\"].mean()\n\n\n# OTHER CONSTANTS\nTARGET = \"answered_correctly\"\nTIME_MEAN = 21000.0\nTIME_MIN = 0.0\nTIME_MAX = 300000.0\nmap_prior = {True:1, False:0}","metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def preprocess(df):\n    df = df.merge(piv1, how=\"left\", on=\"content_id\")\n    df[\"content_emb\"] = df[\"content_emb\"].fillna(0.5)\n    df[\"content_sum\"] = df[\"content_sum\"].fillna(m1)\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[\"task_container_sum\"] = df[\"task_container_sum\"].fillna(m2)\n    df = df.merge(piv3, how=\"left\", on=\"user_id\")\n    df[\"user_emb\"] = df[\"user_emb\"].fillna(0.5)\n    df[\"user_sum\"] = df[\"user_sum\"].fillna(m3)\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    #df = df.fillna(-1)\n    epsilon = 1e-6\n    df[\"score\"] = 2*df[\"content_emb\"]*df[\"user_emb\"] / (df[\"content_emb\"]+ df[\"user_emb\"] + epsilon)\n    return df","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**TRAINING**","metadata":{}},{"cell_type":"code","source":"%%time\ntr = pd.read_csv(\"../input/riiid-test-answer-prediction/train.csv\", \n                 low_memory=False, nrows=10**7)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\ntr = preprocess(tr)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"FE = [\"content_emb\",\"content_sum\" ,\"task_container_emb\", \"task_container_sum\",\n      \"user_emb\", \"user_sum\",\"duration\", \"prior_answer\",\"score\"]","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x = tr.loc[tr.answered_correctly!=-1, FE].values\ny = tr.loc[tr.answered_correctly!=-1, TARGET].values","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.metrics import roc_auc_score\nfrom tensorflow.keras.regularizers import l1, l2\nfrom tensorflow.keras.optimizers import Adam\n\noptimizer = Adam(lr=0.005)\n\ndef make_model(n_in):\n    inp = L.Input(shape=(n_in,), name=\"inp\")\n    d1 = L.Dense(50, activation=\"relu\", name=\"d1\", activity_regularizer=l2(1e-3))(inp)\n    d2 = L.Dense(100, activation=\"relu\", name=\"d2\", activity_regularizer=l2(1e-4))(d1)\n    d3 = L.Dense(200, activation=\"relu\", name=\"d3\", activity_regularizer=l2(1e-5))(d2)\n    preds = L.Dense(1, activation=\"sigmoid\", name=\"preds\")(d3)\n    \n    model = M.Model(inp, preds, name=\"MyModel\")\n    model.compile(loss=\"binary_crossentropy\", optimizer=optimizer, metrics=['accuracy'])\n    return model","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"net = make_model(x.shape[1])\nprint(net.summary())","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"net.fit(x, y, validation_split=0.2, batch_size=30_000, epochs=20)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**PREDICTION**","metadata":{}},{"cell_type":"code","source":"env = riiideducation.make_env()\niter_test = env.iter_test()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for test_df, sample_prediction_df in iter_test:\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    env.predict(test_df.loc[test_df['content_type_id'] == 0, ['row_id', 'answered_correctly']])","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}