{"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":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session\n\n\n# importing SimpleImputer for handling missing value\nfrom sklearn.impute import SimpleImputer\n# importing MissingIndicator for handling missing value\nfrom sklearn.impute import MissingIndicator\n# importing StandardScaler for standardization\nfrom sklearn.preprocessing import StandardScaler, MinMaxScaler\n# importing OnHotEncoder for encoding categorical variable\nfrom sklearn.preprocessing import OneHotEncoder, OrdinalEncoder\n# importing for transformation\nfrom sklearn.compose import ColumnTransformer\nfrom sklearn.compose import make_column_transformer\nfrom sklearn.compose import make_column_selector\n# importing PCA for handling dimensonality reduction\nfrom sklearn.decomposition import PCA\n\nfrom catboost import CatBoostRegressor, Pool\n\n\n# importing pipeline for chaining model building activities\n#from sklearn.pipeline import Pipeline\n#from sklearn.pipeline import make_pipeline\nfrom imblearn.pipeline import Pipeline\nfrom imblearn.pipeline import make_pipeline as mp\n# importing FeatureUnion for combining transformers\nfrom sklearn.pipeline import FeatureUnion\n\n# importing samplers for handling data imbalance\nfrom imblearn.combine import SMOTEENN \nfrom imblearn.over_sampling import SMOTE\nfrom imblearn.over_sampling import RandomOverSampler \nfrom imblearn.under_sampling import RandomUnderSampler \n\n\nfrom sklearn.ensemble import RandomForestClassifier","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-11-08T12:43:37.744343Z","iopub.execute_input":"2022-11-08T12:43:37.744734Z","iopub.status.idle":"2022-11-08T12:43:37.758046Z","shell.execute_reply.started":"2022-11-08T12:43:37.744703Z","shell.execute_reply":"2022-11-08T12:43:37.756876Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# importing classifiers to try with\nfrom sklearn.linear_model import LogisticRegression\nfrom sklearn.linear_model import Perceptron\nfrom sklearn.neural_network import MLPClassifier\nfrom sklearn.tree import DecisionTreeClassifier\nfrom sklearn.ensemble import RandomForestClassifier\nfrom sklearn.naive_bayes import GaussianNB\nfrom sklearn.neighbors import KNeighborsClassifier\nfrom sklearn.ensemble import AdaBoostClassifier\nfrom sklearn.ensemble import GradientBoostingClassifier\nfrom sklearn.ensemble import BaggingClassifier\nfrom sklearn.ensemble import ExtraTreesClassifier\nfrom sklearn.gaussian_process import GaussianProcessClassifier\nfrom xgboost import XGBClassifier\nfrom lightgbm import LGBMClassifier\nfrom catboost import CatBoostClassifier\nfrom sklearn.svm import SVC\nfrom sklearn import metrics\n\n# importing metrics required for model evaluation\nfrom sklearn.metrics import accuracy_score\nfrom sklearn.metrics import precision_score\nfrom sklearn.metrics import recall_score\nfrom sklearn.metrics import f1_score\nfrom sklearn.metrics import classification_report\nfrom sklearn.metrics import make_scorer\nfrom sklearn.metrics import confusion_matrix\nfrom sklearn.metrics import ConfusionMatrixDisplay\nfrom sklearn.metrics import roc_auc_score\n\n# importing RepeatedKFold for cross validation\nfrom sklearn.model_selection import RepeatedKFold\n# importing for model evaluation\nfrom sklearn.model_selection import cross_validate\nfrom sklearn.model_selection import cross_val_predict\nfrom sklearn.model_selection import cross_val_score\nfrom sklearn.model_selection import validation_curve\n# importing RepeatedStratifiedKFold for model evaluation\nfrom sklearn.model_selection import RepeatedStratifiedKFold,StratifiedKFold\n# importing GridSearchCV for hyperparameter tuning\nfrom sklearn.model_selection import GridSearchCV, KFold\nfrom sklearn.model_selection import RandomizedSearchCV\nfrom yellowbrick.model_selection import ValidationCurve\nimport itertools\nfrom scipy.stats import randint as sp_randInt\nfrom scipy.stats import uniform as sp_randFloat\nfrom scipy.stats import uniform as sp_uniform","metadata":{"execution":{"iopub.status.busy":"2022-11-08T13:13:12.429194Z","iopub.execute_input":"2022-11-08T13:13:12.429726Z","iopub.status.idle":"2022-11-08T13:13:13.417252Z","shell.execute_reply.started":"2022-11-08T13:13:12.429682Z","shell.execute_reply":"2022-11-08T13:13:13.416071Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Read data**","metadata":{}},{"cell_type":"code","source":"train = pd.read_csv('../input/amex-default-prediction/train_data.csv', nrows=100009)\nt_labels = pd.read_csv('../input/amex-default-prediction/train_labels.csv', nrows=100009)\n\n# test = pd.read_csv('../input/amex-default-prediction/test_data.csv')\nsample = pd.read_csv('../input/amex-default-prediction/sample_submission.csv', nrows=100009)\n\n# output table\ntrain","metadata":{"execution":{"iopub.status.busy":"2022-11-08T12:21:34.709093Z","iopub.execute_input":"2022-11-08T12:21:34.709401Z","iopub.status.idle":"2022-11-08T12:21:38.767847Z","shell.execute_reply.started":"2022-11-08T12:21:34.709372Z","shell.execute_reply":"2022-11-08T12:21:38.766555Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = pd.merge(train, t_labels, how=\"inner\", on=[\"customer_ID\"])","metadata":{"execution":{"iopub.status.busy":"2022-11-08T12:21:38.770268Z","iopub.execute_input":"2022-11-08T12:21:38.771177Z","iopub.status.idle":"2022-11-08T12:21:39.168130Z","shell.execute_reply.started":"2022-11-08T12:21:38.771139Z","shell.execute_reply":"2022-11-08T12:21:39.167256Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"* D_ = Delinquency variables\n* S_ = Spend variables\n* P_ = Payment variables\n* B_ = Balance variables\n* R_ = Risk variables","metadata":{}},{"cell_type":"code","source":"t_labels['target'].sum()","metadata":{"execution":{"iopub.status.busy":"2022-11-08T12:21:39.169667Z","iopub.execute_input":"2022-11-08T12:21:39.170641Z","iopub.status.idle":"2022-11-08T12:21:39.177230Z","shell.execute_reply.started":"2022-11-08T12:21:39.170603Z","shell.execute_reply":"2022-11-08T12:21:39.176020Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cat = train.select_dtypes(include=['O'])\ncat['D_63'].value_counts()\n","metadata":{"execution":{"iopub.status.busy":"2022-11-08T12:21:39.178935Z","iopub.execute_input":"2022-11-08T12:21:39.179464Z","iopub.status.idle":"2022-11-08T12:21:39.337251Z","shell.execute_reply.started":"2022-11-08T12:21:39.179420Z","shell.execute_reply":"2022-11-08T12:21:39.335937Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train['D_68'].value_counts()","metadata":{"execution":{"iopub.status.busy":"2022-11-08T12:21:39.338529Z","iopub.execute_input":"2022-11-08T12:21:39.338844Z","iopub.status.idle":"2022-11-08T12:21:39.350180Z","shell.execute_reply.started":"2022-11-08T12:21:39.338816Z","shell.execute_reply":"2022-11-08T12:21:39.349023Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cat = ['B_30', 'B_38', 'D_114', 'D_116', 'D_117', 'D_120', 'D_126', 'D_63', 'D_64', 'D_66', 'D_68']\ndummies = pd.get_dummies(train, columns=cat, drop_first=True)\ndummies","metadata":{"execution":{"iopub.status.busy":"2022-11-08T12:21:39.351236Z","iopub.execute_input":"2022-11-08T12:21:39.351528Z","iopub.status.idle":"2022-11-08T12:21:39.567611Z","shell.execute_reply.started":"2022-11-08T12:21:39.351502Z","shell.execute_reply":"2022-11-08T12:21:39.566375Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train[\"S_2\"] = train[\"S_2\"].astype('datetime64[ns]')\ntrain[\"Day of week\"] = train[\"S_2\"].dt.dayofweek\ntrain[\"Year\"] = train[\"S_2\"].dt.year\ntrain[\"Month\"] = train[\"S_2\"].dt.month\ntrain[\"Day\"] = train[\"S_2\"].dt.day\n\ntrain = train.drop(['S_2', 'customer_ID'], axis=1)\n","metadata":{"execution":{"iopub.status.busy":"2022-11-08T12:21:39.570581Z","iopub.execute_input":"2022-11-08T12:21:39.570924Z","iopub.status.idle":"2022-11-08T12:21:39.695014Z","shell.execute_reply.started":"2022-11-08T12:21:39.570894Z","shell.execute_reply":"2022-11-08T12:21:39.693969Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train","metadata":{"execution":{"iopub.status.busy":"2022-11-08T12:21:39.696331Z","iopub.execute_input":"2022-11-08T12:21:39.696764Z","iopub.status.idle":"2022-11-08T12:21:39.740650Z","shell.execute_reply.started":"2022-11-08T12:21:39.696722Z","shell.execute_reply":"2022-11-08T12:21:39.739547Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.isnull().sum().sort_values(ascending = False)\n\n# Drop columns 80% nullsvalues Pareto-principe\ni=0\nfor col in train.columns:\n    if (train[col].isnull().sum()/len(train[col])*100) >=80:\n        print(\"Dropping column\", col)\n        train.drop(labels=col,axis=1,inplace=True)\n        i=i+1\n        \ntrain","metadata":{"execution":{"iopub.status.busy":"2022-11-08T12:21:39.741965Z","iopub.execute_input":"2022-11-08T12:21:39.742408Z","iopub.status.idle":"2022-11-08T12:21:41.040658Z","shell.execute_reply.started":"2022-11-08T12:21:39.742378Z","shell.execute_reply":"2022-11-08T12:21:41.039528Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = train.astype({\"B_30\": 'str', \"B_38\": 'str',\"D_114\": 'str', \"D_116\": 'str', \"D_117\": 'str', \n                         \"D_120\": 'str', \"D_126\": 'str', \"D_68\": 'str', \"Day of week\": 'str',\n                         \"Year\": 'str', \"Month\": 'str', \"Day\": 'str'})","metadata":{"execution":{"iopub.status.busy":"2022-11-08T12:21:41.042417Z","iopub.execute_input":"2022-11-08T12:21:41.042941Z","iopub.status.idle":"2022-11-08T12:21:42.395376Z","shell.execute_reply.started":"2022-11-08T12:21:41.042893Z","shell.execute_reply":"2022-11-08T12:21:42.394127Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# define X and Y\nx = train_df.drop(['target'], axis = 1)\ny = train_df['target']\n\nx","metadata":{"execution":{"iopub.status.busy":"2022-11-08T12:35:53.643325Z","iopub.execute_input":"2022-11-08T12:35:53.643747Z","iopub.status.idle":"2022-11-08T12:35:53.780236Z","shell.execute_reply.started":"2022-11-08T12:35:53.643714Z","shell.execute_reply":"2022-11-08T12:35:53.779047Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\n# split data \nX_train, X_test, y_train, y_test = train_test_split(x, y, test_size = 0.3, stratify=y, random_state = 42)\nX_train","metadata":{"execution":{"iopub.status.busy":"2022-11-08T12:41:09.368663Z","iopub.execute_input":"2022-11-08T12:41:09.369069Z","iopub.status.idle":"2022-11-08T12:41:09.696535Z","shell.execute_reply.started":"2022-11-08T12:41:09.369036Z","shell.execute_reply":"2022-11-08T12:41:09.695252Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cat = list(x.drop(['Day of week', 'Year', 'Month', 'Day'], axis=1).select_dtypes('O').columns)\ndate = list(x[['Day of week','Year', 'Month', 'Day']].columns)\nnum = list(x.drop(['Day of week', 'Year', 'Month', 'Day'], axis=1).select_dtypes('float64').columns)\n","metadata":{"execution":{"iopub.status.busy":"2022-11-08T12:31:44.017178Z","iopub.execute_input":"2022-11-08T12:31:44.017568Z","iopub.status.idle":"2022-11-08T12:31:44.219905Z","shell.execute_reply.started":"2022-11-08T12:31:44.017537Z","shell.execute_reply":"2022-11-08T12:31:44.219070Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cat_pipe = Pipeline([\n    ('imputer', SimpleImputer(strategy='most_frequent', missing_values=np.nan)),\n    ('encoder', OrdinalEncoder(handle_unknown='use_encoded_value', unknown_value=-1)),\n    ('scaler', StandardScaler())\n])\n\nnum_pipe = Pipeline([\n    ('imputer', SimpleImputer(strategy='most_frequent', missing_values=np.nan)),\n    ('scaler', StandardScaler())\n])\n\ndate_pipe = Pipeline([\n    ('imputer', SimpleImputer(strategy='most_frequent', missing_values=np.nan)),\n    ('encoder', OrdinalEncoder(handle_unknown='use_encoded_value', unknown_value=-1)),\n    ('scaler', StandardScaler())\n])\n","metadata":{"execution":{"iopub.status.busy":"2022-11-08T12:40:34.806715Z","iopub.execute_input":"2022-11-08T12:40:34.807164Z","iopub.status.idle":"2022-11-08T12:40:34.814386Z","shell.execute_reply.started":"2022-11-08T12:40:34.807114Z","shell.execute_reply":"2022-11-08T12:40:34.813524Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"preprocess = ColumnTransformer([\n    ('cat', cat_pipe, cat),\n    ('num', num_pipe, num),\n    ('date', date_pipe, date)\n])","metadata":{"execution":{"iopub.status.busy":"2022-11-08T12:40:55.386401Z","iopub.execute_input":"2022-11-08T12:40:55.386785Z","iopub.status.idle":"2022-11-08T12:40:55.392035Z","shell.execute_reply.started":"2022-11-08T12:40:55.386757Z","shell.execute_reply":"2022-11-08T12:40:55.390918Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"preprocess.fit(X_train)\nX_train = preprocess.transform(X_train)\nX_test = preprocess.transform(X_test)","metadata":{"execution":{"iopub.status.busy":"2022-11-08T12:41:14.668830Z","iopub.execute_input":"2022-11-08T12:41:14.669778Z","iopub.status.idle":"2022-11-08T12:41:18.291566Z","shell.execute_reply.started":"2022-11-08T12:41:14.669738Z","shell.execute_reply":"2022-11-08T12:41:18.290449Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"len(X_train[0])","metadata":{"execution":{"iopub.status.busy":"2022-11-08T12:37:30.875815Z","iopub.execute_input":"2022-11-08T12:37:30.876228Z","iopub.status.idle":"2022-11-08T12:37:30.884274Z","shell.execute_reply.started":"2022-11-08T12:37:30.876196Z","shell.execute_reply":"2022-11-08T12:37:30.882773Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train = pd.DataFrame(X_train, columns = cat + num + date)\nX_test = pd.DataFrame(X_test, columns = cat + num + date)\n","metadata":{"execution":{"iopub.status.busy":"2022-11-08T12:41:19.614356Z","iopub.execute_input":"2022-11-08T12:41:19.614798Z","iopub.status.idle":"2022-11-08T12:41:19.621837Z","shell.execute_reply.started":"2022-11-08T12:41:19.614761Z","shell.execute_reply":"2022-11-08T12:41:19.620578Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train.head()","metadata":{"execution":{"iopub.status.busy":"2022-11-08T12:41:26.281229Z","iopub.execute_input":"2022-11-08T12:41:26.281678Z","iopub.status.idle":"2022-11-08T12:41:26.307515Z","shell.execute_reply.started":"2022-11-08T12:41:26.281642Z","shell.execute_reply":"2022-11-08T12:41:26.306119Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model= RandomForestClassifier(n_estimators=10, random_state=7)\nmodel.fit(X_train, y_train)","metadata":{"execution":{"iopub.status.busy":"2022-11-08T12:43:43.674747Z","iopub.execute_input":"2022-11-08T12:43:43.675993Z","iopub.status.idle":"2022-11-08T12:43:58.762632Z","shell.execute_reply.started":"2022-11-08T12:43:43.675952Z","shell.execute_reply":"2022-11-08T12:43:58.761520Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fs=pd.Series(model.feature_importances_, index=X_train.columns).sort_values(ascending=True)\nfs","metadata":{"execution":{"iopub.status.busy":"2022-11-08T12:44:19.947903Z","iopub.execute_input":"2022-11-08T12:44:19.948771Z","iopub.status.idle":"2022-11-08T12:44:19.960662Z","shell.execute_reply.started":"2022-11-08T12:44:19.948731Z","shell.execute_reply":"2022-11-08T12:44:19.959514Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cumsum = fs.sort_values(ascending=False).cumsum()\ncumsum1 = cumsum[cumsum < 0.8]\ncumsum1","metadata":{"execution":{"iopub.status.busy":"2022-11-08T12:55:12.054243Z","iopub.execute_input":"2022-11-08T12:55:12.054679Z","iopub.status.idle":"2022-11-08T12:55:12.065890Z","shell.execute_reply.started":"2022-11-08T12:55:12.054642Z","shell.execute_reply":"2022-11-08T12:55:12.064916Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test = fs[fs>0.007]\ntest.sum()","metadata":{"execution":{"iopub.status.busy":"2022-11-08T12:48:20.701001Z","iopub.execute_input":"2022-11-08T12:48:20.701663Z","iopub.status.idle":"2022-11-08T12:48:20.708972Z","shell.execute_reply.started":"2022-11-08T12:48:20.701625Z","shell.execute_reply":"2022-11-08T12:48:20.708015Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nplt.rcParams[\"figure.figsize\"] = (16,3)\nplt.plot(cumsum)\nplt.xticks(rotation=90)","metadata":{"execution":{"iopub.status.busy":"2022-11-08T12:55:17.372563Z","iopub.execute_input":"2022-11-08T12:55:17.372965Z","iopub.status.idle":"2022-11-08T12:55:19.180895Z","shell.execute_reply.started":"2022-11-08T12:55:17.372930Z","shell.execute_reply":"2022-11-08T12:55:19.179362Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train = X_train[cumsum[cumsum < 0.8].index]\nX_test = X_test[cumsum[cumsum < 0.8].index]","metadata":{"execution":{"iopub.status.busy":"2022-11-08T13:06:25.979822Z","iopub.execute_input":"2022-11-08T13:06:25.980781Z","iopub.status.idle":"2022-11-08T13:06:26.023450Z","shell.execute_reply.started":"2022-11-08T13:06:25.980737Z","shell.execute_reply":"2022-11-08T13:06:26.022540Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train","metadata":{"execution":{"iopub.status.busy":"2022-11-08T13:06:36.295264Z","iopub.execute_input":"2022-11-08T13:06:36.295663Z","iopub.status.idle":"2022-11-08T13:06:36.343231Z","shell.execute_reply.started":"2022-11-08T13:06:36.295632Z","shell.execute_reply":"2022-11-08T13:06:36.342135Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pca = PCA(n_components = 0.8)\npca.fit(X_train)\nX_train = pca.transform(X_train)\nX_test =pca.transform(X_test)","metadata":{"execution":{"iopub.status.busy":"2022-11-08T13:10:15.905260Z","iopub.execute_input":"2022-11-08T13:10:15.905666Z","iopub.status.idle":"2022-11-08T13:10:16.490232Z","shell.execute_reply.started":"2022-11-08T13:10:15.905631Z","shell.execute_reply":"2022-11-08T13:10:16.488586Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pca.explained_variance_","metadata":{"execution":{"iopub.status.busy":"2022-11-08T13:10:19.255032Z","iopub.execute_input":"2022-11-08T13:10:19.255463Z","iopub.status.idle":"2022-11-08T13:10:19.263621Z","shell.execute_reply.started":"2022-11-08T13:10:19.255430Z","shell.execute_reply":"2022-11-08T13:10:19.262402Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def 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)\n","metadata":{"execution":{"iopub.status.busy":"2022-11-08T13:11:40.513178Z","iopub.execute_input":"2022-11-08T13:11:40.513595Z","iopub.status.idle":"2022-11-08T13:11:40.526920Z","shell.execute_reply.started":"2022-11-08T13:11:40.513560Z","shell.execute_reply":"2022-11-08T13:11:40.525842Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"scoring = ['accuracy', 'precision', 'recall','f1','roc_auc']\ncv = StratifiedKFold(n_splits=10, shuffle = True, random_state = 42)","metadata":{"execution":{"iopub.status.busy":"2022-11-08T13:13:17.660306Z","iopub.execute_input":"2022-11-08T13:13:17.661066Z","iopub.status.idle":"2022-11-08T13:13:17.665984Z","shell.execute_reply.started":"2022-11-08T13:13:17.661024Z","shell.execute_reply":"2022-11-08T13:13:17.664972Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"algo=[\n    #[KNeighborsClassifier(), 'KNeighborsClassifier'], \n    #[LogisticRegression(), 'LogisticRegression'], \n    #[SVC(), 'SVC'],\n    #[DecisionTreeClassifier(), 'DecisionTreeClassifier'],\n    #[GradientBoostingClassifier(), 'GradientBoostingClassifier'],\n    [RandomForestClassifier(), 'RandomForestClassifier'],\n    #[AdaBoostClassifier(), 'AdaBoostClassifier'],\n    #[GaussianNB(), 'GaussianNB'],\n    #[XGBClassifier(), \"XGBClassifier\"],\n    #[LGBMClassifier(), \"LGBMClassifier\"],\n    #[CatBoostClassifier(), \"CatBoostClassifier\"]\n]\n\nmodel_scores=[]\nfor a in algo:\n    model = a[0]\n    print(model)\n    scores = cross_validate(model, X_train, y_train, scoring=scoring, cv=cv, n_jobs=-1, return_train_score=True,return_estimator=True)\n    print('Training Score: Accuracy: {:.2f}, Precision: {:.2f}, Recall: {:.2f},f1-score: {:.2f}, ROC AUC: {:.2f}'.format(np.mean(scores['train_accuracy']),np.mean(scores['train_precision']), np.mean(scores['train_recall']), np.mean(scores['train_f1']), np.mean(scores['train_roc_auc'])))\n    print('Validation Score: Accuracy: {:.2f}, Precision: {:.2f}, Recall: {:.2f},f1-score: {:.2f}, ROC AUC: {:.2f}'.format(np.mean(scores['test_accuracy']),np.mean(scores['test_precision']), np.mean(scores['test_recall']), np.mean(scores['test_f1']), np.mean(scores['test_roc_auc'])))\n    model_scores.append([np.mean(scores['test_accuracy']), a[1]])\n\nprint(model_scores)\nprint(f'best score = {max(model_scores)}')    ","metadata":{"execution":{"iopub.status.busy":"2022-11-08T13:25:04.191868Z","iopub.execute_input":"2022-11-08T13:25:04.192308Z","iopub.status.idle":"2022-11-08T13:28:46.662580Z","shell.execute_reply.started":"2022-11-08T13:25:04.192269Z","shell.execute_reply":"2022-11-08T13:28:46.661376Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"algo=[\n    [KNeighborsClassifier(), 'KNeighborsClassifier'], \n    #[LogisticRegression(), 'LogisticRegression'], \n    #[SVC(), 'SVC'],\n    #[DecisionTreeClassifier(), 'DecisionTreeClassifier'],\n    #[GradientBoostingClassifier(), 'GradientBoostingClassifier'],\n    #[RandomForestClassifier(), 'RandomForestClassifier'],\n    #[AdaBoostClassifier(), 'AdaBoostClassifier'],\n    #[GaussianNB(), 'GaussianNB'],\n    #[XGBClassifier(), \"XGBClassifier\"],\n    #[LGBMClassifier(), \"LGBMClassifier\"],\n    #[CatBoostClassifier(), \"CatBoostClassifier\"]\n]\n\nmodel_scores1=[]\nfor a in algo:\n    model = a[0]\n    print(model)\n    scores = cross_validate(model, X_train, y_train, scoring=scoring, cv=cv, n_jobs=-1, return_train_score=True,return_estimator=True)\n    print('Training Score: Accuracy: {:.2f}, Precision: {:.2f}, Recall: {:.2f},f1-score: {:.2f}, ROC AUC: {:.2f}'.format(np.mean(scores['train_accuracy']),np.mean(scores['train_precision']), np.mean(scores['train_recall']), np.mean(scores['train_f1']), np.mean(scores['train_roc_auc'])))\n    print('Validation Score: Accuracy: {:.2f}, Precision: {:.2f}, Recall: {:.2f},f1-score: {:.2f}, ROC AUC: {:.2f}'.format(np.mean(scores['test_accuracy']),np.mean(scores['test_precision']), np.mean(scores['test_recall']), np.mean(scores['test_f1']), np.mean(scores['test_roc_auc'])))\n    model_scores1.append([np.mean(scores['test_accuracy']), a[1]])\n\nprint(model_scores1)\nprint(f'best score = {max(model_scores1)}')    ","metadata":{"execution":{"iopub.status.busy":"2022-11-08T13:34:08.233103Z","iopub.execute_input":"2022-11-08T13:34:08.235725Z","iopub.status.idle":"2022-11-08T13:46:49.928298Z","shell.execute_reply.started":"2022-11-08T13:34:08.235649Z","shell.execute_reply":"2022-11-08T13:46:49.926661Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def plot_confusion_matrix(cm, classes,\n                          normalize=False,\n                          title='Confusion matrix',\n                          cmap=plt.cm.Blues):\n    \"\"\"\n    This function prints and plots the confusion matrix.\n    Normalization can be applied by setting `normalize=True`.\n    \"\"\"\n    plt.imshow(cm, interpolation='nearest', cmap=cmap)\n    plt.title(title)\n    plt.colorbar()\n    tick_marks = np.arange(len(classes))\n    plt.xticks(tick_marks, classes, rotation=45)\n    plt.yticks(tick_marks, classes)\n    plt.grid(None)\n\n    if normalize:\n        cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]\n\n    thresh = cm.max() / 2.\n    for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):\n        plt.text(j, i, cm[i, j],\n                 horizontalalignment=\"center\",\n                 color=\"white\" if cm[i, j] > thresh else \"black\")\n\n    plt.tight_layout()\n    plt.ylabel('True label')\n    plt.xlabel('Predicted label')","metadata":{"execution":{"iopub.status.busy":"2022-11-08T13:51:29.280444Z","iopub.execute_input":"2022-11-08T13:51:29.280978Z","iopub.status.idle":"2022-11-08T13:51:29.293433Z","shell.execute_reply.started":"2022-11-08T13:51:29.280936Z","shell.execute_reply":"2022-11-08T13:51:29.292152Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = KNeighborsClassifier(metric='manhattan', weights='distance')\nmodel = model.fit(X_train, y_train)\nprint(\"#######################################################################\")\nprint(\"model training score: %.3f\" % model.score(X_train, y_train))\nprint(\"model test score: %.3f\" % model.score(X_test, y_test))\nprint(\"#######################################################################\")\ny_pred = model.predict(X_test)\nprint(\"Default rate:\", y_pred.sum()/y_pred.shape[0])\nprint(\"Amex Evaluation Metric - Training: %.3f\"% amex_metric(pd.DataFrame(y_train), \n        pd.DataFrame(model.predict(X_train), columns=['prediction'])))\nprint(\"Amex Evaluation Metric - Test: %.3f\"% amex_metric(pd.DataFrame(y_test), \n        pd.DataFrame(y_pred, columns=['prediction'])))\nprint(\"ROC AUC:\", roc_auc_score(y_test, model.predict_proba(X_test)[:, 1]))\nprint(\"#######################################################################\")\nconfusion_mtx = confusion_matrix(y_test, y_pred)\nplot_confusion_matrix(confusion_mtx, classes = range(2))\ntarget_names = ['Paid', 'Default']\nprint(classification_report(y_test, y_pred, target_names=target_names))","metadata":{"execution":{"iopub.status.busy":"2022-11-08T13:52:03.178628Z","iopub.execute_input":"2022-11-08T13:52:03.179139Z","iopub.status.idle":"2022-11-08T14:03:03.145955Z","shell.execute_reply.started":"2022-11-08T13:52:03.179097Z","shell.execute_reply":"2022-11-08T14:03:03.144598Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = RandomForestClassifier()\nmodel = model.fit(X_train, y_train)\nprint(\"#######################################################################\")\nprint(\"model training score: %.3f\" % model.score(X_train, y_train))\nprint(\"model test score: %.3f\" % model.score(X_test, y_test))\nprint(\"#######################################################################\")\ny_pred = model.predict(X_test)\nprint(\"Default rate:\", y_pred.sum()/y_pred.shape[0])\nprint(\"Amex Evaluation Metric - Training: %.3f\"% amex_metric(pd.DataFrame(y_train), \n        pd.DataFrame(model.predict(X_train), columns=['prediction'])))\nprint(\"Amex Evaluation Metric - Test: %.3f\"% amex_metric(pd.DataFrame(y_test), \n        pd.DataFrame(y_pred, columns=['prediction'])))\nprint(\"ROC AUC:\", roc_auc_score(y_test, model.predict_proba(X_test)[:, 1]))\nprint(\"#######################################################################\")\nconfusion_mtx = confusion_matrix(y_test, y_pred)\nplot_confusion_matrix(confusion_mtx, classes = range(2))\ntarget_names = ['Paid', 'Default']\nprint(classification_report(y_test, y_pred, target_names=target_names))","metadata":{"execution":{"iopub.status.busy":"2022-11-08T14:09:20.994839Z","iopub.execute_input":"2022-11-08T14:09:20.995276Z","iopub.status.idle":"2022-11-08T14:10:26.814581Z","shell.execute_reply.started":"2022-11-08T14:09:20.995241Z","shell.execute_reply":"2022-11-08T14:10:26.813468Z"},"trusted":true},"execution_count":null,"outputs":[]}]}