{"metadata":{"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":50160,"databundleVersionId":7602123,"sourceType":"competition"},{"sourceId":7584174,"sourceType":"datasetVersion","datasetId":4414761},{"sourceId":7612562,"sourceType":"datasetVersion","datasetId":4425208},{"sourceId":7615318,"sourceType":"datasetVersion","datasetId":4427498},{"sourceId":161936385,"sourceType":"kernelVersion"},{"sourceId":162139728,"sourceType":"kernelVersion"},{"sourceId":162306843,"sourceType":"kernelVersion"},{"sourceId":162314401,"sourceType":"kernelVersion"},{"sourceId":162317063,"sourceType":"kernelVersion"},{"sourceId":162351144,"sourceType":"kernelVersion"},{"sourceId":162438049,"sourceType":"kernelVersion"},{"sourceId":162470947,"sourceType":"kernelVersion"},{"sourceId":162486662,"sourceType":"kernelVersion"},{"sourceId":162486957,"sourceType":"kernelVersion"},{"sourceId":162602153,"sourceType":"kernelVersion"},{"sourceId":162605422,"sourceType":"kernelVersion"},{"sourceId":162611024,"sourceType":"kernelVersion"},{"sourceId":162639939,"sourceType":"kernelVersion"}],"dockerImageVersionId":30648,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true},"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.10.13"},"papermill":{"default_parameters":{},"duration":2818.131591,"end_time":"2024-02-11T12:02:23.834861","environment_variables":{},"exception":null,"input_path":"__notebook__.ipynb","output_path":"__notebook__.ipynb","parameters":{},"start_time":"2024-02-11T11:15:25.70327","version":"2.5.0"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Submission 1\nFrom: https://www.kaggle.com/code/greysky/home-credit-baseline (The best one)","metadata":{"papermill":{"duration":0.009811,"end_time":"2024-02-11T11:15:28.510408","exception":false,"start_time":"2024-02-11T11:15:28.500597","status":"completed"},"tags":[]}},{"cell_type":"code","source":"import gc","metadata":{"papermill":{"duration":0.023756,"end_time":"2024-02-11T11:15:28.543553","exception":false,"start_time":"2024-02-11T11:15:28.519797","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-02-13T08:39:19.942071Z","iopub.execute_input":"2024-02-13T08:39:19.942524Z","iopub.status.idle":"2024-02-13T08:39:19.954657Z","shell.execute_reply.started":"2024-02-13T08:39:19.942491Z","shell.execute_reply":"2024-02-13T08:39:19.953734Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!cp /kaggle/usr/lib/lgb-xgb-cat-ensemble-baseline/lgb_xgb_cat_ensemble_baseline.py lgb_xgb_cat_ensemble_baseline.py\n!python lgb_xgb_cat_ensemble_baseline.py\n!mv submission.csv submission_1.csv\ngc.collect()","metadata":{"papermill":{"duration":931.088888,"end_time":"2024-02-11T11:30:59.642043","exception":false,"start_time":"2024-02-11T11:15:28.553155","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-02-13T08:39:43.058096Z","iopub.execute_input":"2024-02-13T08:39:43.059013Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Submission 2\n\nFrom: https://www.kaggle.com/code/greysky/home-credit-baseline","metadata":{"papermill":{"duration":0.069571,"end_time":"2024-02-11T11:30:59.782515","exception":false,"start_time":"2024-02-11T11:30:59.712944","status":"completed"},"tags":[]}},{"cell_type":"code","source":"!cp /kaggle/usr/lib/home_credit_baseline/home_credit_baseline.py home_credit_baseline.py\n!python home_credit_baseline.py\n!mv submission.csv submission_2.csv\ngc.collect()","metadata":{"execution":{"iopub.execute_input":"2024-02-11T11:30:59.923314Z","iopub.status.busy":"2024-02-11T11:30:59.922438Z","iopub.status.idle":"2024-02-11T11:48:12.983229Z","shell.execute_reply":"2024-02-11T11:48:12.982179Z"},"papermill":{"duration":1033.132852,"end_time":"2024-02-11T11:48:12.985336","exception":false,"start_time":"2024-02-11T11:30:59.852484","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Submission 3\nFrom https://www.kaggle.com/code/andreynesterov/home-credit-baseline-inference","metadata":{"papermill":{"duration":0.073931,"end_time":"2024-02-11T11:48:13.138948","exception":false,"start_time":"2024-02-11T11:48:13.065017","status":"completed"},"tags":[]}},{"cell_type":"code","source":"import gc\n!cp '/kaggle/input/hcr-codes/home-credit-baseline-inference (1).ipynb' home-credit-baseline-inference.ipynb\n!papermill home-credit-baseline-inference.ipynb out-home-credit-baseline-inference.ipynb\n!mv submission.csv submission_3.csv\ngc.collect()\n","metadata":{"execution":{"iopub.execute_input":"2024-02-11T11:48:13.302715Z","iopub.status.busy":"2024-02-11T11:48:13.301914Z","iopub.status.idle":"2024-02-11T11:53:11.265911Z","shell.execute_reply":"2024-02-11T11:53:11.26498Z"},"papermill":{"duration":298.055038,"end_time":"2024-02-11T11:53:11.268121","exception":false,"start_time":"2024-02-11T11:48:13.213083","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Submission 4","metadata":{"papermill":{"duration":0.079848,"end_time":"2024-02-11T11:53:11.424465","exception":false,"start_time":"2024-02-11T11:53:11.344617","status":"completed"},"tags":[]}},{"cell_type":"code","source":"# %% [code] {\"_kg_hide-output\":true,\"execution\":{\"iopub.status.busy\":\"2024-02-10T02:45:23.557162Z\",\"iopub.execute_input\":\"2024-02-10T02:45:23.557504Z\",\"iopub.status.idle\":\"2024-02-10T02:45:47.413693Z\",\"shell.execute_reply.started\":\"2024-02-10T02:45:23.557452Z\",\"shell.execute_reply\":\"2024-02-10T02:45:47.412518Z\"}}\n!python -m pip install --no-index --find-links=/kaggle/input/autogluon-pkgs autogluon > /dev/null\n\n# %% [code] {\"_kg_hide-output\":true,\"execution\":{\"iopub.status.busy\":\"2024-02-10T02:45:47.419786Z\",\"iopub.execute_input\":\"2024-02-10T02:45:47.420055Z\",\"iopub.status.idle\":\"2024-02-10T02:46:10.396589Z\",\"shell.execute_reply.started\":\"2024-02-10T02:45:47.420028Z\",\"shell.execute_reply\":\"2024-02-10T02:46:10.395571Z\"}}\n!python -m pip install --no-index --find-links=/kaggle/input/ray-pkgs --upgrade --force-reinstall -q ray==2.6.3\n\n!cp /kaggle/usr/lib/home_credit_automl_inference/home_credit_automl_inference.py home_credit_automl_inference.py\n!python home_credit_automl_inference.py\n!mv submission.csv submission_4.csv\ngc.collect()","metadata":{"execution":{"iopub.execute_input":"2024-02-11T11:53:11.579165Z","iopub.status.busy":"2024-02-11T11:53:11.578501Z","iopub.status.idle":"2024-02-11T11:57:25.470787Z","shell.execute_reply":"2024-02-11T11:57:25.469837Z"},"papermill":{"duration":253.97202,"end_time":"2024-02-11T11:57:25.472799","exception":false,"start_time":"2024-02-11T11:53:11.500779","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Submission 0\n\nFrom: https://www.kaggle.com/code/darynarr/home-credit-drop-date-features","metadata":{"papermill":{"duration":0.077033,"end_time":"2024-02-11T11:57:25.627814","exception":false,"start_time":"2024-02-11T11:57:25.550781","status":"completed"},"tags":[]}},{"cell_type":"code","source":"!pip install --force-reinstall scikit-learn --no-index --find-links=file:///kaggle/input/scikit-learn-1-4-0/ ","metadata":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","execution":{"iopub.execute_input":"2024-02-11T11:57:25.784198Z","iopub.status.busy":"2024-02-11T11:57:25.783806Z","iopub.status.idle":"2024-02-11T11:57:57.575476Z","shell.execute_reply":"2024-02-11T11:57:57.574296Z"},"papermill":{"duration":31.872471,"end_time":"2024-02-11T11:57:57.57788","exception":false,"start_time":"2024-02-11T11:57:25.705409","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os, glob\nimport gc\nimport pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nfrom pathlib import Path\nfrom typing import Literal\nimport polars as pl\nimport polars.selectors as cs\nfrom sklearn.model_selection import train_test_split, cross_validate, StratifiedGroupKFold\nfrom sklearn.metrics import roc_auc_score\n\nimport lightgbm as lgb","metadata":{"execution":{"iopub.execute_input":"2024-02-11T11:57:57.738819Z","iopub.status.busy":"2024-02-11T11:57:57.738451Z","iopub.status.idle":"2024-02-11T11:58:01.003361Z","shell.execute_reply":"2024-02-11T11:58:01.002522Z"},"papermill":{"duration":3.348241,"end_time":"2024-02-11T11:58:01.00564","exception":false,"start_time":"2024-02-11T11:57:57.657399","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if os.path.exists('/kaggle'):\n    PATH_DATASET = Path(\"/kaggle/input/home-credit-credit-risk-model-stability\")\nelse:\n    PATH_DATASET = Path(\"home-credit-credit-risk-model-stability\")\nPATH_PARQUETS = PATH_DATASET / \"parquet_files\"\nPATH_TRAIN = PATH_PARQUETS / \"train\"\nPATH_TEST = PATH_PARQUETS / \"test\"\n\npd.set_option('display.max_columns', 1000)\npd.set_option('display.max_rows', 1000)","metadata":{"execution":{"iopub.execute_input":"2024-02-11T11:58:01.170711Z","iopub.status.busy":"2024-02-11T11:58:01.170068Z","iopub.status.idle":"2024-02-11T11:58:01.175911Z","shell.execute_reply":"2024-02-11T11:58:01.175025Z"},"papermill":{"duration":0.090611,"end_time":"2024-02-11T11:58:01.177738","exception":false,"start_time":"2024-02-11T11:58:01.087127","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Read and merge data\n","metadata":{"papermill":{"duration":0.079989,"end_time":"2024-02-11T11:58:01.337167","exception":false,"start_time":"2024-02-11T11:58:01.257178","status":"completed"},"tags":[]}},{"cell_type":"markdown","source":"# Read and merge data\n\n1) Cast datetime features\n\n2) Cast categorical features\n\n3) Drop datetime features and features with too many categories\n\n4) Merge by case_id with base dataframe","metadata":{"papermill":{"duration":0.081843,"end_time":"2024-02-11T11:58:01.499614","exception":false,"start_time":"2024-02-11T11:58:01.417771","status":"completed"},"tags":[]}},{"cell_type":"code","source":"class DatasetConstructor:\n    def __init__(self, mode: Literal['train', 'test']):\n        self.mode = mode\n        self.path = PATH_PARQUETS / mode\n\n    @staticmethod\n    def reduce_memory_usage_pl(df):\n        \"\"\" Reduce memory usage by polars dataframe {df} with name {name} by changing its data types.\n            Original pandas version of this function: https://www.kaggle.com/code/arjanso/reducing-dataframe-memory-size-by-65 \"\"\"\n        print(f\"Memory usage of dataframe is {round(df.estimated_size('mb'), 2)} MB\")\n        Numeric_Int_types = [pl.Int8,pl.Int16,pl.Int32,pl.Int64]\n        Numeric_Float_types = [pl.Float32,pl.Float64]    \n        for col in df.columns:\n            try:\n                col_type = df[col].dtype\n                if col_type == pl.Categorical:\n                    continue\n                c_min = df[col].min()\n                c_max = df[col].max()\n                if col_type in Numeric_Int_types:\n                    if c_min > np.iinfo(np.int8).min and c_max < np.iinfo(np.int8).max:\n                        df = df.with_columns(df[col].cast(pl.Int8))\n                    elif c_min > np.iinfo(np.int16).min and c_max < np.iinfo(np.int16).max:\n                        df = df.with_columns(df[col].cast(pl.Int16))\n                    elif c_min > np.iinfo(np.int32).min and c_max < np.iinfo(np.int32).max:\n                        df = df.with_columns(df[col].cast(pl.Int32))\n                    elif c_min > np.iinfo(np.int64).min and c_max < np.iinfo(np.int64).max:\n                        df = df.with_columns(df[col].cast(pl.Int64))\n                elif col_type in Numeric_Float_types:\n                    if c_min > np.finfo(np.float32).min and c_max < np.finfo(np.float32).max:\n                        df = df.with_columns(df[col].cast(pl.Float32))\n                    else:\n                        pass\n                # elif col_type == pl.Utf8:\n                #     df = df.with_columns(df[col].cast(pl.Categorical))\n                else:\n                    pass\n            except:\n                pass\n        print(f\"Memory usage of dataframe became {round(df.estimated_size('mb'), 2)} MB\")\n        return df\n\n    @staticmethod\n    def detect_datetime_cols(df):\n        return df.select_dtypes(object).apply(lambda x: pd.to_datetime(x, errors='ignore'), axis=0).select_dtypes(np.datetime64).columns.tolist()\n                        \n    def _to_pandas(self, df):\n        df = df.to_pandas().set_index('case_id')\n        df = df.replace([np.inf, -np.inf], np.nan)\n        return df\n\n    def merge_static(self, df):\n        df_static = (\n            pl.concat([pl.scan_parquet(p, low_memory=True) for p in glob.glob(str(self.path / f\"{self.mode}_static_0_*\"))],how=\"vertical_relaxed\",)\n            .with_columns(\n                [\n                    (pl.col(col).cast(pl.String).str.to_date(strict=False)) \n                    for col in [\n                        'datefirstoffer_1144D', \n                        'datelastinstal40dpd_247D',\n                        'datelastunpaid_3546854D', \n                        'dtlastpmtallstes_4499206D',\n                        'firstclxcampaign_1125D', \n                        'firstdatedue_489D', \n                        'lastactivateddate_801D',\n                       'lastapplicationdate_877D', \n                        'lastapprdate_640D', \n                        'lastdelinqdate_224D',\n                       'lastrejectdate_50D', \n                        'lastrepayingdate_696D',\n                       'maxdpdinstldate_3546855D', \n                        'payvacationpostpone_4187118D',\n                       'validfrom_1069D'\n                    ]\n                ] + [\n                    (pl.col(col).cast(pl.String).cast(pl.Categorical))\n                    for col in [\n                        'bankacctype_710L', 'cardtype_51L', 'credtype_322L',\n                       'disbursementtype_67L', 'equalitydataagreement_891L',\n                       'equalityempfrom_62L', 'inittransactioncode_186L',\n                       'isbidproductrequest_292L', 'isdebitcard_729L',\n                       'lastapprcommoditycat_1041M', 'lastapprcommoditytypec_5251766M',\n                       'lastcancelreason_561M', 'lastrejectcommoditycat_161M',\n                       'lastrejectcommodtypec_5251769M', 'lastrejectreason_759M',\n                       'lastrejectreasonclient_4145040M', 'lastst_736L', 'opencred_647L',\n                       'paytype1st_925L', 'paytype_783L', 'previouscontdistrict_112M',\n                       'twobodfilling_608L', 'typesuite_864L'\n                    ]\n                ]\n            )\n        )\n        return df.join(df_static, how=\"left\", on=\"case_id\")\n        \n    def merge_static_cb(self, df):\n        df_static_cb = (\n            pl.scan_parquet(self.path / f\"{self.mode}_static_cb_0.parquet\", low_memory=True)\n            .with_columns(\n                [\n                    (pl.col(col).cast(pl.String).str.to_date(strict=False)) \n                    for col in [\n                        'assignmentdate_238D', \n                        'assignmentdate_4527235D',\n                        'assignmentdate_4955616D', \n                        'birthdate_574D', \n                        'dateofbirth_337D',\n                        'dateofbirth_342D', \n                        'responsedate_1012D', \n                        'responsedate_4527233D',\n                        'responsedate_4917613D'\n                    ] \n                ] + [\n                    (pl.col(col).cast(pl.String).cast(pl.Categorical))\n                    for col in [\n                        'description_5085714M', 'education_1103M', 'education_88M',\n                       'maritalst_385M', 'maritalst_893M', 'requesttype_4525192L',\n                       'riskassesment_302T'\n                    ]\n                ]\n            )\n        )\n        return df.join(df_static_cb, how=\"left\", on=\"case_id\")\n \n    def load(self):\n        df = pl.scan_parquet(self.path / f\"{self.mode}_base.parquet\", low_memory=True).with_columns(\n            pl.col(\"date_decision\").str.to_date()\n        )\n        # Depth=0\n        df = self.merge_static(df)\n        df = self.merge_static_cb(df)\n        \n        df =(\n            df\n            .with_columns(\n                pl.col(pl.Float64).cast(pl.Float32),\n                pl.col(pl.Int64).cast(pl.Int32),\n            )\n        )\n        df = df.select(~cs.date())\n        \n        # Drop categorical large-dimension columns\n        df = df.drop([\n            'lastapprcommoditytypec_5251766M',\n             'previouscontdistrict_112M',\n             'district_544M',\n             'profession_152M',\n             'name_4527232M',\n             'name_4917606M',\n             'employername_160M',\n             'classificationofcontr_400M',\n             'financialinstitution_382M',\n             'contaddr_district_15M',\n             'contaddr_zipcode_807M',\n             'empladdr_district_926M',\n             'empladdr_zipcode_114M',\n             'registaddr_district_1083M',\n             'registaddr_zipcode_184M',\n             'addres_district_368M',\n             'addres_zip_823M'])\n        df = df.collect()\n        df = self.reduce_memory_usage_pl(df)\n        df = self._to_pandas(df)\n        return df","metadata":{"execution":{"iopub.execute_input":"2024-02-11T11:58:01.71643Z","iopub.status.busy":"2024-02-11T11:58:01.716066Z","iopub.status.idle":"2024-02-11T11:58:01.744834Z","shell.execute_reply":"2024-02-11T11:58:01.743874Z"},"papermill":{"duration":0.167709,"end_time":"2024-02-11T11:58:01.746852","exception":false,"start_time":"2024-02-11T11:58:01.579143","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_constructor = DatasetConstructor('train')\ndf_train = train_constructor.load()\ndf_train.info()","metadata":{"execution":{"iopub.execute_input":"2024-02-11T11:58:01.912086Z","iopub.status.busy":"2024-02-11T11:58:01.911737Z","iopub.status.idle":"2024-02-11T11:58:11.772182Z","shell.execute_reply":"2024-02-11T11:58:11.771131Z"},"papermill":{"duration":9.947556,"end_time":"2024-02-11T11:58:11.77424","exception":false,"start_time":"2024-02-11T11:58:01.826684","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Train simple LGBM","metadata":{"execution":{"iopub.execute_input":"2024-02-07T13:59:52.359298Z","iopub.status.busy":"2024-02-07T13:59:52.358959Z","iopub.status.idle":"2024-02-07T13:59:52.365236Z","shell.execute_reply":"2024-02-07T13:59:52.363792Z","shell.execute_reply.started":"2024-02-07T13:59:52.359271Z"},"papermill":{"duration":0.080184,"end_time":"2024-02-11T11:58:11.93563","exception":false,"start_time":"2024-02-11T11:58:11.855446","status":"completed"},"tags":[]}},{"cell_type":"code","source":"X, y = df_train.drop(columns='target'), df_train['target']\nX.shape","metadata":{"execution":{"iopub.execute_input":"2024-02-11T11:58:12.097426Z","iopub.status.busy":"2024-02-11T11:58:12.097055Z","iopub.status.idle":"2024-02-11T11:58:12.410522Z","shell.execute_reply":"2024-02-11T11:58:12.409599Z"},"papermill":{"duration":0.397048,"end_time":"2024-02-11T11:58:12.412699","exception":false,"start_time":"2024-02-11T11:58:12.015651","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X = X.drop(columns=['WEEK_NUM'] ) ","metadata":{"execution":{"iopub.execute_input":"2024-02-11T11:58:12.579795Z","iopub.status.busy":"2024-02-11T11:58:12.57892Z","iopub.status.idle":"2024-02-11T11:58:12.899764Z","shell.execute_reply":"2024-02-11T11:58:12.898755Z"},"papermill":{"duration":0.407207,"end_time":"2024-02-11T11:58:12.902197","exception":false,"start_time":"2024-02-11T11:58:12.49499","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\nparams = {\n    \"boosting_type\": \"gbdt\",\n    \"objective\": \"binary\",\n    \"metric\": \"auc\",\n    \"max_depth\": 8,\n    \"num_leaves\": 32,\n    \"min_data_in_leaf\": 10,\n    \"learning_rate\": 0.03,\n    \"feature_fraction\": 0.8,\n    \"bagging_fraction\": 0.8,\n    \"bagging_freq\": 5,\n    \"n_estimators\": 100,\n    'min_data_in_bin':1,\n    'max_bin': 64,\n    \"verbose\": -1,\n    \"random_state\": 42, \n    'n_jobs': -1\n}\ncv = StratifiedGroupKFold(n_splits=5, shuffle=False)\ncv_results = cross_validate(\n    lgb.LGBMClassifier(**params), \n    X, y, \n    groups=df_train['WEEK_NUM'], \n    scoring='roc_auc', \n    cv=cv,\n    verbose=3, \n    return_estimator=True, \n    return_indices=True\n)\nprint(f\"AUC: {cv_results['test_score'].mean():.3f}\", f\"+-{cv_results['test_score'].std():.3f}\")","metadata":{"execution":{"iopub.execute_input":"2024-02-11T11:58:13.071018Z","iopub.status.busy":"2024-02-11T11:58:13.070615Z","iopub.status.idle":"2024-02-11T12:02:07.775718Z","shell.execute_reply":"2024-02-11T12:02:07.774709Z"},"papermill":{"duration":234.875881,"end_time":"2024-02-11T12:02:07.859782","exception":false,"start_time":"2024-02-11T11:58:12.983901","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"stability_results = []\nfor fold, (idx, model) in enumerate(zip(cv_results['indices']['test'], cv_results['estimator'])):\n    df_res = pd.DataFrame()\n    \n    df_res['WEEK_NUM'] = df_train['WEEK_NUM'].iloc[idx].values\n    df_res['target'] = df_train['target'].iloc[idx].values\n    df_res['score'] = model.predict_proba(X.iloc[idx])[:, 1]\n    df_res['fold'] = fold\n    stability_results.append(df_res)\n    \ndf_stability_results = pd.concat(stability_results)\ndf_stability_results[df_stability_results['target'] == 0]['score'].plot(kind='hist', alpha=0.5, bins=100, label='target=0')\ndf_stability_results[df_stability_results['target'] == 1]['score'].plot(kind='hist', secondary_y=True, alpha=0.5, bins=100, label='target=1')\nplt.legend();","metadata":{"execution":{"iopub.execute_input":"2024-02-11T12:02:08.022575Z","iopub.status.busy":"2024-02-11T12:02:08.0222Z","iopub.status.idle":"2024-02-11T12:02:17.277761Z","shell.execute_reply":"2024-02-11T12:02:17.276791Z"},"papermill":{"duration":9.340345,"end_time":"2024-02-11T12:02:17.279782","exception":false,"start_time":"2024-02-11T12:02:07.939437","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sns.boxenplot(df_stability_results, y='score', x='target');","metadata":{"execution":{"iopub.execute_input":"2024-02-11T12:02:17.445841Z","iopub.status.busy":"2024-02-11T12:02:17.445432Z","iopub.status.idle":"2024-02-11T12:02:18.239591Z","shell.execute_reply":"2024-02-11T12:02:18.238534Z"},"papermill":{"duration":0.881547,"end_time":"2024-02-11T12:02:18.242234","exception":false,"start_time":"2024-02-11T12:02:17.360687","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def gini_stability(base, w_fallingrate=88.0, w_resstd=-0.5):\n    gini_in_time = base.loc[:, [\"WEEK_NUM\", \"target\", \"score\"]]\\\n        .sort_values(\"WEEK_NUM\")\\\n        .groupby(\"WEEK_NUM\")[[\"target\", \"score\"]]\\\n        .apply(lambda x: 2*roc_auc_score(x[\"target\"], x[\"score\"])-1).tolist()\n    \n    x = np.arange(len(gini_in_time))\n    y = gini_in_time\n    a, b = np.polyfit(x, y, 1)\n    y_hat = a*x + b\n    residuals = y - y_hat\n    res_std = np.std(residuals)\n    avg_gini = np.mean(gini_in_time)\n    return avg_gini + w_fallingrate * min(0, a) + w_resstd * res_std\n\ntry:\n    df_stability_results.groupby('fold').apply(gini_stability, include_groups=False)\nexcept:\n    pass","metadata":{"execution":{"iopub.execute_input":"2024-02-11T12:02:18.409684Z","iopub.status.busy":"2024-02-11T12:02:18.408735Z","iopub.status.idle":"2024-02-11T12:02:18.520073Z","shell.execute_reply":"2024-02-11T12:02:18.51902Z"},"papermill":{"duration":0.197973,"end_time":"2024-02-11T12:02:18.522381","exception":false,"start_time":"2024-02-11T12:02:18.324408","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"gini_stability(df_stability_results)","metadata":{"execution":{"iopub.execute_input":"2024-02-11T12:02:18.68832Z","iopub.status.busy":"2024-02-11T12:02:18.687886Z","iopub.status.idle":"2024-02-11T12:02:19.446228Z","shell.execute_reply":"2024-02-11T12:02:19.445224Z"},"papermill":{"duration":0.843666,"end_time":"2024-02-11T12:02:19.4483","exception":false,"start_time":"2024-02-11T12:02:18.604634","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"models = cv_results['estimator']","metadata":{"execution":{"iopub.execute_input":"2024-02-11T12:02:19.617327Z","iopub.status.busy":"2024-02-11T12:02:19.616665Z","iopub.status.idle":"2024-02-11T12:02:19.621069Z","shell.execute_reply":"2024-02-11T12:02:19.620178Z"},"papermill":{"duration":0.088338,"end_time":"2024-02-11T12:02:19.622942","exception":false,"start_time":"2024-02-11T12:02:19.534604","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"del df_train, X, y\ngc.collect()","metadata":{"execution":{"iopub.execute_input":"2024-02-11T12:02:19.789025Z","iopub.status.busy":"2024-02-11T12:02:19.78854Z","iopub.status.idle":"2024-02-11T12:02:19.94477Z","shell.execute_reply":"2024-02-11T12:02:19.943795Z"},"papermill":{"duration":0.242404,"end_time":"2024-02-11T12:02:19.946633","exception":false,"start_time":"2024-02-11T12:02:19.704229","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Loading test data","metadata":{"papermill":{"duration":0.082843,"end_time":"2024-02-11T12:02:20.11136","exception":false,"start_time":"2024-02-11T12:02:20.028517","status":"completed"},"tags":[]}},{"cell_type":"code","source":"test_constructor = DatasetConstructor('test')\ndf_test=test_constructor.load()","metadata":{"execution":{"iopub.execute_input":"2024-02-11T12:02:20.276492Z","iopub.status.busy":"2024-02-11T12:02:20.275633Z","iopub.status.idle":"2024-02-11T12:02:20.380752Z","shell.execute_reply":"2024-02-11T12:02:20.379605Z"},"papermill":{"duration":0.190308,"end_time":"2024-02-11T12:02:20.383278","exception":false,"start_time":"2024-02-11T12:02:20.19297","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Predict and submit","metadata":{"papermill":{"duration":0.085378,"end_time":"2024-02-11T12:02:20.556413","exception":false,"start_time":"2024-02-11T12:02:20.471035","status":"completed"},"tags":[]}},{"cell_type":"code","source":"test = df_test[models[0].feature_name_]\npreds_proba = [model.predict_proba(test)[:, 1] for model in models]\ndf_test[\"score\"] = np.average(preds_proba, axis=0)\ndf_test[[\"score\"]].to_csv(\"submission_0.csv\")\n","metadata":{"execution":{"iopub.execute_input":"2024-02-11T12:02:20.721041Z","iopub.status.busy":"2024-02-11T12:02:20.720302Z","iopub.status.idle":"2024-02-11T12:02:20.82085Z","shell.execute_reply":"2024-02-11T12:02:20.81987Z"},"papermill":{"duration":0.18584,"end_time":"2024-02-11T12:02:20.82338","exception":false,"start_time":"2024-02-11T12:02:20.63754","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!ls submission_","metadata":{"execution":{"iopub.execute_input":"2024-02-11T12:02:20.997565Z","iopub.status.busy":"2024-02-11T12:02:20.99681Z","iopub.status.idle":"2024-02-11T12:02:22.01777Z","shell.execute_reply":"2024-02-11T12:02:22.016666Z"},"papermill":{"duration":1.109338,"end_time":"2024-02-11T12:02:22.020328","exception":false,"start_time":"2024-02-11T12:02:20.91099","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"","metadata":{"papermill":{"duration":0.081774,"end_time":"2024-02-11T12:02:22.184568","exception":false,"start_time":"2024-02-11T12:02:22.102794","status":"completed"},"tags":[]}},{"cell_type":"markdown","source":"# Ensemble","metadata":{"papermill":{"duration":0.081165,"end_time":"2024-02-11T12:02:22.34844","exception":false,"start_time":"2024-02-11T12:02:22.267275","status":"completed"},"tags":[]}},{"cell_type":"code","source":"sub_0 = pd.read_csv(\"submission_0.csv\", dtype={\"case_id\": int}).set_index(\"case_id\")\nsub_1 = pd.read_csv(\"submission_1.csv\", dtype={\"case_id\": int}).set_index(\"case_id\")\nsub_2 = pd.read_csv(\"submission_2.csv\", dtype={\"case_id\": int}).set_index(\"case_id\")\nsub_3 = pd.read_csv(\"submission_3.csv\", dtype={\"case_id\": int}).set_index(\"case_id\")\nsub_4 = pd.read_csv(\"submission_4.csv\", dtype={\"case_id\": int}).set_index(\"case_id\")\n\nsub = 0.4*sub_4 + 0.5*sub_3 + 0.1*(0.95*sub_2 + 0.05*(0.8*sub_0 + 0.2*sub_1))\n","metadata":{"execution":{"iopub.execute_input":"2024-02-11T12:02:22.517484Z","iopub.status.busy":"2024-02-11T12:02:22.516634Z","iopub.status.idle":"2024-02-11T12:02:22.540042Z","shell.execute_reply":"2024-02-11T12:02:22.539165Z"},"papermill":{"duration":0.112046,"end_time":"2024-02-11T12:02:22.542302","exception":false,"start_time":"2024-02-11T12:02:22.430256","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Trick from: https://www.kaggle.com/code/kononenko/metric-s-trick-home-credit-baseline-inference","metadata":{}},{"cell_type":"code","source":"test = pd.read_csv(\"/kaggle/input/home-credit-credit-risk-model-stability/csv_files/test/test_base.csv\")\n# sub = pd.read_csv(\"/kaggle/input/home-credit-credit-risk-model-stability/sample_submission.csv\", dtype={\"case_id\": int}).set_index(\"case_id\")\nSHIFT = 0.025\nweek_num = list(test[\"WEEK_NUM\"])\nsub[\"WEEK_NUM\"] = week_num\ncondition = sub[\"WEEK_NUM\"] < (sub[\"WEEK_NUM\"].max() - sub[\"WEEK_NUM\"].min())/2 + sub[\"WEEK_NUM\"].min()\nsub.loc[condition, 'score'] = (sub.loc[condition, 'score'] - SHIFT).clip(0)\ndel sub[\"WEEK_NUM\"]\nsub.to_csv(\"submission.csv\")","metadata":{"execution":{"iopub.execute_input":"2024-02-11T12:02:22.710395Z","iopub.status.busy":"2024-02-11T12:02:22.710045Z","iopub.status.idle":"2024-02-11T12:02:22.722424Z","shell.execute_reply":"2024-02-11T12:02:22.721497Z"},"papermill":{"duration":0.097072,"end_time":"2024-02-11T12:02:22.72451","exception":false,"start_time":"2024-02-11T12:02:22.627438","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]}]}