{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import optuna\nimport lightgbm as lgb\nimport xgboost as xgb\nfrom catboost import CatBoostClassifier\nfrom  sklearn.tree import DecisionTreeClassifier\nfrom  sklearn.model_selection import train_test_split\nimport operator\nimport random\n\n# visualize\nimport matplotlib.pyplot as plt\nimport matplotlib.style as style\nimport seaborn as sns\nfrom matplotlib import pyplot\nfrom matplotlib.ticker import ScalarFormatter\nsns.set_context(\"talk\")\nstyle.use('fivethirtyeight')\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport riiideducation\nimport dask.dataframe as dd\nimport  pandas as pd\nimport numpy as np\nfrom sklearn.metrics import roc_auc_score\nimport riiideducation\n\nenv = riiideducation.make_env()\n","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"data= pd.read_csv('/kaggle/input/riiid-test-answer-prediction/train.csv',\n                nrows=10**7, dtype={'timestamp': 'int64', 'user_id': 'int32' ,\n                                                  'content_id': 'int16','content_type_id': 'int8',\n                                    'task_container_id':'int16','user_answer':'int8',\n                                                  'answered_correctly':'int8',\n                                                  'prior_question_elapsed_time': 'float32',\n                                                  'prior_question_had_explanation': 'boolean'}\n              )","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(data.shape)\ndata.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"## removing letures data\ndata = data[data['content_type_id']==0]\nprint(data.shape)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"## sort by timestamp \ndata = data.sort_values(['user_id','timestamp'])\ndata.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"user_df = data[['user_id','answered_correctly']].groupby(['user_id']).agg(['mean', 'sum', 'count'])\nuser_df.columns = ['answered_correctly_user', 'sum_user', 'count_user']\nuser_df.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"content_df = data[['content_id','answered_correctly']].groupby(['content_id']).agg(['mean', 'sum', 'count'])\ncontent_df.columns = ['answered_correctly_content', 'sum_content', 'count_content']\ncontent_df.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#reading in question df\nquestions_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":{"trusted":true},"cell_type":"code","source":"questions_df","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"questions_df['part'].value_counts()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"questions_df = questions_df.merge(content_df,\n                                  left_on = 'question_id', right_on = 'content_id', how = 'left')\nquestions_df","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"bundle_df = questions_df.groupby('bundle_id')\nbundle_df = bundle_df.agg({'sum_content': 'sum', 'count_content': 'sum'}).copy()\nbundle_df.columns = ['bundle_rignt_answers', 'bundle_questions_asked']\nbundle_df['bundle_accuracy'] = bundle_df['bundle_rignt_answers'] / bundle_df['bundle_questions_asked']\nbundle_df","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"part_df = questions_df.groupby('part')\npart_df = part_df.agg({'sum_content': 'sum', 'count_content': 'sum'}).copy()\npart_df.columns = ['part_rignt_answers', 'part_questions_asked']\npart_df['part_accuracy'] = part_df['part_rignt_answers'] / part_df['part_questions_asked']\npart_df","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"data = data.merge(user_df, how = 'left', on = 'user_id')\ndata = data.merge(questions_df, how = 'left', left_on = 'content_id', right_on = 'question_id')\ndata = data.merge(bundle_df, how = 'left', on = 'bundle_id')\ndata = data.merge(part_df, how = 'left', on = 'part')\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"data.head()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# # Null Value Handling"},{"metadata":{"trusted":true},"cell_type":"code","source":"data.columns[data.isna().any()].tolist()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"data['prior_question_elapsed_time'].fillna(data.groupby('user_id')\n                                           ['prior_question_elapsed_time'].transform('mean'),inplace=True)\ndata['prior_question_elapsed_time'].fillna(data['prior_question_elapsed_time'].mean(),inplace=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"data['prior_question_had_explanation'].fillna(data['prior_question_had_explanation'].mode()[0],inplace=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"data.columns[data.isna().any()].tolist()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"data.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from sklearn.preprocessing import LabelEncoder\n\nlb_make = LabelEncoder()\n\ndata[\"prior_question_had_explanation\"] = lb_make.fit_transform(data[\"prior_question_had_explanation\"])\ndata.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"##  creating validation set\nvalidation = pd.DataFrame()\nfor i in range(15):\n    last_records = data.drop_duplicates('user_id', keep = 'last')\n    data = data[~data.index.isin(last_records.index)]\n    validation = validation.append(last_records)\nprint(len(data) , len(validation))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# X = pd.DataFrame()\n# for i in range(15):\n#     last_records = data.drop_duplicates('user_id', keep = 'last')\n#     data = data[~data.index.isin(last_records.index)]\n#     X = X.append(last_records)\n# print(len(data),len(X))\n\nX = data.sample(n=2000000)\nprint(len(data),len(X))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(data.answered_correctly.mean() , X.answered_correctly.mean())","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"id(data),id(X)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"del data \nimport gc\ngc.collect()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X.head()","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":"features = ['timestamp', 'prior_question_elapsed_time','prior_question_had_explanation',\n            'answered_correctly_user', 'sum_user', 'count_user', 'part','answered_correctly_content',\n       'sum_content', 'count_content', 'bundle_rignt_answers',\n       'bundle_questions_asked', 'bundle_accuracy', 'part_rignt_answers',\n            'part_questions_asked', 'part_accuracy']\n\n\n#features = ['answered_correctly_user', 'answered_correctly_content', 'sum_user', 'count_user',\n  #     'prior_question_elapsed_time','prior_question_had_explanation', 'part']","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X = X[features]\nX_val = X_val[features]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import lightgbm as lgb\n\nparams = {\n    'objective': 'binary',\n    'max_bin': 700,\n    'learning_rate': 0.0175,\n    'num_leaves': 80,\n    'metric':'auc'\n}\n\nlgb_train = lgb.Dataset(X, y, categorical_feature = ['part', 'prior_question_had_explanation'])\nlgb_eval = lgb.Dataset(X_val, y_val, categorical_feature = ['part', 'prior_question_had_explanation'], reference=lgb_train)\n\nmodel = 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)\n\ny_pred = model.predict(X_val)\ny_true = np.array(y_val)\nroc_auc_score(y_true, y_pred)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# import lightgbm as lgb\n\n# params = {\n#     'objective': 'binary',\n#     'max_bin': 700,\n#     'learning_rate': 0.0175,\n#     'num_leaves': 80,\n#     'metric':'auc'\n# }\n\n# lgb_train = lgb.Dataset(X, y, categorical_feature = ['part', 'prior_question_had_explanation'])\n# lgb_eval = lgb.Dataset(X_val, y_val, categorical_feature = ['part', 'prior_question_had_explanation'], reference=lgb_train)\n\n# 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# )\n\n# y_pred = model.predict(X_val)\n# y_true = np.array(y_val)\n# roc_auc_score(y_true, y_pred)","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":{"trusted":true},"cell_type":"code","source":"iter_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    test_df = test_df.merge(user_df, how = 'left', on = 'user_id')\n    test_df = test_df.merge(questions_df, how = 'left', left_on = 'content_id', right_on = 'question_id')\n    test_df = test_df.merge(bundle_df, how = 'left', on = 'bundle_id')\n    test_df = test_df.merge(part_df, how = 'left', on = 'part')\n    \n    test_df['prior_question_elapsed_time'].fillna(test_df.groupby('user_id')\n                                           ['prior_question_elapsed_time'].transform('mean'),inplace=True)\n    test_df['prior_question_elapsed_time'].fillna(test_df['prior_question_elapsed_time'].mean(),inplace=True)\n    test_df['prior_question_had_explanation'].fillna(test_df['prior_question_had_explanation'].mode()[0],inplace=True)\n    test_df.fillna(value = -1, inplace = True)\n    \n    test_df[\"prior_question_had_explanation\"] = lb_make.fit_transform(test_df[\"prior_question_had_explanation\"])\n\n    test_df['answered_correctly'] =  model.predict(test_df[features])\n    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":"","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}