{"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":"#thanks to @ambrosm\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nfrom matplotlib.ticker import MaxNLocator\nfrom matplotlib.colors import ListedColormap\nfrom cycler import cycler\nfrom IPython.display import display\nimport datetime\nimport scipy.stats as stats\nimport warnings\nfrom colorama import Fore, Back, Style\nimport gc\n\nfrom sklearn.model_selection import StratifiedKFold\nfrom sklearn.calibration import CalibrationDisplay\nimport lightgbm\nfrom lightgbm import LGBMClassifier, log_evaluation\n\nplt.rcParams['axes.facecolor'] = '#e8e3e3' \nplt.rcParams['axes.prop_cycle'] = cycler(color=['#0c7bdc'] +\n                                         plt.rcParams['axes.prop_cycle'].by_key()['color'][3:])\nplt.rcParams['text.color'] = 'b'\n\nINFERENCE = True # set to False if you only want to cross-validate","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-08-22T23:29:33.646684Z","iopub.execute_input":"2022-08-22T23:29:33.647121Z","iopub.status.idle":"2022-08-22T23:29:33.657406Z","shell.execute_reply.started":"2022-08-22T23:29:33.647084Z","shell.execute_reply":"2022-08-22T23:29:33.656156Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# @yunchonggan's fast metric implementation\n# From https://www.kaggle.com/competitions/amex-default-prediction/discussion/328020\ndef 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-08-22T23:29:33.997002Z","iopub.execute_input":"2022-08-22T23:29:33.998293Z","iopub.status.idle":"2022-08-22T23:29:34.008689Z","shell.execute_reply.started":"2022-08-22T23:29:33.998232Z","shell.execute_reply":"2022-08-22T23:29:34.007323Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\nfeatures_avg = ['B_1', 'B_2', 'B_3', 'B_4', 'B_5', 'B_6', 'B_8', 'B_9', 'B_10', 'B_11', 'B_12', 'B_13', 'B_14',\\\n                'B_15', 'B_16', 'B_17', 'B_18', 'B_19', 'B_20', 'B_21', 'B_22', 'B_23', 'B_24', 'B_25', 'B_28',\\\n                'B_29', 'B_30', 'B_32', 'B_33', 'B_37', 'B_38', 'B_39', 'B_40', 'B_41',  'D_39', 'D_41',\\\n                'D_42', 'D_43', 'D_44', 'D_45', 'D_46', 'D_47', 'D_48', 'D_50', 'D_51', 'D_53', 'D_54', 'D_55',\\\n                'D_58', 'D_59', 'D_60', 'D_61', 'D_62', 'D_65', 'D_66', 'D_69', 'D_70', 'D_71', 'D_72', 'D_73',\\\n                'D_74', 'D_75', 'D_76', 'D_77', 'D_78', 'D_80', 'D_82', 'D_84', 'D_91', 'D_92', 'D_96',\\\n                'D_103', 'D_104', 'D_108', 'D_112', 'D_113', 'D_114', 'D_115', 'D_117', 'D_118', 'D_119', 'D_120',\\\n                'D_121', 'D_122', 'D_123', 'D_124', 'D_125', 'D_126', 'D_128', 'D_129', 'D_131', 'D_132', 'D_133',\\\n                'D_134', 'D_135', 'D_136', 'D_140', 'D_141', 'D_142', 'D_144', 'D_145', 'P_2', 'P_3', 'P_4', 'R_1',\\\n                'R_2', 'R_3', 'R_7', 'R_8', 'R_9', 'R_10', 'R_11', 'R_14', 'R_15', 'R_16', 'R_17', 'R_20', \\\n                'R_22',  'R_26', 'R_27', 'S_3', 'S_5', 'S_6', 'S_7', 'S_9', 'S_11', 'S_12', 'S_13', 'S_15', 'S_16',\\\n                'S_18', 'S_22', 'S_23', 'S_25', 'S_26', 'B_42','D_86','D_94','R_21','R_24']\nfeatures_min = ['B_2', 'B_4', 'B_5', 'B_9', 'B_13', 'B_14', 'B_15', 'B_16', 'B_17', 'B_19', 'B_20', 'B_28',\\\n                'B_29', 'B_36',  'D_41', 'D_42', 'D_45', 'D_46', 'D_48', 'D_50', 'D_51',\\\n                'D_53', 'D_55', 'D_56', 'D_58', 'D_59', 'D_60', 'D_62', 'D_71', 'D_74', 'D_75', \\\n                'D_102', 'D_112', 'D_113', 'D_115', 'D_118', 'D_119', 'D_121', 'D_122', 'D_128', 'D_132',\\\n                'D_141', 'D_144', 'D_145', 'P_2', 'P_3', 'R_1', 'R_27', 'S_3', 'S_5', 'S_7', 'S_9', 'S_11',\\\n                'S_12', 'S_23', 'S_25','B_42','B_33', 'D_39', 'D_78','D_83','D_70','D_140']\nfeatures_max = ['B_1', 'B_2', 'B_3', 'B_4', 'B_5', 'B_6', 'B_7', 'B_8', 'B_9', 'B_10', 'B_12', 'B_13', 'B_14', 'B_15',\\\n                'B_16', 'B_17', 'B_18', 'B_19', 'B_21', 'B_23', 'B_24', 'B_25', 'B_29', 'B_30', 'B_37', 'B_38',\\\n                'B_40', 'D_39', 'D_41', 'D_42', 'D_43', 'D_44', 'D_45', 'D_46', 'D_47', 'D_48', 'D_49',\\\n                'D_50', 'D_52', 'D_55', 'D_56', 'D_58', 'D_59', 'D_60', 'D_61', 'D_63', 'D_64', 'D_65', 'D_70', 'D_71',\\\n                'D_72', 'D_73', 'D_74', 'D_76', 'D_77', 'D_78', 'D_80', 'D_82', 'D_84', 'D_102', 'D_105', 'D_107',\\\n                'D_110', 'D_112', 'D_115', 'D_116', 'D_117', 'D_118', 'D_119', 'D_121', 'D_122', 'D_123', 'D_124',\\\n                'D_125', 'D_128', 'D_131', 'D_132', 'D_133', 'D_134', 'D_138',  'D_141',\\\n                'D_142', 'D_144', 'D_145', 'P_2', 'P_3', 'P_4', 'R_1', 'R_3', 'R_5', 'R_6', 'R_7','R_10', 'R_11', \\\n                'R_14',  'R_20', 'R_26', 'R_27', 'S_3', 'S_5', 'S_7', 'S_8', 'S_11', 'S_12', 'S_13', 'S_15', 'S_16', \\\n                'S_22', 'S_23', 'S_24', 'S_25', 'S_26', 'S_27','B_42','B_39','D_91',  'R_8', 'D_136','D_140','D_111','D_126','D_135','B_33','R_17']\nfeatures_last = ['B_1', 'B_2', 'B_3', 'B_4', 'B_5', 'B_6', 'B_7', 'B_8', 'B_9', 'B_10', 'B_11', 'B_12', 'B_13', 'B_14', \\\n                 'B_15', 'B_16', 'B_17', 'B_18', 'B_19', 'B_20', 'B_21', 'B_22', 'B_23', 'B_24', 'B_25', 'B_26', 'B_28',\\\n                 'B_29', 'B_30', 'B_33', 'B_36', 'B_37', 'B_38', 'B_39', 'B_40', 'D_39', 'D_41',\\\n                 'D_42', 'D_43', 'D_44', 'D_45', 'D_46', 'D_47', 'D_48', 'D_49', 'D_50', 'D_51', 'D_52', 'D_53', 'D_54',\\\n                 'D_55', 'D_56', 'D_58', 'D_59', 'D_60', 'D_61', 'D_62', 'D_63', 'D_64', 'D_65', 'D_69', 'D_70', 'D_71',\\\n                 'D_72',  'D_75', 'D_76', 'D_77', 'D_78', 'D_79', 'D_80',  'D_82', 'D_83', 'D_86', 'D_91',\\\n                 'D_96', 'D_105', 'D_106', 'D_112', 'D_114', 'D_119', 'D_120', 'D_121', 'D_122', 'D_124',  \\\n                 'D_127', 'D_130', 'D_131', 'D_132', 'D_133', 'D_134', 'D_138', 'D_140', 'D_141', 'D_142', \\\n                 'D_145', 'P_2', 'P_3', 'P_4', 'R_1', 'R_2', 'R_3',  'R_5', 'R_6', 'R_7', 'R_9', 'R_10',\\\n                 'R_11', 'R_12', 'R_20', 'R_26', 'R_27', 'S_3', 'S_5', 'S_7', \\\n                 'S_8', 'S_9', 'S_11', 'S_12', 'S_13', 'S_16', 'S_19', 'S_20', 'S_22', 'S_23', 'S_24', 'S_25', 'S_26',\\\n                 'S_27','B_32','B_41', 'B_42', 'D_73','D_81','D_125','D_126', 'R_4', 'R_14', 'R_8','R_13','R_15','R_19','S_6']\nfor i in ['test', 'train'] if INFERENCE else ['train']:\n    df = pd.read_parquet(f'../input/amex-data-integer-dtypes-parquet-format/{i}.parquet')\n    cid = pd.Categorical(df.pop('customer_ID'), ordered=True)\n    last = (cid != np.roll(cid, -1)) # mask for last statement of every customer\n    if 'target' in df.columns:\n        df.drop(columns=['target'], inplace=True)\n    gc.collect()\n    print('Read', i)\n    df_avg = (df\n              .groupby(cid)\n              .mean()[features_avg]\n              .rename(columns={f: f\"{f}_avg\" for f in features_avg})\n             )\n    gc.collect()\n    print('Computed avg', i)\n    df_min = (df\n              .groupby(cid)\n              .min()[features_min]\n              .rename(columns={f: f\"{f}_min\" for f in features_min})\n             )\n    gc.collect()\n    print('Computed min', i)\n    df_max = (df\n              .groupby(cid)\n              .max()[features_max]\n              .rename(columns={f: f\"{f}_max\" for f in features_max})\n             )\n    gc.collect()\n    print('Computed max', i)\n\n    df = (df.loc[last, features_last]\n          .rename(columns={f: f\"{f}_last\" for f in features_last})\n          .set_index(np.asarray(cid[last]))\n         )\n    gc.collect()\n    print('Computed last', i)\n        \n    #last[\"c_PB_29\"]=(last[\"P_2_last\"]*(-1)-.0001)/(last[\"B_9_last\"]*(1)+0.0001)\n    print('Computed extras', i)\n    \n    df = pd.concat([df, df_min, df_max,df_avg], axis=1)\n    if i == 'train': train = df\n    else: test = df\n    print(f\"{i} shape: {df.shape}\")\n    del df, df_avg, df_min, df_max, cid, last\n    gc.collect()\n\n\n\n\n    \ntarget = pd.read_csv('../input/amex-default-prediction/train_labels.csv').target.values\nprint(f\"target shape: {target.shape}\")","metadata":{"execution":{"iopub.status.busy":"2022-08-22T23:36:18.863426Z","iopub.execute_input":"2022-08-22T23:36:18.863846Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n# test['rand'] = np.random.rand(924621,1)\n# train['rand'] = np.random.rand(458913,1)\n#randoms came back with a 408 significance score, most of these vars aren't very helpful\n\n#some of these vars beat the random so they are kept\ntest[\"c_DP_239\"]=(test[\"D_39_last\"]+.0001)/(test[\"P_2_last\"]*(-1)+0.0001)\ntest[\"a_DP_239\"]=(test[\"D_39_avg\"]+.0001)/(test[\"P_2_avg\"]*(-1)+0.0001)\ntest[\"c_PB_29\"]=(test[\"P_2_last\"]*(-1)+.0001)/(test[\"B_9_last\"]*(1)+0.0001)\ntest[\"c_PR_21\"]=(test[\"P_2_last\"]*(-1)+.0001)/(test[\"R_1_last\"]+0.0001)\n\ntest[\"c_DP_348\"]=(test[\"D_48_last\"]+.0001)/(test[\"P_3_last\"]+0.0001)\ntest[\"c_DP_355\"]=(test[\"D_55_last\"]+.0001)/(test[\"P_3_last\"]+0.0001)\n\ntest[\"c_DP_39r\"]=(test[\"D_39_last\"]+.0001)/(test[\"P_4_last\"]+0.0001)\ntest[\"c_PB_49\"]=(test[\"B_9_last\"]+.0001)/(test[\"P_4_last\"]+0.0001)\ntest[\"c_PR_41\"]=(test[\"R_1_last\"]+.0001)/(test[\"P_4_last\"]+0.0001)\ntest[\"c_BB93\"]=(test[\"B_9_last\"]+0.001)/(test[\"B_23_last\"]+test[\"B_3_last\"]+0.0001)\ntest[\"c_BB1825\"]=(test[\"B_33_last\"]*(-1))+(test[\"B_18_last\"]*(-1)+test[\"S_25_last\"]*(1)+0.0001)\ntest[\"c_BB1920\"]=(test[\"B_19_last\"]+test[\"B_20_last\"]+test[\"B_4_last\"]+0.0001)\n\ntest[\"c_R3R2\"]=(test[\"R_3_last\"]+0.001)/(test[\"R_2_last\"]+test[\"R_4_last\"]+0.0001)\ntest[\"c_DDR6227\"]=(test[\"D_62_last\"]+0.001)/(test[\"D_112_last\"]+test[\"R_27_last\"]+0.0001)\nprint('^ Fixing those DataFrame fragmentation errors ^')\n \nsetter = test.copy()\ndel test\ntest = setter.copy()\ndel setter\ngc.collect() \nprint('Errors mitigated successfully, moving on...')\ntrain[\"c_DP_239\"]=(train[\"D_39_last\"]+.0001)/(train[\"P_2_last\"]*(-1)+0.0001)\ntrain[\"a_DP_239\"]=(train[\"D_39_avg\"]+.0001)/(train[\"P_2_avg\"]*(-1)+0.0001)\ntrain[\"c_PB_29\"]=(train[\"P_2_last\"]*(-1)+.0001)/(train[\"B_9_last\"]*(1)+0.0001)\ntrain[\"c_PR_21\"]=(train[\"P_2_last\"]*(-1)+.0001)/(train[\"R_1_last\"]+0.0001)\n\ntrain[\"c_DP_348\"]=(train[\"D_48_last\"]+.0001)/(train[\"P_3_last\"]+0.0001)\ntrain[\"c_DP_355\"]=(train[\"D_55_last\"]+.0001)/(train[\"P_3_last\"]+0.0001)\n\ntrain[\"c_DP_39r\"]=(train[\"D_39_last\"]+.0001)/(train[\"P_4_last\"]+0.0001)\ntrain[\"c_PB_49\"]=(train[\"B_9_last\"]+.0001)/(train[\"P_4_last\"]+0.0001)\ntrain[\"c_PR_41\"]=(train[\"R_1_last\"]+.0001)/(train[\"P_4_last\"]+0.0001)\ntrain[\"c_BB93\"]=(train[\"B_9_last\"]+0.001)/(train[\"B_23_last\"]+train[\"B_3_last\"]+0.0001)\ntrain[\"c_BB1825\"]=(train[\"B_33_last\"]*(-1))+(train[\"B_18_last\"]*(-1)+train[\"S_25_last\"]*(1)+0.0001)\ntrain[\"c_BB1920\"]=(train[\"B_19_last\"]+train[\"B_20_last\"]+train[\"B_4_last\"]+0.0001)\n\ntrain[\"c_R3R2\"]=(train[\"R_3_last\"]+0.001)/(train[\"R_2_last\"]+train[\"R_4_last\"]+0.0001)\ntrain[\"c_DDR6227\"]=(train[\"D_62_last\"]+0.001)/(train[\"D_112_last\"]+train[\"R_27_last\"]+0.0001)\n\n\n#train = pd.concat([train,tn], axis=1)\n#test = pd.concat([test,tst], axis=1)\ngc.collect()\n\nprint('^ Fixing those DataFrame fragmentation errors ^')\nsetter = train.copy()\ndel train\ntrain = setter.copy()\ndel setter \ngc.collect() \nprint('Errors mitigated successfully, moving on...')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(train.shape)\ntrain.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"z = np.abs(stats.zscore(train))\nthreshold = 4\nfixer = np.where(z > threshold)\nfixer\nprint(len(fixer[0]))\nprint(len(fixer[1]))\n\n#Holy wow, 93000 datapoints with z-scores greater than 4 (that's not .004% --> Not normally distributed data)\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fixer = pd.DataFrame(fixer)\nfixer.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fixer.iloc[1].value_counts()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#have to use a model that will account for those 234 features (nearly half) = lgbm or keras\nfixer = []\ngc.collect()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\n# Cross-validation of the classifier\n\nONLY_FIRST_FOLD = False\n\n#to train model on all features use the next line\nfeatures = [f for f in train.columns if f != 'customer_ID' and f != 'target' ]\n\n#to limit model to \"important\" features based on random test uncomment the next line\n#features = ['D_46_last', 'D_43_avg', 'D_43_last', 'S_3_last', 'D_46_avg', 'D_46_min', 'B_3_last', 'D_48_last', 'P_3_avg', 'B_5_last', 'P_3_last', 'S_3_avg', 'D_43_max', 'B_4_max', 'S_7_min', 'S_9_avg', 'B_4_last', 'B_17_last', 'D_46_max', 'P_3_max', 'S_3_max', 'c_PR_21', 'B_17_min', 'D_61_last', 'S_7_last', 'D_62_min', 'P_2_min', 'B_2_last', 'c_DP_239', 'R_27_min', 'S_9_min', 'B_1_last', 'D_47_avg', 'c_DP_348', 'S_12_avg', 'B_17_max', 'S_23_max', 'D_77_max', 'D_105_max', 'S_9_last', 'R_27_max', 'D_77_avg', 'S_27_max', 'D_62_last', 'S_7_max', 'R_27_avg', 'S_3_min', 'P_3_min', 'D_48_min', 'P_2_avg', 'S_12_min', 'D_121_avg', 'R_27_last', 'S_27_last', 'B_3_max', 'c_PB_29', 'D_61_max', 'S_26_last', 'S_25_max', 'P_2_last', 'D_47_max', 'D_69_avg', 'c_DP_355', 'S_5_last', 'B_15_last', 'S_19_last', 'B_24_last', 'D_48_max', 'B_17_avg', 'S_11_avg', 'B_11_last', 'S_25_last', 'D_52_last', 'B_10_last', 'D_39_max', 'S_23_avg', 'B_5_min', 'a_DP_239', 'B_9_avg', 'D_69_last', 'S_26_max', 'D_61_avg', 'R_1_last', 'P_2_max', 'S_7_avg', 'D_62_avg', 'D_47_last', 'B_40_max', 'R_1_avg', 'D_121_max', 'D_119_min', 'S_12_last', 'B_14_last', 'D_121_last', 'S_25_min', 'S_15_avg', 'B_9_max', 'B_37_last', 'R_3_avg', 'D_102_max', 'B_2_min', 'S_23_last', 'B_28_min', 'D_133_max', 'R_6_last', 'D_118_min', 'B_9_last', 'S_16_last', 'S_16_max', 'D_133_avg', 'B_5_max', 'B_21_avg', 'D_60_last', 'B_26_last', 'S_12_max', 'D_48_avg', 'D_52_max', 'S_23_min', 'S_24_last', 'D_42_avg', 'D_121_min', 'B_7_last', 'D_58_max', 'D_71_last', 'B_36_last', 'S_5_max', 'B_21_max', 'S_22_last', 'B_18_last', 'D_133_last', 'D_144_max', 'S_5_avg', 'S_5_min', 'R_1_max', 'D_144_avg', 'D_42_min', 'B_15_min', 'B_24_max', 'D_59_avg', 'R_1_min', 'B_12_avg', 'D_55_min', 'D_105_last', 'D_144_min', 'S_26_avg', 'S_25_avg', 'D_60_max', 'D_115_min', 'S_16_avg', 'D_42_max', 'D_56_min', 'B_2_avg', 'B_8_last', 'S_22_avg', 'B_8_avg', 'B_5_avg', 'D_45_avg', 'D_45_last', 'B_15_max', 'D_119_avg', 'B_21_last']\n\n\ndef my_booster(random_state=1, n_estimators=1150):\n    return LGBMClassifier(n_estimators=n_estimators,\n                          learning_rate=0.03, reg_lambda=50,\n                          min_child_samples=2400,\n                          num_leaves=94,\n                          colsample_bytree=0.19,\n                          max_bins=517, random_state=random_state)\n      \nprint(f\"{len(features)} features\")\nscore_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_va, y_tr, y_va, model = None, None, None, None, None\n    start_time = datetime.datetime.now()\n    X_tr = train.iloc[idx_tr][features]\n    X_va = train.iloc[idx_va][features]\n    y_tr = target[idx_tr]\n    y_va = target[idx_va]\n    \n    model = my_booster()\n    with warnings.catch_warnings():\n        warnings.filterwarnings('ignore', category=UserWarning)\n        model.fit(X_tr, y_tr,\n                  eval_set = [(X_va, y_va)], \n                  eval_metric=[lgb_amex_metric],\n                  callbacks=[log_evaluation(100)])\n    X_tr, y_tr = None, None\n    y_va_pred = model.predict_proba(X_va, raw_score=True)\n    score = amex_metric(y_va, y_va_pred)\n    n_trees = model.best_iteration_\n    if n_trees is None: n_trees = model.n_estimators\n    print(f\"{Fore.GREEN}{Style.BRIGHT}Fold {fold} | {str(datetime.datetime.now() - start_time)[-12:-7]} |\"\n          f\" {n_trees:5} trees |\"\n          f\"                Score = {score:.5f}{Style.RESET_ALL}\")\n    score_list.append(score)\n    \n    if INFERENCE:\n        y_pred_list.append(model.predict_proba(test[features], raw_score=True))\n        \n    if ONLY_FIRST_FOLD: break # we only want the first fold\n    \nprint(f\"{Fore.GREEN}{Style.BRIGHT}OOF Score:                       {np.mean(score_list):.5f}{Style.RESET_ALL}\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def sigmoid(log_odds):\n    return 1 / (1 + np.exp(-log_odds))\n\nplt.figure(figsize=(10, 4))\nplt.hist(sigmoid(y_va_pred[y_va == 0]), bins=np.linspace(0, 1, 101),\n         alpha=0.5, density=True, label='0')\nplt.hist(sigmoid(y_va_pred[y_va == 1]), bins=np.linspace(0, 1, 101),\n         alpha=0.5, density=True, label='1')\nplt.xlabel('y_pred')\nplt.ylabel('density')\nplt.title('OOF Prediction histogram', color='black')\nplt.legend()\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(12, 4))\nCalibrationDisplay.from_predictions(y_va, sigmoid(y_va_pred), n_bins=50,\n                                    strategy='quantile', ax=plt.gca())\nplt.title('Probability calibration')\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if INFERENCE:\n    sub = pd.DataFrame({'customer_ID': test.index,\n                        'prediction': np.mean(y_pred_list, axis=0)})\n    sub.to_csv('submission.csv', index=False)\n    display(sub)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(12, 4))\nplt.hist(sigmoid(sub.prediction), bins=np.linspace(0, 1, 101), density=True)\nplt.hist(sigmoid(y_va_pred), bins=np.linspace(0, 1, 101), rwidth=0.5, color='#ffffff', density=True)\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os \nfor dirname, _, filenames in os.walk('/kaggle'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(12, 4))\nplt.hist(sigmoid(sub.prediction), bins=np.linspace(0, 1, 101), density=True)\nplt.hist(sigmoid(y_va_pred), bins=np.linspace(0, 1, 101), rwidth=0.5, color='yellow', density=True)\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"        \nfrom IPython.display import FileLink\nFileLink(r'submission.csv')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y = lightgbm.plot_importance(model, figsize=(12,112))\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"vectors = test.columns.tolist()\n#vectors = vectors.remove('customer_ID')\n#print(vectors)\nimportance_df = (\n     pd.DataFrame({\n         'feature_name': vectors,\n         'importance_gain': model.feature_importances_\n         #(importance_type='gain'),\n         #'importance_split': model.feature_importances_(importance_type='split')\n                                                    \n     })\n     .sort_values('importance_gain',ascending=False)\n#     .reset_index(drop=True)\n    )\ny = importance_df.loc[importance_df['importance_gain']>100]\nprint(y)\nz = y['feature_name'].tolist()\nprint(z)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#running classifier with all features nets a .795 score.\n#what remains below are outputs to avoid reruns...\n#first those features with importance over 300, then 200, then 100\n\n\n#running classifier with these features (with importance over 300) from raw list --> .788 accuracy result\n#   feature_name  importance_gain\n# 41     D_46_last              748\n# 366     D_43_avg              716\n# 38     D_43_last              703\n# 111     S_3_last              658\n# 369     D_46_avg              647\n# ..           ...              ...\n# 368     D_45_avg              307\n# 40     D_45_last              306\n# 218     B_15_max              305\n# 409    D_119_avg              305\n# 20     B_21_last              302\n\n# [161 rows x 2 columns]\n# ['D_46_last', 'D_43_avg', 'D_43_last', 'S_3_last', 'D_46_avg', 'D_46_min', 'B_3_last', 'D_48_last', 'P_3_avg', 'B_5_last', 'P_3_last', 'S_3_avg', 'D_43_max', 'B_4_max', 'S_7_min', 'S_9_avg', 'B_4_last', 'B_17_last', 'D_46_max', 'P_3_max', 'S_3_max', 'c_PR_21', 'B_17_min', 'D_61_last', 'S_7_last', 'D_62_min', 'P_2_min', 'B_2_last', 'c_DP_239', 'R_27_min', 'S_9_min', 'B_1_last', 'D_47_avg', 'c_DP_348', 'S_12_avg', 'B_17_max', 'S_23_max', 'D_77_max', 'D_105_max', 'S_9_last', 'R_27_max', 'D_77_avg', 'S_27_max', 'D_62_last', 'S_7_max', 'R_27_avg', 'S_3_min', 'P_3_min', 'D_48_min', 'P_2_avg', 'S_12_min', 'D_121_avg', 'R_27_last', 'S_27_last', 'B_3_max', 'c_PB_29', 'D_61_max', 'S_26_last', 'S_25_max', 'P_2_last', 'D_47_max', 'D_69_avg', 'c_DP_355', 'S_5_last', 'B_15_last', 'S_19_last', 'B_24_last', 'D_48_max', 'B_17_avg', 'S_11_avg', 'B_11_last', 'S_25_last', 'D_52_last', 'B_10_last', 'D_39_max', 'S_23_avg', 'B_5_min', 'a_DP_239', 'B_9_avg', 'D_69_last', 'S_26_max', 'D_61_avg', 'R_1_last', 'P_2_max', 'S_7_avg', 'D_62_avg', 'D_47_last', 'B_40_max', 'R_1_avg', 'D_121_max', 'D_119_min', 'S_12_last', 'B_14_last', 'D_121_last', 'S_25_min', 'S_15_avg', 'B_9_max', 'B_37_last', 'R_3_avg', 'D_102_max', 'B_2_min', 'S_23_last', 'B_28_min', 'D_133_max', 'R_6_last', 'D_118_min', 'B_9_last', 'S_16_last', 'S_16_max', 'D_133_avg', 'B_5_max', 'B_21_avg', 'D_60_last', 'B_26_last', 'S_12_max', 'D_48_avg', 'D_52_max', 'S_23_min', 'S_24_last', 'D_42_avg', 'D_121_min', 'B_7_last', 'D_58_max', 'D_71_last', 'B_36_last', 'S_5_max', 'B_21_max', 'S_22_last', 'B_18_last', 'D_133_last', 'D_144_max', 'S_5_avg', 'S_5_min', 'R_1_max', 'D_144_avg', 'D_42_min', 'B_15_min', 'B_24_max', 'D_59_avg', 'R_1_min', 'B_12_avg', 'D_55_min', 'D_105_last', 'D_144_min', 'S_26_avg', 'S_25_avg', 'D_60_max', 'D_115_min', 'S_16_avg', 'D_42_max', 'D_56_min', 'B_2_avg', 'B_8_last', 'S_22_avg', 'B_8_avg', 'B_5_avg', 'D_45_avg', 'D_45_last', 'B_15_max', 'D_119_avg', 'B_21_last']","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pickle\nimport shap","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"explainer = shap.TreeExplainer(model)\nexpected_value = explainer.expected_value\nif isinstance(expected_value, list):\n    expected_value = expected_value[1]\nprint(f\"Explainer expected value: {expected_value}\")\n\nselect = range(480)\nfeatures = train.iloc[select]\nfeatures_display = train.loc[features.index]\n\nwith warnings.catch_warnings():\n    warnings.simplefilter(\"ignore\")\n    shap_values = explainer.shap_values(features)[1]\n    shap_interaction_values = explainer.shap_interaction_values(features)\nif isinstance(shap_interaction_values, list):\n    shap_interaction_values = shap_interaction_values[1]\n\nprint(f'shap_values: {shap_values}')\nprint(f'shap_interaction_values: {shap_interaction_values}')\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"shap.decision_plot(expected_value, shap_values, features_display)\n\n# visually this didn't change with the reduction in features, (but we're only looking at 20)\n# There was no noticeable horizontal shift gains between the outputs\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}