{"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":"markdown","source":"<b><div style='padding:15px;background-color:#3b4d61;border-radius:5px;color:#eceef2;font-size:200%;text-align:center'>A Very Basic and Straightforward Starter Code</div></b>","metadata":{}},{"cell_type":"code","source":"import numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport gc\nimport datetime\n\n\nfrom sklearn.model_selection import StratifiedKFold\nimport lightgbm as lgbm\nfrom lightgbm import early_stopping\n\nimport seaborn as sns\nimport matplotlib.pyplot as plt\n\nimport warnings\nwarnings.simplefilter(\"ignore\")\n\nNUM_FOLDS = 5","metadata":{"execution":{"iopub.status.busy":"2022-07-07T05:42:05.721601Z","iopub.execute_input":"2022-07-07T05:42:05.722317Z","iopub.status.idle":"2022-07-07T05:42:08.120271Z","shell.execute_reply.started":"2022-07-07T05:42:05.722207Z","shell.execute_reply":"2022-07-07T05:42:08.118970Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# <b><div style='padding:15px;background-color:#66768c;border-radius:5px;color:#eceef2;text-align:center'>Reading Data and Decreasing Its Size to Fit into Kaggle Kernel RAM Size Restrictions</div></b>","metadata":{}},{"cell_type":"code","source":"%%time\ndf_train = pd.read_parquet(\"/kaggle/input/amex-data-integer-dtypes-parquet-format/train.parquet\")\n\ndf_train[\"S_2\"] = pd.to_datetime(df_train[\"S_2\"])\ndf_train[\"days\"] = (df_train[\"S_2\"] - df_train.groupby([\"customer_ID\"])[\"S_2\"].transform(\"min\")).dt.days.astype(\"int16\") + 1\n\nfor col in df_train[df_train.columns[df_train.dtypes==\"float32\"]]:\n    df_train[col] = df_train[col].astype(\"float16\")","metadata":{"execution":{"iopub.status.busy":"2022-07-07T05:42:08.122910Z","iopub.execute_input":"2022-07-07T05:42:08.123342Z","iopub.status.idle":"2022-07-07T05:43:17.802396Z","shell.execute_reply.started":"2022-07-07T05:42:08.123298Z","shell.execute_reply":"2022-07-07T05:43:17.800778Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# <b><div style='padding:15px;background-color:#66768c;border-radius:5px;color:#eceef2;text-align:center'>Grouping Data by customer_ID and Taking the Most Recent Records</div></b>","metadata":{}},{"cell_type":"code","source":"df_train = df_train.groupby([\"customer_ID\"]).tail(1).set_index('customer_ID')","metadata":{"execution":{"iopub.status.busy":"2022-07-07T05:43:17.804454Z","iopub.execute_input":"2022-07-07T05:43:17.804808Z","iopub.status.idle":"2022-07-07T05:43:20.908661Z","shell.execute_reply.started":"2022-07-07T05:43:17.804777Z","shell.execute_reply":"2022-07-07T05:43:20.907593Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# <b><div style='padding:15px;background-color:#66768c;border-radius:5px;color:#eceef2;text-align:center'>Target values</div></b>","metadata":{}},{"cell_type":"code","source":"%%time\ndf_train_labels = pd.read_csv(\"/kaggle/input/amex-default-prediction/train_labels.csv\")\ndf_train_labels[\"target\"] = df_train_labels[\"target\"].astype(\"int8\")","metadata":{"execution":{"iopub.status.busy":"2022-07-07T05:43:20.913405Z","iopub.execute_input":"2022-07-07T05:43:20.913790Z","iopub.status.idle":"2022-07-07T05:43:21.750432Z","shell.execute_reply.started":"2022-07-07T05:43:20.913759Z","shell.execute_reply":"2022-07-07T05:43:21.749193Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\ndf_train = df_train.merge(df_train_labels, on=\"customer_ID\", how='left')\ndel df_train_labels\ngc.collect()","metadata":{"execution":{"iopub.status.busy":"2022-07-07T05:43:21.752030Z","iopub.execute_input":"2022-07-07T05:43:21.752466Z","iopub.status.idle":"2022-07-07T05:43:22.885435Z","shell.execute_reply.started":"2022-07-07T05:43:21.752432Z","shell.execute_reply":"2022-07-07T05:43:22.884621Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# <b><div style='padding:15px;background-color:#66768c;border-radius:5px;color:#eceef2;text-align:center'>Metric</div></b>","metadata":{}},{"cell_type":"code","source":"# https://www.kaggle.com/code/cdeotte/xgboost-starter-0-793/notebook\n# https://www.kaggle.com/kyakovlev\n# https://www.kaggle.com/competitions/amex-default-prediction/discussion/327534\ndef amex_metric_mod(y_true, y_pred):\n    \n    labels     = np.transpose(np.array([y_true, y_pred]))\n    labels     = labels[labels[:, 1].argsort()[::-1]]\n    weights    = np.where(labels[:,0]==0, 20, 1)\n    cut_vals   = labels[np.cumsum(weights) <= int(0.04 * np.sum(weights))]\n    top_four   = np.sum(cut_vals[:,0]) / np.sum(labels[:,0])\n\n    gini = [0,0]\n    for i in [1,0]:\n        labels         = np.transpose(np.array([y_true, y_pred]))\n        labels         = labels[labels[:, i].argsort()[::-1]]\n        weight         = np.where(labels[:,0]==0, 20, 1)\n        weight_random  = np.cumsum(weight / np.sum(weight))\n        total_pos      = np.sum(labels[:, 0] *  weight)\n        cum_pos_found  = np.cumsum(labels[:, 0] * weight)\n        lorentz        = cum_pos_found / total_pos\n        gini[i]        = np.sum((lorentz - weight_random) * weight)\n\n    return 0.5 * (gini[1]/gini[0] + top_four),_","metadata":{"execution":{"iopub.status.busy":"2022-07-07T05:43:22.887032Z","iopub.execute_input":"2022-07-07T05:43:22.887352Z","iopub.status.idle":"2022-07-07T05:43:22.899734Z","shell.execute_reply.started":"2022-07-07T05:43:22.887322Z","shell.execute_reply":"2022-07-07T05:43:22.898330Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# <b><div style='padding:15px;background-color:#66768c;border-radius:5px;color:#eceef2;text-align:center'>Training by LightGBM</div></b>","metadata":{}},{"cell_type":"code","source":"FEATURES = df_train.columns.drop([\"target\",\"customer_ID\",\"S_2\"])\ncategorical_cols = ['B_30', 'B_38', 'D_114', 'D_116', 'D_117', 'D_120', 'D_126', 'D_63', 'D_64', 'D_66', 'D_68']\ncat_col=[]\nn=0\nfor col in df_train[FEATURES]:\n    for coll in categorical_cols:\n        if col==coll:\n            cat_col.append(n)\n            break\n    n+=1\ncat_col","metadata":{"execution":{"iopub.status.busy":"2022-07-07T05:48:30.340887Z","iopub.execute_input":"2022-07-07T05:48:30.341299Z","iopub.status.idle":"2022-07-07T05:48:30.593532Z","shell.execute_reply.started":"2022-07-07T05:48:30.341271Z","shell.execute_reply":"2022-07-07T05:48:30.592323Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\nparams = {}\nfeature_importances = []\nscores = []\nmodels = []\npred_val=[]\nyval=[]\n\nskf = StratifiedKFold(n_splits=NUM_FOLDS, shuffle=True, random_state=2022)\n\nfor fold,(train_idx, val_idx) in enumerate(skf.split(df_train[FEATURES],df_train[\"target\"])):\n    \n    print('FOLD:',fold)\n    \n    X_train = df_train.loc[train_idx, FEATURES].values\n    y_train = df_train.loc[train_idx, 'target'].values\n    X_val = df_train.loc[val_idx, FEATURES].values\n    y_val = df_train.loc[val_idx, 'target'].values\n\n    print(\"y_train t=0 count:\", len(y_train[y_train==0]))\n    print(\"y_train t=1 count:\", len(y_train[y_train==1]))\n    print(\"y_val t=0 count:\", len(y_val[y_val==0]))\n    print(\"y_val t=1 count:\", len(y_val[y_val==1]))\n\n\n    params = {\n        \"num_iterations\":10000,\n        'learning_rate': 0.05,\n    }\n        \n    model = lgbm.LGBMClassifier(**params).fit(\n        X_train,y_train,\n        eval_set=[(X_val,y_val),(X_train,y_train)],\n        verbose=100,\n        callbacks=[early_stopping(100)],\n        categorical_feature=cat_col\n    )\n\n    feature_importances.append(model.feature_importances_)   \n    models.append(model)\n    pred_val = np.append(pred_val,model.predict_proba(X_val)[:,1])\n    yval = np.append(yval,y_val)   \n    \n    del X_train,y_train,X_val,y_val,model\n    gc.collect()\n\n\nscore = amex_metric_mod(yval, pred_val)[0]\nprint('score:', score)\nf=open(\"score.txt\",\"a\");f.write(str(score));f.close()","metadata":{"execution":{"iopub.status.busy":"2022-07-07T05:50:14.108020Z","iopub.execute_input":"2022-07-07T05:50:14.108591Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"del df_train,train_idx,val_idx,yval,pred_val\ngc.collect()","metadata":{"execution":{"iopub.status.busy":"2022-07-07T05:43:22.933823Z","iopub.status.idle":"2022-07-07T05:43:22.935003Z","shell.execute_reply.started":"2022-07-07T05:43:22.934648Z","shell.execute_reply":"2022-07-07T05:43:22.934680Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# <b><div style='padding:15px;background-color:#66768c;border-radius:5px;color:#eceef2;text-align:center'>Feature Importances</div></b>","metadata":{}},{"cell_type":"code","source":"df_feat_imp = pd.DataFrame(index=FEATURES)\ndf_feat_imp[\"imp0\"] = feature_importances[0]\ndf_feat_imp[\"imp1\"] = feature_importances[1]\ndf_feat_imp[\"imp2\"] = feature_importances[2]\ndf_feat_imp[\"imp3\"] = feature_importances[3]\ndf_feat_imp[\"imp4\"] = feature_importances[4]\ndf_feat_imp[\"mean_imp\"] = df_feat_imp.mean(axis=1).values\n\ndf_feat_imp = df_feat_imp.sort_values(by=\"mean_imp\",ascending=False)\n\ndf_feat_imp.to_csv(\"feat_imp.csv\")\n\nfig, ax = plt.subplots(figsize=(20,5))\nsns.barplot(x=df_feat_imp.index,y=df_feat_imp[\"mean_imp\"])\nplt.xticks([])\nprint(df_feat_imp)\n\n#del df_feat_imp, feature_importances\n#gc.collect()","metadata":{"execution":{"iopub.status.busy":"2022-07-07T05:43:22.936736Z","iopub.status.idle":"2022-07-07T05:43:22.937155Z","shell.execute_reply.started":"2022-07-07T05:43:22.936961Z","shell.execute_reply":"2022-07-07T05:43:22.936979Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# <b><div style='padding:15px;background-color:#66768c;border-radius:5px;color:#eceef2;text-align:center'>Reading Test Data and Prediction</div></b>","metadata":{}},{"cell_type":"code","source":"df_test = pd.read_parquet(\"/kaggle/input/amex-data-integer-dtypes-parquet-format/test.parquet\")\n\nprint(\"convert float32 columns to float16\")\nfor col in df_test[df_test.columns[df_test.dtypes==\"float32\"]]:\n    df_test[col] = df_test[col].astype(\"float16\")\n\nprint(\"date and time\")\ndf_test[\"S_2\"] = pd.to_datetime(df_test[\"S_2\"])\ndf_test[\"days\"] = (df_test[\"S_2\"] - df_test.groupby([\"customer_ID\"])[\"S_2\"].transform(\"min\")).dt.days.astype(\"int16\") + 1\n\nprint(\"grouping\")\ndf_test = df_test.groupby([\"customer_ID\"]).tail(1).set_index('customer_ID')\n\n\nprint(\"prediction\")\npred=[]\nfor fold in range(5):\n    print('FOLD:',fold)\n\n    if len(pred)==0:\n        pred = models[fold].predict_proba(df_test.drop([\"S_2\"],axis=1))[:,1]\n    else:\n        pred += models[fold].predict_proba(df_test.drop([\"S_2\"],axis=1))[:,1]\n\n\npred = pred/5","metadata":{"execution":{"iopub.status.busy":"2022-07-07T05:43:22.939092Z","iopub.status.idle":"2022-07-07T05:43:22.940274Z","shell.execute_reply.started":"2022-07-07T05:43:22.939966Z","shell.execute_reply":"2022-07-07T05:43:22.939995Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# <b><div style='padding:15px;background-color:#66768c;border-radius:5px;color:#eceef2;text-align:center'>Submission</div></b>","metadata":{}},{"cell_type":"code","source":"subm = pd.read_csv(\"/kaggle/input/amex-default-prediction/sample_submission.csv\")\nsubm[\"prediction\"] = pred\nsubm.to_csv(\"submission.csv\", index=False)","metadata":{"execution":{"iopub.status.busy":"2022-07-07T05:43:22.941998Z","iopub.status.idle":"2022-07-07T05:43:22.942762Z","shell.execute_reply.started":"2022-07-07T05:43:22.942428Z","shell.execute_reply":"2022-07-07T05:43:22.942457Z"},"trusted":true},"execution_count":null,"outputs":[]}]}