{"cells":[{"metadata":{"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)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (b|y 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":{"trusted":true},"cell_type":"code","source":"import numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nfrom sklearn.model_selection import StratifiedKFold,KFold\n\nimport lightgbm as lgb\nfrom sklearn.metrics import roc_auc_score","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# %%time\n\n# # reading the dataset from raw csv file\n# import datatable as dt\n\n# dt.fread(\"train.csv\").to_jay(\"train.jay\")\n\n# train_df = dt.fread(\"train.jay\").to_pandas()\n\n# print(Fore.YELLOW + 'Training data shape: ',Style.RESET_ALL,train_df.shape)\n# train_df\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df = pd.read_csv(\n    '../input/riiid-test-answer-prediction/train.csv', \n    low_memory=False, \n    nrows=10**6, \n    dtype={\n        '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    }\n)\nexpTest = pd.read_csv(\"../input/riiid-test-answer-prediction/example_test.csv\")\nquestions=pd.read_csv(\"../input/riiid-test-answer-prediction/questions.csv\")\nlectures=pd.read_csv(\"../input/riiid-test-answer-prediction/lectures.csv\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df['user_id'].nunique()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df.nunique()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"lectures","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"questions","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_lect = train_df[train_df['content_type_id']==1]\ntrain_ques = train_df[train_df['content_type_id']==0]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_lect.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_ques.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# train_lect = pd.merge(train_lect,lectures,left_on='content_id',right_on='lecture_id',how='left')\ntrain_ques = pd.merge(train_ques,questions,left_on='content_id',right_on='question_id',how='left')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#Creating folds\nkf = KFold()\ntrain_ques.loc[:,'fold'] = -1\nfor fold,(trn_idx,val_idx) in enumerate(kf.split(train_ques,train_ques['answered_correctly'].values)):\n    train_ques.loc[val_idx,'fold'] = fold","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_ques.nunique()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_ques[\"answered_correctly\"].value_counts()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_ques['task_container_id'].nunique()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"elapsed_mean = train_ques['prior_question_elapsed_time'].mean()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_ques['prior_question_had_explanation'].fillna(0,inplace=True)\ntrain_ques['prior_question_had_explanation']=train_ques['prior_question_had_explanation'].astype(int)\ntrain_ques['prior_question_elapsed_time'].fillna(elapsed_mean,inplace=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_ques.isna().sum()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_ques.columns","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_ques.sample(10)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"questions\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def arrangeGroup(group,prefix):\n    group=group.reset_index()\n    cols = [prefix.join(x).strip() for x in group.columns.values]\n    group =pd.DataFrame(group.to_records()).drop(columns=['index'])\n    group.columns=cols\n    group.reset_index(inplace=True)\n    group=group.drop(columns='index')\n    return group","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def targetEncodingUser():\n    # User aggs\n    aggs= {\n        \"prior_question_elapsed_time\":[\"mean\",\"max\",\"std\"],\n        \"user_id\":\"size\",\n#         \"timestamp\":\"var\",\n        \"answered_correctly\":[\"mean\",\"sum\",\"skew\"]\n    }\n    group_user = train_ques.groupby(by=\"user_id\").agg(aggs)\n    group_user = arrangeGroup(group_user,'_user_')\n#     group_user=group_user.reset_index()\n#     cols = [\" \".join(x).strip() for x in group_user.columns.values]\n#     group_user =pd.DataFrame(group_user.to_records()).drop(columns=['index'])\n#     group_user.columns=cols\n    return group_user","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def targetEncodingQuest():\n    quest_aggs = {\n    'answered_correctly' :[\"count\",\"mean\"],\n#     'user_answer':lambda x:x.value_counts().index[0]\n    \"prior_question_elapsed_time\":[\"mean\",\"skew\",\"std\"]\n    }\n    bundle_aggs = {\n        'answered_correctly' :[\"count\",\"mean\"],\n        \"prior_question_elapsed_time\":[\"mean\",\"skew\"]\n    }\n    group_quest = train_ques.groupby(by=\"question_id\").agg(quest_aggs)\n    group_bundle = train_ques.groupby(by=\"bundle_id\").agg(bundle_aggs)\n    group_quest  = arrangeGroup(group_quest,'_quest_')\n    group_bundle = arrangeGroup(group_bundle,'_bundle_')\n#     group_quest=group_quest.reset_index()\n#     cols = [' '.join(x).strip() for x in group_quest.columns.values]\n#     group_quest =pd.DataFrame(group_quest.to_records()).drop(columns=['index'])\n#     group_quest.columns=cols\n#     group_quest.reset_index(inplace=True)\n#   group_quest.columns=['question_id','nbAnswered_correctlyQuest','meanAnswered_correctlyQuest','user_answerFreq']\n    \n    \n    return group_quest,group_bundle","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def targetEncodingContent():\n    content_aggs = {\n    'answered_correctly' :[\"count\",\"mean\"],\n    }\n\n    group_content = train_ques.groupby(by=\"content_id\").agg(content_aggs)\n    group_content  = arrangeGroup(group_content,'_content_')\n    \n    return group_content","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def targetEncodingContentUser():\n    contentUser_aggs = {\n    'answered_correctly' :[\"count\",\"mean\"],\n    }\n\n    group_contentUser = train_ques.groupby(by=[\"user_id\",\"content_id\"]).agg(contentUser_aggs)\n    group_contentUser  = arrangeGroup(group_contentUser,'_contentUser_')\n    \n    return group_contentUser","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"%%time\ngroup_quest,group_bundle= targetEncodingQuest()\ngroup_user= targetEncodingUser()\ngroup_content = targetEncodingContent()\ngroup_contentUser = targetEncodingContentUser()\n\ngroup_user['user_id_user_'] = group_user['user_id_user_'].astype(np.int32)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"group_contentUser","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"group_quest.dtypes","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_ques.dtypes","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"del(train_df)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"dd = train_ques.copy()\ndd=pd.merge(dd,group_quest,left_on='question_id',right_on=\"question_id_quest_\",how='left')\ndd=pd.merge(dd,group_bundle,left_on='bundle_id',right_on=\"bundle_id_bundle_\",how='left')\n\ndd=pd.merge(dd,group_user,left_on='user_id',right_on='user_id_user_',how='left')\ndd=pd.merge(dd,group_content,left_on='content_id',right_on='content_id_content_',how='left')\n\n# dd=pd.merge(dd,group_contentUser,left_on=['user_id','content_id'],right_on=['user_id_contentUser_',\"content_id_contentUser_\"],how='left')\n\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"dd.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"dd.columns\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"todel = ['row_id','user_id','content_type_id','content_id','task_container_id', 'user_answer', 'answered_correctly','question_id', 'bundle_id', 'correct_answer', 'part', 'tags', 'fold',\n       'index']","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"cols = list(set(list(dd.columns)) - set(list(todel)))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"cols","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"len(cols)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"del dd","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# cols =['timestamp',\n#        'prior_question_elapsed_time', 'prior_question_had_explanation',\n#         'nbAnswered_correctlyQuest', 'meanAnswered_correctlyQuest',\n#        'user_answerFreq', 'prior_question_elapsed_time mean',\n#        'prior_question_elapsed_time max', 'prior_question_elapsed_time median',\n#        'prior_question_elapsed_time std', 'user_id size', 'timestamp var',\n#        'answered_correctly size', 'answered_correctly mean',\n#        'answered_correctly sum', 'answered_correctly skew',\n#        'answered_correctly std', 'answered_correctly median']","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"params = {'num_leaves': 32,\n          'max_bin': 300,\n          'objective': 'binary',\n          'max_depth': 13,\n          'learning_rate': 0.03,\n          \"boosting_type\": \"gbdt\",\n          \"metric\": 'auc',\n         }\n\n\n# params = {\n#     'objective': 'binary',\n#     'max_bin': 700,\n#     'learning_rate': 0.0175,\n#     'num_leaves': 80\n# }\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#Training\nfeature_importance=pd.DataFrame()\ndef run(fold,feature_importance):\n    clf = lgb.LGBMClassifier(**params,n_estimators=700)\n    df_train = train_ques[train_ques['fold']==k]\n    df_val = train_ques[train_ques['fold']!=k]\n    \n    \n    df_train=pd.merge(df_train,group_quest,left_on='question_id',right_on=\"question_id_quest_\",how='left')\n    df_train=pd.merge(df_train,group_bundle,left_on='bundle_id',right_on=\"bundle_id_bundle_\",how='left')\n    df_train=pd.merge(df_train,group_user,left_on='user_id',right_on='user_id_user_',how='left')\n    df_train=pd.merge(df_train,group_content,left_on='content_id',right_on='content_id_content_',how='left')\n#     df_train=pd.merge(df_train,group_contentUser,left_on=['user_id','content_id'],right_on=['user_id_contentUser_',\"content_id_contentUser_\"],how='left')\n\n    df_val=pd.merge(df_val,group_quest,left_on='question_id',right_on=\"question_id_quest_\",how='left')\n    df_val=pd.merge(df_val,group_bundle,left_on='bundle_id',right_on=\"bundle_id_bundle_\",how='left')\n    df_val=pd.merge(df_val,group_user,left_on='user_id',right_on='user_id_user_',how='left')    \n    df_val=pd.merge(df_val,group_content,left_on='content_id',right_on='content_id_content_',how='left')\n#     df_val=pd.merge(df_val,group_contentUser,left_on=['user_id','content_id'],right_on=['user_id_contentUser_',\"content_id_contentUser_\"],how='left')\n\n    X_train = df_train.drop(columns=\"answered_correctly\")[cols]\n    y_train = df_train['answered_correctly'].values\n    print(X_train.shape)\n    X_val = df_val.drop(columns=\"answered_correctly\")[cols]\n    y_val = df_val['answered_correctly'].values\n    \n    \n    clf.fit(X_train,y_train,eval_set=[(X_train,y_train),(X_val,y_val)],eval_metric='auc',verbose=1000, early_stopping_rounds=20)\n    preds = clf.predict_proba(X_val)[:,1]\n    score = roc_auc_score(y_val,preds)\n    print(score)\n    \n    fold_importance = pd.DataFrame()\n    fold_importance[\"feature\"] = cols\n    fold_importance[\"importance\"] = clf.feature_importances_\n    fold_importance[\"fold\"] = fold + 1\n    feature_importance= pd.concat([feature_importance,fold_importance],axis=0)\n    return clf,feature_importance","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"models = []\nfor k in range(5):\n    clf,feature_importance=run(k,feature_importance)\n    models.append(clf)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"feature_importance.groupby(by=['feature']).agg({'importance':'sum'}).reset_index()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_ques","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import riiideducation\nenv = riiideducation.make_env()","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":"group_user.dtypes","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"for (test_df, sample_prediction_df) in iter_test:\n\n    \n    y_preds=[]\n    test_df =test_df[test_df['content_type_id'] == 0]\n    test_df['prior_question_had_explanation'].fillna(0,inplace=True)\n    test_df['prior_question_had_explanation']=test_df['prior_question_had_explanation'].astype(int)\n\n\n    \n    test_df['prior_question_elapsed_time'].fillna(elapsed_mean,inplace=True)\n    test_df = pd.merge(test_df,questions,left_on='content_id',right_on='question_id',how='left')\n\n    test_df=pd.merge(test_df,group_user,left_on='user_id',right_on='user_id_user_',how='left')   \n    test_df=pd.merge(test_df,group_content,left_on='content_id',right_on='content_id_content_',how='left')\n    test_df=pd.merge(test_df,group_quest,left_on='question_id',right_on=\"question_id_quest_\",how='left')\n    test_df=pd.merge(test_df,group_bundle,left_on='bundle_id',right_on=\"bundle_id_bundle_\",how='left')\n    test_df=pd.merge(test_df,group_contentUser,left_on=['user_id','content_id'],right_on=['user_id_contentUser_',\"content_id_contentUser_\"],how='left')\n\n    print(test_df.dtypes)\n    print(test_df.columns)\n    print(test_df.shape)\n   \n    for model in models:\n        y_pred = model.predict_proba(test_df[cols], num_iteration=model.best_iteration_)[:, 1]\n        y_preds.append(y_pred)\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":{"trusted":true},"cell_type":"code","source":"test_df","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"group_quest","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}