{"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 plotly.express as px\nimport numpy as np \nimport pandas as pd\nfrom sklearn.preprocessing import LabelEncoder\nfrom sklearn.model_selection import StratifiedKFold\nfrom lightgbm import LGBMClassifier, early_stopping, log_evaluation\nimport lightgbm\nfrom sklearn.metrics import roc_auc_score, roc_curve, auc\nimport gc","metadata":{"execution":{"iopub.status.busy":"2022-08-10T03:17:22.622201Z","iopub.execute_input":"2022-08-10T03:17:22.622669Z","iopub.status.idle":"2022-08-10T03:17:25.573837Z","shell.execute_reply.started":"2022-08-10T03:17:22.622569Z","shell.execute_reply":"2022-08-10T03:17:25.569497Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def makeFeatures(data, key=None):\n    \n    \n    categorical_cols = ['B_30', 'B_38', 'D_114', 'D_116', 'D_117', 'D_120', 'D_126', 'D_63', 'D_64', 'D_66', 'D_68']\n    numerical_cols = data.select_dtypes('float16').columns\n\n    numCust_agg = data.groupby(\"customer_ID\")[numerical_cols].agg([\"mean\", \"std\", \"min\", \"max\", \"last\"])\n    catCust_agg = data.groupby(\"customer_ID\")[categorical_cols].agg(['count', 'last', 'nunique'])\n\n    numCust_agg.columns = [\"_\".join(num_col) for num_col in numCust_agg.columns]\n    catCust_agg.columns = [\"_\".join(cat_col) for cat_col in catCust_agg.columns]\n\n    df = pd.concat([numCust_agg, catCust_agg], axis=1)\n    \n    df.drop(['D_64_last', 'D_66_last', 'D_68_last'], axis=1, inplace=True)\n    \n    del numCust_agg, catCust_agg\n    gc.collect()\n    \n    if key == \"train\":\n        \n        labels = data[[\"customer_ID\", \"target\"]].groupby(\"customer_ID\").head(1).set_index(\"customer_ID\")\n        full_df = df.merge(labels, left_index=True, right_index=True, how='left')\n        \n        del df\n        gc.collect()\n        \n        return full_df\n    \n    if key == \"test\":\n        return df\n    return key","metadata":{"execution":{"iopub.status.busy":"2022-08-10T03:17:25.576543Z","iopub.execute_input":"2022-08-10T03:17:25.577040Z","iopub.status.idle":"2022-08-10T03:17:25.587681Z","shell.execute_reply.started":"2022-08-10T03:17:25.576991Z","shell.execute_reply":"2022-08-10T03:17:25.586805Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_data = pd.read_feather('../input/amexfeather/train_data.ftr')\n\ndf_train = makeFeatures(train_data, key=\"train\")\n\ndel train_data\ngc.collect()\n","metadata":{"execution":{"iopub.status.busy":"2022-08-10T03:17:25.588912Z","iopub.execute_input":"2022-08-10T03:17:25.589433Z","iopub.status.idle":"2022-08-10T03:23:58.473429Z","shell.execute_reply.started":"2022-08-10T03:17:25.589401Z","shell.execute_reply":"2022-08-10T03:23:58.471920Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# https://www.kaggle.com/code/inversion/amex-competition-metric-python\n    \ndef amex_metric(y_true: pd.DataFrame, y_pred: pd.DataFrame) -> float:\n\n    def top_four_percent_captured(y_true: pd.DataFrame, y_pred: pd.DataFrame) -> float:\n        df = (pd.concat([y_true, y_pred], axis='columns')\n              .sort_values('prediction', ascending=False))\n        df['weight'] = df['target'].apply(lambda x: 20 if x==0 else 1)\n        four_pct_cutoff = int(0.04 * df['weight'].sum())\n        df['weight_cumsum'] = df['weight'].cumsum()\n        df_cutoff = df.loc[df['weight_cumsum'] <= four_pct_cutoff]\n        return (df_cutoff['target'] == 1).sum() / (df['target'] == 1).sum()\n        \n    def weighted_gini(y_true: pd.DataFrame, y_pred: pd.DataFrame) -> float:\n        df = (pd.concat([y_true, y_pred], axis='columns')\n              .sort_values('prediction', ascending=False))\n        df['weight'] = df['target'].apply(lambda x: 20 if x==0 else 1)\n        df['random'] = (df['weight'] / df['weight'].sum()).cumsum()\n        total_pos = (df['target'] * df['weight']).sum()\n        df['cum_pos_found'] = (df['target'] * df['weight']).cumsum()\n        df['lorentz'] = df['cum_pos_found'] / total_pos\n        df['gini'] = (df['lorentz'] - df['random']) * df['weight']\n        return df['gini'].sum()\n    \n    def normalized_weighted_gini(y_true: pd.DataFrame, y_pred: pd.DataFrame) -> float:\n        y_true_pred = y_true.rename(columns={'target': 'prediction'})\n        return weighted_gini(y_true, y_pred) / weighted_gini(y_true, y_true_pred)\n\n    g = normalized_weighted_gini(y_true, y_pred)\n    d = top_four_percent_captured(y_true, y_pred)\n\n    return 0.5 * (g + d)","metadata":{"execution":{"iopub.status.busy":"2022-08-10T03:23:58.485587Z","iopub.execute_input":"2022-08-10T03:23:58.485996Z","iopub.status.idle":"2022-08-10T03:23:58.500600Z","shell.execute_reply.started":"2022-08-10T03:23:58.485960Z","shell.execute_reply":"2022-08-10T03:23:58.499360Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X = df_train.copy()\ny = X.pop('target')\n\n\ngc.collect()","metadata":{"execution":{"iopub.status.busy":"2022-08-10T03:23:58.502778Z","iopub.execute_input":"2022-08-10T03:23:58.503192Z","iopub.status.idle":"2022-08-10T03:24:00.706456Z","shell.execute_reply.started":"2022-08-10T03:23:58.503134Z","shell.execute_reply":"2022-08-10T03:24:00.705308Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_valid, lgbm_val_probs, lgbm_test_preds, gini=[],[],[],[]\nft_importance=pd.DataFrame(index=X.columns)\n\n\nsk_fold = StratifiedKFold(n_splits=10, shuffle=True, random_state=21)\n\nfor fold, (train_idx, val_idx) in enumerate(sk_fold.split(X, y)):\n    \n    print(\"\\nFold {}\".format(fold+1))\n    X_train, y_train = X.iloc[train_idx,:], y[train_idx]\n    X_val, y_val = X.iloc[val_idx,:], y[val_idx]\n    print(\"Train shape: {}, {}, Valid shape: {}, {}\\n\".format(\n        X_train.shape, y_train.shape, X_val.shape, y_val.shape))\n    \n    params = {'boosting_type': 'gbdt',\n              'n_estimators': 1000,\n              'num_leaves': 50,\n              'learning_rate': 0.05,\n              'colsample_bytree': 0.9,\n              'min_child_samples': 2000,\n              'max_bins': 500,\n              'reg_alpha': 2,\n              'objective': 'binary',\n              'random_state': 21}\n    \n    lgbm = LGBMClassifier(**params).fit(X_train, y_train, \n                                       eval_set=[(X_train, y_train), (X_val, y_val)],\n                                       callbacks=[early_stopping(200), log_evaluation(500)],\n                                       eval_metric=['auc','binary_logloss'])\n    \n    lgbm.booster_.save_model('LGBMmodel_{}.txt'.format(fold))\n    \n    lgbm_prob = lgbm.predict_proba(X_val)[:,1]\n    \n    lgbm_val_probs.append(lgbm_prob)\n    y_valid.append(y_val)\n    \n    y_pred=pd.DataFrame(data={'prediction':lgbm_prob})\n\n    y_true=pd.DataFrame(data={'target':y_val.reset_index(drop=True)})\n    \n    gini_score=amex_metric(y_true = y_true, y_pred = y_pred)\n    gini.append(gini_score)\n    \n    auc_score=roc_auc_score(y_val, lgbm_prob)\n  \n    ft_importance[\"Importance_Fold\"+str(fold)]=lgbm.feature_importances_    \n    print(\"Validation Gini: {:.5f}, AUC: {:.4f}\".format(gini_score,auc_score))\n    \n    del X_train, y_train, X_val, y_val\n    gc.collect()\n    \ndel X, y\n","metadata":{"execution":{"iopub.status.busy":"2022-08-10T03:24:00.707906Z","iopub.execute_input":"2022-08-10T03:24:00.708879Z","iopub.status.idle":"2022-08-10T03:50:46.606317Z","shell.execute_reply.started":"2022-08-10T03:24:00.708827Z","shell.execute_reply":"2022-08-10T03:50:46.604426Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_data = pd.read_feather('../input/amexfeather/test_data.ftr')\n\nsample_submission = pd.read_csv('../input/amex-default-prediction/sample_submission.csv')","metadata":{"execution":{"iopub.status.busy":"2022-08-10T03:50:46.607208Z","iopub.status.idle":"2022-08-10T03:50:46.607640Z","shell.execute_reply.started":"2022-08-10T03:50:46.607442Z","shell.execute_reply":"2022-08-10T03:50:46.607461Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tqdm import tqdm\n\nfull_predict = pd.DataFrame()\n\nfor cust in tqdm(range(0, len(sample_submission), 50000)):\n    \n    pred_df = pd.DataFrame()\n    \n    sample = sample_submission[\"customer_ID\"][cust:cust+50000]\n    \n    gr=test_data.loc[test_data[\"customer_ID\"].isin(sample)]\n    \n    df_test = makeFeatures(gr, key=\"test\")\n    \n    pred_df[\"customer_ID\"] = list(sample)\n    \n    pred_temp = pd.DataFrame()\n    \n    for i in range(10):\n        \n        bst = lightgbm.Booster(model_file='LGBMmodel_{}.txt'.format(i))\n        predictions = bst.predict(df_test)\n        \n        pred_temp[\"P_{}\".format(i)] = predictions\n        \n    pred_df[\"prediction\"] =list(pred_temp.mean(axis=1))\n    \n    full_predict = full_predict.append(pred_df, ignore_index=True)\n    ","metadata":{"execution":{"iopub.status.busy":"2022-08-10T03:50:46.609931Z","iopub.status.idle":"2022-08-10T03:50:46.610456Z","shell.execute_reply.started":"2022-08-10T03:50:46.610219Z","shell.execute_reply":"2022-08-10T03:50:46.610245Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"full_predict.to_csv(\"submission.csv\", index=False)","metadata":{"execution":{"iopub.status.busy":"2022-08-10T03:50:46.611975Z","iopub.status.idle":"2022-08-10T03:50:46.612457Z","shell.execute_reply.started":"2022-08-10T03:50:46.612239Z","shell.execute_reply":"2022-08-10T03:50:46.612262Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}