{"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":"none","dataSources":[{"sourceId":50160,"databundleVersionId":7921029,"sourceType":"competition"},{"sourceId":7598984,"sourceType":"datasetVersion","datasetId":4416403},{"sourceId":7868851,"sourceType":"datasetVersion","datasetId":4615804}],"dockerImageVersionId":30646,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport gc\nfrom glob import glob\nfrom pathlib import Path\nfrom datetime import datetime\nfrom collections import defaultdict\n\nimport numpy as np\nimport pandas as pd\nimport polars as pl\n\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n\nfrom sklearn.model_selection import TimeSeriesSplit, GroupKFold, StratifiedGroupKFold\nfrom sklearn.base import BaseEstimator, RegressorMixin\nfrom sklearn.ensemble import AdaBoostClassifier\n\nimport joblib\n\nimport lightgbm as lgb\n\nimport warnings\nwarnings.simplefilter(action='ignore', category=FutureWarning)","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-03-17T17:06:53.216551Z","iopub.execute_input":"2024-03-17T17:06:53.216940Z","iopub.status.idle":"2024-03-17T17:06:58.217768Z","shell.execute_reply.started":"2024-03-17T17:06:53.216904Z","shell.execute_reply":"2024-03-17T17:06:58.216384Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def set_table_dtypes(df):\n    for col in df.columns:\n        if col[-1] in (\"P\", \"A\"):\n            df = df.with_columns(pl.col(col).cast(pl.Float64).alias(col))\n        if col[-1] in (\"M\"):\n            df = df.with_columns(pl.col(col).cast(pl.String).alias(col))\n\n    return df","metadata":{"execution":{"iopub.status.busy":"2024-03-17T17:06:58.220100Z","iopub.execute_input":"2024-03-17T17:06:58.220575Z","iopub.status.idle":"2024-03-17T17:06:58.228678Z","shell.execute_reply.started":"2024-03-17T17:06:58.220535Z","shell.execute_reply":"2024-03-17T17:06:58.226872Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def handle_dates(df):\n    for col in df.columns:\n        if col[-1] in (\"D\"):\n            df = df.with_columns(pl.col(col).cast(pl.Date).alias(col))\n            df = df.with_columns(pl.col(col) - pl.col(\"date_decision\"))\n            df = df.with_columns(pl.col(col).dt.total_days())\n            \n    return df","metadata":{"execution":{"iopub.status.busy":"2024-03-17T17:06:58.230225Z","iopub.execute_input":"2024-03-17T17:06:58.230864Z","iopub.status.idle":"2024-03-17T17:06:58.254431Z","shell.execute_reply.started":"2024-03-17T17:06:58.230821Z","shell.execute_reply":"2024-03-17T17:06:58.253159Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def filter_cols(df):\n    \n    # Drop if null count of column higher than 80%\n    \n    for col in df.columns:\n        if col in [\"case_id\", \"WEEK_NUM\"]:\n            continue\n            \n        isnull = df[col].is_null().mean()\n        \n        if isnull > 0.8:\n            df = df.drop(col)\n            \n    # Drop if number of unique values of column is not between 2-100\n            \n    for col in df.columns[1:]:\n        if col in [\"case_id\", \"WEEK_NUM\", \"date_decision\"]:\n            continue\n        if df[col].dtype != pl.String:\n            continue\n            \n        freq = df[col].n_unique()\n        \n        if (freq == 1) | (freq > 100):\n            df = df.drop(col)\n\n    return df","metadata":{"execution":{"iopub.status.busy":"2024-03-17T17:06:58.257639Z","iopub.execute_input":"2024-03-17T17:06:58.258333Z","iopub.status.idle":"2024-03-17T17:06:58.267438Z","shell.execute_reply.started":"2024-03-17T17:06:58.258297Z","shell.execute_reply":"2024-03-17T17:06:58.266438Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def read_file(path):\n    df = pl.read_parquet(path)\n    df = df.pipe(set_table_dtypes)\n    \n    return df","metadata":{"execution":{"iopub.status.busy":"2024-03-17T17:06:58.268758Z","iopub.execute_input":"2024-03-17T17:06:58.269182Z","iopub.status.idle":"2024-03-17T17:06:58.278224Z","shell.execute_reply.started":"2024-03-17T17:06:58.269143Z","shell.execute_reply":"2024-03-17T17:06:58.277339Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def group_by_case_id(df, agg=pl.max):\n    df = df.group_by(\"case_id\").agg([agg(col) for col in df.columns if col != \"case_id\"])\n    if 'num_group1' in df.columns:\n        df = df.drop(columns='num_group1')\n    if 'num_group2' in df.columns:\n        df = df.drop(columns='num_group2')\n    return df\ndef feature_eng(df_base, df_person_1, df_static, df_static_cb, df_credit_bureau_b_2):\n    df_base = (\n        df_base\n        .with_columns(\n            date_decision = pl.col(\"date_decision\").cast(pl.Date),\n            WEEK_NUM = pl.col(\"WEEK_NUM\").cast(pl.Int32),\n        )\n        .with_columns(\n            month_decision = pl.col(\"date_decision\").dt.month(),\n            weekday_decision = pl.col(\"date_decision\").dt.weekday(),\n        )\n    )\n    \n    df_person_1 = group_by_case_id(df_person_1)\n    \n    df_credit_bureau_b_2 = group_by_case_id(df_credit_bureau_b_2)\n\n    df_data = (\n        df_base\n        .join(df_person_1, how=\"left\", on=\"case_id\", suffix=\"_p1\")\n        .join(df_static, how=\"left\", on=\"case_id\", suffix=\"_s\")\n        .join(df_static_cb, how=\"left\", on=\"case_id\", suffix=\"_scb\")\n        .join(df_credit_bureau_b_2, how=\"left\", on=\"case_id\", suffix=\"cbb2\")\n    )\n    \n    return df_data","metadata":{"execution":{"iopub.status.busy":"2024-03-17T17:06:58.279420Z","iopub.execute_input":"2024-03-17T17:06:58.280223Z","iopub.status.idle":"2024-03-17T17:06:58.292250Z","shell.execute_reply.started":"2024-03-17T17:06:58.280180Z","shell.execute_reply":"2024-03-17T17:06:58.290998Z"},"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    \n    if cat_cols is None:\n        cat_cols = list(df_data.select_dtypes(\"object\").columns)\n    \n    df_data[cat_cols] = df_data[cat_cols].astype(\"category\")\n    \n    return df_data, cat_cols","metadata":{"execution":{"iopub.status.busy":"2024-03-17T17:06:58.293852Z","iopub.execute_input":"2024-03-17T17:06:58.294306Z","iopub.status.idle":"2024-03-17T17:06:58.316013Z","shell.execute_reply.started":"2024-03-17T17:06:58.294264Z","shell.execute_reply":"2024-03-17T17:06:58.314711Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Configuration","metadata":{}},{"cell_type":"code","source":"ROOT            = Path(\"/kaggle/input/home-credit-credit-risk-model-stability\")\nTRAIN_DIR       = ROOT / \"parquet_files\" / \"train\"\nTEST_DIR        = ROOT / \"parquet_files\" / \"test\"\nBASE_TRAIN_PATH = TRAIN_DIR / \"train_base.parquet\"\nBASE_TEST_PATH  = TRAIN_DIR / \"train_base.parquet\"\n\nLGB_PATH = \"/kaggle/input/homecredit-dataset/lgb_model.pth\"\nADA_PATH = \"/kaggle/input/homecredit-dataset/ada_model.pth\"\n\nLOAD_MODEL = False","metadata":{"execution":{"iopub.status.busy":"2024-03-17T17:06:58.317686Z","iopub.execute_input":"2024-03-17T17:06:58.318473Z","iopub.status.idle":"2024-03-17T17:06:58.328521Z","shell.execute_reply.started":"2024-03-17T17:06:58.318427Z","shell.execute_reply":"2024-03-17T17:06:58.327445Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Train Files Read & Feature Engineering","metadata":{}},{"cell_type":"code","source":"def compose(*transforms):\n    def f(x):\n        for transform in transforms:\n            x = transform(x)\n        return x\n    return f","metadata":{"execution":{"iopub.status.busy":"2024-03-17T17:06:58.330143Z","iopub.execute_input":"2024-03-17T17:06:58.330543Z","iopub.status.idle":"2024-03-17T17:06:58.341104Z","shell.execute_reply.started":"2024-03-17T17:06:58.330510Z","shell.execute_reply":"2024-03-17T17:06:58.339837Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class HomeCreditData:\n    def __init__(self, data_dir, debug=False):\n        self.data_dir = data_dir\n        self.mode = os.path.basename(data_dir).split(\"_\")[0]\n        self.debug = debug\n        \n    def parse_filename(self, filename):\n        name, ext = filename.split('.')\n        assert ext == 'parquet', \"Data dir should only contain parquet files\"\n        \n        underscore_split = name.split('_')\n        nums = []\n        for part in underscore_split[::-1]:\n            if part.isdigit():\n                nums.append(int(part))\n            else:\n                break\n        nums = nums[::-1]\n        \n        assert len(nums) <= 2, \"Assuming there are only 2 levels of splits\"\n        \n        name = '_'.join(underscore_split[:len(underscore_split) - len(nums)])\n        i1 = nums[0] if len(nums) > 0 else None\n        i2 = nums[1] if len(nums) > 1 else None\n        return name, i1, i2\n    \n    def filename_to_datatype_key(self, filename):\n        name, i1, i2 = self.parse_filename(filename)\n        return name + ('_' + str(i1) if i1 is not None else \"\")\n    \n    def init_datatype_lists(self):\n        self.datatype_lists = defaultdict(list)\n        for filename in os.listdir(self.data_dir):\n            self.datatype_lists[self.filename_to_datatype_key(filename)].append(os.path.join(self.data_dir, filename))\n            \n    def read_file_iter(self, filenames):\n        for filename in filenames:\n            yield read_file(filename)\n            \n    def _concat_reduce(self, df_iter):\n        df = next(df_iter)\n        while True:\n            try:\n                next_df = next(df_iter)\n                df = pl.concat([df, next_df])\n            except StopIteration:\n                break\n        return df\n        \n    def load_data_dict(self, transform=None, reduce=None):\n        if not hasattr(self, 'datatype_lists'):\n            self.init_datatype_lists()\n            \n        if reduce is None:\n            reduce = self._concat_reduce\n            \n        data_dict = {}\n        for key, filelist in self.datatype_lists.items():\n            if self.debug:\n                if len(filelist) > 1:\n                    continue\n            \n            datatype_df_list = []\n            df_iter = self.read_file_iter(filelist)\n            if transform is not None:\n                df_iter = map(transform, df_iter)\n                \n            data_dict[key] = reduce(df_iter)\n            print(f\"Loaded {key}\")\n            \n        return data_dict\n    \n    def load_data_combined(self, transform=None, reduce=None):\n        base_key = f'{self.mode}_base'\n        data_dict = self.load_data_dict(transform, reduce)\n        \n        res_df = data_dict[base_key]\n        \n        for key, df in data_dict.items():\n            if key == base_key or df.shape[0] == 0:\n                continue\n            res_df = res_df.join(df, how=\"left\", on=\"case_id\")\n        \n        return res_df\n            ","metadata":{"execution":{"iopub.status.busy":"2024-03-17T17:06:58.345121Z","iopub.execute_input":"2024-03-17T17:06:58.345532Z","iopub.status.idle":"2024-03-17T17:06:58.362841Z","shell.execute_reply.started":"2024-03-17T17:06:58.345492Z","shell.execute_reply":"2024-03-17T17:06:58.361683Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def reduce_filtered(df_iter, **kwargs):\n    df = next(df_iter)\n    df = filter_cols(df)\n    while True:\n        try:\n            next_df = next(df_iter)\n            next_df = next_df[df.columns]\n            df = pl.concat([df, next_df], how=\"vertical_relaxed\")\n            df = filter_cols(df)\n        except StopIteration:\n            break\n    return df\n\ndef post(df):\n    df = df.with_columns(\n        date_decision = pl.col(\"date_decision\").cast(pl.Date),\n        WEEK_NUM = pl.col(\"WEEK_NUM\").cast(pl.Int32),\n    ).with_columns(\n        month_decision = pl.col(\"date_decision\").dt.month(),\n        weekday_decision = pl.col(\"date_decision\").dt.weekday(),\n    )\n    df = handle_dates(df)\n    return df\n    ","metadata":{"execution":{"iopub.status.busy":"2024-03-17T17:06:58.364077Z","iopub.execute_input":"2024-03-17T17:06:58.364483Z","iopub.status.idle":"2024-03-17T17:06:58.378908Z","shell.execute_reply.started":"2024-03-17T17:06:58.364452Z","shell.execute_reply":"2024-03-17T17:06:58.377719Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"DEBUG=False","metadata":{"execution":{"iopub.status.busy":"2024-03-17T17:06:58.379958Z","iopub.execute_input":"2024-03-17T17:06:58.380392Z","iopub.status.idle":"2024-03-17T17:06:58.389875Z","shell.execute_reply.started":"2024-03-17T17:06:58.380354Z","shell.execute_reply":"2024-03-17T17:06:58.388856Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dataset = HomeCreditData(str(TRAIN_DIR), debug=DEBUG)\n\ndf_train = dataset.load_data_combined(group_by_case_id, reduce_filtered)\ndf_train = post(df_train)\ndf_train, cat_cols = to_pandas(df_train)","metadata":{"execution":{"iopub.status.busy":"2024-03-17T17:06:58.390932Z","iopub.execute_input":"2024-03-17T17:06:58.391254Z","iopub.status.idle":"2024-03-17T17:09:50.380778Z","shell.execute_reply.started":"2024-03-17T17:06:58.391227Z","shell.execute_reply":"2024-03-17T17:09:50.379214Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def reduce_filter_cols(df_iter, cols, suf=''):\n    def intersect_df(df, cols):\n        intersect_cols = set(df.columns) & set(cols)\n        return df[list(intersect_cols)]\n    df = next(df_iter)\n    df = intersect_df(df, cols)\n    for next_df in df_iter:\n        next_df = intersect_df(next_df, cols)\n        df = pl.concat([df, next_df], how=\"vertical_relaxed\")\n    return df\n        ","metadata":{"execution":{"iopub.status.busy":"2024-03-17T17:09:50.382547Z","iopub.execute_input":"2024-03-17T17:09:50.382996Z","iopub.status.idle":"2024-03-17T17:09:50.390196Z","shell.execute_reply.started":"2024-03-17T17:09:50.382959Z","shell.execute_reply":"2024-03-17T17:09:50.389000Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dataset = HomeCreditData(str(TEST_DIR))\n\ndf_test = dataset.load_data_combined(group_by_case_id, lambda df_iter, **kwargs: reduce_filter_cols(df_iter, df_train.columns, **kwargs))\ndf_test = post(df_test)\ndf_test, _ = to_pandas(df_test, cat_cols)","metadata":{"execution":{"iopub.status.busy":"2024-03-17T17:09:50.391697Z","iopub.execute_input":"2024-03-17T17:09:50.392073Z","iopub.status.idle":"2024-03-17T17:09:50.785871Z","shell.execute_reply.started":"2024-03-17T17:09:50.392044Z","shell.execute_reply":"2024-03-17T17:09:50.784660Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Remove columns that are for some reason only in train\n\ncol_keep = list(set(df_test.columns) | set(['target']))\ndf_train = df_train[col_keep]","metadata":{"execution":{"iopub.status.busy":"2024-03-17T17:09:50.787369Z","iopub.execute_input":"2024-03-17T17:09:50.787793Z","iopub.status.idle":"2024-03-17T17:09:52.506181Z","shell.execute_reply.started":"2024-03-17T17:09:50.787756Z","shell.execute_reply":"2024-03-17T17:09:52.504966Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"gc.collect()","metadata":{"execution":{"iopub.status.busy":"2024-03-17T17:09:52.507475Z","iopub.execute_input":"2024-03-17T17:09:52.508430Z","iopub.status.idle":"2024-03-17T17:09:52.649719Z","shell.execute_reply.started":"2024-03-17T17:09:52.508397Z","shell.execute_reply":"2024-03-17T17:09:52.648710Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### EDA","metadata":{}},{"cell_type":"code","source":"# print(\"Train is duplicated:\\t\", df_train[\"case_id\"].duplicated().any())\n# print(\"Train Week Range:\\t\", (df_train[\"WEEK_NUM\"].min(), df_train[\"WEEK_NUM\"].max()))\n\n# print()\n\n# print(\"Test is duplicated:\\t\", df_test[\"case_id\"].duplicated().any())\n# print(\"Test Week Range:\\t\", (df_test[\"WEEK_NUM\"].min(), df_test[\"WEEK_NUM\"].max()))","metadata":{"execution":{"iopub.status.busy":"2024-03-17T17:09:52.651380Z","iopub.execute_input":"2024-03-17T17:09:52.651752Z","iopub.status.idle":"2024-03-17T17:09:52.659833Z","shell.execute_reply.started":"2024-03-17T17:09:52.651723Z","shell.execute_reply":"2024-03-17T17:09:52.658827Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# sns.lineplot(\n#     data=df_train,\n#     x=\"WEEK_NUM\",\n#     y=\"target\",\n# )\n# plt.show()","metadata":{"execution":{"iopub.status.busy":"2024-03-17T17:09:52.661132Z","iopub.execute_input":"2024-03-17T17:09:52.661750Z","iopub.status.idle":"2024-03-17T17:09:52.669571Z","shell.execute_reply.started":"2024-03-17T17:09:52.661716Z","shell.execute_reply":"2024-03-17T17:09:52.668716Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Training","metadata":{}},{"cell_type":"code","source":"LOAD_MODEL = True","metadata":{"execution":{"iopub.status.busy":"2024-03-17T17:09:52.671312Z","iopub.execute_input":"2024-03-17T17:09:52.671733Z","iopub.status.idle":"2024-03-17T17:09:52.680092Z","shell.execute_reply.started":"2024-03-17T17:09:52.671704Z","shell.execute_reply":"2024-03-17T17:09:52.679283Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if not LOAD_MODEL:\n    X = df_train.drop(columns=[\"target\", \"case_id\", \"date_decision\", \"WEEK_NUM\", \"MONTH\"], errors='ignore')\n    y = df_train[\"target\"]\n    weeks = df_train[\"WEEK_NUM\"]\n\n    cv = StratifiedGroupKFold(n_splits=2, shuffle=False)\n\n    params = {\n        \"boosting_type\": \"gbdt\",\n        \"objective\": \"binary\",\n        \"metric\": \"auc\",\n        \"max_depth\": 8,\n        \"learning_rate\": 0.05,\n        \"n_estimators\": 1000,\n        \"colsample_bytree\": 0.8, \n        \"colsample_bynode\": 0.8,\n        \"verbose\": -1,\n    }\n\n    lgb_models = []\n    ada_models = []\n\n    \n    \n    for fold, (idx_train, idx_valid) in enumerate(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#         print(\"Valid week range: \", (weeks.iloc[idx_valid].min(), weeks.iloc[idx_valid].max()))\n\n        lgb_model = lgb.LGBMClassifier(**params)\n        lgb_model.fit(\n            X_train, y_train,\n            eval_set=[(X_valid, y_valid)],\n            callbacks=[lgb.log_evaluation(50), lgb.early_stopping(10)]\n        )\n\n        lgb_models.append(lgb_model)\n        if not LOAD_MODEL:\n            joblib.dump(lgb_model, f\"lgb_best_model{fold+1}.pth\")\n\n        \n    lgb_model = VotingModel(lgb_models)","metadata":{"execution":{"iopub.status.busy":"2024-03-17T17:09:52.681157Z","iopub.execute_input":"2024-03-17T17:09:52.681561Z","iopub.status.idle":"2024-03-17T17:09:52.692984Z","shell.execute_reply.started":"2024-03-17T17:09:52.681524Z","shell.execute_reply":"2024-03-17T17:09:52.691931Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Load Model & Predict","metadata":{}},{"cell_type":"code","source":"lgb_model_pathes = glob(\"/kaggle/input/lgb-checkpoints/*\")\n\nif LOAD_MODEL:\n\n    X_test = df_test.drop(columns=[\"date_decision\", \"WEEK_NUM\", \"MONTH\"], errors='ignore')\n    X_test = X_test.set_index(\"case_id\")\n    y_pred = np.ndarray((len(X_test), len(lgb_model_pathes)))\n\n    # if LOAD_MODEL:\n    for i, lgb_path in enumerate(lgb_model_pathes):\n        lgb_model = joblib.load(lgb_path)\n        y_pred[:, i] = pd.Series(lgb_model.predict_proba(X_test)[:, 1], index=X_test.index)","metadata":{"execution":{"iopub.status.busy":"2024-03-17T17:09:52.694250Z","iopub.execute_input":"2024-03-17T17:09:52.694683Z","iopub.status.idle":"2024-03-17T17:09:52.846596Z","shell.execute_reply.started":"2024-03-17T17:09:52.694644Z","shell.execute_reply":"2024-03-17T17:09:52.845671Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_pred.mean(axis=1)","metadata":{"execution":{"iopub.status.busy":"2024-03-17T17:09:52.847960Z","iopub.execute_input":"2024-03-17T17:09:52.848405Z","iopub.status.idle":"2024-03-17T17:09:52.859460Z","shell.execute_reply.started":"2024-03-17T17:09:52.848367Z","shell.execute_reply":"2024-03-17T17:09:52.858329Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Submission","metadata":{}},{"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\"] = y_pred.mean(axis=1)","metadata":{"execution":{"iopub.status.busy":"2024-03-17T17:09:52.860811Z","iopub.execute_input":"2024-03-17T17:09:52.861138Z","iopub.status.idle":"2024-03-17T17:09:52.873931Z","shell.execute_reply.started":"2024-03-17T17:09:52.861109Z","shell.execute_reply":"2024-03-17T17:09:52.872598Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"Check null: \", df_subm[\"score\"].isnull().any())","metadata":{"execution":{"iopub.status.busy":"2024-03-17T17:09:52.875802Z","iopub.execute_input":"2024-03-17T17:09:52.876296Z","iopub.status.idle":"2024-03-17T17:09:52.885799Z","shell.execute_reply.started":"2024-03-17T17:09:52.876244Z","shell.execute_reply":"2024-03-17T17:09:52.884656Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_subm.head()","metadata":{"execution":{"iopub.status.busy":"2024-03-17T17:09:52.887588Z","iopub.execute_input":"2024-03-17T17:09:52.888054Z","iopub.status.idle":"2024-03-17T17:09:52.903792Z","shell.execute_reply.started":"2024-03-17T17:09:52.888013Z","shell.execute_reply":"2024-03-17T17:09:52.902795Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_subm.to_csv(\"submission.csv\")","metadata":{"execution":{"iopub.status.busy":"2024-03-17T17:09:52.905235Z","iopub.execute_input":"2024-03-17T17:09:52.905545Z","iopub.status.idle":"2024-03-17T17:09:52.912354Z","shell.execute_reply.started":"2024-03-17T17:09:52.905520Z","shell.execute_reply":"2024-03-17T17:09:52.911217Z"},"trusted":true},"execution_count":null,"outputs":[]}]}