{"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)\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":{},"cell_type":"markdown","source":"# LightGBMを使ったモデリング\n* とりあえず適当に特徴量を作成してLightGBMを利用したモデルを構築\n* モデル構築から結果のサブミットまでの流れを一回組んでみることを目的とした"},{"metadata":{"trusted":true},"cell_type":"code","source":"dtypes = {\n    'row_id': 'int64', 'timestamp': 'int64', \n    'user_id': 'int32', 'content_id': 'int16',\n    'content_type_id': 'int8', 'task_container_id': 'int16',\n    'user_answer': 'int8', 'answered_correctly': 'int8',\n    'prior_question_elapsed_time': 'float32', 'prior_question_had_explanation': 'boolean',\n}\n\ntrain = pd.read_csv('/kaggle/input/riiid-test-answer-prediction/train.csv',\n                    low_memory=False,\n                    nrows=10**7, \n                    dtype=dtypes)\ntrain.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# 問題の正解率\nquestion_correctly = train.groupby('content_id').agg({'answered_correctly': 'mean'}).reset_index()\nquestion_correctly = question_correctly.rename(columns={'answered_correctly': 'question_correctly'})\nquestion_correctly.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# 問題ごとの解答数\nquestion_answered = train.groupby('content_id').agg({'row_id': 'nunique'}).reset_index()\nquestion_answered = question_answered.rename(columns={'row_id': 'question_answered'})\nquestion_answered.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# 問題に正解したユーザーの数\nquestion_correct_users = train[train.answered_correctly==1].groupby('content_id')\\\n                                                            .agg({'user_id': 'nunique'})\\\n                                                            .reset_index()\nquestion_correct_users = question_correct_users.rename(columns={'user_id': 'question_correct_users'})\nquestion_correct_users.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"task_questions = train.groupby('task_container_id').agg({'content_id': 'nunique'}).reset_index()\ntask_questions = task_questions.rename(columns={'content_id': 'task_questions'})\ntask_questions.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train.timestamp","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"task_correct_time = train[(train.content_type_id==0)&(train.answered_correctly==1)]\\\n                        [['task_container_id', 'timestamp']]\ntask_correct_time = task_correct_time.groupby('task_container_id', as_index=False)\\\n                                    .agg({'timestamp': 'mean'})\\\n                                    .rename(columns={'timestamp': 'task_correct_time'})\ntask_correct_time.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train = pd.merge(train, question_correctly, on='content_id', how='left')\ntrain = pd.merge(train, question_answered, on='content_id', how='left')\ntrain = pd.merge(train, question_correct_users, on='content_id', how='left')\n\ntrain = pd.merge(train, task_questions, on='task_container_id', how='left')\ntrain = pd.merge(train, task_correct_time, on='task_container_id', how='left')\ntrain.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train['task_time_diff'] = train.timestamp - train.task_correct_time\ntrain.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"feature_columns = [\n    'task_time_diff', 'prior_question_elapsed_time',\n    'question_correctly', 'question_answered', 'question_correct_users',\n    'task_questions', \n]\navg_elapsed_time = train[train.content_type_id==0].prior_question_elapsed_time.mean()\ntrain.prior_question_elapsed_time = train.prior_question_elapsed_time.fillna(avg_elapsed_time)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import lightgbm as lgb\nfrom sklearn.metrics import roc_auc_score\nfrom sklearn.model_selection import train_test_split\n\n# train = train[train.content_type_id==0]\n# validation = train.groupby('user_id').tail(30)\n# train = train[~train.index.isin(validation.index)]\n# len(validation), len(train)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# X_train, y_train = train[feature_columns].values, train['answered_correctly'].values\n# len(X_train), len(y_train)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# X_test, y_test = validation[feature_columns].values, validation['answered_correctly'].values","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X = train[train.content_type_id==0][feature_columns].values\ny = train[train.content_type_id==0].answered_correctly.values\nX_train, X_test, y_train, y_test = train_test_split(X, y,test_size=0.20, random_state=2)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"params = {\n    'objective': 'binary',\n    'metric': 'auc',\n    'boosting_type': 'gbdt',\n    'feature_pre_filter': False,\n    'lambda_l1': 9.999113738620421,\n    'lambda_l2': 1.0385247329879447e-08,\n    'num_leaves': 113,\n    'feature_fraction': 0.8999999999999999,\n    'bagging_fraction': 1.0,\n    'bagging_freq': 0,\n    'min_child_samples': 20,\n    'num_iterations': 1000,\n    'early_stopping_round': 100\n}\n\n# model = lgb.LGBMClassifier()\n# model.fit(X_train, y_train)\n\ndtrain = lgb.Dataset(X_train, label=y_train)\neval_data = lgb.Dataset(X_test, label=y_test)\n\nmodel = lgb.train(\n            params, \n            dtrain,\n            valid_sets=eval_data\n        )","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"y_pred_prob = model.predict(X_test)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"auc = roc_auc_score(y_test,y_pred_prob)\nprint('AUC :', auc) ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# import matplotlib.pyplot as plt\n\n# # 特徴量の重要度を含むデータフレームを作成\n# imp_df = pd.DataFrame()\n# imp_df[\"feature\"] = feature_columns\n# imp_df[\"importance\"] = model.feature_importances_\n# imp_df = imp_df.sort_values(\"importance\")\n\n# # 可視化\n# plt.figure(figsize=(7, 10))\n# plt.barh(imp_df.feature, imp_df.importance)\n# plt.xlabel(\"Feature Importance\")\n# plt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"question_only_train = train[train.content_type_id==0].copy()\n\navg_question_correctly = question_only_train.question_correctly.mean()\navg_question_answered = question_only_train.question_answered.mean()\navg_question_correct_users = question_only_train.question_correct_users.mean()\navg_task_questions = question_only_train.task_questions.mean()\n\navg_elapsed_time = question_only_train.prior_question_elapsed_time.mean()\navg_task_time_diff = question_only_train.task_time_diff.mean()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import riiideducation\nenv = riiideducation.make_env()\n\niter_test = env.iter_test()\nfor (test_df, sample_prediction_df) in iter_test:\n    test_df = pd.merge(test_df, question_correctly, on='content_id', how='left')\n    test_df = pd.merge(test_df, question_answered, on='content_id', how='left')\n    test_df = pd.merge(test_df, question_correct_users, on='content_id', how='left')\n    test_df = pd.merge(test_df, task_questions, on='task_container_id', how='left')\n    test_df = pd.merge(test_df, task_correct_time, on='task_container_id', how='left')\n    test_df['task_time_diff'] = test_df.timestamp - test_df.task_correct_time\n    \n    test_df.question_correctly = test_df.question_correctly.fillna(avg_question_correctly)\n    test_df.question_answered = test_df.question_answered.fillna(avg_question_answered)\n    test_df.question_correct_users = test_df.question_correct_users.fillna(avg_question_correct_users)\n    test_df.task_questions = test_df.task_questions.fillna(avg_task_questions)\n    test_df.task_time_diff = test_df.task_time_diff.fillna(avg_task_time_diff)\n    \n    test_df.prior_question_elapsed_time = test_df.prior_question_elapsed_time.fillna(avg_elapsed_time)\n\n    y_pred = model.predict(test_df[feature_columns].values)\n    test_df['answered_correctly'] = y_pred\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}