"
- ]
- },
- "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",
+ "
row_id
\n",
+ "
black
\n",
+ "
asian
\n",
+ "
white
\n",
+ "
amind
\n",
+ "
hipac
\n",
+ "
hispanic
\n",
+ "
non_hispanic
\n",
+ "
male
\n",
+ "
female
\n",
+ "
...
\n",
+ "
debt_to_income_ratio_missing
\n",
+ "
loan_amount_std
\n",
+ "
loan_to_value_ratio_std
\n",
+ "
no_intro_rate_period_std
\n",
+ "
intro_rate_period_std
\n",
+ "
property_value_std
\n",
+ "
income_std
\n",
+ "
debt_to_income_ratio_std
\n",
+ "
high_priced
\n",
+ "
phat
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
0
\n",
+ "
0
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
1.0
\n",
+ "
0.0
\n",
+ "
...
\n",
+ "
0
\n",
+ "
-0.514393
\n",
+ "
0.333922
\n",
+ "
0.244394
\n",
+ "
-0.215304
\n",
+ "
-0.535932
\n",
+ "
-0.040307
\n",
+ "
0.854601
\n",
+ "
0
\n",
+ "
0.165646
\n",
+ "
\n",
+ "
\n",
+ "
1
\n",
+ "
6
\n",
+ "
0.0
\n",
+ "
0.0
\n",
+ "
1.0
\n",
+ "
0.0
\n",
+ "
0.0
\n",
+ "
0.0
\n",
+ "
1.0
\n",
+ "
0.0
\n",
+ "
1.0
\n",
+ "
...
\n",
+ "
0
\n",
+ "
-0.426448
\n",
+ "
0.355249
\n",
+ "
0.244394
\n",
+ "
-0.215304
\n",
+ "
-0.474263
\n",
+ "
-0.020904
\n",
+ "
1.037419
\n",
+ "
0
\n",
+ "
0.314594
\n",
+ "
\n",
+ "
\n",
+ "
2
\n",
+ "
8
\n",
+ "
0.0
\n",
+ "
0.0
\n",
+ "
1.0
\n",
+ "
0.0
\n",
+ "
0.0
\n",
+ "
0.0
\n",
+ "
1.0
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
...
\n",
+ "
0
\n",
+ "
0.277109
\n",
+ "
0.142995
\n",
+ "
0.244394
\n",
+ "
-0.215304
\n",
+ "
0.111598
\n",
+ "
-0.019865
\n",
+ "
0.031916
\n",
+ "
0
\n",
+ "
0.022284
\n",
+ "
\n",
+ "
\n",
+ "
3
\n",
+ "
10
\n",
+ "
0.0
\n",
+ "
0.0
\n",
+ "
1.0
\n",
+ "
0.0
\n",
+ "
0.0
\n",
+ "
0.0
\n",
+ "
1.0
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
...
\n",
+ "
0
\n",
+ "
-0.382476
\n",
+ "
-0.240432
\n",
+ "
0.244394
\n",
+ "
-0.215304
\n",
+ "
-0.320089
\n",
+ "
-0.028181
\n",
+ "
0.946010
\n",
+ "
0
\n",
+ "
0.015600
\n",
+ "
\n",
+ "
\n",
+ "
4
\n",
+ "
11
\n",
+ "
0.0
\n",
+ "
0.0
\n",
+ "
1.0
\n",
+ "
0.0
\n",
+ "
0.0
\n",
+ "
1.0
\n",
+ "
0.0
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
...
\n",
+ "
0
\n",
+ "
0.101220
\n",
+ "
-0.266529
\n",
+ "
0.244394
\n",
+ "
-0.215304
\n",
+ "
0.111598
\n",
+ "
0.016515
\n",
+ "
-1.156406
\n",
+ "
0
\n",
+ "
0.004888
\n",
+ "
\n",
+ " \n",
+ "
\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",
+ "
cut
\n",
+ "
f1
\n",
+ "
acc
\n",
+ "
air
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
22
\n",
+ "
0.22
\n",
+ "
0.356794
\n",
+ "
0.832942
\n",
+ "
0.816260
\n",
+ "
\n",
+ "
\n",
+ "
23
\n",
+ "
0.23
\n",
+ "
0.350179
\n",
+ "
0.841156
\n",
+ "
0.843019
\n",
+ "
\n",
+ "
\n",
+ "
24
\n",
+ "
0.24
\n",
+ "
0.341709
\n",
+ "
0.850161
\n",
+ "
0.864101
\n",
+ "
\n",
+ "
\n",
+ "
25
\n",
+ "
0.25
\n",
+ "
0.330154
\n",
+ "
0.858313
\n",
+ "
0.878680
\n",
+ "
\n",
+ "
\n",
+ "
26
\n",
+ "
0.26
\n",
+ "
0.316466
\n",
+ "
0.865155
\n",
+ "
0.887407
\n",
+ "
\n",
+ " \n",
+ "
\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": "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Vd94AvXQ9tXbpY3jFppDiZ/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": [
+ "