{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport seaborn as sns\nimport matplotlib.pyplot as plt\n\nfrom sklearn.metrics import roc_auc_score\nfrom sklearn.preprocessing import StandardScaler\nfrom sklearn.model_selection import train_test_split, cross_val_score\nfrom xgboost import XGBClassifier, plot_importance\nimport category_encoders as ce\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 5GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"train = pd.read_csv(\"/kaggle/input/riiid-test-answer-prediction/train.csv\",\n                    nrows=10**5,\n                    dtype={'row_id': 'int64', \n                           'timestamp': 'int64', \n                           'user_id': 'int32', \n                           'content_id': 'int16', \n                           'content_type_id': 'int8',\n                           'task_container_id': 'int16', \n                           'user_answer': 'int8', \n                           'answered_correctly': 'int8', \n                           'prior_question_elapsed_time': 'float32', \n                           'prior_question_had_explanation': 'boolean'}\n                      )\nprint(\"train shape: \",train.shape)\nlectures = pd.read_csv(\"/kaggle/input/riiid-test-answer-prediction/lectures.csv\")\nprint(\"lectures shape: \",lectures.shape)\nquestions = pd.read_csv(\"/kaggle/input/riiid-test-answer-prediction/questions.csv\")\nprint(\"questions shape: \",questions.shape)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# partMapping 1;4 = Listening, 5-7; Reading\n# Listening : 0\n# Reading : 1\ndef TOEICSection(part):\n    if part >= 1 and part <= 4:\n        return \"Listening\"\n    elif part >= 5 and part <= 7:\n        return \"Reading\"\n    else:\n        return \"Missing\"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"questionsdf = pd.concat([questions, lectures.rename({\"lecture_id\":\"question_id\"}, axis = 1)], axis = 0).reset_index(drop = True)\nquestionsdf.tags= questionsdf.tags.fillna(questionsdf.tag)\n\nquestionsdf.type_of = questionsdf.type_of.fillna(\"question\")\nquestionsdf[\"content_type_id\"] = questionsdf[\"type_of\"] != 'question'\n# questionsdf[\"content_type_id\"] = questionsdf[\"type_of\"].apply(lambda x : 1 if x != 'question' else 0)\nquestionsdf = questionsdf.drop(\"tag\", axis = 1)\nquestionsdf = questionsdf.fillna(-1)\n\nquestionsdf = questionsdf.rename({\"question_id\": \"content_id\"}, axis=1)\n\nquestionsdf.tags = questionsdf.tags.apply(lambda x: [int(x)] if type(x) != str else list(map(int, x.split())))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"questionsdf['reading_section'] = questionsdf['part'].apply(lambda x: TOEICSection(x))\nquestionsdf[\"tags\"] = questionsdf[\"tags\"].apply(lambda x: sorted(x))\nquestionsdf[\"tag_len\"] = questionsdf[\"tags\"].apply(lambda x: len(x))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"questionsdf[['tags1','tags2','tags3','tags4','tags5','tags6']] = pd.DataFrame(questionsdf[\"tags\"] .tolist())\nquestionsdf[\"tags1\"] = questionsdf[\"tags1\"].fillna(-1)\nquestionsdf[\"tags2\"] = questionsdf[\"tags2\"].fillna(-1)\nquestionsdf[\"tags3\"] = questionsdf[\"tags3\"].fillna(-1)\nquestionsdf[\"tags4\"] = questionsdf[\"tags4\"].fillna(-1)\nquestionsdf[\"tags5\"] = questionsdf[\"tags5\"].fillna(-1)\nquestionsdf[\"tags6\"] = questionsdf[\"tags6\"].fillna(-1)\n\nquestionsdf[\"tags1\"] = questionsdf[\"tags1\"].astype(int)\nquestionsdf[\"tags2\"] = questionsdf[\"tags2\"].astype(int)\nquestionsdf[\"tags3\"] = questionsdf[\"tags3\"].astype(int)\nquestionsdf[\"tags4\"] = questionsdf[\"tags4\"].astype(int)\nquestionsdf[\"tags5\"] = questionsdf[\"tags5\"].astype(int)\nquestionsdf[\"tags6\"] = questionsdf[\"tags6\"].astype(int)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"question_train_data = train.loc[train.content_type_id == 0,]\nlectore_train_data = train.loc[train.content_type_id == 1,]\nque_df = questionsdf.loc[questionsdf.content_type_id == False,]\nlec_df = questionsdf.loc[questionsdf.content_type_id == True,]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(question_train_data.shape)\nprint(lectore_train_data.shape)\nprint(que_df.shape)\nprint(lec_df.shape)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"question_train_data = question_train_data.merge(que_df, how = \"inner\", on = [\"content_id\", \"content_type_id\"])\nlectore_train_data = lectore_train_data.merge(lec_df, how = \"inner\", on = [\"content_id\", \"content_type_id\"])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df = pd.concat([question_train_data,lectore_train_data])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"remove_col = [\"row_id\",\"correct_answer\"]\ntrain_df = train_df.drop(remove_col, axis = 1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df[\"bundle_id\"] = train_df[\"bundle_id\"].astype(int)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_que_df = train_df.loc[train_df[\"content_type_id\"] == 0,]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"figure, ax = plt.subplots(figsize = (15,10))\nsns.heatmap(train_que_df.corr(), annot = True, cmap=\"YlGnBu\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"figure, ax = plt.subplots(figsize = (15,10))\nplt.subplot(3,2,1)\nsns.distplot(train_que_df[\"user_id\"])\nplt.subplot(3,2,2)\nsns.distplot(train_que_df[\"content_id\"])\nplt.subplot(3,2,3)\nsns.distplot(train_que_df[\"task_container_id\"])\nplt.subplot(3,2,4)\nsns.distplot(train_que_df[\"prior_question_elapsed_time\"])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"figure, ax = plt.subplots(figsize = (10,8))\nsns.scatterplot(x = \"user_id\", y = \"prior_question_elapsed_time\", hue = \"user_answer\", size = \"user_answer\", data = train_que_df)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"figure, ax = plt.subplots(figsize = (10,8))\nsns.scatterplot(x = \"user_id\", y = \"task_container_id\", hue = \"user_answer\", size = \"user_answer\", data = train_que_df)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"## Mean time users took to solve the questions\nuser_mean = train_que_df.groupby('user_id')[\"timestamp\"].mean()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"user_df = pd.DataFrame(user_mean)\nuser_df[\"user_id\"] = user_df.index","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"figure, ax = plt.subplots(figsize = (10,8))\nsns.scatterplot(x = \"user_id\",y =\"timestamp\", data = user_df)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"correct_ans = train_que_df['answered_correctly'].value_counts().reset_index()\ncorrect_ans.columns = ['answered_correctly','per']\ncorrect_ans['per'] /= len(train_que_df)\n\ncolours =  ('blue','violet')\nexplode = (0.1, 0.1)\ndef func(pct, allvalues): \n    absolute = int(pct / 100.*np.sum(allvalues)) \n    return \"{:.1f}%\".format(pct)\n\nfig, (ax1,ax2) = plt.subplots(1,2,figsize=(12,22))\nwedges, texts, autotexts = ax1.pie(correct_ans['per'],  \n                                  autopct = lambda pct: func(pct, correct_ans['per']), \n                                  explode = explode,  \n                                  labels = correct_ans['answered_correctly'], \n                                  shadow = True, \n                                  colors = colours, \n                                  startangle = 90, \n                                \n                                  textprops = dict(color =\"white\"))\n\ncorrect_ans = train_que_df['user_answer'].value_counts().reset_index()\ncorrect_ans.columns = ['user_answer','per']\ncorrect_ans['per'] /= len(train_que_df)\n\ncolors1 = ('blue','violet','brown','black')\n\nexplode1 = (0.1,0.1,0.1,0.1)\nwedges, texts, autotexts = ax2.pie(correct_ans['per'],  \n                                  autopct = lambda pct: func(pct, correct_ans['per']), \n                                  explode = explode1,  \n                                  labels = correct_ans['user_answer'], \n                                  shadow = True, \n                                  colors = colors1, \n                                  startangle = 90, \n                                  textprops = dict(color =\"white\")) ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"mini_df= train_que_df.copy()\n\n\nmini_df = mini_df.sort_values(by=['timestamp'])\nmini_df = mini_df.drop_duplicates('timestamp')\nmini_df[\"timestamp\"] = mini_df[\"timestamp\"] / 1000000\n\nplt.figure(figsize=(20,10))\nsns.set_style('dark')\nplt.subplot(3, 1, 1)\nmid_df = mini_df.head(100)\nsns.pointplot(x = \"timestamp\", \n              y = \"answered_correctly\",              \n              data = mid_df, \n              linestyle='--',\n              color='violet',\n              hue = 'prior_question_had_explanation',\n              markers='x')\n\nplt.subplot(3, 1, 2)\nmid_df = mini_df[50000:51100]\nsns.pointplot(x = \"timestamp\", \n              y = \"answered_correctly\",              \n              data = mid_df, \n              linestyle='--',\n              color='violet',\n              hue = 'prior_question_had_explanation',\n              markers='x')\n\nplt.subplot(3, 1, 3)\nmid_df = mini_df.tail(100)\nsns.pointplot(x = \"timestamp\", \n              y = \"answered_correctly\",              \n              data = mid_df, \n              linestyle='--',\n              color='violet',\n              hue = 'prior_question_had_explanation',\n              markers='x')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.figure(figsize = (10,8))\nsns.countplot('user_answer', hue = 'prior_question_had_explanation', data = train_que_df)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.figure(figsize = (10,8))\nsns.scatterplot(x = \"task_container_id\", y = \"prior_question_elapsed_time\", hue = \"user_id\", data = train_que_df , size='user_id' ,alpha=0.7)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.figure(figsize = (10,8))\nsns.scatterplot(x = \"task_container_id\", y = \"prior_question_elapsed_time\", hue = \"answered_correctly\", data = train_que_df , size='answered_correctly' ,alpha=0.7)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.figure(figsize = (10,8))\nsns.barplot(x = \"part\", y = \"bundle_id\", hue = 'answered_correctly', data = train_que_df)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.figure(figsize = (10,8))\nsns.barplot(x = \"part\", y = \"user_id\", hue = 'answered_correctly', data = train_que_df)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"---"},{"metadata":{},"cell_type":"markdown","source":"**Model Building**"},{"metadata":{"trusted":true},"cell_type":"code","source":"training = train_que_df.copy()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"training.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"training.dropna(inplace=True)\ntraining.reset_index(drop=True, inplace=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def max_value(inputlist):\n    return max([sublist[-1] for sublist in inputlist])\n\ndef generateSequencedlist(inputList):\n    blankLs = [0] * maxLength\n    for l in inputList:\n        blankLs[l-1] = 1\n    return blankLs","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"maxLength = max_value(training.tags.tolist())\nstags = pd.DataFrame(training.tags.apply(lambda x : generateSequencedlist(x)).tolist())","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"colDict = {}\nfor c in stags.columns:\n    colDict[c] = \"tag_{}\".format(c)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"stags.rename(columns=colDict, inplace = True)\n# training = pd.concat([training, stags], axis = 1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"removeCol = [\"bundle_id\",\"tags\",\"content_type_id\"]\ntraining = training.drop(removeCol, axis = 1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# apply StandardScaler\nscaler = StandardScaler() \nstandard_df = scaler.fit_transform(training[['timestamp',\"prior_question_elapsed_time\"]]) \nstandard_df = pd.DataFrame(standard_df, columns =['timestamp',\"prior_question_elapsed_time\"]) ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"training[\"timestamp\"] = standard_df[\"timestamp\"]\ntraining[\"prior_question_elapsed_time\"] = standard_df[\"prior_question_elapsed_time\"]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# \"type_of\", \"reading_section\"\nfrom sklearn.preprocessing import LabelEncoder\nlabel_encoder = LabelEncoder() \ntraining[\"type_of\"] = label_encoder.fit_transform(training['type_of']) \ntraining[\"reading_section\"] = label_encoder.fit_transform(training['reading_section']) \ntraining[\"prior_question_had_explanation\"] = label_encoder.fit_transform(training['prior_question_had_explanation']) ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"grouped_by_user_df = training.groupby('user_id')\nuser_answers_df = grouped_by_user_df.agg({'answered_correctly': ['mean', 'count', 'sum']}).copy()\nuser_answers_df.columns = ['mean_answered_correctly_user', 'questions_answered', 'sum_answered_correctly_user']\n\n\ngrouped_by_content_df = training.groupby('content_id')\ncontent_answers_df = grouped_by_content_df.agg({'answered_correctly': ['mean', 'count'] }).copy()\ncontent_answers_df.columns = ['mean_answered_correctly_content', 'question_asked']\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"training = training.merge(user_answers_df, on = \"user_id\")\ntraining = training.merge(content_answers_df, on = \"content_id\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Apply encoding for user_id,content_id,task_container_id,bundle_id,part","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"y = training[\"answered_correctly\"]\nX = training.drop([\"answered_correctly\"], axis = 1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 42)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\nmodel = XGBClassifier(\n    tree_method=\"hist\",\n    learning_rate=0.1,\n    gamma=0.2,\n    n_estimators=200,\n    max_depth=8,\n    min_child_weight=40,\n    subsample=0.87,\n    colsample_bytree=0.95,\n    reg_alpha=0.04,\n    reg_lambda=0.073,\n    objective='binary:logistic',\n    nthread=4,\n    scale_pos_weight=1,\n    seed=27\n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# cross_val_score(model, X_train, y_train.values.ravel(), cv=5, scoring=\"roc_auc\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.fit(X_train, y_train.values.ravel())","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"roc_auc_score(y_train.values, model.predict_proba(X_train)[:,1])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"roc_auc_score(y_test.values, model.predict_proba(X_test)[:,1])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"fig, ax = plt.subplots(figsize=(10,8))\nplot_importance(model, ax=ax)\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"---"},{"metadata":{},"cell_type":"markdown","source":"**In Progress**"},{"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}