{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"# useful\nimport numpy as np\nimport pandas as pd\n\n# neural nets\nimport tensorflow as tf\nimport tensorflow.keras.models as M\nimport tensorflow.keras.layers as L\nimport keras\nfrom keras.models import Sequential\nfrom keras.layers import Dense, Dropout\nfrom keras.layers import Embedding\n\n\n# custom\nimport riiideducation","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"**DATA CLEANING**"},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df = pd.read_csv(\n    '/kaggle/input/riiid-test-answer-prediction/train.csv',\n    usecols=[\n      \n        'user_id', \n        'content_id',\n        'task_container_id',\n        'user_answer', \n        'answered_correctly', \n        'prior_question_elapsed_time',\n        'prior_question_had_explanation'\n    ],\n       dtype={\n\n           'user_id': 'int32',\n           'content_id': 'int16',\n           'task_container_id': 'int8',\n           'user_answer': 'int8',\n           'answered_correctly': 'int8',\n           'prior_question_elapsed_time': 'float32', \n           'prior_question_had_explanation': 'boolean'\n       }\n)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"question = pd.read_csv('/kaggle/input/riiid-test-answer-prediction/questions.csv')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df = train_df.loc[train_df['answered_correctly'] != -1].reset_index(drop=True)\ntrain_df","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df['prior_question_had_explanation'] = train_df['prior_question_had_explanation'].fillna(value = False).astype(bool)\ntrain_df","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df = train_df.merge(question, left_on = 'content_id',right_on = 'question_id',how = 'left')\ntrain_df.drop(columns=['question_id','correct_answer','tags','bundle_id'],axis=1,inplace=True)\ntrain_df","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"features_df = train_df.iloc[:int(9 /10 * len(train_df))]\ntrain_df = train_df.iloc[int(9 /10 * len(train_df)):]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"grouped_by_user_df = features_df.groupby('user_id')\nuser_answers_df = grouped_by_user_df.agg({'answered_correctly': ['count', 'std', 'median']}).copy()\nuser_answers_df.columns = ['questions_answered', 'std_user_accuracy', 'median_user_accuracy']","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"grouped_by_task_container_df = features_df.groupby('task_container_id')\ntask_container_df = grouped_by_task_container_df.agg({'answered_correctly': ['count', 'std', 'median']}).copy()\ntask_container_df.columns = ['questions_tc', 'std_tc_accuracy', 'median_tc_accuracy']","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"grouped_by_content_df = features_df.groupby('content_id')\ncontent_answers_df = grouped_by_content_df.agg({'answered_correctly': ['count', 'std', 'median']}).copy()\ncontent_answers_df.columns = ['question_asked', 'std_accuracy', 'median_accuracy']","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"grouped_by_question_df = features_df.groupby('content_id')\nquestion_df = grouped_by_question_df.agg({'user_answer': ['count', 'std', 'median']}).copy()\nquestion_df.columns = ['number_ca', 'std_ca_accuracy', 'median_ca_accuracy']","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import gc\ndel features_df\ndel grouped_by_user_df\ndel grouped_by_content_df\n\ngc.collect()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df = train_df.merge(user_answers_df, how='left', on='user_id')\ntrain_df = train_df.merge(content_answers_df, how='left', on='content_id')\ntrain_df = train_df.merge(task_container_df, how='left', on='task_container_id')\ntrain_df = train_df.merge(question_df,how = 'left', on='content_id')\ntrain_df","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"features = [ \n    'questions_answered',\n    'std_user_accuracy', \n    'median_user_accuracy', \n    'questions_tc', \n    'std_tc_accuracy',\n    'median_tc_accuracy',  \n    'question_asked',\n    'std_accuracy', \n    'median_accuracy',\n    'prior_question_elapsed_time', \n    'prior_question_had_explanation',\n    'part'\n]\n\ntarget = 'answered_correctly'","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df = train_df.replace([np.inf, -np.inf], np.nan)\ntrain_df = train_df.fillna(0)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df['prior_question_had_explanation'] = train_df['prior_question_had_explanation'].astype(np.int8)\ntrain_df","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"**DATA VISUALISATION**"},{"metadata":{"trusted":true},"cell_type":"code","source":"import seaborn as sns\nimport matplotlib.pyplot as plt","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"type_count1 = train_df['answered_correctly'].value_counts()\nsns.barplot(type_count1.index.astype('str'), type_count1.values, alpha=0.8)\nplt.title('correct answers vs wrong answers')\nplt.ylabel('Number of Answers', fontsize=12)\nplt.xlabel('correct or wrong', fontsize=12)\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"type_count = train_df['prior_question_had_explanation'].value_counts()\nsns.barplot(type_count.index.astype('str'), type_count.values, alpha=0.8)\nplt.title('Prior Questions with Explanation vs without Explanation')\nplt.ylabel('Number of Answers', fontsize=12)\nplt.xlabel('Explanation vs No Explanation', fontsize=12)\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_grouped = pd.DataFrame(train_df.groupby(['part'])['answered_correctly'].agg(np.sum)) #vizualisation of data\ndf_grouped.reset_index(inplace=True)\ndf_grouped.sort_values(by=['answered_correctly'], ascending=True)\\\n          .plot(kind='barh', x='part', y='answered_correctly', \n                figsize=(9,5), legend=False, color='darkblue')# visualizatoin of transaction amount data\nplt.xlabel('\\nThe number of correct answers', fontsize=12)\nplt.ylabel('TOEIC\\n', fontsize=12)\nplt.title('\\nThe number of correct answers by different parts of TOEIC\\n', fontsize=14, fontweight='bold');","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"**TRAINING**"},{"metadata":{"trusted":true},"cell_type":"code","source":"def create_model():\n    model = tf.keras.Sequential([\n        tf.keras.layers.Input(12),\n        tf.keras.layers.BatchNormalization(),\n        tf.keras.layers.Dense(120, activation=\"relu\"),\n        tf.keras.layers.BatchNormalization(),\n        tf.keras.layers.Dropout(0.5),\n        tf.keras.layers.Dense(20, activation=\"relu\"),\n        tf.keras.layers.BatchNormalization(),\n        tf.keras.layers.Dropout(0.5),\n        tf.keras.layers.Dense(1, activation=\"sigmoid\")\n    ])\n    model.compile(optimizer='adam', loss=\"binary_crossentropy\", metrics=['accuracy'])\n    return model   ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":" from sklearn.model_selection import KFold","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"res = pd.DataFrame()\nres['row_id'] = [i for i in range(9927130)]\nres.loc[:, ['answered_correctly']] = 0\nmodels = []\n\nfor n, (tr, te) in enumerate(KFold(n_splits=2, random_state=666, shuffle=True).split(train_df[target])):\n    print(f'Fold {n}')\n    \n    model = create_model()\n    \n    model.fit(\n        train_df[features].values[tr],\n        train_df[target].values[tr],\n        validation_split=0.2,\n        epochs=50, \n        batch_size=5120\n    )\n\n    res.loc[te, ['answered_correctly']] = model.predict(train_df[features].values[te])\n    models.append(model)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## PREDICTION"},{"metadata":{"trusted":true},"cell_type":"code","source":"env = riiideducation.make_env()\niter_test = env.iter_test()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"for (test_df, sample_prediction_df) in iter_test:\n    y_preds = []\n    test_df = test_df.merge(user_answers_df, how = 'left', on = 'user_id')\n    test_df = test_df.merge(content_answers_df, how = 'left', on = 'content_id')\n    test_df = test_df.merge(task_container_df, how = 'left', on = 'task_container_id')\n    test_df = test_df.merge(question_df,how = 'left', on='content_id')\n    test_df = test_df.merge(question, left_on = 'content_id',right_on = 'question_id',how = 'left')\n    test_df['prior_question_had_explanation'] = test_df['prior_question_had_explanation'].fillna(value = False).astype(bool)\n    test_df['prior_question_had_explanation'] = test_df['prior_question_had_explanation'].astype(np.int8)\n    test_df = test_df.replace([np.inf, -np.inf], np.nan)\n    test_df.fillna(value=0, inplace = True)\n\n    for model in models:\n        y_pred = model.predict(test_df[features].values)\n        y_preds.append(y_pred)\n\n    y_preds = sum(y_preds) / len(y_preds)\n    test_df['answered_correctly'] = y_preds\n    env.predict(test_df.loc[test_df['content_type_id'] == 0, ['row_id', 'answered_correctly']])","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}