{"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"}],"dockerImageVersionId":30684,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# COMMAND ----------\n\nimport sys\nfrom pathlib import Path\nimport subprocess\nimport os\nimport gc\nfrom glob import glob\nimport boto3\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\nfrom sklearn.model_selection import TimeSeriesSplit, GroupKFold, StratifiedGroupKFold\nfrom sklearn.base import BaseEstimator, RegressorMixin\nfrom sklearn.metrics import roc_auc_score\nimport lightgbm as lgb\nimport xgboost as xgb\nfrom sklearn.ensemble import GradientBoostingClassifier\n\nfrom imblearn.over_sampling import SMOTE\nfrom sklearn.preprocessing import OrdinalEncoder\nfrom sklearn.impute import KNNImputer\nimport os\n\nKAGGLE = True\n\n# COMMAND ----------\n\nif not KAGGLE:\n    os.chdir('/Workspace/Users/Elliott.Sloate@nrg.com/Hackathon Q2 2024')\n\n# COMMAND ----------\n\nif KAGGLE:\n    ROOT            = \"/kaggle/input/home-credit-credit-risk-model-stability\"\n    TRAIN_DIR       = ROOT + \"/parquet_files\" + \"/train/\"\n    TEST_DIR        = ROOT + \"/parquet_files\" + \"/test/\"\nelse:\n    from module_nonspark.s3ops import fetch_pkl, store_pkl\n    from module_spark.dfops import env, conf\n    ROOT            = '/Workspace/Users/Elliott.Sloate@nrg.com/Hackathon Q2 2024'\n\n    TRAIN_DIR       = ROOT + \"/parquet_files/train/\"\n    TEST_DIR        = ROOT + \"/parquet_files/test/\"\n\n\n# COMMAND ----------\n\nclass 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.95:\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\n\n\nclass Aggregator:\n    #Please add or subtract features yourself, be aware that too many features will take up too much space.\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        #expr_sum = [pl.sum(col).alias(f\"sum_{col}\") for col in cols]\n        expr_last = [pl.last(col).alias(f\"last_{col}\") for col in cols]\n        #expr_first = [pl.first(col).alias(f\"first_{col}\") for col in cols]\n        expr_mean = [pl.mean(col).alias(f\"mean_{col}\") for col in cols]\n        return expr_max +expr_last+expr_mean\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        #expr_min = [pl.min(col).alias(f\"min_{col}\") for col in cols]\n        expr_last = [pl.last(col).alias(f\"last_{col}\") for col in cols]\n        #expr_first = [pl.first(col).alias(f\"first_{col}\") for col in cols]\n        expr_mean = [pl.mean(col).alias(f\"mean_{col}\") for col in cols]\n        return  expr_max +expr_last+expr_mean\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        #expr_min = [pl.min(col).alias(f\"min_{col}\") for col in cols]\n        expr_last = [pl.last(col).alias(f\"last_{col}\") for col in cols]\n        #expr_first = [pl.first(col).alias(f\"first_{col}\") for col in cols]\n        #expr_count = [pl.count(col).alias(f\"count_{col}\") for col in cols]\n        return  expr_max +expr_last#+expr_count\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        #expr_min = [pl.min(col).alias(f\"min_{col}\") for col in cols]\n        expr_last = [pl.last(col).alias(f\"last_{col}\") for col in cols]\n        #expr_first = [pl.first(col).alias(f\"first_{col}\") for col in cols]\n        return  expr_max +expr_last\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] \n        #expr_min = [pl.min(col).alias(f\"min_{col}\") for col in cols]\n        expr_last = [pl.last(col).alias(f\"last_{col}\") for col in cols]\n        #expr_first = [pl.first(col).alias(f\"first_{col}\") for col in cols]\n        return  expr_max +expr_last\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\n        return exprs\n\ndef read_file(path, depth=None):\n    df = pl.read_parquet(path)\n    df = df.pipe(Pipeline.set_table_dtypes)\n    fill_cols = []\n    for col in fill_cols:\n        if col in df.columns:\n            df = df.with_column(\n                pl.col().fillna(0)\n            )\n\n    if depth in [1,2]:\n        df = df.group_by(\"case_id\").agg(Aggregator.get_exprs(df)) \n    return df\n\ndef list_all_parq_files(filepath):\n\n    s3_bucket = conf[env]['bucket_ads']\n\n    s3_client = boto3.client(\"s3\")\n    response = s3_client.list_objects_v2(Bucket=s3_bucket, Prefix=filepath)\n\n    if \"Contents\" in response:\n        files = [file[\"Key\"] for file in response[\"Contents\"]]\n        return files\n    else:\n        print(\"No files found in the specified path.\")\n\ndef get_files(regex_path):\n    rpath = regex_path.split('*')[0]\n    file_prefix = rpath.split('/')[-1]\n    if 'train' in regex_path:\n        files = [TRAIN_DIR + f for f in os.listdir(TRAIN_DIR) if file_prefix in f]\n    else:\n        files = [TEST_DIR + f for f in os.listdir(TEST_DIR) if file_prefix in f]\n    return files\n\ndef read_files(regex_path, depth=None):\n    chunks = []\n    \n    if KAGGLE:\n        files = glob(str(regex_path))\n    else:\n        files = get_files(regex_path)\n        print(files)\n    for fpath in files:\n        df = pl.read_parquet(fpath)\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\n\ndef 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\n    df_base = df_base.pipe(Pipeline.handle_dates)\n    return df_base\n\ndef 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\n\ndef 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\n\n# COMMAND ----------\n\ndata_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    ],\n    \"depth_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_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_file(TRAIN_DIR + \"train_applprev_2.parquet\", 2),\n        read_file(TRAIN_DIR + \"train_person_2.parquet\", 2)\n    ]\n}\n\nif KAGGLE:\n    data_store['depth_0'].append(read_files(TRAIN_DIR + \"train_static_0_*.parquet\"))\n    data_store['depth_1'].append(read_files(TRAIN_DIR + \"train_applprev_1_*.parquet\", 1))\n    data_store['depth_1'].append(read_files(TRAIN_DIR + \"train_credit_bureau_a_1_*.parquet\", 1))\n    data_store['depth_2'].append(read_files(TRAIN_DIR + \"train_credit_bureau_a_2_*.parquet\", 2))\nelse:\n\n    chunks = [read_file(TRAIN_DIR + \"train_static_0_0.parquet\"),read_file(TRAIN_DIR + \"train_static_0_1.parquet\")]\n    df = pl.concat(chunks, how=\"vertical_relaxed\")\n    data_store['depth_0'].append(df.unique(subset=[\"case_id\"]))\n    \n    chunks = [read_file(TRAIN_DIR + \"train_applprev_1_0.parquet\", 1),read_file(TRAIN_DIR + \"train_applprev_1_1.parquet\", 1)]\n    df = pl.concat(chunks, how=\"vertical_relaxed\")\n    data_store['depth_1'].append(df.unique(subset=[\"case_id\"]))\n    \n    chunks = [read_file(TRAIN_DIR + \"train_credit_bureau_a_1_0.parquet\", 1),\n              read_file(TRAIN_DIR + \"train_credit_bureau_a_1_1.parquet\", 1),\n              read_file(TRAIN_DIR + \"train_credit_bureau_a_1_2.parquet\", 1),\n              read_file(TRAIN_DIR + \"train_credit_bureau_a_1_3.parquet\", 1),]\n    \n    df = pl.concat(chunks, how=\"vertical_relaxed\")\n    data_store['depth_1'].append(df.unique(subset=[\"case_id\"]))\n\n    chunks = [read_file(TRAIN_DIR + \"train_credit_bureau_a_2_0.parquet\", 2),\n              read_file(TRAIN_DIR + \"train_credit_bureau_a_2_1.parquet\", 2),\n              read_file(TRAIN_DIR + \"train_credit_bureau_a_2_2.parquet\", 2),\n              read_file(TRAIN_DIR + \"train_credit_bureau_a_2_3.parquet\", 2),\n              read_file(TRAIN_DIR + \"train_credit_bureau_a_2_4.parquet\", 2),\n              read_file(TRAIN_DIR + \"train_credit_bureau_a_2_5.parquet\", 2),\n              read_file(TRAIN_DIR + \"train_credit_bureau_a_2_6.parquet\", 2),\n              read_file(TRAIN_DIR + \"train_credit_bureau_a_2_7.parquet\", 2),\n              read_file(TRAIN_DIR + \"train_credit_bureau_a_2_8.parquet\", 2),\n              read_file(TRAIN_DIR + \"train_credit_bureau_a_2_9.parquet\", 2),\n              read_file(TRAIN_DIR + \"train_credit_bureau_a_2_10.parquet\", 2),\n    ]\n    \n    df = pl.concat(chunks, how=\"vertical_relaxed\")\n    data_store['depth_2'].append(df.unique(subset=[\"case_id\"]))\n\n\n# COMMAND ----------\n\ndf_train = feature_eng(**data_store)\nprint(\"train data shape:\\t\", df_train.shape)\n\ndel data_store\ngc.collect()\ndf_train = df_train.pipe(Pipeline.filter_cols)\n\ndf_train, cat_cols = to_pandas(df_train)\ndf_train = reduce_mem_usage(df_train)\nprint(\"train data shape:\\t\", df_train.shape)\nif not KAGGLE:\n    store_pkl(df_train, bucket = conf[env]['bucket_ads'], s3Path = 'mine_rootile/loyalty/data/models/data/hthon_model_data.pkl')\n    store_pkl(cat_cols, bucket = conf[env]['bucket_ads'], s3Path = 'mine_rootile/loyalty/data/models/data/hthon_cat_cols.pkl')\n\n# COMMAND ----------\n\n\nnums=df_train.select_dtypes(exclude='category').columns\nfrom itertools import combinations, permutations\n#df_train=df_train[nums]\nnans_df = df_train[nums].isna()\nnans_groups={}\nfor col in nums:\n    cur_group = nans_df[col].sum()\n    try:\n        nans_groups[cur_group].append(col)\n    except:\n        nans_groups[cur_group]=[col]\ndel nans_df; x=gc.collect()\n\ndef reduce_group(grps):\n    use = []\n    for g in grps:\n        mx = 0; vx = g[0]\n        for gg in g:\n            n = df_train[gg].nunique()\n            if n>mx:\n                mx = n\n                vx = gg\n            #print(str(gg)+'-'+str(n),', ',end='')\n        use.append(vx)\n        #print()\n    print('Use these',use)\n    return use\n\ndef group_columns_by_correlation(matrix, threshold=0.8):\n    # Compute the correlation between columns.\n    correlation_matrix = matrix.corr()\n\n    # Grouping columns\n    groups = []\n    remaining_cols = list(matrix.columns)\n    while remaining_cols:\n        col = remaining_cols.pop(0)\n        group = [col]\n        correlated_cols = [col]\n        for c in remaining_cols:\n            if correlation_matrix.loc[col, c] >= threshold:\n                group.append(c)\n                correlated_cols.append(c)\n        groups.append(group)\n        remaining_cols = [c for c in remaining_cols if c not in correlated_cols]\n    \n    return groups\n\nuses=[]\nfor k,v in nans_groups.items():\n    if len(v)>1:\n            Vs = nans_groups[k]\n            #cross_features=list(combinations(Vs, 2))\n            #make_corr(Vs)\n            grps= group_columns_by_correlation(df_train[Vs], threshold=0.95)\n            use=reduce_group(grps)\n            uses=uses+use\n            #make_corr(use)\n    else:\n        uses=uses+v\n    print('####### NAN count =',k)\n\nprint(uses)\nprint(len(uses))\nuses=uses+list(df_train.select_dtypes(include='category').columns)\nprint(len(uses))\ndf_train=df_train[uses]\n\n# COMMAND ----------\n\nif KAGGLE:\n    sample = pd.read_csv(\"/kaggle/input/home-credit-credit-risk-model-stability/sample_submission.csv\")\n    device = 'cpu'\nelse:\n    sample = pd.read_csv('s3://' + conf[env]['bucket_ads'] + '/mine_rootile/hackathon/hackathon_q2_2024_data/sample_submission.csv')\n    device = 'cpu'\n\n# COMMAND ----------\n\ndata_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    ],\n    \"depth_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_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_file(TEST_DIR + \"test_applprev_2.parquet\", 2),\n        read_file(TEST_DIR + \"test_person_2.parquet\", 2)\n    ]\n}\n\nif KAGGLE:\n    data_store['depth_0'].append(read_files(TEST_DIR + \"test_static_0_*.parquet\"))\n    data_store['depth_1'].append(read_files(TEST_DIR + \"test_applprev_1_*.parquet\", 1))\n    data_store['depth_1'].append(read_files(TEST_DIR + \"test_credit_bureau_a_1_*.parquet\", 1))\n    data_store['depth_2'].append(read_files(TEST_DIR + \"test_credit_bureau_a_2_*.parquet\", 2))\nelse:\n\n    chunks = [read_file(TRAIN_DIR + \"train_static_0_0.parquet\"),read_file(TRAIN_DIR + \"train_static_0_1.parquet\")]\n    df = pl.concat(chunks, how=\"vertical_relaxed\")\n    data_store['depth_0'].append(df.unique(subset=[\"case_id\"]))\n    \n    chunks = [read_file(TRAIN_DIR + \"train_applprev_1_0.parquet\", 1),read_file(TRAIN_DIR + \"train_applprev_1_1.parquet\", 1)]\n    df = pl.concat(chunks, how=\"vertical_relaxed\")\n    data_store['depth_1'].append(df.unique(subset=[\"case_id\"]))\n    \n    chunks = [read_file(TRAIN_DIR + \"train_credit_bureau_a_1_0.parquet\", 1),\n              read_file(TRAIN_DIR + \"train_credit_bureau_a_1_1.parquet\", 1),\n              read_file(TRAIN_DIR + \"train_credit_bureau_a_1_2.parquet\", 1),\n              read_file(TRAIN_DIR + \"train_credit_bureau_a_1_3.parquet\", 1),]\n    \n    df = pl.concat(chunks, how=\"vertical_relaxed\")\n    data_store['depth_1'].append(df.unique(subset=[\"case_id\"]))\n\n    chunks = [read_file(TRAIN_DIR + \"train_credit_bureau_a_2_0.parquet\", 2),\n              read_file(TRAIN_DIR + \"train_credit_bureau_a_2_1.parquet\", 2),\n              read_file(TRAIN_DIR + \"train_credit_bureau_a_2_2.parquet\", 2),\n              read_file(TRAIN_DIR + \"train_credit_bureau_a_2_3.parquet\", 2),\n              read_file(TRAIN_DIR + \"train_credit_bureau_a_2_4.parquet\", 2),\n              read_file(TRAIN_DIR + \"train_credit_bureau_a_2_5.parquet\", 2),\n              read_file(TRAIN_DIR + \"train_credit_bureau_a_2_6.parquet\", 2),\n              read_file(TRAIN_DIR + \"train_credit_bureau_a_2_7.parquet\", 2),\n              read_file(TRAIN_DIR + \"train_credit_bureau_a_2_8.parquet\", 2),\n              read_file(TRAIN_DIR + \"train_credit_bureau_a_2_9.parquet\", 2),\n              read_file(TRAIN_DIR + \"train_credit_bureau_a_2_10.parquet\", 2),\n    ]\n    \n    df = pl.concat(chunks, how=\"vertical_relaxed\")\n    data_store['depth_2'].append(df.unique(subset=[\"case_id\"]))\n\n# COMMAND ----------\n\ndf_test = feature_eng(**data_store)\nprint(\"test data shape:\\t\", df_test.shape)\ndel data_store\ngc.collect()\ndf_test = df_test.select([col for col in df_train.columns if col != \"target\"])\nprint(\"train data shape:\\t\", df_train.shape)\nprint(\"test data shape:\\t\", df_test.shape)\n\ndf_test, cat_cols = to_pandas(df_test, cat_cols)\ndf_test = reduce_mem_usage(df_test)\nweek_num = list(df_test[\"WEEK_NUM\"])\ngc.collect()\n\n#df_train = df_train.head(100000)\n\n# COMMAND ----------\nparams_lgb1 = {\n        \"objective\": \"binary\",\n        \"boosting_type\":\"gbdt\",\n        \"n_estimators\": 1000,\n        \"verbosity\": -1,\n        \"bagging_freq\": 1,\n        \"max_depth\": 5,\n        \"learning_rate\": 0.0881405590600479,\n        \"reg_alpha\" : 26,\n        \"reg_lambda\" : 39,\n        \"num_leaves\": 20,\n        \"subsample\": 0.7718831982797116,\n        \"colsample_bytree\": 0.9704442853713775,\n        \"min_child_samples\": 100,\n        \"min_data_in_leaf\": 40,\n    }\n\nparams_lgb2 = {\n        \"objective\": \"binary\",\n        \"boosting_type\":\"gbdt\",\n        \"n_estimators\": 1000,\n        \"verbosity\": -1,\n        \"bagging_freq\": 1,\n        \"max_depth\": 10,\n        \"learning_rate\": 0.0881405590600479,\n        \"reg_alpha\" : 100,\n        \"reg_lambda\" : 100,\n        \"num_leaves\": 10,\n        \"subsample\": 0.7718831982797116,\n        \"colsample_bytree\": 0.9704442853713775,\n        \"min_child_samples\": 200,\n        #\"min_data_in_leaf\": 40,\n    }\n\n\nparams_xgb = {\n    \"booster\": \"gbtree\",\n    \"objective\": \"binary:logistic\",\n    #\"eval_metric\": \"auc\",\n    \"max_depth\": 5,\n    \"learning_rate\": 0.05,\n    \"n_estimators\": 1000,\n    \"colsample_bytree\": 0.8,\n    \"colsample_bynode\": 0.8,\n    \"alpha\": 20,  \n    \"lambda\": 30,  \n    \"tree_method\": 'gpu_hist' if device == 'gpu' else 'auto',\n    \"random_state\": 42,\n    \"verbosity\": 0,\n    \"enable_categorical\":True,\n}\n\ny = df_train[\"target\"]\nweeks = df_train[\"WEEK_NUM\"]\ndf_train = df_train.drop(columns=[\"target\", \"case_id\", \"WEEK_NUM\"])\n\ndf_train[cat_cols] = df_train[cat_cols].astype(\"category\")\n\n    \n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-04-18T00:55:58.200094Z","iopub.execute_input":"2024-04-18T00:55:58.200845Z","iopub.status.idle":"2024-04-18T01:01:06.843936Z","shell.execute_reply.started":"2024-04-18T00:55:58.200809Z","shell.execute_reply":"2024-04-18T01:01:06.842595Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model1 = lgb.LGBMClassifier(**params_lgb1)\nmodel1.fit(df_train,y)\n\nmodel2 = lgb.LGBMClassifier(**params_lgb2)\nmodel2.fit(df_train,y)\n\nmodel3 = xgb.XGBClassifier(**params_xgb)\nmodel3.fit(df_train,y)","metadata":{"execution":{"iopub.status.busy":"2024-04-18T01:01:06.845794Z","iopub.execute_input":"2024-04-18T01:01:06.846188Z","iopub.status.idle":"2024-04-18T02:13:58.960873Z","shell.execute_reply.started":"2024-04-18T01:01:06.846154Z","shell.execute_reply":"2024-04-18T02:13:58.957387Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_train_pred1 = model1.predict_proba(df_train)\ny_train_pred2 = model2.predict_proba(df_train)\ny_train_pred3 = model3.predict_proba(df_train)","metadata":{"execution":{"iopub.status.busy":"2024-04-18T03:13:45.223811Z","iopub.execute_input":"2024-04-18T03:13:45.224351Z","iopub.status.idle":"2024-04-18T03:22:31.128301Z","shell.execute_reply.started":"2024-04-18T03:13:45.224308Z","shell.execute_reply":"2024-04-18T03:22:31.126466Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"meta_feats = pd.concat([pd.Series(y_train_pred1[:, 1]),pd.Series(y_train_pred2[:, 1]),pd.Series(y_train_pred3[:, 1])],axis=1)\nmeta_feats.columns = [\"lgb_1\",\"lgb_2\",\"xgb_1\"]","metadata":{"execution":{"iopub.status.busy":"2024-04-18T03:35:29.618211Z","iopub.execute_input":"2024-04-18T03:35:29.618912Z","iopub.status.idle":"2024-04-18T03:35:29.637558Z","shell.execute_reply.started":"2024-04-18T03:35:29.618849Z","shell.execute_reply":"2024-04-18T03:35:29.635978Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\nparams = {\n    'n_estimators': 12,\n    'learning_rate': 0.1,\n    'max_depth': 3,\n    'min_samples_split': 3,\n    'min_samples_leaf': 1\n}\n\nmeta_model = GradientBoostingClassifier(**params)\nmeta_model.fit(meta_feats, y)\n","metadata":{"execution":{"iopub.status.busy":"2024-04-18T03:35:57.017064Z","iopub.execute_input":"2024-04-18T03:35:57.017756Z","iopub.status.idle":"2024-04-18T03:36:38.800792Z","shell.execute_reply.started":"2024-04-18T03:35:57.017722Z","shell.execute_reply":"2024-04-18T03:36:38.799404Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_test = df_test.drop(columns=[\"WEEK_NUM\"])\ndf_test = df_test.set_index(\"case_id\")","metadata":{"execution":{"iopub.status.busy":"2024-04-18T03:39:34.713174Z","iopub.execute_input":"2024-04-18T03:39:34.714756Z","iopub.status.idle":"2024-04-18T03:39:36.230342Z","shell.execute_reply.started":"2024-04-18T03:39:34.714707Z","shell.execute_reply":"2024-04-18T03:39:36.228986Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_test_pred1 = model1.predict_proba(df_test)\ny_test_pred2 = model2.predict_proba(df_test)\ny_test_pred3 = model3.predict_proba(df_test)\n\nmeta_feats_test = pd.concat([pd.Series(y_test_pred1[:, 1]),pd.Series(y_test_pred2[:, 1]),pd.Series(y_test_pred3[:, 1])],axis=1)\nmeta_feats_test.columns = [\"lgb_1\",\"lgb_2\",\"xgb_1\"]","metadata":{"execution":{"iopub.status.busy":"2024-04-18T03:40:44.34729Z","iopub.execute_input":"2024-04-18T03:40:44.347798Z","iopub.status.idle":"2024-04-18T03:40:44.658713Z","shell.execute_reply.started":"2024-04-18T03:40:44.347761Z","shell.execute_reply":"2024-04-18T03:40:44.657701Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_pred = pd.Series(meta_model.predict_proba(meta_feats_test)[:, 1], index=df_test.index)\nsubm_df = pd.read_csv(ROOT + \"/sample_submission.csv\")\nsubm_df = subm_df.set_index(\"case_id\")\nsubm_df[\"score\"] = y_pred\nprint(\"Check null: \", subm_df[\"score\"].isnull().any())\n\nif KAGGLE:\n    subm_df.to_csv(\"submission.csv\")\nelse:\n    current_datetime = datetime.now().strftime(\"%Y%m%d%H%M\")\n    subm_df.to_csv(f\"s3://{conf[env]['bucket_ads']}/mine_rootile/loyalty/data/models/data/hackathon_submissions/ensemble_submission_{current_datetime}.csv\")","metadata":{"execution":{"iopub.status.busy":"2024-04-18T03:41:43.626725Z","iopub.execute_input":"2024-04-18T03:41:43.627114Z","iopub.status.idle":"2024-04-18T03:41:43.666649Z","shell.execute_reply.started":"2024-04-18T03:41:43.627086Z","shell.execute_reply":"2024-04-18T03:41:43.665602Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}