diff --git a/assignments/assignment_3/assign_3_template.ipynb b/assignments/assignment_3/assign_3_template.ipynb index 79cd112..8cb2de0 100644 --- a/assignments/assignment_3/assign_3_template.ipynb +++ b/assignments/assignment_3/assign_3_template.ipynb @@ -513,7 +513,7 @@ "text": [ "Grid search run 1/10:\n", "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.25, 'min_samples_leaf': 1, 'max_leaves': 3}\n", - "Grid search new best score discovered at iteration 1/10: 0.8217.\n", + "Grid search new best score discovered at iteration 1/10: 0.8218.\n", "---------- ----------\n", "Grid search run 2/10:\n", "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 32, 'interactions': 5, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.25, 'min_samples_leaf': 2, 'max_leaves': 5}\n", @@ -526,7 +526,7 @@ "---------- ----------\n", "Grid search run 5/10:\n", "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.1, 'min_samples_leaf': 10, 'max_leaves': 3}\n", - "Grid search new best score discovered at iteration 5/10: 0.8247.\n", + "Grid search new best score discovered at iteration 5/10: 0.8253.\n", "---------- ----------\n", "Grid search run 6/10:\n", "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 16, 'interactions': 15, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.1, 'min_samples_leaf': 2, 'max_leaves': 5}\n", @@ -543,7 +543,7 @@ "Grid search run 10/10:\n", "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.25, 'min_samples_leaf': 2, 'max_leaves': 3}\n", "---------- ----------\n", - "EBM training completed in 324.90 s.\n" + "EBM training completed in 639.77 s.\n" ] } ], @@ -589,7 +589,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Validation AUC: 0.8247.\n" + "Validation AUC: 0.8253.\n" ] } ], @@ -679,7 +679,7 @@ " -0.040307\n", " 0.854601\n", " 0\n", - " 0.171009\n", + " 0.165646\n", " \n", " \n", " 1\n", @@ -703,7 +703,7 @@ " -0.020904\n", " 1.037419\n", " 0\n", - " 0.323614\n", + " 0.314594\n", " \n", " \n", " 2\n", @@ -727,7 +727,7 @@ " -0.019865\n", " 0.031916\n", " 0\n", - " 0.023242\n", + " 0.022284\n", " \n", " \n", " 3\n", @@ -751,7 +751,7 @@ " -0.028181\n", " 0.946010\n", " 0\n", - " 0.015636\n", + " 0.015600\n", " \n", " \n", " 4\n", @@ -775,7 +775,7 @@ " 0.016515\n", " -1.156406\n", " 0\n", - " 0.004191\n", + " 0.004888\n", " \n", " \n", "\n", @@ -812,11 +812,11 @@ "4 0.111598 0.016515 -1.156406 0 \n", "\n", " phat \n", - "0 0.171009 \n", - "1 0.323614 \n", - "2 0.023242 \n", - "3 0.015636 \n", - "4 0.004191 \n", + "0 0.165646 \n", + "1 0.314594 \n", + "2 0.022284 \n", + "3 0.015600 \n", + "4 0.004888 \n", "\n", "[5 rows x 24 columns]" ] @@ -861,10 +861,10 @@ "text": [ " cut f1 acc\n", "0 0.00 0.173860 0.095206\n", - "1 0.01 0.233663 0.383966\n", - "2 0.02 0.262216 0.478756\n", - "3 0.03 0.280327 0.530061\n", - "4 0.04 0.295720 0.569200\n", + "1 0.01 0.233938 0.384777\n", + "2 0.02 0.262541 0.479048\n", + "3 0.03 0.280733 0.530685\n", + "4 0.04 0.295953 0.569783\n", ".. ... ... ...\n", "96 0.96 0.000000 0.904794\n", "97 0.97 0.000000 0.904794\n", @@ -874,7 +874,7 @@ "\n", "[101 rows x 3 columns]\n", "\n", - "Best EBM F1: 0.3662 achieved at cutoff: 0.17 with accuracy: 0.7793.\n" + "Best EBM F1: 0.3666 achieved at cutoff: 0.18 with accuracy: 0.7927.\n" ] } ], @@ -911,28 +911,28 @@ "text": [ "Confusion matrix by black=1\n", " actual: 1 actual: 0\n", - "predicted: 1 493 993\n", - "predicted: 0 171 1535\n", + "predicted: 1 470 911\n", + "predicted: 0 194 1617\n", "\n", "Confusion matrix by asian=1\n", " actual: 1 actual: 0\n", - "predicted: 1 99 206\n", - "predicted: 0 49 2896\n", + "predicted: 1 95 176\n", + "predicted: 0 53 2926\n", "\n", "Confusion matrix by white=1\n", " actual: 1 actual: 0\n", - "predicted: 1 2091 6723\n", - "predicted: 0 1074 24637\n", + "predicted: 1 1965 6117\n", + "predicted: 0 1200 25243\n", "\n", "Confusion matrix by male=1\n", " actual: 1 actual: 0\n", - "predicted: 1 1111 3436\n", - "predicted: 0 553 10732\n", + "predicted: 1 1036 3122\n", + "predicted: 0 628 11046\n", "\n", "Confusion matrix by female=1\n", " actual: 1 actual: 0\n", - "predicted: 1 897 2397\n", - "predicted: 0 343 6395\n", + "predicted: 1 847 2175\n", + "predicted: 0 393 6617\n", "\n" ] } @@ -967,9 +967,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "White proportion accepted: 0.745\n", - "Asian proportion accepted: 0.906\n", - "Adverse impact ratio for Asian people vs. White people: 1.217\n" + "White proportion accepted: 0.766\n", + "Asian proportion accepted: 0.917\n", + "Adverse impact ratio for Asian people vs. White people: 1.197\n" ] } ], @@ -995,9 +995,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "White proportion accepted: 0.745\n", - "Black proportion accepted: 0.534\n", - "Adverse impact ratio for Black people vs. White people: 0.718\n" + "White proportion accepted: 0.766\n", + "Black proportion accepted: 0.567\n", + "Adverse impact ratio for Black people vs. White people: 0.741\n" ] } ], @@ -1023,9 +1023,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "Male proportion accepted: 0.713\n", - "Female proportion accepted: 0.672\n", - "Adverse impact ratio for Females vs. Males: 0.942\n" + "Male proportion accepted: 0.737\n", + "Female proportion accepted: 0.699\n", + "Adverse impact ratio for Females vs. Males: 0.948\n" ] } ], @@ -1086,37 +1086,37 @@ " \n", " 22\n", " 0.22\n", - " 0.353556\n", - " 0.832921\n", - " 0.823237\n", + " 0.356794\n", + " 0.832942\n", + " 0.816260\n", " \n", " \n", " 23\n", " 0.23\n", - " 0.347684\n", - " 0.841822\n", - " 0.844324\n", + " 0.350179\n", + " 0.841156\n", + " 0.843019\n", " \n", " \n", " 24\n", " 0.24\n", - " 0.339292\n", - " 0.850889\n", - " 0.868422\n", + " 0.341709\n", + " 0.850161\n", + " 0.864101\n", " \n", " \n", " 25\n", " 0.25\n", - " 0.329670\n", - " 0.859187\n", - " 0.878782\n", + " 0.330154\n", + " 0.858313\n", + " 0.878680\n", " \n", " \n", " 26\n", " 0.26\n", - " 0.315778\n", - " 0.865717\n", - " 0.887457\n", + " 0.316466\n", + " 0.865155\n", + " 0.887407\n", " \n", " \n", "\n", @@ -1124,11 +1124,11 @@ ], "text/plain": [ " cut f1 acc air\n", - "22 0.22 0.353556 0.832921 0.823237\n", - "23 0.23 0.347684 0.841822 0.844324\n", - "24 0.24 0.339292 0.850889 0.868422\n", - "25 0.25 0.329670 0.859187 0.878782\n", - "26 0.26 0.315778 0.865717 0.887457" + "22 0.22 0.356794 0.832942 0.816260\n", + "23 0.23 0.350179 0.841156 0.843019\n", + "24 0.24 0.341709 0.850161 0.864101\n", + "25 0.25 0.330154 0.858313 0.878680\n", + "26 0.26 0.316466 0.865155 0.887407" ] }, "execution_count": 18, @@ -1168,9 +1168,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "Adverse impact ratio for Asian people vs. White people: 1.125\n", - "Adverse impact ratio for Black people vs. White people: 0.823\n", - "Adverse impact ratio for Females vs. Males: 0.967\n" + "Adverse impact ratio for Asian people vs. White people: 1.128\n", + "Adverse impact ratio for Black people vs. White people: 0.816\n", + "Adverse impact ratio for Females vs. Males: 0.965\n" ] } ], @@ -1204,7 +1204,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": null, "id": "96994093", "metadata": {}, "outputs": [ @@ -1227,6 +1227,7 @@ "---------- ----------\n", "Grid search run 5/500:\n", "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.1, 'min_samples_leaf': 10, 'max_leaves': 3}\n", + "Grid search new best score discovered at iteration 5/500: 0.8255.\n", "---------- ----------\n", "Grid search run 6/500:\n", "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 16, 'interactions': 15, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.1, 'min_samples_leaf': 2, 'max_leaves': 5}\n", @@ -1263,14 +1264,12 @@ "---------- ----------\n", "Grid search run 17/500:\n", "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 10, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.25, 'min_samples_leaf': 5, 'max_leaves': 3}\n", - "Grid search new best score discovered at iteration 17/500: 0.8224.\n", "---------- ----------\n", "Grid search run 18/500:\n", "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.25, 'min_samples_leaf': 1, 'max_leaves': 3}\n", "---------- ----------\n", "Grid search run 19/500:\n", "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 32, 'interactions': 15, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.25, 'min_samples_leaf': 5, 'max_leaves': 3}\n", - "Grid search new best score discovered at iteration 19/500: 0.8243.\n", "---------- ----------\n", "Grid search run 20/500:\n", "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 32, 'interactions': 15, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.5, 'min_samples_leaf': 10, 'max_leaves': 5}\n", @@ -1598,7 +1597,6 @@ "---------- ----------\n", "Grid search run 120/500:\n", "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 2, 'max_leaves': 5}\n", - "Grid search new best score discovered at iteration 120/500: 0.8246.\n", "---------- ----------\n", "Grid search run 121/500:\n", "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 10, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.25, 'min_samples_leaf': 10, 'max_leaves': 5}\n", @@ -1622,16 +1620,16 @@ "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.5, 'min_samples_leaf': 1, 'max_leaves': 3}\n", "---------- ----------\n", "Grid search run 128/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 32, 'interactions': 10, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.5, 'min_samples_leaf': 5, 'max_leaves': 5}\n" + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 32, 'interactions': 10, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.5, 'min_samples_leaf': 5, 'max_leaves': 5}\n", + "---------- ----------\n", + "Grid search run 129/500:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 32, 'interactions': 10, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.5, 'min_samples_leaf': 2, 'max_leaves': 5}\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "---------- ----------\n", - "Grid search run 129/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 32, 'interactions': 10, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.5, 'min_samples_leaf': 2, 'max_leaves': 5}\n", "---------- ----------\n", "Grid search run 130/500:\n", "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 32, 'interactions': 5, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 1, 'max_leaves': 5}\n", @@ -1706,16 +1704,16 @@ "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.25, 'min_samples_leaf': 5, 'max_leaves': 1}\n", "---------- ----------\n", "Grid search run 154/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 16, 'interactions': 10, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.1, 'min_samples_leaf': 10, 'max_leaves': 1}\n" + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 16, 'interactions': 10, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.1, 'min_samples_leaf': 10, 'max_leaves': 1}\n", + "---------- ----------\n", + "Grid search run 155/500:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 32, 'interactions': 5, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.1, 'min_samples_leaf': 1, 'max_leaves': 1}\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "---------- ----------\n", - "Grid search run 155/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 32, 'interactions': 5, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.1, 'min_samples_leaf': 1, 'max_leaves': 1}\n", "---------- ----------\n", "Grid search run 156/500:\n", "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 32, 'interactions': 5, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.1, 'min_samples_leaf': 5, 'max_leaves': 5}\n", @@ -1790,16 +1788,16 @@ "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 32, 'interactions': 5, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.1, 'min_samples_leaf': 5, 'max_leaves': 3}\n", "---------- ----------\n", "Grid search run 180/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 16, 'interactions': 10, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.1, 'min_samples_leaf': 5, 'max_leaves': 5}\n" + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 16, 'interactions': 10, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.1, 'min_samples_leaf': 5, 'max_leaves': 5}\n", + "---------- ----------\n", + "Grid search run 181/500:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 16, 'interactions': 15, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 2, 'max_leaves': 1}\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "---------- ----------\n", - "Grid search run 181/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 16, 'interactions': 15, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 2, 'max_leaves': 1}\n", "---------- ----------\n", "Grid search run 182/500:\n", "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.25, 'min_samples_leaf': 2, 'max_leaves': 1}\n", @@ -1874,16 +1872,16 @@ "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 64, 'interactions': 10, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.1, 'min_samples_leaf': 1, 'max_leaves': 5}\n", "---------- ----------\n", "Grid search run 206/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 2, 'max_leaves': 1}\n" + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 2, 'max_leaves': 1}\n", + "---------- ----------\n", + "Grid search run 207/500:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 16, 'interactions': 10, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.25, 'min_samples_leaf': 5, 'max_leaves': 3}\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "---------- ----------\n", - "Grid search run 207/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 16, 'interactions': 10, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.25, 'min_samples_leaf': 5, 'max_leaves': 3}\n", "---------- ----------\n", "Grid search run 208/500:\n", "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 10, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.1, 'min_samples_leaf': 5, 'max_leaves': 1}\n", @@ -1958,16 +1956,16 @@ "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 32, 'interactions': 15, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.1, 'min_samples_leaf': 10, 'max_leaves': 5}\n", "---------- ----------\n", "Grid search run 232/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.25, 'min_samples_leaf': 2, 'max_leaves': 1}\n" + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.25, 'min_samples_leaf': 2, 'max_leaves': 1}\n", + "---------- ----------\n", + "Grid search run 233/500:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 32, 'interactions': 15, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 5, 'max_leaves': 3}\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "---------- ----------\n", - "Grid search run 233/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 32, 'interactions': 15, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 5, 'max_leaves': 3}\n", "---------- ----------\n", "Grid search run 234/500:\n", "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 10, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.25, 'min_samples_leaf': 2, 'max_leaves': 3}\n", @@ -2042,16 +2040,16 @@ "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 32, 'interactions': 10, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 10, 'max_leaves': 1}\n", "---------- ----------\n", "Grid search run 258/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 16, 'interactions': 10, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.1, 'min_samples_leaf': 2, 'max_leaves': 5}\n" + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 16, 'interactions': 10, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.1, 'min_samples_leaf': 2, 'max_leaves': 5}\n", + "---------- ----------\n", + "Grid search run 259/500:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 32, 'interactions': 5, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.1, 'min_samples_leaf': 5, 'max_leaves': 1}\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "---------- ----------\n", - "Grid search run 259/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 32, 'interactions': 5, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.1, 'min_samples_leaf': 5, 'max_leaves': 1}\n", "---------- ----------\n", "Grid search run 260/500:\n", "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 32, 'interactions': 15, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 10, 'max_leaves': 1}\n", @@ -2126,16 +2124,16 @@ "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 32, 'interactions': 15, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.5, 'min_samples_leaf': 5, 'max_leaves': 3}\n", "---------- ----------\n", "Grid search run 284/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 32, 'interactions': 15, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.1, 'min_samples_leaf': 5, 'max_leaves': 5}\n" + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 32, 'interactions': 15, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.1, 'min_samples_leaf': 5, 'max_leaves': 5}\n", + "---------- ----------\n", + "Grid search run 285/500:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.25, 'min_samples_leaf': 5, 'max_leaves': 1}\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "---------- ----------\n", - "Grid search run 285/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.25, 'min_samples_leaf': 5, 'max_leaves': 1}\n", "---------- ----------\n", "Grid search run 286/500:\n", "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 16, 'interactions': 10, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.25, 'min_samples_leaf': 2, 'max_leaves': 1}\n", @@ -2210,627 +2208,10 @@ "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 16, 'interactions': 10, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.5, 'min_samples_leaf': 2, 'max_leaves': 5}\n", "---------- ----------\n", "Grid search run 310/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 32, 'interactions': 10, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.5, 'min_samples_leaf': 5, 'max_leaves': 3}\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 32, 'interactions': 10, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.5, 'min_samples_leaf': 5, 'max_leaves': 3}\n", "---------- ----------\n", "Grid search run 311/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 16, 'interactions': 15, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.25, 'min_samples_leaf': 2, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 312/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 32, 'interactions': 10, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.5, 'min_samples_leaf': 2, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 313/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.25, 'min_samples_leaf': 2, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 314/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 32, 'interactions': 15, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.1, 'min_samples_leaf': 1, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 315/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.5, 'min_samples_leaf': 2, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 316/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 16, 'interactions': 10, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.5, 'min_samples_leaf': 5, 'max_leaves': 3}\n", - "---------- ----------\n", - "Grid search run 317/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 5, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 318/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 16, 'interactions': 15, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.25, 'min_samples_leaf': 2, 'max_leaves': 3}\n", - "---------- ----------\n", - "Grid search run 319/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.1, 'min_samples_leaf': 2, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 320/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 32, 'interactions': 10, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.1, 'min_samples_leaf': 1, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 321/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 32, 'interactions': 15, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.1, 'min_samples_leaf': 2, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 322/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 32, 'interactions': 5, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.1, 'min_samples_leaf': 1, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 323/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.1, 'min_samples_leaf': 10, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 324/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 32, 'interactions': 5, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.25, 'min_samples_leaf': 10, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 325/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 16, 'interactions': 15, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.25, 'min_samples_leaf': 2, 'max_leaves': 3}\n", - "---------- ----------\n", - "Grid search run 326/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 32, 'interactions': 15, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.1, 'min_samples_leaf': 5, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 327/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.25, 'min_samples_leaf': 1, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 328/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.25, 'min_samples_leaf': 2, 'max_leaves': 3}\n", - "---------- ----------\n", - "Grid search run 329/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 16, 'interactions': 10, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.5, 'min_samples_leaf': 1, 'max_leaves': 3}\n", - "---------- ----------\n", - "Grid search run 330/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 10, 'max_leaves': 3}\n", - "---------- ----------\n", - "Grid search run 331/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 32, 'interactions': 5, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 5, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 332/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 5, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 333/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 16, 'interactions': 10, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 1, 'max_leaves': 3}\n", - "---------- ----------\n", - "Grid search run 334/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 16, 'interactions': 15, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.1, 'min_samples_leaf': 10, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 335/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 16, 'interactions': 15, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.25, 'min_samples_leaf': 2, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 336/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 2, 'max_leaves': 1}\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "---------- ----------\n", - "Grid search run 337/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.25, 'min_samples_leaf': 2, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 338/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 1, 'max_leaves': 3}\n", - "---------- ----------\n", - "Grid search run 339/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 32, 'interactions': 10, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.5, 'min_samples_leaf': 5, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 340/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.1, 'min_samples_leaf': 5, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 341/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.5, 'min_samples_leaf': 2, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 342/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 16, 'interactions': 15, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.25, 'min_samples_leaf': 10, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 343/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 32, 'interactions': 15, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.5, 'min_samples_leaf': 2, 'max_leaves': 3}\n", - "---------- ----------\n", - "Grid search run 344/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 32, 'interactions': 5, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.5, 'min_samples_leaf': 10, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 345/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.5, 'min_samples_leaf': 2, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 346/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 16, 'interactions': 10, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 1, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 347/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 5, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 348/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.25, 'min_samples_leaf': 10, 'max_leaves': 3}\n", - "---------- ----------\n", - "Grid search run 349/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.1, 'min_samples_leaf': 5, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 350/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 32, 'interactions': 5, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.5, 'min_samples_leaf': 2, 'max_leaves': 3}\n", - "---------- ----------\n", - "Grid search run 351/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 32, 'interactions': 5, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.1, 'min_samples_leaf': 5, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 352/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.1, 'min_samples_leaf': 5, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 353/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 16, 'interactions': 10, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.25, 'min_samples_leaf': 5, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 354/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.25, 'min_samples_leaf': 1, 'max_leaves': 3}\n", - "---------- ----------\n", - "Grid search run 355/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 32, 'interactions': 5, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.25, 'min_samples_leaf': 5, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 356/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.1, 'min_samples_leaf': 10, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 357/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.1, 'min_samples_leaf': 1, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 358/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 10, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.1, 'min_samples_leaf': 1, 'max_leaves': 3}\n", - "---------- ----------\n", - "Grid search run 359/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 2, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 360/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.25, 'min_samples_leaf': 5, 'max_leaves': 3}\n", - "---------- ----------\n", - "Grid search run 361/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 64, 'interactions': 10, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.25, 'min_samples_leaf': 2, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 362/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.25, 'min_samples_leaf': 2, 'max_leaves': 5}\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "---------- ----------\n", - "Grid search run 363/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.25, 'min_samples_leaf': 2, 'max_leaves': 3}\n", - "---------- ----------\n", - "Grid search run 364/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 16, 'interactions': 10, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.25, 'min_samples_leaf': 5, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 365/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 32, 'interactions': 5, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.1, 'min_samples_leaf': 2, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 366/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.25, 'min_samples_leaf': 2, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 367/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.5, 'min_samples_leaf': 2, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 368/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.1, 'min_samples_leaf': 5, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 369/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.1, 'min_samples_leaf': 5, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 370/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.1, 'min_samples_leaf': 2, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 371/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 32, 'interactions': 10, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 2, 'max_leaves': 3}\n", - "---------- ----------\n", - "Grid search run 372/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 64, 'interactions': 10, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.1, 'min_samples_leaf': 10, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 373/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 32, 'interactions': 15, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.25, 'min_samples_leaf': 10, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 374/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 16, 'interactions': 15, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.5, 'min_samples_leaf': 1, 'max_leaves': 3}\n", - "---------- ----------\n", - "Grid search run 375/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 1, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 376/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 32, 'interactions': 5, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.5, 'min_samples_leaf': 10, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 377/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 10, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.25, 'min_samples_leaf': 5, 'max_leaves': 3}\n", - "---------- ----------\n", - "Grid search run 378/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 32, 'interactions': 10, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.1, 'min_samples_leaf': 10, 'max_leaves': 3}\n", - "---------- ----------\n", - "Grid search run 379/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 32, 'interactions': 15, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.5, 'min_samples_leaf': 2, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 380/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 32, 'interactions': 10, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.5, 'min_samples_leaf': 1, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 381/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 64, 'interactions': 10, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.25, 'min_samples_leaf': 2, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 382/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 2, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 383/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 32, 'interactions': 10, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 5, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 384/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 32, 'interactions': 15, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.25, 'min_samples_leaf': 5, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 385/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.25, 'min_samples_leaf': 10, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 386/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.1, 'min_samples_leaf': 1, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 387/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.25, 'min_samples_leaf': 10, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 388/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.5, 'min_samples_leaf': 5, 'max_leaves': 1}\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "---------- ----------\n", - "Grid search run 389/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.1, 'min_samples_leaf': 5, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 390/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 64, 'interactions': 10, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.25, 'min_samples_leaf': 5, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 391/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 32, 'interactions': 15, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 10, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 392/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 32, 'interactions': 15, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.1, 'min_samples_leaf': 10, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 393/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.25, 'min_samples_leaf': 5, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 394/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 16, 'interactions': 15, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 2, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 395/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 16, 'interactions': 15, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.25, 'min_samples_leaf': 5, 'max_leaves': 3}\n", - "---------- ----------\n", - "Grid search run 396/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 16, 'interactions': 10, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.5, 'min_samples_leaf': 5, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 397/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.1, 'min_samples_leaf': 10, 'max_leaves': 3}\n", - "---------- ----------\n", - "Grid search run 398/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.1, 'min_samples_leaf': 2, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 399/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 16, 'interactions': 10, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.25, 'min_samples_leaf': 2, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 400/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.1, 'min_samples_leaf': 2, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 401/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 16, 'interactions': 10, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.1, 'min_samples_leaf': 5, 'max_leaves': 3}\n", - "---------- ----------\n", - "Grid search run 402/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.1, 'min_samples_leaf': 5, 'max_leaves': 3}\n", - "---------- ----------\n", - "Grid search run 403/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 10, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.5, 'min_samples_leaf': 10, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 404/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 16, 'interactions': 15, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.1, 'min_samples_leaf': 1, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 405/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.1, 'min_samples_leaf': 2, 'max_leaves': 3}\n", - "---------- ----------\n", - "Grid search run 406/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 16, 'interactions': 15, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 1, 'max_leaves': 3}\n", - "---------- ----------\n", - "Grid search run 407/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.25, 'min_samples_leaf': 5, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 408/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.25, 'min_samples_leaf': 5, 'max_leaves': 3}\n", - "---------- ----------\n", - "Grid search run 409/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.1, 'min_samples_leaf': 2, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 410/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 1, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 411/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.25, 'min_samples_leaf': 10, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 412/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.1, 'min_samples_leaf': 2, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 413/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 64, 'interactions': 10, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 2, 'max_leaves': 3}\n", - "---------- ----------\n", - "Grid search run 414/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.5, 'min_samples_leaf': 5, 'max_leaves': 3}\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "---------- ----------\n", - "Grid search run 415/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 32, 'interactions': 10, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.1, 'min_samples_leaf': 5, 'max_leaves': 3}\n", - "---------- ----------\n", - "Grid search run 416/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 2, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 417/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 16, 'interactions': 10, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.25, 'min_samples_leaf': 5, 'max_leaves': 3}\n", - "---------- ----------\n", - "Grid search run 418/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 16, 'interactions': 10, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 5, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 419/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 16, 'interactions': 15, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.25, 'min_samples_leaf': 1, 'max_leaves': 3}\n", - "---------- ----------\n", - "Grid search run 420/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.1, 'min_samples_leaf': 1, 'max_leaves': 3}\n", - "---------- ----------\n", - "Grid search run 421/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.25, 'min_samples_leaf': 5, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 422/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 10, 'max_leaves': 3}\n", - "---------- ----------\n", - "Grid search run 423/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 32, 'interactions': 5, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.25, 'min_samples_leaf': 10, 'max_leaves': 3}\n", - "---------- ----------\n", - "Grid search run 424/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.25, 'min_samples_leaf': 2, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 425/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.1, 'min_samples_leaf': 2, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 426/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 32, 'interactions': 10, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.25, 'min_samples_leaf': 2, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 427/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 1, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 428/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 32, 'interactions': 5, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.25, 'min_samples_leaf': 1, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 429/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 16, 'interactions': 15, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 1, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 430/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 16, 'interactions': 10, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.1, 'min_samples_leaf': 1, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 431/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.25, 'min_samples_leaf': 2, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 432/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 10, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.1, 'min_samples_leaf': 10, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 433/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.1, 'min_samples_leaf': 2, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 434/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 16, 'interactions': 10, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.5, 'min_samples_leaf': 1, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 435/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 16, 'interactions': 15, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 1, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 436/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.5, 'min_samples_leaf': 10, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 437/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 32, 'interactions': 15, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 10, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 438/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 32, 'interactions': 15, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.25, 'min_samples_leaf': 1, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 439/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 32, 'interactions': 5, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.1, 'min_samples_leaf': 2, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 440/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 32, 'interactions': 5, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.1, 'min_samples_leaf': 10, 'max_leaves': 5}\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "---------- ----------\n", - "Grid search run 441/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.25, 'min_samples_leaf': 10, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 442/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.25, 'min_samples_leaf': 2, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 443/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.25, 'min_samples_leaf': 1, 'max_leaves': 3}\n", - "---------- ----------\n", - "Grid search run 444/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 10, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.5, 'min_samples_leaf': 1, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 445/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 10, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.5, 'min_samples_leaf': 10, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 446/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 10, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.25, 'min_samples_leaf': 1, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 447/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.25, 'min_samples_leaf': 5, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 448/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 32, 'interactions': 5, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.1, 'min_samples_leaf': 2, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 449/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.5, 'min_samples_leaf': 1, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 450/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 32, 'interactions': 10, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.5, 'min_samples_leaf': 2, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 451/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.25, 'min_samples_leaf': 5, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 452/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 10, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.1, 'min_samples_leaf': 2, 'max_leaves': 3}\n", - "---------- ----------\n", - "Grid search run 453/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 32, 'interactions': 10, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.1, 'min_samples_leaf': 5, 'max_leaves': 3}\n", - "---------- ----------\n", - "Grid search run 454/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 32, 'interactions': 10, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.5, 'min_samples_leaf': 10, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 455/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 32, 'interactions': 10, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.5, 'min_samples_leaf': 1, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 456/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 10, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.1, 'min_samples_leaf': 10, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 457/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 32, 'interactions': 5, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.1, 'min_samples_leaf': 2, 'max_leaves': 3}\n", - "---------- ----------\n", - "Grid search run 458/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 32, 'interactions': 15, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.25, 'min_samples_leaf': 5, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 459/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.25, 'min_samples_leaf': 5, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 460/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.5, 'min_samples_leaf': 5, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 461/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 1, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 462/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 32, 'interactions': 15, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.1, 'min_samples_leaf': 1, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 463/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 32, 'interactions': 10, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.25, 'min_samples_leaf': 5, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 464/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.1, 'min_samples_leaf': 1, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 465/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 5, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 466/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 32, 'interactions': 15, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.25, 'min_samples_leaf': 2, 'max_leaves': 3}\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "---------- ----------\n", - "Grid search run 467/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.25, 'min_samples_leaf': 1, 'max_leaves': 3}\n", - "---------- ----------\n", - "Grid search run 468/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 32, 'interactions': 10, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.25, 'min_samples_leaf': 5, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 469/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.25, 'min_samples_leaf': 5, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 470/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.1, 'min_samples_leaf': 1, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 471/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 32, 'interactions': 15, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.1, 'min_samples_leaf': 5, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 472/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 32, 'interactions': 15, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.25, 'min_samples_leaf': 10, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 473/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 16, 'interactions': 10, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.25, 'min_samples_leaf': 10, 'max_leaves': 3}\n", - "---------- ----------\n", - "Grid search run 474/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.1, 'min_samples_leaf': 2, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 475/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.5, 'min_samples_leaf': 1, 'max_leaves': 3}\n", - "---------- ----------\n", - "Grid search run 476/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 2, 'max_leaves': 3}\n", - "---------- ----------\n", - "Grid search run 477/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.5, 'min_samples_leaf': 5, 'max_leaves': 3}\n", - "---------- ----------\n", - "Grid search run 478/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 16, 'interactions': 15, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.1, 'min_samples_leaf': 2, 'max_leaves': 3}\n", - "---------- ----------\n", - "Grid search run 479/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 32, 'interactions': 10, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.25, 'min_samples_leaf': 5, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 480/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.1, 'min_samples_leaf': 5, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 481/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 32, 'interactions': 15, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.25, 'min_samples_leaf': 1, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 482/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 32, 'interactions': 5, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.5, 'min_samples_leaf': 5, 'max_leaves': 3}\n", - "---------- ----------\n", - "Grid search run 483/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.5, 'min_samples_leaf': 5, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 484/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.25, 'min_samples_leaf': 5, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 485/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.1, 'min_samples_leaf': 2, 'max_leaves': 3}\n", - "---------- ----------\n", - "Grid search run 486/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.5, 'min_samples_leaf': 2, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 487/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.5, 'min_samples_leaf': 1, 'max_leaves': 3}\n", - "---------- ----------\n", - "Grid search run 488/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.1, 'min_samples_leaf': 1, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 489/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 32, 'interactions': 10, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.5, 'min_samples_leaf': 5, 'max_leaves': 3}\n", - "---------- ----------\n", - "Grid search run 490/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.1, 'min_samples_leaf': 5, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 491/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 32, 'interactions': 5, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.5, 'min_samples_leaf': 10, 'max_leaves': 3}\n", - "---------- ----------\n", - "Grid search run 492/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.25, 'min_samples_leaf': 1, 'max_leaves': 3}\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "---------- ----------\n", - "Grid search run 493/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.1, 'min_samples_leaf': 2, 'max_leaves': 3}\n", - "---------- ----------\n", - "Grid search run 494/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 32, 'interactions': 15, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.1, 'min_samples_leaf': 10, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 495/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 10, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.1, 'min_samples_leaf': 5, 'max_leaves': 5}\n", - "---------- ----------\n", - "Grid search run 496/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 32, 'interactions': 5, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 10, 'max_leaves': 1}\n", - "---------- ----------\n", - "Grid search run 497/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 32, 'interactions': 15, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.1, 'min_samples_leaf': 10, 'max_leaves': 3}\n", - "---------- ----------\n", - "Grid search run 498/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 16, 'interactions': 15, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.25, 'min_samples_leaf': 5, 'max_leaves': 3}\n", - "---------- ----------\n", - "Grid search run 499/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 64, 'interactions': 10, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.5, 'min_samples_leaf': 10, 'max_leaves': 3}\n", - "---------- ----------\n", - "Grid search run 500/500:\n", - "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 32, 'interactions': 5, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.1, 'min_samples_leaf': 5, 'max_leaves': 3}\n", - "---------- ----------\n", - "EBM training completed in 14575.71 s.\n" + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 16, 'interactions': 15, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.25, 'min_samples_leaf': 2, 'max_leaves': 1}\n" ] } ], @@ -2858,313 +2239,10 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": null, "id": "192a0792", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
max_binsmax_interaction_binsinteractionsouter_bagsinner_bagslearning_ratevalidation_sizemin_samples_leafmax_leavesfeaturesaucairearly_stopping_roundsn_jobsrandom_state
0512165400.0500.2513[loan_amount_std, no_intro_rate_period_std, lo...0.8216800.730429100.04.012345.0
1128325800.0010.2525[loan_amount_std, debt_to_income_ratio_std, pr...0.8020440.727615100.04.012345.0
2512165400.0010.5013[debt_to_income_ratio_std]0.6265020.897869100.04.012345.0
3128645440.0500.5015[income_std, property_value_std]0.7149500.926718100.04.012345.0
45126415400.0500.10103[loan_to_value_ratio_std]0.7571560.588048100.04.012345.0
................................................
495256325840.0100.50101[debt_to_income_ratio_std, property_value_std,...0.8164080.714912100.04.012345.0
4965123215840.0010.10103[income_std, loan_to_value_ratio_std, debt_to_...0.7801210.722661100.04.012345.0
49725616151200.0500.2553[debt_to_income_ratio_missing]0.5003911.000754100.04.012345.0
49812864101200.0010.50103[no_intro_rate_period_std, intro_rate_period_s...0.8206670.725268100.04.012345.0
4995123251240.0010.1053[intro_rate_period_std, term_360, debt_to_inco...0.6643580.902079100.04.012345.0
\n", - "

500 rows × 15 columns

\n", - "
" - ], - "text/plain": [ - " max_bins max_interaction_bins interactions outer_bags inner_bags \\\n", - "0 512 16 5 4 0 \n", - "1 128 32 5 8 0 \n", - "2 512 16 5 4 0 \n", - "3 128 64 5 4 4 \n", - "4 512 64 15 4 0 \n", - ".. ... ... ... ... ... \n", - "495 256 32 5 8 4 \n", - "496 512 32 15 8 4 \n", - "497 256 16 15 12 0 \n", - "498 128 64 10 12 0 \n", - "499 512 32 5 12 4 \n", - "\n", - " learning_rate validation_size min_samples_leaf max_leaves \\\n", - "0 0.050 0.25 1 3 \n", - "1 0.001 0.25 2 5 \n", - "2 0.001 0.50 1 3 \n", - "3 0.050 0.50 1 5 \n", - "4 0.050 0.10 10 3 \n", - ".. ... ... ... ... \n", - "495 0.010 0.50 10 1 \n", - "496 0.001 0.10 10 3 \n", - "497 0.050 0.25 5 3 \n", - "498 0.001 0.50 10 3 \n", - "499 0.001 0.10 5 3 \n", - "\n", - " features auc air \\\n", - "0 [loan_amount_std, no_intro_rate_period_std, lo... 0.821680 0.730429 \n", - "1 [loan_amount_std, debt_to_income_ratio_std, pr... 0.802044 0.727615 \n", - "2 [debt_to_income_ratio_std] 0.626502 0.897869 \n", - "3 [income_std, property_value_std] 0.714950 0.926718 \n", - "4 [loan_to_value_ratio_std] 0.757156 0.588048 \n", - ".. ... ... ... \n", - "495 [debt_to_income_ratio_std, property_value_std,... 0.816408 0.714912 \n", - "496 [income_std, loan_to_value_ratio_std, debt_to_... 0.780121 0.722661 \n", - "497 [debt_to_income_ratio_missing] 0.500391 1.000754 \n", - "498 [no_intro_rate_period_std, intro_rate_period_s... 0.820667 0.725268 \n", - "499 [intro_rate_period_std, term_360, debt_to_inco... 0.664358 0.902079 \n", - "\n", - " early_stopping_rounds n_jobs random_state \n", - "0 100.0 4.0 12345.0 \n", - "1 100.0 4.0 12345.0 \n", - "2 100.0 4.0 12345.0 \n", - "3 100.0 4.0 12345.0 \n", - "4 100.0 4.0 12345.0 \n", - ".. ... ... ... \n", - "495 100.0 4.0 12345.0 \n", - "496 100.0 4.0 12345.0 \n", - "497 100.0 4.0 12345.0 \n", - "498 100.0 4.0 12345.0 \n", - "499 100.0 4.0 12345.0 \n", - "\n", - "[500 rows x 15 columns]" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "ebm_grid_frame" ] @@ -3179,25 +2257,12 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, "id": "deca0f44", "metadata": { "scrolled": true }, - "outputs": [ - { - "data": { - "image/png": "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cATQ5e5PuXsvcAtwWoXnvg24292fDxOAu4FlEcUpIiI1YP7lP+L3L/cD8IcM/KCjm3d/91He9o/r4g0sAaJMBmYDWwued4f7ip1uZhvNbLWZzR3luSIi0gCOuPKusq89/tzL3LO59NBDqY645xm4A5jv7ocRfPv/99GcbGYXmVmHmXVs3749kgBFRCR6+RaBcv5r83MTFEkyRZkMbAPmFjyfE+4b4O497p6fWuoG4I2Vnhuev8rd2929fd99961a4A3tlFOCTUSkhrx66vAlbCct2m+CIkmmKJOBR4CFZrbAzCYBZwNrCw8ws9cUPF0O/G/4813ASWY208xmAieF+2S8Lr002EREash/X/G2sq8dvN9UFRFGLLLRBO7eb2YXE9zE08C33X2Tma0EOtx9LfBhM1sO9APPAxeG5z5vZlcSJBQAK939+ahiFRGR+P3fVX+h0QQxMXePO4aqaG9v946OjrjDqH3HHRc8rlsXZxQiIlIFZvaou7eP933iLiAUERGRmCkZEBERSTglAyIiIgmnZEBERCThtGph0px5ZtwRiIhIjVEykDQf+EDcEYiISI1RN0HS/PGPwSYiIhJSy0DSnHxy8Kh5BkREJKSWARERkYRTMiAiIpJwSgZEREQSTsmAiIhIwqmAMGkuvDDuCEREpMYoGUgaJQMiIlJE3QRJs2NHsImIiITUMpA0Z5wRPGqeARERCallQEREJOGUDIiIiCSckgEREZGEUzIgIiKScCogTJr3vz/uCEREpMYoGUias86KOwIREakx6iZImq1bg01ERCSkloGkeec7g0fNMyAiIiG1DIiIiCSckgEREZGEUzIgIiKScEoGREREEk4FhEnzsY/FHYGIiNQYJQNJc+qpcUcgIiI1Rt0ESfP448EmIiISUstA0rzvfcGj5hkQEZGQWgZEREQSTsmAiIhIwikZEBERSTglAyIiIgmnAsKk+fSn445ARERqjJKBpHnrW+OOQEREaoy6CZKmszPYREREQmoZSJpLLgkeNc+AiIiEIm0ZMLNlZva4mXWZ2eXDHHe6mbmZtYfP55vZbjPrDLd/iTJOERGRJIusZcDM0sD1wIlAN/CIma11981Fx00H/h5YX/QWv3H3JVHFJyIiIoEoWwaOALrc/Sl37wVuAU4rcdyVwNXAnghjERERkTKiTAZmA1sLnneH+waY2RuAue7+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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "fig, ax = plt.subplots(figsize=(8,8))\n", "_ = ebm_grid_frame.plot(kind='scatter', x='air', y='auc', title='AIR vs. AUC for EBMs', ax=ax)\n", @@ -3218,19 +2283,10 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": null, "id": "363c0f63", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Best AUC: 0.7852 above 0.8 AIR (0.8043).\n", - "Remediated EBM retrained with AUC: 0.7852.\n" - ] - } - ], + "outputs": [], "source": [ "# extract new params dict from ebm_grid_frame\n", "rem_params = ebm_grid_frame.loc[ebm_grid_frame['air'] > 0.8].sort_values(by='auc', ascending=False).iloc[0, :].to_dict()\n", @@ -3266,20 +2322,10 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": null, "id": "8abd6d5f", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Adverse impact ratio for Asian people vs. White people: 1.154\n", - "Adverse impact ratio for Black people vs. White people: 0.804\n", - "Adverse impact ratio for Females vs. Males: 0.963\n" - ] - } - ], + "outputs": [], "source": [ "# create a frame with remediated EBM predictions\n", "best_ebm_phat2 = pd.DataFrame(rem_ebm.predict_proba(valid[rem_x_names])[:, 1], columns=['phat']) \n", @@ -3314,32 +2360,10 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": null, "id": "972cef55", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'max_bins': 512,\n", - " 'max_interaction_bins': 16,\n", - " 'interactions': 10,\n", - " 'outer_bags': 8,\n", - " 'inner_bags': 4,\n", - " 'learning_rate': 0.001,\n", - " 'validation_size': 0.25,\n", - " 'min_samples_leaf': 5,\n", - " 'max_leaves': 3,\n", - " 'early_stopping_rounds': 100.0,\n", - " 'n_jobs': 4,\n", - " 'random_state': 12345}" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "rem_params" ] @@ -3354,29 +2378,10 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": null, "id": "f173ac4f", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['conforming',\n", - " 'income_std',\n", - " 'intro_rate_period_std',\n", - " 'no_intro_rate_period_std',\n", - " 'debt_to_income_ratio_missing',\n", - " 'loan_amount_std',\n", - " 'debt_to_income_ratio_std',\n", - " 'property_value_std',\n", - " 'term_360']" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "rem_x_names" ] @@ -3391,18 +2396,10 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": null, "id": "e978d190", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "All tasks completed in 15049.52 s.\n" - ] - } - ], + "outputs": [], "source": [ "toc = time.time() - tic\n", "print('All tasks completed in %.2f s.' % (toc))" @@ -3425,7 +2422,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.6" + "version": "3.7.16" } }, "nbformat": 4, diff --git a/assignments/data/scores/assignment_3.pdf b/assignments/data/scores/assignment_3.pdf deleted file mode 100644 index e6318c1..0000000 Binary files a/assignments/data/scores/assignment_3.pdf and /dev/null differ diff --git a/assignments/final150.ipynb b/assignments/final150.ipynb new file mode 100644 index 0000000..000a1aa --- /dev/null +++ b/assignments/final150.ipynb @@ -0,0 +1,5388 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "id": "37a0b94b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Collecting interpret\n", + " Downloading interpret-0.4.2-py3-none-any.whl (1.4 kB)\n", + "Collecting interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2\n", + " Downloading interpret_core-0.4.2-py3-none-any.whl (11.6 MB)\n", + "\u001b[K |████████████████████████████████| 11.6 MB 6.5 MB/s eta 0:00:01\n", + "\u001b[?25hCollecting SALib>=1.3.3\n", + " Downloading salib-1.4.7-py3-none-any.whl (757 kB)\n", + "\u001b[K |████████████████████████████████| 757 kB 110.0 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: joblib>=0.11 in ./opt/anaconda3/lib/python3.9/site-packages (from interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (1.1.0)\n", + "Requirement already satisfied: lime>=0.1.1.33 in ./opt/anaconda3/lib/python3.9/site-packages (from interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (0.2.0.1)\n", + "Collecting skope-rules>=1.0.1\n", + " Downloading skope_rules-1.0.1-py3-none-any.whl (14 kB)\n", + "Collecting treeinterpreter>=0.2.2\n", + " Downloading treeinterpreter-0.2.3-py2.py3-none-any.whl (6.0 kB)\n", + "Requirement already satisfied: shap>=0.28.5 in ./opt/anaconda3/lib/python3.9/site-packages (from interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (0.41.0)\n", + "Requirement already satisfied: dill>=0.2.5 in ./opt/anaconda3/lib/python3.9/site-packages (from interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (0.3.6)\n", + "Requirement already satisfied: psutil>=5.6.2 in ./opt/anaconda3/lib/python3.9/site-packages (from interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (5.9.5)\n", + "Requirement already satisfied: plotly>=3.8.1 in ./opt/anaconda3/lib/python3.9/site-packages (from interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (5.6.0)\n", + "Requirement already satisfied: scipy>=0.18.1 in ./opt/anaconda3/lib/python3.9/site-packages (from interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (1.7.3)\n", + "Requirement already satisfied: pandas>=0.19.2 in ./opt/anaconda3/lib/python3.9/site-packages (from interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (1.4.2)\n", + "Requirement already satisfied: numpy<1.24.0,>=1.11.1 in ./opt/anaconda3/lib/python3.9/site-packages (from interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (1.21.5)\n", + "Requirement already satisfied: scikit-learn>=0.18.1 in ./opt/anaconda3/lib/python3.9/site-packages (from interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (1.0.2)\n", + "Requirement already satisfied: ipykernel>=4.10.0 in ./opt/anaconda3/lib/python3.9/site-packages (from interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (6.9.1)\n", + "Requirement already satisfied: ipython>=5.5.0 in ./opt/anaconda3/lib/python3.9/site-packages (from interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (8.2.0)\n", + "Collecting dash-cytoscape>=0.1.1\n", + " Downloading dash_cytoscape-0.3.0-py3-none-any.whl (3.6 MB)\n", + "\u001b[K |████████████████████████████████| 3.6 MB 123.6 MB/s eta 0:00:01\n", + "\u001b[?25hCollecting dash-core-components>=1.0.0\n", + " Downloading dash_core_components-2.0.0-py3-none-any.whl (3.8 kB)\n", + "Requirement already satisfied: requests>=2.19.0 in ./opt/anaconda3/lib/python3.9/site-packages (from interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (2.27.1)\n", + "Collecting dash-table>=4.1.0\n", + " Downloading dash_table-5.0.0-py3-none-any.whl (3.9 kB)\n", + "Collecting dash>=1.0.0\n", + " Downloading dash-2.10.2-py3-none-any.whl (10.3 MB)\n", + "\u001b[K |████████████████████████████████| 10.3 MB 170.0 MB/s eta 0:00:01\n", + "\u001b[?25hCollecting dash-html-components>=1.0.0\n", + " Downloading dash_html_components-2.0.0-py3-none-any.whl (4.1 kB)\n", + "Collecting gevent>=1.3.6\n", + " Downloading gevent-22.10.2-cp39-cp39-macosx_10_9_x86_64.whl (1.9 MB)\n", + "\u001b[K |████████████████████████████████| 1.9 MB 149.8 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: Flask<2.3.0,>=1.0.4 in ./opt/anaconda3/lib/python3.9/site-packages (from dash>=1.0.0->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (1.1.2)\n", + "Requirement already satisfied: Werkzeug<2.3.0 in ./opt/anaconda3/lib/python3.9/site-packages (from dash>=1.0.0->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (2.0.3)\n", + "Requirement already satisfied: click>=5.1 in ./opt/anaconda3/lib/python3.9/site-packages (from Flask<2.3.0,>=1.0.4->dash>=1.0.0->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (8.0.4)\n", + "Requirement already satisfied: itsdangerous>=0.24 in ./opt/anaconda3/lib/python3.9/site-packages (from Flask<2.3.0,>=1.0.4->dash>=1.0.0->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (2.0.1)\n", + "Requirement already satisfied: Jinja2>=2.10.1 in ./opt/anaconda3/lib/python3.9/site-packages (from Flask<2.3.0,>=1.0.4->dash>=1.0.0->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (2.11.3)\n", + "Requirement already satisfied: zope.interface in ./opt/anaconda3/lib/python3.9/site-packages (from gevent>=1.3.6->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (5.4.0)\n", + "Requirement already satisfied: setuptools in ./opt/anaconda3/lib/python3.9/site-packages (from gevent>=1.3.6->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (67.8.0)\n", + "Collecting zope.event\n", + " Downloading zope.event-4.6-py2.py3-none-any.whl (6.8 kB)\n", + "Collecting greenlet>=2.0.0\n", + " Downloading greenlet-2.0.2.tar.gz (164 kB)\n", + "\u001b[K |████████████████████████████████| 164 kB 166.8 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: traitlets<6.0,>=5.1.0 in ./opt/anaconda3/lib/python3.9/site-packages (from ipykernel>=4.10.0->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (5.1.1)\n", + "Requirement already satisfied: appnope in ./opt/anaconda3/lib/python3.9/site-packages (from ipykernel>=4.10.0->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (0.1.2)\n", + "Requirement already satisfied: nest-asyncio in ./opt/anaconda3/lib/python3.9/site-packages (from ipykernel>=4.10.0->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (1.5.5)\n", + "Requirement already satisfied: tornado<7.0,>=4.2 in ./opt/anaconda3/lib/python3.9/site-packages (from ipykernel>=4.10.0->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (6.1)\n", + "Requirement already satisfied: debugpy<2.0,>=1.0.0 in ./opt/anaconda3/lib/python3.9/site-packages (from ipykernel>=4.10.0->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (1.5.1)\n", + "Requirement already satisfied: matplotlib-inline<0.2.0,>=0.1.0 in ./opt/anaconda3/lib/python3.9/site-packages (from ipykernel>=4.10.0->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (0.1.2)\n", + "Requirement already satisfied: jupyter-client<8.0 in ./opt/anaconda3/lib/python3.9/site-packages (from ipykernel>=4.10.0->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (6.1.12)\n", + "Requirement already satisfied: decorator in ./opt/anaconda3/lib/python3.9/site-packages (from ipython>=5.5.0->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (5.1.1)\n", + "Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in ./opt/anaconda3/lib/python3.9/site-packages (from ipython>=5.5.0->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (3.0.20)\n", + "Requirement already satisfied: jedi>=0.16 in ./opt/anaconda3/lib/python3.9/site-packages (from ipython>=5.5.0->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (0.18.1)\n", + "Requirement already satisfied: pygments>=2.4.0 in ./opt/anaconda3/lib/python3.9/site-packages (from ipython>=5.5.0->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (2.11.2)\n", + "Requirement already satisfied: stack-data in ./opt/anaconda3/lib/python3.9/site-packages (from ipython>=5.5.0->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (0.2.0)\n", + "Requirement already satisfied: backcall in ./opt/anaconda3/lib/python3.9/site-packages (from ipython>=5.5.0->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (0.2.0)\n", + "Requirement already satisfied: pexpect>4.3 in ./opt/anaconda3/lib/python3.9/site-packages (from ipython>=5.5.0->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (4.8.0)\n", + "Requirement already satisfied: pickleshare in ./opt/anaconda3/lib/python3.9/site-packages (from ipython>=5.5.0->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (0.7.5)\n", + "Requirement already satisfied: parso<0.9.0,>=0.8.0 in ./opt/anaconda3/lib/python3.9/site-packages (from jedi>=0.16->ipython>=5.5.0->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (0.8.3)\n", + "Requirement already satisfied: MarkupSafe>=0.23 in ./opt/anaconda3/lib/python3.9/site-packages (from Jinja2>=2.10.1->Flask<2.3.0,>=1.0.4->dash>=1.0.0->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (2.0.1)\n", + "Requirement already satisfied: jupyter-core>=4.6.0 in ./opt/anaconda3/lib/python3.9/site-packages (from jupyter-client<8.0->ipykernel>=4.10.0->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (4.9.2)\n", + "Requirement already satisfied: python-dateutil>=2.1 in ./opt/anaconda3/lib/python3.9/site-packages (from jupyter-client<8.0->ipykernel>=4.10.0->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (2.8.2)\n", + "Requirement already satisfied: pyzmq>=13 in ./opt/anaconda3/lib/python3.9/site-packages (from jupyter-client<8.0->ipykernel>=4.10.0->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (22.3.0)\n", + "Requirement already satisfied: scikit-image>=0.12 in ./opt/anaconda3/lib/python3.9/site-packages (from lime>=0.1.1.33->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (0.19.2)\n", + "Requirement already satisfied: matplotlib in ./opt/anaconda3/lib/python3.9/site-packages (from lime>=0.1.1.33->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (3.5.1)\n", + "Requirement already satisfied: tqdm in ./opt/anaconda3/lib/python3.9/site-packages (from lime>=0.1.1.33->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (4.64.0)\n", + "Requirement already satisfied: pytz>=2020.1 in ./opt/anaconda3/lib/python3.9/site-packages (from pandas>=0.19.2->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (2021.3)\n", + "Requirement already satisfied: ptyprocess>=0.5 in ./opt/anaconda3/lib/python3.9/site-packages (from pexpect>4.3->ipython>=5.5.0->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (0.7.0)\n", + "Requirement already satisfied: six in ./opt/anaconda3/lib/python3.9/site-packages (from plotly>=3.8.1->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (1.16.0)\n", + "Requirement already satisfied: tenacity>=6.2.0 in ./opt/anaconda3/lib/python3.9/site-packages (from plotly>=3.8.1->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (8.0.1)\n", + "Requirement already satisfied: wcwidth in ./opt/anaconda3/lib/python3.9/site-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython>=5.5.0->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (0.2.5)\n", + "Requirement already satisfied: charset-normalizer~=2.0.0 in ./opt/anaconda3/lib/python3.9/site-packages (from requests>=2.19.0->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (2.0.4)\n", + "Requirement already satisfied: urllib3<1.27,>=1.21.1 in ./opt/anaconda3/lib/python3.9/site-packages (from requests>=2.19.0->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (1.26.9)\n", + "Requirement already satisfied: certifi>=2017.4.17 in ./opt/anaconda3/lib/python3.9/site-packages (from requests>=2.19.0->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (2021.10.8)\n", + "Requirement already satisfied: idna<4,>=2.5 in ./opt/anaconda3/lib/python3.9/site-packages (from requests>=2.19.0->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (3.3)\n", + "Collecting multiprocess\n", + " Downloading multiprocess-0.70.14-py39-none-any.whl (132 kB)\n", + "\u001b[K |████████████████████████████████| 132 kB 45.9 MB/s eta 0:00:01\n", + "\u001b[?25hRequirement already satisfied: fonttools>=4.22.0 in ./opt/anaconda3/lib/python3.9/site-packages (from matplotlib->lime>=0.1.1.33->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (4.25.0)\n", + "Requirement already satisfied: packaging>=20.0 in ./opt/anaconda3/lib/python3.9/site-packages (from matplotlib->lime>=0.1.1.33->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (21.3)\n", + "Requirement already satisfied: kiwisolver>=1.0.1 in ./opt/anaconda3/lib/python3.9/site-packages (from matplotlib->lime>=0.1.1.33->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (1.3.2)\n", + "Requirement already satisfied: pyparsing>=2.2.1 in ./opt/anaconda3/lib/python3.9/site-packages (from matplotlib->lime>=0.1.1.33->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (3.0.4)\n", + "Requirement already satisfied: pillow>=6.2.0 in ./opt/anaconda3/lib/python3.9/site-packages (from matplotlib->lime>=0.1.1.33->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (9.0.1)\n", + "Requirement already satisfied: cycler>=0.10 in ./opt/anaconda3/lib/python3.9/site-packages (from matplotlib->lime>=0.1.1.33->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (0.11.0)\n", + "Requirement already satisfied: imageio>=2.4.1 in ./opt/anaconda3/lib/python3.9/site-packages (from scikit-image>=0.12->lime>=0.1.1.33->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (2.9.0)\n", + "Requirement already satisfied: networkx>=2.2 in ./opt/anaconda3/lib/python3.9/site-packages (from scikit-image>=0.12->lime>=0.1.1.33->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (2.7.1)\n", + "Requirement already satisfied: PyWavelets>=1.1.1 in ./opt/anaconda3/lib/python3.9/site-packages (from scikit-image>=0.12->lime>=0.1.1.33->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (1.3.0)\n", + "Requirement already satisfied: tifffile>=2019.7.26 in ./opt/anaconda3/lib/python3.9/site-packages (from scikit-image>=0.12->lime>=0.1.1.33->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (2021.7.2)\n", + "Requirement already satisfied: threadpoolctl>=2.0.0 in ./opt/anaconda3/lib/python3.9/site-packages (from scikit-learn>=0.18.1->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (2.2.0)\n", + "Requirement already satisfied: cloudpickle in ./opt/anaconda3/lib/python3.9/site-packages (from shap>=0.28.5->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (2.0.0)\n", + "Requirement already satisfied: slicer==0.0.7 in ./opt/anaconda3/lib/python3.9/site-packages (from shap>=0.28.5->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (0.0.7)\n", + "Requirement already satisfied: numba in ./opt/anaconda3/lib/python3.9/site-packages (from shap>=0.28.5->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (0.55.1)\n", + "Requirement already satisfied: llvmlite<0.39,>=0.38.0rc1 in ./opt/anaconda3/lib/python3.9/site-packages (from numba->shap>=0.28.5->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (0.38.0)\n", + "Requirement already satisfied: executing in ./opt/anaconda3/lib/python3.9/site-packages (from stack-data->ipython>=5.5.0->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (0.8.3)\n", + "Requirement already satisfied: pure-eval in ./opt/anaconda3/lib/python3.9/site-packages (from stack-data->ipython>=5.5.0->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (0.2.2)\n", + "Requirement already satisfied: asttokens in ./opt/anaconda3/lib/python3.9/site-packages (from stack-data->ipython>=5.5.0->interpret-core[dash,debug,decisiontree,ebm,lime,linear,notebook,plotly,required,sensitivity,shap,skoperules,treeinterpreter]==0.4.2->interpret) (2.0.5)\n", + "Building wheels for collected packages: greenlet\n", + " Building wheel for greenlet (setup.py) ... \u001b[?25ldone\n", + "\u001b[?25h Created wheel for greenlet: filename=greenlet-2.0.2-cp39-cp39-macosx_10_9_x86_64.whl size=190857 sha256=8d355fbc1017a6924888bb11356e46771dc1ddf43d70eb27a07da3a7d6b5b1b4\n", + " Stored in directory: /Users/mallikayadav/Library/Caches/pip/wheels/c4/e2/38/932349e5e893e6d464ea70f98f76a8d7b9ba73e62cc9db5579\n", + "Successfully built greenlet\n", + "Installing collected packages: dash-table, dash-html-components, dash-core-components, zope.event, multiprocess, greenlet, dash, treeinterpreter, skope-rules, SALib, interpret-core, gevent, dash-cytoscape, interpret\n", + " Attempting uninstall: greenlet\n", + " Found existing installation: greenlet 1.1.1\n", + " Uninstalling greenlet-1.1.1:\n", + " Successfully uninstalled greenlet-1.1.1\n", + "Successfully installed SALib-1.4.7 dash-2.10.2 dash-core-components-2.0.0 dash-cytoscape-0.3.0 dash-html-components-2.0.0 dash-table-5.0.0 gevent-22.10.2 greenlet-2.0.2 interpret-0.4.2 interpret-core-0.4.2 multiprocess-0.70.14 skope-rules-1.0.1 treeinterpreter-0.2.3 zope.event-4.6\n" + ] + } + ], + "source": [ + "!pip install interpret\n", + "from interpret.glassbox import ExplainableBoostingClassifier # interpret ebm class\n", + "from interpret.perf import ROC # ROC measure for ebm\n", + "import itertools # for cartesian product of parameters\n", + "import matplotlib.pyplot as plt # for plots\n", + "import numpy as np # for basic array manipulation \n", + "import pandas as pd # for dataframe manipulation\n", + "import random # to sample from lists\n", + "from sklearn.metrics import accuracy_score, f1_score # for selecting model cutoffs\n", + "import time # for timers\n", + "\n", + "# set numpy random seed for better reproducibility\n", + "SEED = 12345 \n", + "np.random.seed(SEED)\n", + "\n", + "# set number of threads\n", + "NTHREAD = 4" + ] + }, + { + "cell_type": "markdown", + "id": "f4c8e46e", + "metadata": {}, + "source": [ + "### Define utility functions" + ] + }, + { + "cell_type": "markdown", + "id": "9a1f486c", + "metadata": {}, + "source": [ + "#### Utility function to calculate confusion matrices by demographic group" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "4231a6a7", + "metadata": {}, + "outputs": [], + "source": [ + "def get_confusion_matrix(frame, y, yhat, by=None, level=None, cutoff=0.5, verbose=True):\n", + "\n", + " \"\"\" Creates confusion matrix from pandas dataframe of y and yhat values, can be sliced \n", + " by a variable and level.\n", + " \n", + " :param frame: Pandas dataframe of actual (y) and predicted (yhat) values.\n", + " :param y: Name of actual value column.\n", + " :param yhat: Name of predicted value column.\n", + " :param by: By variable to slice frame before creating confusion matrix, default None.\n", + " :param level: Value of by variable to slice frame before creating confusion matrix, default None.\n", + " :param cutoff: Cutoff threshold for confusion matrix, default 0.5. \n", + " :param verbose: Whether to print confusion matrix titles, default True. \n", + " :return: Confusion matrix as pandas dataframe. \n", + " \n", + " \"\"\"\n", + " \n", + " # determine levels of target (y) variable\n", + " # sort for consistency\n", + " level_list = list(frame[y].unique())\n", + " level_list.sort(reverse=True) \n", + "\n", + " # init confusion matrix\n", + " cm_frame = pd.DataFrame(columns=['actual: ' + str(i) for i in level_list], \n", + " index=['predicted: ' + str(i) for i in level_list])\n", + " \n", + " # don't destroy original data\n", + " frame_ = frame.copy(deep=True)\n", + " \n", + " # convert numeric predictions to binary decisions using cutoff\n", + " dname = 'd_' + str(y)\n", + " frame_[dname] = np.where(frame_[yhat] > cutoff , 1, 0)\n", + " \n", + " # slice frame\n", + " if (by is not None) & (level is not None):\n", + " frame_ = frame_[frame[by] == level]\n", + " \n", + " # calculate size of each confusion matrix value\n", + " for i, lev_i in enumerate(level_list):\n", + " for j, lev_j in enumerate(level_list):\n", + " cm_frame.iat[j, i] = frame_[(frame_[y] == lev_i) & (frame_[dname] == lev_j)].shape[0]\n", + " # i, j vs. j, i nasty little bug ... updated 8/30/19\n", + " \n", + " # output results\n", + " if verbose:\n", + " if by is None:\n", + " print('Confusion matrix:')\n", + " else:\n", + " print('Confusion matrix by ' + by + '=' + str(level))\n", + " \n", + " return cm_frame" + ] + }, + { + "cell_type": "markdown", + "id": "4ffdbdf9", + "metadata": {}, + "source": [ + "### Utility function to calculate AIR" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "1c84741a", + "metadata": {}, + "outputs": [], + "source": [ + "def air(cm_dict, reference_key, protected_key, verbose=True):\n", + "\n", + " \"\"\" Calculates the adverse impact ratio as a quotient between protected and \n", + " reference group acceptance rates: protected_prop/reference_prop. \n", + " Optionally prints intermediate values. ASSUMES 0 IS \"POSITIVE\" OUTCOME!\n", + "\n", + " :param cm_dict: Dictionary of demographic group confusion matrices. \n", + " :param reference_key: Name of reference group in cm_dict as a string.\n", + " :param protected_key: Name of protected group in cm_dict as a string.\n", + " :param verbose: Whether to print intermediate acceptance rates, default True. \n", + " :return: AIR.\n", + " \n", + " \"\"\"\n", + "\n", + " eps = 1e-20 # numeric stability and divide by 0 protection\n", + " \n", + " # reference group summary\n", + " reference_accepted = float(cm_dict[reference_key].iat[1,0] + cm_dict[reference_key].iat[1,1]) # predicted 0's\n", + " reference_total = float(cm_dict[reference_key].sum().sum())\n", + " reference_prop = reference_accepted/reference_total\n", + " if verbose:\n", + " print(reference_key.title() + ' proportion accepted: %.3f' % reference_prop)\n", + " \n", + " # protected group summary\n", + " protected_accepted = float(cm_dict[protected_key].iat[1,0] + cm_dict[protected_key].iat[1,1]) # predicted 0's\n", + " protected_total = float(cm_dict[protected_key].sum().sum())\n", + " protected_prop = protected_accepted/protected_total\n", + " if verbose:\n", + " print(protected_key.title() + ' proportion accepted: %.3f' % protected_prop)\n", + "\n", + " # return adverse impact ratio\n", + " if np.isclose(protected_accepted, 0.0):\n", + " return np.nan\n", + " else:\n", + " return ((protected_prop + eps)/(reference_prop + eps))" + ] + }, + { + "cell_type": "markdown", + "id": "1580f32b", + "metadata": {}, + "source": [ + "#### Utility function to select probability cutoff by F1" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "fd849162", + "metadata": {}, + "outputs": [], + "source": [ + "def get_max_f1_frame(frame, y, yhat, res=0.01, air_reference=None, air_protected=None, verbose=False): \n", + " \n", + " \"\"\" Utility function for finding max. F1. \n", + " Coupled to get_confusion_matrix() and air(). \n", + " Assumes 1 is the marker for class membership.\n", + " \n", + " :param frame: Pandas dataframe of actual (y) and predicted (yhat) values.\n", + " :param y: Known y values.\n", + " :param yhat: Model scores.\n", + " :param res: Resolution over which to search for max. F1, default 0.01.\n", + " :param air_reference: Reference group for AIR calculation, optional.\n", + " :param air_protected: Protected group for AIR calculation, optional.\n", + " :return: Pandas DataFrame of cutoffs to select from.\n", + " \n", + " \"\"\"\n", + " \n", + " do_air = all(v is not None for v in [air_reference, air_protected])\n", + " \n", + " # init frame to store f1 at different cutoffs\n", + " if do_air:\n", + " columns = ['cut', 'f1', 'acc', 'air']\n", + " else:\n", + " columns = ['cut', 'f1', 'acc']\n", + " f1_frame = pd.DataFrame(columns=['cut', 'f1', 'acc'])\n", + " \n", + " # copy known y and score values into a temporary frame\n", + " temp_df = frame[[y, yhat]].copy(deep=True)\n", + " \n", + " # find f1 at different cutoffs and store in acc_frame\n", + " for cut in np.arange(0, 1 + res, res):\n", + " temp_df['decision'] = np.where(temp_df.iloc[:, 1] > cut, 1, 0)\n", + " f1 = f1_score(temp_df.iloc[:, 0], temp_df['decision'])\n", + " acc = accuracy_score(temp_df.iloc[:, 0], temp_df['decision'])\n", + " row_dict = {'cut': cut, 'f1': f1, 'acc': acc}\n", + " if do_air:\n", + " # conditionally calculate AIR \n", + " cm_ref = get_confusion_matrix(frame, y, yhat, by=air_reference, level=1, cutoff=cut, verbose=verbose)\n", + " cm_pro = get_confusion_matrix(frame, y, yhat, by=air_protected, level=1, cutoff=cut, verbose=verbose)\n", + " air_ = air({air_reference: cm_ref, air_protected: cm_pro}, air_reference, air_protected, verbose=verbose)\n", + " row_dict['air'] = air_\n", + " \n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + " \n", + " del temp_df\n", + " \n", + " return f1_frame " + ] + }, + { + "cell_type": "markdown", + "id": "2c5a7c34", + "metadata": {}, + "source": [ + "#### Utility function for random grid search" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "fd9aa71d", + "metadata": {}, + "outputs": [], + "source": [ + "def ebm_grid(train, valid, x_names, y_name, gs_params=None, n_models=None, early_stopping_rounds=None, seed=None,\n", + " air_reference=None, air_protected=None, air_cut=None, verbose=False):\n", + " \n", + " \"\"\" Performs a random grid search over n_models and gs_params.\n", + " Optionally considers random feature sets and AIR.\n", + " Coupled to get_confusion_matrix() and air(). \n", + "\n", + " :param train: Training data as Pandas DataFrame.\n", + " :param valid: Validation data as Pandas DataFrame.\n", + " :param x_names: Names of input features.\n", + " :param y_name: Name of target feature.\n", + " :param gs_params: Dictionary of lists of potential EBM parameters over which to search. \n", + " :param n_models: Number of random models to evaluate.\n", + " :param early_stopping_rounds: EBM early stopping rounds.\n", + " :param seed: Random seed for better interpretability.\n", + " :param air_reference: Reference group for AIR calculation, optional.\n", + " :param air_protected: Protected group for AIR calculation, optional. \n", + " :param air_cut: Cutoff for AIR calculation, optional.\n", + " :param verbose: Whether to print intermediate acceptance rates, default False. \n", + " :return: Tuple: (Best EBM model, Pandas DataFrame of models to select from)\n", + "\n", + " \"\"\"\n", + " \n", + " # init returned frame\n", + " do_air = all(v is not None for v in [air_reference, air_protected])\n", + " if do_air: \n", + " columns = list(gs_params.keys()) + ['features', 'auc', 'air']\n", + " else:\n", + " columns = list(gs_params.keys()) + ['auc']\n", + " ebm_grid_frame = pd.DataFrame(columns=columns)\n", + " \n", + " # cartesian product of gs_params\n", + " keys, values = zip(*gs_params.items())\n", + " experiments = [dict(zip(keys, v)) for v in itertools.product(*values)]\n", + "\n", + " # preserve exact reproducibility for this function\n", + " np.random.seed(SEED) \n", + " \n", + " # select randomly from cartesian product space\n", + " selected_experiments = np.random.choice(len(experiments), n_models)\n", + "\n", + " # set global params for seed, etc.\n", + " params = {'n_jobs': NTHREAD,\n", + " 'early_stopping_rounds': early_stopping_rounds, \n", + " 'random_state': SEED}\n", + "\n", + " # init grid search loop\n", + " best_candidate = None\n", + " best_score = 0\n", + "\n", + " # grid search loop\n", + " for i, exp in enumerate(selected_experiments):\n", + "\n", + " params.update(experiments[exp]) # override global params with current grid run params\n", + "\n", + " print('Grid search run %d/%d:' % (int(i + 1), int(n_models)))\n", + " print('Training with parameters:', params)\n", + " \n", + " # train \n", + " ebm = ExplainableBoostingClassifier(**params)\n", + " \n", + " # conditionally select random features \n", + " features = x_names\n", + " if do_air:\n", + " n_features = random.randrange(len(x_names)) + 1\n", + " features = random.sample(x_names, n_features)\n", + " candidate = ebm.fit(train[features], train[y_name]) \n", + "\n", + " # calculate AUC\n", + " ebm_perf = ROC(ebm.predict_proba).explain_perf(valid[features], valid[y_name])\n", + " candidate_best_score = ebm_perf._internal_obj['overall']['auc']\n", + " \n", + " # compose values to add to ebm_grid_frame\n", + " row_dict = params.copy()\n", + " row_dict['auc'] = candidate_best_score\n", + " if do_air:\n", + " # collect random feature set\n", + " row_dict['features'] = features\n", + " # conditionally calculate AIR \n", + " valid_phat = valid.copy(deep=True)\n", + " valid_phat['phat'] = candidate.predict_proba(valid[features])[:, 1]\n", + " cm_ref = get_confusion_matrix(valid_phat, y_name, 'phat', by=air_reference, level=1, cutoff=air_cut, verbose=verbose)\n", + " cm_pro = get_confusion_matrix(valid_phat, y_name, 'phat', by=air_protected, level=1, cutoff=air_cut, verbose=verbose)\n", + " air_ = air({air_reference: cm_ref, air_protected: cm_pro}, air_reference, air_protected, verbose=verbose)\n", + " row_dict['air'] = air_\n", + " del valid_phat\n", + "\n", + " # append run to ebm_grid_frame\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n", + " \n", + " # determine if current model is better than previous best\n", + " if candidate_best_score > best_score:\n", + " best_score = candidate_best_score\n", + " best_ebm = candidate\n", + " print('Grid search new best score discovered at iteration %d/%d: %.4f.' %\n", + " (int(i + 1), int(n_models), candidate_best_score))\n", + "\n", + " print('---------- ----------')\n", + " \n", + " del row_dict\n", + " del ebm\n", + " \n", + " return best_ebm, ebm_grid_frame\n" + ] + }, + { + "cell_type": "markdown", + "id": "ff95a6c3", + "metadata": {}, + "source": [ + "#### Start global timer" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "b3cfd7d5", + "metadata": {}, + "outputs": [], + "source": [ + "tic = time.time()" + ] + }, + { + "cell_type": "markdown", + "id": "a49fa751", + "metadata": {}, + "source": [ + "#### Import data" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "01b16c35", + "metadata": {}, + "outputs": [], + "source": [ + "data = pd.read_csv('hmda_train_preprocessed.csv')\n", + "test = pd.read_csv('hmda_test_preprocessed.csv')" + ] + }, + { + "cell_type": "markdown", + "id": "7d62a054", + "metadata": {}, + "source": [ + "### Assign basic modeling roles" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "8fcd471b", + "metadata": {}, + "outputs": [], + "source": [ + "y_name = 'high_priced'\n", + "x_names = ['term_360', 'conforming', 'debt_to_income_ratio_missing', 'loan_amount_std', 'loan_to_value_ratio_std', 'no_intro_rate_period_std',\n", + " 'intro_rate_period_std', 'property_value_std', 'income_std', 'debt_to_income_ratio_std']" + ] + }, + { + "cell_type": "markdown", + "id": "f2341f44", + "metadata": {}, + "source": [ + "### Fit interpretable model" + ] + }, + { + "cell_type": "markdown", + "id": "c6a887e0", + "metadata": {}, + "source": [ + "### Split data into train and validation partitions" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "502c8f69", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train data rows = 112253, columns = 23\n", + "Validation data rows = 48085, columns = 23\n" + ] + } + ], + "source": [ + "np.random.seed(SEED) # preserve exact reproducibility for this cell\n", + "\n", + "split_ratio = 0.7 # 70%/30% train/test split\n", + "\n", + "# execute split\n", + "split = np.random.rand(len(data)) < split_ratio\n", + "train = data[split]\n", + "valid = data[~split]\n", + "\n", + "# summarize split\n", + "print('Train data rows = %d, columns = %d' % (train.shape[0], train.shape[1]))\n", + "print('Validation data rows = %d, columns = %d' % (valid.shape[0], valid.shape[1]))\n", + "\n", + "# benchmark - Train data rows = 112253, columns = 23\n", + "# benchmark - Validation data rows = 48085, columns = 23" + ] + }, + { + "cell_type": "markdown", + "id": "5cf1e85c", + "metadata": {}, + "source": [ + "### Explainable Boosting Machine" + ] + }, + { + "cell_type": "markdown", + "id": "d730305c", + "metadata": {}, + "source": [ + "#### Fit EBM with random grid search" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "0beac2a1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Grid search run 1/10:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.25, 'min_samples_leaf': 1, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Grid search new best score discovered at iteration 1/10: 0.8218.\n", + "---------- ----------\n", + "Grid search run 2/10:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 32, 'interactions': 5, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.25, 'min_samples_leaf': 2, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 3/10:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.5, 'min_samples_leaf': 1, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 4/10:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.5, 'min_samples_leaf': 1, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 5/10:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.1, 'min_samples_leaf': 10, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Grid search new best score discovered at iteration 5/10: 0.8253.\n", + "---------- ----------\n", + "Grid search run 6/10:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 16, 'interactions': 15, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.1, 'min_samples_leaf': 2, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 7/10:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 32, 'interactions': 15, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.25, 'min_samples_leaf': 10, 'max_leaves': 1}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 8/10:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 16, 'interactions': 15, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.5, 'min_samples_leaf': 5, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 9/10:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 16, 'interactions': 10, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.5, 'min_samples_leaf': 5, 'max_leaves': 1}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 10/10:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.25, 'min_samples_leaf': 2, 'max_leaves': 3}\n", + "---------- ----------\n", + "EBM training completed in 346.40 s.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + } + ], + "source": [ + "# dictionary of hyperparameter value lists for grid search\n", + "gs_params = {'max_bins': [128, 256, 512],\n", + " 'max_interaction_bins': [16, 32, 64],\n", + " 'interactions': [5, 10, 15],\n", + " 'outer_bags': [4, 8, 12], \n", + " 'inner_bags': [0, 4],\n", + " 'learning_rate': [0.001, 0.01, 0.05],\n", + " 'validation_size': [0.1, 0.25, 0.5],\n", + " 'min_samples_leaf': [1, 2, 5, 10],\n", + " 'max_leaves': [1, 3, 5]}\n", + "\n", + "# start local timer\n", + "ebm_tic = time.time()\n", + "\n", + "# EBM grid search\n", + "best_ebm, ebm_grid_frame = ebm_grid(train, valid, x_names, y_name, gs_params=gs_params, n_models=10, \n", + " early_stopping_rounds=100, seed=SEED)\n", + "\n", + "# end local timer\n", + "ebm_toc = time.time() - ebm_tic\n", + "print('EBM training completed in %.2f s.' % (ebm_toc))" + ] + }, + { + "cell_type": "markdown", + "id": "b80e0a69", + "metadata": {}, + "source": [ + "#### Basic AUC assessment" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "8ee8801f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Validation AUC: 0.8253.\n" + ] + } + ], + "source": [ + "best_ebm_perf = ROC(best_ebm.predict_proba).explain_perf(valid[x_names], valid[y_name])\n", + "print('Validation AUC: %.4f.' % best_ebm_perf._internal_obj['overall']['auc'])" + ] + }, + { + "cell_type": "markdown", + "id": "acb42bb6", + "metadata": {}, + "source": [ + "#### Score validation data with model" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "0a8fbbc6", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
row_idblackasianwhiteamindhipachispanicnon_hispanicmalefemale...debt_to_income_ratio_missingloan_amount_stdloan_to_value_ratio_stdno_intro_rate_period_stdintro_rate_period_stdproperty_value_stdincome_stddebt_to_income_ratio_stdhigh_pricedphat
00NaNNaNNaNNaNNaNNaNNaN1.00.0...0-0.5143930.3339220.244394-0.215304-0.535932-0.0403070.85460100.165646
160.00.01.00.00.00.01.00.01.0...0-0.4264480.3552490.244394-0.215304-0.474263-0.0209041.03741900.314594
280.00.01.00.00.00.01.0NaNNaN...00.2771090.1429950.244394-0.2153040.111598-0.0198650.03191600.022284
3100.00.01.00.00.00.01.0NaNNaN...0-0.382476-0.2404320.244394-0.215304-0.320089-0.0281810.94601000.015600
4110.00.01.00.00.01.00.0NaNNaN...00.101220-0.2665290.244394-0.2153040.1115980.016515-1.15640600.004888
\n", + "

5 rows × 24 columns

\n", + "
" + ], + "text/plain": [ + " row_id black asian white amind hipac hispanic non_hispanic male \\\n", + "0 0 NaN NaN NaN NaN NaN NaN NaN 1.0 \n", + "1 6 0.0 0.0 1.0 0.0 0.0 0.0 1.0 0.0 \n", + "2 8 0.0 0.0 1.0 0.0 0.0 0.0 1.0 NaN \n", + "3 10 0.0 0.0 1.0 0.0 0.0 0.0 1.0 NaN \n", + "4 11 0.0 0.0 1.0 0.0 0.0 1.0 0.0 NaN \n", + "\n", + " female ... debt_to_income_ratio_missing loan_amount_std \\\n", + "0 0.0 ... 0 -0.514393 \n", + "1 1.0 ... 0 -0.426448 \n", + "2 NaN ... 0 0.277109 \n", + "3 NaN ... 0 -0.382476 \n", + "4 NaN ... 0 0.101220 \n", + "\n", + " loan_to_value_ratio_std no_intro_rate_period_std intro_rate_period_std \\\n", + "0 0.333922 0.244394 -0.215304 \n", + "1 0.355249 0.244394 -0.215304 \n", + "2 0.142995 0.244394 -0.215304 \n", + "3 -0.240432 0.244394 -0.215304 \n", + "4 -0.266529 0.244394 -0.215304 \n", + "\n", + " property_value_std income_std debt_to_income_ratio_std high_priced \\\n", + "0 -0.535932 -0.040307 0.854601 0 \n", + "1 -0.474263 -0.020904 1.037419 0 \n", + "2 0.111598 -0.019865 0.031916 0 \n", + "3 -0.320089 -0.028181 0.946010 0 \n", + "4 0.111598 0.016515 -1.156406 0 \n", + "\n", + " phat \n", + "0 0.165646 \n", + "1 0.314594 \n", + "2 0.022284 \n", + "3 0.015600 \n", + "4 0.004888 \n", + "\n", + "[5 rows x 24 columns]" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "best_ebm_phat = pd.DataFrame(best_ebm.predict_proba(valid[x_names])[:, 1], columns=['phat']) \n", + "best_ebm_phat = pd.concat([valid.reset_index(drop=True), best_ebm_phat], axis=1)\n", + "best_ebm_phat.head()" + ] + }, + { + "cell_type": "markdown", + "id": "4661fcf7", + "metadata": {}, + "source": [ + "#### Investigate Best Model (EBM) for Discrimination" + ] + }, + { + "cell_type": "markdown", + "id": "8d325dda", + "metadata": {}, + "source": [ + "#### Find optimal cutoff based on F1" + ] + }, + { + "cell_type": "markdown", + "id": "3394273e", + "metadata": {}, + "source": [ + "#### Cutoffs are normally selected by maximizing a quality statistic or a business metric, and not by considering bias and discrimination." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "a4ebe98b", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " cut f1 acc\n", + "0 0.0 0.17386 0.095206\n", + "1 0.01 0.233938 0.384777\n", + "2 0.02 0.262541 0.479048\n", + "3 0.03 0.280733 0.530685\n", + "4 0.04 0.295953 0.569783\n", + ".. ... ... ...\n", + "96 0.96 0.0 0.904794\n", + "97 0.97 0.0 0.904794\n", + "98 0.98 0.0 0.904794\n", + "99 0.99 0.0 0.904794\n", + "100 1.0 0.0 0.904794\n", + "\n", + "[101 rows x 3 columns]\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "ename": "TypeError", + "evalue": "reduction operation 'argmax' not allowed for this dtype", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "Input \u001b[0;32mIn [19]\u001b[0m, in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[38;5;28mprint\u001b[39m()\n\u001b[1;32m 6\u001b[0m max_f1 \u001b[38;5;241m=\u001b[39m f1_frame[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mf1\u001b[39m\u001b[38;5;124m'\u001b[39m]\u001b[38;5;241m.\u001b[39mmax()\n\u001b[0;32m----> 7\u001b[0m best_cut \u001b[38;5;241m=\u001b[39m f1_frame\u001b[38;5;241m.\u001b[39mloc[\u001b[38;5;28mint\u001b[39m(\u001b[43mf1_frame\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mf1\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43midxmax\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m), \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcut\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;66;03m#idxmax() returns the index of the maximum value\u001b[39;00m\n\u001b[1;32m 8\u001b[0m acc \u001b[38;5;241m=\u001b[39m f1_frame\u001b[38;5;241m.\u001b[39mloc[\u001b[38;5;28mint\u001b[39m(f1_frame[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mf1\u001b[39m\u001b[38;5;124m'\u001b[39m]\u001b[38;5;241m.\u001b[39midxmax()), \u001b[38;5;124m'\u001b[39m\u001b[38;5;124macc\u001b[39m\u001b[38;5;124m'\u001b[39m]\n\u001b[1;32m 10\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mBest EBM F1: \u001b[39m\u001b[38;5;132;01m%.4f\u001b[39;00m\u001b[38;5;124m achieved at cutoff: \u001b[39m\u001b[38;5;132;01m%.2f\u001b[39;00m\u001b[38;5;124m with accuracy: \u001b[39m\u001b[38;5;132;01m%.4f\u001b[39;00m\u001b[38;5;124m.\u001b[39m\u001b[38;5;124m'\u001b[39m \u001b[38;5;241m%\u001b[39m (max_f1, best_cut, acc))\n", + "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/pandas/core/series.py:2404\u001b[0m, in \u001b[0;36mSeries.idxmax\u001b[0;34m(self, axis, skipna, *args, **kwargs)\u001b[0m\n\u001b[1;32m 2339\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21midxmax\u001b[39m(\u001b[38;5;28mself\u001b[39m, axis\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m0\u001b[39m, skipna\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m, \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 2340\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 2341\u001b[0m \u001b[38;5;124;03m Return the row label of the maximum value.\u001b[39;00m\n\u001b[1;32m 2342\u001b[0m \n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 2402\u001b[0m \u001b[38;5;124;03m nan\u001b[39;00m\n\u001b[1;32m 2403\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m-> 2404\u001b[0m i \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43margmax\u001b[49m\u001b[43m(\u001b[49m\u001b[43maxis\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mskipna\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 2405\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m i \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1\u001b[39m:\n\u001b[1;32m 2406\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m np\u001b[38;5;241m.\u001b[39mnan\n", + "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/pandas/core/base.py:657\u001b[0m, in \u001b[0;36mIndexOpsMixin.argmax\u001b[0;34m(self, axis, skipna, *args, **kwargs)\u001b[0m\n\u001b[1;32m 653\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m delegate\u001b[38;5;241m.\u001b[39margmax()\n\u001b[1;32m 654\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 655\u001b[0m \u001b[38;5;66;03m# error: Incompatible return value type (got \"Union[int, ndarray]\", expected\u001b[39;00m\n\u001b[1;32m 656\u001b[0m \u001b[38;5;66;03m# \"int\")\u001b[39;00m\n\u001b[0;32m--> 657\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mnanops\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mnanargmax\u001b[49m\u001b[43m(\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# type: ignore[return-value]\u001b[39;49;00m\n\u001b[1;32m 658\u001b[0m \u001b[43m \u001b[49m\u001b[43mdelegate\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mskipna\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mskipna\u001b[49m\n\u001b[1;32m 659\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/pandas/core/nanops.py:88\u001b[0m, in \u001b[0;36mdisallow.__call__.._f\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 86\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28many\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcheck(obj) \u001b[38;5;28;01mfor\u001b[39;00m obj \u001b[38;5;129;01min\u001b[39;00m obj_iter):\n\u001b[1;32m 87\u001b[0m f_name \u001b[38;5;241m=\u001b[39m f\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__name__\u001b[39m\u001b[38;5;241m.\u001b[39mreplace(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnan\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m---> 88\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m(\n\u001b[1;32m 89\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mreduction operation \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mf_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m not allowed for this dtype\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 90\u001b[0m )\n\u001b[1;32m 91\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 92\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m np\u001b[38;5;241m.\u001b[39merrstate(invalid\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mignore\u001b[39m\u001b[38;5;124m\"\u001b[39m):\n", + "\u001b[0;31mTypeError\u001b[0m: reduction operation 'argmax' not allowed for this dtype" + ] + } + ], + "source": [ + "f1_frame = get_max_f1_frame(best_ebm_phat, y_name, 'phat')\n", + "\n", + "print(f1_frame)\n", + "print()\n", + "\n", + "max_f1 = f1_frame['f1'].max()\n", + "best_cut = f1_frame.loc[int(f1_frame['f1'].idxmax()), 'cut'] #idxmax() returns the index of the maximum value\n", + "acc = f1_frame.loc[int(f1_frame['f1'].idxmax()), 'acc']\n", + "\n", + "print('Best EBM F1: %.4f achieved at cutoff: %.2f with accuracy: %.4f.' % (max_f1, best_cut, acc))" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "e8568c18", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " cut f1 acc\n", + "0 0.0 0.17386 0.095206\n", + "1 0.01 0.233938 0.384777\n", + "2 0.02 0.262541 0.479048\n", + "3 0.03 0.280733 0.530685\n", + "4 0.04 0.295953 0.569783\n", + ".. ... ... ...\n", + "96 0.96 0.0 0.904794\n", + "97 0.97 0.0 0.904794\n", + "98 0.98 0.0 0.904794\n", + "99 0.99 0.0 0.904794\n", + "100 1.0 0.0 0.904794\n", + "\n", + "[101 rows x 3 columns]\n", + "\n", + "Best EBM F1: 0.3666 achieved at cutoff: 0.18 with accuracy: 0.7927.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n" + ] + } + ], + "source": [ + "f1_frame = get_max_f1_frame(best_ebm_phat, y_name, 'phat')\n", + "\n", + "print(f1_frame)\n", + "print()\n", + "\n", + "f1_frame['f1'] = f1_frame['f1'].astype(float) # Convert 'f1' column to a numeric type\n", + "\n", + "max_f1 = f1_frame['f1'].max()\n", + "best_cut = f1_frame.loc[int(f1_frame['f1'].idxmax()), 'cut']\n", + "acc = f1_frame.loc[int(f1_frame['f1'].idxmax()), 'acc']\n", + "\n", + "print('Best EBM F1: %.4f achieved at cutoff: %.2f with accuracy: %.4f.' % (max_f1, best_cut, acc))\n" + ] + }, + { + "cell_type": "markdown", + "id": "0192c6c8", + "metadata": {}, + "source": [ + "#### Find confusion matrices for demographic groups" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "6904004b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Confusion matrix by black=1\n", + " actual: 1 actual: 0\n", + "predicted: 1 470 911\n", + "predicted: 0 194 1617\n", + "\n", + "Confusion matrix by asian=1\n", + " actual: 1 actual: 0\n", + "predicted: 1 95 176\n", + "predicted: 0 53 2926\n", + "\n", + "Confusion matrix by white=1\n", + " actual: 1 actual: 0\n", + "predicted: 1 1965 6117\n", + "predicted: 0 1200 25243\n", + "\n", + "Confusion matrix by male=1\n", + " actual: 1 actual: 0\n", + "predicted: 1 1036 3122\n", + "predicted: 0 628 11046\n", + "\n", + "Confusion matrix by female=1\n", + " actual: 1 actual: 0\n", + "predicted: 1 847 2175\n", + "predicted: 0 393 6617\n", + "\n" + ] + } + ], + "source": [ + "demographic_group_names = ['black', 'asian', 'white', 'male', 'female']\n", + "cm_dict = {}\n", + "\n", + "for name in demographic_group_names:\n", + " cm_dict[name] = get_confusion_matrix(best_ebm_phat, y_name, 'phat', by=name, level=1, cutoff=best_cut)\n", + " print(cm_dict[name])\n", + " print()" + ] + }, + { + "cell_type": "markdown", + "id": "3f91812b", + "metadata": {}, + "source": [ + "#### Find AIR for Asian people" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "e7819e3e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "White proportion accepted: 0.766\n", + "Asian proportion accepted: 0.917\n", + "Adverse impact ratio for Asian people vs. White people: 1.197\n" + ] + } + ], + "source": [ + "print('Adverse impact ratio for Asian people vs. White people: %.3f' % air(cm_dict, 'white', 'asian'))" + ] + }, + { + "cell_type": "markdown", + "id": "d487eeed", + "metadata": {}, + "source": [ + "#### Find AIR for Black people" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "fdf9add7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "White proportion accepted: 0.766\n", + "Black proportion accepted: 0.567\n", + "Adverse impact ratio for Black people vs. White people: 0.741\n" + ] + } + ], + "source": [ + "print('Adverse impact ratio for Black people vs. White people: %.3f' % air(cm_dict, 'white', 'black'))" + ] + }, + { + "cell_type": "markdown", + "id": "bdf97b07", + "metadata": {}, + "source": [ + "#### Find AIR for Females" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "1b282195", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Male proportion accepted: 0.737\n", + "Female proportion accepted: 0.699\n", + "Adverse impact ratio for Females vs. Males: 0.948\n" + ] + } + ], + "source": [ + "print('Adverse impact ratio for Females vs. Males: %.3f' % air(cm_dict, 'male', 'female'))" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "560661f6", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "# Adverse impact ratios\n", + "ratios = [1.197, 0.741, 0.948]\n", + "groups = ['Asian vs. White', 'Black vs. White', 'Females vs. Males']\n", + "\n", + "# Define light colors\n", + "colors = ['blue', 'orange', 'green']\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "# Plot bar chart\n", + "plt.figure(figsize=(10, 6))\n", + "plt.bar(groups, ratios, color=colors)\n", + "plt.xlabel('Demographic Groups')\n", + "plt.ylabel('Adverse Impact Ratio')\n", + "plt.title('Adverse Impact Ratios for Different Groups')\n", + "\n", + "# Display the values on top of each bar\n", + "for i, ratio in enumerate(ratios):\n", + " plt.text(i, ratio, f'{ratio:.3f}', ha='center', va='bottom')\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "52545aa7", + "metadata": {}, + "source": [ + "#### Attempt remediation of discovered discrimination" + ] + }, + { + "cell_type": "markdown", + "id": "624c187d", + "metadata": {}, + "source": [ + "#### Simplest remediation: Find cutoff with better Black vs. White AIR" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "63b58472", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n", + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/1002360894.py:42: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " f1_frame = f1_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cutf1accair
220.220.3567940.8329420.816260
230.230.3501790.8411560.843019
240.240.3417090.8501610.864101
250.250.3301540.8583130.878680
260.260.3164660.8651550.887407
\n", + "
" + ], + "text/plain": [ + " cut f1 acc air\n", + "22 0.22 0.356794 0.832942 0.816260\n", + "23 0.23 0.350179 0.841156 0.843019\n", + "24 0.24 0.341709 0.850161 0.864101\n", + "25 0.25 0.330154 0.858313 0.878680\n", + "26 0.26 0.316466 0.865155 0.887407" + ] + }, + "execution_count": 49, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f1_frame = get_max_f1_frame(best_ebm_phat, y_name, 'phat', air_reference='white', air_protected='black')\n", + "# print highest quality cutoffs above four fifths rule cutoff\n", + "f1_frame[f1_frame['air'] > 0.8].sort_values(by='f1', ascending=False).head()" + ] + }, + { + "cell_type": "markdown", + "id": "5d123efe", + "metadata": {}, + "source": [ + "# Cutoffs in the 0.21-0.25range provide increased accuracy and less bias towards Black people." + ] + }, + { + "cell_type": "markdown", + "id": "ffc3fab6", + "metadata": {}, + "source": [ + "#### Check that other groups are not adversely impacted by change" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "63ee4016", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Adverse impact ratio for Asian people vs. White people: 1.128\n", + "Adverse impact ratio for Black people vs. White people: 0.816\n", + "Adverse impact ratio for Females vs. Males: 0.965\n" + ] + } + ], + "source": [ + "# calculate new confusion matrics for each group\n", + "rem_cm_dict = {}\n", + "for name in demographic_group_names:\n", + " rem_cm_dict[name] = get_confusion_matrix(best_ebm_phat, y_name, 'phat', by=name, level=1, cutoff=0.22, verbose=False)\n", + "\n", + "# calculate AIR for each group\n", + "print('Adverse impact ratio for Asian people vs. White people: %.3f' % air(rem_cm_dict, 'white', 'asian', verbose=False))\n", + "print('Adverse impact ratio for Black people vs. White people: %.3f' % air(rem_cm_dict, 'white', 'black', verbose=False))\n", + "print('Adverse impact ratio for Females vs. Males: %.3f' % air(rem_cm_dict, 'male', 'female', verbose=False))" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "35642808", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAmEAAAGDCAYAAABjkcdfAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAA0CElEQVR4nO3dd9gkZZnv8e+PGZJIWBAQmEFAkAwjDsmjqAcXjGBABVEXQVlcUNeVw+pxza5hMYAE0RVBXQVcFVEXQQ+CrASJAxKFBXSGJDmqI8N9/qh6h56XN/QAPfXOO9/PdfXVFZ56+q7q6u67n3qqKlWFJEmSFq2lug5AkiRpSWQSJkmS1AGTMEmSpA6YhEmSJHXAJEySJKkDJmGSJEkdMAmTnoAkxyf5VNdxaGxJ9k7y86e4ziQ5Lsk9SS54Kuse53WvTPLi0WJI8q4ktyd5MMlqiyouSU+cSZjUI8lZ7Q/bsl3H8mQkWS9JJZnadSxDkrw4yZxxyhyfZG6bSNyd5BdJNumz/setc1V9p6p2ebKxD/MC4G+BaVW13ZOtrCfuB9vH7Ul+muRve8tV1eZVddZIMSRZGvgisEtVPb2q7nqycS3kOtyU5KXjlFkxyRfbsg8l+UOS7yd50ttQWlyZhEmtJOsBLwQK2K2D108SP5Pwb1X1dGAd4Gbg2I7jGe5ZwE1V9dDCLjhOUrxKu95bA78ATk6yT58xrAksB1y5sDG1cU15IsstRP3LAr8EtgReBawEbAqcCLxilGUmzB8IaVD8wpce8zbgfOB44O96ZyR5bpJLkjyQ5CSaH7yheVcneVXP+NQkdybZph3fIcm5Se5NctnQIaV23llJ/jXJOcDDwAZJ9klyQ/taNybZu6f8vu3r3ZPk9CTP6mfF2hamo5P8rG1tOSfJM5Mc1tZ1TZLn9pS/KckHk1zVzj8uyXLtvL9pW2ruaOf9NMm0nmVXbcvf0s7/UZIVgJ8Ba/e0+Kw9VsxV9Sfge8CMnrpfmeTSJPcnmZ3kYz2LnN0+39vWv2O7LX/ds/zzk1yY5L72+fk980bd7j1l9gO+DuzYvsbH2+nvTHJ923r34951a1u5DkxyHXDdWOvcrvdtVXU48DHgc0OJ+VBr0wgxnABc27Puv2zLb5KmJfHuJNcmeWNPTMcn+UqSU5M8BLwkydpJftC+rzcmeU9P+Y8l+V6Sb7Xb58okM9t53wbWBX7SxnPICKv1VmAa8JqquqKq5lXVQ1X1/ar62FjbarRtmxFaPtvP0zt63s9zkhzRvt/XJNm5p+y477c0cFXlw4ePKoDrgX8Angf8FViznb4M8HvgfcDSwB7t/E+18z8CfKennlcC17TD6wB30fzbX4rmENJdwOrt/LOAPwCbA1OBlYH7gY3b+WsBm7fDr2lj3LQt+y/AuaOsy3o0LXpT2/HjgTvbdVuOplXiRprEcwrwKeDMnuVvAq4ApgOrAuf0rO9qwOuBpwErAv8J/Khn2f8CTgL+pt1eL2qnvxiYM857cHzP66wAfBu4rGf+i2laU5YCtgJup/lhf9w6t9P2AX7dDq8K3EOTEEwF9mrHV2tfa8TtPkKM8+tsx/93u223AZYFjgDO7plfNC1bqwLLj/de9UzfoJ2+ac978tJRYhj+fq8AzAbe3q7rNm2Mm/ds5/uA/9Vuy6cBF9Psy8u0r30DsGtb/mPAn2n24ynAZ4Dzh+0vLx3jfT0ROL6Pz+AC22qsbTvK+30W8I6ebfQIj31u39Su86oL83778DHIhy1hEpDkBTSHeL5XVRcD/wO8uZ29A82X+GFV9deq+j5wYc/i3wV2S/K0dvzN7TSAtwCnVtWpVfVoVf0CuIgFD8EcX1VXVtUjND8ajwJbJFm+qm6tqqFDTH8PfKaqrm7LfhqY0W9rGHByVV1cVX8GTgb+XFXfqqp5NEnTc4eVP7KqZlfV3cC/0iQtVNVdVfWDqnq4qh5o572o3Y5rAS8HDqiqe9rt9as+4xtycJJ7gQdo+j69dWhGVZ1VVb9tt+XlwAlDr92HVwLXVdW3q+qRqjoBuAZ4dTt/tO0+nr2Bb1TVJVX1F+CDNK1U6/WU+UxV3V1N616/bmmfV12IZYa8iuZw5XHtul4C/IDmD8SQU6rqnKp6lCaxXb2qPlFVc6vqBuDfgT17yv+63Y/n0STHWy9EPM8AbhsaSTIjTcvw/UmuHVa2d1v1s23H8kce+9yeRNNi+Mp23hN9v6WnjEmY1Pg74OdVdWc7/l0eOyS5NnBzVfXe7f73QwNVdT1wNfDqNhHbjceSsGcBb2h/cO5tk4sX0PzzHjK7p66HaP6xHwDcmuS/8ljH9GcBh/fUczcQmta2ftzeM/ynEcafPqz87J7h39NsB5I8LclXk/w+yf00hwFXSdOvaDpwd1Xd02dMI/l8Va1C09LxJ2DjoRlJtk9yZnvI7D6a7fSMPutdm573rWe91hlnuy9UvVX1IE1rZ+/7Mnv4Qn0YWv7uJ7Dss4Dth+13ewPPHCWmZ9EcKu4t/39p+poNua1n+GFgufTfb+suevb5qprVvsevo2nh6tUbVz/bdiwjfW7XfpLvt/SUMQnTEi/J8sAbgRcluS3JbTSHMLZOsjVwK7BOkvQstu6wak6gaSnaHbiqTcyg+UH5dlWt0vNYoao+27Ns748EVXV6Vf0tzY/WNTQtEkN1/f2wupavqnOf9EYY2fSe4XV5rGXm/TSJ0fZVtRKwUzs9bYyrJlllhPpqhGmjqqo/AO+lSTyXbyd/F/gxML2qVgaOaV+3n/pvoUk2eq1L0/l/rO0+ngXqTdP/bbWhevuMbSSvpWnJGd5S1I/ZwK+G7StPr6p3jRLTbODGYeVXrKoRO82PYLz1OwPYpd02C1PXWNt26KSEp/WU700yYeTP7S3wpN5v6SljEiY1fa3mAZvRdAKfQdPv6r9p+kydR3OY8D1pOt2/Dhh+Wv2JwC7Au3isFQzgP2hayHZNMiXJcmku1TCNESRZM8lu7Y/NX4AH29igSTg+mGTztuzKSd7wpNZ8bAcmmZZkVZpWkZPa6SvStFDd28776NACVXUrTQf8o9N04F86yVCSdjuwWpKV+w2gPXx7C7B/z2vfXVV/TnNpgzf3FL+D5hDTBqNUdyrwnCRvbt/HN9G85z8dZ7uP57vA29tDbMvSHCb+TVXd1O969mpjOYhmu36wPVy4sH5Ks65vbd+DpZNsm2TTUcpfANyf5J+TLN/uq1sk2bbP17ud0bc7wLdo/syc3NY7Jc2JHjPHqXfUbVtVd9AkY29p69sXePaw5deg+dwu3X5WNgVOfZLvt/SUMQmTmsOOx1XVH6o5M+22qroNOJLmEM6jNIdN9qHpyP0m4Ie9FbTJx3nA83ksWaGqZtO0jv1fmiRhNvB/GP2ztxRNS9MtNIehXkRzsgBVdTLwOeDE9jDgFTT9rwblu8DPaTpo30DTeR/gMJpO03fSnE162rDl3kpz4sI1NC05/9jGfw1Ni+EN7SGvMc+O7HEocEj7I/wPwCeSPEDTifx7Q4Wq6mGa/mnntPXv0FtJNdfOehXN9r0LOAR4VXsIetTtPp6qOgP4ME2fq1tpEoE9x1xoZPemOVPxtzR9Bt9QVd94AvXQ9tXbpY3jFppDiZ/j8Yf+hsrPo+kbN4PmhI07ac7A7Ddh/gzwL+12P3iE+v8MvAS4iubEjftpWvi2pWmFHm09xtu276T5PN1Fc3LL8Fbh3wAbtevzr8Ae7X7whN9v6amUBQ+XS1JzOQSas8z+X9exSE9EmmusvaOqXtB1LNJobAmTJEnqgEmYJElSBzwcKUmS1AFbwiRJkjpgEiZJktSBxe4u9c94xjNqvfXW6zoMSZKkcV188cV3VtXqI81b7JKw9dZbj4suuqjrMCRJksaVZPjt0ubzcKQkSVIHTMIkSZI6YBImSZLUAZMwSZKkDpiEiX333Zc11liDLbbYYsT511xzDTvuuCPLLrssn//85+dPnz17Ni95yUvYdNNN2XzzzTn88MPnz5s1axY77LADM2bMYObMmVxwwQUDXw9JkhYnJmFin3324bTTTht1/qqrrsqXv/xlDj744AWmT506lS984QtcffXVnH/++Rx11FFcddVVABxyyCF89KMfZdasWXziE5/gkEMOGeg6SJK0uDEJEzvttBOrrrrqqPPXWGMNtt12W5ZeeukFpq+11lpss802AKy44opsuumm3HzzzQAk4f777wfgvvvuY+211x5Q9JIkLZ4Wu+uEaWK66aabuPTSS9l+++0BOOyww9h11105+OCDefTRRzn33HM7jlCSpInFljA9aQ8++CCvf/3rOeyww1hppZUA+MpXvsKXvvQlZs+ezZe+9CX222+/jqOUJGliMQnTk/LXv/6V17/+9ey999687nWvmz/9m9/85vzxN7zhDXbMlyRpGJMwPWFVxX777cemm27KP/3TPy0wb+211+ZXv/oVAL/85S/ZaKONughRkqQJK1XVdQwLZebMmeW9I59ae+21F2eddRZ33nkna665Jh//+Mf561//CsABBxzAbbfdxsyZM7n//vtZaqmlePrTn85VV13F5Zdfzgtf+EK23HJLllqqyec//elP84pXvIJf//rXvPe97+WRRx5hueWW4+ijj+Z5z3tel6spSdIil+Tiqpo54jyTMEmSpMEYKwnz7MhRJF1HoMXZYvbfRpLUAfuESZIkdcAkTJIkqQMmYZIkSR0wCZMkSeqASZgkSVIHTMIkSZI6YBImSZLUAZMwSZKkDpiESZIkdcAkTJIkqQMmYZIkSR0wCZMkSeqASZgkSVIHTMIkSZI6YBImSZLUAZMwSZKkDpiESZIkdcAkTJIkqQMmYZIkSR0wCZMkSeqASZgkSVIHTMIkSZI6YBImSZLUAZMwSZKkDpiESZIkdcAkTJIkqQMmYZIkSR0wCZMkSeqASZgkSVIHTMIkSZI6YBImSZLUgYElYUm+keSPSa4YZX6SfDnJ9UkuT7LNoGKRJEmaaAbZEnY88LIx5r8c2Kh97A98ZYCxSJIkTSgDS8Kq6mzg7jGK7A58qxrnA6skWWtQ8UiSJE0kXfYJWweY3TM+p532OEn2T3JRkovuuOOORRKcJEnSIHWZhGWEaTVSwar6WlXNrKqZq6+++oDDkiRp4jnttNPYeOON2XDDDfnsZz/7uPn33HMPr33ta9lqq63YbrvtuOKKx7pk33vvveyxxx5ssskmbLrpppx33nkAfOxjH2OdddZhxowZzJgxg1NPPXWRrY9gaoevPQeY3jM+Dbilo1gkSZqw5s2bx4EHHsgvfvELpk2bxrbbbstuu+3GZpttNr/Mpz/9aWbMmMHJJ5/MNddcw4EHHsgZZ5wBwHvf+15e9rKX8f3vf5+5c+fy8MMPz1/ufe97HwcffPAiXyd12xL2Y+Bt7VmSOwD3VdWtHcYjSdKEdMEFF7DhhhuywQYbsMwyy7DnnntyyimnLFDmqquuYueddwZgk0024aabbuL222/n/vvv5+yzz2a//fYDYJlllmGVVVZZ1KugEQzyEhUnAOcBGyeZk2S/JAckOaAtcipwA3A98O/APwwqFkmSFmc333wz06c/dvBo2rRp3HzzzQuU2XrrrfnhD38INEnb73//e+bMmcMNN9zA6quvztvf/nae+9zn8o53vIOHHnpo/nJHHnkkW221Ffvuuy/33HPPolkhAYM9O3KvqlqrqpauqmlVdWxVHVNVx7Tzq6oOrKpnV9WWVXXRoGKRJGlxVvX4LtPJgl2rP/CBD3DPPfcwY8YMjjjiCJ773OcydepUHnnkES655BLe9a53cemll7LCCivM71P2rne9i//5n/9h1qxZrLXWWrz//e9fJOujRpd9wiRJUh+mTZvG7NmPXVBgzpw5rL322guUWWmllTjuuOOAJmlbf/31WX/99Xn44YeZNm0a22+/PQB77LHH/CRszTXXnL/8O9/5Tl71qlcNelXUw9sWSZI0wW277bZcd9113HjjjcydO5cTTzyR3XbbbYEy9957L3PnzgXg61//OjvttBMrrbQSz3zmM5k+fTrXXnstAGecccb8Dv233vpYV+yTTz6ZLbbYYhGtkcCWMEmSJrypU6dy5JFHsuuuuzJv3jz23XdfNt98c4455hgADjjgAK6++mre9ra3MWXKFDbbbDOOPfbY+csfccQR7L333sydO5cNNthgfovZIYccwqxZs0jCeuutx1e/+tVO1m9JlZGOM09kM2fOrIsuGnz3sYx0FTOpT4vZx0qSNCBJLq6qmSPNsyVMkrRYysf9t6wnpz7a7T9m+4RJkiR1wCRMkiSpAyZhkiRJHTAJkyRJ6oBJmCRJUgdMwiRJkjpgEiZJktQBkzBJkqQOmIRJkiR1wCRMkiSpAyZhkiRJHTAJkyRJ6oBJmCRJUgdMwiRJkjpgEiZJktQBkzBJkqQOmIRJkiR1wCRMkiSpAyZhkiRJHTAJkyRJ6oBJmCRJUgdMwiRJkjpgEiZJktQBkzBJkqQOmIRJkiR1wCRMkiSpAyZhkiRJHTAJkyRJ6oBJmCRJUgdMwiRJkjpgEiZJktQBkzBJk85pp53GxhtvzIYbbshnP/vZx82/7777ePWrX83WW2/N5ptvznHHHTd/3r777ssaa6zBFlts8bjljjjiCDbeeGM233xzDjnkkIGug6TJzyRM0qQyb948DjzwQH72s59x1VVXccIJJ3DVVVctUOaoo45is80247LLLuOss87i/e9/P3PnzgVgn3324bTTTntcvWeeeSannHIKl19+OVdeeSUHH3zwIlkfSZOXSZikSeWCCy5gww03ZIMNNmCZZZZhzz335JRTTlmgTBIeeOABqooHH3yQVVddlalTpwKw0047seqqqz6u3q985St84AMfYNlllwVgjTXWGPzKSJrUTMIkTSo333wz06dPnz8+bdo0br755gXKHHTQQVx99dWsvfbabLnllhx++OEstdTYX4e/+93v+O///m+23357XvSiF3HhhRcOJH5JSw6TMEmTSlU9blqSBcZPP/10ZsyYwS233MKsWbM46KCDuP/++8es95FHHuGee+7h/PPP59BDD+WNb3zjiK8lSf0yCZM0qUybNo3Zs2fPH58zZw5rr732AmWOO+44Xve615GEDTfckPXXX59rrrlm3HqHltluu+1YaqmluPPOOweyDpKWDCZhkiaVbbfdluuuu44bb7yRuXPn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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Adverse impact ratios\n", + "ratios = [1.128, 0.816, 0.965]\n", + "groups = ['Asian vs. White', 'Black vs. White', 'Females vs. Males']\n", + "\n", + "# Define light colors\n", + "colors = ['blue', 'orange', 'green']\n", + "\n", + "\n", + "\n", + "# Plot bar chart\n", + "plt.figure(figsize=(10, 6))\n", + "plt.bar(groups, ratios, color=colors)\n", + "plt.xlabel('Demographic Groups')\n", + "plt.ylabel('Adverse Impact Ratio')\n", + "plt.title('Adverse Impact Ratios for Different Groups')\n", + "\n", + "# Display the values on top of each bar\n", + "for i, ratio in enumerate(ratios):\n", + " plt.text(i, ratio, f'{ratio:.3f}', ha='center', va='bottom')\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "87df900f", + "metadata": {}, + "source": [ + "#### More sophisticated remdiation: Model selection via quality and fairness" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "id": "e181f886", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Grid search run 1/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.25, 'min_samples_leaf': 1, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Grid search new best score discovered at iteration 1/150: 0.5730.\n", + "---------- ----------\n", + "Grid search run 2/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 32, 'interactions': 5, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.25, 'min_samples_leaf': 2, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Grid search new best score discovered at iteration 2/150: 0.8175.\n", + "---------- ----------\n", + "Grid search run 3/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.5, 'min_samples_leaf': 1, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 4/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.5, 'min_samples_leaf': 1, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 5/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.1, 'min_samples_leaf': 10, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 6/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 16, 'interactions': 15, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.1, 'min_samples_leaf': 2, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 7/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 32, 'interactions': 15, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.25, 'min_samples_leaf': 10, 'max_leaves': 1}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 8/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 16, 'interactions': 15, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.5, 'min_samples_leaf': 5, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 9/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 16, 'interactions': 10, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.5, 'min_samples_leaf': 5, 'max_leaves': 1}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 10/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.25, 'min_samples_leaf': 2, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 11/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 32, 'interactions': 15, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.1, 'min_samples_leaf': 1, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 12/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 16, 'interactions': 15, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.1, 'min_samples_leaf': 2, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 13/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 16, 'interactions': 10, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.5, 'min_samples_leaf': 2, 'max_leaves': 1}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 14/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 32, 'interactions': 15, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.5, 'min_samples_leaf': 2, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 15/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.1, 'min_samples_leaf': 10, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 16/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.5, 'min_samples_leaf': 10, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 17/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 10, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.25, 'min_samples_leaf': 5, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 18/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.25, 'min_samples_leaf': 1, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 19/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 32, 'interactions': 15, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.25, 'min_samples_leaf': 5, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 20/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 32, 'interactions': 15, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.5, 'min_samples_leaf': 10, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 21/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 5, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 22/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 32, 'interactions': 10, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.5, 'min_samples_leaf': 5, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 23/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.25, 'min_samples_leaf': 5, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Grid search new best score discovered at iteration 23/150: 0.8181.\n", + "---------- ----------\n", + "Grid search run 24/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 32, 'interactions': 10, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.1, 'min_samples_leaf': 2, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 25/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 16, 'interactions': 10, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 5, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 26/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 32, 'interactions': 10, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.1, 'min_samples_leaf': 10, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 27/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.25, 'min_samples_leaf': 10, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 28/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 10, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Grid search new best score discovered at iteration 28/150: 0.8212.\n", + "---------- ----------\n", + "Grid search run 29/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 32, 'interactions': 10, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.5, 'min_samples_leaf': 10, 'max_leaves': 1}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 30/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.25, 'min_samples_leaf': 10, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Grid search new best score discovered at iteration 30/150: 0.8222.\n", + "---------- ----------\n", + "Grid search run 31/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 32, 'interactions': 5, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.1, 'min_samples_leaf': 5, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 32/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.5, 'min_samples_leaf': 2, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 33/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 16, 'interactions': 10, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.25, 'min_samples_leaf': 10, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 34/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.5, 'min_samples_leaf': 2, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 35/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 10, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.5, 'min_samples_leaf': 1, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 36/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 2, 'max_leaves': 1}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 37/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.25, 'min_samples_leaf': 2, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 38/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.1, 'min_samples_leaf': 5, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 39/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 10, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.5, 'min_samples_leaf': 2, 'max_leaves': 1}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 40/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.5, 'min_samples_leaf': 10, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 41/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.25, 'min_samples_leaf': 5, 'max_leaves': 1}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 42/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 32, 'interactions': 10, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.25, 'min_samples_leaf': 2, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 43/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 10, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 44/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 10, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.25, 'min_samples_leaf': 1, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 45/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 10, 'max_leaves': 1}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 46/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 64, 'interactions': 10, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.5, 'min_samples_leaf': 10, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 47/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 32, 'interactions': 10, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.1, 'min_samples_leaf': 1, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 48/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 16, 'interactions': 15, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.5, 'min_samples_leaf': 1, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 49/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 2, 'max_leaves': 1}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 50/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 16, 'interactions': 10, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.1, 'min_samples_leaf': 1, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Grid search new best score discovered at iteration 50/150: 0.8227.\n", + "---------- ----------\n", + "Grid search run 51/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 16, 'interactions': 15, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.25, 'min_samples_leaf': 2, 'max_leaves': 1}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 52/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.5, 'min_samples_leaf': 1, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 53/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 5, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 54/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 1, 'max_leaves': 1}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 55/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.25, 'min_samples_leaf': 5, 'max_leaves': 1}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 56/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.1, 'min_samples_leaf': 2, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 57/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.5, 'min_samples_leaf': 5, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 58/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.25, 'min_samples_leaf': 2, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 59/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.25, 'min_samples_leaf': 5, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 60/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.25, 'min_samples_leaf': 10, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 61/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.25, 'min_samples_leaf': 1, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 62/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 16, 'interactions': 10, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.5, 'min_samples_leaf': 1, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 63/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 1, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 64/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.5, 'min_samples_leaf': 2, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 65/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.5, 'min_samples_leaf': 2, 'max_leaves': 1}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 66/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 16, 'interactions': 15, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 1, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Grid search new best score discovered at iteration 66/150: 0.8233.\n", + "---------- ----------\n", + "Grid search run 67/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 16, 'interactions': 10, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 5, 'max_leaves': 1}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 68/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 16, 'interactions': 10, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.1, 'min_samples_leaf': 1, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 69/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.1, 'min_samples_leaf': 1, 'max_leaves': 1}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 70/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 32, 'interactions': 10, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 10, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 71/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.25, 'min_samples_leaf': 1, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 72/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 32, 'interactions': 15, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.25, 'min_samples_leaf': 1, 'max_leaves': 1}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 73/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 32, 'interactions': 5, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.1, 'min_samples_leaf': 10, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 74/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 64, 'interactions': 10, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.1, 'min_samples_leaf': 2, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Grid search new best score discovered at iteration 74/150: 0.8236.\n", + "---------- ----------\n", + "Grid search run 75/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 16, 'interactions': 15, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.25, 'min_samples_leaf': 1, 'max_leaves': 1}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 76/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.25, 'min_samples_leaf': 1, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 77/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 32, 'interactions': 5, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.1, 'min_samples_leaf': 5, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 78/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 32, 'interactions': 10, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.5, 'min_samples_leaf': 1, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 79/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.1, 'min_samples_leaf': 2, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Grid search new best score discovered at iteration 79/150: 0.8251.\n", + "---------- ----------\n", + "Grid search run 80/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 16, 'interactions': 15, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.1, 'min_samples_leaf': 10, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 81/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.1, 'min_samples_leaf': 10, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 82/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 16, 'interactions': 15, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.25, 'min_samples_leaf': 5, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 83/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 32, 'interactions': 10, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.1, 'min_samples_leaf': 2, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 84/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 16, 'interactions': 10, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.1, 'min_samples_leaf': 1, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 85/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 32, 'interactions': 15, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.25, 'min_samples_leaf': 10, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 86/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.25, 'min_samples_leaf': 2, 'max_leaves': 1}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 87/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 32, 'interactions': 5, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.5, 'min_samples_leaf': 1, 'max_leaves': 1}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 88/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 10, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.1, 'min_samples_leaf': 2, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 89/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 10, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 90/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.1, 'min_samples_leaf': 1, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 91/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 32, 'interactions': 5, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.5, 'min_samples_leaf': 10, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 92/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 5, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 93/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.1, 'min_samples_leaf': 2, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 94/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 32, 'interactions': 10, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.1, 'min_samples_leaf': 5, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 95/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 32, 'interactions': 10, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.1, 'min_samples_leaf': 5, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 96/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 1, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 97/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 16, 'interactions': 15, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.1, 'min_samples_leaf': 5, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 98/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 32, 'interactions': 5, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.5, 'min_samples_leaf': 2, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 99/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.25, 'min_samples_leaf': 5, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 100/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 32, 'interactions': 5, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 1, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 101/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 16, 'interactions': 10, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.5, 'min_samples_leaf': 1, 'max_leaves': 1}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 102/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 16, 'interactions': 15, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.1, 'min_samples_leaf': 10, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 103/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 10, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.1, 'min_samples_leaf': 10, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 104/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 64, 'interactions': 10, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.1, 'min_samples_leaf': 1, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 105/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.1, 'min_samples_leaf': 5, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 106/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 16, 'interactions': 10, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.1, 'min_samples_leaf': 2, 'max_leaves': 1}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 107/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 10, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 2, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 108/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 32, 'interactions': 15, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.1, 'min_samples_leaf': 1, 'max_leaves': 1}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 109/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 16, 'interactions': 10, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.25, 'min_samples_leaf': 5, 'max_leaves': 1}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 110/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 32, 'interactions': 15, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.1, 'min_samples_leaf': 5, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 111/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 16, 'interactions': 10, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.1, 'min_samples_leaf': 5, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 112/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 64, 'interactions': 10, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 2, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 113/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 64, 'interactions': 10, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.25, 'min_samples_leaf': 1, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 114/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 32, 'interactions': 10, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.1, 'min_samples_leaf': 10, 'max_leaves': 1}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 115/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 64, 'interactions': 10, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.25, 'min_samples_leaf': 2, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 116/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.25, 'min_samples_leaf': 2, 'max_leaves': 1}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 117/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 16, 'interactions': 15, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.25, 'min_samples_leaf': 5, 'max_leaves': 1}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 118/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 10, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.5, 'min_samples_leaf': 5, 'max_leaves': 1}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 119/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.5, 'min_samples_leaf': 1, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 120/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 2, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 121/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 10, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.25, 'min_samples_leaf': 10, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 122/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 32, 'interactions': 15, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.5, 'min_samples_leaf': 2, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 123/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 10, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.1, 'min_samples_leaf': 5, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 124/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 32, 'interactions': 15, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.1, 'min_samples_leaf': 2, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 125/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 10, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.1, 'min_samples_leaf': 5, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 126/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 16, 'interactions': 10, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.1, 'min_samples_leaf': 2, 'max_leaves': 1}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 127/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.5, 'min_samples_leaf': 1, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 128/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 32, 'interactions': 10, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.5, 'min_samples_leaf': 5, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 129/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 32, 'interactions': 10, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.5, 'min_samples_leaf': 2, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 130/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 32, 'interactions': 5, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 1, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 131/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.1, 'min_samples_leaf': 10, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 132/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 32, 'interactions': 10, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 1, 'max_leaves': 1}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 133/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 32, 'interactions': 15, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.5, 'min_samples_leaf': 5, 'max_leaves': 1}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 134/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 32, 'interactions': 15, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.25, 'min_samples_leaf': 1, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 135/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 64, 'interactions': 10, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.5, 'min_samples_leaf': 1, 'max_leaves': 1}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 136/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 16, 'interactions': 10, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 10, 'max_leaves': 1}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 137/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 32, 'interactions': 15, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 5, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 138/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 32, 'interactions': 5, 'outer_bags': 8, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.5, 'min_samples_leaf': 2, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 139/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.25, 'min_samples_leaf': 2, 'max_leaves': 1}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 140/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 32, 'interactions': 15, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.25, 'min_samples_leaf': 1, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 141/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 5, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.1, 'min_samples_leaf': 5, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 142/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.05, 'validation_size': 0.5, 'min_samples_leaf': 10, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 143/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 64, 'interactions': 10, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.1, 'min_samples_leaf': 10, 'max_leaves': 1}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 144/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 64, 'interactions': 10, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.1, 'min_samples_leaf': 2, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 145/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 128, 'max_interaction_bins': 32, 'interactions': 15, 'outer_bags': 12, 'inner_bags': 4, 'learning_rate': 0.01, 'validation_size': 0.1, 'min_samples_leaf': 1, 'max_leaves': 1}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 146/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 32, 'interactions': 10, 'outer_bags': 4, 'inner_bags': 4, 'learning_rate': 0.001, 'validation_size': 0.25, 'min_samples_leaf': 1, 'max_leaves': 5}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 147/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 32, 'interactions': 10, 'outer_bags': 8, 'inner_bags': 0, 'learning_rate': 0.01, 'validation_size': 0.1, 'min_samples_leaf': 2, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 148/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 16, 'interactions': 5, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.25, 'min_samples_leaf': 2, 'max_leaves': 3}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 149/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 512, 'max_interaction_bins': 32, 'interactions': 15, 'outer_bags': 4, 'inner_bags': 0, 'learning_rate': 0.05, 'validation_size': 0.25, 'min_samples_leaf': 10, 'max_leaves': 1}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- ----------\n", + "Grid search run 150/150:\n", + "Training with parameters: {'n_jobs': 4, 'early_stopping_rounds': 100, 'random_state': 12345, 'max_bins': 256, 'max_interaction_bins': 64, 'interactions': 15, 'outer_bags': 12, 'inner_bags': 0, 'learning_rate': 0.001, 'validation_size': 0.5, 'min_samples_leaf': 1, 'max_leaves': 3}\n", + "---------- ----------\n", + "EBM training completed in 4117.14 s.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/s_/psmzh19x55n79gg5ssgdy5p00000gn/T/ipykernel_5042/74914493.py:89: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " ebm_grid_frame = ebm_grid_frame.append(row_dict, ignore_index=True)\n" + ] + } + ], + "source": [ + "# start local timer\n", + "ebm2_tic = time.time()\n", + "\n", + "# new grid search that also considers AIR and fairness\n", + "best_ebm2, ebm_grid_frame = ebm_grid(train, best_ebm_phat, x_names, y_name, gs_params=gs_params, n_models=150, \n", + " early_stopping_rounds=100, seed=SEED, air_reference='white', air_protected='black', \n", + " air_cut=0.17)\n", + "\n", + "# end local timer\n", + "ebm2_toc = time.time() - ebm2_tic\n", + "print('EBM training completed in %.2f s.' % (ebm2_toc))" + ] + }, + { + "cell_type": "markdown", + "id": "65affc06", + "metadata": {}, + "source": [ + "#### Display grid search results as table" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "id": "7e6f5875", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
max_binsmax_interaction_binsinteractionsouter_bagsinner_bagslearning_ratevalidation_sizemin_samples_leafmax_leavesfeaturesaucairearly_stopping_roundsn_jobsrandom_state
0512165400.050.2513[no_intro_rate_period_std, conforming, term_36...0.5729571.004738100.04.012345.0
1128325800.0010.2525[debt_to_income_ratio_missing, conforming, loa...0.8175020.727533100.04.012345.0
2512165400.0010.513[property_value_std, loan_amount_std, term_360...0.7833670.795111100.04.012345.0
3128645440.050.515[conforming, debt_to_income_ratio_missing, int...0.8031040.765788100.04.012345.0
45126415400.050.1103[debt_to_income_ratio_missing, property_value_...0.802890.693465100.04.012345.0
................................................
1455123210440.0010.2515[property_value_std, debt_to_income_ratio_miss...0.7174330.926316100.04.012345.0
1465123210800.010.123[term_360, income_std, conforming, no_intro_ra...0.8236540.716449100.04.012345.0
147256165400.050.2523[property_value_std, term_360, debt_to_income_...0.7569590.813052100.04.012345.0
1485123215400.050.25101[loan_to_value_ratio_std, property_value_std]0.51.0100.04.012345.0
14925664151200.0010.513[intro_rate_period_std, term_360, debt_to_inco...0.5494891.00595100.04.012345.0
\n", + "

150 rows × 15 columns

\n", + "
" + ], + "text/plain": [ + " max_bins max_interaction_bins interactions outer_bags inner_bags \\\n", + "0 512 16 5 4 0 \n", + "1 128 32 5 8 0 \n", + "2 512 16 5 4 0 \n", + "3 128 64 5 4 4 \n", + "4 512 64 15 4 0 \n", + ".. ... ... ... ... ... \n", + "145 512 32 10 4 4 \n", + "146 512 32 10 8 0 \n", + "147 256 16 5 4 0 \n", + "148 512 32 15 4 0 \n", + "149 256 64 15 12 0 \n", + "\n", + " learning_rate validation_size min_samples_leaf max_leaves \\\n", + "0 0.05 0.25 1 3 \n", + "1 0.001 0.25 2 5 \n", + "2 0.001 0.5 1 3 \n", + "3 0.05 0.5 1 5 \n", + "4 0.05 0.1 10 3 \n", + ".. ... ... ... ... \n", + "145 0.001 0.25 1 5 \n", + "146 0.01 0.1 2 3 \n", + "147 0.05 0.25 2 3 \n", + "148 0.05 0.25 10 1 \n", + "149 0.001 0.5 1 3 \n", + "\n", + " features auc air \\\n", + "0 [no_intro_rate_period_std, conforming, term_36... 0.572957 1.004738 \n", + "1 [debt_to_income_ratio_missing, conforming, loa... 0.817502 0.727533 \n", + "2 [property_value_std, loan_amount_std, term_360... 0.783367 0.795111 \n", + "3 [conforming, debt_to_income_ratio_missing, int... 0.803104 0.765788 \n", + "4 [debt_to_income_ratio_missing, property_value_... 0.80289 0.693465 \n", + ".. ... ... ... \n", + "145 [property_value_std, debt_to_income_ratio_miss... 0.717433 0.926316 \n", + "146 [term_360, income_std, conforming, no_intro_ra... 0.823654 0.716449 \n", + "147 [property_value_std, term_360, debt_to_income_... 0.756959 0.813052 \n", + "148 [loan_to_value_ratio_std, property_value_std] 0.5 1.0 \n", + "149 [intro_rate_period_std, term_360, debt_to_inco... 0.549489 1.00595 \n", + "\n", + " early_stopping_rounds n_jobs random_state \n", + "0 100.0 4.0 12345.0 \n", + "1 100.0 4.0 12345.0 \n", + "2 100.0 4.0 12345.0 \n", + "3 100.0 4.0 12345.0 \n", + "4 100.0 4.0 12345.0 \n", + ".. ... ... ... \n", + "145 100.0 4.0 12345.0 \n", + "146 100.0 4.0 12345.0 \n", + "147 100.0 4.0 12345.0 \n", + "148 100.0 4.0 12345.0 \n", + "149 100.0 4.0 12345.0 \n", + "\n", + "[150 rows x 15 columns]" + ] + }, + "execution_count": 86, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ebm_grid_frame" + ] + }, + { + "cell_type": "markdown", + "id": "8bbcc149", + "metadata": {}, + "source": [ + "#### Display grid search results as plot" + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "id": "479d0699", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots(figsize=(8,8))\n", + "_ = ebm_grid_frame.plot(kind='scatter', x='air', y='auc', title='AIR vs. AUC for EBMs', ax=ax)\n", + "_ = ax.axvline(x=0.8, color='r', linestyle='--')\n", + "_ = ax.set_ylim([0.4, 0.85])\n", + "_ = ax.set_xlim([0.75, 1.05])\n", + "_ = ax.set_xlabel('AIR')\n", + "_ = ax.set_ylabel('AUC')" + ] + }, + { + "cell_type": "markdown", + "id": "f8269300", + "metadata": {}, + "source": [ + "#### Retrain most accurate model above 0.8 AIR" + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "id": "eb524bd0", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Best AUC: 0.7806 above 0.8 AIR (0.8083).\n", + "Remediated EBM retrained with AUC: 0.7806.\n" + ] + } + ], + "source": [ + "# extract new params dict from ebm_grid_frame\n", + "rem_params = ebm_grid_frame.loc[ebm_grid_frame['air'] > 0.8].sort_values(by='auc', ascending=False).iloc[0, :].to_dict()\n", + "\n", + "# extract features from dict then delete from dict \n", + "rem_x_names = rem_params['features']\n", + "del rem_params['features']\n", + "\n", + "# record and delete other extraneous information\n", + "print('Best AUC: %.4f above 0.8 AIR (%.4f).' % (rem_params['auc'], rem_params['air']))\n", + "del rem_params['auc']\n", + "del rem_params['air']\n", + "\n", + "# reset some parameters to integers\n", + "rem_params['random_state'] = int(rem_params['random_state'])\n", + "rem_params['n_jobs'] = int(rem_params['n_jobs'])\n", + "\n", + "# retrain\n", + "rem_ebm = ExplainableBoostingClassifier(**rem_params)\n", + "rem_ebm.fit(train[rem_x_names], train[y_name]) \n", + "rem_ebm_perf = ROC(rem_ebm.predict_proba).explain_perf(valid[rem_x_names], valid[y_name])\n", + "rem_auc = rem_ebm_perf._internal_obj['overall']['auc']\n", + "print('Remediated EBM retrained with AUC: %.4f.' % rem_auc)" + ] + }, + { + "cell_type": "markdown", + "id": "44041927", + "metadata": {}, + "source": [ + "#### Check that other groups are not adversely impacted by change" + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "id": "162e7d03", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Adverse impact ratio for Asian people vs. White people: 1.151\n", + "Adverse impact ratio for Black people vs. White people: 0.808\n", + "Adverse impact ratio for Females vs. Males: 0.958\n" + ] + } + ], + "source": [ + "# create a frame with remediated EBM predictions\n", + "best_ebm_phat2 = pd.DataFrame(rem_ebm.predict_proba(valid[rem_x_names])[:, 1], columns=['phat']) \n", + "best_ebm_phat2 = pd.concat([valid.reset_index(drop=True), best_ebm_phat2], axis=1)\n", + "\n", + "# calculate new confusion matrices for each group\n", + "rem_cm_dict2 = {}\n", + "for name in demographic_group_names:\n", + " rem_cm_dict2[name] = get_confusion_matrix(best_ebm_phat2, y_name, 'phat', by=name, level=1, cutoff=0.17, verbose=False)\n", + "\n", + "# calculate AIR for each group\n", + "print('Adverse impact ratio for Asian people vs. White people: %.3f' % air(rem_cm_dict2, 'white', 'asian', verbose=False))\n", + "print('Adverse impact ratio for Black people vs. White people: %.3f' % air(rem_cm_dict2, 'white', 'black', verbose=False))\n", + "print('Adverse impact ratio for Females vs. Males: %.3f' % air(rem_cm_dict2, 'male', 'female', verbose=False))" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "c1b882fe", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "# Adverse impact ratios\n", + "ratios = [1.151, 0.808, 0.958]\n", + "groups = ['Asian vs. White', 'Black vs. White', 'Females vs. Males']\n", + "\n", + "# Define light colors\n", + "colors = ['blue', 'orange', 'green']\n", + "\n", + "\n", + "\n", + "# Plot bar chart\n", + "plt.figure(figsize=(10, 6))\n", + "plt.bar(groups, ratios, color=colors)\n", + "plt.xlabel('Demographic Groups')\n", + "plt.ylabel('Adverse Impact Ratio')\n", + "plt.title('Adverse Impact Ratios for Different Groups')\n", + "\n", + "# Display the values on top of each bar\n", + "for i, ratio in enumerate(ratios):\n", + " plt.text(i, ratio, f'{ratio:.3f}', ha='center', va='bottom')\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "id": "cf99699e", + "metadata": {}, + "outputs": [], + "source": [ + "import datetime \n", + "best_ebm_submit = pd.DataFrame(best_ebm.predict_proba(test[x_names])[:, 1], columns=['phat'])\n", + "best_ebm_submit.to_csv('ph_best_ebm_' + str(datetime.datetime.now().strftime(\"%Y_%m_%d_%H_%M_%S\") + '.csv'), \n", + " index=False)" + ] + }, + { + "cell_type": "markdown", + "id": "ef07d56f", + "metadata": {}, + "source": [ + "#### Print best model parameters for later use" + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "id": "d8fd1f10", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'max_bins': 128,\n", + " 'max_interaction_bins': 64,\n", + " 'interactions': 10,\n", + " 'outer_bags': 4,\n", + " 'inner_bags': 0,\n", + " 'learning_rate': 0.01,\n", + " 'validation_size': 0.5,\n", + " 'min_samples_leaf': 2,\n", + " 'max_leaves': 5,\n", + " 'early_stopping_rounds': 100.0,\n", + " 'n_jobs': 4,\n", + " 'random_state': 12345}" + ] + }, + "execution_count": 90, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rem_params" + ] + }, + { + "cell_type": "markdown", + "id": "50fb63f4", + "metadata": {}, + "source": [ + "##### Print best model features for later use" + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "id": "bff5e277", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['debt_to_income_ratio_std',\n", + " 'term_360',\n", + " 'intro_rate_period_std',\n", + " 'property_value_std',\n", + " 'no_intro_rate_period_std',\n", + " 'income_std']" + ] + }, + "execution_count": 91, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rem_x_names" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "751ee03a", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.16" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/assignments/tex/assignment_5.pdf b/assignments/tex/assignment_5.pdf index 0a6ad3b..82d8afc 100644 Binary files a/assignments/tex/assignment_5.pdf and b/assignments/tex/assignment_5.pdf differ diff --git a/assignments/tex/assignment_5.tex b/assignments/tex/assignment_5.tex index 7babf82..0758e54 100644 --- a/assignments/tex/assignment_5.tex +++ b/assignments/tex/assignment_5.tex @@ -3,7 +3,6 @@ \documentclass[fleqn]{article} \renewcommand\refname{} \title{Responsible Machine Learning\\\Large{Assignment 5}\\\Large{10 points}} -\author{\copyright Patrick Hall 2021} \usepackage{graphicx} \usepackage{fullpage} @@ -43,15 +42,15 @@ \section{Test How this Lending Model Performs in Recession Conditions.} \section{Conduct Residual Analysis and Remediate Discovered Bugs.} -Cells 9--15 use a basic residual analysis procedure to find outliers and identify a fundamental problem with our data and EBM model. Once these problems are identified, you should be able to increase your model performance by accounting for them.\\ +Cells 9--15 use a basic residual analysis procedure to find outliers and identify a fundamental problem with our data and EBM model. Once these problems are identified, you should be able to increase your model performance by accounting for them. You may use the template approach and/or additional approaches to improve your model. \\ \section{Submit Code Results.} -Your deliverable for this assignment is to update your group's GitHub repository to reflect this debugging exercise. Stress-testing is worth 5 points. Remediating your model by removing outliers and handling data imbalance, to increase validation AUC, is worth 5 points.\\ +Your deliverable for this assignment is to update your group's GitHub repository to reflect this debugging exercise. Stress-testing is worth 5 points. Remediating your model by removing outliers and handling data imbalance, to increase validation AUC, is worth up to 5 points. Groups with better debugging will receive higher scores. \\ -\noindent \textbf{Your deliverables are due Sunday, July 3\textsuperscript{rd}, at 11:00 AM ET.}\\ +\noindent \textbf{Your deliverables are due Wednesday, June 28\textsuperscript{th}, at 11:59 PM ET.}\\ -\noindent Note that you may also improve Assignment 1 or Assignment 3 scores throughout the Summer I Session to improve your ranking, your Assignment 1 grade, your Assignment 3 grade, and your final project grade. +\noindent Note that you may also improve Assignment 1 or Assignment 3 scores throughout the Summer I Session to improve your ranking, your Assignment 1 grade, your Assignment 3 grade, and your final project grade. \textbf{(HINT: If you perform Assignment 5 correctly, it should allow you to boost your model performance in Assignments 1 and/or 3!)} \end{document} diff --git a/img/de.png b/img/de.png index 8d22e6e..9e79659 100644 Binary files a/img/de.png and b/img/de.png differ diff --git a/img/robust.png b/img/robust.png new file mode 100644 index 0000000..f40b0e1 Binary files /dev/null and b/img/robust.png differ diff --git a/img/sa_max_prob.png b/img/sa_max_prob.png old mode 100644 new mode 100755 index 5ddc603..3b2b3b1 Binary files a/img/sa_max_prob.png and b/img/sa_max_prob.png differ diff --git a/tex/lecture_5.pdf b/tex/lecture_5.pdf index 3346246..07d00fa 100644 Binary files a/tex/lecture_5.pdf and b/tex/lecture_5.pdf differ diff --git a/tex/lecture_5.tex b/tex/lecture_5.tex index a97428f..4733c37 100644 --- a/tex/lecture_5.tex +++ b/tex/lecture_5.tex @@ -64,9 +64,9 @@ \frametitle{What is Model Debugging?} \begin{itemize} - \item Model debugging is an emergent discipline focused on discovering and remediating errors in the internal mechanisms and outputs of machine learning models.\footnote{\tiny{See \url{https://debug-ml-iclr2019.github.io/} for numerous model debugging approaches.}} + \item Model debugging is an emergent discipline focused on discovering and remediating errors in the internal mechanisms and outputs of machine learning models.\footnote{\tiny{See \url{https://debug-ml-iclr2019.github.io/} for numerous examples of model debugging approaches.}} \item Model debugging attempts to test machine learning models like software (because the models are software). - \item Model debugging is similar to regression diagnostics, but for machine learning models. + \item Model debugging is similar to model validation and regression diagnostics, but for machine learning models. \item Model debugging \textbf{promotes trust directly} and \textbf{enhances interpretability as a side-effect}. \end{itemize} @@ -102,7 +102,7 @@ \end{center} \end{figure} \vspace{-10pt} -\centering{\scriptsize{\textbf{AI incidents}: The Partnership on AI Incident Database contains over 1,200 incident reports.\footnote{\tiny{See \url{https://incidentdatabase.ai/} to access the database.}}}} +\centering{\scriptsize{\textbf{AI incidents}: The AI Incident Database contains over 2,000 incident reports.\footnote{\tiny{See \url{https://incidentdatabase.ai/} to access the database.}}}} \end{frame} @@ -270,13 +270,21 @@ \begin{frame}[t, allowframebreaks] \vspace{-10pt} \frametitle{\textbf{Sensitivity Analysis}: Search for Adversarial Examples} - \begin{figure} - \begin{center} - \includegraphics[height=130pt]{../img/sa_max_prob.png} - \end{center} - \end{figure} + + \begin{columns} + + \column{0.5\linewidth} + + \begin{figure} + \begin{center} + \includegraphics[height=165pt]{../img/sa_max_prob.png} + \end{center} + \end{figure} - \tiny{Adversary search confirms multiple avenues of attack and exposes a potential flaw in $g_{\text{mono}}$ inductive logic: default is predicted for customer's who make payments above their credit limit. (Try heuristics, evolutionary learning or packages like \href{https://github.com/tensorflow/cleverhans}{cleverhans} to generate adversarial examples.)} + \column{0.5\linewidth} + \small{Adversary search confirms multiple avenues of attack and exposes a potential flaw in $g_{\text{mono}}$ inductive logic: default is predicted for customer's who make payments above their credit limit. (Try heuristics, evolutionary learning or packages like \href{https://github.com/tensorflow/cleverhans}{cleverhans} to generate adversarial examples.)} + + \end{columns} %\framebreak %\vspace{-5pt} @@ -290,6 +298,32 @@ \end{frame} + \begin{frame}[t] + + \frametitle{\textbf{Sensitivity Analysis}: Robustness to Drift} + + \begin{columns}[t] + + \column{0.5\linewidth} + \begin{figure} + \begin{center} + \includegraphics[height=125pt]{../img/robust.png} + \caption{$g_{mono}$ accuracy under feature perturbation.} + \end{center} + \end{figure} + + \column{0.5\linewidth} + \begin{itemize}\small + \item Models must be robust to data drift once deployed. + \item Simulation, perturbation, and statistics like population stability index (PSI), \textit{t}, and Kolmogorov-Smirnov (K-S) can help assess robustness. + \item Drift can also be measured on a feature-by-feature basis across data partitions. + \item Likely due to monotonicity contraints $g_{mono}$ holds up well to moderate data perturbation. + \end{itemize} + + \end{columns} + + \end{frame} + \begin{frame}[t] %When you don't know what to test @@ -298,7 +332,7 @@ \vspace{-15pt} \begin{figure} \begin{center} - \includegraphics[height=130pt]{../img/ra.png} + \includegraphics[height=115pt]{../img/ra.png} \end{center} \end{figure} \vspace{-10pt} @@ -306,6 +340,7 @@ \item In general, random attacks are a viable method to identify software bugs in machine learning pipelines. \textbf{(Start here if you don't know where to start.)} \item Random data can apparently elicit all probabilities $\in [0, 1]$ from $g_{\text{mono}}$. \item Around the decision threshold, lower probabilities can be attained simply by injecting missing values, yet another vulnerability to adversarial attack. + \item Chaos testing is a broader approach that can also elicit unexpected approaches from machine learning systems. \end{itemize} \normalsize @@ -336,24 +371,54 @@ \begin{frame}[t] - \frametitle{\textbf{Residual Analysis}: Disparate Accuracy and Errors} + \frametitle{\textbf{Residual Analysis}: Segmented Error Analysis} - \vspace{-10pt} + \vspace{-10pt} \begin{figure} \begin{center} \includegraphics[height=140pt]{../img/de.png} \end{center} \end{figure} - \vspace{-15pt} - \tiny For $\text{PAY\_0}$: - \begin{itemize} + %\vspace{-15pt} + \begin{itemize}\tiny \item Notable change in accuracy and error characteristics for $\text{PAY\_0} \geq 2$. + \item For $\text{SEX}$, accuracy and error characteristics vary little across individuals represented in the training data. Bias mitigation should be confirmed by more involved bias testing. + \item Overfitting, stability and other characteristics should also be analyzed by segment. \item Varying performance across segments can be an indication of underspecification. \end{itemize} - For $\text{SEX}$, accuracy and error characteristics vary little across individuals represented in the training data. Non-discrimination should be confirmed by more involved disparate impact analysis. \end{frame} + \begin{frame}[t] + + \frametitle{\textbf{Residual Analysis}: Plotting Residuals} + + \begin{columns} + + \column{0.5\linewidth} + \begin{figure} + \begin{center} + \includegraphics[height=140pt]{../img/lecture_5.png} + \caption{Residuals plotted by $\text{PAY\_0}$ reveal a serious problem with $g_{\text{mono}}$.} + \end{center} + \end{figure} + + \column{0.5\linewidth} + \begin{itemize} + \item Plotting residuals is a battle-tested model debugging technique. + \item Residuals can be plotted using many approaches: + \begin{itemize} + \item Overall, by feature (at left) or by segment + \item Traditional ($\hat{y}^{(i)} - y^{(i)}$) + \item Deviance or loss residuals (at left) + \end{itemize} + \item Residuals can reveal serious issues and the underlying problems behind them. + \end{itemize} + + \end{columns} + + \end{frame} + \begin{frame} \frametitle{\textbf{Residual Analysis}: Local Contributions to Logloss}