{"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.11.11"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":10445,"databundleVersionId":200747,"sourceType":"competition"}],"dockerImageVersionId":31040,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport pandas as pd\nfrom sklearn.preprocessing import LabelEncoder\nfrom xgboost import XGBRegressor\nimport matplotlib.pyplot as plt\n\nrseed = 71","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-30T11:41:36.742874Z","iopub.execute_input":"2025-06-30T11:41:36.743189Z","iopub.status.idle":"2025-06-30T11:41:38.095056Z","shell.execute_reply.started":"2025-06-30T11:41:36.743167Z","shell.execute_reply":"2025-06-30T11:41:38.093976Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# ----------------------------------------------\n# データ読み込み\n# ----------------------------------------------\nDATA_DIR = \"/kaggle/input/elo-merchant-category-recommendation\"\ntrain = pd.read_csv(f\"{DATA_DIR}/train.csv\")\ntest  = pd.read_csv(f\"{DATA_DIR}/test.csv\")\n\n# 元テーブルからID列と目的変数をコピー\ntrain_card_id = train['card_id'].copy()\ntest_card_id  = test['card_id'].copy()\ntrain_y       = train['target'].copy()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-30T11:41:38.096482Z","iopub.execute_input":"2025-06-30T11:41:38.096881Z","iopub.status.idle":"2025-06-30T11:41:38.601172Z","shell.execute_reply.started":"2025-06-30T11:41:38.096858Z","shell.execute_reply":"2025-06-30T11:41:38.600189Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# ----------------------------------------------\n# メインテーブルの特徴量作成\n# ・年月文字列は欠損補完・Label Encoding\n# ・他はそのまま\n# ----------------------------------------------\n\n# 元テーブルから特徴量をコピー（目的変数は削除）\ntrain_x = train.copy().drop(columns=[\"target\"])\ntest_x  = test.copy()\n\n# 年月文字列に欠損があるので補完\ntrain_x[\"first_active_month\"] = train_x[\"first_active_month\"].fillna(\"Unknown\")\ntest_x[\"first_active_month\"]  = test_x[\"first_active_month\"].fillna(\"Unknown\")\n\n# 年月文字列をLabel Encoding\nle = LabelEncoder()\nall_months = pd.concat([train_x[\"first_active_month\"], test_x[\"first_active_month\"]])\nle.fit(all_months)\ntrain_x[\"fam_label\"] = le.transform(train_x[\"first_active_month\"])\ntest_x[\"fam_label\"]  = le.transform(test_x[\"first_active_month\"])\n\n# 変換前の年月文字列を削除\ntrain_x = train_x.drop(columns=[\"first_active_month\"])\ntest_x  = test_x.drop(columns=[\"first_active_month\"])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-30T11:41:38.601996Z","iopub.execute_input":"2025-06-30T11:41:38.602249Z","iopub.status.idle":"2025-06-30T11:41:38.760432Z","shell.execute_reply.started":"2025-06-30T11:41:38.602230Z","shell.execute_reply":"2025-06-30T11:41:38.759436Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"DATA_DIR = '/kaggle/input/elo-merchant-category-recommendation'\nnew = pd.read_csv(f\"{DATA_DIR}/new_merchant_transactions.csv\")\n# ── new_merchant_transactions の集約（min,max,count 以外を追加）\nagg_dict_new = {\n    'purchase_amount': ['min', 'max', 'mean', 'var', 'skew',\n                        lambda x: x.quantile(0.25),  # 25%\n                        lambda x: x.quantile(0.75)], # 75%\n    'installments':    ['min', 'max', 'mean', 'nunique', 'size'],\n    'month_lag':       ['min', 'max', 'mean', 'nunique'],\n    'purchase_date':   ['min', 'max', 'nunique']\n}\n\nnew_agg = new.groupby('card_id').agg(agg_dict_new)\n\n# MultiIndex→フラット化\nnew_agg.columns = [\n    'new_' + '_'.join(\n        str(c) if not callable(c) else\n        ('q25' if '0.25' in repr(c) else 'q75')\n        for c in col\n    )\n    for col in new_agg.columns\n]\nnew_agg = new_agg.reset_index()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-30T11:41:38.761423Z","iopub.execute_input":"2025-06-30T11:41:38.761699Z","iopub.status.idle":"2025-06-30T11:46:27.863664Z","shell.execute_reply.started":"2025-06-30T11:41:38.761677Z","shell.execute_reply":"2025-06-30T11:46:27.862668Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# ID列を削除\ntrain_x = train_x.drop(columns=[\"card_id\"])\ntest_x  = test_x.drop(columns=[\"card_id\"])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-30T11:46:27.865710Z","iopub.execute_input":"2025-06-30T11:46:27.866030Z","iopub.status.idle":"2025-06-30T11:46:27.877213Z","shell.execute_reply.started":"2025-06-30T11:46:27.866006Z","shell.execute_reply":"2025-06-30T11:46:27.876302Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# ----------------------------------------------\n# 使用する特徴量の可視化\n# ----------------------------------------------\n\n# 各特徴の統計量\nprint(pd.concat([train_x, train_y], axis=1).describe())\n\n# 各特徴のヒストグラム\ntrain_x.hist(bins=100, color=\"blue\", grid=True, label='pandas')\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-30T11:46:27.878122Z","iopub.execute_input":"2025-06-30T11:46:27.878373Z","iopub.status.idle":"2025-06-30T11:46:29.337860Z","shell.execute_reply.started":"2025-06-30T11:46:27.878347Z","shell.execute_reply":"2025-06-30T11:46:29.336960Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# ------------------------------\n# XGBoostの学習・推論・submit\n# ------------------------------\nmodel = XGBRegressor(random_state=rseed)\nmodel.fit(train_x, train_y)\npreds = model.predict(test_x)\n\nsubmission = pd.DataFrame({\n    \"card_id\": test_card_id,\n    \"target\":  preds\n})\n\nsubmission.to_csv(\"submission.csv\", index=False)","metadata":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","trusted":true,"execution":{"iopub.status.busy":"2025-06-30T11:46:29.339077Z","iopub.execute_input":"2025-06-30T11:46:29.339388Z","iopub.status.idle":"2025-06-30T11:46:30.312880Z","shell.execute_reply.started":"2025-06-30T11:46:29.339365Z","shell.execute_reply":"2025-06-30T11:46:30.311786Z"}},"outputs":[],"execution_count":null}]}