{"cells":[{"metadata":{"trusted":true},"cell_type":"markdown","source":"# 0.0. Loading Data"},{"metadata":{"trusted":true},"cell_type":"code","source":"data_types_dict = {'timestamp': 'int64',\n                          'user_id': 'int32',\n                          'content_id': 'int16',\n                          'content_type_id': 'int8',\n                          'answered_correctly':'int8',\n                          'prior_question_elapsed_time': 'float32',\n                          'prior_question_had_explanation': 'boolean'\n                  }","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"import pandas as pd\n\ntreino = pd.read_csv('/kaggle/input/riiid-test-answer-prediction/train.csv',\n                   usecols=[1, 2, 3, 4, 7, 8, 9],\n                   dtype=data_types_dict\n                   )","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"questions_df = pd.read_csv('/kaggle/input/riiid-test-answer-prediction/questions.csv',\n                            usecols=[0, 3],\n                            dtype={'question_id': 'int16',\n                              'part': 'int8'}\n                          )","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# 1.0. Data dimensions"},{"metadata":{"trusted":true},"cell_type":"code","source":"print(f'Number of Rows: {treino.shape[0]}')\nprint(f'Number of Cols: {treino.shape[1]}')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# 1.1. Data Type"},{"metadata":{"trusted":true},"cell_type":"code","source":"treino = treino.astype(data_types_dict)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"treino.dtypes","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# 1.2. Data Missing"},{"metadata":{"trusted":true},"cell_type":"code","source":"treino.isna().sum()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# 2.0. First Feature Engineering"},{"metadata":{"trusted":true},"cell_type":"code","source":"treino = treino.loc[treino.content_type_id == False]\ntreino['tempo_exercicio'] = pd.DataFrame(treino.prior_question_elapsed_time.shift(-1))\ntreino.loc[treino.timestamp == 0, ['prior_question_had_explanation']] = treino.loc[treino.timestamp == 0, ['prior_question_had_explanation']].fillna(False)\ntreino = treino.sort_values(['timestamp'], ascending=True).reset_index(drop = True)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"treino = pd.merge(treino, questions_df, left_on = 'content_id', right_on = 'question_id', how = 'left')\ntreino.part = treino.part - 1","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"treino.drop(['timestamp', 'content_type_id','question_id'], axis=1, inplace=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"elapsed_meanf = treino.prior_question_elapsed_time.mean()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"treino = treino[~treino['prior_question_had_explanation'].isna()]","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# 3.0. Validation Data"},{"metadata":{"trusted":true},"cell_type":"code","source":"validation = pd.DataFrame()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"for i in range(4):\n    last_records = treino.drop_duplicates('user_id', keep = 'last')\n    treino = treino[~treino.index.isin(last_records.index)]\n    validation = validation.append(last_records)\ndel(last_records)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"validation.drop(['tempo_exercicio'], axis=1, inplace=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"elapsed_mean = treino.prior_question_elapsed_time.mean()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# 4.0. Train Data"},{"metadata":{"trusted":true},"cell_type":"code","source":"X = pd.DataFrame()\nfor i in range(15):\n    last_records = treino.drop_duplicates('user_id', keep = 'last')\n    treino = treino[~treino.index.isin(last_records.index)]\n    X = X.append(last_records)\ndel(last_records)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# 5.0. Second Feature Engineering"},{"metadata":{"trusted":true},"cell_type":"code","source":"tempo_medio_estudante = treino[['user_id','tempo_exercicio']].groupby(['user_id']).agg(['mean'])\ntempo_medio_estudante.columns = ['tempo_medio_estudante']\n\ntempo_medio_exercicio = treino[['content_id','tempo_exercicio']].groupby(['content_id']).agg(['mean'])\ntempo_medio_exercicio.columns = ['tempo_medio_exercicio']\n\ntempo_medio_tipo_exercicio = treino[['tempo_exercicio','part']].groupby(['part']).agg(['mean'])\ntempo_medio_tipo_exercicio.columns = ['tempo_medio_tipo_exercicio']\n\nacerto_medio_estudante = treino[['user_id','answered_correctly']].groupby(['user_id']).agg(['mean', 'count'])\nacerto_medio_estudante.columns = ['acerto_medio_estudante', 'count']\n\nmedia_numero_exercicio = acerto_medio_estudante[['acerto_medio_estudante','count']].groupby(['count']).agg(['mean'])\nmedia_numero_exercicio.columns = [\"media_numero_exercicio\"]\n\nacerto_medio_exercicio = treino[['content_id','answered_correctly']].groupby(['content_id']).agg(['mean'])\nacerto_medio_exercicio.columns = [\"acerto_medio_exercicio\"]\n\nacerto_medio_tipo_exercicio = treino[['part','answered_correctly']].groupby(['part']).agg(['mean'])\nacerto_medio_tipo_exercicio.columns = [\"acerto_medio_tipo_exercicio\"]\n\nviu_medio_estudante = treino[['prior_question_had_explanation']].astype('int8').groupby(treino['user_id']).agg(['mean','count'])\nviu_medio_estudante.columns = ['viu_medio_estudante','count_had']\n\nmedia_numero_viu = viu_medio_estudante[['viu_medio_estudante','count_had']].groupby(['count_had']).agg(['mean'])\nmedia_numero_viu.columns = [\"media_numero_viu\"]\n\nviu_medio_exercicio = treino[['prior_question_had_explanation']].astype('int8').groupby(treino['content_id']).agg(['mean'])\nviu_medio_exercicio.columns = [\"viu_medio_exercicio\"]\n\ndel(treino)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X = pd.merge(X, acerto_medio_estudante, on=['user_id'], how=\"left\")\nX = pd.merge(X, tempo_medio_estudante, on=['user_id'], how=\"left\")\nX = pd.merge(X, acerto_medio_exercicio, on=['content_id'], how=\"left\")\nX = pd.merge(X, tempo_medio_exercicio, on=['content_id'], how=\"left\")\nX = pd.merge(X, acerto_medio_tipo_exercicio, on=['part'], how=\"left\")\nX = pd.merge(X, tempo_medio_tipo_exercicio, on=['part'], how=\"left\")\nX = pd.merge(X, viu_medio_estudante, on=['user_id'], how=\"left\")\nX = pd.merge(X, viu_medio_exercicio, on=['content_id'], how=\"left\")\nX = pd.merge(X, media_numero_exercicio, on=['count'], how=\"left\")\nX = pd.merge(X, media_numero_viu, on=['count_had'], how=\"left\")\nX","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"validation = pd.merge(validation, acerto_medio_estudante, on=['user_id'], how=\"left\")\nvalidation = pd.merge(validation, tempo_medio_estudante, on=['user_id'], how=\"left\")\nvalidation = pd.merge(validation, acerto_medio_exercicio, on=['content_id'], how=\"left\")\nvalidation = pd.merge(validation, tempo_medio_exercicio, on=['content_id'], how=\"left\")\nvalidation = pd.merge(validation, acerto_medio_tipo_exercicio, on=['part'], how=\"left\")\nvalidation = pd.merge(validation, tempo_medio_tipo_exercicio, on=['part'], how=\"left\")\nvalidation = pd.merge(validation, viu_medio_estudante, on=['user_id'], how=\"left\")\nvalidation = pd.merge(validation, viu_medio_exercicio, on=['content_id'], how=\"left\")\nvalidation = pd.merge(validation, media_numero_exercicio, on=['count'], how=\"left\")\nvalidation = pd.merge(validation, media_numero_viu, on=['count_had'], how=\"left\")\nvalidation","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from sklearn.preprocessing import LabelEncoder\n\nlb_make = LabelEncoder()\n\nX.prior_question_had_explanation.fillna(False, inplace = True)\nvalidation.prior_question_had_explanation.fillna(False, inplace = True)\n\nvalidation[\"prior_question_had_explanation_enc\"] = lb_make.fit_transform(validation[\"prior_question_had_explanation\"])\nX[\"prior_question_had_explanation_enc\"] = lb_make.fit_transform(X[\"prior_question_had_explanation\"])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"y = X['answered_correctly']\nX = X.drop(['answered_correctly'], axis=1)\n\ny_val = validation['answered_correctly']\nX_val = validation.drop(['answered_correctly'], axis=1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"a = ['acerto_medio_estudante','tempo_medio_estudante', 'acerto_medio_exercicio',\n       'tempo_medio_exercicio','count','prior_question_elapsed_time',\n       'prior_question_had_explanation_enc','part','count_had','viu_medio_estudante',\n       'viu_medio_exercicio','media_numero_exercicio','media_numero_viu',\n      'tempo_medio_tipo_exercicio','acerto_medio_tipo_exercicio']\n\nP = X[a]\n\nP_val = X_val[a]\n\nyp = y\n\nyp_val = y_val","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"P['acerto_medio_estudante'].fillna(acerto_medio_estudante.acerto_medio_estudante.mean(),inplace=True)\nP['acerto_medio_exercicio'].fillna(acerto_medio_exercicio.acerto_medio_exercicio.mean(),inplace=True)\nP['acerto_medio_tipo_exercicio'].fillna(acerto_medio_tipo_exercicio.acerto_medio_tipo_exercicio.mean(),  inplace=True)\nP['tempo_medio_estudante'].fillna(tempo_medio_estudante.tempo_medio_estudante.mean(),inplace = True)\nP['tempo_medio_exercicio'].fillna(tempo_medio_exercicio.tempo_medio_exercicio.mean(),inplace = True)\nP['tempo_medio_tipo_exercicio'].fillna(tempo_medio_tipo_exercicio.tempo_medio_tipo_exercicio.mean(),inplace=True)\nP['media_numero_exercicio'].fillna(media_numero_exercicio.media_numero_exercicio.mean(),inplace=True)\nP['viu_medio_estudante'].fillna(viu_medio_estudante.viu_medio_estudante.mean(),inplace=True)\nP['media_numero_viu'].fillna(media_numero_viu.media_numero_viu.mean(),inplace=True)\nP['viu_medio_exercicio'].fillna(viu_medio_exercicio.viu_medio_exercicio.mean(),inplace=True)\n\n\nP_val['acerto_medio_estudante'].fillna(acerto_medio_estudante.acerto_medio_estudante.mean(),inplace=True)\nP_val['acerto_medio_exercicio'].fillna(acerto_medio_exercicio.acerto_medio_exercicio.mean(),inplace=True)\nP_val['acerto_medio_tipo_exercicio'].fillna(acerto_medio_tipo_exercicio.acerto_medio_tipo_exercicio.mean(),  inplace=True)\nP_val['tempo_medio_estudante'].fillna(tempo_medio_estudante.tempo_medio_estudante.mean(),inplace = True)\nP_val['tempo_medio_exercicio'].fillna(tempo_medio_exercicio.tempo_medio_exercicio.mean(),inplace = True)\nP_val['tempo_medio_tipo_exercicio'].fillna(tempo_medio_tipo_exercicio.tempo_medio_tipo_exercicio.mean(),inplace=True)\nP_val['media_numero_exercicio'].fillna(media_numero_exercicio.media_numero_exercicio.mean(),inplace=True)\nP_val['viu_medio_estudante'].fillna(viu_medio_estudante.viu_medio_estudante.mean(),inplace=True)\nP_val['media_numero_viu'].fillna(media_numero_viu.media_numero_viu.mean(),inplace=True)\nP_val['viu_medio_exercicio'].fillna(viu_medio_exercicio.viu_medio_exercicio.mean(),inplace=True)\n\nP['part'].fillna(4, inplace = True)\nP['count'].fillna(0, inplace = True)\nP['count_had'].fillna(0, inplace = True)\nP['prior_question_elapsed_time'].fillna(elapsed_mean, inplace = True)\nP['prior_question_had_explanation_enc'].fillna(0, inplace = True)\n\nP_val['part'].fillna(4, inplace = True)\nP_val['count'].fillna(0, inplace = True)\nP_val['count_had'].fillna(0, inplace = True)\nP_val['prior_question_elapsed_time'].fillna(elapsed_mean, inplace = True)\nP_val['prior_question_had_explanation_enc'].fillna(0, inplace = True)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# 6.0. model creation"},{"metadata":{"trusted":true},"cell_type":"code","source":"import lightgbm as lgb\n\nparams = {\n'num_leaves': 350,\n'max_bin':700,\n'min_child_weight': 0.03454472573214212,\n'feature_fraction': 0.58,\n'bagging_fraction': 0.58,\n'objective': 'binary',\n'max_depth': -1,\n'learning_rate': 0.05,\n\"boosting_type\": \"gbdt\",\n\"bagging_seed\": 11,\n\"metric\": 'auc',\n\"verbosity\": -1,\n'reg_alpha': 0.3899927210061127,\n'reg_lambda': 0.6485237330340494,\n'random_state': 47\n}\n\nlgb_train = lgb.Dataset(P, yp)\nlgb_eval = lgb.Dataset(P_val, yp_val, reference=lgb_train)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model = lgb.train(\n    params, lgb_train,\n    valid_sets=[lgb_train, lgb_eval],\n    verbose_eval=50,\n    num_boost_round=10000,\n    early_stopping_rounds=12\n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import numpy as np\ny_pred = model.predict(P_val)\ny_true = np.array(yp_val)\n\ny_predc = model.predict(P)\ny_truec = np.array(yp)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from sklearn.metrics import roc_auc_score\nfrom sklearn.metrics import classification_report\nprint(roc_auc_score(y_true, y_pred))\nprint(classification_report(y_true, y_pred.round()))\n\nprint(roc_auc_score(y_truec, y_predc))\nprint(classification_report(y_truec, y_predc.round()))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import matplotlib.pyplot as plt\nimport seaborn as sns","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"lgb.plot_importance(model)\nplt.show()","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}