{"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":[{"sourceType":"competition","sourceId":50160,"databundleVersionId":7602123},{"sourceType":"datasetVersion","sourceId":7665956,"datasetId":4448066,"databundleVersionId":7763132},{"sourceType":"datasetVersion","sourceId":7602340,"datasetId":4425774,"databundleVersionId":7697646},{"sourceType":"datasetVersion","sourceId":7617331,"datasetId":4436420,"databundleVersionId":7712999}],"dockerImageVersionId":30646,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Imports","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport glob\nimport polars as pl\n\nfrom sklearn.model_selection import train_test_split, StratifiedGroupKFold\nfrom sklearn.ensemble import RandomForestClassifier\nfrom xgboost import XGBClassifier\nimport xgboost as xgb\n\nimport seaborn as sns\nimport matplotlib.pyplot as plt\nimport plotly.express as px\n\nimport gc\n\npd.set_option('display.max_columns', None)\npd.set_option('display.max_rows', None)","metadata":{"execution":{"iopub.status.busy":"2024-02-20T18:40:17.766404Z","iopub.execute_input":"2024-02-20T18:40:17.766859Z","iopub.status.idle":"2024-02-20T18:40:20.528891Z","shell.execute_reply.started":"2024-02-20T18:40:17.766824Z","shell.execute_reply":"2024-02-20T18:40:20.527457Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Explore Data","metadata":{}},{"cell_type":"code","source":"csv_path = '/kaggle/input/home-credit-credit-risk-model-stability/csv_files'\nparquet_path = '/kaggle/input/home-credit-credit-risk-model-stability/parquet_files'\nfeature_def_path = '/kaggle/input/home-credit-credit-risk-model-stability/feature_definitions.csv'","metadata":{"execution":{"iopub.status.busy":"2024-02-20T18:40:20.530980Z","iopub.execute_input":"2024-02-20T18:40:20.531670Z","iopub.status.idle":"2024-02-20T18:40:20.537833Z","shell.execute_reply.started":"2024-02-20T18:40:20.531626Z","shell.execute_reply":"2024-02-20T18:40:20.536513Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#pandas lib\ndef get_metadata(path):\n    train_metadata = {}\n    for i in glob.glob(f'{path}/train/*.parquet'):\n        temp_df =  pd.read_parquet(i)\n        train_metadata[i.split(\"/\")[-1]] = [temp_df.shape, len(temp_df[\"case_id\"])]\n    \n    return train_metadata\n\n# %time train_metadata = get_metadata(parquet_path)","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2024-02-20T18:40:20.538802Z","iopub.execute_input":"2024-02-20T18:40:20.539108Z","iopub.status.idle":"2024-02-20T18:40:20.555107Z","shell.execute_reply.started":"2024-02-20T18:40:20.539084Z","shell.execute_reply":"2024-02-20T18:40:20.553999Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#polars lib\ndef get_metadata(path):\n    train_metadata = {}\n    for i in glob.glob(f'{path}/train/*.parquet'):\n        temp_df =  pl.read_parquet(i)\n        train_metadata[i.split(\"/\")[-1]] = [temp_df.shape, temp_df[\"case_id\"].n_unique()]\n    \n    return train_metadata\n\n# %time train_metadata = get_metadata(parquet_path)","metadata":{"execution":{"iopub.status.busy":"2024-02-20T18:40:20.558861Z","iopub.execute_input":"2024-02-20T18:40:20.559265Z","iopub.status.idle":"2024-02-20T18:40:20.568229Z","shell.execute_reply.started":"2024-02-20T18:40:20.559236Z","shell.execute_reply":"2024-02-20T18:40:20.567347Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# for key, val in sorted(train_metadata.items()):\n#     if key.startswith('train_static'):\n#         print(f'{key}: {val} -- Unique Case_IDs: {val[0][0]==val[1]}')\n        \n# unique_suffixes = [col[-1] for col in temp_df_level1.columns]\n# set(unique_suffixes)","metadata":{"_kg_hide-input":true,"_kg_hide-output":true,"execution":{"iopub.status.busy":"2024-02-20T18:40:20.569241Z","iopub.execute_input":"2024-02-20T18:40:20.569753Z","iopub.status.idle":"2024-02-20T18:40:20.579336Z","shell.execute_reply.started":"2024-02-20T18:40:20.569725Z","shell.execute_reply":"2024-02-20T18:40:20.578464Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"feature_def = pl.read_csv(feature_def_path)\n\ndef get_feature_def(col_name):\n    for index, row in feature_def.iterrows():\n        if feature_def['Variable'].iloc[index] == col_name:\n            return feature_def.iloc[index]['Description']\n    else: return 'No such feature'","metadata":{"execution":{"iopub.status.busy":"2024-02-20T18:40:20.580371Z","iopub.execute_input":"2024-02-20T18:40:20.581203Z","iopub.status.idle":"2024-02-20T18:40:20.765900Z","shell.execute_reply.started":"2024-02-20T18:40:20.581172Z","shell.execute_reply":"2024-02-20T18:40:20.765048Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Load and Aggregate Train Files","metadata":{}},{"cell_type":"code","source":"def agg_df(df):\n    agg_exp = [pl.max(col).alias(f'max_{col}') for col in df.columns if col not in ['case_id', 'num_group1']]\n    df = df.group_by('case_id').agg(agg_exp)\n    \n    return df","metadata":{"execution":{"iopub.status.busy":"2024-02-20T18:40:20.768848Z","iopub.execute_input":"2024-02-20T18:40:20.769194Z","iopub.status.idle":"2024-02-20T18:40:20.775029Z","shell.execute_reply.started":"2024-02-20T18:40:20.769167Z","shell.execute_reply":"2024-02-20T18:40:20.773894Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def merge_train_parquets(base_df, name, prefix=\"train\", folder=parquet_path):\n    temp_df = pl.read_parquet(f'{folder}/{prefix}/{prefix}_{name}*.parquet')\n    print(f'{name} shape: {temp_df.shape}')\n    \n    if len(temp_df) > temp_df['case_id'].n_unique():\n        temp_df = agg_df(temp_df)\n        print(f'Multiple records per Case_ID, aggregated to shape: {temp_df.shape}')\n        \n    base_df = base_df.join(temp_df, how = 'left', on='case_id')\n    print(f'Merged {name}, current size: {base_df.shape}\\n')\n    \n    return base_df","metadata":{"execution":{"iopub.status.busy":"2024-02-20T18:40:20.776448Z","iopub.execute_input":"2024-02-20T18:40:20.777419Z","iopub.status.idle":"2024-02-20T18:40:20.795606Z","shell.execute_reply.started":"2024-02-20T18:40:20.777378Z","shell.execute_reply":"2024-02-20T18:40:20.794436Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = pl.read_csv(f'{csv_path}/train/train_base.csv')\nprint(f'Total Size {train_df.shape} \\nUnique Case_IDs: {len(train_df[\"case_id\"])}')\ntrain_df.schema","metadata":{"execution":{"iopub.status.busy":"2024-02-20T18:40:20.797177Z","iopub.execute_input":"2024-02-20T18:40:20.797492Z","iopub.status.idle":"2024-02-20T18:40:21.134791Z","shell.execute_reply.started":"2024-02-20T18:40:20.797467Z","shell.execute_reply":"2024-02-20T18:40:21.133643Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = train_df.with_columns(pl.col('date_decision').cast(pl.Date))\ntrain_df.head()","metadata":{"execution":{"iopub.status.busy":"2024-02-20T18:40:21.139427Z","iopub.execute_input":"2024-02-20T18:40:21.140324Z","iopub.status.idle":"2024-02-20T18:40:21.377659Z","shell.execute_reply.started":"2024-02-20T18:40:21.140286Z","shell.execute_reply":"2024-02-20T18:40:21.376491Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = merge_train_parquets(train_df, 'static_0')\ntrain_df = merge_train_parquets(train_df, 'static_cb')\ntrain_df = merge_train_parquets(train_df, 'applprev_1_')\ntrain_df = merge_train_parquets(train_df, 'credit_bureau_a_1_')\ntrain_df = merge_train_parquets(train_df, 'credit_bureau_b_1')\ntrain_df = merge_train_parquets(train_df, 'debitcard_1')\ntrain_df = merge_train_parquets(train_df, 'deposit_1')\n# train_df = merge_train_parquets(train_df, 'other_1')\ntrain_df = merge_train_parquets(train_df, 'person_1')\n# train_df = merge_train_parquets(train_df, 'person_2')\ntrain_df = merge_train_parquets(train_df, 'tax_registry_a')\ntrain_df = merge_train_parquets(train_df, 'tax_registry_b')\n# train_df = merge_train_parquets(train_df, 'tax_registry_c')","metadata":{"execution":{"iopub.status.busy":"2024-02-20T18:40:21.379089Z","iopub.execute_input":"2024-02-20T18:40:21.379431Z","iopub.status.idle":"2024-02-20T18:41:33.456070Z","shell.execute_reply.started":"2024-02-20T18:40:21.379402Z","shell.execute_reply":"2024-02-20T18:41:33.455058Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(f'Total Size {train_df.shape} \\nUnique Case_IDs: {len(train_df[\"case_id\"])} \\nTotal Features: {len(train_df.columns)}')","metadata":{"execution":{"iopub.status.busy":"2024-02-20T18:41:33.457068Z","iopub.execute_input":"2024-02-20T18:41:33.457392Z","iopub.status.idle":"2024-02-20T18:41:33.463194Z","shell.execute_reply.started":"2024-02-20T18:41:33.457363Z","shell.execute_reply":"2024-02-20T18:41:33.462368Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Load and Aggregate Test Files","metadata":{}},{"cell_type":"code","source":"test_df = pl.read_csv(f'{csv_path}/test/test_base.csv')\nprint(f'Total Size {test_df.shape} \\nUnique Case_IDs: {len(test_df[\"case_id\"])}')","metadata":{"execution":{"iopub.status.busy":"2024-02-20T18:41:33.464548Z","iopub.execute_input":"2024-02-20T18:41:33.464908Z","iopub.status.idle":"2024-02-20T18:41:33.484430Z","shell.execute_reply.started":"2024-02-20T18:41:33.464883Z","shell.execute_reply":"2024-02-20T18:41:33.483471Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_df = test_df.with_columns(pl.col('date_decision').cast(pl.Date))\n# train_df = train_df.drop(columns= ['WEEK_NUM', 'MONTH'])\ntest_df.head()","metadata":{"execution":{"iopub.status.busy":"2024-02-20T18:41:33.485681Z","iopub.execute_input":"2024-02-20T18:41:33.486240Z","iopub.status.idle":"2024-02-20T18:41:33.494117Z","shell.execute_reply.started":"2024-02-20T18:41:33.486212Z","shell.execute_reply":"2024-02-20T18:41:33.493194Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def merge_test_parquets(base_df, name, prefix=\"test\", folder=parquet_path):\n    temp_df = pd.concat([pd.read_parquet(file) for file in glob.glob(f\"{folder}/{prefix}/{prefix}_{name}*.parquet\")])\n    temp_df = pl.from_pandas(temp_df)\n    \n    print(f'{name} shape: {temp_df.shape}')\n    \n    if len(temp_df) > temp_df['case_id'].n_unique():\n        temp_df = agg_df(temp_df)\n        print(f'Multiple records per Case_ID, aggregated to shape: {temp_df.shape}')\n        \n    base_df = base_df.join(temp_df, how = 'left', on='case_id')\n    print(f'Merged {name}, current size: {base_df.shape}\\n')\n    \n    return base_df","metadata":{"execution":{"iopub.status.busy":"2024-02-20T18:41:33.495525Z","iopub.execute_input":"2024-02-20T18:41:33.496021Z","iopub.status.idle":"2024-02-20T18:41:33.508825Z","shell.execute_reply.started":"2024-02-20T18:41:33.495992Z","shell.execute_reply":"2024-02-20T18:41:33.507762Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_df = merge_test_parquets(test_df, 'static_0')\ntest_df = merge_test_parquets(test_df, 'static_cb')\ntest_df = merge_test_parquets(test_df, 'applprev_1_')\ntest_df = merge_test_parquets(test_df, 'credit_bureau_a_1_')\ntest_df = merge_test_parquets(test_df, 'credit_bureau_b_1')\ntest_df = merge_test_parquets(test_df, 'debitcard_1')\ntest_df = merge_test_parquets(test_df, 'deposit_1')\n# test_df = merge_test_parquets(test_df, 'other_1')\ntest_df = merge_test_parquets(test_df, 'person_1')\n# test_df = merge_test_parquets(test_df, 'person_2')\ntest_df = merge_test_parquets(test_df, 'tax_registry_a')\ntest_df = merge_test_parquets(test_df, 'tax_registry_b')\n# test_df = merge_test_parquets(test_df, 'tax_registry_c')","metadata":{"execution":{"iopub.status.busy":"2024-02-20T18:41:33.510286Z","iopub.execute_input":"2024-02-20T18:41:33.510910Z","iopub.status.idle":"2024-02-20T18:41:34.099047Z","shell.execute_reply.started":"2024-02-20T18:41:33.510879Z","shell.execute_reply":"2024-02-20T18:41:34.098019Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(f'Total Size {test_df.shape} \\nUnique Case_IDs: {len(test_df[\"case_id\"])} \\nTotal Features: {len(test_df.columns)}')","metadata":{"execution":{"iopub.status.busy":"2024-02-20T18:41:34.100504Z","iopub.execute_input":"2024-02-20T18:41:34.100829Z","iopub.status.idle":"2024-02-20T18:41:34.106260Z","shell.execute_reply.started":"2024-02-20T18:41:34.100802Z","shell.execute_reply":"2024-02-20T18:41:34.105238Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cols_not_in_train = list(set(test_df.columns) - set(train_df.columns))\ncols_not_in_test = list(set(train_df.columns) - set(test_df.columns))\ncols_not_in_test.remove('target')\nprint(f'cols_not_in_train: {cols_not_in_train} \\n\\ncols_not_in_test: {cols_not_in_test}')","metadata":{"execution":{"iopub.status.busy":"2024-02-20T18:41:34.107982Z","iopub.execute_input":"2024-02-20T18:41:34.108383Z","iopub.status.idle":"2024-02-20T18:41:34.120000Z","shell.execute_reply.started":"2024-02-20T18:41:34.108352Z","shell.execute_reply":"2024-02-20T18:41:34.118882Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"starts_with_str = \"max_amount_\"\n\nfor i in test_df.columns:\n    if i.startswith(starts_with_str):\n        print('test:', i)\nprint('\\n')\nfor i in train_df.columns:\n    if i.startswith(starts_with_str):\n        print('train:', i)","metadata":{"execution":{"iopub.status.busy":"2024-02-20T18:41:34.121470Z","iopub.execute_input":"2024-02-20T18:41:34.121865Z","iopub.status.idle":"2024-02-20T18:41:34.131289Z","shell.execute_reply.started":"2024-02-20T18:41:34.121831Z","shell.execute_reply":"2024-02-20T18:41:34.130113Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = train_df.drop(cols_not_in_test)\nprint(train_df.shape)\ntest_df = test_df.drop(cols_not_in_train)\nprint(test_df.shape)","metadata":{"execution":{"iopub.status.busy":"2024-02-20T18:41:34.132490Z","iopub.execute_input":"2024-02-20T18:41:34.132979Z","iopub.status.idle":"2024-02-20T18:41:34.156109Z","shell.execute_reply.started":"2024-02-20T18:41:34.132931Z","shell.execute_reply":"2024-02-20T18:41:34.155201Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"invalid_columns = [\n    \"date_decision\", \"bankacctype_710L\", \"cardtype_51L\", \"credtype_322L\", \"datefirstoffer_1144D\", \n    \"datelastinstal40dpd_247D\", \"datelastunpaid_3546854D\", \"disbursementtype_67L\", \"dtlastpmtallstes_4499206D\", \n    \"equalitydataagreement_891L\", \"equalityempfrom_62L\", \"firstclxcampaign_1125D\", \"firstdatedue_489D\", \n    \"inittransactioncode_186L\", \"isbidproductrequest_292L\", \"isdebitcard_729L\", \"lastactivateddate_801D\", \n    \"lastapplicationdate_877D\", \"lastapprcommoditycat_1041M\", \"lastapprcommoditytypec_5251766M\", \n    \"lastapprdate_640D\", \"lastcancelreason_561M\", \"lastdelinqdate_224D\", \"lastrejectcommoditycat_161M\", \n    \"lastrejectcommodtypec_5251769M\", \"lastrejectdate_50D\", \"lastrejectreason_759M\", \n    \"lastrejectreasonclient_4145040M\", \"lastrepayingdate_696D\", \"lastst_736L\", \"maxdpdinstldate_3546855D\", \n    \"opencred_647L\", \"paytype1st_925L\", \"paytype_783L\", \"payvacationpostpone_4187118D\", \n    \"previouscontdistrict_112M\", \"twobodfilling_608L\", \"typesuite_864L\", \"assignmentdate_4527235D\", \n    \"assignmentdate_4955616D\", \"dateofbirth_337D\", \"dateofbirth_342D\", \"description_5085714M\", \n    \"education_1103M\", \"education_88M\", \"maritalst_385M\", \"maritalst_893M\", \"requesttype_4525192L\", \n    \"responsedate_4527233D\", \"responsedate_4917613D\", \"riskassesment_302T\", \"max_approvaldate_319D\", \n    \"max_cancelreason_3545846M\", \"max_creationdate_885D\", \"max_credacc_status_367L\", \"max_credtype_587L\", \n    \"max_dateactivated_425D\", \"max_district_544M\", \"max_dtlastpmt_581D\", \"max_dtlastpmtallstes_3545839D\", \n    \"max_education_1138M\", \"max_employedfrom_700D\", \"max_familystate_726L\", \"max_firstnonzeroinstldate_307D\", \n    \"max_inittransactioncode_279L\", \"max_isbidproduct_390L\", \"max_isdebitcard_527L\", \"max_postype_4733339M\", \n    \"max_profession_152M\", \"max_rejectreason_755M\", \"max_rejectreasonclient_4145042M\", \"max_status_219L\", \n    \"max_classificationofcontr_13M\", \"max_classificationofcontr_400M\", \"max_contractst_545M\", \n    \"max_contractst_964M\", \"max_dateofcredend_289D\", \"max_dateofcredend_353D\", \"max_dateofcredstart_181D\", \n    \"max_dateofcredstart_739D\", \"max_dateofrealrepmt_138D\", \"max_description_351M\", \n    \"max_financialinstitution_382M\", \"max_financialinstitution_591M\", \"max_lastupdate_1112D\", \n    \"max_lastupdate_388D\", \"max_numberofoverdueinstlmaxdat_148D\", \"max_numberofoverdueinstlmaxdat_641D\", \n    \"max_overdueamountmax2date_1002D\", \"max_overdueamountmax2date_1142D\", \"max_purposeofcred_426M\", \n    \"max_purposeofcred_874M\", \"max_refreshdate_3813885D\", \"max_subjectrole_182M\", \"max_subjectrole_93M\", \n    \"max_classificationofcontr_1114M\", \"max_contractdate_551D\", \"max_contractmaturitydate_151D\", \n    \"max_contractst_516M\", \"max_contracttype_653M\", \"max_credor_3940957M\", \"max_lastupdate_260D\", \n    \"max_periodicityofpmts_997L\", \"max_periodicityofpmts_997M\", \"max_pmtmethod_731M\", \n    \"max_purposeofcred_722M\", \"max_subjectrole_326M\", \"max_subjectrole_43M\", \"max_birth_259D\", \n    \"max_birthdate_87D\", \"max_contaddr_district_15M\", \"max_contaddr_matchlist_1032L\", \n    \"max_contaddr_smempladdr_334L\", \"max_contaddr_zipcode_807M\", \"max_education_927M\", \n    \"max_empl_employedfrom_271D\", \"max_empl_employedtotal_800L\", \"max_empl_industry_691L\", \n    \"max_empladdr_district_926M\", \"max_empladdr_zipcode_114M\", \"max_familystate_447L\", \"max_gender_992L\", \n    \"max_housetype_905L\", \"max_housingtype_772L\", \"max_incometype_1044T\", \"max_isreference_387L\", \n    \"max_language1_981M\", \"max_maritalst_703L\", \"max_registaddr_district_1083M\", \n    \"max_registaddr_zipcode_184M\", \"max_relationshiptoclient_415T\", \"max_relationshiptoclient_642T\", \n    \"max_remitter_829L\", \"max_role_1084L\", \"max_role_993L\", \"max_safeguarantyflag_411L\", \"max_sex_738L\", \n    \"max_type_25L\", \"max_name_4527232M\", \"max_recorddate_4527225D\", \"max_deductiondate_4917603D\", \n    \"max_name_4917606M\", \"validfrom_1069D\", \"assignmentdate_238D\", \"birthdate_574D\", \"responsedate_1012D\"\n]\n\ntrain_df = train_df.drop(columns=invalid_columns)\ntest_df = test_df.drop(columns=invalid_columns)","metadata":{"execution":{"iopub.status.busy":"2024-02-20T18:41:34.159168Z","iopub.execute_input":"2024-02-20T18:41:34.159470Z","iopub.status.idle":"2024-02-20T18:41:34.344156Z","shell.execute_reply.started":"2024-02-20T18:41:34.159445Z","shell.execute_reply":"2024-02-20T18:41:34.343086Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_cols = [col for col in train_df.columns if col != 'target']\ntest_df = test_df[train_cols]","metadata":{"execution":{"iopub.status.busy":"2024-02-20T18:41:34.345333Z","iopub.execute_input":"2024-02-20T18:41:34.345625Z","iopub.status.idle":"2024-02-20T18:41:34.350421Z","shell.execute_reply.started":"2024-02-20T18:41:34.345600Z","shell.execute_reply":"2024-02-20T18:41:34.349461Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def handle_nulls(df):\n    for col in df.columns:\n        if col not in ['target', 'case_id', 'WEEK_NUM']:\n            is_null_mean = df[col].is_null().mean()\n            if is_null_mean > 0.95:\n                df = df.drop(col)\n            \n    return df","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2024-02-20T18:41:34.351942Z","iopub.execute_input":"2024-02-20T18:41:34.352651Z","iopub.status.idle":"2024-02-20T18:41:34.367784Z","shell.execute_reply.started":"2024-02-20T18:41:34.352612Z","shell.execute_reply":"2024-02-20T18:41:34.367005Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# train_df.write_parquet('train_df.parquet')\n# test_df.write_parquet('test_df.parquet')","metadata":{"execution":{"iopub.status.busy":"2024-02-20T18:41:34.368767Z","iopub.execute_input":"2024-02-20T18:41:34.369169Z","iopub.status.idle":"2024-02-20T18:41:34.379886Z","shell.execute_reply.started":"2024-02-20T18:41:34.369134Z","shell.execute_reply":"2024-02-20T18:41:34.378668Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#load train and test df\n# train_df = pd.read_parquet('/kaggle/input/home-credit-risk-stability-dataset/train_df.parquet')\n# test_df = pd.read_parquet('/kaggle/input/home-credit-risk-stability-dataset/test_df.parquet')\n\ntrain_df = train_df.to_pandas()\ntest_df = test_df.to_pandas()\n\nprint(f'Train size: {train_df.shape}\\nTest size: {test_df.shape}')","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2024-02-20T18:41:34.380932Z","iopub.execute_input":"2024-02-20T18:41:34.381351Z","iopub.status.idle":"2024-02-20T18:41:36.252029Z","shell.execute_reply.started":"2024-02-20T18:41:34.381316Z","shell.execute_reply":"2024-02-20T18:41:36.250220Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# for col in train_df.columns:\n#     if (train_df[col].dtype == 'object') and (('date' in col) or col[-1] == 'D'):\n#         train_df[col] = pd.to_datetime(train_df[col])\n#         unique_count = train_df[col].nunique()\n#         print(col, train_df[col].dtype, unique_count)","metadata":{"execution":{"iopub.status.busy":"2024-02-20T18:41:36.253232Z","iopub.execute_input":"2024-02-20T18:41:36.253527Z","iopub.status.idle":"2024-02-20T18:41:36.257566Z","shell.execute_reply.started":"2024-02-20T18:41:36.253503Z","shell.execute_reply":"2024-02-20T18:41:36.256520Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def convert_dtypes(df):\n    for col in df.columns:\n        if df[col].dtype == 'float64':\n            if df[col].dropna().apply(float.is_integer).all():\n                df[col] = pd.to_numeric(df[col], downcast='integer')\n            else:\n                df[col] = pd.to_numeric(df[col], downcast='float')\n        elif (train_df[col].dtype == 'object') and (('date' in col) or col[-1] == 'D'):\n            train_df[col] = pd.to_datetime(train_df[col])\n        elif df[col].dtype == 'object':\n            df[col] = df[col].astype('category')        \n    return df","metadata":{"execution":{"iopub.status.busy":"2024-02-20T18:41:36.259175Z","iopub.execute_input":"2024-02-20T18:41:36.260303Z","iopub.status.idle":"2024-02-20T18:41:36.272011Z","shell.execute_reply.started":"2024-02-20T18:41:36.260238Z","shell.execute_reply":"2024-02-20T18:41:36.271234Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = convert_dtypes(train_df)\ntest_df = convert_dtypes(test_df)","metadata":{"execution":{"iopub.status.busy":"2024-02-20T18:41:36.277962Z","iopub.execute_input":"2024-02-20T18:41:36.279065Z","iopub.status.idle":"2024-02-20T18:42:35.791524Z","shell.execute_reply.started":"2024-02-20T18:41:36.279027Z","shell.execute_reply":"2024-02-20T18:42:35.790379Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"object_cols = {}\n\nfor col in train_df.columns:\n    if train_df[col].dtype == 'category':\n        unique_count = train_df[col].nunique()\n        object_cols[col] = unique_count\n    else: continue\n        \nlen(object_cols)\n# sorted(object_cols.items(), key = lambda x:x[1], reverse=True)","metadata":{"execution":{"iopub.status.busy":"2024-02-20T18:42:35.793456Z","iopub.execute_input":"2024-02-20T18:42:35.794003Z","iopub.status.idle":"2024-02-20T18:42:35.815863Z","shell.execute_reply.started":"2024-02-20T18:42:35.793944Z","shell.execute_reply":"2024-02-20T18:42:35.814725Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# A: dtype('float32'), dtype('float64') | 'client...'\n# P: dtype('int32'), dtype('float32'), dtype('float64')\n# M: CategoricalDtype\n# D: dtype('<M8[ns]'), dtype('O')\n# T: CategoricalDtype\n# L: CategoricalDtype, Int\n\n# col_set = []\n\n# for col in train_df.columns:\n#     if col[-1] == 'L':\n#         col_set.append(train_df[col].dtype)\n#         print(f'{col}, {train_df[col].dtype}, {train_df[col].nunique()}, \\n')\n\n# set(col_set)","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2024-02-20T18:42:35.817731Z","iopub.execute_input":"2024-02-20T18:42:35.818155Z","iopub.status.idle":"2024-02-20T18:42:35.824418Z","shell.execute_reply.started":"2024-02-20T18:42:35.818119Z","shell.execute_reply":"2024-02-20T18:42:35.823004Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# sns.countplot(train_df, x=train_df['target'])\n# plt.show()","metadata":{"execution":{"iopub.status.busy":"2024-02-20T18:42:35.826196Z","iopub.execute_input":"2024-02-20T18:42:35.826611Z","iopub.status.idle":"2024-02-20T18:42:35.844551Z","shell.execute_reply.started":"2024-02-20T18:42:35.826575Z","shell.execute_reply":"2024-02-20T18:42:35.843224Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x = train_df.drop(columns=['case_id', 'WEEK_NUM', 'target'])\nX = x.iloc[:700000, :]\n\ny = train_df['target']\nY = y[:700000]\nWEEKS = train_df['WEEK_NUM']\n\nX.shape, Y.shape","metadata":{"execution":{"iopub.status.busy":"2024-02-20T18:42:35.846326Z","iopub.execute_input":"2024-02-20T18:42:35.847086Z","iopub.status.idle":"2024-02-20T18:42:38.706658Z","shell.execute_reply.started":"2024-02-20T18:42:35.847046Z","shell.execute_reply":"2024-02-20T18:42:38.705334Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_x, valid_x, train_y, valid_y = train_test_split(X, Y, random_state = 42, shuffle = True, test_size = 0.2)","metadata":{"execution":{"iopub.status.busy":"2024-02-20T18:42:38.708157Z","iopub.execute_input":"2024-02-20T18:42:38.708498Z","iopub.status.idle":"2024-02-20T18:42:42.957943Z","shell.execute_reply.started":"2024-02-20T18:42:38.708470Z","shell.execute_reply":"2024-02-20T18:42:42.956756Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Training: XGBoost","metadata":{}},{"cell_type":"code","source":"cv = StratifiedGroupKFold(n_splits=5, shuffle=False)\n\nmodel = xgb.XGBClassifier(\n#     device = 'cuda',\n    tree_method=\"hist\",\n    objective = 'binary:logistic',\n#     booster = 'dart',\n    enable_categorical=True,\n    max_depth = 10,\n    min_child_weight = 1,\n    learning_rate = 0.09,\n    gamma = 0.05,\n    eval_metric = 'auc',\n    subsample = 0.7,\n)","metadata":{"execution":{"iopub.status.busy":"2024-02-20T18:42:42.959435Z","iopub.execute_input":"2024-02-20T18:42:42.959784Z","iopub.status.idle":"2024-02-20T18:42:42.965343Z","shell.execute_reply.started":"2024-02-20T18:42:42.959755Z","shell.execute_reply":"2024-02-20T18:42:42.964138Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for col in train_df.columns:\n    if train_df[col].dtype == 'datetime64[ns]':\n        print(col)","metadata":{"execution":{"iopub.status.busy":"2024-02-20T18:42:42.966994Z","iopub.execute_input":"2024-02-20T18:42:42.967309Z","iopub.status.idle":"2024-02-20T18:42:42.982532Z","shell.execute_reply.started":"2024-02-20T18:42:42.967283Z","shell.execute_reply":"2024-02-20T18:42:42.981513Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# model.fit(\n#     train_x, train_y,\n#     eval_set = [(valid_x, valid_y)],\n#     early_stopping_rounds=5,\n#     verbose=True,\n# )","metadata":{"_kg_hide-output":true,"execution":{"iopub.status.busy":"2024-02-20T18:42:42.983980Z","iopub.execute_input":"2024-02-20T18:42:42.984319Z","iopub.status.idle":"2024-02-20T19:11:34.612742Z","shell.execute_reply.started":"2024-02-20T18:42:42.984292Z","shell.execute_reply":"2024-02-20T19:11:34.611421Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# model.save_model('xgb_model_2.json')","metadata":{"execution":{"iopub.status.busy":"2024-02-20T19:17:14.420313Z","iopub.execute_input":"2024-02-20T19:17:14.421945Z","iopub.status.idle":"2024-02-20T19:17:14.506651Z","shell.execute_reply.started":"2024-02-20T19:17:14.421858Z","shell.execute_reply":"2024-02-20T19:17:14.505294Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Prediction","metadata":{}},{"cell_type":"code","source":"model.load_model('/kaggle/input/credit-risk-models/xgb_model_2.json')","metadata":{"execution":{"iopub.status.busy":"2024-02-20T19:23:31.521844Z","iopub.execute_input":"2024-02-20T19:23:31.522346Z","iopub.status.idle":"2024-02-20T19:23:31.695671Z","shell.execute_reply.started":"2024-02-20T19:23:31.522310Z","shell.execute_reply":"2024-02-20T19:23:31.694363Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_df.replace([np.inf, -np.inf], np.nan, inplace=True)\ntest_df = test_df[x.columns]\n# test_df = test_df.set_index('case_id')\n# y_pred = np.clip(np.nan_to_num(model.predict_proba(test_df)[:, 1], nan=0.3), 0, 1)\n\nbatch_size = 5000\nall_predictions = []\n\nfor start in range(0, len(test_df), batch_size):\n    end = start + batch_size\n    X_batch = test_df[start:end]\n    \n    batch_predictions = np.clip(np.nan_to_num(model.predict_proba(test_df)[:, 1], nan=0.3), 0, 1)\n    \n    all_predictions.append(batch_predictions)\n\ny_pred = np.vstack(all_predictions)","metadata":{"execution":{"iopub.status.busy":"2024-02-20T19:23:49.365101Z","iopub.execute_input":"2024-02-20T19:23:49.365651Z","iopub.status.idle":"2024-02-20T19:23:49.413329Z","shell.execute_reply.started":"2024-02-20T19:23:49.365607Z","shell.execute_reply":"2024-02-20T19:23:49.412284Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_sub = pd.read_csv('/kaggle/input/home-credit-credit-risk-model-stability/sample_submission.csv')\n# df_sub = df_sub.set_index('case_id')\ndf_sub['score'] = y_pred[0]\ndf_sub['case_id'] = df_sub['case_id'].astype('int64')\ndf_sub['score'] = df_sub['score'].astype('float64')\ndf_sub.dtypes","metadata":{"execution":{"iopub.status.busy":"2024-02-20T19:24:01.940856Z","iopub.execute_input":"2024-02-20T19:24:01.941306Z","iopub.status.idle":"2024-02-20T19:24:01.957326Z","shell.execute_reply.started":"2024-02-20T19:24:01.941274Z","shell.execute_reply":"2024-02-20T19:24:01.956027Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_sub[\"score\"].isnull().any()","metadata":{"execution":{"iopub.status.busy":"2024-02-20T19:24:05.777459Z","iopub.execute_input":"2024-02-20T19:24:05.779217Z","iopub.status.idle":"2024-02-20T19:24:05.789103Z","shell.execute_reply.started":"2024-02-20T19:24:05.779151Z","shell.execute_reply":"2024-02-20T19:24:05.787707Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_sub.to_csv('submission.csv', index=False)\n!head submission.csv","metadata":{"execution":{"iopub.status.busy":"2024-02-20T19:24:06.965571Z","iopub.execute_input":"2024-02-20T19:24:06.966081Z","iopub.status.idle":"2024-02-20T19:24:08.177999Z","shell.execute_reply.started":"2024-02-20T19:24:06.966043Z","shell.execute_reply":"2024-02-20T19:24:08.176553Z"},"trusted":true},"execution_count":null,"outputs":[]}]}