{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np \nimport matplotlib.pyplot as plt\nimport pandas as pd\nimport gc\nimport datetime\nimport pickle as pk\n\nfrom sklearn.model_selection import StratifiedKFold\nimport lightgbm as lgb\nfrom lightgbm import LGBMClassifier\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-12-22T14:33:38.858740Z","iopub.execute_input":"2022-12-22T14:33:38.859231Z","iopub.status.idle":"2022-12-22T14:33:41.332841Z","shell.execute_reply.started":"2022-12-22T14:33:38.859139Z","shell.execute_reply":"2022-12-22T14:33:41.331360Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def amex_metric(y_true: np.array, y_pred: np.array) -> float:\n\n    # count of positives and negatives\n    n_pos = y_true.sum()\n    n_neg = y_true.shape[0] - n_pos\n\n    # sorting by descring prediction values\n    indices = np.argsort(y_pred)[::-1]\n    preds, target = y_pred[indices], y_true[indices]\n\n    # filter the top 4% by cumulative row weights\n    weight = 20.0 - target * 19.0\n    cum_norm_weight = (weight / weight.sum()).cumsum()\n    four_pct_filter = cum_norm_weight <= 0.04\n\n    # default rate captured at 4%\n    d = target[four_pct_filter].sum() / n_pos\n\n    # weighted gini coefficient\n    lorentz = (target / n_pos).cumsum()\n    gini = ((lorentz - cum_norm_weight) * weight).sum()\n\n    # max weighted gini coefficient\n    gini_max = 10 * n_neg * (1 - 19 / (n_pos + 20 * n_neg))\n\n    # normalized weighted gini coefficient\n    g = gini / gini_max\n\n    return 0.5 * (g + d)\n\ndef lgb_amex_metric(y_true, y_pred):\n    \"\"\"The competition metric with lightgbm's calling convention\"\"\"\n    return ('amex',\n            amex_metric(y_true, y_pred),\n            True)","metadata":{"execution":{"iopub.status.busy":"2022-12-22T14:33:41.335063Z","iopub.execute_input":"2022-12-22T14:33:41.335789Z","iopub.status.idle":"2022-12-22T14:33:41.370810Z","shell.execute_reply.started":"2022-12-22T14:33:41.335745Z","shell.execute_reply":"2022-12-22T14:33:41.365863Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"feat = {}\nwith open('/kaggle/input/pickled-feat/feat', 'rb') as f:\n    feat = pk.load(f)","metadata":{"execution":{"iopub.status.busy":"2022-12-22T14:34:36.092865Z","iopub.execute_input":"2022-12-22T14:34:36.093460Z","iopub.status.idle":"2022-12-22T14:34:36.104365Z","shell.execute_reply.started":"2022-12-22T14:34:36.093414Z","shell.execute_reply":"2022-12-22T14:34:36.103006Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(feat.keys())","metadata":{"execution":{"iopub.status.busy":"2022-12-22T14:37:24.295519Z","iopub.execute_input":"2022-12-22T14:37:24.295898Z","iopub.status.idle":"2022-12-22T14:37:24.301554Z","shell.execute_reply.started":"2022-12-22T14:37:24.295867Z","shell.execute_reply":"2022-12-22T14:37:24.300432Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = pd.read_parquet(f'../input/amex-data-integer-dtypes-parquet-format/train.parquet')\ncat = ['S_2','B_30','B_38','D_114','D_116','D_117','D_120','D_126','D_63','D_64','D_66','D_68', 'target']\ncid = pd.Categorical(df.pop('customer_ID'), ordered=True)\nfeatured = [col for col in df.columns if col not in cat]\nlast = (cid != np.roll(cid, -1))\nif 'target' in df.columns:\n    df.drop(columns=['target'], inplace=True)\ngc.collect()\ndf_avg = (df\n          .groupby(cid)\n          .mean()[feat['avg_feat']]\n          .rename(columns={f: f\"{f}_avg\" for f in featured}))\ngc.collect()\ndf_min = (df\n          .groupby(cid)\n          .min()[feat['min_feat']]\n          .rename(columns={f: f'{f}_min' for f in featured}))\ngc.collect()\ndf_max = (df\n          .groupby(cid)\n          .max()[feat['max_feat']]\n          .rename(columns={f: f'{f}_max' for f in featured}))\ngc.collect()\ndf_std = (df\n          .groupby(cid)\n          .std()[feat['std_feat']]\n          .rename(columns={f: f'{f}_std' for f in featured}))\ndf = df.loc[last, feat['last_feat']].rename(columns={f: f'{f}_last' for f in featured}).set_index(np.asarray(cid[last]))\ntrain = pd.concat([df, df_avg, df_min, df_max, df_std],axis=1)\ndel df, df_min, df_avg, df_max, cid, last, df_std\ngc.collect()","metadata":{"execution":{"iopub.status.busy":"2022-12-22T14:37:35.345165Z","iopub.execute_input":"2022-12-22T14:37:35.346781Z","iopub.status.idle":"2022-12-22T14:40:12.066054Z","shell.execute_reply.started":"2022-12-22T14:37:35.346729Z","shell.execute_reply":"2022-12-22T14:40:12.064744Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"target = pd.read_csv('/kaggle/input/amex-default-prediction/train_labels.csv').target.values","metadata":{"execution":{"iopub.status.busy":"2022-12-22T14:44:50.654695Z","iopub.execute_input":"2022-12-22T14:44:50.655258Z","iopub.status.idle":"2022-12-22T14:44:51.986778Z","shell.execute_reply.started":"2022-12-22T14:44:50.655212Z","shell.execute_reply":"2022-12-22T14:44:51.985432Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"score_list = []\ny_pred_list = []\nkf = StratifiedKFold(n_splits = 5)\nfor fold, (idx_tr, idx_va) in enumerate(kf.split(train, target)):\n    X_tr, X_val, y_tr, y_val, model = None, None, None, None, None\n    start_time = datetime.datetime.now()\n    X_tr = train.iloc[idx_tr]\n    X_val = train.iloc[idx_va]\n    y_tr = target[idx_tr]\n    y_val = target[idx_va]\n    model = LGBMClassifier(n_estimators=500,\n                           learning_rate=0.03,\n                           reg_lambda=50,\n                           min_child_samples=2400,\n                          num_leaves=60)\n    model.fit(X_tr, y_tr, eval_set = [(X_val, y_val)],\n             eval_metric=[lgb_amex_metric],\n             callbacks=[lgb.log_evaluation(100)])\n    X_tr = None\n    y_tr = None\n    y_pred = model.predict_proba(X_val , raw_score = True)\n    score = amex_metric(y_val, y_pred)\n    n_trees = model.best_iteration_\n    if n_trees is None: n_trees = model.n_estimators\n    print(f\"Fold {fold} | {str(datetime.datetime.now() - start_time)[-12:-7]} |\"\n          f\" {n_trees:5} trees |\"\n          f\"                Score = {score:.5f}\")\n    score_list.append(score)\nprint(f\"OOF Score:                       {np.mean(score_list):.5f}\")","metadata":{"execution":{"iopub.status.busy":"2022-12-22T15:49:55.729428Z","iopub.execute_input":"2022-12-22T15:49:55.729921Z","iopub.status.idle":"2022-12-22T16:27:51.819822Z","shell.execute_reply.started":"2022-12-22T15:49:55.729884Z","shell.execute_reply":"2022-12-22T16:27:51.818330Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = pd.read_parquet(f'../input/amex-data-integer-dtypes-parquet-format/test.parquet')\ncat = ['S_2','B_30','B_38','D_114','D_116','D_117','D_120','D_126','D_63','D_64','D_66','D_68', 'target']\ncid = pd.Categorical(df.pop('customer_ID'), ordered=True)\nfeatured = [col for col in df.columns if col not in cat]\nlast = (cid != np.roll(cid, -1))\nif 'target' in df.columns:\n    df.drop(columns=['target'], inplace=True)\ngc.collect()\ndf_avg = (df\n          .groupby(cid)\n          .mean()[feat['avg_feat']]\n          .rename(columns={f: f\"{f}_avg\" for f in featured}))\ngc.collect()\ndf_min = (df\n          .groupby(cid)\n          .min()[feat['min_feat']]\n          .rename(columns={f: f'{f}_min' for f in featured}))\ngc.collect()\ndf_max = (df\n          .groupby(cid)\n          .max()[feat['max_feat']]\n          .rename(columns={f: f'{f}_max' for f in featured}))\ngc.collect()\ndf_std = (df\n          .groupby(cid)\n          .std()[feat['std_feat']]\n          .rename(columns={f: f'{f}_std' for f in featured}))\ndf = df.loc[last, feat['last_feat']].rename(columns={f: f'{f}_last' for f in featured}).set_index(np.asarray(cid[last]))\ntest = pd.concat([df, df_avg, df_min, df_max, df_std],axis=1)\ndel df, df_min, df_avg, df_max, cid, last, df_std\ngc.collect()","metadata":{"execution":{"iopub.status.busy":"2022-12-22T16:51:16.811370Z","iopub.execute_input":"2022-12-22T16:51:16.812313Z","iopub.status.idle":"2022-12-22T16:56:05.421819Z","shell.execute_reply.started":"2022-12-22T16:51:16.812226Z","shell.execute_reply":"2022-12-22T16:56:05.420746Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_pred_list.append(model.predict_proba(test, raw_score=True))","metadata":{"execution":{"iopub.status.busy":"2022-12-22T16:56:05.423673Z","iopub.execute_input":"2022-12-22T16:56:05.423977Z","iopub.status.idle":"2022-12-22T16:56:35.303438Z","shell.execute_reply.started":"2022-12-22T16:56:05.423950Z","shell.execute_reply":"2022-12-22T16:56:35.302518Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission = pd.DataFrame({'customer_ID':test.index,\n                          'prediction': np.mean(y_pred_list, axis=0)})\nsubmission.to_csv('submission.csv', index = False)\nprint(submission)","metadata":{"execution":{"iopub.status.busy":"2022-12-22T16:56:35.306577Z","iopub.execute_input":"2022-12-22T16:56:35.307035Z","iopub.status.idle":"2022-12-22T16:56:38.524867Z","shell.execute_reply.started":"2022-12-22T16:56:35.306987Z","shell.execute_reply":"2022-12-22T16:56:38.523532Z"},"trusted":true},"execution_count":null,"outputs":[]}]}