{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":50160,"databundleVersionId":7921029,"sourceType":"competition"}],"dockerImageVersionId":30665,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# import numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))","metadata":{"_uuid":"33b4fd2b-a9a7-4cab-976c-636cacdaaaa5","_cell_guid":"f49f38e9-51eb-426f-beb0-6ed22d23e80f","execution":{"iopub.status.busy":"2024-04-04T13:59:16.653191Z","iopub.execute_input":"2024-04-04T13:59:16.653548Z","iopub.status.idle":"2024-04-04T13:59:17.686043Z","shell.execute_reply.started":"2024-04-04T13:59:16.653518Z","shell.execute_reply":"2024-04-04T13:59:17.684851Z"},"trusted":true}},{"cell_type":"code","source":"import sys\nfrom pathlib import Path\nimport subprocess\nimport os\nimport gc\nfrom glob import glob\n\nimport numpy as np\nimport pandas as pd\nimport polars as pl\nfrom datetime import datetime\nimport seaborn as sns\nimport matplotlib.pyplot as plt\n\nimport warnings\nwarnings.filterwarnings('ignore')\n\nROOT = '/kaggle/input/home-credit-credit-risk-model-stability'","metadata":{"_uuid":"f3e3545f-677f-4471-9cf2-1b9bf5b1b875","_cell_guid":"2add14d1-6f3b-42fa-9605-5dbcfa7badc8","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-04-20T04:37:16.550105Z","iopub.execute_input":"2024-04-20T04:37:16.551096Z","iopub.status.idle":"2024-04-20T04:37:16.557607Z","shell.execute_reply.started":"2024-04-20T04:37:16.551054Z","shell.execute_reply":"2024-04-20T04:37:16.556558Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.model_selection import TimeSeriesSplit, GroupKFold, StratifiedGroupKFold\nfrom sklearn.base import BaseEstimator, RegressorMixin\nfrom sklearn.metrics import roc_auc_score\nimport lightgbm as lgb\n\nfrom imblearn.over_sampling import SMOTE\nfrom sklearn.preprocessing import OrdinalEncoder\nfrom sklearn.impute import KNNImputer","metadata":{"_uuid":"845772a4-c8ac-4877-8a6b-6cb520469aba","_cell_guid":"aa885c75-fc19-426f-b04c-3283ed923b83","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-04-20T04:37:16.559681Z","iopub.execute_input":"2024-04-20T04:37:16.560377Z","iopub.status.idle":"2024-04-20T04:37:16.568663Z","shell.execute_reply.started":"2024-04-20T04:37:16.560341Z","shell.execute_reply":"2024-04-20T04:37:16.567573Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class Pipeline:\n\n    def set_table_dtypes(df):\n        for col in df.columns:\n            if col in [\"case_id\", \"WEEK_NUM\", \"num_group1\", \"num_group2\"]:\n                df = df.with_columns(pl.col(col).cast(pl.Int64))\n            elif col in [\"date_decision\"]:\n                df = df.with_columns(pl.col(col).cast(pl.Date))\n            elif col[-1] in (\"P\", \"A\"):\n                df = df.with_columns(pl.col(col).cast(pl.Float64))\n            elif col[-1] in (\"M\",):\n                df = df.with_columns(pl.col(col).cast(pl.String))\n            elif col[-1] in (\"D\",):\n                df = df.with_columns(pl.col(col).cast(pl.Date))\n        return df\n\n    def handle_dates(df):\n        for col in df.columns:\n            if col[-1] in (\"D\",):\n                df = df.with_columns(pl.col(col) - pl.col(\"date_decision\"))  #!!?\n                df = df.with_columns(pl.col(col).dt.total_days()) # t - t-1\n        df = df.drop(\"date_decision\", \"MONTH\")\n        return df\n\n    def filter_cols(df):\n        for col in df.columns:\n            if col not in [\"target\", \"case_id\", \"WEEK_NUM\"]:\n                isnull = df[col].is_null().mean()\n                if isnull > 0.7:\n                    df = df.drop(col)\n        \n        for col in df.columns:\n            if (col not in [\"target\", \"case_id\", \"WEEK_NUM\"]) & (df[col].dtype == pl.String):\n                freq = df[col].n_unique()\n                if (freq == 1) | (freq > 200):\n                    df = df.drop(col)\n        \n        return df","metadata":{"_uuid":"bc33c5fa-c8e4-4191-a822-3f56143e570d","_cell_guid":"4416c852-743b-453b-98b6-6936f41d4849","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-04-20T04:37:16.569867Z","iopub.execute_input":"2024-04-20T04:37:16.570288Z","iopub.status.idle":"2024-04-20T04:37:16.583733Z","shell.execute_reply.started":"2024-04-20T04:37:16.570261Z","shell.execute_reply":"2024-04-20T04:37:16.582794Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class Aggregator:\n    \n    def num_expr(df):\n        cols = [col for col in df.columns if col[-1] in (\"P\", \"A\")]\n        expr_max = [pl.max(col).alias(f\"max_{col}\") for col in cols]\n        return expr_max\n    \n    def date_expr(df):\n        cols = [col for col in df.columns if col[-1] in (\"D\")]\n        expr_max = [pl.max(col).alias(f\"max_{col}\") for col in cols]\n        return expr_max\n    \n    def str_expr(df):\n        cols = [col for col in df.columns if col[-1] in (\"M\",)]\n        expr_max = [pl.max(col).alias(f\"max_{col}\") for col in cols]\n        return expr_max\n    \n    def other_expr(df):\n        cols = [col for col in df.columns if col[-1] in (\"T\", \"L\")]\n        expr_max = [pl.max(col).alias(f\"max_{col}\") for col in cols]\n        return expr_max\n    \n    def count_expr(df):\n        cols = [col for col in df.columns if \"num_group\" in col]\n        expr_max = [pl.max(col).alias(f\"max_{col}\") for col in cols]  # max & replace col name\n        return expr_max\n    \n#     def latest_expr(df):\n#         cols = [col for col in df.columns if \"num_group\" in col]\n#         try:\n#             expr_max = df.loc[df['num_group2'].idxmax()]\n#         except:\n#             expr_max = df.loc[df['num_group1'].idxmax()]\n#         return expr_max\n\n    def get_exprs(df):\n        exprs = Aggregator.num_expr(df) + \\\n                Aggregator.date_expr(df) + \\\n                Aggregator.str_expr(df) + \\\n                Aggregator.other_expr(df) + \\\n                 Aggregator.count_expr(df) \n#                 Aggregator.latest_expr(df)\n\n        return exprs","metadata":{"_uuid":"ec3f8fe4-1cdd-4df0-8ae8-4d7fe4dc675d","_cell_guid":"3df15013-894c-4076-8b26-9a27083a8c3a","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-04-20T04:37:16.585017Z","iopub.execute_input":"2024-04-20T04:37:16.585387Z","iopub.status.idle":"2024-04-20T04:37:16.597874Z","shell.execute_reply.started":"2024-04-20T04:37:16.585353Z","shell.execute_reply":"2024-04-20T04:37:16.597002Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def read_file(path, depth=None):\n    df = pl.read_parquet(path)\n    df = df.pipe(Pipeline.set_table_dtypes)\n    if depth in [1,2]:\n        df = df.group_by(\"case_id\").agg(Aggregator.get_exprs(df)) \n    return df\n\ndef read_files(regex_path, depth=None):\n    chunks = []\n    \n    for path in glob(str(regex_path)):\n        df = pl.read_parquet(path)\n        df = df.pipe(Pipeline.set_table_dtypes)\n        if depth in [1, 2]:\n            df = df.group_by(\"case_id\").agg(Aggregator.get_exprs(df))\n        chunks.append(df)\n    \n    df = pl.concat(chunks, how=\"vertical_relaxed\")\n    df = df.unique(subset=[\"case_id\"])\n    return df","metadata":{"_uuid":"5cba5dd3-7571-4c38-89b8-16421ae9725b","_cell_guid":"7ed43bbb-8400-485d-9b4d-c10adbc1e760","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-04-20T04:37:16.602201Z","iopub.execute_input":"2024-04-20T04:37:16.602525Z","iopub.status.idle":"2024-04-20T04:37:16.611133Z","shell.execute_reply.started":"2024-04-20T04:37:16.602500Z","shell.execute_reply":"2024-04-20T04:37:16.610138Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def reduce_mem_usage(df):\n    \"\"\" iterate through all the columns of a dataframe and modify the data type\n        to reduce memory usage.        \n    \"\"\"\n    start_mem = df.memory_usage().sum() / 1024**2\n    print('Memory usage of dataframe is {:.2f} MB'.format(start_mem))\n    \n    for col in df.columns:\n        col_type = df[col].dtype\n        if str(col_type)==\"category\":\n            continue\n        \n        if col_type != object:\n            c_min = df[col].min()\n            c_max = df[col].max()\n            if str(col_type)[:3] == 'int':\n                if c_min > np.iinfo(np.int8).min and c_max < np.iinfo(np.int8).max:\n                    df[col] = df[col].astype(np.int8)\n                elif c_min > np.iinfo(np.int16).min and c_max < np.iinfo(np.int16).max:\n                    df[col] = df[col].astype(np.int16)\n                elif c_min > np.iinfo(np.int32).min and c_max < np.iinfo(np.int32).max:\n                    df[col] = df[col].astype(np.int32)\n                elif c_min > np.iinfo(np.int64).min and c_max < np.iinfo(np.int64).max:\n                    df[col] = df[col].astype(np.int64)  \n            else:\n                if c_min > np.finfo(np.float16).min and c_max < np.finfo(np.float16).max:\n                    df[col] = df[col].astype(np.float16)\n                elif c_min > np.finfo(np.float32).min and c_max < np.finfo(np.float32).max:\n                    df[col] = df[col].astype(np.float32)\n                else:\n                    df[col] = df[col].astype(np.float64)\n        else:\n            continue\n    end_mem = df.memory_usage().sum() / 1024**2\n    print('Memory usage after optimization is: {:.2f} MB'.format(end_mem))\n    print('Decreased by {:.1f}%'.format(100 * (start_mem - end_mem) / start_mem))\n    \n    return df","metadata":{"execution":{"iopub.status.busy":"2024-04-20T04:37:16.612196Z","iopub.execute_input":"2024-04-20T04:37:16.612498Z","iopub.status.idle":"2024-04-20T04:37:16.627851Z","shell.execute_reply.started":"2024-04-20T04:37:16.612474Z","shell.execute_reply":"2024-04-20T04:37:16.626810Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def feature_eng(df_base, depth_0, depth_1, depth_2):\n    df_base = (\n        df_base\n        .with_columns(\n            month_decision = pl.col(\"date_decision\").dt.month(),\n            weekday_decision = pl.col(\"date_decision\").dt.weekday(),\n        )\n    )\n    for i, df in enumerate(depth_0 + depth_1 + depth_2):\n        df_base = df_base.join(df, how=\"left\", on=\"case_id\", suffix=f\"_{i}\")\n    df_base = df_base.pipe(Pipeline.handle_dates)\n    return df_base","metadata":{"_uuid":"1cd40c47-4a10-4ec5-a4e1-f9f25b384388","_cell_guid":"d262e7e8-357e-4e16-9aa8-5dbc658ca3b3","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-04-20T04:37:16.629056Z","iopub.execute_input":"2024-04-20T04:37:16.629359Z","iopub.status.idle":"2024-04-20T04:37:16.639388Z","shell.execute_reply.started":"2024-04-20T04:37:16.629335Z","shell.execute_reply":"2024-04-20T04:37:16.638438Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def to_pandas(df_data, cat_cols=None):\n    df_data = df_data.to_pandas()\n    if cat_cols is None:\n        cat_cols = list(df_data.select_dtypes(\"object\").columns)\n    df_data[cat_cols] = df_data[cat_cols].astype(\"category\")\n    return df_data, cat_cols","metadata":{"_uuid":"87d94241-0b0e-40ba-9791-d7a9be4e6e13","_cell_guid":"5741473e-e3ca-4350-9f1b-91cbfb700637","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-04-20T04:37:16.705123Z","iopub.execute_input":"2024-04-20T04:37:16.705403Z","iopub.status.idle":"2024-04-20T04:37:16.710712Z","shell.execute_reply.started":"2024-04-20T04:37:16.705379Z","shell.execute_reply":"2024-04-20T04:37:16.709735Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ROOT            = Path(\"/kaggle/input/home-credit-credit-risk-model-stability\")\n\nTRAIN_DIR       = ROOT / \"parquet_files\" / \"train\"\nTEST_DIR        = ROOT / \"parquet_files\" / \"test\"","metadata":{"_uuid":"aaa6ac8c-7d1f-4c13-9e05-b1b17dba8644","_cell_guid":"c1f3d6c3-d231-462e-a9a6-0097fd9d33d2","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-04-20T04:37:16.713099Z","iopub.execute_input":"2024-04-20T04:37:16.713467Z","iopub.status.idle":"2024-04-20T04:37:16.719872Z","shell.execute_reply.started":"2024-04-20T04:37:16.713434Z","shell.execute_reply":"2024-04-20T04:37:16.718942Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data_store = {\n    \"df_base\": read_file(TRAIN_DIR / \"train_base.parquet\"),\n    \"depth_0\": [\n        read_file(TRAIN_DIR / \"train_static_cb_0.parquet\"),\n        read_files(TRAIN_DIR / \"train_static_0_*.parquet\"),\n    ],\n    \"depth_1\": [\n        read_files(TRAIN_DIR / \"train_applprev_1_*.parquet\", 1),\n        read_file(TRAIN_DIR / \"train_tax_registry_a_1.parquet\", 1),\n        read_file(TRAIN_DIR / \"train_tax_registry_b_1.parquet\", 1),\n        read_file(TRAIN_DIR / \"train_tax_registry_c_1.parquet\", 1),\n        read_files(TRAIN_DIR / \"train_credit_bureau_a_1_*.parquet\", 1),\n        read_file(TRAIN_DIR / \"train_credit_bureau_b_1.parquet\", 1),\n        read_file(TRAIN_DIR / \"train_other_1.parquet\", 1),\n        read_file(TRAIN_DIR / \"train_person_1.parquet\", 1),\n        read_file(TRAIN_DIR / \"train_deposit_1.parquet\", 1),\n        read_file(TRAIN_DIR / \"train_debitcard_1.parquet\", 1),\n    ],\n    \"depth_2\": [\n        read_file(TRAIN_DIR / \"train_credit_bureau_b_2.parquet\", 2),\n        read_files(TRAIN_DIR / \"train_credit_bureau_a_2_*.parquet\", 2),\n        read_file(TRAIN_DIR / \"train_applprev_2.parquet\", 2),\n        read_file(TRAIN_DIR / \"train_person_2.parquet\", 2)\n    ]\n}","metadata":{"_uuid":"a6f37102-449f-4541-a175-69c279c92d05","_cell_guid":"a7509332-1567-4f14-94e9-b879d92e7071","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-04-20T04:37:16.721274Z","iopub.execute_input":"2024-04-20T04:37:16.721582Z","iopub.status.idle":"2024-04-20T04:39:31.478174Z","shell.execute_reply.started":"2024-04-20T04:37:16.721544Z","shell.execute_reply":"2024-04-20T04:39:31.477022Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train = feature_eng(**data_store)\nprint(\"train data shape:\\t\", df_train.shape)","metadata":{"_uuid":"ffdd0e3a-806b-46b2-89f5-1c7df85d8e07","_cell_guid":"f8adc189-fba0-4366-996d-7a9452201771","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-04-20T04:39:31.479425Z","iopub.execute_input":"2024-04-20T04:39:31.479728Z","iopub.status.idle":"2024-04-20T04:39:42.242990Z","shell.execute_reply.started":"2024-04-20T04:39:31.479701Z","shell.execute_reply":"2024-04-20T04:39:42.241890Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"_uuid":"a326596f-a476-4b69-a6f6-10dae5bff046","_cell_guid":"968ddedc-367e-48dd-9398-0b6e4ba9484f","collapsed":false,"jupyter":{"outputs_hidden":false},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"_uuid":"8d6284dd-e519-4039-b0dd-ee539406362c","_cell_guid":"ac6bcae4-b279-4811-a8b4-c01143a040d1","collapsed":false,"jupyter":{"outputs_hidden":false},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Feature Selection","metadata":{"_uuid":"1162c9c7-d334-4275-a72d-6936da87280d","_cell_guid":"37050d23-a356-442a-8390-1bdaeb82f7c1","trusted":true}},{"cell_type":"code","source":"","metadata":{"_uuid":"1503734f-e3f3-4a8a-b7ed-0506f50b2723","_cell_guid":"28165007-dbd7-478b-a27c-965944affd21","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-04-20T04:39:42.246026Z","iopub.execute_input":"2024-04-20T04:39:42.246352Z","iopub.status.idle":"2024-04-20T04:39:42.891118Z","shell.execute_reply.started":"2024-04-20T04:39:42.246326Z","shell.execute_reply":"2024-04-20T04:39:42.890160Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Drop the insignificant features\ndf_train = df_train.pipe(Pipeline.filter_cols)\ndf_train, cat_cols = to_pandas(df_train)\ndf_train = reduce_mem_usage(df_train)\n\nprint(\"train data shape:\\t\", df_train.shape)\n\n\n\n","metadata":{"_uuid":"49188b7f-e22d-4cca-b872-85ce6fa0045c","_cell_guid":"da9b52df-b869-49f7-b2d3-94c89f19eddd","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-04-20T04:39:42.892408Z","iopub.execute_input":"2024-04-20T04:39:42.892769Z","iopub.status.idle":"2024-04-20T04:40:15.923263Z","shell.execute_reply.started":"2024-04-20T04:39:42.892742Z","shell.execute_reply":"2024-04-20T04:40:15.922149Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"del data_store\ngc.collect()","metadata":{"_uuid":"c0545cc0-acdb-4c23-9165-4faf6583519c","_cell_guid":"fa1a26a3-b496-4c64-a74d-982bb766db76","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-04-20T04:40:15.924927Z","iopub.execute_input":"2024-04-20T04:40:15.925805Z","iopub.status.idle":"2024-04-20T04:40:16.268664Z","shell.execute_reply.started":"2024-04-20T04:40:15.925763Z","shell.execute_reply":"2024-04-20T04:40:16.267713Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"display(df_train.head())\n","metadata":{"_uuid":"997f1970-2df9-468a-bf6c-de05d323a2f5","_cell_guid":"f75b9428-b20f-466f-a729-379c4d39b686","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-04-20T04:40:16.269885Z","iopub.execute_input":"2024-04-20T04:40:16.270270Z","iopub.status.idle":"2024-04-20T04:40:16.337591Z","shell.execute_reply.started":"2024-04-20T04:40:16.270231Z","shell.execute_reply":"2024-04-20T04:40:16.336462Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X = df_train.drop(columns=[\"target\", \"case_id\", \"WEEK_NUM\"])\ny = df_train[\"target\"]\nweeks = df_train[\"WEEK_NUM\"]\n\ncv = StratifiedGroupKFold(n_splits=5, shuffle=False)\n\nparams = {\n    \"boosting_type\": \"gbdt\",\n    \"objective\": \"binary\",\n    \"metric\": \"auc\",\n    \"max_depth\": 10,  \n    \"learning_rate\": 0.05,\n    \"n_estimators\": 2000,  \n    \"colsample_bytree\": 0.8,\n    \"colsample_bynode\": 0.8,\n    \"verbose\": -1,\n    \"random_state\": 42,\n    \"reg_alpha\": 0.1,\n    \"reg_lambda\": 10,\n    \"extra_trees\":True,\n    'num_leaves':64,\n    \"device\": \"gpu\", \n    \"verbose\": -1,\n}\n\nfitted_models = []\ncv_scores = []\n\nfor idx_train, idx_valid in cv.split(X, y, groups=weeks):\n    X_train, y_train = X.iloc[idx_train], y.iloc[idx_train]\n    X_valid, y_valid = X.iloc[idx_valid], y.iloc[idx_valid]\n    \n    model = lgb.LGBMClassifier(**params)\n    model.fit(\n        X_train, y_train,\n        eval_set = [(X_valid, y_valid)],\n        callbacks = [lgb.log_evaluation(200), lgb.early_stopping(60)] )\n    fitted_models.append(model)\n    \n    y_pred_valid = model.predict_proba(X_valid)[:,1]\n    auc_score = roc_auc_score(y_valid, y_pred_valid)\n    cv_scores.append(auc_score)\n    \nprint(\"CV AUC scores: \", cv_scores)\nprint(\"Maximum CV AUC score: \", max(cv_scores))","metadata":{"_uuid":"1861fd9f-be9a-43b5-b26d-9c8cce0840d3","_cell_guid":"e7bcdfe5-64f5-476e-87b8-8e4f5affe279","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-04-20T04:40:16.339003Z","iopub.execute_input":"2024-04-20T04:40:16.339338Z","iopub.status.idle":"2024-04-20T05:10:14.401757Z","shell.execute_reply.started":"2024-04-20T04:40:16.339308Z","shell.execute_reply":"2024-04-20T05:10:14.400488Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class VotingModel(BaseEstimator, RegressorMixin):\n    def __init__(self, estimators):\n        super().__init__()\n        self.estimators = estimators\n        \n    def fit(self, X, y=None):\n        return self\n    \n    def predict(self, X):\n        y_preds = [estimator.predict(X) for estimator in self.estimators]\n        return np.mean(y_preds, axis=0)\n    \n    def predict_proba(self, X):\n        y_preds = [estimator.predict_proba(X) for estimator in self.estimators]\n        return np.mean(y_preds, axis=0)\n\nmodel = VotingModel(fitted_models)","metadata":{"_uuid":"18e594eb-97db-44f0-ab0a-17c9465a183f","_cell_guid":"382f71d7-0ab9-4adb-ac54-539d2e60ab55","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-04-20T05:10:14.403287Z","iopub.execute_input":"2024-04-20T05:10:14.403608Z","iopub.status.idle":"2024-04-20T05:10:14.411471Z","shell.execute_reply.started":"2024-04-20T05:10:14.403581Z","shell.execute_reply":"2024-04-20T05:10:14.410391Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"lgb.plot_importance(fitted_models[2], importance_type=\"split\", figsize=(10,50))\nplt.show()","metadata":{"_uuid":"4d5c47ae-d2b1-4d66-9a39-c5cfa76a329c","_cell_guid":"11ec9863-429e-426a-b87a-d3af137f29ef","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-04-20T05:10:14.412849Z","iopub.execute_input":"2024-04-20T05:10:14.413216Z","iopub.status.idle":"2024-04-20T05:10:19.309048Z","shell.execute_reply.started":"2024-04-20T05:10:14.413187Z","shell.execute_reply":"2024-04-20T05:10:19.307854Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"features = X_train.columns\nimportances = fitted_models[2].feature_importances_\nfeature_importance = pd.DataFrame({'importance':importances,'features':features}).sort_values('importance', ascending=False).reset_index(drop=True)\nfeature_importance","metadata":{"_uuid":"c8a721fb-6b69-443c-a4dc-accab13f4974","_cell_guid":"399dba46-f37c-4c42-aa5c-da10ca4b7f4b","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-04-20T05:10:19.312496Z","iopub.execute_input":"2024-04-20T05:10:19.312846Z","iopub.status.idle":"2024-04-20T05:10:19.329499Z","shell.execute_reply.started":"2024-04-20T05:10:19.312816Z","shell.execute_reply":"2024-04-20T05:10:19.328303Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"drop_list = []\nfor i, f in feature_importance.iterrows():\n    if f['importance']<80:\n        drop_list.append(f['features'])\nprint(f\"Number of features which are not important: {len(drop_list)} \")","metadata":{"_uuid":"9086df32-132b-4ebf-b619-ec2fbcc067ab","_cell_guid":"db23753b-fc33-4c63-b95e-ae4ddaee95a3","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-04-20T05:10:19.331046Z","iopub.execute_input":"2024-04-20T05:10:19.331857Z","iopub.status.idle":"2024-04-20T05:10:19.367931Z","shell.execute_reply.started":"2024-04-20T05:10:19.331822Z","shell.execute_reply":"2024-04-20T05:10:19.366931Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(drop_list)","metadata":{"_uuid":"d0dd8c7d-00b8-4862-86b4-895a5e06cfa0","_cell_guid":"5f9e3deb-dfe2-4ce9-967d-2fd799e81d2c","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-04-20T05:10:19.369061Z","iopub.execute_input":"2024-04-20T05:10:19.369344Z","iopub.status.idle":"2024-04-20T05:10:19.374784Z","shell.execute_reply.started":"2024-04-20T05:10:19.369319Z","shell.execute_reply":"2024-04-20T05:10:19.373758Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Submission","metadata":{"_uuid":"a915903b-d754-4139-8c4b-6fa9dc74de66","_cell_guid":"cdab3b08-60e6-485e-be59-3de7c86658a0","trusted":true}},{"cell_type":"code","source":"data_store = {\n    \"df_base\": read_file(TEST_DIR / \"test_base.parquet\"),\n    \"depth_0\": [\n        read_file(TEST_DIR / \"test_static_cb_0.parquet\"),\n        read_files(TEST_DIR / \"test_static_0_*.parquet\"),\n    ],\n    \"depth_1\": [\n        read_files(TEST_DIR / \"test_applprev_1_*.parquet\", 1),\n        read_file(TEST_DIR / \"test_tax_registry_a_1.parquet\", 1),\n        read_file(TEST_DIR / \"test_tax_registry_b_1.parquet\", 1),\n        read_file(TEST_DIR / \"test_tax_registry_c_1.parquet\", 1),\n        read_files(TEST_DIR / \"test_credit_bureau_a_1_*.parquet\", 1),\n        read_file(TEST_DIR / \"test_credit_bureau_b_1.parquet\", 1),\n        read_file(TEST_DIR / \"test_other_1.parquet\", 1),\n        read_file(TEST_DIR / \"test_person_1.parquet\", 1),\n        read_file(TEST_DIR / \"test_deposit_1.parquet\", 1),\n        read_file(TEST_DIR / \"test_debitcard_1.parquet\", 1),\n    ],\n    \"depth_2\": [\n        read_file(TEST_DIR / \"test_credit_bureau_b_2.parquet\", 2),\n        read_files(TEST_DIR / \"test_credit_bureau_a_2_*.parquet\", 2),\n        read_file(TEST_DIR / \"test_applprev_2.parquet\", 2),\n        read_file(TEST_DIR / \"test_person_2.parquet\", 2)\n    ]\n}\ndf_test = feature_eng(**data_store)\nprint(\"test data shape:\\t\", df_test.shape)\ndf_test = df_test.select([col for col in df_train.columns if col != \"target\"])\nprint(\"test data shape:\\t\", df_test.shape)\nprint(\"train data shape:\\t\", df_train.shape)\ndf_test, cat_cols = to_pandas(df_test, cat_cols)","metadata":{"execution":{"iopub.status.busy":"2024-04-20T05:15:39.149646Z","iopub.execute_input":"2024-04-20T05:15:39.150461Z","iopub.status.idle":"2024-04-20T05:15:39.446520Z","shell.execute_reply.started":"2024-04-20T05:15:39.150424Z","shell.execute_reply":"2024-04-20T05:15:39.445330Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_test = df_test.drop(columns=[\"WEEK_NUM\"])\nX_test = X_test.set_index(\"case_id\")\nlgb_pred = pd.Series(model.predict_proba(X_test)[:, 1], index=X_test.index)","metadata":{"_uuid":"d33c95db-6505-4e22-9bde-a0bb696637cf","_cell_guid":"a5f5f876-bb32-4c5d-8c08-774df4608fa9","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-04-20T05:15:50.013983Z","iopub.execute_input":"2024-04-20T05:15:50.015002Z","iopub.status.idle":"2024-04-20T05:15:50.368463Z","shell.execute_reply.started":"2024-04-20T05:15:50.014937Z","shell.execute_reply":"2024-04-20T05:15:50.367209Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_subm = pd.read_csv(ROOT / \"sample_submission.csv\")\ndf_subm = df_subm.set_index(\"case_id\")\n\ndf_subm[\"score\"] = lgb_pred","metadata":{"_uuid":"2103a5f4-53d9-42be-b0da-0c73284f5f63","_cell_guid":"d3079038-e588-4b57-bf1f-586eb12fd0a9","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-04-20T05:15:53.243644Z","iopub.execute_input":"2024-04-20T05:15:53.244401Z","iopub.status.idle":"2024-04-20T05:15:53.257140Z","shell.execute_reply.started":"2024-04-20T05:15:53.244367Z","shell.execute_reply":"2024-04-20T05:15:53.256226Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_subm","metadata":{"_uuid":"7abdd9b6-ffc7-4dd4-b3dd-af3ce67af6b4","_cell_guid":"43b0398c-7a44-4ff3-a514-d46d6fd6078e","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-04-20T05:16:22.749276Z","iopub.execute_input":"2024-04-20T05:16:22.750369Z","iopub.status.idle":"2024-04-20T05:16:22.760774Z","shell.execute_reply.started":"2024-04-20T05:16:22.750330Z","shell.execute_reply":"2024-04-20T05:16:22.759709Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_subm.to_csv(\"submission.csv\")","metadata":{"_uuid":"59b63e4a-539a-49c1-a0bd-ba85686b35da","_cell_guid":"ff2fff5f-9a65-4eeb-a697-ec3ee8d246fd","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-04-20T05:15:58.387877Z","iopub.execute_input":"2024-04-20T05:15:58.388919Z","iopub.status.idle":"2024-04-20T05:15:58.396346Z","shell.execute_reply.started":"2024-04-20T05:15:58.388870Z","shell.execute_reply":"2024-04-20T05:15:58.395463Z"},"trusted":true},"execution_count":null,"outputs":[]}]}