{"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 pandas as pd\nimport numpy as np\nfrom sklearn.metrics import roc_auc_score, auc, roc_curve\nfrom sklearn.preprocessing import LabelEncoder, OneHotEncoder\nfrom  sklearn.tree import DecisionTreeClassifier\nfrom sklearn.ensemble import RandomForestClassifier\nfrom  sklearn.model_selection import train_test_split, KFold\nimport matplotlib.pyplot as plt\nfrom sklearn.linear_model import LogisticRegression\nfrom sklearn import svm\nfrom sklearn import neighbors\nfrom sklearn.linear_model import SGDClassifier\nfrom sklearn.neural_network import MLPClassifier\nfrom sklearn.metrics import precision_recall_curve\nfrom sklearn.metrics import f1_score\nimport lightgbm as lgb\nfrom IPython.display import display\nfrom sklearn.preprocessing import StandardScaler\nimport joblib\nimport gc\nfrom tqdm import tqdm\nfrom patsy import dmatrices\nimport statsmodels.api as sm\nfrom scipy.signal import savgol_filter\nfrom statsmodels.stats.outliers_influence import variance_inflation_factor","metadata":{"executionInfo":{"elapsed":3410,"status":"ok","timestamp":1609530288930,"user":{"displayName":"vivek joshi","photoUrl":"","userId":"14701461628611770995"},"user_tz":-330},"id":"nxRwZpnCtoff","outputId":"66e8c6d2-99db-4799-bffd-5c1103ea903b","execution":{"iopub.status.busy":"2022-06-04T07:32:30.306821Z","iopub.execute_input":"2022-06-04T07:32:30.307218Z","iopub.status.idle":"2022-06-04T07:32:33.641545Z","shell.execute_reply.started":"2022-06-04T07:32:30.307137Z","shell.execute_reply":"2022-06-04T07:32:33.640446Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = pd.read_csv('../input/riiid-test-answer-prediction/train.csv',\n                   usecols=[0, 2, 3, 4, 5, 7, 8, 9],\n                   dtype={\n                          'row_id': 'int32',\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                          },\n                   )\n\nlectures = pd.read_csv('../input/riiid-test-answer-prediction/lectures.csv',\n                       usecols=[0,3],\n                   dtype={\n                          'lecture_id': 'int16',\n                          'type_of': 'object',\n                          }\n                        )\nlectures = pd.get_dummies(lectures, columns=['type_of'])\n\nquestions = pd.read_csv('../input/riiid-test-answer-prediction/questions.csv',                         \n                        usecols=[0, 1, 2, 3, 4],\n                           dtype={'question_id': 'int16',\n                                  'part': 'int8',\n                                  'bundle_id': 'int8',\n                                  'correct_answer': 'int8',\n                                  'tags': 'object'}\n                          )\ntrain = pd.merge(train, questions, left_on = 'content_id', right_on = 'question_id', how = 'left')\n\ntrain = train[train.content_type_id == False]\ntrain = train[train.answered_correctly!= -1 ]\ntrain.drop(['content_type_id'], axis=1, inplace=True)\ntrain.set_index('user_id', inplace=True)\ntrain.dropna(inplace=True)\n\ntest = pd.read_csv('../input/riiid-test-answer-prediction/example_test.csv')","metadata":{"executionInfo":{"elapsed":169723,"status":"ok","timestamp":1609530455694,"user":{"displayName":"vivek joshi","photoUrl":"","userId":"14701461628611770995"},"user_tz":-330},"id":"TQ_CKrPstys_","outputId":"27b425da-4e06-45aa-a2ee-e5395bc45b5d","execution":{"iopub.status.busy":"2022-06-04T07:32:41.365921Z","iopub.execute_input":"2022-06-04T07:32:41.366304Z","iopub.status.idle":"2022-06-04T07:36:57.562572Z","shell.execute_reply.started":"2022-06-04T07:32:41.366273Z","shell.execute_reply":"2022-06-04T07:36:57.561389Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.head(2)","metadata":{"executionInfo":{"elapsed":169723,"status":"ok","timestamp":1609530456888,"user":{"displayName":"vivek joshi","photoUrl":"","userId":"14701461628611770995"},"user_tz":-330},"id":"pO1tCKnle8aB","outputId":"e4e336d4-ab29-44e2-ad1d-89bfb312c934","execution":{"iopub.status.busy":"2022-06-04T07:36:58.990977Z","iopub.execute_input":"2022-06-04T07:36:58.991285Z","iopub.status.idle":"2022-06-04T07:36:59.012858Z","shell.execute_reply.started":"2022-06-04T07:36:58.991257Z","shell.execute_reply":"2022-06-04T07:36:59.012011Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"columns = ['row_id','content_id','task_container_id','answered_correctly','question_id','bundle_id','part',\n           'prior_question_had_explanation','correct_answer',\n           ]\n\ndf = train[columns].groupby(level='user_id').tail(50)\n\ndf['user_id'] = df.index\nencoder = LabelEncoder()\nscaler = StandardScaler()\ndf.prior_question_had_explanation = encoder.fit_transform(df.prior_question_had_explanation)\ndummies = pd.get_dummies(df[['correct_answer']], columns=['correct_answer'])\ndf = pd.concat([df,dummies], axis=1)\n\n# content_id\nresults_c = df[['content_id','answered_correctly']].groupby(['content_id']).agg(['mean'])\nresults_c.columns = ['c_mean']\ndf = pd.merge(df, results_c, on=['content_id'], how=\"left\")\n\nresults_ex_c = df[['prior_question_had_explanation','content_id']].groupby(['content_id']).agg(['mean'])\nresults_ex_c.columns = ['c_ex_mean']\ndf = pd.merge(df, results_ex_c, on=['content_id'], how=\"left\")\n\nc_df = pd.merge(results_c,results_ex_c,on='content_id',how='left')\n\n# user_id\nresults_u = df[['user_id','answered_correctly']].groupby(['user_id']).agg(['mean'])\nresults_u.columns = ['u_mean']\ndf = pd.merge(df, results_u, on=['user_id'], how=\"left\")\n\nresults_ex_u = df[['prior_question_had_explanation','user_id']].groupby(['user_id']).agg(['mean'])\nresults_ex_u.columns = ['u_ex_mean']\ndf = pd.merge(df, results_ex_u, on=['user_id'], how=\"left\")\n\nresults_an_u = df[['correct_answer_0.0','correct_answer_2.0','correct_answer_3.0','correct_answer_1.0','user_id']].groupby(['user_id']).agg(['mean'])\nresults_an_u.columns = ['u_correct_answer_0.0','u_correct_answer_2.0','u_correct_answer_3.0','u_correct_answer_1.0']\ndf = pd.merge(df, results_an_u, on=['user_id'], how=\"left\")\n\nu_part = df[['user_id','part']].groupby(['user_id']).agg(['mean'])\nu_part.columns = ['u_part']\ndf = pd.merge(df, u_part, on=['user_id'], how=\"left\")\n\nu_df = pd.merge(results_u,results_ex_u,on='user_id',how='left')\nu_df = pd.merge(u_df,u_part,on='user_id',how='left')\nu_df = pd.merge(u_df,results_an_u,on='user_id',how='left')\n\ndf.dropna(inplace=True)","metadata":{"executionInfo":{"elapsed":49704,"status":"ok","timestamp":1609531756163,"user":{"displayName":"vivek joshi","photoUrl":"","userId":"14701461628611770995"},"user_tz":-330},"id":"hacMcE99z_QG","execution":{"iopub.status.busy":"2022-06-04T07:36:59.014456Z","iopub.execute_input":"2022-06-04T07:36:59.014783Z","iopub.status.idle":"2022-06-04T07:37:43.381979Z","shell.execute_reply.started":"2022-06-04T07:36:59.014755Z","shell.execute_reply":"2022-06-04T07:37:43.381026Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"del c_df\ndel u_df\ngc.collect()","metadata":{"executionInfo":{"elapsed":11219,"status":"ok","timestamp":1609531759700,"user":{"displayName":"vivek joshi","photoUrl":"","userId":"14701461628611770995"},"user_tz":-330},"id":"q686ZlXjkyCn","execution":{"iopub.status.busy":"2022-06-04T07:37:43.383331Z","iopub.execute_input":"2022-06-04T07:37:43.383676Z","iopub.status.idle":"2022-06-04T07:37:43.529932Z","shell.execute_reply.started":"2022-06-04T07:37:43.383627Z","shell.execute_reply":"2022-06-04T07:37:43.528916Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.head(2)","metadata":{"executionInfo":{"elapsed":10840,"status":"ok","timestamp":1609531759709,"user":{"displayName":"vivek joshi","photoUrl":"","userId":"14701461628611770995"},"user_tz":-330},"id":"-NvkbJ5GbV6K","outputId":"d1c35aa9-0bba-4fbe-c47f-541dfde1e250","execution":{"iopub.status.busy":"2022-06-04T07:37:43.531474Z","iopub.execute_input":"2022-06-04T07:37:43.532065Z","iopub.status.idle":"2022-06-04T07:37:43.560382Z","shell.execute_reply.started":"2022-06-04T07:37:43.532024Z","shell.execute_reply":"2022-06-04T07:37:43.559369Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print('df label distribution:\\n', df.answered_correctly.value_counts())\nprint('df size\\n',df.shape[0]/train.shape[0])\nprint('df:train user_id\\n',df.user_id.nunique()/train.index.nunique()) \nprint('df:train content_id\\n',round(df.content_id.nunique()/train.content_id.nunique(),2))\nprint('df:train task_container_id\\n',df.task_container_id.nunique()/train.task_container_id.nunique())","metadata":{"executionInfo":{"elapsed":13044,"status":"ok","timestamp":1609531762662,"user":{"displayName":"vivek joshi","photoUrl":"","userId":"14701461628611770995"},"user_tz":-330},"id":"bvCYHPUM0j1J","outputId":"8aa02255-3c2f-4616-c4a5-9cdd308c742d","execution":{"iopub.status.busy":"2022-06-04T07:37:43.563323Z","iopub.execute_input":"2022-06-04T07:37:43.563716Z","iopub.status.idle":"2022-06-04T07:37:45.928284Z","shell.execute_reply.started":"2022-06-04T07:37:43.563683Z","shell.execute_reply":"2022-06-04T07:37:45.927344Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"del train\ngc.collect()","metadata":{"executionInfo":{"elapsed":12427,"status":"ok","timestamp":1609531762663,"user":{"displayName":"vivek joshi","photoUrl":"","userId":"14701461628611770995"},"user_tz":-330},"id":"QYZt5a7d6Lr1","execution":{"iopub.status.busy":"2022-06-04T07:38:07.699707Z","iopub.execute_input":"2022-06-04T07:38:07.700075Z","iopub.status.idle":"2022-06-04T07:38:07.829391Z","shell.execute_reply.started":"2022-06-04T07:38:07.700044Z","shell.execute_reply":"2022-06-04T07:38:07.828752Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\n\nkf = KFold(n_splits=5, random_state=42, shuffle=True)\ndf[\"fold\"] = -1\nfor fold_id, (train_index, val_index) in enumerate(kf.split(df.row_id)):\n    df.iloc[val_index, -1] = fold_id\n\nuse_fold = 2\n\nXt = df[df.fold!=use_fold]\nXv = df.query(\"fold == @use_fold\")\n# del df\n\nprint(\"[fold {}] train: {}, val: {}\".format(use_fold, len(Xt), len(Xv)))\nYt = Xt[[\"answered_correctly\"]] \nYv = Xv[[\"answered_correctly\"]]\n\nscaler = StandardScaler(copy=False)\n\nXt = Xt[['c_mean',\n         'u_mean',\n         'c_ex_mean',\n         'u_ex_mean',\n         'u_correct_answer_0.0','u_correct_answer_2.0','u_correct_answer_3.0','u_correct_answer_1.0',\n         'u_part',\n        ]]\n\nXv = Xv[['c_mean',\n         'u_mean',\n         'c_ex_mean',\n         'u_ex_mean',\n         'u_correct_answer_0.0','u_correct_answer_2.0','u_correct_answer_3.0','u_correct_answer_1.0',\n         'u_part',\n        ]]\n\nprint('Columns:\\n',Xt.columns)\n\nprint('scaling..')\nXt = scaler.fit_transform(Xt)\nXv = scaler.fit_transform(Xv)\n\nclassifier = LogisticRegression(penalty='l2', \n                         dual=False, \n                         tol=0.0001, \n                         C=1.0, \n                         fit_intercept=True, \n                         intercept_scaling=1, \n                         class_weight=None, \n                         random_state=1, \n                         solver='lbfgs',     #'newton-cg', 'lbfgs', 'liblinear', 'sag', 'saga'\n                         max_iter=1000, \n                         multi_class='auto', \n                         verbose=1, \n                         warm_start=False, \n                         n_jobs=-1, \n                         l1_ratio=None)\n\n# classifier = svm.SVC(C=1.0, \n#                      kernel='rbf', #'linear', 'poly', 'rbf', 'sigmoid', 'precomputed'\n#                      degree=1, \n#                      gamma='auto', \n#                      coef0=1.0, \n#                      shrinking=True, \n#                      probability=True, \n#                      tol=0.001, \n#                      cache_size=200, \n#                      class_weight=None, \n#                      verbose=1, \n#                      max_iter=5, \n#                      decision_function_shape='ovr', \n#                      break_ties=False, \n#                      random_state=1)\n\n# classifier = neighbors.KNeighborsClassifier(n_neighbors=1000,  \n#                                             weights='uniform',\n#                                             algorithm='auto',   \n#                                             leaf_size=5, \n#                                             p=2,   \n#                                             metric='minkowski', \n#                                             metric_params=None, \n#                                             n_jobs=-1, )\n\n\n# classifier = MLPClassifier(hidden_layer_sizes=(10), \n#                            activation='relu', \n#                            solver='adam', \n#                            alpha=0.0001, \n#                            batch_size='auto', \n#                            learning_rate='constant', \n#                            learning_rate_init=0.001, \n#                            power_t=0.5, \n#                            max_iter=200, \n#                            shuffle=False, \n#                            random_state=42, \n#                            tol=0.0001, \n#                            verbose=False, \n#                            warm_start=False, \n#                            momentum=0.9, \n#                            nesterovs_momentum=True, \n#                            early_stopping=False, \n#                            validation_fraction=0.1, \n#                            beta_1=0.9, \n#                            beta_2=0.999, \n#                            epsilon=1e-08, \n#                            n_iter_no_change=10, \n#                            max_fun=15000)\n\n# classifier = RandomForestClassifier(n_estimators=10, \n#                                     criterion='gini', \n#                                     max_depth=5, \n#                                     min_samples_split=2, \n#                                     min_samples_leaf=1, \n#                                     min_weight_fraction_leaf=0.0, \n#                                     max_features='auto', \n#                                     max_leaf_nodes=None, \n#                                     min_impurity_decrease=0.0, \n#                                     min_impurity_split=None, \n#                                     bootstrap=True, \n#                                     oob_score=True, \n#                                     n_jobs=-1, \n#                                     random_state=42, \n#                                     verbose=1, \n#                                     warm_start=False, \n#                                     class_weight=None, \n#                                     ccp_alpha=0.0, \n#                                     max_samples=None )\n\n# params = {\n#     'objective': 'binary', \n#     'max_bin': 1000,\n#     'learning_rate': 0.1,\n#     'num_leaves': 10\n# }\n\n# lgb_train = lgb.Dataset(Xt, Yt)\n# lgb_eval = lgb.Dataset(Xv, Yv, reference=lgb_train)\n\n# classifier = lgb.train(\n#     params, lgb_train,\n#     valid_sets=[lgb_train, lgb_eval],\n#     verbose_eval=10,\n#     num_boost_round=500,\n#     early_stopping_rounds=10\n# )\n\nprint('training..')\nclassifier.fit(Xt, Yt)","metadata":{"executionInfo":{"elapsed":67288,"status":"ok","timestamp":1609531818529,"user":{"displayName":"vivek joshi","photoUrl":"","userId":"14701461628611770995"},"user_tz":-330},"id":"L--SPpMmEOjp","outputId":"41d22650-98b8-440f-b964-d758703520f4","execution":{"iopub.status.busy":"2022-06-04T07:42:31.076986Z","iopub.execute_input":"2022-06-04T07:42:31.077923Z","iopub.status.idle":"2022-06-04T07:43:13.653090Z","shell.execute_reply.started":"2022-06-04T07:42:31.077870Z","shell.execute_reply":"2022-06-04T07:43:13.651992Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"lr_probs = classifier.predict_proba(Xv)\nlr_probs = lr_probs[:, 1]\nlr_auc = roc_auc_score(Yv, lr_probs)\nprint('Logistic: ROC AUC=%.3f' % (lr_auc))\nlr_fpr, lr_tpr, _ = roc_curve(Yv, lr_probs)\nplt.plot(lr_fpr, lr_tpr, marker='.', label='Logistic', color='darkorange', lw=1)\nplt.xlabel('False Positive Rate')\nplt.ylabel('True Positive Rate')\nplt.legend()\nplt.show()","metadata":{"executionInfo":{"elapsed":70106,"status":"ok","timestamp":1609531822147,"user":{"displayName":"vivek joshi","photoUrl":"","userId":"14701461628611770995"},"user_tz":-330},"id":"0W9dU6Mn3tmA","outputId":"7b8eaf83-f76d-4a56-ccc5-644e82eb84b0","execution":{"iopub.status.busy":"2022-06-04T07:43:13.655086Z","iopub.execute_input":"2022-06-04T07:43:13.655517Z","iopub.status.idle":"2022-06-04T07:43:17.868105Z","shell.execute_reply.started":"2022-06-04T07:43:13.655474Z","shell.execute_reply":"2022-06-04T07:43:17.867392Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# predict class values\nyhat = classifier.predict(Xv)\nlr_precision, lr_recall, _ = precision_recall_curve(Yv, lr_probs)\nlr_f1, lr_auc = f1_score(Yv, yhat), auc(lr_recall, lr_precision)\n# summarize scores\nprint('Logistic: f1=%.3f auc=%.3f' % (lr_f1, lr_auc))\n# plot the precision-recall curves\nplt.plot(lr_recall, lr_precision, marker='.', label='Logistic', color='darkorange', lw=1)\n# axis labels\nplt.xlabel('Recall')\nplt.ylabel('Precision')\n# show the legend\nplt.legend()\n# show the plot\nplt.show()","metadata":{"id":"VE-JaWo4zGkK","execution":{"iopub.status.busy":"2022-06-04T07:44:36.882773Z","iopub.execute_input":"2022-06-04T07:44:36.883209Z","iopub.status.idle":"2022-06-04T07:44:42.768958Z","shell.execute_reply.started":"2022-06-04T07:44:36.883166Z","shell.execute_reply":"2022-06-04T07:44:42.767970Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"id":"7ZxX079lhizk"},"execution_count":null,"outputs":[]}]}