From e65dcc140877770c04191a54549d7180a0ecf71a Mon Sep 17 00:00:00 2001 From: Denys Herasymuk Date: Sun, 1 Oct 2023 01:23:51 +0300 Subject: [PATCH 01/36] Added plot 1 to a gradio app --- .gitignore | 1 + .../Multiple_Models_Interface_Use_Case.ipynb | 86 ++-- .../Multiple_Models_Interface_Vis.ipynb | 480 ++++++++++++++++++ docs/examples/experiment_config.yaml | 2 +- requirements.txt | 2 +- .../metrics_interactive_visualizer.py | 120 +++++ virny/custom_classes/metrics_visualizer.py | 16 +- virny/utils/data_viz_utils.py | 132 +++-- 8 files changed, 701 insertions(+), 138 deletions(-) create mode 100644 docs/examples/Multiple_Models_Interface_Vis.ipynb create mode 100644 virny/custom_classes/metrics_interactive_visualizer.py diff --git a/.gitignore b/.gitignore index cf2ccb41..375238bf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ *_venv +virny_env notebooks *.env .DS_Store diff --git a/docs/examples/Multiple_Models_Interface_Use_Case.ipynb b/docs/examples/Multiple_Models_Interface_Use_Case.ipynb index 7c056ceb..d0bb62a5 100644 --- a/docs/examples/Multiple_Models_Interface_Use_Case.ipynb +++ b/docs/examples/Multiple_Models_Interface_Use_Case.ipynb @@ -152,7 +152,8 @@ ], "metadata": { "collapsed": false - } + }, + "id": "8d7b3af66d9484a6" }, { "cell_type": "code", @@ -200,7 +201,8 @@ ], "metadata": { "collapsed": false - } + }, + "id": "d8e5cb3ff6e3941a" }, { "cell_type": "markdown", @@ -209,7 +211,8 @@ ], "metadata": { "collapsed": false - } + }, + "id": "fc98f09ac0fc8ded" }, { "cell_type": "markdown", @@ -226,7 +229,8 @@ ], "metadata": { "collapsed": false - } + }, + "id": "e6c314a1af8c4fe5" }, { "cell_type": "code", @@ -247,7 +251,8 @@ ], "metadata": { "collapsed": false - } + }, + "id": "4955f140ad45254e" }, { "cell_type": "code", @@ -259,7 +264,8 @@ ], "metadata": { "collapsed": false - } + }, + "id": "b64f9dbcbfa9cdc2" }, { "cell_type": "markdown", @@ -359,7 +365,8 @@ ], "metadata": { "collapsed": false - } + }, + "id": "c6719c1b6b5748a9" }, { "cell_type": "code", @@ -370,7 +377,8 @@ ], "metadata": { "collapsed": false - } + }, + "id": "de4db3f6b82c8f05" }, { "cell_type": "markdown", @@ -379,7 +387,8 @@ ], "metadata": { "collapsed": false - } + }, + "id": "7317a756231dc58a" }, { "cell_type": "code", @@ -403,8 +412,7 @@ "\n", "2023/08/13, 01:39:23: Tuning XGBClassifier...\n", "Fitting 3 folds for each of 4 candidates, totalling 12 fits\n", - "2023/08/13, 01:39:27: Tuning for XGBClassifier is finished [F1 score = 0.6548814644409034, Accuracy = 0.6587752525252525]\n", - "\n" + "2023/08/13, 01:39:27: Tuning for XGBClassifier is finished [F1 score = 0.6548814644409034, Accuracy = 0.6587752525252525]\n" ] }, { @@ -423,7 +431,8 @@ ], "metadata": { "collapsed": false - } + }, + "id": "d76c04f902e8548a" }, { "cell_type": "code", @@ -437,7 +446,8 @@ ], "metadata": { "collapsed": false - } + }, + "id": "dc00b584001630d3" }, { "cell_type": "markdown", @@ -446,7 +456,8 @@ ], "metadata": { "collapsed": false - } + }, + "id": "9a3bc8180fc00ea2" }, { "cell_type": "code", @@ -480,7 +491,8 @@ ], "metadata": { "collapsed": false - } + }, + "id": "9b04064fae7867f4" }, { "cell_type": "markdown", @@ -520,9 +532,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "############################## [Model 1 / 4] Analyze DecisionTreeClassifier ##############################\n", - "\n", - "\n" + "############################## [Model 1 / 4] Analyze DecisionTreeClassifier ##############################\n" ] }, { @@ -547,10 +557,7 @@ { "name": "stdout", "output_type": "stream", - "text": [ - "\n", - "\n" - ] + "text": [] }, { "name": "stderr", @@ -568,9 +575,7 @@ "\n", "\n", "\n", - "############################## [Model 2 / 4] Analyze LogisticRegression ##############################\n", - "\n", - "\n" + "############################## [Model 2 / 4] Analyze LogisticRegression ##############################\n" ] }, { @@ -595,10 +600,7 @@ { "name": "stdout", "output_type": "stream", - "text": [ - "\n", - "\n" - ] + "text": [] }, { "name": "stderr", @@ -616,9 +618,7 @@ "\n", "\n", "\n", - "############################## [Model 3 / 4] Analyze RandomForestClassifier ##############################\n", - "\n", - "\n" + "############################## [Model 3 / 4] Analyze RandomForestClassifier ##############################\n" ] }, { @@ -643,10 +643,7 @@ { "name": "stdout", "output_type": "stream", - "text": [ - "\n", - "\n" - ] + "text": [] }, { "name": "stderr", @@ -664,9 +661,7 @@ "\n", "\n", "\n", - "############################## [Model 4 / 4] Analyze XGBClassifier ##############################\n", - "\n", - "\n" + "############################## [Model 4 / 4] Analyze XGBClassifier ##############################\n" ] }, { @@ -691,10 +686,7 @@ { "name": "stdout", "output_type": "stream", - "text": [ - "\n", - "\n" - ] + "text": [] }, { "name": "stderr", @@ -708,8 +700,6 @@ "name": "stdout", "output_type": "stream", "text": [ - "\n", - "\n", "\n", "\n" ] @@ -886,7 +876,8 @@ ], "metadata": { "collapsed": false - } + }, + "id": "de72ce340642702f" }, { "cell_type": "code", @@ -907,7 +898,8 @@ ], "metadata": { "collapsed": false - } + }, + "id": "b08c56d7c4bd0096" }, { "cell_type": "code", diff --git a/docs/examples/Multiple_Models_Interface_Vis.ipynb b/docs/examples/Multiple_Models_Interface_Vis.ipynb new file mode 100644 index 00000000..e75f0a48 --- /dev/null +++ b/docs/examples/Multiple_Models_Interface_Vis.ipynb @@ -0,0 +1,480 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "248cbed8", + "metadata": { + "ExecuteTime": { + "end_time": "2023-09-29T20:56:16.932083Z", + "start_time": "2023-09-29T20:56:16.278169Z" + } + }, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "%load_ext autoreload\n", + "%autoreload 2" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "7ec6cd08", + "metadata": { + "ExecuteTime": { + "end_time": "2023-09-29T20:56:16.940086Z", + "start_time": "2023-09-29T20:56:16.931485Z" + } + }, + "outputs": [], + "source": [ + "import os\n", + "import warnings\n", + "warnings.filterwarnings('ignore')\n", + "os.environ[\"PYTHONWARNINGS\"] = \"ignore\"" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "b8cb69f2", + "metadata": { + "ExecuteTime": { + "end_time": "2023-09-29T20:56:16.951831Z", + "start_time": "2023-09-29T20:56:16.940588Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Current location: /Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny\n" + ] + } + ], + "source": [ + "cur_folder_name = os.getcwd().split('/')[-1]\n", + "if cur_folder_name != \"Virny\":\n", + " os.chdir(\"../..\")\n", + "\n", + "print('Current location: ', os.getcwd())" + ] + }, + { + "cell_type": "markdown", + "id": "a578f2ab", + "metadata": {}, + "source": [ + "# Multiple Models Interface Usage" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "7a9241de", + "metadata": { + "ExecuteTime": { + "end_time": "2023-09-29T20:56:30.072450Z", + "start_time": "2023-09-29T20:56:22.772584Z" + } + }, + "outputs": [], + "source": [ + "import os\n", + "\n", + "from virny.utils.custom_initializers import read_model_metric_dfs, create_config_obj\n", + "from virny.custom_classes.metrics_interactive_visualizer import MetricsInteractiveVisualizer\n", + "from virny.custom_classes.metrics_composer import MetricsComposer" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "outputs": [], + "source": [ + "ROOT_DIR = os.path.join('docs', 'examples')\n", + "config_yaml_path = os.path.join(ROOT_DIR, 'experiment_config.yaml')\n", + "config_yaml_content = \"\"\"\n", + "dataset_name: COMPAS_Without_Sensitive_Attributes\n", + "bootstrap_fraction: 0.8\n", + "n_estimators: 50 # Better to input the higher number of estimators than 100; this is only for this use case example\n", + "sensitive_attributes_dct: {'sex': 1, 'race': 'African-American', 'sex&race': None}\n", + "\"\"\"\n", + "with open(config_yaml_path, 'w', encoding='utf-8') as f:\n", + " f.write(config_yaml_content)\n", + "\n", + "config = create_config_obj(config_yaml_path=config_yaml_path)\n", + "model_names = ['DecisionTreeClassifier', 'LogisticRegression', 'RandomForestClassifier', 'XGBClassifier']\n", + "SAVE_RESULTS_DIR_PATH = os.path.join(ROOT_DIR, 'results', 'COMPAS_Without_Sensitive_Attributes_Metrics_20230812__224136')" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2023-09-29T20:56:30.095448Z", + "start_time": "2023-09-29T20:56:30.073873Z" + } + }, + "id": "d777610462304f63" + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "f94a20dc", + "metadata": { + "ExecuteTime": { + "end_time": "2023-09-29T20:56:30.121865Z", + "start_time": "2023-09-29T20:56:30.094816Z" + } + }, + "outputs": [], + "source": [ + "models_metrics_dct = read_model_metric_dfs(SAVE_RESULTS_DIR_PATH, model_names=model_names)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "b04d06cf", + "metadata": { + "ExecuteTime": { + "end_time": "2023-09-29T20:56:30.139696Z", + "start_time": "2023-09-29T20:56:30.121071Z" + } + }, + "outputs": [], + "source": [ + "metrics_composer = MetricsComposer(models_metrics_dct, config.sensitive_attributes_dct)" + ] + }, + { + "cell_type": "markdown", + "id": "e1a23ece", + "metadata": {}, + "source": [ + "Compute composed metrics" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "be6ace22", + "metadata": { + "ExecuteTime": { + "end_time": "2023-09-29T20:56:30.169575Z", + "start_time": "2023-09-29T20:56:30.138633Z" + } + }, + "outputs": [], + "source": [ + "models_composed_metrics_df = metrics_composer.compose_metrics()" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/urllib3/__init__.py:34: NotOpenSSLWarning: urllib3 v2.0 only supports OpenSSL 1.1.1+, currently the 'ssl' module is compiled with 'LibreSSL 2.8.3'. See: https://github.com/urllib3/urllib3/issues/3020\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running on local URL: http://127.0.0.1:7860\n", + "\n", + "To create a public link, set `share=True` in `launch()`.\n" + ] + }, + { + "data": { + "text/plain": "" + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import altair as alt\n", + "import gradio as gr\n", + "import numpy as np\n", + "import pandas as pd\n", + "from vega_datasets import data\n", + "\n", + "\n", + "def make_plot(plot_type):\n", + " if plot_type == \"scatter_plot\":\n", + " cars = data.cars()\n", + " return alt.Chart(cars).mark_point().encode(\n", + " x='Horsepower',\n", + " y='Miles_per_Gallon',\n", + " color='Origin',\n", + " )\n", + " elif plot_type == \"heatmap\":\n", + " # Compute x^2 + y^2 across a 2D grid\n", + " x, y = np.meshgrid(range(-5, 5), range(-5, 5))\n", + " z = x ** 2 + y ** 2\n", + "\n", + " # Convert this grid to columnar data expected by Altair\n", + " source = pd.DataFrame({'x': x.ravel(),\n", + " 'y': y.ravel(),\n", + " 'z': z.ravel()})\n", + " return alt.Chart(source).mark_rect().encode(\n", + " x='x:O',\n", + " y='y:O',\n", + " color='z:Q'\n", + " )\n", + "\n", + "\n", + "with gr.Blocks() as demo:\n", + " button = gr.Radio(label=\"Plot type\",\n", + " choices=['scatter_plot', 'heatmap'], value='scatter_plot')\n", + " plot = gr.Plot(label=\"Plot\")\n", + " button.change(make_plot, inputs=button, outputs=[plot])\n", + " demo.load(make_plot, inputs=[button], outputs=[plot])\n", + "\n", + "\n", + "demo.launch(inline=False)" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2023-09-28T22:25:40.759154Z", + "start_time": "2023-09-28T22:25:39.629263Z" + } + }, + "id": "b9dad21b662edd59" + }, + { + "cell_type": "code", + "execution_count": 2, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Closing server running on port: 7860\n" + ] + } + ], + "source": [ + "demo.close()" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2023-09-28T22:26:12.203639Z", + "start_time": "2023-09-28T22:26:12.019693Z" + } + }, + "id": "920e2c1a81d4e810" + }, + { + "cell_type": "markdown", + "id": "deb45226", + "metadata": {}, + "source": [ + "## Metrics Visualization and Reporting" + ] + }, + { + "cell_type": "code", + "execution_count": 115, + "id": "435b9d98", + "metadata": { + "ExecuteTime": { + "end_time": "2023-09-30T22:20:33.545960Z", + "start_time": "2023-09-30T22:20:33.514242Z" + } + }, + "outputs": [], + "source": [ + "visualizer = MetricsInteractiveVisualizer(models_metrics_dct, models_composed_metrics_df, config.dataset_name,\n", + " model_names=model_names,\n", + " sensitive_attributes_dct=config.sensitive_attributes_dct)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running on local URL: http://127.0.0.1:7860\n", + "\n", + "To create a public link, set `share=True` in `launch()`.\n" + ] + } + ], + "source": [ + "visualizer.start_web_app()" + ], + "metadata": { + "collapsed": false, + "is_executing": true, + "ExecuteTime": { + "start_time": "2023-09-30T22:20:33.605579Z" + } + }, + "id": "678a9dc8d51243f4" + }, + { + "cell_type": "code", + "execution_count": 17, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Closing server running on port: 7860\n" + ] + } + ], + "source": [ + "visualizer.stop_web_app()" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2023-09-29T21:41:49.927075Z", + "start_time": "2023-09-29T21:41:49.639933Z" + } + }, + "id": "277b6d1de837dab7" + }, + { + "cell_type": "code", + "execution_count": 11, + "outputs": [ + { + "data": { + "text/plain": "" + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "text/plain": "
", + "image/png": "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IT788EO9PgwePJj09HRdX/9NrVaTl5end6hlv7Ab2rY/nhdHfaQ7yssrajslANLSM/j4p//j6SfaEBLkf/MKQjwgcnOymPfNRzRs0pLmEdXfHBFCCFG908e38Mc3/XXHlVUAtS330mm2/zWdBi364ezVuLbTEULcRzKjS9wSMzMzoqKiiIqKYty4cQwaNIgJEybc0uDPnQoKCmLFihUYGRnh6uqKiUnlHc7CwkI6duxIx44dWbhwIY6OjqSlpdGxY8cqG67fyibt1Rk0aBCNGzfm7NmzzJs3j8jISLy8vG5aT6VSceDAAWJiYvj7778ZP348EydOZO/evRQUVM6QWbVqFW5ubnr1TE2v3o0tKipi//79GBoacuLECb24+Ph4GjRogLGxMba2tqxfv57HH3+cnj17EhAQQKdOnXBxcblh/7t27YqXlxdz5szB1dWViooKGjZsqHvvzG+yJK2goIBJkybRq1evKueu7AP2b9OmTdM9QfOKUYOfY8yQ5294nUdZWIMgvScjlv2z/1lufgF21ipdeW5+IV6uTtW2YWVpgYGBQZUZXzkFhdhYVc7ysrFSodGUU1hcojerKze/QBdzxdkLmXz47QI6tAqj9xNt7q6DQvyLhaUVBgYGVTaeL8jPRWllW22dyplZOXpl+Xk5qKwr45XWNpVt5OViZX110L4gLxcXd2+9enm5l/nxy4l4+gTS67mhd9cZIe6CytQEA4WC3BL97zK51czausLKzJScazaqzylWY2NefbwQNcHVtzlP/OvJiBXllQ/KKSnKwVx59TNYXZSDtaN3tW2YmluhUBigLtL/t6CkKAczi8rPdjNLWyrKNZSqC/VmdZUU5VaZPZaXdYaYPybg1+gJ6rfoczfdE0I8gGRGl7gj9evXp7Cwchq9sbEx5eXleufr1aunt3k5wK5du27rGiYmJvj7++Pt7a0b5AI4fvw4WVlZTJ8+nccff5y6devqbUR/u9e4NneARo0aERYWxpw5c1i0aJHeUsmbMTIyokOHDnz88cfEx8eTmprKpk2bqF+/PqampqSlpeHv7693eHh46OqPGDECAwMD1qxZw6xZs9i06epmzG5ubsTFxZGfX/k0pTp16rBhwwYOHz7M559/zpQpU26YW1ZWFomJiYwdO5b27dtTr149srP1l/EEBwcTFxfH5cuXq20jNDSUxMTEKn3w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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "visualizer.create_model_rank_heatmap(\n", + " metrics_lst=[\n", + " # Group fairness metrics\n", + " 'Equalized_Odds_TPR',\n", + " 'Equalized_Odds_FPR',\n", + " 'Disparate_Impact',\n", + " 'Statistical_Parity_Difference',\n", + " 'Accuracy_Parity',\n", + " # Group stability metrics\n", + " 'Label_Stability_Ratio',\n", + " 'IQR_Parity',\n", + " 'Std_Parity',\n", + " 'Std_Ratio',\n", + " 'Jitter_Parity',\n", + " ],\n", + " groups_lst=config.sensitive_attributes_dct.keys(),\n", + ")" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2023-09-29T20:57:58.777407Z", + "start_time": "2023-09-29T20:57:58.303858Z" + } + }, + "id": "43fca999faac66af" + }, + { + "cell_type": "code", + "execution_count": 74, + "id": "5efb1bf2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": "\n
\n", + "text/plain": "alt.Chart(...)" + }, + "execution_count": 74, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "visualizer.create_overall_metrics_bar_char(\n", + " metrics_names=['TPR', 'PPV', 'Accuracy', 'F1', 'Selection-Rate', 'Positive-Rate'],\n", + " metrics_title=\"Error Metrics\"\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "id": "0eb8528e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": "\n
\n", + "text/plain": "alt.Chart(...)" + }, + "execution_count": 75, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "visualizer.create_overall_metrics_bar_char(\n", + " metrics_names=['Label_Stability'],\n", + " reversed_metrics_names=['Std', 'IQR', 'Jitter'],\n", + " metrics_title=\"Variance Metrics\"\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "id": "2326c129", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/examples/experiment_config.yaml b/docs/examples/experiment_config.yaml index 555d36db..44efa1b1 100644 --- a/docs/examples/experiment_config.yaml +++ b/docs/examples/experiment_config.yaml @@ -1,5 +1,5 @@ + dataset_name: COMPAS_Without_Sensitive_Attributes bootstrap_fraction: 0.8 n_estimators: 50 # Better to input the higher number of estimators than 100; this is only for this use case example -computation_mode: error_analysis sensitive_attributes_dct: {'sex': 1, 'race': 'African-American', 'sex&race': None} diff --git a/requirements.txt b/requirements.txt index 6e55b6af..4b2154bf 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,7 +2,7 @@ wheel~=0.38.4 twine~=4.0.2 requests-toolbelt==1.0.0 numpy~=1.24.2 -datapane~=0.15.5 +datapane~=0.16.0 matplotlib~=3.6.2 pandas~=1.5.2 altair~=4.2.0 diff --git a/virny/custom_classes/metrics_interactive_visualizer.py b/virny/custom_classes/metrics_interactive_visualizer.py new file mode 100644 index 00000000..574d0a91 --- /dev/null +++ b/virny/custom_classes/metrics_interactive_visualizer.py @@ -0,0 +1,120 @@ +import pandas as pd +import gradio as gr + +from virny.utils.data_viz_utils import create_model_rank_heatmap_visualization, create_sorted_matrix_by_rank + + +class MetricsInteractiveVisualizer: + """ + Class to create useful visualizations of models metrics. + + Parameters + ---------- + models_metrics_dct + Dictionary where keys are model names and values are dataframes of subgroup metrics for each model + models_composed_metrics_df + Dataframe of all model composed metrics + dataset_name + Name of a dataset that was included in metric filenames and was used for the metrics computation + model_names + Metrics for what model names to visualize + sensitive_attributes_dct + A dictionary where keys are sensitive attributes names (including attributes intersections), + and values are privilege values for these attributes + + """ + def __init__(self, models_metrics_dct: dict, models_composed_metrics_df: pd.DataFrame, + dataset_name: str, model_names: list, sensitive_attributes_dct: dict): + self.demo = None + self.dataset_name = dataset_name + self.model_names = model_names + self.sensitive_attributes_dct = sensitive_attributes_dct + + # Create one metrics df with all model_dfs + all_models_metrics_df = pd.DataFrame() + for model_name in models_metrics_dct.keys(): + model_metrics_df = models_metrics_dct[model_name] + all_models_metrics_df = pd.concat([all_models_metrics_df, model_metrics_df]) + + all_models_metrics_df = all_models_metrics_df.reset_index(drop=True) + + self.models_metrics_dct = models_metrics_dct + self.all_models_metrics_df = all_models_metrics_df + self.models_composed_metrics_df = models_composed_metrics_df + self.melted_models_composed_metrics_df = self.models_composed_metrics_df.melt(id_vars=["Metric", "Model_Name"], + var_name="Subgroup", + value_name="Value") + self.sorted_models_composed_metrics_df = self.melted_models_composed_metrics_df.sort_values(by=['Value']) + + def start_web_app(self): + css = """ + .plot_output1 {position: right !important} + """ + with gr.Blocks(css=css) as demo: + with gr.Row(): + with gr.Column(scale=1): + fairness_metrics = gr.Dropdown( + ['Equalized_Odds_TPR', 'Equalized_Odds_FPR', 'Disparate_Impact', 'Statistical_Parity_Difference', 'Accuracy_Parity'], + value=['Equalized_Odds_TPR', 'Equalized_Odds_FPR'], multiselect=True, label="Fairness Metrics", info="Select fairness metrics to display on the heatmap:", + ) + group_stability_metrics = gr.Dropdown( + ['Label_Stability_Ratio', 'IQR_Parity', 'Std_Parity', 'Std_Ratio', 'Jitter_Parity'], + value=['Label_Stability_Ratio', 'Std_Parity'], multiselect=True, label="Group Stability Metrics", info="Select group stability metrics to display on the heatmap:", + ) + btn = gr.Button("Submit") + with gr.Column(scale=2): + model_ranking_heatmap = gr.Plot(label="Plot") + + btn.click(self._create_model_rank_heatmap, + inputs=[fairness_metrics, group_stability_metrics], + outputs=[model_ranking_heatmap]) + + self.demo = demo + self.demo.launch(inline=False, debug=True, show_error=True) + + def stop_web_app(self): + self.demo.close() + + def _create_model_rank_heatmap(self, group_fairness_metrics_lst: list, group_stability_metrics_lst: list): + """ + Create a model rank heatmap. + + Parameters + ---------- + group_fairness_metrics_lst + A list of group fairness metrics to visualize + group_stability_metrics_lst + A list of group stability metrics to visualize + + """ + groups_lst = self.sensitive_attributes_dct.keys() + metrics_lst = group_fairness_metrics_lst + group_stability_metrics_lst + + # Find metric values for each model based on metric, group, and model names. + # Add the values to a results dict. + results = {} + num_models = len(self.model_names) + for metric in metrics_lst: + for group in groups_lst: + group_metric = metric + '_' + group + results[group_metric] = dict() + # Get distinct sorted model names + sorted_model_names_arr = self.sorted_models_composed_metrics_df[ + (self.sorted_models_composed_metrics_df.Metric == metric) & + (self.sorted_models_composed_metrics_df.Subgroup == group) + ]['Model_Name'].values + # Add values to a results dict + for idx, model_name in enumerate(sorted_model_names_arr): + metric_value = self.sorted_models_composed_metrics_df[ + (self.sorted_models_composed_metrics_df.Metric == metric) & + (self.sorted_models_composed_metrics_df.Subgroup == group) & + (self.sorted_models_composed_metrics_df.Model_Name == model_name) + ]['Value'].values[0] + metric_value = round(metric_value, 3) + results[group_metric][model_name] = metric_value + + model_metrics_matrix = pd.DataFrame(results).T + sorted_matrix_by_rank = create_sorted_matrix_by_rank(model_metrics_matrix) + model_rank_heatmap, _ = create_model_rank_heatmap_visualization(model_metrics_matrix, sorted_matrix_by_rank, num_models) + + return model_rank_heatmap diff --git a/virny/custom_classes/metrics_visualizer.py b/virny/custom_classes/metrics_visualizer.py index e895b493..377bcdf9 100644 --- a/virny/custom_classes/metrics_visualizer.py +++ b/virny/custom_classes/metrics_visualizer.py @@ -8,6 +8,7 @@ from datetime import datetime, timezone from virny.configs.constants import ReportType +from virny.utils.data_viz_utils import create_sorted_matrix_by_rank class MetricsVisualizer: @@ -252,19 +253,6 @@ def create_fairness_variance_interactive_bar_chart(self): ) ) - @staticmethod - def _create_sorted_matrix_by_rank(model_metrics_matrix) -> np.array: - models_distances_matrix = model_metrics_matrix.copy(deep=True).T - metric_names = models_distances_matrix.columns - for metric_name in metric_names: - if 'impact' in metric_name.lower() or 'ratio' in metric_name.lower(): - models_distances_matrix[metric_name] = models_distances_matrix[metric_name] - 1 - models_distances_matrix[metric_name] = models_distances_matrix[metric_name].abs() - - models_distances_matrix = models_distances_matrix.T - sorted_matrix_by_rank = np.argsort(np.argsort(models_distances_matrix, axis=1), axis=1) - return sorted_matrix_by_rank - def create_model_rank_heatmap(self, model_metrics_matrix, sorted_matrix_by_rank, num_models: int): """ This heatmap includes all group fairness and stability metrics and all defined models. @@ -385,7 +373,7 @@ def create_model_rank_heatmaps(self, metrics_lst: list, groups_lst): results[group_metric][model_name] = metric_value model_metrics_matrix = pd.DataFrame(results).T - sorted_matrix_by_rank = MetricsVisualizer._create_sorted_matrix_by_rank(model_metrics_matrix) + sorted_matrix_by_rank = create_sorted_matrix_by_rank(model_metrics_matrix) model_rank_heatmap = self.create_model_rank_heatmap(model_metrics_matrix, sorted_matrix_by_rank, num_models) total_model_rank_heatmap = self.create_total_model_rank_heatmap(sorted_matrix_by_rank, num_models) if self.__create_report: diff --git a/virny/utils/data_viz_utils.py b/virny/utils/data_viz_utils.py index ddf397e0..9895d84a 100644 --- a/virny/utils/data_viz_utils.py +++ b/virny/utils/data_viz_utils.py @@ -1,6 +1,5 @@ -import os -import pandas as pd import seaborn as sns +import numpy as np from matplotlib import pyplot as plt @@ -29,76 +28,59 @@ def plot_generic(x, y, xlabel, ylabel, x_lim, y_lim, plot_title): plt.show() -def create_average_metrics_df(dataset_name, model_names, metrics_path): - results_filenames = [filename for filename in os.listdir(metrics_path)] - models_average_results_dct = dict() - for model_name in model_names: - model_results_filenames = [filename for filename in results_filenames if 'Average_Metrics' not in filename - and dataset_name in filename - and model_name in filename] - - if len(model_results_filenames) == 0: - continue - - model_results_dfs = [] - for model_results_filename in model_results_filenames: - model_results_df = pd.read_csv(f'{metrics_path}/{model_results_filename}') - model_results_df.set_index('index', inplace = True) - model_results_dfs.append(model_results_df) - - model_average_results_df = None - for model_results_df in model_results_dfs: - if model_average_results_df is None: - model_average_results_df = model_results_df - else: - model_average_results_df += model_results_df - - model_average_results_df = model_average_results_df / len(model_results_dfs) - models_average_results_dct[model_name] = model_average_results_df - - filename = f'Average_Metrics_{dataset_name}_{model_name}.csv' - model_average_results_df.reset_index().to_csv(f'{metrics_path}/{filename}', index=False) - print(f'File with average metrics for {model_name} is created') - - return models_average_results_dct - - -def visualize_fairness_metrics_for_prediction_metric(models_average_results_dct, x_metric, y_metrics: list): - sns.set_style("darkgrid") - x_lim = 0.5 - y_lim = 0.22 - priv_dis_pairs = [('SEX_RAC1P_priv', 'SEX_RAC1P_dis'), - ('SEX_priv', 'SEX_dis'), - ('RAC1P_priv', 'RAC1P_dis')] - for y_metric in y_metrics: - for fairness_metric_priv, fairness_metric_dis in priv_dis_pairs: - display_fairness_plot(models_average_results_dct, x_metric, y_metric, - fairness_metric_priv, fairness_metric_dis, x_lim, y_lim) - - -def display_fairness_plot(models_average_results_dct, x_metric, y_metric, - fairness_metric_priv, fairness_metric_dis, x_lim, y_lim): - fig, ax = plt.subplots() - set_size(15, 8, ax) - - # List of all markers -- https://matplotlib.org/stable/api/markers_api.html - markers = ['o', '*', '|', '<', '>', '^', 'v', '1', 's', 'x', 'D', 'P', 'H'] - model_names = models_average_results_dct.keys() - shapes = [] - for idx, model_name in enumerate(model_names): - x_val = abs(models_average_results_dct[model_name][fairness_metric_priv].loc[x_metric] - \ - models_average_results_dct[model_name][fairness_metric_dis].loc[x_metric]) - y_val = abs(models_average_results_dct[model_name][fairness_metric_priv].loc[y_metric] - \ - models_average_results_dct[model_name][fairness_metric_dis].loc[y_metric]) - a = ax.scatter(x_val, y_val, marker=markers[idx], s=100) - shapes.append(a) - - plt.axhline(y=0.0, color='r', linestyle='-') - plt.xlabel(f'{x_metric} Difference') - plt.ylabel(f'{y_metric} Difference') - plt.xlim(-0.01, x_lim) - plt.ylim(-0.01, y_lim) - plt.title(f'{fairness_metric_priv}-{fairness_metric_dis} difference for {x_metric} and {y_metric}', fontsize=20) - ax.legend(shapes, model_names, fontsize=12, title='Markers') - - plt.show() +def create_sorted_matrix_by_rank(model_metrics_matrix) -> np.array: + models_distances_matrix = model_metrics_matrix.copy(deep=True).T + metric_names = models_distances_matrix.columns + for metric_name in metric_names: + if 'impact' in metric_name.lower() or 'ratio' in metric_name.lower(): + models_distances_matrix[metric_name] = models_distances_matrix[metric_name] - 1 + models_distances_matrix[metric_name] = models_distances_matrix[metric_name].abs() + + models_distances_matrix = models_distances_matrix.T + sorted_matrix_by_rank = np.argsort(np.argsort(models_distances_matrix, axis=1), axis=1) + return sorted_matrix_by_rank + + +def create_model_rank_heatmap_visualization(model_metrics_matrix, sorted_matrix_by_rank, num_models: int): + """ + This heatmap includes group fairness and stability metrics and defined models. + Using it, you can visually compare the models across defined group metrics. On this plot, + colors display ranks where 1 is the best model for the metric. These ranks are conditioned + on difference or ratio operations used to create these group metrics: + + 1) if the metric is created based on the difference operation, closer values to zero have ranks that are closer to the first rank + + 2) if the metric is created based on the ratio operation, closer values to one have ranks that are closer to the first rank + + Parameters + ---------- + model_metrics_matrix + Matrix of model metrics values where indexes are group metric names and columns are model names + sorted_matrix_by_rank + Matrix of model ranks per metric where indexes are group metric names and columns are model names + num_models + Number of models to visualize + + """ + font_increase = 2 + matrix_width = num_models * 5 + matrix_height = model_metrics_matrix.shape[0] // 1.5 + fig = plt.figure(figsize=(matrix_width, matrix_height)) + rank_colors = sns.color_palette("coolwarm", n_colors=num_models).as_hex()[::-1] + ax = sns.heatmap(sorted_matrix_by_rank, annot=model_metrics_matrix, cmap=rank_colors, + fmt='', annot_kws={'color': 'black', 'alpha': 0.7, 'fontsize': 16 + font_increase}) + ax.set(xlabel="", ylabel="") + ax.xaxis.tick_top() + ax.tick_params(labelsize=16 + font_increase) + fig.subplots_adjust(left=0.25, top=0.9) + + cbar = ax.collections[0].colorbar + model_ranks = [idx for idx in range(num_models)] + cbar.set_ticks([float(idx) for idx in model_ranks]) + tick_labels = [str(idx + 1) for idx in model_ranks] + tick_labels[0] = tick_labels[0] + ', best' + tick_labels[-1] = tick_labels[-1] + ', worst' + cbar.set_ticklabels(tick_labels, fontsize=16 + font_increase) + cbar.set_label('Model Ranks', fontsize=18 + font_increase) + + return fig, ax From c84456ef7d80660f696f985dd9b3375122fb94cb Mon Sep 17 00:00:00 2001 From: Denys Herasymuk Date: Sun, 1 Oct 2023 22:46:45 +0300 Subject: [PATCH 02/36] Created subgroup and group heatmaps --- .../Multiple_Models_Interface_Vis.ipynb | 63 +++++- .../metrics_interactive_visualizer.py | 207 ++++++++++++++---- virny/utils/common_helpers.py | 9 + virny/utils/data_viz_utils.py | 22 +- 4 files changed, 246 insertions(+), 55 deletions(-) diff --git a/docs/examples/Multiple_Models_Interface_Vis.ipynb b/docs/examples/Multiple_Models_Interface_Vis.ipynb index e75f0a48..57d67263 100644 --- a/docs/examples/Multiple_Models_Interface_Vis.ipynb +++ b/docs/examples/Multiple_Models_Interface_Vis.ipynb @@ -276,6 +276,58 @@ }, "id": "920e2c1a81d4e810" }, + { + "cell_type": "code", + "execution_count": 133, + "outputs": [ + { + "data": { + "text/plain": " Metric overall sex_priv sex_priv_correct \\\n0 Mean 0.524270 0.578645 0.600790 \n1 Std 0.067963 0.073618 0.072201 \n2 IQR 0.090596 0.099782 0.098402 \n3 Aleatoric_Uncertainty 0.834874 0.846689 0.826891 \n4 Overall_Uncertainty 0.859083 0.876581 0.856843 \n5 Statistical_Bias 0.405041 0.395811 0.314809 \n6 Jitter 0.106917 0.132090 0.112864 \n7 Per_Sample_Accuracy 0.691061 0.711090 0.918452 \n8 Label_Stability 0.851667 0.807393 0.836903 \n9 TPR 0.679406 0.613333 1.000000 \n10 TNR 0.738462 0.801471 1.000000 \n11 PPV 0.676533 0.630137 1.000000 \n12 FNR 0.320594 0.386667 0.000000 \n13 FPR 0.261538 0.198529 0.000000 \n14 Accuracy 0.712121 0.734597 1.000000 \n15 F1 0.677966 0.621622 1.000000 \n16 Selection-Rate 0.447917 0.345972 0.296774 \n17 Positive-Rate 1.004246 0.973333 1.000000 \n18 Sample_Size 1056.000000 211.000000 155.000000 \n\n sex_priv_incorrect sex_dis sex_dis_correct sex_dis_incorrect \\\n0 0.517352 0.510692 0.514399 0.501767 \n1 0.077539 0.066551 0.064791 0.070788 \n2 0.103600 0.088303 0.085977 0.093900 \n3 0.901488 0.831924 0.817170 0.867440 \n4 0.931213 0.854713 0.839203 0.892051 \n5 0.620012 0.407346 0.301656 0.661771 \n6 0.185306 0.100631 0.091351 0.122972 \n7 0.137143 0.686059 0.936918 0.082177 \n8 0.725714 0.862722 0.873970 0.835645 \n9 0.000000 0.691919 1.000000 0.000000 \n10 0.000000 0.719376 1.000000 0.000000 \n11 0.000000 0.685000 1.000000 0.000000 \n12 1.000000 0.308081 0.000000 1.000000 \n13 1.000000 0.280624 0.000000 1.000000 \n14 0.000000 0.706509 1.000000 0.000000 \n15 0.000000 0.688442 1.000000 0.000000 \n16 0.482143 0.473373 0.458961 0.508065 \n17 0.931034 1.010101 1.000000 1.032787 \n18 56.000000 845.000000 597.000000 248.000000 \n\n race_priv race_priv_correct ... race_dis_correct race_dis_incorrect \\\n0 0.597526 0.618185 ... 0.473863 0.484344 \n1 0.069162 0.066865 ... 0.065947 0.070060 \n2 0.093184 0.089451 ... 0.087919 0.091258 \n3 0.821672 0.807043 ... 0.827404 0.880296 \n4 0.847778 0.832001 ... 0.850193 0.903737 \n5 0.393484 0.296788 ... 0.309510 0.650314 \n6 0.107225 0.097218 ... 0.094812 0.134214 \n7 0.708261 0.930526 ... 0.934866 0.091340 \n8 0.848213 0.861316 ... 0.869732 0.817320 \n9 0.585034 1.000000 ... 1.000000 0.000000 \n10 0.816479 1.000000 ... 1.000000 0.000000 \n11 0.637037 1.000000 ... 1.000000 0.000000 \n12 0.414966 0.000000 ... 0.000000 1.000000 \n13 0.183521 0.000000 ... 0.000000 1.000000 \n14 0.734300 1.000000 ... 1.000000 0.000000 \n15 0.609929 1.000000 ... 1.000000 0.000000 \n16 0.326087 0.282895 ... 0.522321 0.536082 \n17 0.918367 1.000000 ... 1.000000 1.155556 \n18 414.000000 304.000000 ... 448.000000 194.000000 \n\n sex&race_priv sex&race_priv_correct sex&race_priv_incorrect \\\n0 0.586391 0.607290 0.529874 \n1 0.068718 0.066018 0.076019 \n2 0.092020 0.088338 0.101975 \n3 0.832383 0.817398 0.872906 \n4 0.857995 0.841790 0.901818 \n5 0.396398 0.302520 0.650263 \n6 0.108871 0.095304 0.145559 \n7 0.708783 0.933073 0.102254 \n8 0.847224 0.866354 0.795493 \n9 0.595745 1.000000 0.000000 \n10 0.804734 1.000000 0.000000 \n11 0.629213 1.000000 0.000000 \n12 0.404255 0.000000 1.000000 \n13 0.195266 0.000000 1.000000 \n14 0.730038 1.000000 0.000000 \n15 0.612022 1.000000 0.000000 \n16 0.338403 0.291667 0.464789 \n17 0.946809 1.000000 0.868421 \n18 526.000000 384.000000 142.000000 \n\n sex&race_dis sex&race_dis_correct sex&race_dis_incorrect \\\n0 0.462617 0.453857 0.482517 \n1 0.067213 0.066631 0.068536 \n2 0.089184 0.088747 0.090175 \n3 0.837346 0.821026 0.874418 \n4 0.860162 0.843933 0.897027 \n5 0.413620 0.306294 0.657422 \n6 0.104978 0.096287 0.124722 \n7 0.673472 0.933152 0.083580 \n8 0.856075 0.866304 0.832840 \n9 0.734982 1.000000 0.000000 \n10 0.647773 1.000000 0.000000 \n11 0.705085 1.000000 0.000000 \n12 0.265018 0.000000 1.000000 \n13 0.352227 0.000000 1.000000 \n14 0.694340 1.000000 0.000000 \n15 0.719723 1.000000 0.000000 \n16 0.556604 0.565217 0.537037 \n17 1.042403 1.000000 1.160000 \n18 530.000000 368.000000 162.000000 \n\n Model_Name Model_Params \n0 RandomForestClassifier {'bootstrap': True, 'ccp_alpha': 0.0, 'class_w... \n1 RandomForestClassifier {'bootstrap': True, 'ccp_alpha': 0.0, 'class_w... \n2 RandomForestClassifier {'bootstrap': True, 'ccp_alpha': 0.0, 'class_w... \n3 RandomForestClassifier {'bootstrap': True, 'ccp_alpha': 0.0, 'class_w... \n4 RandomForestClassifier {'bootstrap': True, 'ccp_alpha': 0.0, 'class_w... \n5 RandomForestClassifier {'bootstrap': True, 'ccp_alpha': 0.0, 'class_w... \n6 RandomForestClassifier {'bootstrap': True, 'ccp_alpha': 0.0, 'class_w... \n7 RandomForestClassifier {'bootstrap': True, 'ccp_alpha': 0.0, 'class_w... \n8 RandomForestClassifier {'bootstrap': True, 'ccp_alpha': 0.0, 'class_w... \n9 RandomForestClassifier {'bootstrap': True, 'ccp_alpha': 0.0, 'class_w... \n10 RandomForestClassifier {'bootstrap': True, 'ccp_alpha': 0.0, 'class_w... \n11 RandomForestClassifier {'bootstrap': True, 'ccp_alpha': 0.0, 'class_w... \n12 RandomForestClassifier {'bootstrap': True, 'ccp_alpha': 0.0, 'class_w... \n13 RandomForestClassifier {'bootstrap': True, 'ccp_alpha': 0.0, 'class_w... \n14 RandomForestClassifier {'bootstrap': True, 'ccp_alpha': 0.0, 'class_w... \n15 RandomForestClassifier {'bootstrap': True, 'ccp_alpha': 0.0, 'class_w... \n16 RandomForestClassifier {'bootstrap': True, 'ccp_alpha': 0.0, 'class_w... \n17 RandomForestClassifier {'bootstrap': True, 'ccp_alpha': 0.0, 'class_w... \n18 RandomForestClassifier {'bootstrap': True, 'ccp_alpha': 0.0, 'class_w... \n\n[19 rows x 22 columns]", + "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
Metricoverallsex_privsex_priv_correctsex_priv_incorrectsex_dissex_dis_correctsex_dis_incorrectrace_privrace_priv_correct...race_dis_correctrace_dis_incorrectsex&race_privsex&race_priv_correctsex&race_priv_incorrectsex&race_dissex&race_dis_correctsex&race_dis_incorrectModel_NameModel_Params
0Mean0.5242700.5786450.6007900.5173520.5106920.5143990.5017670.5975260.618185...0.4738630.4843440.5863910.6072900.5298740.4626170.4538570.482517RandomForestClassifier{'bootstrap': True, 'ccp_alpha': 0.0, 'class_w...
1Std0.0679630.0736180.0722010.0775390.0665510.0647910.0707880.0691620.066865...0.0659470.0700600.0687180.0660180.0760190.0672130.0666310.068536RandomForestClassifier{'bootstrap': True, 'ccp_alpha': 0.0, 'class_w...
2IQR0.0905960.0997820.0984020.1036000.0883030.0859770.0939000.0931840.089451...0.0879190.0912580.0920200.0883380.1019750.0891840.0887470.090175RandomForestClassifier{'bootstrap': True, 'ccp_alpha': 0.0, 'class_w...
3Aleatoric_Uncertainty0.8348740.8466890.8268910.9014880.8319240.8171700.8674400.8216720.807043...0.8274040.8802960.8323830.8173980.8729060.8373460.8210260.874418RandomForestClassifier{'bootstrap': True, 'ccp_alpha': 0.0, 'class_w...
4Overall_Uncertainty0.8590830.8765810.8568430.9312130.8547130.8392030.8920510.8477780.832001...0.8501930.9037370.8579950.8417900.9018180.8601620.8439330.897027RandomForestClassifier{'bootstrap': True, 'ccp_alpha': 0.0, 'class_w...
5Statistical_Bias0.4050410.3958110.3148090.6200120.4073460.3016560.6617710.3934840.296788...0.3095100.6503140.3963980.3025200.6502630.4136200.3062940.657422RandomForestClassifier{'bootstrap': True, 'ccp_alpha': 0.0, 'class_w...
6Jitter0.1069170.1320900.1128640.1853060.1006310.0913510.1229720.1072250.097218...0.0948120.1342140.1088710.0953040.1455590.1049780.0962870.124722RandomForestClassifier{'bootstrap': True, 'ccp_alpha': 0.0, 'class_w...
7Per_Sample_Accuracy0.6910610.7110900.9184520.1371430.6860590.9369180.0821770.7082610.930526...0.9348660.0913400.7087830.9330730.1022540.6734720.9331520.083580RandomForestClassifier{'bootstrap': True, 'ccp_alpha': 0.0, 'class_w...
8Label_Stability0.8516670.8073930.8369030.7257140.8627220.8739700.8356450.8482130.861316...0.8697320.8173200.8472240.8663540.7954930.8560750.8663040.832840RandomForestClassifier{'bootstrap': True, 'ccp_alpha': 0.0, 'class_w...
9TPR0.6794060.6133331.0000000.0000000.6919191.0000000.0000000.5850341.000000...1.0000000.0000000.5957451.0000000.0000000.7349821.0000000.000000RandomForestClassifier{'bootstrap': True, 'ccp_alpha': 0.0, 'class_w...
10TNR0.7384620.8014711.0000000.0000000.7193761.0000000.0000000.8164791.000000...1.0000000.0000000.8047341.0000000.0000000.6477731.0000000.000000RandomForestClassifier{'bootstrap': True, 'ccp_alpha': 0.0, 'class_w...
11PPV0.6765330.6301371.0000000.0000000.6850001.0000000.0000000.6370371.000000...1.0000000.0000000.6292131.0000000.0000000.7050851.0000000.000000RandomForestClassifier{'bootstrap': True, 'ccp_alpha': 0.0, 'class_w...
12FNR0.3205940.3866670.0000001.0000000.3080810.0000001.0000000.4149660.000000...0.0000001.0000000.4042550.0000001.0000000.2650180.0000001.000000RandomForestClassifier{'bootstrap': True, 'ccp_alpha': 0.0, 'class_w...
13FPR0.2615380.1985290.0000001.0000000.2806240.0000001.0000000.1835210.000000...0.0000001.0000000.1952660.0000001.0000000.3522270.0000001.000000RandomForestClassifier{'bootstrap': True, 'ccp_alpha': 0.0, 'class_w...
14Accuracy0.7121210.7345971.0000000.0000000.7065091.0000000.0000000.7343001.000000...1.0000000.0000000.7300381.0000000.0000000.6943401.0000000.000000RandomForestClassifier{'bootstrap': True, 'ccp_alpha': 0.0, 'class_w...
15F10.6779660.6216221.0000000.0000000.6884421.0000000.0000000.6099291.000000...1.0000000.0000000.6120221.0000000.0000000.7197231.0000000.000000RandomForestClassifier{'bootstrap': True, 'ccp_alpha': 0.0, 'class_w...
16Selection-Rate0.4479170.3459720.2967740.4821430.4733730.4589610.5080650.3260870.282895...0.5223210.5360820.3384030.2916670.4647890.5566040.5652170.537037RandomForestClassifier{'bootstrap': True, 'ccp_alpha': 0.0, 'class_w...
17Positive-Rate1.0042460.9733331.0000000.9310341.0101011.0000001.0327870.9183671.000000...1.0000001.1555560.9468091.0000000.8684211.0424031.0000001.160000RandomForestClassifier{'bootstrap': True, 'ccp_alpha': 0.0, 'class_w...
18Sample_Size1056.000000211.000000155.00000056.000000845.000000597.000000248.000000414.000000304.000000...448.000000194.000000526.000000384.000000142.000000530.000000368.000000162.000000RandomForestClassifier{'bootstrap': True, 'ccp_alpha': 0.0, 'class_w...
\n

19 rows × 22 columns

\n
" + }, + "execution_count": 133, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "models_metrics_dct['RandomForestClassifier'].head(20)" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2023-10-01T11:25:45.963770Z", + "start_time": "2023-10-01T11:25:45.421681Z" + } + }, + "id": "54a73b4d053334b4" + }, + { + "cell_type": "code", + "execution_count": 135, + "outputs": [ + { + "data": { + "text/plain": " Metric sex race sex&race \\\n0 Equalized_Odds_TPR 0.211919 0.195326 0.183576 \n1 Equalized_Odds_FPR 0.098356 0.104728 0.141078 \n2 Equalized_Odds_FNR -0.211919 -0.195326 -0.183576 \n3 Disparate_Impact 1.234115 1.135965 1.125105 \n4 Statistical_Parity_Difference 0.193535 0.123016 0.115123 \n5 Accuracy_Parity 0.009832 0.006840 -0.010984 \n6 Label_Stability_Ratio 1.024740 0.997454 0.995869 \n7 IQR_Parity 0.000768 -0.004804 -0.003282 \n8 Std_Parity -0.005106 -0.000927 -0.001976 \n9 Std_Ratio 0.931699 0.986984 0.972422 \n10 Jitter_Parity -0.013818 0.007192 0.005364 \n11 Equalized_Odds_TPR 0.166465 0.258440 0.226205 \n12 Equalized_Odds_FPR 0.096129 0.156703 0.186079 \n13 Equalized_Odds_FNR -0.166465 -0.258440 -0.226205 \n14 Disparate_Impact 1.176075 1.341036 1.263916 \n15 Statistical_Parity_Difference 0.145556 0.262157 0.216187 \n16 Accuracy_Parity -0.010286 -0.003747 -0.024119 \n17 Label_Stability_Ratio 1.021988 0.988991 1.003152 \n18 IQR_Parity 0.001712 0.001225 0.001058 \n19 Std_Parity 0.000822 0.000278 0.000170 \n\n Model_Name \n0 DecisionTreeClassifier \n1 DecisionTreeClassifier \n2 DecisionTreeClassifier \n3 DecisionTreeClassifier \n4 DecisionTreeClassifier \n5 DecisionTreeClassifier \n6 DecisionTreeClassifier \n7 DecisionTreeClassifier \n8 DecisionTreeClassifier \n9 DecisionTreeClassifier \n10 DecisionTreeClassifier \n11 LogisticRegression \n12 LogisticRegression \n13 LogisticRegression \n14 LogisticRegression \n15 LogisticRegression \n16 LogisticRegression \n17 LogisticRegression \n18 LogisticRegression \n19 LogisticRegression ", + "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
Metricsexracesex&raceModel_Name
0Equalized_Odds_TPR0.2119190.1953260.183576DecisionTreeClassifier
1Equalized_Odds_FPR0.0983560.1047280.141078DecisionTreeClassifier
2Equalized_Odds_FNR-0.211919-0.195326-0.183576DecisionTreeClassifier
3Disparate_Impact1.2341151.1359651.125105DecisionTreeClassifier
4Statistical_Parity_Difference0.1935350.1230160.115123DecisionTreeClassifier
5Accuracy_Parity0.0098320.006840-0.010984DecisionTreeClassifier
6Label_Stability_Ratio1.0247400.9974540.995869DecisionTreeClassifier
7IQR_Parity0.000768-0.004804-0.003282DecisionTreeClassifier
8Std_Parity-0.005106-0.000927-0.001976DecisionTreeClassifier
9Std_Ratio0.9316990.9869840.972422DecisionTreeClassifier
10Jitter_Parity-0.0138180.0071920.005364DecisionTreeClassifier
11Equalized_Odds_TPR0.1664650.2584400.226205LogisticRegression
12Equalized_Odds_FPR0.0961290.1567030.186079LogisticRegression
13Equalized_Odds_FNR-0.166465-0.258440-0.226205LogisticRegression
14Disparate_Impact1.1760751.3410361.263916LogisticRegression
15Statistical_Parity_Difference0.1455560.2621570.216187LogisticRegression
16Accuracy_Parity-0.010286-0.003747-0.024119LogisticRegression
17Label_Stability_Ratio1.0219880.9889911.003152LogisticRegression
18IQR_Parity0.0017120.0012250.001058LogisticRegression
19Std_Parity0.0008220.0002780.000170LogisticRegression
\n
" + }, + "execution_count": 135, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "models_composed_metrics_df.head(20)" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2023-10-01T11:29:37.410638Z", + "start_time": "2023-10-01T11:29:37.382980Z" + } + }, + "id": "5798eb95fbeaea54" + }, { "cell_type": "markdown", "id": "deb45226", @@ -286,18 +338,17 @@ }, { "cell_type": "code", - "execution_count": 115, + "execution_count": 169, "id": "435b9d98", "metadata": { "ExecuteTime": { - "end_time": "2023-09-30T22:20:33.545960Z", - "start_time": "2023-09-30T22:20:33.514242Z" + "end_time": "2023-10-01T19:42:30.098766Z", + "start_time": "2023-10-01T19:42:30.039734Z" } }, "outputs": [], "source": [ - "visualizer = MetricsInteractiveVisualizer(models_metrics_dct, models_composed_metrics_df, config.dataset_name,\n", - " model_names=model_names,\n", + "visualizer = MetricsInteractiveVisualizer(models_metrics_dct, models_composed_metrics_df,\n", " sensitive_attributes_dct=config.sensitive_attributes_dct)" ] }, @@ -322,7 +373,7 @@ "collapsed": false, "is_executing": true, "ExecuteTime": { - "start_time": "2023-09-30T22:20:33.605579Z" + "start_time": "2023-10-01T19:42:30.126790Z" } }, "id": "678a9dc8d51243f4" diff --git a/virny/custom_classes/metrics_interactive_visualizer.py b/virny/custom_classes/metrics_interactive_visualizer.py index 574d0a91..40a2beab 100644 --- a/virny/custom_classes/metrics_interactive_visualizer.py +++ b/virny/custom_classes/metrics_interactive_visualizer.py @@ -1,7 +1,8 @@ import pandas as pd import gradio as gr -from virny.utils.data_viz_utils import create_model_rank_heatmap_visualization, create_sorted_matrix_by_rank +from virny.utils.data_viz_utils import (create_model_rank_heatmap_visualization, create_sorted_matrix_by_rank, + create_subgroup_sorted_matrix_by_rank) class MetricsInteractiveVisualizer: @@ -10,64 +11,118 @@ class MetricsInteractiveVisualizer: Parameters ---------- - models_metrics_dct + model_metrics_dct Dictionary where keys are model names and values are dataframes of subgroup metrics for each model - models_composed_metrics_df + model_composed_metrics_df Dataframe of all model composed metrics - dataset_name - Name of a dataset that was included in metric filenames and was used for the metrics computation - model_names - Metrics for what model names to visualize sensitive_attributes_dct A dictionary where keys are sensitive attributes names (including attributes intersections), and values are privilege values for these attributes """ - def __init__(self, models_metrics_dct: dict, models_composed_metrics_df: pd.DataFrame, - dataset_name: str, model_names: list, sensitive_attributes_dct: dict): + def __init__(self, model_metrics_dct: dict, model_composed_metrics_df: pd.DataFrame, + sensitive_attributes_dct: dict): self.demo = None - self.dataset_name = dataset_name - self.model_names = model_names + self.model_names = list(model_metrics_dct.keys()) self.sensitive_attributes_dct = sensitive_attributes_dct # Create one metrics df with all model_dfs - all_models_metrics_df = pd.DataFrame() - for model_name in models_metrics_dct.keys(): - model_metrics_df = models_metrics_dct[model_name] - all_models_metrics_df = pd.concat([all_models_metrics_df, model_metrics_df]) - - all_models_metrics_df = all_models_metrics_df.reset_index(drop=True) - - self.models_metrics_dct = models_metrics_dct - self.all_models_metrics_df = all_models_metrics_df - self.models_composed_metrics_df = models_composed_metrics_df - self.melted_models_composed_metrics_df = self.models_composed_metrics_df.melt(id_vars=["Metric", "Model_Name"], - var_name="Subgroup", - value_name="Value") - self.sorted_models_composed_metrics_df = self.melted_models_composed_metrics_df.sort_values(by=['Value']) - + models_metrics_df = pd.DataFrame() + for model_name in model_metrics_dct.keys(): + model_metrics_df = model_metrics_dct[model_name] + models_metrics_df = pd.concat([models_metrics_df, model_metrics_df]) + + models_metrics_df = models_metrics_df.reset_index(drop=True) + + self.models_metrics_dct = model_metrics_dct + self.models_metrics_df = self._align_input_metric_df(models_metrics_df, allowed_cols=["Metric", "Model_Name"], + sensitive_attrs=list(self.sensitive_attributes_dct.keys())) + self.model_composed_metrics_df = self._align_input_metric_df(model_composed_metrics_df, allowed_cols=["Metric", "Model_Name"], + sensitive_attrs=list(self.sensitive_attributes_dct.keys())) + + melted_model_metrics_df = self.models_metrics_df.melt(id_vars=["Metric", "Model_Name"], + var_name="Subgroup", + value_name="Value") + self.sorted_model_metrics_df = melted_model_metrics_df.sort_values(by=['Value']) + melted_model_composed_metrics_df = self.model_composed_metrics_df.melt(id_vars=["Metric", "Model_Name"], + var_name="Subgroup", + value_name="Value") + self.sorted_model_composed_metrics_df = melted_model_composed_metrics_df.sort_values(by=['Value']) + + def _align_input_metric_df(self, model_metrics_df: pd.DataFrame, allowed_cols: list, sensitive_attrs: list): + # Filter columns in the input dataframe based on allowed_cols and sensitive_attrs + filtered_cols = allowed_cols + for col in model_metrics_df.columns: + for sensitive_attr in sensitive_attrs: + if sensitive_attr in col: + filtered_cols.append(col) + break + + return model_metrics_df[filtered_cols] + def start_web_app(self): - css = """ - .plot_output1 {position: right !important} - """ - with gr.Blocks(css=css) as demo: + # css = """ + # .plot_output1 {position: right !important} + # """ + with gr.Blocks(theme=gr.themes.Soft()) as demo: + # ======================================= Subgroup Metrics Heatmap ======================================= + gr.Markdown( + """ + ## Subgroup Metrics Heatmap + Select input arguments to create a subgroup metrics heatmap. + """) + with gr.Row(): + with gr.Column(scale=1): + model_names = gr.Dropdown( + self.model_names, value=self.model_names[:4], max_choices=5, multiselect=True, + label="Model Names", info="Select model names to display on the heatmap:", + ) + accuracy_metrics = gr.Dropdown( + ['Statistical_Bias', 'TPR', 'TNR', 'PPV', 'FNR', 'FPR', 'Accuracy', 'F1'], + value=['Accuracy', 'F1'], multiselect=True, label="Accuracy Metrics", info="Select accuracy metrics to display on the heatmap:", + ) + uncertainty_metrics = gr.Dropdown( + ['Aleatoric_Uncertainty', 'Overall_Uncertainty'], + value=['Aleatoric_Uncertainty', 'Overall_Uncertainty'], multiselect=True, label="Uncertainty Metrics", info="Select uncertainty metrics to display on the heatmap:", + ) + subgroup_stability_metrics = gr.Dropdown( + ['Std', 'IQR', 'Jitter', 'Label_Stability'], + value=['Jitter', 'Label_Stability'], multiselect=True, label="Stability Metrics", info="Select stability metrics to display on the heatmap:", + ) + btn = gr.Button("Submit") + with gr.Column(scale=2): + subgroup_model_ranking_heatmap = gr.Plot(label="Plot") + + btn.click(self._create_subgroup_model_rank_heatmap, + inputs=[model_names, accuracy_metrics, uncertainty_metrics, subgroup_stability_metrics], + outputs=[subgroup_model_ranking_heatmap]) + # ======================================== Group Metrics Heatmap ======================================== + gr.Markdown( + """ + ## Group Metrics Heatmap + Select input arguments to create a group metrics heatmap. + """) with gr.Row(): with gr.Column(scale=1): + model_names = gr.Dropdown( + self.model_names, value=self.model_names[:4], max_choices=5, multiselect=True, + label="Model Names", info="Select model names to display on the heatmap:", + ) fairness_metrics = gr.Dropdown( ['Equalized_Odds_TPR', 'Equalized_Odds_FPR', 'Disparate_Impact', 'Statistical_Parity_Difference', 'Accuracy_Parity'], - value=['Equalized_Odds_TPR', 'Equalized_Odds_FPR'], multiselect=True, label="Fairness Metrics", info="Select fairness metrics to display on the heatmap:", + value=['Equalized_Odds_TPR', 'Equalized_Odds_FPR'], multiselect=True, label="Error Parity Metrics", info="Select error parity metrics to display on the heatmap:", ) group_stability_metrics = gr.Dropdown( ['Label_Stability_Ratio', 'IQR_Parity', 'Std_Parity', 'Std_Ratio', 'Jitter_Parity'], - value=['Label_Stability_Ratio', 'Std_Parity'], multiselect=True, label="Group Stability Metrics", info="Select group stability metrics to display on the heatmap:", + value=['Label_Stability_Ratio', 'Std_Parity'], multiselect=True, label="Stability Parity Metrics", info="Select stability parity metrics to display on the heatmap:", ) btn = gr.Button("Submit") with gr.Column(scale=2): - model_ranking_heatmap = gr.Plot(label="Plot") + group_model_ranking_heatmap = gr.Plot(label="Plot") - btn.click(self._create_model_rank_heatmap, - inputs=[fairness_metrics, group_stability_metrics], - outputs=[model_ranking_heatmap]) + btn.click(self._create_group_model_rank_heatmap, + inputs=[model_names, fairness_metrics, group_stability_metrics], + outputs=[group_model_ranking_heatmap]) self.demo = demo self.demo.launch(inline=False, debug=True, show_error=True) @@ -75,12 +130,69 @@ def start_web_app(self): def stop_web_app(self): self.demo.close() - def _create_model_rank_heatmap(self, group_fairness_metrics_lst: list, group_stability_metrics_lst: list): + def _create_subgroup_model_rank_heatmap(self, model_names: list, subgroup_accuracy_metrics_lst: list, + subgroup_uncertainty_metrics: list, subgroup_stability_metrics_lst: list): """ - Create a model rank heatmap. + Create a group model rank heatmap. Parameters ---------- + model_names + A list of selected model names to display on the heatmap + subgroup_accuracy_metrics_lst + A list of subgroup accuracy metrics to visualize + subgroup_uncertainty_metrics + A list of subgroup uncertainty metrics to visualize + subgroup_stability_metrics_lst + A list of subgroup stability metrics to visualize + + """ + groups_lst = self.sensitive_attributes_dct.keys() + metrics_lst = subgroup_accuracy_metrics_lst + subgroup_uncertainty_metrics + subgroup_stability_metrics_lst + + # Find metric values for each model based on metric, subgroup, and model names. + # Add the values to a results dict. + results = {} + num_models = len(model_names) + for metric in metrics_lst: + for group in groups_lst: + for prefix in ['priv', 'dis']: + subgroup = group + '_' + prefix + subgroup_metric = metric + '_' + subgroup + results[subgroup_metric] = dict() + + # Get distinct sorted model names + sorted_model_names_arr = self.sorted_model_metrics_df[ + (self.sorted_model_metrics_df.Metric == metric) & + (self.sorted_model_metrics_df.Subgroup == subgroup) + ]['Model_Name'].values + sorted_model_names_arr = [model for model in sorted_model_names_arr if model in model_names] + + # Add values to a results dict + for idx, model_name in enumerate(sorted_model_names_arr): + metric_value = self.sorted_model_metrics_df[ + (self.sorted_model_metrics_df.Metric == metric) & + (self.sorted_model_metrics_df.Subgroup == subgroup) & + (self.sorted_model_metrics_df.Model_Name == model_name) + ]['Value'].values[0] + metric_value = round(metric_value, 3) + results[subgroup_metric][model_name] = metric_value + + model_metrics_matrix = pd.DataFrame(results).T + sorted_matrix_by_rank = create_subgroup_sorted_matrix_by_rank(model_metrics_matrix) + model_rank_heatmap, _ = create_model_rank_heatmap_visualization(model_metrics_matrix, sorted_matrix_by_rank, num_models) + + return model_rank_heatmap + + def _create_group_model_rank_heatmap(self, model_names: list, group_fairness_metrics_lst: list, + group_stability_metrics_lst: list): + """ + Create a group model rank heatmap. + + Parameters + ---------- + model_names + A list of selected model names to display on the heatmap group_fairness_metrics_lst A list of group fairness metrics to visualize group_stability_metrics_lst @@ -93,22 +205,25 @@ def _create_model_rank_heatmap(self, group_fairness_metrics_lst: list, group_sta # Find metric values for each model based on metric, group, and model names. # Add the values to a results dict. results = {} - num_models = len(self.model_names) + num_models = len(model_names) for metric in metrics_lst: for group in groups_lst: group_metric = metric + '_' + group results[group_metric] = dict() + # Get distinct sorted model names - sorted_model_names_arr = self.sorted_models_composed_metrics_df[ - (self.sorted_models_composed_metrics_df.Metric == metric) & - (self.sorted_models_composed_metrics_df.Subgroup == group) + sorted_model_names_arr = self.sorted_model_composed_metrics_df[ + (self.sorted_model_composed_metrics_df.Metric == metric) & + (self.sorted_model_composed_metrics_df.Subgroup == group) ]['Model_Name'].values + sorted_model_names_arr = [model for model in sorted_model_names_arr if model in model_names] + # Add values to a results dict for idx, model_name in enumerate(sorted_model_names_arr): - metric_value = self.sorted_models_composed_metrics_df[ - (self.sorted_models_composed_metrics_df.Metric == metric) & - (self.sorted_models_composed_metrics_df.Subgroup == group) & - (self.sorted_models_composed_metrics_df.Model_Name == model_name) + metric_value = self.sorted_model_composed_metrics_df[ + (self.sorted_model_composed_metrics_df.Metric == metric) & + (self.sorted_model_composed_metrics_df.Subgroup == group) & + (self.sorted_model_composed_metrics_df.Model_Name == model_name) ]['Value'].values[0] metric_value = round(metric_value, 3) results[group_metric][model_name] = metric_value diff --git a/virny/utils/common_helpers.py b/virny/utils/common_helpers.py index dbaac29f..f99f227a 100644 --- a/virny/utils/common_helpers.py +++ b/virny/utils/common_helpers.py @@ -93,6 +93,15 @@ def save_metrics_to_file(metrics_df, result_filename, save_dir_path): metrics_df.to_csv(f'{save_dir_path}/{filename}', index=False) +def check_substring_in_list(val_to_check: str, allowed_lst: list): + # Case-insensitive check if a val_to_check substring is in allowed_lst + val_to_check = val_to_check.lower() + for allowed_val in allowed_lst: + if allowed_val.lower() in val_to_check: + return True + return False + + def confusion_matrix_metrics(y_true, y_preds): metrics = {} TN, FP, FN, TP = confusion_matrix(y_true, y_preds).ravel() diff --git a/virny/utils/data_viz_utils.py b/virny/utils/data_viz_utils.py index 9895d84a..057f85f4 100644 --- a/virny/utils/data_viz_utils.py +++ b/virny/utils/data_viz_utils.py @@ -3,6 +3,8 @@ from matplotlib import pyplot as plt +from virny.utils.common_helpers import check_substring_in_list + def set_size(w,h, ax=None): """ w, h: width, height in inches """ @@ -41,6 +43,20 @@ def create_sorted_matrix_by_rank(model_metrics_matrix) -> np.array: return sorted_matrix_by_rank +def create_subgroup_sorted_matrix_by_rank(model_metrics_matrix) -> np.array: + models_distances_matrix = model_metrics_matrix.copy(deep=True).T + metric_names = models_distances_matrix.columns + for metric_name in metric_names: + if check_substring_in_list(metric_name, ['TPR', 'TNR', 'PPV', 'Accuracy', 'F1', 'Label_Stability']): + # Cast a metric to a case when the closer value to zero is the better + models_distances_matrix[metric_name] = 1 - models_distances_matrix[metric_name] + models_distances_matrix[metric_name] = models_distances_matrix[metric_name].abs() + + models_distances_matrix = models_distances_matrix.T + sorted_matrix_by_rank = np.argsort(np.argsort(models_distances_matrix, axis=1), axis=1) + return sorted_matrix_by_rank + + def create_model_rank_heatmap_visualization(model_metrics_matrix, sorted_matrix_by_rank, num_models: int): """ This heatmap includes group fairness and stability metrics and defined models. @@ -63,8 +79,8 @@ def create_model_rank_heatmap_visualization(model_metrics_matrix, sorted_matrix_ """ font_increase = 2 - matrix_width = num_models * 5 - matrix_height = model_metrics_matrix.shape[0] // 1.5 + matrix_width = 20 + matrix_height = model_metrics_matrix.shape[0] // 2 fig = plt.figure(figsize=(matrix_width, matrix_height)) rank_colors = sns.color_palette("coolwarm", n_colors=num_models).as_hex()[::-1] ax = sns.heatmap(sorted_matrix_by_rank, annot=model_metrics_matrix, cmap=rank_colors, @@ -72,7 +88,7 @@ def create_model_rank_heatmap_visualization(model_metrics_matrix, sorted_matrix_ ax.set(xlabel="", ylabel="") ax.xaxis.tick_top() ax.tick_params(labelsize=16 + font_increase) - fig.subplots_adjust(left=0.25, top=0.9) + fig.subplots_adjust(left=0.25, right=1., top=0.9) cbar = ax.collections[0].colorbar model_ranks = [idx for idx in range(num_models)] From 21f783fef7197228bff5f145d2598f69bdf95775 Mon Sep 17 00:00:00 2001 From: Denys Herasymuk Date: Mon, 2 Oct 2023 00:05:56 +0300 Subject: [PATCH 03/36] Added bar charts to a web app --- .../Multiple_Models_Interface_Vis.ipynb | 18 +-- .../metrics_interactive_visualizer.py | 146 ++++++++++++++++-- 2 files changed, 138 insertions(+), 26 deletions(-) diff --git a/docs/examples/Multiple_Models_Interface_Vis.ipynb b/docs/examples/Multiple_Models_Interface_Vis.ipynb index 57d67263..ab7c8ca4 100644 --- a/docs/examples/Multiple_Models_Interface_Vis.ipynb +++ b/docs/examples/Multiple_Models_Interface_Vis.ipynb @@ -278,26 +278,26 @@ }, { "cell_type": "code", - "execution_count": 133, + "execution_count": 185, "outputs": [ { "data": { "text/plain": " Metric overall sex_priv sex_priv_correct \\\n0 Mean 0.524270 0.578645 0.600790 \n1 Std 0.067963 0.073618 0.072201 \n2 IQR 0.090596 0.099782 0.098402 \n3 Aleatoric_Uncertainty 0.834874 0.846689 0.826891 \n4 Overall_Uncertainty 0.859083 0.876581 0.856843 \n5 Statistical_Bias 0.405041 0.395811 0.314809 \n6 Jitter 0.106917 0.132090 0.112864 \n7 Per_Sample_Accuracy 0.691061 0.711090 0.918452 \n8 Label_Stability 0.851667 0.807393 0.836903 \n9 TPR 0.679406 0.613333 1.000000 \n10 TNR 0.738462 0.801471 1.000000 \n11 PPV 0.676533 0.630137 1.000000 \n12 FNR 0.320594 0.386667 0.000000 \n13 FPR 0.261538 0.198529 0.000000 \n14 Accuracy 0.712121 0.734597 1.000000 \n15 F1 0.677966 0.621622 1.000000 \n16 Selection-Rate 0.447917 0.345972 0.296774 \n17 Positive-Rate 1.004246 0.973333 1.000000 \n18 Sample_Size 1056.000000 211.000000 155.000000 \n\n sex_priv_incorrect sex_dis sex_dis_correct sex_dis_incorrect \\\n0 0.517352 0.510692 0.514399 0.501767 \n1 0.077539 0.066551 0.064791 0.070788 \n2 0.103600 0.088303 0.085977 0.093900 \n3 0.901488 0.831924 0.817170 0.867440 \n4 0.931213 0.854713 0.839203 0.892051 \n5 0.620012 0.407346 0.301656 0.661771 \n6 0.185306 0.100631 0.091351 0.122972 \n7 0.137143 0.686059 0.936918 0.082177 \n8 0.725714 0.862722 0.873970 0.835645 \n9 0.000000 0.691919 1.000000 0.000000 \n10 0.000000 0.719376 1.000000 0.000000 \n11 0.000000 0.685000 1.000000 0.000000 \n12 1.000000 0.308081 0.000000 1.000000 \n13 1.000000 0.280624 0.000000 1.000000 \n14 0.000000 0.706509 1.000000 0.000000 \n15 0.000000 0.688442 1.000000 0.000000 \n16 0.482143 0.473373 0.458961 0.508065 \n17 0.931034 1.010101 1.000000 1.032787 \n18 56.000000 845.000000 597.000000 248.000000 \n\n race_priv race_priv_correct ... race_dis_correct race_dis_incorrect \\\n0 0.597526 0.618185 ... 0.473863 0.484344 \n1 0.069162 0.066865 ... 0.065947 0.070060 \n2 0.093184 0.089451 ... 0.087919 0.091258 \n3 0.821672 0.807043 ... 0.827404 0.880296 \n4 0.847778 0.832001 ... 0.850193 0.903737 \n5 0.393484 0.296788 ... 0.309510 0.650314 \n6 0.107225 0.097218 ... 0.094812 0.134214 \n7 0.708261 0.930526 ... 0.934866 0.091340 \n8 0.848213 0.861316 ... 0.869732 0.817320 \n9 0.585034 1.000000 ... 1.000000 0.000000 \n10 0.816479 1.000000 ... 1.000000 0.000000 \n11 0.637037 1.000000 ... 1.000000 0.000000 \n12 0.414966 0.000000 ... 0.000000 1.000000 \n13 0.183521 0.000000 ... 0.000000 1.000000 \n14 0.734300 1.000000 ... 1.000000 0.000000 \n15 0.609929 1.000000 ... 1.000000 0.000000 \n16 0.326087 0.282895 ... 0.522321 0.536082 \n17 0.918367 1.000000 ... 1.000000 1.155556 \n18 414.000000 304.000000 ... 448.000000 194.000000 \n\n sex&race_priv sex&race_priv_correct sex&race_priv_incorrect \\\n0 0.586391 0.607290 0.529874 \n1 0.068718 0.066018 0.076019 \n2 0.092020 0.088338 0.101975 \n3 0.832383 0.817398 0.872906 \n4 0.857995 0.841790 0.901818 \n5 0.396398 0.302520 0.650263 \n6 0.108871 0.095304 0.145559 \n7 0.708783 0.933073 0.102254 \n8 0.847224 0.866354 0.795493 \n9 0.595745 1.000000 0.000000 \n10 0.804734 1.000000 0.000000 \n11 0.629213 1.000000 0.000000 \n12 0.404255 0.000000 1.000000 \n13 0.195266 0.000000 1.000000 \n14 0.730038 1.000000 0.000000 \n15 0.612022 1.000000 0.000000 \n16 0.338403 0.291667 0.464789 \n17 0.946809 1.000000 0.868421 \n18 526.000000 384.000000 142.000000 \n\n sex&race_dis sex&race_dis_correct sex&race_dis_incorrect \\\n0 0.462617 0.453857 0.482517 \n1 0.067213 0.066631 0.068536 \n2 0.089184 0.088747 0.090175 \n3 0.837346 0.821026 0.874418 \n4 0.860162 0.843933 0.897027 \n5 0.413620 0.306294 0.657422 \n6 0.104978 0.096287 0.124722 \n7 0.673472 0.933152 0.083580 \n8 0.856075 0.866304 0.832840 \n9 0.734982 1.000000 0.000000 \n10 0.647773 1.000000 0.000000 \n11 0.705085 1.000000 0.000000 \n12 0.265018 0.000000 1.000000 \n13 0.352227 0.000000 1.000000 \n14 0.694340 1.000000 0.000000 \n15 0.719723 1.000000 0.000000 \n16 0.556604 0.565217 0.537037 \n17 1.042403 1.000000 1.160000 \n18 530.000000 368.000000 162.000000 \n\n Model_Name Model_Params \n0 RandomForestClassifier {'bootstrap': True, 'ccp_alpha': 0.0, 'class_w... \n1 RandomForestClassifier {'bootstrap': True, 'ccp_alpha': 0.0, 'class_w... \n2 RandomForestClassifier {'bootstrap': True, 'ccp_alpha': 0.0, 'class_w... \n3 RandomForestClassifier {'bootstrap': True, 'ccp_alpha': 0.0, 'class_w... \n4 RandomForestClassifier {'bootstrap': True, 'ccp_alpha': 0.0, 'class_w... \n5 RandomForestClassifier {'bootstrap': True, 'ccp_alpha': 0.0, 'class_w... \n6 RandomForestClassifier {'bootstrap': True, 'ccp_alpha': 0.0, 'class_w... \n7 RandomForestClassifier {'bootstrap': True, 'ccp_alpha': 0.0, 'class_w... \n8 RandomForestClassifier {'bootstrap': True, 'ccp_alpha': 0.0, 'class_w... \n9 RandomForestClassifier {'bootstrap': True, 'ccp_alpha': 0.0, 'class_w... \n10 RandomForestClassifier {'bootstrap': True, 'ccp_alpha': 0.0, 'class_w... \n11 RandomForestClassifier {'bootstrap': True, 'ccp_alpha': 0.0, 'class_w... \n12 RandomForestClassifier {'bootstrap': True, 'ccp_alpha': 0.0, 'class_w... \n13 RandomForestClassifier {'bootstrap': True, 'ccp_alpha': 0.0, 'class_w... \n14 RandomForestClassifier {'bootstrap': True, 'ccp_alpha': 0.0, 'class_w... \n15 RandomForestClassifier {'bootstrap': True, 'ccp_alpha': 0.0, 'class_w... \n16 RandomForestClassifier {'bootstrap': True, 'ccp_alpha': 0.0, 'class_w... \n17 RandomForestClassifier {'bootstrap': True, 'ccp_alpha': 0.0, 'class_w... \n18 RandomForestClassifier {'bootstrap': True, 'ccp_alpha': 0.0, 'class_w... \n\n[19 rows x 22 columns]", "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
Metricoverallsex_privsex_priv_correctsex_priv_incorrectsex_dissex_dis_correctsex_dis_incorrectrace_privrace_priv_correct...race_dis_correctrace_dis_incorrectsex&race_privsex&race_priv_correctsex&race_priv_incorrectsex&race_dissex&race_dis_correctsex&race_dis_incorrectModel_NameModel_Params
0Mean0.5242700.5786450.6007900.5173520.5106920.5143990.5017670.5975260.618185...0.4738630.4843440.5863910.6072900.5298740.4626170.4538570.482517RandomForestClassifier{'bootstrap': True, 'ccp_alpha': 0.0, 'class_w...
1Std0.0679630.0736180.0722010.0775390.0665510.0647910.0707880.0691620.066865...0.0659470.0700600.0687180.0660180.0760190.0672130.0666310.068536RandomForestClassifier{'bootstrap': True, 'ccp_alpha': 0.0, 'class_w...
2IQR0.0905960.0997820.0984020.1036000.0883030.0859770.0939000.0931840.089451...0.0879190.0912580.0920200.0883380.1019750.0891840.0887470.090175RandomForestClassifier{'bootstrap': True, 'ccp_alpha': 0.0, 'class_w...
3Aleatoric_Uncertainty0.8348740.8466890.8268910.9014880.8319240.8171700.8674400.8216720.807043...0.8274040.8802960.8323830.8173980.8729060.8373460.8210260.874418RandomForestClassifier{'bootstrap': True, 'ccp_alpha': 0.0, 'class_w...
4Overall_Uncertainty0.8590830.8765810.8568430.9312130.8547130.8392030.8920510.8477780.832001...0.8501930.9037370.8579950.8417900.9018180.8601620.8439330.897027RandomForestClassifier{'bootstrap': True, 'ccp_alpha': 0.0, 'class_w...
5Statistical_Bias0.4050410.3958110.3148090.6200120.4073460.3016560.6617710.3934840.296788...0.3095100.6503140.3963980.3025200.6502630.4136200.3062940.657422RandomForestClassifier{'bootstrap': True, 'ccp_alpha': 0.0, 'class_w...
6Jitter0.1069170.1320900.1128640.1853060.1006310.0913510.1229720.1072250.097218...0.0948120.1342140.1088710.0953040.1455590.1049780.0962870.124722RandomForestClassifier{'bootstrap': True, 'ccp_alpha': 0.0, 'class_w...
7Per_Sample_Accuracy0.6910610.7110900.9184520.1371430.6860590.9369180.0821770.7082610.930526...0.9348660.0913400.7087830.9330730.1022540.6734720.9331520.083580RandomForestClassifier{'bootstrap': True, 'ccp_alpha': 0.0, 'class_w...
8Label_Stability0.8516670.8073930.8369030.7257140.8627220.8739700.8356450.8482130.861316...0.8697320.8173200.8472240.8663540.7954930.8560750.8663040.832840RandomForestClassifier{'bootstrap': True, 'ccp_alpha': 0.0, 'class_w...
9TPR0.6794060.6133331.0000000.0000000.6919191.0000000.0000000.5850341.000000...1.0000000.0000000.5957451.0000000.0000000.7349821.0000000.000000RandomForestClassifier{'bootstrap': True, 'ccp_alpha': 0.0, 'class_w...
10TNR0.7384620.8014711.0000000.0000000.7193761.0000000.0000000.8164791.000000...1.0000000.0000000.8047341.0000000.0000000.6477731.0000000.000000RandomForestClassifier{'bootstrap': True, 'ccp_alpha': 0.0, 'class_w...
11PPV0.6765330.6301371.0000000.0000000.6850001.0000000.0000000.6370371.000000...1.0000000.0000000.6292131.0000000.0000000.7050851.0000000.000000RandomForestClassifier{'bootstrap': True, 'ccp_alpha': 0.0, 'class_w...
12FNR0.3205940.3866670.0000001.0000000.3080810.0000001.0000000.4149660.000000...0.0000001.0000000.4042550.0000001.0000000.2650180.0000001.000000RandomForestClassifier{'bootstrap': True, 'ccp_alpha': 0.0, 'class_w...
13FPR0.2615380.1985290.0000001.0000000.2806240.0000001.0000000.1835210.000000...0.0000001.0000000.1952660.0000001.0000000.3522270.0000001.000000RandomForestClassifier{'bootstrap': True, 'ccp_alpha': 0.0, 'class_w...
14Accuracy0.7121210.7345971.0000000.0000000.7065091.0000000.0000000.7343001.000000...1.0000000.0000000.7300381.0000000.0000000.6943401.0000000.000000RandomForestClassifier{'bootstrap': True, 'ccp_alpha': 0.0, 'class_w...
15F10.6779660.6216221.0000000.0000000.6884421.0000000.0000000.6099291.000000...1.0000000.0000000.6120221.0000000.0000000.7197231.0000000.000000RandomForestClassifier{'bootstrap': True, 'ccp_alpha': 0.0, 'class_w...
16Selection-Rate0.4479170.3459720.2967740.4821430.4733730.4589610.5080650.3260870.282895...0.5223210.5360820.3384030.2916670.4647890.5566040.5652170.537037RandomForestClassifier{'bootstrap': True, 'ccp_alpha': 0.0, 'class_w...
17Positive-Rate1.0042460.9733331.0000000.9310341.0101011.0000001.0327870.9183671.000000...1.0000001.1555560.9468091.0000000.8684211.0424031.0000001.160000RandomForestClassifier{'bootstrap': True, 'ccp_alpha': 0.0, 'class_w...
18Sample_Size1056.000000211.000000155.00000056.000000845.000000597.000000248.000000414.000000304.000000...448.000000194.000000526.000000384.000000142.000000530.000000368.000000162.000000RandomForestClassifier{'bootstrap': True, 'ccp_alpha': 0.0, 'class_w...
\n

19 rows × 22 columns

\n
" }, - "execution_count": 133, + "execution_count": 185, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "models_metrics_dct['RandomForestClassifier'].head(20)" + "models_metrics_dct['RandomForestClassifier'].head(100)" ], "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-01T11:25:45.963770Z", - "start_time": "2023-10-01T11:25:45.421681Z" + "end_time": "2023-10-01T20:57:20.233976Z", + "start_time": "2023-10-01T20:57:20.133369Z" } }, "id": "54a73b4d053334b4" @@ -338,12 +338,12 @@ }, { "cell_type": "code", - "execution_count": 169, + "execution_count": 186, "id": "435b9d98", "metadata": { "ExecuteTime": { - "end_time": "2023-10-01T19:42:30.098766Z", - "start_time": "2023-10-01T19:42:30.039734Z" + "end_time": "2023-10-01T21:02:36.301716Z", + "start_time": "2023-10-01T21:02:33.017804Z" } }, "outputs": [], @@ -373,7 +373,7 @@ "collapsed": false, "is_executing": true, "ExecuteTime": { - "start_time": "2023-10-01T19:42:30.126790Z" + "start_time": "2023-10-01T21:02:36.296642Z" } }, "id": "678a9dc8d51243f4" diff --git a/virny/custom_classes/metrics_interactive_visualizer.py b/virny/custom_classes/metrics_interactive_visualizer.py index 40a2beab..fe59f488 100644 --- a/virny/custom_classes/metrics_interactive_visualizer.py +++ b/virny/custom_classes/metrics_interactive_visualizer.py @@ -1,5 +1,6 @@ import pandas as pd import gradio as gr +import altair as alt from virny.utils.data_viz_utils import (create_model_rank_heatmap_visualization, create_sorted_matrix_by_rank, create_subgroup_sorted_matrix_by_rank) @@ -35,19 +36,19 @@ def __init__(self, model_metrics_dct: dict, model_composed_metrics_df: pd.DataFr models_metrics_df = models_metrics_df.reset_index(drop=True) self.models_metrics_dct = model_metrics_dct - self.models_metrics_df = self._align_input_metric_df(models_metrics_df, allowed_cols=["Metric", "Model_Name"], + self.models_metrics_df = self._align_input_metric_df(models_metrics_df, allowed_cols=["Metric", "Model_Name", "overall"], sensitive_attrs=list(self.sensitive_attributes_dct.keys())) self.model_composed_metrics_df = self._align_input_metric_df(model_composed_metrics_df, allowed_cols=["Metric", "Model_Name"], sensitive_attrs=list(self.sensitive_attributes_dct.keys())) - melted_model_metrics_df = self.models_metrics_df.melt(id_vars=["Metric", "Model_Name"], - var_name="Subgroup", - value_name="Value") - self.sorted_model_metrics_df = melted_model_metrics_df.sort_values(by=['Value']) - melted_model_composed_metrics_df = self.model_composed_metrics_df.melt(id_vars=["Metric", "Model_Name"], - var_name="Subgroup", - value_name="Value") - self.sorted_model_composed_metrics_df = melted_model_composed_metrics_df.sort_values(by=['Value']) + self.melted_model_metrics_df = self.models_metrics_df.melt(id_vars=["Metric", "Model_Name"], + var_name="Subgroup", + value_name="Value") + self.sorted_model_metrics_df = self.melted_model_metrics_df.sort_values(by=['Value']) + self.melted_model_composed_metrics_df = self.model_composed_metrics_df.melt(id_vars=["Metric", "Model_Name"], + var_name="Subgroup", + value_name="Value") + self.sorted_model_composed_metrics_df = self.melted_model_composed_metrics_df.sort_values(by=['Value']) def _align_input_metric_df(self, model_metrics_df: pd.DataFrame, allowed_cols: list, sensitive_attrs: list): # Filter columns in the input dataframe based on allowed_cols and sensitive_attrs @@ -89,13 +90,13 @@ def start_web_app(self): ['Std', 'IQR', 'Jitter', 'Label_Stability'], value=['Jitter', 'Label_Stability'], multiselect=True, label="Stability Metrics", info="Select stability metrics to display on the heatmap:", ) - btn = gr.Button("Submit") + subgroup_btn_view1 = gr.Button("Submit") with gr.Column(scale=2): subgroup_model_ranking_heatmap = gr.Plot(label="Plot") - btn.click(self._create_subgroup_model_rank_heatmap, - inputs=[model_names, accuracy_metrics, uncertainty_metrics, subgroup_stability_metrics], - outputs=[subgroup_model_ranking_heatmap]) + subgroup_btn_view1.click(self._create_subgroup_model_rank_heatmap, + inputs=[model_names, accuracy_metrics, uncertainty_metrics, subgroup_stability_metrics], + outputs=[subgroup_model_ranking_heatmap]) # ======================================== Group Metrics Heatmap ======================================== gr.Markdown( """ @@ -116,13 +117,67 @@ def start_web_app(self): ['Label_Stability_Ratio', 'IQR_Parity', 'Std_Parity', 'Std_Ratio', 'Jitter_Parity'], value=['Label_Stability_Ratio', 'Std_Parity'], multiselect=True, label="Stability Parity Metrics", info="Select stability parity metrics to display on the heatmap:", ) - btn = gr.Button("Submit") + group_btn_view1 = gr.Button("Submit") with gr.Column(scale=2): group_model_ranking_heatmap = gr.Plot(label="Plot") - btn.click(self._create_group_model_rank_heatmap, - inputs=[model_names, fairness_metrics, group_stability_metrics], - outputs=[group_model_ranking_heatmap]) + group_btn_view1.click(self._create_group_model_rank_heatmap, + inputs=[model_names, fairness_metrics, group_stability_metrics], + outputs=[group_model_ranking_heatmap]) + # =============================== Subgroup and Group Metrics Bar Chart =============================== + with gr.Row(): + with gr.Column(): + gr.Markdown( + """ + ## Subgroup Metrics Bar Chart + """) + subgroup_model_names = gr.Dropdown( + self.model_names, value=self.model_names[0], multiselect=False, + label="Model Names", info="Select one model to display on the bar chart:", + ) + accuracy_metrics = gr.Dropdown( + ['Statistical_Bias', 'TPR', 'TNR', 'PPV', 'FNR', 'FPR', 'Accuracy', 'F1'], + value=['Accuracy', 'F1'], multiselect=True, label="Accuracy Metrics", info="Select accuracy metrics to display on the heatmap:", + ) + uncertainty_metrics = gr.Dropdown( + ['Aleatoric_Uncertainty', 'Overall_Uncertainty'], + value=['Aleatoric_Uncertainty', 'Overall_Uncertainty'], multiselect=True, label="Uncertainty Metrics", info="Select uncertainty metrics to display on the heatmap:", + ) + subgroup_stability_metrics = gr.Dropdown( + ['Std', 'IQR', 'Jitter', 'Label_Stability'], + value=['Jitter', 'Label_Stability'], multiselect=True, label="Stability Metrics", info="Select stability metrics to display on the heatmap:", + ) + subgroup_btn_view2 = gr.Button("Submit") + with gr.Column(): + gr.Markdown( + """ + ## Group Metrics Bar Chart + """) + group_model_names = gr.Dropdown( + self.model_names, value=self.model_names[0], multiselect=False, + label="Model Names", info="Select one model to display on the bar chart:", + ) + fairness_metrics = gr.Dropdown( + ['Equalized_Odds_TPR', 'Equalized_Odds_FPR', 'Disparate_Impact', 'Statistical_Parity_Difference', 'Accuracy_Parity'], + value=['Equalized_Odds_TPR', 'Equalized_Odds_FPR'], multiselect=True, label="Error Parity Metrics", info="Select error parity metrics to display on the heatmap:", + ) + group_stability_metrics = gr.Dropdown( + ['Label_Stability_Ratio', 'IQR_Parity', 'Std_Parity', 'Std_Ratio', 'Jitter_Parity'], + value=['Label_Stability_Ratio', 'Std_Parity'], multiselect=True, label="Stability Parity Metrics", info="Select stability parity metrics to display on the heatmap:", + ) + group_btn_view2 = gr.Button("Submit") + with gr.Row(): + with gr.Column(): + subgroup_metrics_bar_chart = gr.Plot(label="Plot") + with gr.Column(): + group_metrics_bar_chart = gr.Plot(label="Plot") + + subgroup_btn_view2.click(self._create_subgroup_metrics_bar_chart_per_one_model, + inputs=[subgroup_model_names, accuracy_metrics, uncertainty_metrics, subgroup_stability_metrics], + outputs=[subgroup_metrics_bar_chart]) + group_btn_view2.click(self._create_group_metrics_bar_chart_per_one_model, + inputs=[group_model_names, fairness_metrics, group_stability_metrics], + outputs=[group_metrics_bar_chart]) self.demo = demo self.demo.launch(inline=False, debug=True, show_error=True) @@ -233,3 +288,60 @@ def _create_group_model_rank_heatmap(self, model_names: list, group_fairness_met model_rank_heatmap, _ = create_model_rank_heatmap_visualization(model_metrics_matrix, sorted_matrix_by_rank, num_models) return model_rank_heatmap + + def _create_subgroup_metrics_bar_chart_per_one_model(self, model_name: str, subgroup_accuracy_metrics_lst: list, + subgroup_uncertainty_metrics: list, subgroup_stability_metrics_lst: list): + metrics_names = subgroup_accuracy_metrics_lst + subgroup_uncertainty_metrics + subgroup_stability_metrics_lst + return self._create_metrics_bar_chart_per_one_model(model_name, metrics_names, metrics_type='subgroup') + + def _create_group_metrics_bar_chart_per_one_model(self, model_name: str, group_fairness_metrics_lst: list, + group_stability_metrics_lst: list): + metrics_names = group_fairness_metrics_lst + group_stability_metrics_lst + return self._create_metrics_bar_chart_per_one_model(model_name, metrics_names, metrics_type='group') + + def _create_metrics_bar_chart_per_one_model(self, model_name: str, metrics_names: list, metrics_type: str): + """ + This bar chart displays metrics for different groups and one specific model. + + Parameters + ---------- + model_name + A model name to display metrics + metrics_names + A list of metric names to visualize + metrics_type + A metrics type ('subgroup' or 'group') to visualize + + """ + metrics_title = f'{metrics_type.capitalize()} Metrics' + metrics_df = self.melted_model_composed_metrics_df if metrics_type == "group" else self.melted_model_metrics_df + filtered_groups = [grp for grp in metrics_df.Subgroup.unique() if '_correct' not in grp and '_incorrect' not in grp] + filtered_metrics_df = metrics_df[(metrics_df['Metric'].isin(metrics_names)) & + (metrics_df['Model_Name'] == model_name) & + (metrics_df['Subgroup'].isin(filtered_groups))] + + models_metrics_chart = ( + alt.Chart(filtered_metrics_df).mark_bar().encode( + alt.Row('Metric:N', title=metrics_title), + alt.Y('Subgroup:N', axis=None), + alt.X('Value:Q', axis=alt.Axis(grid=True), title=''), + alt.Color('Subgroup:N', + scale=alt.Scale(scheme="tableau20"), + legend=alt.Legend(title=metrics_type.capitalize(), + labelFontSize=14, + titleFontSize=14) + ) + ) + ).properties( + width=500, height=80 + ).configure_headerRow( + labelAngle=0, + labelPadding=10, + labelAlign='left', + labelFontSize=14, + titleFontSize=18 + ).configure_axis( + labelFontSize=14, titleFontSize=18 + ) + + return models_metrics_chart From e0113e1e460539a7dde6404685449b3fb2e75b00 Mon Sep 17 00:00:00 2001 From: denysgerasymuk799 Date: Mon, 2 Oct 2023 00:10:27 +0300 Subject: [PATCH 04/36] Added bar charts to a web app --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 7414280a..66119d84 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,6 @@

- ## 📜 Description **Virny** is a Python library for auditing model stability and fairness. The Virny library was From 8580bbc49e2399f529bcfbbfac0f5c41fbf3d982 Mon Sep 17 00:00:00 2001 From: denysgerasymuk799 Date: Mon, 2 Oct 2023 02:06:05 +0300 Subject: [PATCH 05/36] Added init for view 1 --- .../Multiple_Models_Interface_Vis.ipynb | 8 +- .../metrics_interactive_visualizer.py | 103 +++++++++++-- virny/utils/data_viz_utils.py | 143 +++++++++++++++++- 3 files changed, 240 insertions(+), 14 deletions(-) diff --git a/docs/examples/Multiple_Models_Interface_Vis.ipynb b/docs/examples/Multiple_Models_Interface_Vis.ipynb index ab7c8ca4..2382c421 100644 --- a/docs/examples/Multiple_Models_Interface_Vis.ipynb +++ b/docs/examples/Multiple_Models_Interface_Vis.ipynb @@ -338,12 +338,12 @@ }, { "cell_type": "code", - "execution_count": 186, + "execution_count": 212, "id": "435b9d98", "metadata": { "ExecuteTime": { - "end_time": "2023-10-01T21:02:36.301716Z", - "start_time": "2023-10-01T21:02:33.017804Z" + "end_time": "2023-10-01T23:03:56.089028Z", + "start_time": "2023-10-01T23:03:56.019414Z" } }, "outputs": [], @@ -373,7 +373,7 @@ "collapsed": false, "is_executing": true, "ExecuteTime": { - "start_time": "2023-10-01T21:02:36.296642Z" + "start_time": "2023-10-01T23:03:56.113686Z" } }, "id": "678a9dc8d51243f4" diff --git a/virny/custom_classes/metrics_interactive_visualizer.py b/virny/custom_classes/metrics_interactive_visualizer.py index fe59f488..567b0d33 100644 --- a/virny/custom_classes/metrics_interactive_visualizer.py +++ b/virny/custom_classes/metrics_interactive_visualizer.py @@ -3,7 +3,7 @@ import altair as alt from virny.utils.data_viz_utils import (create_model_rank_heatmap_visualization, create_sorted_matrix_by_rank, - create_subgroup_sorted_matrix_by_rank) + create_subgroup_sorted_matrix_by_rank, create_bar_plot_for_model_selection) class MetricsInteractiveVisualizer: @@ -66,6 +66,56 @@ def start_web_app(self): # .plot_output1 {position: right !important} # """ with gr.Blocks(theme=gr.themes.Soft()) as demo: + # ==================================== Bar Chart for Model Selection ==================================== + gr.Markdown( + """ + ## Bar Chart for Model Selection + Select input arguments to create a bar chart for model selection. + """) + with gr.Row(): + with gr.Column(scale=2): + with gr.Row(): + accuracy_metric = gr.Dropdown( + ['Statistical_Bias', 'TPR', 'TNR', 'PPV', 'FNR', 'FPR', 'Accuracy', 'F1'], + value='Accuracy', multiselect=False, label="Constraint 1 (C1)", + scale=2 + ) + acc_min_val = gr.Number(value=0.815, label="Min value", scale=1) + acc_max_val = gr.Number(value=0.85, label="Max value", scale=1) + with gr.Row(): + fairness_metric = gr.Dropdown( + ['Equalized_Odds_TPR', 'Equalized_Odds_FPR', 'Disparate_Impact', 'Statistical_Parity_Difference', 'Accuracy_Parity'], + value='Equalized_Odds_FPR', multiselect=False, label="Constraint 2 (C2)", + scale=2 + ) + fairness_min_val = gr.Number(value=-0.03, label="Min value", scale=1) + fairness_max_val = gr.Number(value=0.03, label="Max value", scale=1) + with gr.Row(): + subgroup_stability_metric = gr.Dropdown( + ['Std', 'IQR', 'Jitter', 'Label_Stability'], + value='Label_Stability', multiselect=False, label="Constraint 3 (C3)", + scale=2 + ) + subgroup_stab_min_val = gr.Number(value=0.9, label="Min value", scale=1) + subgroup_stab_max_val = gr.Number(value=0.94, label="Max value", scale=1) + with gr.Row(): + group_stability_metrics = gr.Dropdown( + ['Label_Stability_Ratio', 'IQR_Parity', 'Std_Parity', 'Std_Ratio', 'Jitter_Parity'], + value='Label_Stability_Ratio', multiselect=False, label="Constraint 4 (C4)", + scale=2 + ) + group_stab_min_val = gr.Number(value=1.0, label="Min value", scale=1) + group_stab_max_val = gr.Number(value=1.03, label="Max value", scale=1) + btn_view1 = gr.Button("Submit") + with gr.Column(scale=3): + bar_plot_for_model_selection = gr.Plot(label="Plot") + + btn_view1.click(self._create_bar_plot_for_model_selection, + inputs=[accuracy_metric, acc_min_val, acc_max_val, + fairness_metric, fairness_min_val, fairness_max_val, + subgroup_stability_metric, subgroup_stab_min_val, subgroup_stab_max_val, + group_stability_metrics, group_stab_min_val, group_stab_max_val], + outputs=[bar_plot_for_model_selection]) # ======================================= Subgroup Metrics Heatmap ======================================= gr.Markdown( """ @@ -90,11 +140,11 @@ def start_web_app(self): ['Std', 'IQR', 'Jitter', 'Label_Stability'], value=['Jitter', 'Label_Stability'], multiselect=True, label="Stability Metrics", info="Select stability metrics to display on the heatmap:", ) - subgroup_btn_view1 = gr.Button("Submit") + subgroup_btn_view2 = gr.Button("Submit") with gr.Column(scale=2): subgroup_model_ranking_heatmap = gr.Plot(label="Plot") - subgroup_btn_view1.click(self._create_subgroup_model_rank_heatmap, + subgroup_btn_view2.click(self._create_subgroup_model_rank_heatmap, inputs=[model_names, accuracy_metrics, uncertainty_metrics, subgroup_stability_metrics], outputs=[subgroup_model_ranking_heatmap]) # ======================================== Group Metrics Heatmap ======================================== @@ -117,11 +167,11 @@ def start_web_app(self): ['Label_Stability_Ratio', 'IQR_Parity', 'Std_Parity', 'Std_Ratio', 'Jitter_Parity'], value=['Label_Stability_Ratio', 'Std_Parity'], multiselect=True, label="Stability Parity Metrics", info="Select stability parity metrics to display on the heatmap:", ) - group_btn_view1 = gr.Button("Submit") + group_btn_view2 = gr.Button("Submit") with gr.Column(scale=2): group_model_ranking_heatmap = gr.Plot(label="Plot") - group_btn_view1.click(self._create_group_model_rank_heatmap, + group_btn_view2.click(self._create_group_model_rank_heatmap, inputs=[model_names, fairness_metrics, group_stability_metrics], outputs=[group_model_ranking_heatmap]) # =============================== Subgroup and Group Metrics Bar Chart =============================== @@ -147,7 +197,7 @@ def start_web_app(self): ['Std', 'IQR', 'Jitter', 'Label_Stability'], value=['Jitter', 'Label_Stability'], multiselect=True, label="Stability Metrics", info="Select stability metrics to display on the heatmap:", ) - subgroup_btn_view2 = gr.Button("Submit") + subgroup_btn_view3 = gr.Button("Submit") with gr.Column(): gr.Markdown( """ @@ -165,17 +215,17 @@ def start_web_app(self): ['Label_Stability_Ratio', 'IQR_Parity', 'Std_Parity', 'Std_Ratio', 'Jitter_Parity'], value=['Label_Stability_Ratio', 'Std_Parity'], multiselect=True, label="Stability Parity Metrics", info="Select stability parity metrics to display on the heatmap:", ) - group_btn_view2 = gr.Button("Submit") + group_btn_view3 = gr.Button("Submit") with gr.Row(): with gr.Column(): subgroup_metrics_bar_chart = gr.Plot(label="Plot") with gr.Column(): group_metrics_bar_chart = gr.Plot(label="Plot") - subgroup_btn_view2.click(self._create_subgroup_metrics_bar_chart_per_one_model, + subgroup_btn_view3.click(self._create_subgroup_metrics_bar_chart_per_one_model, inputs=[subgroup_model_names, accuracy_metrics, uncertainty_metrics, subgroup_stability_metrics], outputs=[subgroup_metrics_bar_chart]) - group_btn_view2.click(self._create_group_metrics_bar_chart_per_one_model, + group_btn_view3.click(self._create_group_metrics_bar_chart_per_one_model, inputs=[group_model_names, fairness_metrics, group_stability_metrics], outputs=[group_metrics_bar_chart]) @@ -185,6 +235,41 @@ def start_web_app(self): def stop_web_app(self): self.demo.close() + def _create_bar_plot_for_model_selection(self, accuracy_metric, acc_min_val, acc_max_val, + fairness_metric, fairness_min_val, fairness_max_val, + subgroup_stability_metric, subgroup_stab_min_val, subgroup_stab_max_val, + group_stability_metrics, group_stab_min_val, group_stab_max_val): + accuracy_constraint = (accuracy_metric, acc_min_val, acc_max_val) + subgroup_stability_constraint = (subgroup_stability_metric, subgroup_stab_min_val, subgroup_stab_max_val) + fairness_constraint = (fairness_metric, fairness_min_val, fairness_max_val) + group_stability_constraint = (group_stability_metrics, group_stab_min_val, group_stab_max_val) + + # Create individual constraints + metrics_value_range_dct = dict() + for constraint in [accuracy_constraint, subgroup_stability_constraint, fairness_constraint, group_stability_constraint]: + metrics_value_range_dct[constraint[0]] = [constraint[1], constraint[2]] + # Create intersectional constraints + metrics_value_range_dct[f'{accuracy_constraint[0]}&{subgroup_stability_constraint[0]}'] = None + metrics_value_range_dct[f'{accuracy_constraint[0]}&{fairness_constraint[0]}'] = None + metrics_value_range_dct[f'{accuracy_constraint[0]}&{group_stability_constraint[0]}'] = None + metrics_value_range_dct[(f'{accuracy_constraint[0]}&{subgroup_stability_constraint[0]}' + f'&{fairness_constraint[0]}&{group_stability_constraint[0]}')] = None + + melted_all_subgroup_metrics_per_model_dct = dict() + for model_name in self.melted_model_metrics_df['Model_Name'].unique(): + melted_all_subgroup_metrics_per_model_dct[model_name] = ( + self.melted_model_metrics_df)[self.melted_model_metrics_df.Model_Name == model_name] + + melted_all_group_metrics_per_model_dct = dict() + for model_name in self.melted_model_composed_metrics_df['Model_Name'].unique(): + melted_all_group_metrics_per_model_dct[model_name] = ( + self.melted_model_composed_metrics_df)[self.melted_model_composed_metrics_df.Model_Name == model_name] + + return create_bar_plot_for_model_selection(melted_all_subgroup_metrics_per_model_dct, + melted_all_group_metrics_per_model_dct, + metrics_value_range_dct, + group='sex&race') + def _create_subgroup_model_rank_heatmap(self, model_names: list, subgroup_accuracy_metrics_lst: list, subgroup_uncertainty_metrics: list, subgroup_stability_metrics_lst: list): """ diff --git a/virny/utils/data_viz_utils.py b/virny/utils/data_viz_utils.py index 057f85f4..877979f9 100644 --- a/virny/utils/data_viz_utils.py +++ b/virny/utils/data_viz_utils.py @@ -1,5 +1,7 @@ -import seaborn as sns import numpy as np +import pandas as pd +import altair as alt +import seaborn as sns from matplotlib import pyplot as plt @@ -100,3 +102,142 @@ def create_model_rank_heatmap_visualization(model_metrics_matrix, sorted_matrix_ cbar.set_label('Model Ranks', fontsize=18 + font_increase) return fig, ax + + +def create_bar_plot_for_model_selection(all_subgroup_metrics_per_model_dct: dict, all_group_metrics_per_model_dct: dict, + metrics_value_range_dct: dict, group: str): + # Compute the number of models that satisfy the conditions + models_in_range_df = create_models_in_range_dct(all_subgroup_metrics_per_model_dct, all_group_metrics_per_model_dct, + metrics_value_range_dct, group) + # Replace metric groups on their aliases + metric_name_to_alias_dct = { + # C1 + 'TPR': 'C1', + 'TNR': 'C1', + 'FNR': 'C1', + 'FPR': 'C1', + 'PPV': 'C1', + 'Accuracy': 'C1', + 'F1': 'C1', + # C2 + 'Equalized_Odds_TPR': 'C2', + 'Equalized_Odds_FPR': 'C2', + 'Equalized_Odds_FNR': 'C2', + 'Disparate_Impact': 'C2', + 'Statistical_Parity_Difference': 'C2', + # C3 + 'Std': 'C3', + 'IQR': 'C3', + 'Jitter': 'C3', + 'Label_Stability': 'C3', + # C4 + 'IQR_Parity': 'C4', + 'Label_Stability_Ratio': 'C4', + 'Std_Parity': 'C4', + 'Std_Ratio': 'C4', + 'Jitter_Parity': 'C4', + } + + def get_column_alias(metric_group): + if '&' not in metric_group: + alias = metric_name_to_alias_dct[metric_group] + else: + metrics = metric_group.split('&') + alias = None + for idx, metric in enumerate(metrics): + if idx == 0: + alias = metric_name_to_alias_dct[metric] + else: + alias += ' & ' + metric_name_to_alias_dct[metric] + + return alias + + models_in_range_df['Alias'] = models_in_range_df['Metric_Group'].apply(get_column_alias) + models_in_range_df['Title'] = models_in_range_df['Alias'] + + base_font_size = 25 + bar_plot = alt.Chart(models_in_range_df).mark_bar().encode( + x=alt.X("Title", type="nominal", title='Metric Group', axis=alt.Axis(labelAngle=-30), + sort=alt.Sort(order='ascending')), + y=alt.Y("Number_of_Models", title="Number of Models", type="quantitative"), + color=alt.Color('Model_Name', legend=alt.Legend(title='Model Name')) + ).configure_axis( + labelFontSize=base_font_size + 2, + titleFontSize=base_font_size + 4, + labelFontWeight='normal', + titleFontWeight='normal', + labelLimit=300, + ).configure_title( + fontSize=base_font_size + 2 + ).configure_legend( + titleFontSize=base_font_size + 2, + labelFontSize=base_font_size, + symbolStrokeWidth=4, + labelLimit=300, + titleLimit=220, + orient='none', + legendX=345, legendY=10, + ).properties(width=650, height=450) + + return bar_plot + + +def create_models_in_range_dct(all_subgroup_metrics_per_model_dct: dict, all_group_metrics_per_model_dct: dict, + metrics_value_range_dct: dict, group: str): + # Merge subgroup and group metrics for each model and align their columns + all_metrics_for_all_models_df = pd.DataFrame() + for model_name in all_subgroup_metrics_per_model_dct.keys(): + group_metrics_per_model_df = all_group_metrics_per_model_dct[model_name][ + (all_group_metrics_per_model_dct[model_name]['Subgroup'] == group) + ] + subgroup_metrics_per_model_df = all_subgroup_metrics_per_model_dct[model_name][ + (all_subgroup_metrics_per_model_dct[model_name]['Subgroup'] == 'overall') + ] + subgroup_metrics_per_model_df['Subgroup'] = subgroup_metrics_per_model_df['Subgroup'] + aligned_subgroup_metrics_per_model_df = subgroup_metrics_per_model_df[group_metrics_per_model_df.columns] + + combined_metrics_per_model_df = pd.concat([group_metrics_per_model_df, aligned_subgroup_metrics_per_model_df]).reset_index(drop=True) + all_metrics_for_all_models_df = pd.concat([all_metrics_for_all_models_df, combined_metrics_per_model_df]) + + all_metrics_for_all_models_df = all_metrics_for_all_models_df.reset_index(drop=True) + all_metrics_for_all_models_df = all_metrics_for_all_models_df.drop(['Subgroup'], axis=1) + + # Create new columns based on values in Metric and Value columns + pivoted_model_metrics_df = all_metrics_for_all_models_df.pivot(columns='Metric', values='Value', + index=[col for col in all_metrics_for_all_models_df.columns + if col not in ('Metric', 'Value')]).reset_index() + + # Create a pandas condition for filtering based on the input value ranges + models_in_range_df = pd.DataFrame() + for idx, (metric_group, value_range) in enumerate(metrics_value_range_dct.items()): + pd_condition = None + if '&' not in metric_group: + min_range_val, max_range_val = value_range + if max_range_val < min_range_val: + raise ValueError('The second element in the input range must be greater than the first element, ' + 'so to be in the following format -- (min_range_val, max_range_val)') + metric = metric_group + pd_condition = (pivoted_model_metrics_df[metric] >= min_range_val) & (pivoted_model_metrics_df[metric] <= max_range_val) + else: + metrics = metric_group.split('&') + for idx, metric in enumerate(metrics): + min_range_val, max_range_val = metrics_value_range_dct[metric] + if max_range_val < min_range_val: + raise ValueError('The second element in the input range must be greater than the first element, ' + 'so to be in the following format -- (min_range_val, max_range_val)') + if idx == 0: + pd_condition = (pivoted_model_metrics_df[metric] >= min_range_val) & (pivoted_model_metrics_df[metric] <= max_range_val) + else: + pd_condition &= (pivoted_model_metrics_df[metric] >= min_range_val) & (pivoted_model_metrics_df[metric] <= max_range_val) + + num_satisfied_models_df = pivoted_model_metrics_df[pd_condition]['Model_Name'].value_counts().reset_index() + num_satisfied_models_df.rename(columns = {'Model_Name': 'Number_of_Models'}, inplace = True) + num_satisfied_models_df.rename(columns = {'index': 'Model_Name'}, inplace = True) + num_satisfied_models_df['Metric_Group'] = metric_group + if idx == 0: + models_in_range_df = num_satisfied_models_df + else: + # Concatenate based on rows + models_in_range_df = pd.concat([models_in_range_df, num_satisfied_models_df], ignore_index=True, sort=False) + + return models_in_range_df From de6b7d7bd02667b568a79c0f8d5ad9e73a959bec Mon Sep 17 00:00:00 2001 From: denysgerasymuk799 Date: Mon, 2 Oct 2023 17:27:52 +0300 Subject: [PATCH 06/36] Improved a metrics bar chart --- .../Multiple_Models_Interface_Vis.ipynb | 218 +----------------- .../metrics_interactive_visualizer.py | 84 ++++--- virny/utils/data_viz_utils.py | 21 +- 3 files changed, 76 insertions(+), 247 deletions(-) diff --git a/docs/examples/Multiple_Models_Interface_Vis.ipynb b/docs/examples/Multiple_Models_Interface_Vis.ipynb index 2382c421..dad3d0d5 100644 --- a/docs/examples/Multiple_Models_Interface_Vis.ipynb +++ b/docs/examples/Multiple_Models_Interface_Vis.ipynb @@ -148,14 +148,6 @@ "metrics_composer = MetricsComposer(models_metrics_dct, config.sensitive_attributes_dct)" ] }, - { - "cell_type": "markdown", - "id": "e1a23ece", - "metadata": {}, - "source": [ - "Compute composed metrics" - ] - }, { "cell_type": "code", "execution_count": 8, @@ -168,114 +160,10 @@ }, "outputs": [], "source": [ + "# Compute composed metrics\n", "models_composed_metrics_df = metrics_composer.compose_metrics()" ] }, - { - "cell_type": "code", - "execution_count": 1, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/urllib3/__init__.py:34: NotOpenSSLWarning: urllib3 v2.0 only supports OpenSSL 1.1.1+, currently the 'ssl' module is compiled with 'LibreSSL 2.8.3'. See: https://github.com/urllib3/urllib3/issues/3020\n", - " warnings.warn(\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Running on local URL: http://127.0.0.1:7860\n", - "\n", - "To create a public link, set `share=True` in `launch()`.\n" - ] - }, - { - "data": { - "text/plain": "" - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import altair as alt\n", - "import gradio as gr\n", - "import numpy as np\n", - "import pandas as pd\n", - "from vega_datasets import data\n", - "\n", - "\n", - "def make_plot(plot_type):\n", - " if plot_type == \"scatter_plot\":\n", - " cars = data.cars()\n", - " return alt.Chart(cars).mark_point().encode(\n", - " x='Horsepower',\n", - " y='Miles_per_Gallon',\n", - " color='Origin',\n", - " )\n", - " elif plot_type == \"heatmap\":\n", - " # Compute x^2 + y^2 across a 2D grid\n", - " x, y = np.meshgrid(range(-5, 5), range(-5, 5))\n", - " z = x ** 2 + y ** 2\n", - "\n", - " # Convert this grid to columnar data expected by Altair\n", - " source = pd.DataFrame({'x': x.ravel(),\n", - " 'y': y.ravel(),\n", - " 'z': z.ravel()})\n", - " return alt.Chart(source).mark_rect().encode(\n", - " x='x:O',\n", - " y='y:O',\n", - " color='z:Q'\n", - " )\n", - "\n", - "\n", - "with gr.Blocks() as demo:\n", - " button = gr.Radio(label=\"Plot type\",\n", - " choices=['scatter_plot', 'heatmap'], value='scatter_plot')\n", - " plot = gr.Plot(label=\"Plot\")\n", - " button.change(make_plot, inputs=button, outputs=[plot])\n", - " demo.load(make_plot, inputs=[button], outputs=[plot])\n", - "\n", - "\n", - "demo.launch(inline=False)" - ], - "metadata": { - "collapsed": false, - "ExecuteTime": { - "end_time": "2023-09-28T22:25:40.759154Z", - "start_time": "2023-09-28T22:25:39.629263Z" - } - }, - "id": "b9dad21b662edd59" - }, - { - "cell_type": "code", - "execution_count": 2, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Closing server running on port: 7860\n" - ] - } - ], - "source": [ - "demo.close()" - ], - "metadata": { - "collapsed": false, - "ExecuteTime": { - "end_time": "2023-09-28T22:26:12.203639Z", - "start_time": "2023-09-28T22:26:12.019693Z" - } - }, - "id": "920e2c1a81d4e810" - }, { "cell_type": "code", "execution_count": 185, @@ -338,12 +226,12 @@ }, { "cell_type": "code", - "execution_count": 212, + "execution_count": 320, "id": "435b9d98", "metadata": { "ExecuteTime": { - "end_time": "2023-10-01T23:03:56.089028Z", - "start_time": "2023-10-01T23:03:56.019414Z" + "end_time": "2023-10-02T14:23:41.153446Z", + "start_time": "2023-10-02T14:23:37.215399Z" } }, "outputs": [], @@ -373,7 +261,7 @@ "collapsed": false, "is_executing": true, "ExecuteTime": { - "start_time": "2023-10-01T23:03:56.113686Z" + "start_time": "2023-10-02T14:23:41.153322Z" } }, "id": "678a9dc8d51243f4" @@ -402,102 +290,6 @@ }, "id": "277b6d1de837dab7" }, - { - "cell_type": "code", - "execution_count": 11, - "outputs": [ - { - "data": { - "text/plain": "" - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "text/plain": "
", - "image/png": "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IT788EO9PgwePJj09HRdX/9NrVaTl5end6hlv7Ab2rY/nhdHfaQ7yssrajslANLSM/j4p//j6SfaEBLkf/MKQjwgcnOymPfNRzRs0pLmEdXfHBFCCFG908e38Mc3/XXHlVUAtS330mm2/zWdBi364ezVuLbTEULcRzKjS9wSMzMzoqKiiIqKYty4cQwaNIgJEybc0uDPnQoKCmLFihUYGRnh6uqKiUnlHc7CwkI6duxIx44dWbhwIY6OjqSlpdGxY8cqG67fyibt1Rk0aBCNGzfm7NmzzJs3j8jISLy8vG5aT6VSceDAAWJiYvj7778ZP348EydOZO/evRQUVM6QWbVqFW5ubnr1TE2v3o0tKipi//79GBoacuLECb24+Ph4GjRogLGxMba2tqxfv57HH3+cnj17EhAQQKdOnXBxcblh/7t27YqXlxdz5szB1dWViooKGjZsqHvvzG+yJK2goIBJkybRq1evKueu7AP2b9OmTdM9QfOKUYOfY8yQ5294nUdZWIMgvScjlv2z/1lufgF21ipdeW5+IV6uTtW2YWVpgYGBQZUZXzkFhdhYVc7ysrFSodGUU1hcojerKze/QBdzxdkLmXz47QI6tAqj9xNt7q6DQvyLhaUVBgYGVTaeL8jPRWllW22dyplZOXpl+Xk5qKwr45XWNpVt5OViZX110L4gLxcXd2+9enm5l/nxy4l4+gTS67mhd9cZIe6CytQEA4WC3BL97zK51czausLKzJScazaqzylWY2NefbwQNcHVtzlP/OvJiBXllQ/KKSnKwVx59TNYXZSDtaN3tW2YmluhUBigLtL/t6CkKAczi8rPdjNLWyrKNZSqC/VmdZUU5VaZPZaXdYaYPybg1+gJ6rfoczfdE0I8gGRGl7gj9evXp7Cwchq9sbEx5eXleufr1aunt3k5wK5du27rGiYmJvj7++Pt7a0b5AI4fvw4WVlZTJ8+nccff5y6devqbUR/u9e4NneARo0aERYWxpw5c1i0aJHeUsmbMTIyokOHDnz88cfEx8eTmprKpk2bqF+/PqampqSlpeHv7693eHh46OqPGDECAwMD1qxZw6xZs9i06epmzG5ubsTFxZGfX/k0pTp16rBhwwYOHz7M559/zpQpU26YW1ZWFomJiYwdO5b27dtTr149srP1l/EEBwcTFxfH5cuXq20jNDSUxMTEKn3w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" - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "visualizer.create_model_rank_heatmap(\n", - " metrics_lst=[\n", - " # Group fairness metrics\n", - " 'Equalized_Odds_TPR',\n", - " 'Equalized_Odds_FPR',\n", - " 'Disparate_Impact',\n", - " 'Statistical_Parity_Difference',\n", - " 'Accuracy_Parity',\n", - " # Group stability metrics\n", - " 'Label_Stability_Ratio',\n", - " 'IQR_Parity',\n", - " 'Std_Parity',\n", - " 'Std_Ratio',\n", - " 'Jitter_Parity',\n", - " ],\n", - " groups_lst=config.sensitive_attributes_dct.keys(),\n", - ")" - ], - "metadata": { - "collapsed": false, - "ExecuteTime": { - "end_time": "2023-09-29T20:57:58.777407Z", - "start_time": "2023-09-29T20:57:58.303858Z" - } - }, - "id": "43fca999faac66af" - }, - { - "cell_type": "code", - "execution_count": 74, - "id": "5efb1bf2", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": "\n
\n", - "text/plain": "alt.Chart(...)" - }, - "execution_count": 74, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "visualizer.create_overall_metrics_bar_char(\n", - " metrics_names=['TPR', 'PPV', 'Accuracy', 'F1', 'Selection-Rate', 'Positive-Rate'],\n", - " metrics_title=\"Error Metrics\"\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 75, - "id": "0eb8528e", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": "\n
\n", - "text/plain": "alt.Chart(...)" - }, - "execution_count": 75, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "visualizer.create_overall_metrics_bar_char(\n", - " metrics_names=['Label_Stability'],\n", - " reversed_metrics_names=['Std', 'IQR', 'Jitter'],\n", - " metrics_title=\"Variance Metrics\"\n", - ")" - ] - }, { "cell_type": "code", "execution_count": 78, diff --git a/virny/custom_classes/metrics_interactive_visualizer.py b/virny/custom_classes/metrics_interactive_visualizer.py index 567b0d33..007ff0c3 100644 --- a/virny/custom_classes/metrics_interactive_visualizer.py +++ b/virny/custom_classes/metrics_interactive_visualizer.py @@ -26,6 +26,7 @@ def __init__(self, model_metrics_dct: dict, model_composed_metrics_df: pd.DataFr self.demo = None self.model_names = list(model_metrics_dct.keys()) self.sensitive_attributes_dct = sensitive_attributes_dct + self.group_names = list(self.sensitive_attributes_dct.keys()) # Create one metrics df with all model_dfs models_metrics_df = pd.DataFrame() @@ -74,13 +75,17 @@ def start_web_app(self): """) with gr.Row(): with gr.Column(scale=2): + group_name = gr.Dropdown( + self.group_names, + value=self.group_names[0], multiselect=False, label="Group Name for Parity Metrics", + ) with gr.Row(): accuracy_metric = gr.Dropdown( ['Statistical_Bias', 'TPR', 'TNR', 'PPV', 'FNR', 'FPR', 'Accuracy', 'F1'], value='Accuracy', multiselect=False, label="Constraint 1 (C1)", scale=2 ) - acc_min_val = gr.Number(value=0.815, label="Min value", scale=1) + acc_min_val = gr.Number(value=0.7, label="Min value", scale=1) acc_max_val = gr.Number(value=0.85, label="Max value", scale=1) with gr.Row(): fairness_metric = gr.Dropdown( @@ -88,8 +93,8 @@ def start_web_app(self): value='Equalized_Odds_FPR', multiselect=False, label="Constraint 2 (C2)", scale=2 ) - fairness_min_val = gr.Number(value=-0.03, label="Min value", scale=1) - fairness_max_val = gr.Number(value=0.03, label="Max value", scale=1) + fairness_min_val = gr.Number(value=-0.15, label="Min value", scale=1) + fairness_max_val = gr.Number(value=0.15, label="Max value", scale=1) with gr.Row(): subgroup_stability_metric = gr.Dropdown( ['Std', 'IQR', 'Jitter', 'Label_Stability'], @@ -111,7 +116,8 @@ def start_web_app(self): bar_plot_for_model_selection = gr.Plot(label="Plot") btn_view1.click(self._create_bar_plot_for_model_selection, - inputs=[accuracy_metric, acc_min_val, acc_max_val, + inputs=[group_name, + accuracy_metric, acc_min_val, acc_max_val, fairness_metric, fairness_min_val, fairness_max_val, subgroup_stability_metric, subgroup_stab_min_val, subgroup_stab_max_val, group_stability_metrics, group_stab_min_val, group_stab_max_val], @@ -235,25 +241,25 @@ def start_web_app(self): def stop_web_app(self): self.demo.close() - def _create_bar_plot_for_model_selection(self, accuracy_metric, acc_min_val, acc_max_val, + def _create_bar_plot_for_model_selection(self, group_name, accuracy_metric, acc_min_val, acc_max_val, fairness_metric, fairness_min_val, fairness_max_val, subgroup_stability_metric, subgroup_stab_min_val, subgroup_stab_max_val, group_stability_metrics, group_stab_min_val, group_stab_max_val): accuracy_constraint = (accuracy_metric, acc_min_val, acc_max_val) - subgroup_stability_constraint = (subgroup_stability_metric, subgroup_stab_min_val, subgroup_stab_max_val) fairness_constraint = (fairness_metric, fairness_min_val, fairness_max_val) + subgroup_stability_constraint = (subgroup_stability_metric, subgroup_stab_min_val, subgroup_stab_max_val) group_stability_constraint = (group_stability_metrics, group_stab_min_val, group_stab_max_val) # Create individual constraints metrics_value_range_dct = dict() - for constraint in [accuracy_constraint, subgroup_stability_constraint, fairness_constraint, group_stability_constraint]: + for constraint in [accuracy_constraint, fairness_constraint, subgroup_stability_constraint, group_stability_constraint]: metrics_value_range_dct[constraint[0]] = [constraint[1], constraint[2]] # Create intersectional constraints - metrics_value_range_dct[f'{accuracy_constraint[0]}&{subgroup_stability_constraint[0]}'] = None metrics_value_range_dct[f'{accuracy_constraint[0]}&{fairness_constraint[0]}'] = None + metrics_value_range_dct[f'{accuracy_constraint[0]}&{subgroup_stability_constraint[0]}'] = None metrics_value_range_dct[f'{accuracy_constraint[0]}&{group_stability_constraint[0]}'] = None - metrics_value_range_dct[(f'{accuracy_constraint[0]}&{subgroup_stability_constraint[0]}' - f'&{fairness_constraint[0]}&{group_stability_constraint[0]}')] = None + metrics_value_range_dct[(f'{accuracy_constraint[0]}&{fairness_constraint[0]}' + f'&{subgroup_stability_constraint[0]}&{group_stability_constraint[0]}')] = None melted_all_subgroup_metrics_per_model_dct = dict() for model_name in self.melted_model_metrics_df['Model_Name'].unique(): @@ -268,7 +274,7 @@ def _create_bar_plot_for_model_selection(self, accuracy_metric, acc_min_val, acc return create_bar_plot_for_model_selection(melted_all_subgroup_metrics_per_model_dct, melted_all_group_metrics_per_model_dct, metrics_value_range_dct, - group='sex&race') + group=group_name) def _create_subgroup_model_rank_heatmap(self, model_names: list, subgroup_accuracy_metrics_lst: list, subgroup_uncertainty_metrics: list, subgroup_stability_metrics_lst: list): @@ -405,28 +411,52 @@ def _create_metrics_bar_chart_per_one_model(self, model_name: str, metrics_names (metrics_df['Model_Name'] == model_name) & (metrics_df['Subgroup'].isin(filtered_groups))] + base_font_size = 16 models_metrics_chart = ( - alt.Chart(filtered_metrics_df).mark_bar().encode( - alt.Row('Metric:N', title=metrics_title), - alt.Y('Subgroup:N', axis=None), + alt.Chart().mark_bar().encode( + alt.Y('Subgroup:N', axis=None, sort='descending'), alt.X('Value:Q', axis=alt.Axis(grid=True), title=''), alt.Color('Subgroup:N', + sort='descending', scale=alt.Scale(scheme="tableau20"), legend=alt.Legend(title=metrics_type.capitalize(), - labelFontSize=14, - titleFontSize=14) + labelFontSize=base_font_size, + titleFontSize=base_font_size + 2) ) ) - ).properties( - width=500, height=80 - ).configure_headerRow( - labelAngle=0, - labelPadding=10, - labelAlign='left', - labelFontSize=14, - titleFontSize=18 - ).configure_axis( - labelFontSize=14, titleFontSize=18 ) - return models_metrics_chart + text = ( + models_metrics_chart.mark_text( + align='left', + baseline='middle', + fontSize=base_font_size, + dx=10 + ).encode( + text=alt.Text('Value:Q', format=",.3f"), + color=alt.value("black") + ) + ) + + final_chart = ( + alt.layer( + models_metrics_chart, text, data=filtered_metrics_df + ).properties( + width=500, + height=100 + ).facet( + row=alt.Row('Metric:N', title=metrics_title) + ).configure( + padding={'top': 33}, + ).configure_headerRow( + labelAngle=0, + labelPadding=10, + labelAlign='left', + labelFontSize=base_font_size, + titleFontSize=base_font_size + 2 + ).configure_axis( + labelFontSize=base_font_size, titleFontSize=base_font_size + 2 + ) + ) + + return final_chart diff --git a/virny/utils/data_viz_utils.py b/virny/utils/data_viz_utils.py index 877979f9..c6fbe759 100644 --- a/virny/utils/data_viz_utils.py +++ b/virny/utils/data_viz_utils.py @@ -4,6 +4,7 @@ import seaborn as sns from matplotlib import pyplot as plt +from IPython.display import display from virny.utils.common_helpers import check_substring_in_list @@ -80,7 +81,7 @@ def create_model_rank_heatmap_visualization(model_metrics_matrix, sorted_matrix_ Number of models to visualize """ - font_increase = 2 + font_increase = 4 matrix_width = 20 matrix_height = model_metrics_matrix.shape[0] // 2 fig = plt.figure(figsize=(matrix_width, matrix_height)) @@ -90,7 +91,7 @@ def create_model_rank_heatmap_visualization(model_metrics_matrix, sorted_matrix_ ax.set(xlabel="", ylabel="") ax.xaxis.tick_top() ax.tick_params(labelsize=16 + font_increase) - fig.subplots_adjust(left=0.25, right=1., top=0.9) + fig.subplots_adjust(left=0.27, right=0.99, top=0.92) cbar = ax.collections[0].colorbar model_ranks = [idx for idx in range(num_models)] @@ -155,28 +156,28 @@ def get_column_alias(metric_group): models_in_range_df['Alias'] = models_in_range_df['Metric_Group'].apply(get_column_alias) models_in_range_df['Title'] = models_in_range_df['Alias'] - base_font_size = 25 + base_font_size = 14 bar_plot = alt.Chart(models_in_range_df).mark_bar().encode( x=alt.X("Title", type="nominal", title='Metric Group', axis=alt.Axis(labelAngle=-30), sort=alt.Sort(order='ascending')), y=alt.Y("Number_of_Models", title="Number of Models", type="quantitative"), color=alt.Color('Model_Name', legend=alt.Legend(title='Model Name')) + ).configure(padding={'top': 33} ).configure_axis( labelFontSize=base_font_size + 2, titleFontSize=base_font_size + 4, labelFontWeight='normal', titleFontWeight='normal', labelLimit=300, + tickMinStep=1, ).configure_title( fontSize=base_font_size + 2 ).configure_legend( - titleFontSize=base_font_size + 2, - labelFontSize=base_font_size, + titleFontSize=base_font_size + 4, + labelFontSize=base_font_size + 2, symbolStrokeWidth=4, labelLimit=300, titleLimit=220, - orient='none', - legendX=345, legendY=10, ).properties(width=650, height=450) return bar_plot @@ -209,6 +210,7 @@ def create_models_in_range_dct(all_subgroup_metrics_per_model_dct: dict, all_gro # Create a pandas condition for filtering based on the input value ranges models_in_range_df = pd.DataFrame() + model_names = pivoted_model_metrics_df['Model_Name'].unique() for idx, (metric_group, value_range) in enumerate(metrics_value_range_dct.items()): pd_condition = None if '&' not in metric_group: @@ -233,6 +235,11 @@ def create_models_in_range_dct(all_subgroup_metrics_per_model_dct: dict, all_gro num_satisfied_models_df = pivoted_model_metrics_df[pd_condition]['Model_Name'].value_counts().reset_index() num_satisfied_models_df.rename(columns = {'Model_Name': 'Number_of_Models'}, inplace = True) num_satisfied_models_df.rename(columns = {'index': 'Model_Name'}, inplace = True) + # If a constraint for a metric group is not satisfied, add zeros for all model names + if num_satisfied_models_df.shape[0] == 0: + num_satisfied_models_df = pd.DataFrame({'Model_Name': model_names, + 'Number_of_Models': [0] * len(model_names)}) + num_satisfied_models_df['Metric_Group'] = metric_group if idx == 0: models_in_range_df = num_satisfied_models_df From 3afea56eece3c7c01743e255ec589cf77324beb0 Mon Sep 17 00:00:00 2001 From: denysgerasymuk799 Date: Mon, 2 Oct 2023 20:56:12 +0300 Subject: [PATCH 07/36] Tested a gradio app on a big metrics df --- .../Multiple_Models_Interface_Vis.ipynb | 15 +- ...ple_Models_Interface_Vis_Big_Example.ipynb | 292 ++++++++++++++++++ docs/examples/group_metrics_sample.csv | 133 ++++++++ docs/examples/subgroup_metrics_sample.csv | 221 +++++++++++++ .../metrics_interactive_visualizer.py | 9 +- virny/utils/data_viz_utils.py | 24 +- 6 files changed, 674 insertions(+), 20 deletions(-) create mode 100644 docs/examples/Multiple_Models_Interface_Vis_Big_Example.ipynb create mode 100644 docs/examples/group_metrics_sample.csv create mode 100644 docs/examples/subgroup_metrics_sample.csv diff --git a/docs/examples/Multiple_Models_Interface_Vis.ipynb b/docs/examples/Multiple_Models_Interface_Vis.ipynb index dad3d0d5..14fb79b7 100644 --- a/docs/examples/Multiple_Models_Interface_Vis.ipynb +++ b/docs/examples/Multiple_Models_Interface_Vis.ipynb @@ -226,12 +226,12 @@ }, { "cell_type": "code", - "execution_count": 320, + "execution_count": 322, "id": "435b9d98", "metadata": { "ExecuteTime": { - "end_time": "2023-10-02T14:23:41.153446Z", - "start_time": "2023-10-02T14:23:37.215399Z" + "end_time": "2023-10-02T17:55:10.703782Z", + "start_time": "2023-10-02T17:55:06.041613Z" } }, "outputs": [], @@ -242,7 +242,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 323, "outputs": [ { "name": "stdout", @@ -250,7 +250,8 @@ "text": [ "Running on local URL: http://127.0.0.1:7860\n", "\n", - "To create a public link, set `share=True` in `launch()`.\n" + "To create a public link, set `share=True` in `launch()`.\n", + "Keyboard interruption in main thread... closing server.\n" ] } ], @@ -259,9 +260,9 @@ ], "metadata": { "collapsed": false, - "is_executing": true, "ExecuteTime": { - "start_time": "2023-10-02T14:23:41.153322Z" + "end_time": "2023-10-02T17:55:47.535767Z", + "start_time": "2023-10-02T17:55:10.703964Z" } }, "id": "678a9dc8d51243f4" diff --git a/docs/examples/Multiple_Models_Interface_Vis_Big_Example.ipynb b/docs/examples/Multiple_Models_Interface_Vis_Big_Example.ipynb new file mode 100644 index 00000000..abc20ff4 --- /dev/null +++ b/docs/examples/Multiple_Models_Interface_Vis_Big_Example.ipynb @@ -0,0 +1,292 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "248cbed8", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-02T17:17:48.735994Z", + "start_time": "2023-10-02T17:17:48.334219Z" + } + }, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "%load_ext autoreload\n", + "%autoreload 2" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "7ec6cd08", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-02T17:17:48.745045Z", + "start_time": "2023-10-02T17:17:48.736330Z" + } + }, + "outputs": [], + "source": [ + "import os\n", + "import warnings\n", + "warnings.filterwarnings('ignore')\n", + "os.environ[\"PYTHONWARNINGS\"] = \"ignore\"" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "b8cb69f2", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-02T17:17:48.756222Z", + "start_time": "2023-10-02T17:17:48.745173Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Current location: /Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny\n" + ] + } + ], + "source": [ + "cur_folder_name = os.getcwd().split('/')[-1]\n", + "if cur_folder_name != \"Virny\":\n", + " os.chdir(\"../..\")\n", + "\n", + "print('Current location: ', os.getcwd())" + ] + }, + { + "cell_type": "markdown", + "id": "a578f2ab", + "metadata": {}, + "source": [ + "# Multiple Models Interface Usage" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "7a9241de", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-02T17:17:53.361336Z", + "start_time": "2023-10-02T17:17:48.754954Z" + } + }, + "outputs": [], + "source": [ + "import os\n", + "import pandas as pd\n", + "\n", + "from virny.custom_classes.metrics_interactive_visualizer import MetricsInteractiveVisualizer" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "outputs": [], + "source": [ + "sensitive_attributes_dct = {'SEX': '2', 'RAC1P': ['2', '3', '4', '5', '6', '7', '8', '9'], 'SEX&RAC1P': None}" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2023-10-02T17:17:53.387585Z", + "start_time": "2023-10-02T17:17:53.364121Z" + } + }, + "id": "d3c53c7b72ecbcd0" + }, + { + "cell_type": "code", + "execution_count": 7, + "outputs": [], + "source": [ + "ROOT_DIR = os.path.join('docs', 'examples')\n", + "subgroup_metrics_df = pd.read_csv(os.path.join(ROOT_DIR, 'subgroup_metrics_sample.csv'), header=0)\n", + "models_composed_metrics_df = pd.read_csv(os.path.join(ROOT_DIR, 'group_metrics_sample.csv'), header=0)" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2023-10-02T17:19:48.959080Z", + "start_time": "2023-10-02T17:19:48.892728Z" + } + }, + "id": "2aab7c79ecdee914" + }, + { + "cell_type": "code", + "execution_count": 9, + "outputs": [], + "source": [ + "subgroup_metrics_df['Model_Name'] = (subgroup_metrics_df['Model_Name'] + '__alpha=' +\n", + " subgroup_metrics_df['Intervention_Param'].astype(str))\n", + "models_composed_metrics_df['Model_Name'] = (models_composed_metrics_df['Model_Name'] + '__alpha=' \n", + " + models_composed_metrics_df['Intervention_Param'].astype(str))" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2023-10-02T17:20:12.234612Z", + "start_time": "2023-10-02T17:20:12.185239Z" + } + }, + "id": "2d922003e752a4b4" + }, + { + "cell_type": "code", + "execution_count": 10, + "outputs": [], + "source": [ + "models_metrics_dct = dict()\n", + "for model_name in subgroup_metrics_df['Model_Name'].unique():\n", + " models_metrics_dct[model_name] = subgroup_metrics_df[subgroup_metrics_df['Model_Name'] == model_name]" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2023-10-02T17:20:13.514668Z", + "start_time": "2023-10-02T17:20:13.478758Z" + } + }, + "id": "833484748ed512e8" + }, + { + "cell_type": "code", + "execution_count": 11, + "outputs": [ + { + "data": { + "text/plain": "dict_keys(['LGBMClassifier__alpha=0.7', 'LGBMClassifier__alpha=0.0', 'LGBMClassifier__alpha=0.4', 'LogisticRegression__alpha=0.0', 'LogisticRegression__alpha=0.7', 'LogisticRegression__alpha=0.4', 'MLPClassifier__alpha=0.0', 'MLPClassifier__alpha=0.7', 'MLPClassifier__alpha=0.4', 'RandomForestClassifier__alpha=0.4', 'RandomForestClassifier__alpha=0.7', 'RandomForestClassifier__alpha=0.0'])" + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "models_metrics_dct.keys()" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2023-10-02T17:20:14.063914Z", + "start_time": "2023-10-02T17:20:14.031614Z" + } + }, + "id": "15ed7d1ba1f22317" + }, + { + "cell_type": "markdown", + "id": "deb45226", + "metadata": {}, + "source": [ + "## Metrics Visualization and Reporting" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "435b9d98", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-02T17:53:01.433697Z", + "start_time": "2023-10-02T17:53:01.373046Z" + } + }, + "outputs": [], + "source": [ + "visualizer = MetricsInteractiveVisualizer(models_metrics_dct, models_composed_metrics_df,\n", + " sensitive_attributes_dct=sensitive_attributes_dct)" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running on local URL: http://127.0.0.1:7860\n", + "\n", + "To create a public link, set `share=True` in `launch()`.\n", + "Keyboard interruption in main thread... closing server.\n" + ] + } + ], + "source": [ + "visualizer.start_web_app()" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2023-10-02T17:54:57.507776Z", + "start_time": "2023-10-02T17:53:01.479901Z" + } + }, + "id": "678a9dc8d51243f4" + }, + { + "cell_type": "code", + "execution_count": 17, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Closing server running on port: 7860\n" + ] + } + ], + "source": [ + "visualizer.stop_web_app()" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2023-09-29T21:41:49.927075Z", + "start_time": "2023-09-29T21:41:49.639933Z" + } + }, + "id": "277b6d1de837dab7" + }, + { + "cell_type": "code", + "execution_count": 78, + "id": "2326c129", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/examples/group_metrics_sample.csv b/docs/examples/group_metrics_sample.csv new file mode 100644 index 00000000..25b06763 --- /dev/null +++ b/docs/examples/group_metrics_sample.csv @@ -0,0 +1,133 @@ +Metric,SEX,RAC1P,SEX&RAC1P,Model_Name,Intervention_Param +Equalized_Odds_TPR,-0.03079268292682924,0.11074514666563329,0.05249773566501781,LGBMClassifier,0.7 +Equalized_Odds_FPR,-0.02131701139721401,0.0009518370454978109,-0.00700793796337533,LGBMClassifier,0.7 +Equalized_Odds_FNR,0.030792682926829296,-0.11074514666563334,-0.05249773566501781,LGBMClassifier,0.7 +Disparate_Impact,1.0451749734888653,1.3342133960856337,1.248406706539857,LGBMClassifier,0.7 +Statistical_Parity_Difference,0.03246951219512195,0.22563645522532638,0.17651362084581623,LGBMClassifier,0.7 +Accuracy_Parity,0.04775641025641031,0.07497732132443469,0.0652173913043479,LGBMClassifier,0.7 +Label_Stability_Ratio,1.0095819811577007,1.0301209785116932,1.012842085178694,LGBMClassifier,0.7 +IQR_Parity,-0.0026551143311698278,-0.00967660527132716,-0.005313076583927184,LGBMClassifier,0.7 +Std_Parity,-0.002214117425894342,-0.00706110127509476,-0.004207550960833459,LGBMClassifier,0.7 +Std_Ratio,0.9581473862978338,0.8695701641666075,0.9199532195084829,LGBMClassifier,0.7 +Jitter_Parity,-0.007536566378903806,-0.019030010009223178,-0.009410112766584558,LGBMClassifier,0.7 +Equalized_Odds_TPR,-0.01097560975609757,-0.00598674778160968,-0.05549362502612687,LGBMClassifier,0.0 +Equalized_Odds_FPR,-0.025116082735331363,-0.014481520763645256,-0.019877655812003875,LGBMClassifier,0.0 +Equalized_Odds_FNR,0.01097560975609757,0.005986747781609625,0.055493625026126925,LGBMClassifier,0.0 +Disparate_Impact,1.0739042728773152,1.1095233662260287,1.0641057210867602,LGBMClassifier,0.0 +Statistical_Parity_Difference,0.061432926829268264,0.09117681249273446,0.05441371141921547,LGBMClassifier,0.0 +Accuracy_Parity,0.04294871794871791,0.037355018466921575,0.032355915065722995,LGBMClassifier,0.0 +Label_Stability_Ratio,1.013086132198451,1.0203793128013074,1.0132200761605896,LGBMClassifier,0.0 +IQR_Parity,-0.0030377716953829265,-0.007959024854970922,-0.005539567672418727,LGBMClassifier,0.0 +Std_Parity,-0.0021021596178428525,-0.005701112525753914,-0.0038189830524456084,LGBMClassifier,0.0 +Std_Ratio,0.9643024235570372,0.9045579272645509,0.9347582189106831,LGBMClassifier,0.0 +Jitter_Parity,-0.008137675557275542,-0.013465396867056778,-0.009009568683773159,LGBMClassifier,0.0 +Equalized_Odds_TPR,-0.039253048780487854,-0.031483705971248166,-0.11670034139204344,LGBMClassifier,0.4 +Equalized_Odds_FPR,-0.00873786407766991,-0.013488890701911838,-0.010826281732205081,LGBMClassifier,0.4 +Equalized_Odds_FNR,0.039253048780487854,0.03148370597124811,0.1167003413920435,LGBMClassifier,0.4 +Disparate_Impact,1.0594573415613675,1.0609451814521111,0.9916513681265844,LGBMClassifier,0.4 +Statistical_Parity_Difference,0.046265243902439024,0.04779710931142722,-0.00665366125548672,LGBMClassifier,0.4 +Accuracy_Parity,0.02841880341880343,0.034390591589451236,0.015897090214582632,LGBMClassifier,0.4 +Label_Stability_Ratio,1.0214945785801577,1.021203066210909,1.0204956799007319,LGBMClassifier,0.4 +IQR_Parity,-0.004103223054099589,-0.008620361682032895,-0.006324316490461224,LGBMClassifier,0.4 +Std_Parity,-0.0030876402128535846,-0.006194968170589871,-0.004796370058731313,LGBMClassifier,0.4 +Std_Ratio,0.9493557726215703,0.8992698436233884,0.9204716301184785,LGBMClassifier,0.4 +Jitter_Parity,-0.01200876712622645,-0.015122226339372366,-0.012784745357312319,LGBMClassifier,0.4 +Equalized_Odds_TPR,-0.06996951219512193,-0.01604215910411899,-0.10732947815787641,LogisticRegression,0.0 +Equalized_Odds_FPR,-0.023723089911355008,-0.04367572271627097,-0.042787718424982316,LogisticRegression,0.0 +Equalized_Odds_FNR,0.06996951219512193,0.01604215910411899,0.10732947815787636,LogisticRegression,0.0 +Disparate_Impact,0.9908320359799343,0.9996470017208666,0.9084844203751667,LogisticRegression,0.0 +Statistical_Parity_Difference,-0.008079268292682906,-0.00030999341263993063,-0.08123737197798375,LogisticRegression,0.0 +Accuracy_Parity,0.01816239316239321,0.05037905786302077,0.031457139647230625,LogisticRegression,0.0 +Label_Stability_Ratio,1.009100642398287,1.023801267627326,1.0076597165218943,LogisticRegression,0.0 +IQR_Parity,-0.006097632012806539,-0.006310527017404574,-0.0065692439650302525,LogisticRegression,0.0 +Std_Parity,-0.004906109963734577,-0.004854434742104861,-0.005207661750716387,LogisticRegression,0.0 +Std_Ratio,0.9086406912235572,0.9082781978742059,0.9003166552931693,LogisticRegression,0.0 +Jitter_Parity,-0.0055498432332622555,-0.01576926661754173,-0.006298770939673112,LogisticRegression,0.0 +Equalized_Odds_TPR,-0.04298780487804876,0.08555818188863484,0.017661812861422654,LogisticRegression,0.7 +Equalized_Odds_FPR,-0.003925707049387925,-0.030295613390987464,-0.022281313038694295,LogisticRegression,0.7 +Equalized_Odds_FNR,0.04298780487804876,-0.0855581818886349,-0.01766181286142271,LogisticRegression,0.7 +Disparate_Impact,1.0570386018820819,1.15227520571032,1.1070776454221372,LogisticRegression,0.7 +Statistical_Parity_Difference,0.04527439024390245,0.11903747045375279,0.08580087786525459,LogisticRegression,0.7 +Accuracy_Parity,0.02147435897435901,0.07841152076718727,0.05596749428903114,LogisticRegression,0.7 +Label_Stability_Ratio,0.9984503821387735,1.0050781309776278,0.9984788609152078,LogisticRegression,0.7 +IQR_Parity,-0.0030463198184801366,-0.0007317941412861503,-0.0023944641804607703,LogisticRegression,0.7 +Std_Parity,-0.002576978265789877,-0.00016051358574650093,-0.0019729774914916606,LogisticRegression,0.7 +Std_Ratio,0.9398193735885796,0.9961448364837571,0.9529382123765405,LogisticRegression,0.7 +Jitter_Parity,0.0017610005153971056,-0.0049119190685485425,0.0009849212357710413,LogisticRegression,0.7 +Equalized_Odds_TPR,-0.062347560975609784,-0.0033518037741697704,-0.09653034208876188,LogisticRegression,0.4 +Equalized_Odds_FPR,-0.019607429295061207,-0.030417992439694327,-0.030016242697335674,LogisticRegression,0.4 +Equalized_Odds_FNR,0.06234756097560973,0.0033518037741697704,0.09653034208876193,LogisticRegression,0.4 +Disparate_Impact,1.0087170907810161,1.050002258457925,0.961194506547429,LogisticRegression,0.4 +Statistical_Parity_Difference,0.007545731707317094,0.042895338474057354,-0.0338605169650944,LogisticRegression,0.4 +Accuracy_Parity,0.019230769230769273,0.046207801464394516,0.026120660599932566,LogisticRegression,0.4 +Label_Stability_Ratio,1.0072028640298956,1.0153655245856517,1.000428717824364,LogisticRegression,0.4 +IQR_Parity,-0.0068586087713478905,-0.005069227313861113,-0.005323993156258602,LogisticRegression,0.4 +Std_Parity,-0.005429382866877996,-0.004096338358900525,-0.004725493931369902,LogisticRegression,0.4 +Std_Ratio,0.8999072809699203,0.9226669785897548,0.909905157452225,LogisticRegression,0.4 +Jitter_Parity,-0.004078888029894576,-0.01278422827543911,-0.003752072160978573,LogisticRegression,0.4 +Equalized_Odds_TPR,-0.019435975609756184,-0.03632735304374779,-0.07838082630808896,MLPClassifier,0.0 +Equalized_Odds_FPR,-0.0587378640776699,-0.05070571918087624,-0.06589426527992455,MLPClassifier,0.0 +Equalized_Odds_FNR,0.019435975609756073,0.036327353043747845,0.0783808263080889,MLPClassifier,0.0 +Disparate_Impact,0.9938211382113822,0.9835774706003713,0.9036308734717926,MLPClassifier,0.0 +Statistical_Parity_Difference,-0.005792682926829218,-0.01542217227883913,-0.09116560997700829,MLPClassifier,0.0 +Accuracy_Parity,0.05256410256410249,0.04415862113652558,0.05033142343556907,MLPClassifier,0.0 +Label_Stability_Ratio,1.0400222540384076,1.052024430659532,1.0377142721189696,MLPClassifier,0.0 +IQR_Parity,-0.023103483282492315,-0.02199865172956933,-0.021084662231184464,MLPClassifier,0.0 +Std_Parity,-0.017047311682108574,-0.014482498155605067,-0.015528142059770114,MLPClassifier,0.0 +Std_Ratio,0.8378767214807724,0.8575668018548829,0.8441550952374669,MLPClassifier,0.0 +Jitter_Parity,-0.024276623502126712,-0.02999195460552799,-0.02431443345626763,MLPClassifier,0.0 +Equalized_Odds_TPR,-0.018978658536585313,0.05504320533188678,-0.03720476555423957,MLPClassifier,0.7 +Equalized_Odds_FPR,-0.04624314056563952,-0.015542139185771395,-0.04150402137748552,MLPClassifier,0.7 +Equalized_Odds_FNR,0.01897865853658537,-0.05504320533188667,0.037204765554239516,MLPClassifier,0.7 +Disparate_Impact,0.9976159911975059,1.1685710118150436,0.9892333472978635,MLPClassifier,0.7 +Statistical_Parity_Difference,-0.0019817073170732558,0.134343395202852,-0.008952832160523894,MLPClassifier,0.7 +Accuracy_Parity,0.05566239316239319,0.05791971748849867,0.05465678013706321,MLPClassifier,0.7 +Label_Stability_Ratio,1.0116825655056816,1.0147414387548623,1.0142450823394442,MLPClassifier,0.7 +IQR_Parity,-0.015967185873185546,-0.007739632168905608,-0.010375957070957897,MLPClassifier,0.7 +Std_Parity,-0.011280373369031718,-0.0052215839220306065,-0.00846586522301801,MLPClassifier,0.7 +Std_Ratio,0.8633086261228244,0.9337434540716136,0.8922451079710022,MLPClassifier,0.7 +Jitter_Parity,-0.011206411330150795,-0.010024072689631416,-0.009159063489553684,MLPClassifier,0.7 +Equalized_Odds_TPR,-0.018064024390243905,-0.018541480993528814,-0.07190134466662024,MLPClassifier,0.4 +Equalized_Odds_FPR,-0.0478682988602786,-0.03377661744309374,-0.04670430431479396,MLPClassifier,0.4 +Equalized_Odds_FNR,0.018064024390243905,0.01854148099352887,0.07190134466662024,MLPClassifier,0.4 +Disparate_Impact,1.0122367435278448,1.0388483701545854,0.9596397347000302,MLPClassifier,0.4 +Statistical_Parity_Difference,0.01120426829268295,0.03539737280582789,-0.03730927332265033,MLPClassifier,0.4 +Accuracy_Parity,0.04732905982905977,0.03914501393118641,0.039358873534808825,MLPClassifier,0.4 +Label_Stability_Ratio,1.0380533656761675,1.050281055097938,1.039143933855558,MLPClassifier,0.4 +IQR_Parity,-0.021800317105360498,-0.01979599811428892,-0.019109923987836203,MLPClassifier,0.4 +Std_Parity,-0.016632398891789663,-0.013618988897571183,-0.014615438426665558,MLPClassifier,0.4 +Std_Ratio,0.8411837472975571,0.8653910518588449,0.8527524702482466,MLPClassifier,0.4 +Jitter_Parity,-0.023205391272604736,-0.028007441470945263,-0.022731439845363424,MLPClassifier,0.4 +Equalized_Odds_TPR,-0.013109756097560932,0.03212306738481807,-0.022085975057479224,RandomForestClassifier,0.4 +Equalized_Odds_FPR,-0.01192486281131279,-0.004963150308667147,-0.006942443216054084,RandomForestClassifier,0.4 +Equalized_Odds_FNR,0.013109756097560987,-0.03212306738481807,0.02208597505747928,RandomForestClassifier,0.4 +Disparate_Impact,1.0743556828280834,1.1590880271867312,1.1109037589976007,RandomForestClassifier,0.4 +Statistical_Parity_Difference,0.05739329268292681,0.12153679234316273,0.08695046331777334,RandomForestClassifier,0.4 +Accuracy_Parity,0.03856837606837615,0.04690436078533011,0.036587649327790794,RandomForestClassifier,0.4 +Label_Stability_Ratio,1.0010830866898295,1.0245213649857032,1.0016860934867435,RandomForestClassifier,0.4 +IQR_Parity,-0.0024315475130579356,-0.007422421027040563,-0.006348073239051066,RandomForestClassifier,0.4 +Std_Parity,-0.001890817887290966,-0.006005398383778858,-0.005054462180121233,RandomForestClassifier,0.4 +Std_Ratio,0.9693944783088382,0.9044128961451383,0.9181358364959677,RandomForestClassifier,0.4 +Jitter_Parity,-0.0029367081132166684,-0.015830939834926464,-0.004035590076358689,RandomForestClassifier,0.4 +Equalized_Odds_TPR,-0.013262195121951259,0.09049870190258458,0.0275900508604473,RandomForestClassifier,0.7 +Equalized_Odds_FPR,-0.004706627268889818,0.005180713061923803,0.004610830211417033,RandomForestClassifier,0.7 +Equalized_Odds_FNR,0.013262195121951204,-0.09049870190258458,-0.0275900508604473,RandomForestClassifier,0.7 +Disparate_Impact,1.086494036746535,1.2810291207237774,1.2183023097164019,RandomForestClassifier,0.7 +Statistical_Parity_Difference,0.06135670731707321,0.19258340760258852,0.15606493416010592,RandomForestClassifier,0.7 +Accuracy_Parity,0.04049145299145296,0.06377567550055074,0.04785979103471516,RandomForestClassifier,0.7 +Label_Stability_Ratio,1.0042931659613945,1.0158033089241028,0.997701913713356,RandomForestClassifier,0.7 +IQR_Parity,-0.0021576183268891685,-0.0011512403501528212,-0.00012869147334378106,RandomForestClassifier,0.7 +Std_Parity,-0.002107574597948185,-0.0019021823908419097,-0.001451921355860343,RandomForestClassifier,0.7 +Std_Ratio,0.962673667602888,0.9660752793094682,0.9739339258916726,RandomForestClassifier,0.7 +Jitter_Parity,-0.004579489326979741,-0.010039410100458009,-0.0014495632866055874,RandomForestClassifier,0.7 +Equalized_Odds_TPR,-0.006478658536585358,0.034680513039097915,-0.010276597227060535,RandomForestClassifier,0.0 +Equalized_Odds_FPR,-0.018446601941747576,-0.00981751924070598,-0.010793534358544452,RandomForestClassifier,0.0 +Equalized_Odds_FNR,0.006478658536585358,-0.034680513039097915,0.010276597227060535,RandomForestClassifier,0.0 +Disparate_Impact,1.0696725293946165,1.149977548271217,1.1161027349228612,RandomForestClassifier,0.0 +Statistical_Parity_Difference,0.05464939024390236,0.11648002479947306,0.09228035950672331,RandomForestClassifier,0.0 +Accuracy_Parity,0.043910256410256476,0.04994168340568905,0.04126877129910489,RandomForestClassifier,0.0 +Label_Stability_Ratio,1.0018200544605445,1.031331519636685,1.0152022947420831,RandomForestClassifier,0.0 +IQR_Parity,-0.0014266839924084312,-0.005259735864872772,-0.003978617177466615,RandomForestClassifier,0.0 +Std_Parity,-0.0014799865759114808,-0.0045115073360025085,-0.003718279422753004,RandomForestClassifier,0.0 +Std_Ratio,0.9712188827286748,0.913538681205104,0.9275913116942456,RandomForestClassifier,0.0 +Jitter_Parity,-0.0018609822617384336,-0.017820314313740024,-0.008520772043575799,RandomForestClassifier,0.0 diff --git a/docs/examples/subgroup_metrics_sample.csv b/docs/examples/subgroup_metrics_sample.csv new file mode 100644 index 00000000..f9e45d09 --- /dev/null +++ b/docs/examples/subgroup_metrics_sample.csv @@ -0,0 +1,221 @@ +Metric,Model_Name,Model_Params,Dataset_Name,Intervention_Param,RAC1P_dis,RAC1P_priv,SEX&RAC1P_dis,SEX&RAC1P_priv,SEX_dis,SEX_priv,overall +Accuracy,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 10, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.7,0.8299180327868853,0.7549407114624506,0.8333333333333334,0.7681159420289855,0.8041666666666667,0.7564102564102564,0.7793333333333333 +Aleatoric_Uncertainty,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 10, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.7,0.574768407248688,0.5867152963701037,0.5751925521025802,0.5844148021106594,0.5625457885372674,0.6015511473295796,0.5828285751092698 +F1,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 10, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.7,0.6666666666666666,0.6242424242424243,0.6324786324786325,0.6363636363636364,0.6072423398328691,0.6545454545454545,0.6358635863586358 +FNR,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 10, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.7,0.366412213740458,0.47715736040609136,0.4032258064516129,0.4557235421166307,0.4682926829268293,0.4375,0.44952380952380955 +FPR,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 10, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.7,0.09803921568627451,0.0970873786407767,0.09183673469387756,0.09884467265725289,0.08737864077669903,0.10869565217391304,0.09743589743589744 +IQR,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 10, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.7,0.06280707944938806,0.07248368472071522,0.06493633506095174,0.07024941164487893,0.06795490302023513,0.07061001735140496,0.06933556247244345 +Jitter,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 10, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.7,0.05725214185682598,0.07628215186604916,0.062299481905650766,0.07170959467223532,0.0661720407593532,0.07370860713825701,0.07009105527638122 +Label_Stability,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 10, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.7,0.9190368852459017,0.8921640316205534,0.9104651162790697,0.8989210950080515,0.905375,0.8967820512820512,0.9009066666666667 +Mean,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 10, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.7,0.7085616306769631,0.6862178585472839,0.7245281799737864,0.6870388713260648,0.7252005764269102,0.6642129917856846,0.6934870324134728 +Overall_Uncertainty,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 10, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.7,0.5874845827200873,0.6027417432630668,0.5884432399246448,0.5997172018108436,0.5773910073017967,0.616596917041452,0.5977780803664176 +PPV,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 10, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.7,0.7033898305084746,0.7744360902255639,0.6727272727272727,0.7659574468085106,0.7077922077922078,0.782608695652174,0.7526041666666666 +Per_Sample_Accuracy,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 10, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.7,0.828125,0.7573962450592885,0.8262015503875969,0.7708937198067634,0.8038958333333333,0.7587243589743589,0.7804066666666668 +Positive-Rate,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 10, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.7,0.9007633587786259,0.6751269035532995,0.8870967741935484,0.7105831533477321,0.751219512195122,0.71875,0.7314285714285714 +Sample_Size,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 10, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.7,488.0,1012.0,258.0,1242.0,720.0,780.0,1500.0 +Selection-Rate,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 10, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.7,0.24180327868852458,0.2628458498023715,0.2131782945736434,0.2648953301127214,0.21388888888888888,0.2948717948717949,0.256 +Std,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 10, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.7,0.04707606166754985,0.05413716294264461,0.04835609913224369,0.05256365009307715,0.05068861026634873,0.05290272769224307,0.051839951327813785 +TNR,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 10, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.7,0.9019607843137255,0.9029126213592233,0.9081632653061225,0.9011553273427471,0.912621359223301,0.8913043478260869,0.9025641025641026 +TPR,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 10, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.7,0.6335877862595419,0.5228426395939086,0.5967741935483871,0.5442764578833693,0.5317073170731708,0.5625,0.5504761904761905 +Accuracy,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.0,0.8278688524590164,0.7905138339920948,0.8294573643410853,0.7971014492753623,0.825,0.782051282051282,0.8026666666666666 +Aleatoric_Uncertainty,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.0,0.5633808779503379,0.6053039361523177,0.5635466006397141,0.5975059813694559,0.5732441010754783,0.6086688449379051,0.5916649678839402 +F1,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.0,0.6666666666666666,0.7063711911357341,0.6271186440677966,0.705607476635514,0.6752577319587629,0.7098976109215017,0.6960985626283368 +FNR,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.0,0.35877862595419846,0.35279187817258884,0.4032258064516129,0.34773218142548595,0.36097560975609755,0.35,0.35428571428571426 +FPR,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.0,0.10364145658263306,0.11812297734627832,0.09693877551020408,0.11681643132220795,0.10097087378640776,0.12608695652173912,0.11282051282051282 +IQR,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.0,0.0717782678051346,0.07973729266010553,0.0725611945411923,0.07810076221361102,0.07556831529235587,0.0786060869877388,0.077147956573955 +Jitter,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.0,0.06448780789191826,0.07795320475897503,0.06611253944139346,0.07512210812516662,0.06934087102177533,0.07747854657905087,0.07357246231155734 +Label_Stability,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.0,0.9095491803278689,0.8913833992094861,0.907093023255814,0.895257648953301,0.9033611111111111,0.8916923076923077,0.8972933333333334 +Mean,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.0,0.6957755997986098,0.6346221249287431,0.7150553202294089,0.6419418764174092,0.689198775103901,0.6225038013523088,0.6545173887530731 +Overall_Uncertainty,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.0,0.5802610784913662,0.6241481189584432,0.5806878176395618,0.6159322429458329,0.5913806977913604,0.6269374362563485,0.6098702017931542 +PPV,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.0,0.6942148760330579,0.7774390243902439,0.6607142857142857,0.7684478371501272,0.7158469945355191,0.7819548872180451,0.755011135857461 +Per_Sample_Accuracy,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.0,0.82547131147541,0.7838833992094861,0.8217635658914728,0.7923550724637681,0.8145833333333333,0.7815641025641025,0.7974133333333333 +Positive-Rate,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.0,0.9236641221374046,0.8324873096446701,0.9032258064516129,0.8488120950323974,0.8926829268292683,0.83125,0.8552380952380952 +Sample_Size,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.0,488.0,1012.0,258.0,1242.0,720.0,780.0,1500.0 +Selection-Rate,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.0,0.24795081967213115,0.3241106719367589,0.21705426356589147,0.3164251207729469,0.25416666666666665,0.34102564102564104,0.29933333333333334 +Std,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.0,0.05403263342459364,0.059733745950347555,0.05471686604121065,0.05853584909365626,0.05678586100735733,0.05888802062520018,0.057878984008635614 +TNR,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.0,0.896358543417367,0.8818770226537217,0.9030612244897959,0.883183568677792,0.8990291262135922,0.8739130434782608,0.8871794871794871 +TPR,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.0,0.6412213740458015,0.6472081218274112,0.5967741935483871,0.652267818574514,0.6390243902439025,0.65,0.6457142857142857 +Accuracy,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.4,0.8278688524590164,0.7934782608695652,0.8178294573643411,0.8019323671497585,0.8194444444444444,0.791025641025641,0.8046666666666666 +Aleatoric_Uncertainty,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.4,0.5551920500099683,0.6160978769562332,0.5546274648036941,0.6049363010992105,0.5746912318145948,0.6162142115103388,0.5962831812563817 +F1,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.4,0.65,0.7027027027027027,0.5765765765765766,0.7043269230769231,0.6524064171122995,0.7135325131810193,0.689289501590668 +FNR,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.4,0.40458015267175573,0.3730964467005076,0.4838709677419355,0.367170626349892,0.40487804878048783,0.365625,0.38095238095238093 +FPR,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.4,0.08683473389355742,0.10032362459546926,0.08673469387755102,0.0975609756097561,0.0912621359223301,0.1,0.09538461538461539 +IQR,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.4,0.07359398945751415,0.08221435113954705,0.07417332608489044,0.08049764257535166,0.07727618415086056,0.08137940720496015,0.07940986013899233 +Jitter,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.4,0.06965174231814622,0.08477396865751859,0.06926843519925442,0.08205318055656674,0.07360964544947027,0.08561841257569672,0.07985420435511108 +Label_Stability,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.4,0.8993852459016393,0.8807114624505928,0.9017829457364341,0.883671497584541,0.8965972222222222,0.8777307692307692,0.8867866666666667 +Mean,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.4,0.7141488205426961,0.6441152206909166,0.7326595827361654,0.6532391750548413,0.6999423689094346,0.6363983617298083,0.6668994851760289 +Overall_Uncertainty,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.4,0.5729327590451901,0.6355678274191867,0.5723997447559693,0.624079463458317,0.5933199449151484,0.6353788043889269,0.6151905518415132 +PPV,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.4,0.7155963302752294,0.7993527508090615,0.6530612244897959,0.7940379403794038,0.7218934911242604,0.8152610441767069,0.777511961722488 +Per_Sample_Accuracy,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.4,0.8241188524590164,0.7855237154150199,0.8176744186046511,0.7940096618357488,0.8138402777777777,0.7835320512820513,0.7980799999999999 +Positive-Rate,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.4,0.8320610687022901,0.7842639593908629,0.7903225806451613,0.796976241900648,0.824390243902439,0.778125,0.7961904761904762 +Sample_Size,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.4,488.0,1012.0,258.0,1242.0,720.0,780.0,1500.0 +Selection-Rate,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.4,0.22336065573770492,0.30533596837944665,0.18992248062015504,0.2971014492753623,0.23472222222222222,0.3192307692307692,0.2786666666666667 +Statistical_Bias,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.4,0.2485877124816216,0.2850127848791134,0.2544548274710566,0.2770486284228354,0.25981461969725383,0.28548361000855305,0.2731624946591294 +Std,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.4,0.05530566275693515,0.06150063092752502,0.055513806874063584,0.0603101769327949,0.05787962837200925,0.06096726858486284,0.05948520128269312 +TNR,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.4,0.9131652661064426,0.8996763754045307,0.9132653061224489,0.9024390243902439,0.9087378640776699,0.9,0.9046153846153846 +TPR,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Folktables_GA_2018_Income,0.4,0.5954198473282443,0.6269035532994924,0.5161290322580645,0.6328293736501079,0.5951219512195122,0.634375,0.6190476190476191 +Accuracy,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.0,0.860655737704918,0.8102766798418972,0.8527131782945736,0.821256038647343,0.8361111111111111,0.8179487179487179,0.8266666666666667 +Aleatoric_Uncertainty,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.0,0.518266140432632,0.5917375980647225,0.5207079123887619,0.5776245445864114,0.5540758647380297,0.5805355168733874,0.5678348838484157 +F1,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.0,0.7235772357723578,0.7405405405405405,0.6607142857142857,0.7459954233409611,0.6927083333333334,0.7641196013289037,0.7363083164300203 +FNR,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.0,0.32061068702290074,0.30456852791878175,0.4032258064516129,0.2958963282937365,0.35121951219512193,0.28125,0.30857142857142855 +FPR,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.0,0.07282913165266107,0.11650485436893204,0.0663265306122449,0.10911424903722722,0.08932038834951456,0.11304347826086956,0.10051282051282051 +IQR,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.0,0.06428228921309113,0.07059281623049571,0.06310045743778836,0.06966970140281861,0.06536902279417402,0.07146665480698056,0.06853979144083341 +Jitter,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.0,0.05826478705000547,0.0740340536675472,0.06368840325659207,0.06998717419626518,0.06601786711334494,0.0715677103466072,0.06890378559463906 +Label_Stability,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.0,0.9163729508196721,0.8950691699604743,0.9077131782945737,0.9008132045088566,0.90625,0.8980769230769231,0.902 +Mean,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.0,0.7140798765562879,0.6258004703369449,0.7406686084265409,0.6366252453835822,0.6994177145075693,0.6130773093525728,0.654520703826971 +Overall_Uncertainty,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.0,0.5333777792973274,0.607740896173706,0.5350959529476597,0.5936130333046618,0.5686451777300188,0.5973046349477854,0.5835480954832574 +PPV,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.0,0.7739130434782608,0.791907514450867,0.74,0.7931873479318735,0.7430167597765364,0.8156028368794326,0.7874186550976139 +Per_Sample_Accuracy,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.0,0.8478176229508196,0.804540513833992,0.8466472868217054,0.8127979066022545,0.8295694444444444,0.8085128205128205,0.81862 +Positive-Rate,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.0,0.8778625954198473,0.8781725888324873,0.8064516129032258,0.8876889848812095,0.8731707317073171,0.88125,0.878095238095238 +Sample_Size,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.0,488.0,1012.0,258.0,1242.0,720.0,780.0,1500.0 +Selection-Rate,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.0,0.23565573770491804,0.34189723320158105,0.1937984496124031,0.3309178743961353,0.24861111111111112,0.36153846153846153,0.30733333333333335 +Std,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.0,0.04807120157985848,0.05292563632196334,0.047034382956272054,0.05224204470698844,0.04879514970472325,0.053701259668457825,0.051346326885865226 +TNR,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.0,0.927170868347339,0.883495145631068,0.9336734693877551,0.8908857509627728,0.9106796116504854,0.8869565217391304,0.8994871794871795 +TPR,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.0,0.6793893129770993,0.6954314720812182,0.5967741935483871,0.7041036717062635,0.6487804878048781,0.71875,0.6914285714285714 +Accuracy,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.7,0.8709016393442623,0.7924901185770751,0.8643410852713178,0.8083735909822867,0.8291666666666667,0.8076923076923077,0.818 +Aleatoric_Uncertainty,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.7,0.5415753343739413,0.6007282744387772,0.5437012248461627,0.5893324161805281,0.5656097473407158,0.5961368702836032,0.5814838512710172 +F1,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.7,0.7469879518072289,0.7008547008547008,0.7008547008547008,0.7146282973621103,0.6737400530503979,0.7386759581881533,0.7129337539432177 +FNR,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.7,0.2900763358778626,0.3756345177664975,0.3387096774193548,0.3563714902807775,0.3804878048780488,0.3375,0.35428571428571426 +FPR,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.7,0.0700280112044818,0.10032362459546926,0.07142857142857142,0.09370988446726572,0.08737864077669903,0.09130434782608696,0.08923076923076922 +IQR,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.7,0.05486730610239798,0.05559910024368413,0.05337840687496418,0.05577287105542495,0.05377693691077603,0.056823256729256165,0.055361023216385696 +Jitter,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.7,0.05049252409589009,0.055404443164438634,0.05462194694401552,0.05363702570824448,0.05472215242881082,0.05296115191341372,0.05380643216080322 +Label_Stability,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.7,0.9256352459016393,0.9209584980237154,0.9213178294573643,0.9227214170692432,0.9217361111111111,0.9231666666666667,0.9224799999999999 +Mean,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.7,0.7008671012376522,0.6500786578096867,0.7283286228997712,0.6537793578093689,0.7076286288499484,0.6287309414556592,0.666601831404918 +Overall_Uncertainty,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.7,0.5529470303791272,0.6110197586776697,0.5542760168748085,0.5999894800749719,0.5757934710934558,0.6072036505378559,0.5921267644045438 +PPV,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.7,0.788135593220339,0.7987012987012987,0.7454545454545455,0.8032345013477089,0.7383720930232558,0.8346456692913385,0.795774647887324 +Per_Sample_Accuracy,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.7,0.8547438524590164,0.7916353754940711,0.8563953488372092,0.8029790660225442,0.8271319444444443,0.7983525641025639,0.8121666666666667 +Positive-Rate,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.7,0.9007633587786259,0.7817258883248731,0.8870967741935484,0.8012958963282938,0.8390243902439024,0.79375,0.8114285714285714 +Sample_Size,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.7,488.0,1012.0,258.0,1242.0,720.0,780.0,1500.0 +Selection-Rate,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.7,0.24180327868852458,0.30434782608695654,0.2131782945736434,0.29871175523349436,0.2388888888888889,0.32564102564102565,0.284 +Std,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.7,0.04147548578761579,0.04163599937336229,0.03995015359051101,0.04192313108200267,0.04024375025525536,0.04282072852104524,0.0415837789534661 +TNR,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.7,0.9299719887955182,0.8996763754045307,0.9285714285714286,0.9062901155327343,0.912621359223301,0.908695652173913,0.9107692307692308 +TPR,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.7,0.7099236641221374,0.6243654822335025,0.6612903225806451,0.6436285097192225,0.6195121951219512,0.6625,0.6457142857142857 +Accuracy,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.8545081967213115,0.808300395256917,0.8449612403100775,0.8188405797101449,0.8333333333333334,0.8141025641025641,0.8233333333333334 +Aleatoric_Uncertainty,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.5211199002202518,0.591006808034145,0.5246724201167261,0.577326824998327,0.5541771891449122,0.5812792626329496,0.5682702673586917 +F1,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.714859437751004,0.7349726775956285,0.6491228070175439,0.740484429065744,0.6875,0.7571189279731994,0.7298674821610601 +FNR,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.32061068702290074,0.31725888324873097,0.4032258064516129,0.30669546436285094,0.35609756097560974,0.29375,0.3180952380952381 +FPR,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.08123249299719888,0.11165048543689321,0.07653061224489796,0.10654685494223363,0.0912621359223301,0.1108695652173913,0.10051282051282051 +IQR,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.0656607376158629,0.07072996492972401,0.06467250997689906,0.06999650313315767,0.06551429974918029,0.07237290852052818,0.06908077631028119 +Jitter,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.060156314358679144,0.07294054263411826,0.06567469128588728,0.06942676344686585,0.06666038525963189,0.07073927328952646,0.06878140703517488 +Label_Stability,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.9112704918032787,0.8974802371541502,0.9022868217054263,0.9019001610305957,0.9053333333333333,0.8988589743589742,0.9019666666666666 +Mean,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.7086695659799582,0.6312971446946812,0.7346452859100321,0.6402294483610698,0.7007860045694052,0.6155609427426478,0.6564689724194913 +Overall_Uncertainty,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.5366496138386901,0.6070662579052819,0.5393764919119384,0.5934596857006005,0.568778825833585,0.598352961478519,0.5841573763689507 +PPV,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.7542372881355932,0.7958579881656804,0.7115384615384616,0.7945544554455446,0.7374301675977654,0.8158844765342961,0.7850877192982456 +Per_Sample_Accuracy,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.8464549180327868,0.8029891304347826,0.8463372093023257,0.8110628019323671,0.8285833333333332,0.8065576923076924,0.8171299999999999 +Positive-Rate,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.9007633587786259,0.8578680203045685,0.8387096774193549,0.8725701943844493,0.8731707317073171,0.865625,0.8685714285714285 +Sample_Size,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.4,488.0,1012.0,258.0,1242.0,720.0,780.0,1500.0 +Selection-Rate,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.24180327868852458,0.3339920948616601,0.20155038759689922,0.3252818035426731,0.24861111111111112,0.35512820512820514,0.304 +Statistical_Bias,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.2274504031385729,0.266491924606308,0.2318676501443367,0.25834442085021614,0.24554145806397867,0.26140483926556757,0.2537904162888049 +Std,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.048873767867387855,0.05297010622628838,0.0477247218383518,0.052450215769721704,0.04881415172274951,0.05424353458962751,0.051637430813526085 +TNR,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.9187675070028011,0.8883495145631068,0.923469387755102,0.8934531450577664,0.9087378640776699,0.8891304347826087,0.8994871794871795 +TPR,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.6793893129770993,0.682741116751269,0.5967741935483871,0.693304535637149,0.6439024390243903,0.70625,0.6819047619047619 +Accuracy,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.0,0.8524590163934426,0.808300395256917,0.8643410852713178,0.8140096618357487,0.85,0.7974358974358975,0.8226666666666667 +Aleatoric_Uncertainty,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.0,0.3816002128122633,0.4663978258721248,0.38038775507957207,0.4509464273948834,0.4122843567010865,0.4632958548848621,0.43881033575664985 +F1,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.0,0.7142857142857143,0.7460732984293194,0.6956521739130435,0.7436182019977803,0.7272727272727273,0.7451612903225806,0.7381889763779528 +FNR,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.0,0.31297709923664124,0.2766497461928934,0.3548387096774194,0.27645788336933047,0.2975609756097561,0.278125,0.2857142857142857 +FPR,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.0,0.08683473389355742,0.13754045307443366,0.0663265306122449,0.13222079589216945,0.0912621359223301,0.15,0.11897435897435897 +IQR,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.0,0.11256027555478235,0.13455892728435168,0.10994393226091104,0.1310285944920955,0.11538822128143578,0.1384917045639281,0.12740203258833177 +Jitter,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.0,0.09333336765796346,0.12332532226349145,0.09343558879670463,0.11775002225297226,0.10094409547738649,0.1252207189795132,0.11356793969848812 +Label_Stability,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.0,0.8686270491803278,0.8256719367588932,0.8656976744186047,0.8342351046698874,0.8567916666666666,0.8238205128205128,0.8396466666666665 +Mean,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.0,0.7252847058872565,0.6240034562362897,0.7607214461032801,0.6353979879947343,0.7097566779513825,0.6082123411014243,0.6569536227894043 +Overall_Uncertainty,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.0,0.4414172929888588,0.533748861417282,0.4365092913234669,0.5176699593972609,0.4698661654226279,0.5349510867032824,0.5037103244885683 +PPV,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.0,0.743801652892562,0.7702702702702703,0.7547169811320755,0.7648401826484018,0.7539267015706806,0.77,0.7637474541751528 +Per_Sample_Accuracy,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.0,0.8301741803278688,0.7933498023715414,0.8309496124031007,0.8000080515297907,0.8233958333333333,0.7886538461538463,0.8053299999999999 +Positive-Rate,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.0,0.9236641221374046,0.9390862944162437,0.8548387096774194,0.9460043196544277,0.9317073170731708,0.9375,0.9352380952380952 +Sample_Size,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.0,488.0,1012.0,258.0,1242.0,720.0,780.0,1500.0 +Selection-Rate,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.0,0.24795081967213115,0.36561264822134387,0.2054263565891473,0.3526570048309179,0.2652777777777778,0.38461538461538464,0.3273333333333333 +Std,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.0,0.08719673354183723,0.1016792316974423,0.08411029067199578,0.0996384327317659,0.08810299022278899,0.10515030190489756,0.09696759229748543 +TNR,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.0,0.9131652661064426,0.8624595469255664,0.9336734693877551,0.8677792041078306,0.9087378640776699,0.85,0.8810256410256411 +TPR,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.0,0.6870229007633588,0.7233502538071066,0.6451612903225806,0.7235421166306696,0.7024390243902439,0.721875,0.7142857142857143 +Accuracy,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.7,0.8504098360655737,0.7924901185770751,0.8565891472868217,0.8019323671497585,0.8402777777777778,0.7846153846153846,0.8113333333333334 +Aleatoric_Uncertainty,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.7,0.43531743350320395,0.5012712154730118,0.43338857927395535,0.4894582320093163,0.4473101514451836,0.509818036625281,0.47981425173883424 +F1,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.7,0.7114624505928854,0.7033898305084746,0.672566371681416,0.7099056603773585,0.6933333333333334,0.7133105802047781,0.7055150884495317 +FNR,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.7,0.31297709923664124,0.3680203045685279,0.3870967741935484,0.34989200863930886,0.36585365853658536,0.346875,0.35428571428571426 +FPR,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.7,0.0896358543417367,0.10517799352750809,0.0663265306122449,0.10783055198973042,0.07766990291262135,0.12391304347826088,0.09948717948717949 +IQR,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.7,0.0956195011615199,0.10335913333042551,0.09224988054338842,0.10262583761434632,0.09253823634408508,0.10850542221727062,0.10084117299814155 +Jitter,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.7,0.08606114589339989,0.0960852185830313,0.08524034903198867,0.09439941252154235,0.08699671970966057,0.09820313103981136,0.0928240536013427 +Label_Stability,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.7,0.8803483606557377,0.8675592885375495,0.8819767441860465,0.8695893719806763,0.8769861111111112,0.8668589743589745,0.8717199999999999 +Mean,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.7,0.7102203181759992,0.6607804033163299,0.7506239522883105,0.6615429176615372,0.7249338287368677,0.6324934958147033,0.6768648556173422 +Overall_Uncertainty,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.7,0.47514726487681236,0.5407137095576833,0.46988110140488026,0.5296657126971022,0.4835119894611495,0.5524942396413235,0.51938275955484 +PPV,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.7,0.7377049180327869,0.7929936305732485,0.7450980392156863,0.7818181818181819,0.7647058823529411,0.7857142857142857,0.7775229357798165 +Per_Sample_Accuracy,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.7,0.8392110655737706,0.7809337944664032,0.8399806201550388,0.7915660225442834,0.8214791666666665,0.7799679487179487,0.7998933333333332 +Positive-Rate,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.7,0.9312977099236641,0.7969543147208121,0.8225806451612904,0.8315334773218143,0.8292682926829268,0.83125,0.8304761904761905 +Sample_Size,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.7,488.0,1012.0,258.0,1242.0,720.0,780.0,1500.0 +Selection-Rate,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.7,0.25,0.3102766798418972,0.19767441860465115,0.30998389694041867,0.2361111111111111,0.34102564102564104,0.2906666666666667 +Std,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.7,0.07358699036849117,0.07880857429052178,0.07010008258322892,0.07856594780624693,0.07124402483599133,0.08252439820502305,0.07710981898788782 +TNR,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.7,0.9103641456582633,0.8948220064724919,0.9336734693877551,0.8921694480102695,0.9223300970873787,0.8760869565217392,0.9005128205128206 +TPR,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.7,0.6870229007633588,0.631979695431472,0.6129032258064516,0.6501079913606912,0.6341463414634146,0.653125,0.6457142857142857 +Accuracy,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.8504098360655737,0.8112648221343873,0.8565891472868217,0.8172302737520128,0.8486111111111111,0.8012820512820513,0.824 +Aleatoric_Uncertainty,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.38774782756218923,0.4664257591545982,0.3884650538497881,0.45170678278708243,0.4137217228511366,0.46585149700254275,0.4408292054098678 +F1,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.7137254901960784,0.7463479415670651,0.6837606837606838,0.745230078563412,0.7240506329113924,0.7471451876019576,0.7380952380952381 +FNR,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.3053435114503817,0.2868020304568528,0.3548387096774194,0.28293736501079914,0.3024390243902439,0.284375,0.2914285714285714 +FPR,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.09243697478991597,0.1262135922330097,0.07653061224489796,0.12323491655969192,0.0912621359223301,0.1391304347826087,0.11384615384615385 +IQR,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.1132850208605515,0.13308101897484043,0.11081770385973005,0.12992762784756626,0.11530455602687097,0.13710487313223146,0.12664072092165843 +Jitter,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.0948879644122274,0.12289540588317266,0.09496201939933013,0.11769345924469356,0.10171684812953474,0.12492223940213948,0.11378365159128628 +Label_Stability,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.8675819672131148,0.8260474308300394,0.8665891472868218,0.8339452495974236,0.855875,0.8244999999999999,0.8395600000000001 +Mean,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.7195732758438664,0.6309284279798154,0.7540229300478088,0.6401879321860268,0.7110902530342773,0.6123927506957696,0.6597675518182533 +Overall_Uncertainty,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.44726996535917407,0.5332731746116136,0.44436157850128466,0.5179508120361502,0.4712478646062651,0.5367201708791272,0.5052934638681533 +PPV,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.7338709677419355,0.7827298050139275,0.7272727272727273,0.7757009345794392,0.7526315789473684,0.7815699658703071,0.7701863354037267 +Per_Sample_Accuracy,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.8290163934426229,0.7911758893280633,0.8308527131782947,0.7978019323671498,0.8213263888888889,0.7870192307692307,0.8034866666666667 +Positive-Rate,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.9465648854961832,0.9111675126903553,0.8870967741935484,0.9244060475161987,0.926829268292683,0.915625,0.92 +Sample_Size,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.4,488.0,1012.0,258.0,1242.0,720.0,780.0,1500.0 +Selection-Rate,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.2540983606557377,0.3547430830039526,0.2131782945736434,0.3446054750402576,0.2638888888888889,0.37564102564102564,0.322 +Statistical_Bias,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.21005937889821227,0.24850722840440323,0.21231194725259486,0.24091933144638822,0.2216758094116745,0.24922014009125384,0.23599886136505574 +Std,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.08755548044966635,0.10117446934723753,0.08464217527528196,0.09925761370194752,0.08809491086883042,0.10472730976062009,0.09674375829256104 +TNR,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.907563025210084,0.8737864077669902,0.923469387755102,0.8767650834403081,0.9087378640776699,0.8608695652173913,0.8861538461538462 +TPR,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.6946564885496184,0.7131979695431472,0.6451612903225806,0.7170626349892009,0.697560975609756,0.715625,0.7085714285714285 +Accuracy,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': None, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.8463114754098361,0.799407114624506,0.8449612403100775,0.8083735909822867,0.8347222222222223,0.7961538461538461,0.8146666666666667 +Aleatoric_Uncertainty,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': None, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.578901881115347,0.6427220196011102,0.5776986374569397,0.631153424602836,0.6096726402021011,0.633300642147564,0.6219592012137418 +F1,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': None, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.6963562753036437,0.7079136690647482,0.6551724137931034,0.711864406779661,0.6826666666666666,0.7195767195767195,0.7048832271762208 +FNR,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': None, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.3435114503816794,0.3756345177664975,0.3870967741935484,0.3650107991360691,0.375609756097561,0.3625,0.3676190476190476 +FPR,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': None, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.08403361344537816,0.0889967637540453,0.08163265306122448,0.08857509627727857,0.08155339805825243,0.09347826086956522,0.08717948717948718 +IQR,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': None, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.07993080357142858,0.08735322459846914,0.07968225898240433,0.0860303322214554,0.08367405891754848,0.08610560643060641,0.0849384636243386 +Jitter,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': None, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.0632354394925448,0.07906637932747126,0.07057457831794871,0.0746101683943074,0.07238895868230105,0.07532566679551772,0.07391604690117412 +Label_Stability,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': None, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.911844262295082,0.8900197628458498,0.8983720930232557,0.8968599033816426,0.8976249999999999,0.8966538461538462,0.8971199999999999 +Mean,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': None, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.707915635896435,0.645445064778217,0.7366042713332103,0.6510542140652557,0.7011054430941357,0.6331504062118437,0.6657688239153439 +Overall_Uncertainty,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': None, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.5980926620208493,0.6629771995525174,0.5967855512878455,0.6512330698720273,0.6293954388029462,0.6533813193271806,0.6418680966755481 +PPV,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': None, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.7413793103448276,0.8172757475083057,0.7037037037037037,0.8099173553719008,0.7529411764705882,0.8259109311740891,0.7961630695443646 +Per_Sample_Accuracy,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': None, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.8352459016393443,0.7941007905138341,0.8271317829457364,0.8034057971014492,0.8267013888888889,0.78975,0.8074866666666667 +Positive-Rate,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': None, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.8854961832061069,0.7639593908629442,0.8709677419354839,0.7840172786177105,0.8292682926829268,0.771875,0.7942857142857143 +Sample_Size,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': None, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.4,488.0,1012.0,258.0,1242.0,720.0,780.0,1500.0 +Selection-Rate,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': None, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.23770491803278687,0.2974308300395257,0.20930232558139536,0.2922705314009662,0.2361111111111111,0.31666666666666665,0.278 +Statistical_Bias,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': None, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.24958265027322407,0.2865677506822887,0.2556659200043067,0.2784549836253611,0.26328724655533514,0.28491805064611314,0.2745352646825397 +Std,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': None, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.056821051436244836,0.0628264498200237,0.05668759886069393,0.061742061040815165,0.059889468244443,0.06178028613173397,0.06087269354583431 +TNR,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': None, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.9159663865546218,0.9110032362459547,0.9183673469387755,0.9114249037227214,0.9184466019417475,0.9065217391304348,0.9128205128205128 +TPR,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': None, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.4,0.6564885496183206,0.6243654822335025,0.6129032258064516,0.6349892008639308,0.624390243902439,0.6375,0.6323809523809524 +Accuracy,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': None, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 200, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.7,0.8483606557377049,0.7845849802371542,0.8449612403100775,0.7971014492753623,0.8263888888888888,0.7858974358974359,0.8053333333333333 +Aleatoric_Uncertainty,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': None, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 200, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.7,0.5809271419254739,0.632326188134487,0.5804399996415808,0.6229090400516942,0.6027107443059488,0.627506168912114,0.6156043651011547 +F1,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': None, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 200, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.7,0.6991869918699187,0.6716867469879518,0.6551724137931034,0.6826196473551638,0.6556473829201102,0.6946983546617916,0.6791208791208792 +FNR,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': None, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 200, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.7,0.3435114503816794,0.434010152284264,0.3870967741935484,0.4146868250539957,0.4195121951219512,0.40625,0.4114285714285714 +FPR,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': None, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 200, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.7,0.08123249299719888,0.07605177993527508,0.08163265306122448,0.07702182284980745,0.07572815533980583,0.08043478260869565,0.07794871794871795 +IQR,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': None, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 200, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.7,0.07655375947339318,0.077704999823546,0.07722390642303431,0.07735259789637809,0.0762085014329806,0.07836611975986976,0.07733046296296296 +Jitter,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': None, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 200, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.7,0.06152195403245778,0.07156136413291579,0.06709497097892671,0.0685445342655323,0.06591387493020666,0.0704933642571864,0.06829520938023337 +Label_Stability,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': None, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 200, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.7,0.9143032786885246,0.9000790513833993,0.902984496124031,0.9050644122383253,0.9067222222222221,0.9028461538461539,0.9047066666666667 +Mean,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': None, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 200, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.7,0.7055323232175382,0.6729498837168265,0.7335200550633689,0.6731697921459243,0.715874007895172,0.6537125261116199,0.6835500373677248 +Overall_Uncertainty,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': None, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 200, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.7,0.5984611689436439,0.6487402421227054,0.5980162595875916,0.6395217234292089,0.6192559619409344,0.6444998498400043,0.6323827836484507 +PPV,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': None, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 200, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.7,0.7478260869565218,0.825925925925926,0.7037037037037037,0.8187311178247734,0.7531645569620253,0.8370044052863436,0.8025974025974026 +Per_Sample_Accuracy,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': None, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 200, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.7,0.8360450819672132,0.7759980237154149,0.8300193798449612,0.7883695652173913,0.8178750000000001,0.7749102564102565,0.7955333333333334 +Positive-Rate,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': None, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 200, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.7,0.8778625954198473,0.6852791878172588,0.8709677419354839,0.714902807775378,0.7707317073170732,0.709375,0.7333333333333333 +Sample_Size,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': None, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 200, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.7,488.0,1012.0,258.0,1242.0,720.0,780.0,1500.0 +Selection-Rate,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': None, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 200, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.7,0.23565573770491804,0.26679841897233203,0.20930232558139536,0.2665056360708535,0.21944444444444444,0.29102564102564105,0.25666666666666665 +Std,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': None, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 200, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.7,0.05416850447476281,0.05607068686560472,0.05424965264513179,0.055701574000992134,0.054355904736851104,0.05646347933479929,0.05545184352778415 +TNR,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': None, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 200, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.7,0.9187675070028011,0.9239482200647249,0.9183673469387755,0.9229781771501926,0.9242718446601942,0.9195652173913044,0.9220512820512821 +TPR,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': None, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 200, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.7,0.6564885496183206,0.565989847715736,0.6129032258064516,0.5853131749460043,0.5804878048780487,0.59375,0.5885714285714285 +Accuracy,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 90, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 200, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.0,0.8483606557377049,0.7984189723320159,0.8488372093023255,0.8075684380032206,0.8375,0.7935897435897435,0.8146666666666667 +Aleatoric_Uncertainty,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 90, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 200, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.0,0.6034386214355544,0.667663044490748,0.6022916533054496,0.6560078918940269,0.6353339918546749,0.6573238130125916,0.6467686988567917 +F1,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 90, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 200, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.0,0.7016129032258065,0.7085714285714285,0.6666666666666666,0.7123947051744886,0.6896551724137931,0.7180385288966725,0.7067510548523207 +FNR,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 90, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 200, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.0,0.33587786259541985,0.37055837563451777,0.3709677419354839,0.36069114470842334,0.36585365853658536,0.359375,0.3619047619047619 +FPR,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 90, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 200, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.0,0.08403361344537816,0.09385113268608414,0.08163265306122448,0.09242618741976893,0.08155339805825243,0.1,0.09025641025641026 +IQR,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 90, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 200, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.0,0.06625906669162206,0.07151880255649483,0.06651334013218053,0.07049195730964715,0.06906575947907051,0.07049244347147894,0.0698076351551229 +Jitter,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 90, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 200, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.0,0.05250175055605957,0.0703220648697996,0.05746932336098636,0.06599009540456216,0.0635568118369625,0.06541779409870094,0.06452452261306409 +Label_Stability,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 90, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 200, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.0,0.9285040983606557,0.900296442687747,0.9208914728682169,0.9071014492753622,0.9103333333333334,0.9086794871794872,0.9094733333333334 +Mean,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 90, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 200, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.0,0.7044707097166929,0.6383597499240815,0.7315249192761425,0.6449825636808952,0.6940397580188165,0.6283245480658572,0.6598678488432778 +Overall_Uncertainty,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 90, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 200, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.0,0.6163162753250673,0.6810105385909122,0.6151568145209929,0.6692709736442993,0.6484095577353082,0.670628366465659,0.6599633382750907 +PPV,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 90, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 200, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.0,0.7435897435897436,0.8104575163398693,0.7090909090909091,0.8043478260869565,0.7558139534883721,0.8167330677290837,0.7919621749408984 +Per_Sample_Accuracy,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 90, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 200, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.0,0.8393954918032787,0.7940316205533596,0.8337403100775194,0.8036070853462158,0.8301944444444445,0.7890320512820512,0.80879 +Positive-Rate,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 90, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 200, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.0,0.8931297709923665,0.7766497461928934,0.8870967741935484,0.7948164146868251,0.8390243902439024,0.784375,0.8057142857142857 +Sample_Size,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 90, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 200, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.0,488.0,1012.0,258.0,1242.0,720.0,780.0,1500.0 +Selection-Rate,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 90, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 200, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.0,0.23975409836065573,0.30237154150197626,0.2131782945736434,0.2962962962962963,0.2388888888888889,0.3217948717948718,0.282 +Std,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 90, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 200, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.0,0.047667980542325225,0.052179487878327734,0.04763300879630876,0.051351288219061764,0.04994215113887428,0.05142213771478576,0.05071174415834825 +TNR,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 90, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 200, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.0,0.9159663865546218,0.9061488673139159,0.9183673469387755,0.9075738125802311,0.9184466019417475,0.9,0.9097435897435897 +TPR,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 90, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 200, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Folktables_GA_2018_Income,0.0,0.6641221374045801,0.6294416243654822,0.6290322580645161,0.6393088552915767,0.6341463414634146,0.640625,0.638095238095238 diff --git a/virny/custom_classes/metrics_interactive_visualizer.py b/virny/custom_classes/metrics_interactive_visualizer.py index 007ff0c3..9ca3cc71 100644 --- a/virny/custom_classes/metrics_interactive_visualizer.py +++ b/virny/custom_classes/metrics_interactive_visualizer.py @@ -326,7 +326,8 @@ def _create_subgroup_model_rank_heatmap(self, model_names: list, subgroup_accura model_metrics_matrix = pd.DataFrame(results).T sorted_matrix_by_rank = create_subgroup_sorted_matrix_by_rank(model_metrics_matrix) - model_rank_heatmap, _ = create_model_rank_heatmap_visualization(model_metrics_matrix, sorted_matrix_by_rank, num_models) + model_rank_heatmap, _ = create_model_rank_heatmap_visualization(model_metrics_matrix, sorted_matrix_by_rank, + num_models, top_adjust=1.) return model_rank_heatmap @@ -376,7 +377,8 @@ def _create_group_model_rank_heatmap(self, model_names: list, group_fairness_met model_metrics_matrix = pd.DataFrame(results).T sorted_matrix_by_rank = create_sorted_matrix_by_rank(model_metrics_matrix) - model_rank_heatmap, _ = create_model_rank_heatmap_visualization(model_metrics_matrix, sorted_matrix_by_rank, num_models) + model_rank_heatmap, _ = create_model_rank_heatmap_visualization(model_metrics_matrix, sorted_matrix_by_rank, + num_models, top_adjust=0.78) return model_rank_heatmap @@ -414,10 +416,9 @@ def _create_metrics_bar_chart_per_one_model(self, model_name: str, metrics_names base_font_size = 16 models_metrics_chart = ( alt.Chart().mark_bar().encode( - alt.Y('Subgroup:N', axis=None, sort='descending'), + alt.Y('Subgroup:N', axis=None), alt.X('Value:Q', axis=alt.Axis(grid=True), title=''), alt.Color('Subgroup:N', - sort='descending', scale=alt.Scale(scheme="tableau20"), legend=alt.Legend(title=metrics_type.capitalize(), labelFontSize=base_font_size, diff --git a/virny/utils/data_viz_utils.py b/virny/utils/data_viz_utils.py index c6fbe759..e90a3e71 100644 --- a/virny/utils/data_viz_utils.py +++ b/virny/utils/data_viz_utils.py @@ -60,7 +60,8 @@ def create_subgroup_sorted_matrix_by_rank(model_metrics_matrix) -> np.array: return sorted_matrix_by_rank -def create_model_rank_heatmap_visualization(model_metrics_matrix, sorted_matrix_by_rank, num_models: int): +def create_model_rank_heatmap_visualization(model_metrics_matrix, sorted_matrix_by_rank, num_models: int, + top_adjust: float = 0.92): """ This heatmap includes group fairness and stability metrics and defined models. Using it, you can visually compare the models across defined group metrics. On this plot, @@ -79,6 +80,8 @@ def create_model_rank_heatmap_visualization(model_metrics_matrix, sorted_matrix_ Matrix of model ranks per metric where indexes are group metric names and columns are model names num_models Number of models to visualize + top_adjust + Percentage of a top padding for the heatmap """ font_increase = 4 @@ -90,8 +93,9 @@ def create_model_rank_heatmap_visualization(model_metrics_matrix, sorted_matrix_ fmt='', annot_kws={'color': 'black', 'alpha': 0.7, 'fontsize': 16 + font_increase}) ax.set(xlabel="", ylabel="") ax.xaxis.tick_top() + ax.tick_params(axis='x', rotation=10) ax.tick_params(labelsize=16 + font_increase) - fig.subplots_adjust(left=0.27, right=0.99, top=0.92) + fig.subplots_adjust(left=0.3, right=0.99, top=0.8) cbar = ax.collections[0].colorbar model_ranks = [idx for idx in range(num_models)] @@ -161,7 +165,7 @@ def get_column_alias(metric_group): x=alt.X("Title", type="nominal", title='Metric Group', axis=alt.Axis(labelAngle=-30), sort=alt.Sort(order='ascending')), y=alt.Y("Number_of_Models", title="Number of Models", type="quantitative"), - color=alt.Color('Model_Name', legend=alt.Legend(title='Model Name')) + color=alt.Color('Model_Type', legend=alt.Legend(title='Model Type')) ).configure(padding={'top': 33} ).configure_axis( labelFontSize=base_font_size + 2, @@ -207,10 +211,12 @@ def create_models_in_range_dct(all_subgroup_metrics_per_model_dct: dict, all_gro pivoted_model_metrics_df = all_metrics_for_all_models_df.pivot(columns='Metric', values='Value', index=[col for col in all_metrics_for_all_models_df.columns if col not in ('Metric', 'Value')]).reset_index() + # Create a Model_Type column to count the number of models that satisfied the constraints based on their model types + pivoted_model_metrics_df['Model_Type'] = pivoted_model_metrics_df['Model_Name'].str.split('__', expand=True)[0] + model_types = pivoted_model_metrics_df['Model_Type'].unique() # Create a pandas condition for filtering based on the input value ranges models_in_range_df = pd.DataFrame() - model_names = pivoted_model_metrics_df['Model_Name'].unique() for idx, (metric_group, value_range) in enumerate(metrics_value_range_dct.items()): pd_condition = None if '&' not in metric_group: @@ -232,13 +238,13 @@ def create_models_in_range_dct(all_subgroup_metrics_per_model_dct: dict, all_gro else: pd_condition &= (pivoted_model_metrics_df[metric] >= min_range_val) & (pivoted_model_metrics_df[metric] <= max_range_val) - num_satisfied_models_df = pivoted_model_metrics_df[pd_condition]['Model_Name'].value_counts().reset_index() - num_satisfied_models_df.rename(columns = {'Model_Name': 'Number_of_Models'}, inplace = True) - num_satisfied_models_df.rename(columns = {'index': 'Model_Name'}, inplace = True) + num_satisfied_models_df = pivoted_model_metrics_df[pd_condition]['Model_Type'].value_counts().reset_index() + num_satisfied_models_df.rename(columns = {'Model_Type': 'Number_of_Models'}, inplace = True) + num_satisfied_models_df.rename(columns = {'index': 'Model_Type'}, inplace = True) # If a constraint for a metric group is not satisfied, add zeros for all model names if num_satisfied_models_df.shape[0] == 0: - num_satisfied_models_df = pd.DataFrame({'Model_Name': model_names, - 'Number_of_Models': [0] * len(model_names)}) + num_satisfied_models_df = pd.DataFrame({'Model_Type': model_types, + 'Number_of_Models': [0] * len(model_types)}) num_satisfied_models_df['Metric_Group'] = metric_group if idx == 0: From 6da26a2bfc7d9611bbb180a7be0113818a1bb9dd Mon Sep 17 00:00:00 2001 From: denysgerasymuk799 Date: Thu, 5 Oct 2023 00:19:15 +0300 Subject: [PATCH 08/36] Added a gradio app for Law_School --- ...ultiple_Models_Interface_Vis_Income.ipynb} | 77 ++--- ...iple_Models_Interface_Vis_Law_School.ipynb | 297 ++++++++++++++++++ ...cs_sample.csv => income_group_metrics.csv} | 0 ...sample.csv => income_subgroup_metrics.csv} | 0 docs/examples/law_school_group_metrics.csv | 89 ++++++ docs/examples/law_school_subgroup_metrics.csv | 153 +++++++++ .../metrics_interactive_visualizer.py | 4 +- 7 files changed, 582 insertions(+), 38 deletions(-) rename docs/examples/{Multiple_Models_Interface_Vis_Big_Example.ipynb => Multiple_Models_Interface_Vis_Income.ipynb} (78%) create mode 100644 docs/examples/Multiple_Models_Interface_Vis_Law_School.ipynb rename docs/examples/{group_metrics_sample.csv => income_group_metrics.csv} (100%) rename docs/examples/{subgroup_metrics_sample.csv => income_subgroup_metrics.csv} (100%) create mode 100644 docs/examples/law_school_group_metrics.csv create mode 100644 docs/examples/law_school_subgroup_metrics.csv diff --git a/docs/examples/Multiple_Models_Interface_Vis_Big_Example.ipynb b/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb similarity index 78% rename from docs/examples/Multiple_Models_Interface_Vis_Big_Example.ipynb rename to docs/examples/Multiple_Models_Interface_Vis_Income.ipynb index abc20ff4..7b653984 100644 --- a/docs/examples/Multiple_Models_Interface_Vis_Big_Example.ipynb +++ b/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb @@ -6,8 +6,8 @@ "id": "248cbed8", "metadata": { "ExecuteTime": { - "end_time": "2023-10-02T17:17:48.735994Z", - "start_time": "2023-10-02T17:17:48.334219Z" + "end_time": "2023-10-04T21:08:30.999391Z", + "start_time": "2023-10-04T21:08:30.521174Z" } }, "outputs": [], @@ -23,8 +23,8 @@ "id": "7ec6cd08", "metadata": { "ExecuteTime": { - "end_time": "2023-10-02T17:17:48.745045Z", - "start_time": "2023-10-02T17:17:48.736330Z" + "end_time": "2023-10-04T21:08:31.008054Z", + "start_time": "2023-10-04T21:08:31.000071Z" } }, "outputs": [], @@ -41,8 +41,8 @@ "id": "b8cb69f2", "metadata": { "ExecuteTime": { - "end_time": "2023-10-02T17:17:48.756222Z", - "start_time": "2023-10-02T17:17:48.745173Z" + "end_time": "2023-10-04T21:08:31.018864Z", + "start_time": "2023-10-04T21:08:31.008657Z" } }, "outputs": [ @@ -76,8 +76,8 @@ "id": "7a9241de", "metadata": { "ExecuteTime": { - "end_time": "2023-10-02T17:17:53.361336Z", - "start_time": "2023-10-02T17:17:48.754954Z" + "end_time": "2023-10-04T21:08:33.567112Z", + "start_time": "2023-10-04T21:08:31.017655Z" } }, "outputs": [], @@ -98,33 +98,33 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-02T17:17:53.387585Z", - "start_time": "2023-10-02T17:17:53.364121Z" + "end_time": "2023-10-04T21:08:33.593962Z", + "start_time": "2023-10-04T21:08:33.567969Z" } }, "id": "d3c53c7b72ecbcd0" }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "outputs": [], "source": [ "ROOT_DIR = os.path.join('docs', 'examples')\n", - "subgroup_metrics_df = pd.read_csv(os.path.join(ROOT_DIR, 'subgroup_metrics_sample.csv'), header=0)\n", - "models_composed_metrics_df = pd.read_csv(os.path.join(ROOT_DIR, 'group_metrics_sample.csv'), header=0)" + "subgroup_metrics_df = pd.read_csv(os.path.join(ROOT_DIR, 'income_subgroup_metrics.csv'), header=0)\n", + "models_composed_metrics_df = pd.read_csv(os.path.join(ROOT_DIR, 'income_group_metrics.csv'), header=0)" ], "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-02T17:19:48.959080Z", - "start_time": "2023-10-02T17:19:48.892728Z" + "end_time": "2023-10-04T21:08:33.619601Z", + "start_time": "2023-10-04T21:08:33.593364Z" } }, "id": "2aab7c79ecdee914" }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 7, "outputs": [], "source": [ "subgroup_metrics_df['Model_Name'] = (subgroup_metrics_df['Model_Name'] + '__alpha=' +\n", @@ -135,15 +135,15 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-02T17:20:12.234612Z", - "start_time": "2023-10-02T17:20:12.185239Z" + "end_time": "2023-10-04T21:08:33.644681Z", + "start_time": "2023-10-04T21:08:33.620136Z" } }, "id": "2d922003e752a4b4" }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 8, "outputs": [], "source": [ "models_metrics_dct = dict()\n", @@ -153,21 +153,21 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-02T17:20:13.514668Z", - "start_time": "2023-10-02T17:20:13.478758Z" + "end_time": "2023-10-04T21:08:33.669581Z", + "start_time": "2023-10-04T21:08:33.643533Z" } }, "id": "833484748ed512e8" }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 9, "outputs": [ { "data": { "text/plain": "dict_keys(['LGBMClassifier__alpha=0.7', 'LGBMClassifier__alpha=0.0', 'LGBMClassifier__alpha=0.4', 'LogisticRegression__alpha=0.0', 'LogisticRegression__alpha=0.7', 'LogisticRegression__alpha=0.4', 'MLPClassifier__alpha=0.0', 'MLPClassifier__alpha=0.7', 'MLPClassifier__alpha=0.4', 'RandomForestClassifier__alpha=0.4', 'RandomForestClassifier__alpha=0.7', 'RandomForestClassifier__alpha=0.0'])" }, - "execution_count": 11, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -178,8 +178,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-02T17:20:14.063914Z", - "start_time": "2023-10-02T17:20:14.031614Z" + "end_time": "2023-10-04T21:08:33.691780Z", + "start_time": "2023-10-04T21:08:33.667179Z" } }, "id": "15ed7d1ba1f22317" @@ -194,12 +194,12 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 10, "id": "435b9d98", "metadata": { "ExecuteTime": { - "end_time": "2023-10-02T17:53:01.433697Z", - "start_time": "2023-10-02T17:53:01.373046Z" + "end_time": "2023-10-04T21:08:33.716112Z", + "start_time": "2023-10-04T21:08:33.690511Z" } }, "outputs": [], @@ -210,7 +210,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 11, "outputs": [ { "name": "stdout", @@ -229,15 +229,15 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-02T17:54:57.507776Z", - "start_time": "2023-10-02T17:53:01.479901Z" + "end_time": "2023-10-04T21:11:38.266786Z", + "start_time": "2023-10-04T21:08:33.716571Z" } }, "id": "678a9dc8d51243f4" }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 12, "outputs": [ { "name": "stdout", @@ -253,17 +253,22 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-09-29T21:41:49.927075Z", - "start_time": "2023-09-29T21:41:49.639933Z" + "end_time": "2023-10-04T21:11:38.361088Z", + "start_time": "2023-10-04T21:11:38.269315Z" } }, "id": "277b6d1de837dab7" }, { "cell_type": "code", - "execution_count": 78, + "execution_count": 12, "id": "2326c129", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-04T21:11:38.363712Z", + "start_time": "2023-10-04T21:11:38.360139Z" + } + }, "outputs": [], "source": [] } diff --git a/docs/examples/Multiple_Models_Interface_Vis_Law_School.ipynb b/docs/examples/Multiple_Models_Interface_Vis_Law_School.ipynb new file mode 100644 index 00000000..c88e03d5 --- /dev/null +++ b/docs/examples/Multiple_Models_Interface_Vis_Law_School.ipynb @@ -0,0 +1,297 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "248cbed8", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-04T21:15:46.248933Z", + "start_time": "2023-10-04T21:15:45.908524Z" + } + }, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "%load_ext autoreload\n", + "%autoreload 2" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "7ec6cd08", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-04T21:15:46.257749Z", + "start_time": "2023-10-04T21:15:46.249557Z" + } + }, + "outputs": [], + "source": [ + "import os\n", + "import warnings\n", + "warnings.filterwarnings('ignore')\n", + "os.environ[\"PYTHONWARNINGS\"] = \"ignore\"" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "b8cb69f2", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-04T21:15:46.268273Z", + "start_time": "2023-10-04T21:15:46.257867Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Current location: /Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny\n" + ] + } + ], + "source": [ + "cur_folder_name = os.getcwd().split('/')[-1]\n", + "if cur_folder_name != \"Virny\":\n", + " os.chdir(\"../..\")\n", + "\n", + "print('Current location: ', os.getcwd())" + ] + }, + { + "cell_type": "markdown", + "id": "a578f2ab", + "metadata": {}, + "source": [ + "# Multiple Models Interface Usage" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "7a9241de", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-04T21:15:47.510506Z", + "start_time": "2023-10-04T21:15:46.267180Z" + } + }, + "outputs": [], + "source": [ + "import os\n", + "import pandas as pd\n", + "\n", + "from virny.custom_classes.metrics_interactive_visualizer import MetricsInteractiveVisualizer" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "outputs": [], + "source": [ + "sensitive_attributes_dct = {'male': '0.0', 'race': 'Non-White', 'male&race': None}" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2023-10-04T21:15:47.534494Z", + "start_time": "2023-10-04T21:15:47.511483Z" + } + }, + "id": "d3c53c7b72ecbcd0" + }, + { + "cell_type": "code", + "execution_count": 6, + "outputs": [], + "source": [ + "ROOT_DIR = os.path.join('docs', 'examples')\n", + "subgroup_metrics_df = pd.read_csv(os.path.join(ROOT_DIR, 'law_school_subgroup_metrics.csv'), header=0)\n", + "models_composed_metrics_df = pd.read_csv(os.path.join(ROOT_DIR, 'law_school_group_metrics.csv'), header=0)" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2023-10-04T21:15:47.559988Z", + "start_time": "2023-10-04T21:15:47.534609Z" + } + }, + "id": "2aab7c79ecdee914" + }, + { + "cell_type": "code", + "execution_count": 7, + "outputs": [], + "source": [ + "subgroup_metrics_df['Model_Name'] = (subgroup_metrics_df['Model_Name'] + '__alpha=' +\n", + " subgroup_metrics_df['Intervention_Param'].astype(str))\n", + "models_composed_metrics_df['Model_Name'] = (models_composed_metrics_df['Model_Name'] + '__alpha=' \n", + " + models_composed_metrics_df['Intervention_Param'].astype(str))" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2023-10-04T21:15:47.581842Z", + "start_time": "2023-10-04T21:15:47.560554Z" + } + }, + "id": "2d922003e752a4b4" + }, + { + "cell_type": "code", + "execution_count": 8, + "outputs": [], + "source": [ + "models_metrics_dct = dict()\n", + "for model_name in subgroup_metrics_df['Model_Name'].unique():\n", + " models_metrics_dct[model_name] = subgroup_metrics_df[subgroup_metrics_df['Model_Name'] == model_name]" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2023-10-04T21:15:47.603973Z", + "start_time": "2023-10-04T21:15:47.582304Z" + } + }, + "id": "833484748ed512e8" + }, + { + "cell_type": "code", + "execution_count": 9, + "outputs": [ + { + "data": { + "text/plain": "dict_keys(['LGBMClassifier__alpha=0.6', 'LGBMClassifier__alpha=0.0', 'LogisticRegression__alpha=0.6', 'LogisticRegression__alpha=0.0', 'MLPClassifier__alpha=0.0', 'MLPClassifier__alpha=0.6', 'RandomForestClassifier__alpha=0.6', 'RandomForestClassifier__alpha=0.0'])" + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "models_metrics_dct.keys()" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2023-10-04T21:15:47.625522Z", + "start_time": "2023-10-04T21:15:47.604575Z" + } + }, + "id": "15ed7d1ba1f22317" + }, + { + "cell_type": "markdown", + "id": "deb45226", + "metadata": {}, + "source": [ + "## Metrics Visualization and Reporting" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "435b9d98", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-04T21:15:47.653413Z", + "start_time": "2023-10-04T21:15:47.624966Z" + } + }, + "outputs": [], + "source": [ + "visualizer = MetricsInteractiveVisualizer(models_metrics_dct, models_composed_metrics_df,\n", + " sensitive_attributes_dct=sensitive_attributes_dct)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running on local URL: http://127.0.0.1:7860\n", + "\n", + "To create a public link, set `share=True` in `launch()`.\n", + "Keyboard interruption in main thread... closing server.\n" + ] + } + ], + "source": [ + "visualizer.start_web_app()" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2023-10-04T21:17:37.487583Z", + "start_time": "2023-10-04T21:15:47.653522Z" + } + }, + "id": "678a9dc8d51243f4" + }, + { + "cell_type": "code", + "execution_count": 12, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Closing server running on port: 7860\n" + ] + } + ], + "source": [ + "visualizer.stop_web_app()" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2023-10-04T21:17:37.530553Z", + "start_time": "2023-10-04T21:17:37.492738Z" + } + }, + "id": "277b6d1de837dab7" + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "2326c129", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-04T21:17:37.533378Z", + "start_time": "2023-10-04T21:17:37.530182Z" + } + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/examples/group_metrics_sample.csv b/docs/examples/income_group_metrics.csv similarity index 100% rename from docs/examples/group_metrics_sample.csv rename to docs/examples/income_group_metrics.csv diff --git a/docs/examples/subgroup_metrics_sample.csv b/docs/examples/income_subgroup_metrics.csv similarity index 100% rename from docs/examples/subgroup_metrics_sample.csv rename to docs/examples/income_subgroup_metrics.csv diff --git a/docs/examples/law_school_group_metrics.csv b/docs/examples/law_school_group_metrics.csv new file mode 100644 index 00000000..f39a023c --- /dev/null +++ b/docs/examples/law_school_group_metrics.csv @@ -0,0 +1,89 @@ +Metric,male,race,male&race,Model_Name,Experiment_Iteration,Intervention_Param,Test_Set_Index +Equalized_Odds_TPR,-0.006852677560728049,-0.08926010463166822,-0.09233449477351918,LGBMClassifier,Exp_iter_1,0.6,0 +Equalized_Odds_FPR,0.027310924369747913,-0.2892592592592593,-0.15657230634189157,LGBMClassifier,Exp_iter_1,0.6,0 +Equalized_Odds_FNR,0.006852677560727997,0.08926010463166825,0.09233449477351917,LGBMClassifier,Exp_iter_1,0.6,0 +Disparate_Impact,1.0155706946616037,1.0637883787525366,1.064060803474484,LGBMClassifier,Exp_iter_1,0.6,0 +Statistical_Parity_Difference,0.01661276831014935,0.06794241218413566,0.06852497096399524,LGBMClassifier,Exp_iter_1,0.6,0 +Accuracy_Parity,-0.02441327723235165,-0.15885561838018636,-0.16299790356394128,LGBMClassifier,Exp_iter_1,0.6,0 +Label_Stability_Ratio,1.0022336520605963,0.9215110409144575,0.9448800911879143,LGBMClassifier,Exp_iter_1,0.6,0 +IQR_Parity,-0.0019234170135528535,0.030752485425003136,0.026171410156253943,LGBMClassifier,Exp_iter_1,0.6,0 +Std_Parity,-0.0014947483480208142,0.022654697553924172,0.019420397675297765,LGBMClassifier,Exp_iter_1,0.6,0 +Std_Ratio,0.9362288387603354,2.1935697988767453,1.91757091989168,LGBMClassifier,Exp_iter_1,0.6,0 +Jitter_Parity,-0.0009008483276642908,0.05605017735541579,0.04049042442969653,LGBMClassifier,Exp_iter_1,0.6,0 +Equalized_Odds_TPR,-0.005171382474971176,-0.11004756903064217,-0.0987224157955865,LGBMClassifier,Exp_iter_1,0.0,0 +Equalized_Odds_FPR,-0.025282526803824923,-0.4292592592592593,-0.3133640552995392,LGBMClassifier,Exp_iter_1,0.0,0 +Equalized_Odds_FNR,0.005171382474971221,0.11004756903064213,0.09872241579558652,LGBMClassifier,Exp_iter_1,0.0,0 +Disparate_Impact,1.0093278423562047,0.9912768659262348,0.9923664122137406,LGBMClassifier,Exp_iter_1,0.0,0 +Statistical_Parity_Difference,0.009888779529904745,-0.009296665118064151,-0.008130081300812941,LGBMClassifier,Exp_iter_1,0.0,0 +Accuracy_Parity,-0.015605423094904092,-0.1335709166202118,-0.11753449368631463,LGBMClassifier,Exp_iter_1,0.0,0 +Label_Stability_Ratio,0.998577907316844,0.911696818570683,0.920586307756427,LGBMClassifier,Exp_iter_1,0.0,0 +IQR_Parity,-0.0018418992707291484,0.03070162807008311,0.02640029144412168,LGBMClassifier,Exp_iter_1,0.0,0 +Std_Parity,-0.001380608364266945,0.022270950149824872,0.01912573180911198,LGBMClassifier,Exp_iter_1,0.0,0 +Std_Ratio,0.9474740574271133,2.0150416987665265,1.7940775240850562,LGBMClassifier,Exp_iter_1,0.0,0 +Jitter_Parity,0.0009153720918688296,0.06001277824710762,0.05223850775990582,LGBMClassifier,Exp_iter_1,0.0,0 +Equalized_Odds_TPR,-0.005365607208478229,-0.07716333043811985,-0.08536585365853655,LogisticRegression,Exp_iter_1,0.6,0 +Equalized_Odds_FPR,0.0021008403361344463,-0.2592592592592593,-0.14691683124862842,LogisticRegression,Exp_iter_1,0.6,0 +Equalized_Odds_FNR,0.005365607208478207,0.07716333043811986,0.08536585365853659,LogisticRegression,Exp_iter_1,0.6,0 +Disparate_Impact,1.014185628316063,1.0865027213593523,1.0769230769230769,LogisticRegression,Exp_iter_1,0.6,0 +Statistical_Parity_Difference,0.015190042348141253,0.09213596057123241,0.0824622531939605,LogisticRegression,Exp_iter_1,0.6,0 +Accuracy_Parity,-0.020523609163160317,-0.15885561838018636,-0.16299790356394128,LogisticRegression,Exp_iter_1,0.6,0 +Label_Stability_Ratio,1.004335707649427,0.9552448804260418,0.9689971045213348,LogisticRegression,Exp_iter_1,0.6,0 +IQR_Parity,-0.0004394323534326547,0.015022317395668628,0.013321803169827343,LogisticRegression,Exp_iter_1,0.6,0 +Std_Parity,-0.00037752191542240673,0.011290698242018816,0.010010789402424683,LogisticRegression,Exp_iter_1,0.6,0 +Std_Ratio,0.9574177968749634,2.658469055430207,2.2721629361081668,LogisticRegression,Exp_iter_1,0.6,0 +Jitter_Parity,-0.002206018404318751,0.03092054469475277,0.022461201723108764,LogisticRegression,Exp_iter_1,0.6,0 +Equalized_Odds_TPR,-0.000257377560966332,-0.098576968913487,-0.07491289198606277,LogisticRegression,Exp_iter_1,0.0,0 +Equalized_Odds_FPR,0.001014198782961384,-0.3766666666666667,-0.2736449418477068,LogisticRegression,Exp_iter_1,0.0,0 +Equalized_Odds_FNR,0.00025737756096630773,0.09857696891348698,0.07491289198606271,LogisticRegression,Exp_iter_1,0.0,0 +Disparate_Impact,1.0178946069357029,1.024124924276844,1.0353452963567156,LogisticRegression,Exp_iter_1,0.0,0 +Statistical_Parity_Difference,0.019005426376910384,0.02574130930979468,0.03774680603948899,LogisticRegression,Exp_iter_1,0.0,0 +Accuracy_Parity,-0.014941561477325838,-0.1421916062753843,-0.11596216664228953,LogisticRegression,Exp_iter_1,0.0,0 +Label_Stability_Ratio,1.000802025127658,0.9591320645489642,0.9674653511862815,LogisticRegression,Exp_iter_1,0.0,0 +IQR_Parity,-0.0004508970638314215,0.01656430213503716,0.014545259937867398,LogisticRegression,Exp_iter_1,0.0,0 +Std_Parity,-0.000250712698052144,0.012597874744057873,0.011208249522494669,LogisticRegression,Exp_iter_1,0.0,0 +Std_Ratio,0.971192962518509,2.943109990424136,2.4624081283525006,LogisticRegression,Exp_iter_1,0.0,0 +Jitter_Parity,-0.0005955631359242288,0.029270523731717988,0.02275483751946553,LogisticRegression,Exp_iter_1,0.0,0 +Equalized_Odds_TPR,-0.00542995159871984,-0.10879522087785565,-0.08885017421602792,MLPClassifier,Exp_iter_1,0.0,0 +Equalized_Odds_FPR,0.05143436685018832,-0.3496296296296296,-0.21560236998025017,MLPClassifier,Exp_iter_1,0.0,0 +Equalized_Odds_FNR,0.005429951598719784,0.10879522087785565,0.08885017421602788,MLPClassifier,Exp_iter_1,0.0,0 +Disparate_Impact,1.0186228591559474,1.0137681641813756,1.0339168490153174,MLPClassifier,Exp_iter_1,0.0,0 +Statistical_Parity_Difference,0.019652444967672933,0.014621669662876036,0.03600464576074347,MLPClassifier,Exp_iter_1,0.0,0 +Accuracy_Parity,-0.024665731650303835,-0.14909346712325133,-0.13497635415143083,MLPClassifier,Exp_iter_1,0.0,0 +Label_Stability_Ratio,1.001836062082041,0.8553840569742932,0.8648947072020089,MLPClassifier,Exp_iter_1,0.0,0 +IQR_Parity,-0.0020205977060946817,0.09889952827181274,0.08378658970964548,MLPClassifier,Exp_iter_1,0.0,0 +Std_Parity,-0.0033869150678196153,0.10496476391153896,0.09394292815043398,MLPClassifier,Exp_iter_1,0.0,0 +Std_Ratio,0.9706692880546564,2.088873447566327,1.884663033993635,MLPClassifier,Exp_iter_1,0.0,0 +Jitter_Parity,-0.0014995576292047702,0.10470271374925606,0.09636066589101067,MLPClassifier,Exp_iter_1,0.0,0 +Equalized_Odds_TPR,0.004399249792072291,-0.12046528773708765,-0.10859465737514518,MLPClassifier,Exp_iter_1,0.6,0 +Equalized_Odds_FPR,0.03441031585047816,-0.24518518518518517,-0.18981786262892253,MLPClassifier,Exp_iter_1,0.6,0 +Equalized_Odds_FNR,-0.0043992497920722975,0.1204652877370877,0.10859465737514518,MLPClassifier,Exp_iter_1,0.6,0 +Disparate_Impact,1.0262887781579368,1.0295513811087504,1.0238227146814405,MLPClassifier,Exp_iter_1,0.6,0 +Statistical_Parity_Difference,0.027283213025210973,0.03090219564910024,0.024970963995354367,MLPClassifier,Exp_iter_1,0.6,0 +Accuracy_Parity,-0.01372604020570356,-0.17549308486634285,-0.1530398322851153,MLPClassifier,Exp_iter_1,0.6,0 +Label_Stability_Ratio,1.0106622176454783,0.7347549972966689,0.7588685481341745,MLPClassifier,Exp_iter_1,0.6,0 +IQR_Parity,-0.014337453917789456,0.239717291325784,0.20712778100148252,MLPClassifier,Exp_iter_1,0.6,0 +Std_Parity,-0.0043530382426541225,0.14139945806041038,0.12248067260767251,MLPClassifier,Exp_iter_1,0.6,0 +Std_Ratio,0.9757227989415077,1.9199580092412873,1.7324037388625755,MLPClassifier,Exp_iter_1,0.6,0 +Jitter_Parity,-0.005143773566298637,0.14638050323022922,0.12861240469325352,MLPClassifier,Exp_iter_1,0.6,0 +Equalized_Odds_TPR,-0.001291654055960545,-0.09822600844325047,-0.07026713124274109,RandomForestClassifier,Exp_iter_1,0.6,0 +Equalized_Odds_FPR,0.05252100840336138,-0.23222222222222222,-0.11465876673249942,RandomForestClassifier,Exp_iter_1,0.6,0 +Equalized_Odds_FNR,0.0012916540559605519,0.09822600844325045,0.070267131242741,RandomForestClassifier,Exp_iter_1,0.6,0 +Disparate_Impact,1.023725852624935,1.0662711508746496,1.0951859956236325,RandomForestClassifier,Exp_iter_1,0.6,0 +Statistical_Parity_Difference,0.025083588129174883,0.07017189488355191,0.10104529616724744,RandomForestClassifier,Exp_iter_1,0.6,0 +Accuracy_Parity,-0.022010285179990707,-0.1732234344721404,-0.15403929598751886,RandomForestClassifier,Exp_iter_1,0.6,0 +Label_Stability_Ratio,1.001176387259295,0.8802415712253702,0.8891938218753054,RandomForestClassifier,Exp_iter_1,0.6,0 +IQR_Parity,-0.0035096712918958883,0.04988279067634181,0.0462411893925246,RandomForestClassifier,Exp_iter_1,0.6,0 +Std_Parity,-0.0023313579149804586,0.03429320329971825,0.031556199509573314,RandomForestClassifier,Exp_iter_1,0.6,0 +Std_Ratio,0.9518148424379955,1.8242881288324113,1.7054584360968619,RandomForestClassifier,Exp_iter_1,0.6,0 +Jitter_Parity,-4.495690233047994e-05,0.07727229028260862,0.07378751418836879,RandomForestClassifier,Exp_iter_1,0.6,0 +Equalized_Odds_TPR,-0.0020673614272062046,-0.11776112468943789,-0.10162601626016254,RandomForestClassifier,Exp_iter_1,0.0,0 +Equalized_Odds_FPR,0.04303100550565053,-0.39185185185185184,-0.2725477287689269,RandomForestClassifier,Exp_iter_1,0.0,0 +Equalized_Odds_FNR,0.0020673614272062393,0.11776112468943785,0.1016260162601626,RandomForestClassifier,Exp_iter_1,0.0,0 +Disparate_Impact,1.0209866123993547,0.9959582206649654,1.004931506849315,RandomForestClassifier,Exp_iter_1,0.0,0 +Statistical_Parity_Difference,0.022045103034433744,-0.004287272506918294,0.00522648083623678,RandomForestClassifier,Exp_iter_1,0.0,0 +Accuracy_Parity,-0.020729312762973406,-0.14734809269730031,-0.13025937301935542,RandomForestClassifier,Exp_iter_1,0.0,0 +Label_Stability_Ratio,0.9930186851041846,0.8737383149825507,0.8708797513120977,RandomForestClassifier,Exp_iter_1,0.0,0 +IQR_Parity,-0.001739345488546054,0.055151728119773834,0.04682910389547073,RandomForestClassifier,Exp_iter_1,0.0,0 +Std_Parity,-0.0009731829505101527,0.03857636987638614,0.03338260860983806,RandomForestClassifier,Exp_iter_1,0.0,0 +Std_Ratio,0.9772979817363154,2.072208090053585,1.8414636557441237,RandomForestClassifier,Exp_iter_1,0.0,0 +Jitter_Parity,0.0032763339840793312,0.0841594483260172,0.08485739726863116,RandomForestClassifier,Exp_iter_1,0.0,0 diff --git a/docs/examples/law_school_subgroup_metrics.csv b/docs/examples/law_school_subgroup_metrics.csv new file mode 100644 index 00000000..3648b11d --- /dev/null +++ b/docs/examples/law_school_subgroup_metrics.csv @@ -0,0 +1,153 @@ +Metric,Bootstrap_Model_Seed,Model_Name,Model_Params,Run_Number,Dataset_Name,Num_Estimators,Tag,Record_Create_Date_Time,Session_Uuid,Experiment_Iteration,Dataset_Split_Seed,Model_Init_Seed,Fair_Intervention_Params_Lst,Intervention_Param,male&race_dis,male&race_dis_correct,male&race_dis_incorrect,male&race_priv,male&race_priv_correct,male&race_priv_incorrect,male_dis,male_dis_correct,male_dis_incorrect,male_priv,male_priv_correct,male_priv_incorrect,overall,race_dis,race_dis_correct,race_dis_incorrect,race_priv,race_priv_correct,race_priv_incorrect,Test_Set_Index +Accuracy,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 5, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 600}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.630,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.75,1.0,0.0,0.9129979035639413,1.0,0.0,0.886021505376344,1.0,0.0,0.9104347826086957,1.0,0.0,0.8995192307692308,0.7672413793103449,1.0,0.0,0.9260969976905312,1.0,0.0,0 +Aleatoric_Uncertainty,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 5, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 600}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.630,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.5868292198900119,0.4895028089709125,0.8788084526473101,0.31213451114412527,0.2746251249709554,0.7057571058047387,0.32557852040339047,0.27641138563249196,0.7077834171130161,0.34234717313819124,0.29969421995747725,0.7759165127518567,0.334849650521189,0.5991994902774432,0.5141883196970904,0.8794214970052727,0.28173547948471295,0.25202902038499314,0.6539945450780771,0 +F1,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 5, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 600}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.630,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.8365019011406845,1.0,0.0,0.9534231200897868,1.0,0.0,0.9375,1.0,0.0,0.9516658845612389,1.0,0.0,0.9453880324013587,0.8468809073724007,1.0,0.0,0.9611885991510006,1.0,0.0,0 +FNR,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 5, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 600}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.630,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.10569105691056911,0.0,1.0,0.013356562137049941,0.0,1.0,0.02334152334152334,0.0,1.0,0.016488845780795344,0.0,1.0,0.01951219512195122,0.0967741935483871,0.0,1.0,0.007514088916718848,0.0,1.0,0 +FPR,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 5, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 600}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.630,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.6122448979591837,0.0,1.0,0.7688172043010753,0.0,1.0,0.75,0.0,1.0,0.7226890756302521,0.0,1.0,0.7361702127659574,0.57,0.0,1.0,0.8592592592592593,0.0,1.0,0 +IQR,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 5, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 600}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.630,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.053677237009712865,0.04423043496352387,0.08201764314827989,0.027505826853458922,0.023814295627974335,0.06624466658113452,0.028606573479079064,0.023741376201889028,0.0664265975961035,0.030529990492631918,0.02638713954524289,0.07264227148211065,0.02967000115484146,0.055277359210661375,0.04736805932154612,0.0813487551414487,0.02452487378565824,0.02153550951083108,0.06198534485458611,0 +Jitter,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 5, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 600}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.630,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.05720170620545171,0.028317556776123513,0.1438541544934052,0.016711281775755177,0.008955396961846785,0.09810135012414363,0.019561463230124726,0.008734144021076752,0.10372854840239312,0.020462311557789017,0.011515120972579035,0.1114109381860803,0.02005952841128785,0.06673207993993159,0.03564809064047434,0.16919411874184762,0.010681902584515802,0.006069342974223462,0.06848304020100503,0 +Label_Stability,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 5, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 600}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.630,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.922674418604651,0.9623255813953489,0.8037209302325582,0.9764989517819705,0.9878645235361653,0.8572289156626507,0.973247311827957,0.9883373786407766,0.8559433962264151,0.9710782608695653,0.9843457497612227,0.8362135922330096,0.9720480769230768,0.9076724137931035,0.9531460674157304,0.7577777777777778,0.9849826789838337,0.9915897755610973,0.9021875,0 +Mean,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 5, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 600}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.630,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.25366066560450123,0.19218317287414302,0.43809314379557607,0.09430034646818729,0.07687616230366145,0.27714931523086195,0.10592175970495323,0.08043902837613173,0.30401393531767884,0.10873692088666873,0.08827903023095526,0.3166923725034843,0.10747821901215171,0.2623223387707427,0.2132171520025776,0.4241875840435831,0.07636635199368194,0.0634544416764679,0.2381687281562705,0 +Overall_Uncertainty,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 5, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 600}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.630,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.59599798281351,0.4973836190946347,0.8918410739701361,0.3172760636629066,0.2792196178051038,0.716639489471898,0.3308123858516533,0.2809034869135636,0.7187834492949164,0.3480164031919235,0.3047742004421416,0.7875754932795126,0.34032422236189885,0.6086383785857439,0.5226537972216503,0.892069035674793,0.2864135258457914,0.256243452133116,0.6644822620577554,0 +PPV,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 5, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 600}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.630,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.7857142857142857,1.0,0.0,0.9223669923995657,1.0,0.0,0.9013605442176871,1.0,0.0,0.9218181818181819,1.0,0.0,0.9127144298688193,0.797153024911032,1.0,0.0,0.9318048206937096,1.0,0.0,0 +Per_Sample_Accuracy,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 5, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 600}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.630,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.760406976744186,0.9811627906976744,0.09813953488372094,0.9136582809224318,0.9939207807118255,0.0713855421686747,0.8890645161290323,0.9941686893203884,0.07202830188679245,0.9106260869565218,0.9921537726838585,0.08189320388349515,0.9009855769230769,0.777456896551724,0.9765730337078652,0.12111111111111111,0.9258054272517321,0.9957824189526184,0.048906250000000005,0 +Positive-Rate,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 5, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 600}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.630,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,1.1382113821138211,1.0,2.3076923076923075,1.0696864111498259,1.0,6.217391304347826,1.0835380835380835,1.0,4.578947368421052,1.066925315227934,1.0,5.0588235294117645,1.0742547425474254,1.1330645161290323,1.0,2.375,1.0651221039448966,1.0,9.666666666666666,0 +Sample_Size,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 5, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 600}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.630,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,172.0,129.0,43.0,1908.0,1742.0,166.0,930.0,824.0,106.0,1150.0,1047.0,103.0,2080.0,348.0,267.0,81.0,1732.0,1604.0,128.0,0 +Selection-Rate,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 5, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 600}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.630,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.813953488372093,0.8527131782945736,0.6976744186046512,0.9654088050314465,0.9753157290470723,0.8614457831325302,0.9483870967741935,0.9648058252427184,0.8207547169811321,0.9565217391304348,0.9684813753581661,0.8349514563106796,0.9528846153846153,0.8074712643678161,0.8389513108614233,0.7037037037037037,0.9821016166281755,0.9881546134663342,0.90625,0 +Statistical_Bias,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 5, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 600}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.630,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.27685883580701437,0.15177998477621654,0.6520953888994078,0.12810491537979324,0.06947590409695573,0.7433563470346304,0.14717405086035498,0.07096334887945019,0.7396044134288979,0.13493220087245378,0.07844588681600942,0.7091183253102911,0.1404057203381981,0.2752245486786175,0.1630144388115851,0.6451023182403169,0.11331741071783666,0.06052480536803965,0.7748747465074804,0 +Std,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 5, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 600}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.630,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.040585407653589534,0.03364597649472218,0.061403701130191564,0.02116500997829177,0.018455696617986055,0.04959647909668067,0.02194450411287219,0.01834402689967414,0.049933119430562715,0.023439252460893005,0.020415163620839904,0.05417926232046194,0.02277092747836447,0.04163531986461287,0.03584538374530121,0.06072066485049203,0.0189806223106887,0.01678269140670539,0.04652344395122948,0 +TNR,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 5, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 600}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.630,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.3877551020408163,1.0,0.0,0.23118279569892472,1.0,0.0,0.25,1.0,0.0,0.2773109243697479,1.0,0.0,0.26382978723404255,0.43,1.0,0.0,0.14074074074074075,1.0,0.0,0 +TPR,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 5, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 600}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.630,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.8943089430894309,1.0,0.0,0.9866434378629501,1.0,0.0,0.9766584766584766,1.0,0.0,0.9835111542192047,1.0,0.0,0.9804878048780488,0.9032258064516129,1.0,0.0,0.9924859110832811,1.0,0.0,0 +Accuracy,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 9, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 700}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.649,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.7965116279069767,1.0,0.0,0.9140461215932913,1.0,0.0,0.8956989247311828,1.0,0.0,0.9113043478260869,1.0,0.0,0.9043269230769231,0.7931034482758621,1.0,0.0,0.9266743648960739,1.0,0.0,0 +Aleatoric_Uncertainty,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 9, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 700}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.649,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.592922294584175,0.5276964598004423,0.8482348478805002,0.3098682100253761,0.2728221999884231,0.7038209021256567,0.3250495496308344,0.28328770350714166,0.6836847848992476,0.3399261723827997,0.29782220873189075,0.7725237596980217,0.3332746054792768,0.6057061382348319,0.5378938497098285,0.8656532442473446,0.2785366300757357,0.24899540763399236,0.6518725514851685,0 +F1,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 9, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 700}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.649,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.8616600790513834,1.0,0.0,0.953880764904387,1.0,0.0,0.942433234421365,1.0,0.0,0.9519774011299436,1.0,0.0,0.947755316355999,0.8588235294117647,1.0,0.0,0.9615034859048196,1.0,0.0,0 +FNR,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 9, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 700}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.649,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.11382113821138211,0.0,1.0,0.015098722415795587,0.0,1.0,0.02457002457002457,0.0,1.0,0.019398642095053348,0.0,1.0,0.02168021680216802,0.11693548387096774,0.0,1.0,0.0068879148403256105,0.0,1.0,0 +FPR,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 9, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 700}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.649,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.42857142857142855,0.0,1.0,0.7419354838709677,0.0,1.0,0.6637931034482759,0.0,1.0,0.6890756302521008,0.0,1.0,0.676595744680851,0.43,0.0,1.0,0.8592592592592593,0.0,1.0,0 +IQR,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 9, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 700}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.649,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.05740452837709349,0.051346443480558994,0.08111760354352847,0.031004236932971812,0.027189497507483208,0.07157073423816773,0.03216898018636143,0.027970534528632626,0.06822367330891912,0.03401087945709058,0.029726613690397245,0.07802961007958674,0.03318733795623572,0.05875234748382416,0.05243974897608184,0.08295064176350304,0.028050719413741047,0.02490939295482162,0.06775016009536051,0 +Jitter,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 9, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 700}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.649,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.07016127147365255,0.05538752154935482,0.12798994974874758,0.017922763713746726,0.010617421972246736,0.09560883686723742,0.0227485816177594,0.01584127118183958,0.08206600010360975,0.02183320952589057,0.012317839195979677,0.11959897526848352,0.022242486470816773,0.07221466528042612,0.04855800742845045,0.16289852037967506,0.012201887033318502,0.00791455720972512,0.0663842836228268,0 +Label_Stability,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 9, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 700}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.649,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.8973255813953487,0.9191970802919709,0.8117142857142857,0.9747327044025157,0.9849770642201836,0.8657926829268292,0.9675698924731184,0.9772629051620647,0.8843298969072166,0.9689478260869565,0.982509541984733,0.8296078431372548,0.9683317307692308,0.8960632183908046,0.931086956521739,0.7618055555555556,0.982852193995381,0.9886292834890966,0.9098425196850394,0 +Mean,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 9, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 700}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.649,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.2739440845404644,0.22641911612137364,0.45997038949519153,0.09660964567395051,0.07937119259295998,0.2799258784376546,0.1103025082631652,0.08837411961679525,0.2986153715871464,0.11205935113227285,0.09143810796751904,0.32393251619758684,0.111273839657143,0.28224317965873474,0.2386743578529879,0.4492569965807643,0.07692203231271234,0.06452875764693192,0.23354570033300814,0 +Overall_Uncertainty,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 9, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 700}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.649,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.6031762387252277,0.5373269440801166,0.8609291920503771,0.31654586441614585,0.27891570509178676,0.7167104855239652,0.3317985958463931,0.2893980625214335,0.6959186397607364,0.3470809810692174,0.30436468982700193,0.7859699342245303,0.3402479915224738,0.6161858681467297,0.547773037264914,0.87843505319369,0.2848055082284548,0.25473982724855815,0.6647694292736047,0 +PPV,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 9, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 700}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.649,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.8384615384615385,1.0,0.0,0.9247546346782988,1.0,0.0,0.9115958668197475,1.0,0.0,0.9249771271729186,1.0,0.0,0.9190427698574338,0.8358778625954199,1.0,0.0,0.9318448883666275,1.0,0.0,0 +Per_Sample_Accuracy,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 9, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 700}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.649,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.7834883720930234,0.9595985401459854,0.09414285714285714,0.9129481132075472,0.9924885321100918,0.06710365853658537,0.8915483870967743,0.9886314525810325,0.05783505154639175,0.9108913043478262,0.9912547709923665,0.08519607843137256,0.9022427884615385,0.7904166666666665,0.9655434782608696,0.11909722222222222,0.9247113163972287,0.9943146417445483,0.04507874015748031,0 +Positive-Rate,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 9, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 700}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.649,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,1.056910569105691,1.0,1.5,1.065040650406504,1.0,5.3076923076923075,1.07002457002457,1.0,3.85,1.0601357904946653,1.0,4.1,1.06449864498645,1.0564516129032258,1.0,1.4827586206896552,1.06574827802129,1.0,10.545454545454545,0 +Sample_Size,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 9, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 700}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.649,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,172.0,137.0,35.0,1908.0,1744.0,164.0,930.0,833.0,97.0,1150.0,1048.0,102.0,2080.0,348.0,276.0,72.0,1732.0,1605.0,127.0,0 +Selection-Rate,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 9, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 700}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.649,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.7558139534883721,0.7956204379562044,0.6,0.9612159329140462,0.9724770642201835,0.8414634146341463,0.9365591397849462,0.9531812725090036,0.7938144329896907,0.9504347826086956,0.9646946564885496,0.803921568627451,0.9442307692307692,0.7528735632183908,0.7934782608695652,0.5972222222222222,0.9826789838337182,0.9881619937694704,0.9133858267716536,0 +Statistical_Bias,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 9, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 700}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.649,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.276128644034887,0.17380209140127534,0.6766640072007386,0.1289059558239749,0.07090503005124324,0.7456962884315602,0.14780473189310347,0.07679580415445281,0.7576030494837839,0.13564199115265949,0.07967400197584328,0.7106856446556344,0.1410801396568003,0.27502703770599213,0.1756101522346261,0.6561250986795618,0.1141670215730135,0.061682776893823135,0.7774521610226242,0 +Std,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 9, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 700}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.649,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.043211203603756757,0.039001217929493896,0.05969029038587135,0.024085471794644778,0.021311889128880726,0.053580155752525914,0.02490370556976991,0.021819603134675115,0.051388832667027276,0.026284313934036855,0.023220774891149123,0.057760675864883336,0.02566702269424442,0.04421187156900244,0.03990185592553161,0.060733598202307316,0.02194092141917757,0.019625040038418647,0.05120855619176078,0 +TNR,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 9, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 700}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.649,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.5714285714285714,1.0,0.0,0.25806451612903225,1.0,0.0,0.33620689655172414,1.0,0.0,0.31092436974789917,1.0,0.0,0.32340425531914896,0.57,1.0,0.0,0.14074074074074075,1.0,0.0,0 +TPR,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 9, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 700}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.649,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.8861788617886179,1.0,0.0,0.9849012775842044,1.0,0.0,0.9754299754299754,1.0,0.0,0.9806013579049466,1.0,0.0,0.978319783197832,0.8830645161290323,1.0,0.0,0.9931120851596744,1.0,0.0,0 +Accuracy,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.641,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.75,1.0,0.0,0.9129979035639413,1.0,0.0,0.8881720430107527,1.0,0.0,0.908695652173913,1.0,0.0,0.8995192307692308,0.7672413793103449,1.0,0.0,0.9260969976905312,1.0,0.0,0 +Aleatoric_Uncertainty,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.641,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.5891215644365289,0.48927546327099836,0.8886598679331205,0.32188174290524896,0.28410771416827957,0.718281490253446,0.33816043498710907,0.28987378572144484,0.7216678608855572,0.34868701739851005,0.30487696252362523,0.7847013730580786,0.343980420454951,0.5894883168279874,0.5015844215216906,0.8792456013561508,0.29465204404743556,0.26440718971122845,0.6736578749480313,0 +F1,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.641,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.8377358490566038,1.0,0.0,0.95347533632287,1.0,0.0,0.9387514723203769,1.0,0.0,0.9508196721311475,1.0,0.0,0.9454735194364727,0.8485981308411215,1.0,0.0,0.9611885991510006,1.0,0.0,0 +FNR,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.641,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.0975609756097561,0.0,1.0,0.012195121951219513,0.0,1.0,0.020884520884520884,0.0,1.0,0.015518913676042677,0.0,1.0,0.01788617886178862,0.0846774193548387,0.0,1.0,0.007514088916718848,0.0,1.0,0 +FPR,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.641,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.6326530612244898,0.0,1.0,0.7795698924731183,0.0,1.0,0.75,0.0,1.0,0.7478991596638656,0.0,1.0,0.7489361702127659,0.6,0.0,1.0,0.8592592592592593,0.0,1.0,0 +IQR,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.641,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.023912502324325242,0.019156958789008097,0.0381791329302767,0.0105906991544979,0.00899457929829072,0.027340342464816637,0.011449354413518452,0.009318891051395165,0.028370149962689946,0.011888786766951107,0.009992728050671836,0.030759085419444807,0.011692309801233623,0.024201277940319232,0.019911003053478166,0.03834329515990644,0.009178960544650604,0.007994742522522323,0.02401869263444561,0 +Jitter,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.641,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.031174184877876737,0.013566281017488057,0.0839978964590242,0.008712983154767973,0.004615990399760046,0.05170672640311374,0.009350678121789593,0.005163894533198856,0.04260340162350032,0.011556696526108344,0.00528777860594856,0.07394735582675098,0.01057035175879348,0.036317651475770714,0.01897653059303909,0.0934791240151367,0.005397106781017945,0.002945368989586808,0.036120445979899496,0 +Label_Stability,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.641,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.9565697674418605,0.9824806201550388,0.8788372093023257,0.9871750524109015,0.9929793340987371,0.9262650602409638,0.987,0.9929176755447942,0.94,0.9827391304347827,0.9917320574162678,0.8932380952380953,0.9846442307692307,0.9476724137931033,0.9722846441947567,0.8665432098765432,0.9920727482678984,0.995579800498753,0.948125,0 +Mean,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.641,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.247355085785541,0.1906855690445673,0.41736363600846205,0.0969206653426322,0.07952414752913668,0.2794793040842538,0.10726019236204597,0.08341812655626832,0.29662121501177996,0.11105889159317614,0.09016854628423701,0.3189675663345226,0.1093604347254112,0.25966118353256934,0.21385445860289146,0.41065372126372957,0.07916143900665194,0.06610371755332499,0.2427910109686555,0 +Overall_Uncertainty,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.641,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.5909635668938957,0.49076897425279215,0.8915473448172062,0.32261979024028553,0.2847299722958807,0.7202346267412091,0.33896081277435763,0.2905226309331388,0.7236717570132695,0.3495397716557064,0.3055857571935519,0.7869868679695292,0.3448097563866418,0.5913754408802875,0.503139152384341,0.8822283918484076,0.2952688451835305,0.26494429908442346,0.6752733134879653,0 +PPV,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.641,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.7816901408450704,1.0,0.0,0.9214517876489707,1.0,0.0,0.9015837104072398,1.0,0.0,0.9193840579710145,1.0,0.0,0.9114688128772636,0.7909407665505227,1.0,0.0,0.9318048206937096,1.0,0.0,0 +Per_Sample_Accuracy,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.641,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.7585755813953488,0.9912403100775193,0.06058139534883721,0.9130110062893082,0.9964896670493686,0.036987951807228914,0.8883817204301075,0.9964588377723972,0.030000000000000002,0.9098304347826087,0.9958660287081338,0.05357142857142857,0.9002403846153846,0.7721982758620689,0.9861423220973783,0.06697530864197532,0.9259670900692841,0.9977899002493766,0.025937500000000002,0 +Positive-Rate,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.641,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,1.1544715447154472,1.0,2.5833333333333335,1.0720092915214867,1.0,6.904761904761905,1.085995085995086,1.0,5.117647058823529,1.0708050436469447,1.0,5.5625,1.0775067750677507,1.157258064516129,1.0,2.857142857142857,1.0651221039448966,1.0,9.666666666666666,0 +Sample_Size,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.641,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,172.0,129.0,43.0,1908.0,1742.0,166.0,930.0,826.0,104.0,1150.0,1045.0,105.0,2080.0,348.0,267.0,81.0,1732.0,1604.0,128.0,0 +Selection-Rate,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.641,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.8255813953488372,0.8604651162790697,0.7209302325581395,0.9675052410901468,0.9764638346727899,0.8734939759036144,0.9505376344086022,0.9648910411622276,0.8365384615384616,0.96,0.9712918660287081,0.8476190476190476,0.9557692307692308,0.8247126436781609,0.850187265917603,0.7407407407407407,0.9821016166281755,0.9881546134663342,0.90625,0 +Statistical_Bias,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.641,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.27504711670850107,0.1506133016514677,0.6483485618796012,0.1289834655119916,0.07031450212142086,0.7446541536226798,0.14859124342882396,0.07421384124811968,0.7393194569024943,0.1349727825060312,0.07714482845704078,0.7104986108983646,0.14106180589939527,0.27006616933129063,0.1543447765772945,0.6515181676685371,0.11514176059090822,0.06278486487681847,0.7712391100080953,0 +Std,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.641,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.01787989886811148,0.014373745163374837,0.028398359982321417,0.007869109465686797,0.006678257158356828,0.020365884883571175,0.008488198684187412,0.006924835756316542,0.020904908092084895,0.008865720599609819,0.007433323216474148,0.02312148503176959,0.008696924743194993,0.018098602317799122,0.014907720127373635,0.02861669546401646,0.006807904075780305,0.005927291659553734,0.01784307841661955,0 +TNR,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.641,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.3673469387755102,1.0,0.0,0.22043010752688172,1.0,0.0,0.25,1.0,0.0,0.25210084033613445,1.0,0.0,0.251063829787234,0.4,1.0,0.0,0.14074074074074075,1.0,0.0,0 +TPR,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.641,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.9024390243902439,1.0,0.0,0.9878048780487805,1.0,0.0,0.9791154791154791,1.0,0.0,0.9844810863239574,1.0,0.0,0.9821138211382113,0.9153225806451613,1.0,0.0,0.9924859110832811,1.0,0.0,0 +Accuracy,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.661,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.7965116279069767,1.0,0.0,0.9124737945492662,1.0,0.0,0.8946236559139785,1.0,0.0,0.9095652173913044,1.0,0.0,0.9028846153846154,0.7844827586206896,1.0,0.0,0.9266743648960739,1.0,0.0,0 +Aleatoric_Uncertainty,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.661,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.6115836953497042,0.5445957245167313,0.8737937526101981,0.31998663134588556,0.2817476539461111,0.7186336951363496,0.3395684737082231,0.2964984178968526,0.7052244577394499,0.3477636588343056,0.3044412964519983,0.7834866497178965,0.3440994654846629,0.611982495927394,0.5377857770264783,0.882058552726727,0.2902753923933983,0.2606334969786561,0.6648835982253761,0 +F1,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.661,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.8648648648648649,1.0,0.0,0.9531030609379387,1.0,0.0,0.9421487603305785,1.0,0.0,0.9510818438381938,1.0,0.0,0.9471204188481676,0.8554913294797688,1.0,0.0,0.9615268100575584,1.0,0.0,0 +FNR,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.661,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.08943089430894309,0.0,1.0,0.014518002322880372,0.0,1.0,0.019656019656019656,0.0,1.0,0.019398642095053348,0.0,1.0,0.01951219512195122,0.10483870967741936,0.0,1.0,0.006261740763932373,0.0,1.0,0 +FPR,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.661,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.4897959183673469,0.0,1.0,0.7634408602150538,0.0,1.0,0.7068965517241379,0.0,1.0,0.7058823529411765,0.0,1.0,0.7063829787234043,0.49,0.0,1.0,0.8666666666666667,0.0,1.0,0 +IQR,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.661,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.024815218199418322,0.021806889229005432,0.03659067731217739,0.010269958261550924,0.008581377613600439,0.027873664297968836,0.011223445322083164,0.009369705301001008,0.02696131978678064,0.011674342385914586,0.00968654630900504,0.03166698369790868,0.011472739371797653,0.025265706341934365,0.02147089571666985,0.03907881701789719,0.008701404206897204,0.007517861507165882,0.02365877454602139,0 +Jitter,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.661,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.030009349070934097,0.025189817701649676,0.04887437185929909,0.007254511551468568,0.002381984592693784,0.05805133451689412,0.0088068838817726,0.005149425009663387,0.03985796328580953,0.00940244701769683,0.0031679910066586894,0.07210668728256929,0.009136161577115758,0.03350950153064315,0.016894177848956526,0.09398927973197556,0.0042389777989251635,0.0018603923042000519,0.034299054326745924,0 +Label_Stability,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.661,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.9577906976744187,0.9631386861313868,0.9368571428571428,0.99,0.9969902354968408,0.9171257485029938,0.9877741935483872,0.9928365384615384,0.944795918367347,0.9869826086956519,0.9958604206500957,0.8976923076923077,0.9873365384615383,0.9535057471264368,0.9763003663003662,0.8705333333333334,0.994133949191686,0.9976199376947041,0.9500787401574803,0 +Mean,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.661,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.27990861449265425,0.23687207410087685,0.4483659297404686,0.09764045847136385,0.07943268391798641,0.28745923390507744,0.1115736628080759,0.0894819945281686,0.2991274180007584,0.1136337130822506,0.09205999751969234,0.3306155061441347,0.11271263291158595,0.2910565701228048,0.24731175503180208,0.45028769705405447,0.07687909356429717,0.0643163038812165,0.23564505766937208,0 +Overall_Uncertainty,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.661,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.6136094522005411,0.5463904551386578,0.8767238121284847,0.32069789872723925,0.2823317997970399,0.7206702235025518,0.34037042780630966,0.2971631788415554,0.7071911537111623,0.3485981901653893,0.3051198766773121,0.7858896892858577,0.3449194310336854,0.6140499172446062,0.5395372672119887,0.8852759633633344,0.29084471440470133,0.2611224185992334,0.6664690039147482,0 +PPV,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.661,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.8235294117647058,1.0,0.0,0.922784121805329,1.0,0.0,0.9068181818181819,1.0,0.0,0.9232876712328767,1.0,0.0,0.9159493670886076,0.8191881918819188,1.0,0.0,0.9313380281690141,1.0,0.0,0 +Per_Sample_Accuracy,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.661,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.7882558139534883,0.9815693430656934,0.03157142857142858,0.914727463312369,0.9984951177484205,0.041437125748502994,0.8943279569892472,0.9964182692307693,0.027602040816326532,0.9123086956521739,0.9979302103250478,0.051153846153846154,0.9042692307692308,0.7891379310344828,0.9881501831501831,0.06473333333333334,0.9274018475750577,0.9988099688473521,0.024960629921259844,0 +Positive-Rate,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.661,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,1.1056910569105691,1.0,2.1818181818181817,1.0679442508710801,1.0,5.68,1.0810810810810811,1.0,5.125,1.0620756547041708,1.0,4.2,1.070460704607046,1.092741935483871,1.0,1.8846153846153846,1.0670006261740763,1.0,11.7,0 +Sample_Size,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.661,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,172.0,137.0,35.0,1908.0,1741.0,167.0,930.0,832.0,98.0,1150.0,1046.0,104.0,2080.0,348.0,273.0,75.0,1732.0,1605.0,127.0,0 +Selection-Rate,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.661,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.7906976744186046,0.8175182481751825,0.6857142857142857,0.9638364779874213,0.9747271682940839,0.8502994011976048,0.946236559139785,0.9591346153846154,0.8367346938775511,0.9521739130434783,0.9665391969407265,0.8076923076923077,0.9495192307692307,0.7787356321839081,0.8131868131868132,0.6533333333333333,0.9838337182448037,0.9887850467289719,0.9212598425196851,0 +Statistical_Bias,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.661,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.2758597442084151,0.17583238687974592,0.6673954000377772,0.12760814856082148,0.06867265133679296,0.7420195298005438,0.14761280273512567,0.07672551110543081,0.7494314418770248,0.13360375383845904,0.07630257910149453,0.7099213382121593,0.13986741512398787,0.2715719704816224,0.16753202078607243,0.6502773873734242,0.1134048370267264,0.06100428741762241,0.7756322553150093,0 +Std,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.661,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.01887249133378814,0.016512447630630023,0.028110376686149914,0.007664241811293473,0.006403741772299821,0.02080514341541292,0.008452462635865162,0.007046440163211389,0.020389306485333932,0.008703175333917306,0.007216521544147636,0.02365548171948537,0.008591077829499763,0.019081231222147953,0.01617745777272049,0.02965096657806392,0.00648335647809008,0.005604158117767979,0.01759448536247567,0 +TNR,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.661,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.5102040816326531,1.0,0.0,0.23655913978494625,1.0,0.0,0.29310344827586204,1.0,0.0,0.29411764705882354,1.0,0.0,0.2936170212765957,0.51,1.0,0.0,0.13333333333333333,1.0,0.0,0 +TPR,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.661,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.9105691056910569,1.0,0.0,0.9854819976771196,1.0,0.0,0.9803439803439803,1.0,0.0,0.9806013579049466,1.0,0.0,0.9804878048780488,0.8951612903225806,1.0,0.0,0.9937382592360676,1.0,0.0,0 +Accuracy,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 04:03:36.539,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.7790697674418605,1.0,0.0,0.9140461215932913,1.0,0.0,0.889247311827957,1.0,0.0,0.9139130434782609,1.0,0.0,0.9028846153846154,0.7787356321839081,1.0,0.0,0.9278290993071594,1.0,0.0,0 +Aleatoric_Uncertainty,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 04:03:36.539,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.39592839083088177,0.345805679425671,0.5726768994703095,0.2021904318614913,0.17798363293063837,0.45960907415056135,0.21502472358467864,0.18395882725444804,0.46445672615847194,0.22078785589642255,0.19467884560860582,0.49796532874991134,0.2182110707762678,0.39722758461153446,0.3478601176522983,0.5709754228706647,0.18224239478627194,0.16333000932812722,0.4253800222361812,0 +F1,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 04:03:36.539,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.8527131782945736,1.0,0.0,0.9538028169014084,1.0,0.0,0.9390171699230314,1.0,0.0,0.9532798489853704,1.0,0.0,0.946953781512605,0.8504854368932039,1.0,0.0,0.962040692377771,1.0,0.0,0 +FNR,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 04:03:36.539,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.10569105691056911,0.0,1.0,0.01684088269454123,0.0,1.0,0.025798525798525797,0.0,1.0,0.020368574199806012,0.0,1.0,0.022764227642276424,0.11693548387096774,0.0,1.0,0.008140262993112084,0.0,1.0,0 +FPR,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 04:03:36.539,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.5102040816326531,0.0,1.0,0.7258064516129032,0.0,1.0,0.7068965517241379,0.0,1.0,0.6554621848739496,0.0,1.0,0.6808510638297872,0.48,0.0,1.0,0.8296296296296296,0.0,1.0,0 +IQR,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 04:03:36.539,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.15908351589457667,0.13563815722483819,0.2417592543615492,0.0752969261849312,0.0616189297021114,0.2207507424412589,0.08110827525610916,0.0655472027261666,0.20605009061788096,0.08312887296220384,0.0679651663311806,0.24410923325720804,0.08222543264169034,0.16457830906802673,0.1342343043150902,0.27137344267901103,0.06567878079621399,0.05554538270019985,0.19595374671857185,0 +Jitter,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 04:03:36.539,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.1598913170503697,0.1342638565964109,0.25026183549325454,0.06353065115935905,0.05185160319948576,0.1877273562936732,0.07066985464958188,0.054346581760067667,0.20173147289846627,0.07216941227878665,0.060395746573017474,0.19716055022586562,0.07149893699265836,0.15868408132617043,0.1312162287452149,0.25535665339685243,0.053981367576914366,0.04533973539133085,0.16507819095476403,0 +Label_Stability,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 04:03:36.539,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.7993023255813955,0.837910447761194,0.6631578947368421,0.92416142557652,0.9394667431192661,0.7614024390243903,0.9147634408602151,0.937049576783555,0.7358252427184465,0.9130869565217393,0.9284205518553759,0.7503030303030301,0.9138365384615386,0.8010632183908045,0.841180811808118,0.6598701298701299,0.9364953810623557,0.9475731176104543,0.79408,0 +Mean,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 04:03:36.539,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.27959745200299124,0.23440985530667052,0.43894318772159613,0.09741696798948628,0.07959864389316311,0.2868996339894108,0.11061309223206439,0.08615939047496757,0.3069549500293369,0.11399318338489951,0.09417425274783266,0.3243941540874982,0.11248189262906458,0.2900997099779303,0.24581031439858966,0.4459753749389861,0.07679424803471975,0.06447813339063628,0.2351302178990567,0 +Overall_Uncertainty,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 04:03:36.539,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.6177290090183984,0.5434985783687246,0.8794889486777746,0.3111113491891901,0.2735805366044171,0.7102195025297032,0.331049351633622,0.28209369702908565,0.7241204813224725,0.34084691024771374,0.3012956973325011,0.7607289786708292,0.33646627105968235,0.6202617329292858,0.5466346669149742,0.8793907574731609,0.2794450119773371,0.25004061643158343,0.6574679211135468,0 +PPV,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 04:03:36.539,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.8148148148148148,1.0,0.0,0.9261487964989059,1.0,0.0,0.9062857142857143,1.0,0.0,0.9283088235294118,1.0,0.0,0.9184921039225675,0.8202247191011236,1.0,0.0,0.9339622641509434,1.0,0.0,0 +Per_Sample_Accuracy,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 04:03:36.539,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.7522674418604652,0.9130597014925372,0.18526315789473685,0.8967767295597484,0.967858371559633,0.14088414634146343,0.8762311827956989,0.9662756952841596,0.15325242718446602,0.8917782608695651,0.9621170313986679,0.14505050505050507,0.8848269230769231,0.7546120689655172,0.9138007380073802,0.19435064935064936,0.9109901847575058,0.9724051026757934,0.12143999999999999,0 +Positive-Rate,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 04:03:36.539,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,1.0975609756097562,1.0,1.9230769230769231,1.0615563298490127,1.0,4.655172413793103,1.074938574938575,1.0,3.9047619047619047,1.055286129970902,1.0,3.7142857142857144,1.0639566395663957,1.0766129032258065,1.0,1.6551724137931034,1.0619912335629305,1.0,8.615384615384615,0 +Sample_Size,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 04:03:36.539,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,172.0,134.0,38.0,1908.0,1744.0,164.0,930.0,827.0,103.0,1150.0,1051.0,99.0,2080.0,348.0,271.0,77.0,1732.0,1607.0,125.0,0 +Selection-Rate,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 04:03:36.539,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.7848837209302325,0.8208955223880597,0.6578947368421053,0.9580712788259959,0.970756880733945,0.823170731707317,0.9408602150537635,0.9588875453446191,0.7961165048543689,0.9460869565217391,0.9609895337773549,0.7878787878787878,0.94375,0.7672413793103449,0.8081180811808119,0.6233766233766234,0.9792147806004619,0.985687616677038,0.896,0 +Statistical_Bias,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 04:03:36.539,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.2845342482087718,0.17736885006743314,0.6624332837598085,0.12869735666532595,0.07001678768213461,0.7527151146329215,0.14820267026425304,0.07440029968425345,0.740771218513376,0.13623127292486545,0.08025466773339789,0.7304879603615568,0.14158386885064936,0.28265475158042863,0.1746623813286797,0.6627317949339865,0.11323937278254127,0.0613212185977639,0.7806991629820391,0 +Std,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 04:03:36.539,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.20013356180486322,0.1809615358266966,0.2677401797278716,0.10619063365442924,0.09506844753352973,0.2244655885010679,0.11208641793994946,0.09733071059836869,0.23056185455633124,0.11547333300776907,0.10423950583672913,0.234733457823557,0.11395899117456128,0.2013623426624389,0.18221828729093412,0.2687394726063065,0.09639757875089995,0.08753395298283138,0.21034835162518925,0 +TNR,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 04:03:36.539,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.4897959183673469,1.0,0.0,0.27419354838709675,1.0,0.0,0.29310344827586204,1.0,0.0,0.3445378151260504,1.0,0.0,0.3191489361702128,0.52,1.0,0.0,0.17037037037037037,1.0,0.0,0 +TPR,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 04:03:36.539,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.8943089430894309,1.0,0.0,0.9831591173054588,1.0,0.0,0.9742014742014742,1.0,0.0,0.979631425800194,1.0,0.0,0.9772357723577236,0.8830645161290323,1.0,0.0,0.9918597370068879,1.0,0.0,0 +Accuracy,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 12:24:33.463,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.75,1.0,0.0,0.9030398322851153,1.0,0.0,0.8827956989247312,1.0,0.0,0.8965217391304348,1.0,0.0,0.8903846153846153,0.7442528735632183,1.0,0.0,0.9197459584295612,1.0,0.0,0 +Aleatoric_Uncertainty,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 12:24:33.463,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.0902220830630179,0.0777709581699652,0.12757545774217605,0.05008348843835426,0.04246982495090536,0.12099344621605407,0.0537261105967286,0.045174973756671045,0.11813421468560242,0.05314105336718383,0.044732598002045106,0.12599078010212525,0.05340264145539376,0.08700416833707765,0.07218328173309448,0.13013461362282647,0.04665129540757274,0.04049748400845197,0.11717663036296411,0 +F1,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 12:24:33.463,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.8313725490196079,1.0,0.0,0.94754749078537,1.0,0.0,0.9351576442593694,1.0,0.0,0.9433603046168492,1.0,0.0,0.9397144368059228,0.8271844660194175,1.0,0.0,0.9574533210896847,1.0,0.0,0 +FNR,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 12:24:33.463,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.13821138211382114,0.0,1.0,0.029616724738675958,0.0,1.0,0.0343980343980344,0.0,1.0,0.038797284190106696,0.0,1.0,0.03685636856368564,0.14112903225806453,0.0,1.0,0.020663744520976832,0.0,1.0,0 +FPR,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 12:24:33.463,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.5306122448979592,0.0,1.0,0.7204301075268817,0.0,1.0,0.6982758620689655,0.0,1.0,0.6638655462184874,0.0,1.0,0.6808510638297872,0.54,0.0,1.0,0.7851851851851852,0.0,1.0,0 +IQR,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 12:24:33.463,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.34062075328581615,0.2789005545988675,0.5257813493466622,0.13349297228433363,0.09549155619061678,0.48741967460581553,0.14269388878760147,0.10675316355847014,0.4134033879905081,0.15703134270539093,0.10947213926108885,0.5690778868320754,0.15062084648253313,0.35023159099034945,0.26444547604213864,0.5998788243789629,0.11051429966456544,0.08287429037336642,0.4272807370809687,0 +Jitter,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 12:24:33.463,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.25363415916793314,0.2160305402984102,0.36644501577656896,0.12502175447467961,0.10389352450003994,0.3217998098601097,0.13281309774678782,0.10903071998237104,0.311944585311888,0.13795687131308645,0.11383342512758028,0.34695916557577816,0.13565701101661398,0.2575469300525594,0.21568169030481296,0.37937948167805524,0.11116642682233019,0.09479907383748722,0.2987433570731236,0 +Label_Stability,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 12:24:33.463,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.6287790697674419,0.6868217054263567,0.45465116279069767,0.8285744234800839,0.8627045850261172,0.5107027027027027,0.8168172043010754,0.853020706455542,0.5441284403669724,0.8081999999999999,0.8484093113482056,0.45983193277310924,0.8120528846153847,0.624367816091954,0.6946332046332047,0.41988764044943816,0.8497632794457275,0.8757878217200252,0.5515107913669065,0 +Mean,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 12:24:33.463,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.2757055884327329,0.2224482133830747,0.4354777135817077,0.1070713278231359,0.08393719946367835,0.32253134492229985,0.11785572340173939,0.09016463193295457,0.3264280729051552,0.12357185385509192,0.09630887622248181,0.35977462645358804,0.12101608398892949,0.2865110924704483,0.23561680084289205,0.4346191995663705,0.08776420006770055,0.07049269477967696,0.2857031059944743,0 +Overall_Uncertainty,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 12:24:33.463,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.5609886482288307,0.485641189258622,0.7870310251394568,0.29782837866809003,0.2550663626549219,0.6960929926718127,0.3142107017181388,0.26519856058900737,0.6833755445348073,0.3239396881706136,0.27584775754143315,0.7406017089998991,0.3195897086509974,0.5692849608539868,0.488061902284981,0.8056531874761502,0.2694199928503968,0.2358562608769508,0.6540748492079469,0 +PPV,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 12:24:33.463,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.803030303030303,1.0,0.0,0.9257617728531856,1.0,0.0,0.9065743944636678,1.0,0.0,0.9261682242990654,1.0,0.0,0.9173980382034074,0.797752808988764,1.0,0.0,0.9365269461077844,1.0,0.0,0 +Per_Sample_Accuracy,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 12:24:33.463,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.7007267441860465,0.8434108527131783,0.27267441860465114,0.864769392033543,0.9313464886825303,0.24470270270270267,0.8446236559139785,0.9264981729598051,0.22793577981651378,0.8565260869565217,0.9242046556741028,0.27016806722689074,0.851204326923077,0.7048275862068965,0.8473166023166022,0.29016853932584274,0.880614896073903,0.9378876333961079,0.22424460431654675,0 +Positive-Rate,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 12:24:33.463,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,1.0731707317073171,1.0,1.5294117647058822,1.0481997677119628,1.0,2.627450980392157,1.065110565110565,1.0,2.892857142857143,1.037827352085354,1.0,1.975,1.0498644986449865,1.0766129032258065,1.0,1.542857142857143,1.0457107075767063,1.0,3.212121212121212,0 +Sample_Size,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 12:24:33.463,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,172.0,129.0,43.0,1908.0,1723.0,185.0,930.0,821.0,109.0,1150.0,1031.0,119.0,2080.0,348.0,259.0,89.0,1732.0,1593.0,139.0,0 +Selection-Rate,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 12:24:33.463,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.7674418604651163,0.8217054263565892,0.6046511627906976,0.9460167714884696,0.9698200812536274,0.7243243243243244,0.932258064516129,0.9573690621193667,0.7431192660550459,0.9304347826086956,0.9612027158098934,0.6638655462184874,0.93125,0.7672413793103449,0.8223938223938224,0.6067415730337079,0.964203233256351,0.9817953546767106,0.762589928057554,0 +Statistical_Bias,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 12:24:33.463,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.30023287755938216,0.15850182916013472,0.7254260227571246,0.13624653180061283,0.07006346390199378,0.7526434290401838,0.15643967626815544,0.07503362310404371,0.7695990308345385,0.14444307711860732,0.07717117332334895,0.7272778066388711,0.14980694116143414,0.29583679367405696,0.15426341447734093,0.7078312342577586,0.12046607010231593,0.06353537973330908,0.7729163561298551,0 +Std,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 12:24:33.463,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.2897117585629207,0.25628674703868176,0.3899867931356377,0.1672310859552482,0.14799797156173605,0.3463589567661744,0.17495256754633828,0.1526346346354529,0.34305369525126406,0.1793056057889924,0.1578549566761924,0.3651511455814026,0.1773592954208826,0.29510153645964743,0.2605411335951489,0.39567619198667137,0.15370207839923705,0.13846914109712344,0.3282781152500787,0 +TNR,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 12:24:33.463,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.46938775510204084,1.0,0.0,0.27956989247311825,1.0,0.0,0.3017241379310345,1.0,0.0,0.33613445378151263,1.0,0.0,0.3191489361702128,0.46,1.0,0.0,0.21481481481481482,1.0,0.0,0 +TPR,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 12:24:33.463,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.8617886178861789,1.0,0.0,0.9703832752613241,1.0,0.0,0.9656019656019657,1.0,0.0,0.9612027158098934,1.0,0.0,0.9631436314363143,0.8588709677419355,1.0,0.0,0.9793362554790231,1.0,0.0,0 +Accuracy,101,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 20, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.651,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.7558139534883721,1.0,0.0,0.909853249475891,1.0,0.0,0.8849462365591397,1.0,0.0,0.9069565217391304,1.0,0.0,0.8971153846153846,0.7528735632183908,1.0,0.0,0.9260969976905312,1.0,0.0,0 +Aleatoric_Uncertainty,101,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 20, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.651,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.6022044189316094,0.521108979184154,0.8532141133880186,0.3484698387738183,0.3113603451578628,0.7230168208511367,0.3593688390726835,0.3118207994808255,0.7250888071483762,0.3776057322600752,0.3371401807433082,0.7720503138674396,0.36945173674840487,0.6077561988772564,0.5270982962140403,0.8534814372233336,0.3215707016324462,0.2931209307231367,0.6780818933397313,0 +F1,101,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 20, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.651,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.8421052631578947,1.0,0.0,0.9515492957746479,1.0,0.0,0.9368731563421829,1.0,0.0,0.9495520980669495,1.0,0.0,0.9439203354297694,0.8371212121212122,1.0,0.0,0.9610705596107056,1.0,0.0,0 +FNR,101,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 20, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.651,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.08943089430894309,0.0,1.0,0.01916376306620209,0.0,1.0,0.02457002457002457,0.0,1.0,0.023278370514064017,0.0,1.0,0.023848238482384824,0.10887096774193548,0.0,1.0,0.010644959298685034,0.0,1.0,0 +FPR,101,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 20, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.651,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.6326530612244898,0.0,1.0,0.7473118279569892,0.0,1.0,0.75,0.0,1.0,0.6974789915966386,0.0,1.0,0.723404255319149,0.59,0.0,1.0,0.8222222222222222,0.0,1.0,0 +IQR,101,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 20, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.651,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.10810431150236569,0.09817118814664716,0.13884969331768487,0.06186312210984109,0.05491215880115068,0.1320193564347627,0.06374646950879972,0.055144941252334996,0.1299058877804863,0.06725614080069561,0.06012030248052735,0.13681389190289645,0.065686912771146,0.1072239288535614,0.0967748695253259,0.13905710959772075,0.057341138177219586,0.051580265786924165,0.12953207031810915,0 +Jitter,101,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 20, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.651,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.10813719761598818,0.07441824507150736,0.21250538406317626,0.0343496834276194,0.0218388312530406,0.1606220053757105,0.040426487275076285,0.025153043467641915,0.15790353637345347,0.040471444177406765,0.025777208188593134,0.18370591274127906,0.0404513432547338,0.10479538497082974,0.06564808776707973,0.22405808110319125,0.02752309468822112,0.018944379002243484,0.1350251256281407,0 +Label_Stability,101,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 20, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.651,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.8451162790697675,0.8938461538461538,0.6942857142857143,0.9504297693920336,0.9690725806451612,0.7622674418604652,0.9423333333333334,0.964872417982989,0.7689719626168224,0.9412260869565218,0.9630105465004795,0.7288785046728972,0.941721153846154,0.8458908045977012,0.9035877862595421,0.6701162790697673,0.9609757505773673,0.9736720698254364,0.801875,0 +Mean,101,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 20, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.651,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.2639932810395895,0.2156748853161827,0.4135502201834677,0.11544993393956768,0.09579796323675911,0.31379773126558924,0.12353172826168819,0.09803073880801871,0.31967485275112717,0.1311311400105518,0.10897766177480168,0.34707579234594743,0.12773332610360796,0.2764247232556483,0.2277661833560042,0.42466353085688957,0.09785768741486083,0.0839577676002771,0.2720410575913631,0 +Overall_Uncertainty,101,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 20, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.651,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.6342606919828047,0.5519313100613914,0.8890897312633693,0.3691633946573703,0.3303803236436642,0.7606018323305902,0.3805203914808457,0.3308344787712595,0.7626840004527105,0.39962837560879855,0.3576361803687779,0.808954166593299,0.39108490193620427,0.6390378279056512,0.5570925808174096,0.8886849760116896,0.34126526092155784,0.3113048977426562,0.7167060620071696,0 +PPV,101,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 20, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.651,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.7832167832167832,1.0,0.0,0.9239606126914661,1.0,0.0,0.9012485811577753,1.0,0.0,0.9238532110091743,1.0,0.0,0.9137493658041603,0.7892857142857143,1.0,0.0,0.9343583678296866,1.0,0.0,0 +Per_Sample_Accuracy,101,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 20, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.651,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.7526744186046512,0.9460000000000001,0.15428571428571428,0.9065041928721174,0.9844902073732718,0.11938953488372094,0.8826612903225807,0.9822904009720534,0.11635514018691591,0.9027782608695654,0.9814285714285715,0.13612149532710283,0.8937836538461538,0.7573132183908047,0.9512977099236641,0.16633720930232557,0.9212038106235566,0.9867923940149624,0.09929687499999999,0 +Positive-Rate,101,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 20, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.651,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,1.1626016260162602,1.0,2.8181818181818183,1.0615563298490127,1.0,4.212121212121212,1.0823095823095823,1.0,4.35,1.0572259941804074,1.0,3.4583333333333335,1.0682926829268293,1.1290322580645162,1.0,2.185185185185185,1.0588603631809643,1.0,6.529411764705882,0 +Sample_Size,101,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 20, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.651,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,172.0,130.0,42.0,1908.0,1736.0,172.0,930.0,823.0,107.0,1150.0,1043.0,107.0,2080.0,348.0,262.0,86.0,1732.0,1604.0,128.0,0 +Selection-Rate,101,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 20, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.651,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.8313953488372093,0.8615384615384616,0.7380952380952381,0.9580712788259959,0.972926267281106,0.8081395348837209,0.9473118279569892,0.9647630619684082,0.8130841121495327,0.9478260869565217,0.965484180249281,0.7757009345794392,0.9475961538461538,0.8045977011494253,0.8435114503816794,0.686046511627907,0.9763279445727483,0.9850374064837906,0.8671875,0 +Statistical_Bias,101,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 20, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.651,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.293494907787834,0.17606795947696244,0.656959271607198,0.14457423380311982,0.08718443511365298,0.7238108066223895,0.16163778851367724,0.08867080060776031,0.7228698543694679,0.15304836427664367,0.09709007208928086,0.6985109694300957,0.15688882799800963,0.2929014432168847,0.17455731305732203,0.6534382118425291,0.12956065819652662,0.0801165823368381,0.7491567338132484,0 +Std,101,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 20, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.651,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.07628767892055953,0.06843666044048978,0.10058845040648969,0.044731479410986215,0.0400094305644904,0.09239122823375792,0.046051962446283845,0.04008535734770087,0.09194463530734737,0.048383320361264304,0.043492702032656934,0.09605542238684825,0.0473409343704317,0.07589662096423555,0.06797453264662726,0.10003135514113522,0.0416034176645173,0.0377455173091039,0.08994773149329141,0 +TNR,101,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 20, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.651,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.3673469387755102,1.0,0.0,0.25268817204301075,1.0,0.0,0.25,1.0,0.0,0.3025210084033613,1.0,0.0,0.2765957446808511,0.41,1.0,0.0,0.17777777777777778,1.0,0.0,0 +TPR,101,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 20, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:12:17.651,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.6,0.9105691056910569,1.0,0.0,0.980836236933798,1.0,0.0,0.9754299754299754,1.0,0.0,0.976721629485936,1.0,0.0,0.9761517615176152,0.8911290322580645,1.0,0.0,0.989355040701315,1.0,0.0,0 +Accuracy,101,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 50, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 500, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.671,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.7790697674418605,1.0,0.0,0.9093291404612159,1.0,0.0,0.8870967741935484,1.0,0.0,0.9078260869565218,1.0,0.0,0.8985576923076923,0.7758620689655172,1.0,0.0,0.9232101616628176,1.0,0.0,0 +Aleatoric_Uncertainty,101,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 50, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 500, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.671,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.5977444702201369,0.52641213059897,0.8492848257263567,0.29759453661457524,0.25859598606787126,0.6887071678199601,0.31924208301884716,0.27054726006554647,0.70184426336621,0.32498025002690895,0.28352660131603713,0.7332595826132319,0.32241462727811215,0.5992651412379819,0.5297867342600268,0.8397673192385964,0.2667887734339812,0.2352475566465362,0.6459948309010837,0 +F1,101,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 50, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 500, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.671,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.8503937007874016,1.0,0.0,0.9512263884973217,1.0,0.0,0.9377593360995851,1.0,0.0,0.9498580889309366,1.0,0.0,0.9444882925545909,0.8470588235294118,1.0,0.0,0.9595867517471893,1.0,0.0,0 +FNR,101,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 50, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 500, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.671,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.12195121951219512,0.0,1.0,0.02032520325203252,0.0,1.0,0.028255528255528257,0.0,1.0,0.026188166828322017,0.0,1.0,0.02710027100271003,0.12903225806451613,0.0,1.0,0.011271133375078271,0.0,1.0,0 +FPR,101,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 50, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 500, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.671,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.46938775510204084,0.0,1.0,0.7419354838709677,0.0,1.0,0.7068965517241379,0.0,1.0,0.6638655462184874,0.0,1.0,0.6851063829787234,0.46,0.0,1.0,0.8518518518518519,0.0,1.0,0 +IQR,101,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 50, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 500, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.671,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.10380813953488373,0.09394402985074626,0.13859210526315788,0.056979035639413,0.04992334293948126,0.1277398843930636,0.05988978494623656,0.05135878787878788,0.12691904761904763,0.06162913043478262,0.05443917624521073,0.1324433962264151,0.060851442307692315,0.10677586206896553,0.09695555555555556,0.14076923076923079,0.05162413394919169,0.04567073170731707,0.12319924812030075,0 +Jitter,101,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 50, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 500, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.671,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.1159217599626041,0.08694292357309338,0.21811028828352702,0.031064362693972943,0.01954261219642836,0.14661486623870681,0.03989285135353373,0.02438769605603032,0.16171907154821602,0.0366165173694544,0.024364879955332142,0.15728358775007056,0.03808141669887758,0.10816034193958138,0.07854624976735551,0.21067066099729817,0.024000893613564184,0.015227827693816219,0.12947557335550425,0 +Label_Stability,101,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 50, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 500, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.671,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.8321511627906977,0.874179104477612,0.6839473684210527,0.9555293501048219,0.9727723342939483,0.7826011560693641,0.9416666666666667,0.9650545454545454,0.7579047619047617,0.9482869565217393,0.9662164750957855,0.7716981132075471,0.9453269230769231,0.8437931034482758,0.8851481481481481,0.7006410256410256,0.9657274826789839,0.9793058161350844,0.8024812030075189,0 +Mean,101,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 50, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 500, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.671,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.2773600581395349,0.23318694029850748,0.4331284210526316,0.10159428197064989,0.08175657060518729,0.30054473988439306,0.11440239784946236,0.08902919999999998,0.31376323809523804,0.1175248608695652,0.0954459865900383,0.33498094339622636,0.1161287596153846,0.2894466379310345,0.24440133333333333,0.4453726923076924,0.08130507505773671,0.06698332707942463,0.2534890977443609,0 +Overall_Uncertainty,101,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 50, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 500, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.671,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.6271478237767765,0.554350830750133,0.8838530097128348,0.31693254608433247,0.27626780032206755,0.7247552853764114,0.33925436466949827,0.2886223410419027,0.7370774074577492,0.34527840389206826,0.3021975225284821,0.7695844429824833,0.34258496327813076,0.6299433518283812,0.5589486724792085,0.8756941649601331,0.2848478274724222,0.2518395893120192,0.6816912321226806,0 +PPV,101,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 50, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 500, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.671,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.8244274809160306,1.0,0.0,0.9243835616438356,1.0,0.0,0.9060710194730813,1.0,0.0,0.9270544783010157,1.0,0.0,0.9176891615541922,0.8244274809160306,1.0,0.0,0.9321133412042503,1.0,0.0,0 +Per_Sample_Accuracy,101,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 50, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 500, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.671,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.7649709302325582,0.9370149253731344,0.15828947368421054,0.9068684486373165,0.986328530259366,0.10997109826589595,0.8853172043010753,0.9824909090909092,0.1218095238095238,0.9030739130434783,0.9830316091954021,0.11556603773584906,0.8951346153846155,0.7650574712643678,0.9422407407407407,0.15173076923076925,0.921270207852194,0.9896404002501563,0.09928571428571428,0 +Positive-Rate,101,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 50, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 500, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.671,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,1.065040650406504,1.0,1.5333333333333334,1.0598141695702672,1.0,3.942857142857143,1.0724815724815724,1.0,3.5652173913043477,1.0504364694471386,1.0,2.925925925925926,1.0601626016260162,1.0564516129032258,1.0,1.4375,1.060738885410144,1.0,6.388888888888889,0 +Sample_Size,101,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 50, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 500, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.671,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,172.0,134.0,38.0,1908.0,1735.0,173.0,930.0,825.0,105.0,1150.0,1044.0,106.0,2080.0,348.0,270.0,78.0,1732.0,1599.0,133.0,0 +Selection-Rate,101,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 50, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 500, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.671,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.7616279069767442,0.8059701492537313,0.6052631578947368,0.9564989517819706,0.9723342939481268,0.7976878612716763,0.9387096774193548,0.9587878787878787,0.780952380952381,0.9417391304347826,0.9616858237547893,0.7452830188679245,0.9403846153846154,0.7528735632183908,0.8,0.5897435897435898,0.9780600461893765,0.9874921826141339,0.8646616541353384,0 +Statistical_Bias,101,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 50, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 500, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.671,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.2877847093023256,0.18303380597014923,0.6571694736842105,0.13291773060796644,0.07233455331412102,0.7405004624277457,0.15161317204301075,0.07806539393939393,0.7294885714285714,0.14096152173913043,0.08201439655172413,0.7215350943396226,0.14572403846153845,0.2892299712643678,0.18118155555555554,0.6632437179487178,0.1168902829099307,0.06323199499687303,0.7620000751879699,0 +Std,101,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 50, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 500, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.671,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.07305468283664128,0.06585784196897422,0.09843301642262514,0.03967207422680322,0.03487349564038114,0.08779654733340607,0.041894501288248155,0.03603838511536694,0.08790684264660058,0.04286768423875831,0.03792988317981428,0.09150036636647116,0.04243255916953982,0.07455480562429982,0.06745286046536986,0.09913846194367282,0.03597843574791368,0.031968851428551576,0.08418388933182348,0 +TNR,101,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 50, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 500, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.671,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.5306122448979592,1.0,0.0,0.25806451612903225,1.0,0.0,0.29310344827586204,1.0,0.0,0.33613445378151263,1.0,0.0,0.3148936170212766,0.54,1.0,0.0,0.14814814814814814,1.0,0.0,0 +TPR,101,RandomForestClassifier,"{'bootstrap': False, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 50, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 500, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Law_School,200,OK,2023-08-07 01:00:06.671,adaeac61-1e2d-4f1c-ad7e-6a164a02d732,Exp_iter_1,100,100,"[0.0, 0.6]",0.0,0.8780487804878049,1.0,0.0,0.9796747967479674,1.0,0.0,0.9717444717444718,1.0,0.0,0.973811833171678,1.0,0.0,0.9728997289972899,0.8709677419354839,1.0,0.0,0.9887288666249218,1.0,0.0,0 diff --git a/virny/custom_classes/metrics_interactive_visualizer.py b/virny/custom_classes/metrics_interactive_visualizer.py index 9ca3cc71..21e86f3d 100644 --- a/virny/custom_classes/metrics_interactive_visualizer.py +++ b/virny/custom_classes/metrics_interactive_visualizer.py @@ -86,7 +86,7 @@ def start_web_app(self): scale=2 ) acc_min_val = gr.Number(value=0.7, label="Min value", scale=1) - acc_max_val = gr.Number(value=0.85, label="Max value", scale=1) + acc_max_val = gr.Number(value=1.0, label="Max value", scale=1) with gr.Row(): fairness_metric = gr.Dropdown( ['Equalized_Odds_TPR', 'Equalized_Odds_FPR', 'Disparate_Impact', 'Statistical_Parity_Difference', 'Accuracy_Parity'], @@ -102,7 +102,7 @@ def start_web_app(self): scale=2 ) subgroup_stab_min_val = gr.Number(value=0.9, label="Min value", scale=1) - subgroup_stab_max_val = gr.Number(value=0.94, label="Max value", scale=1) + subgroup_stab_max_val = gr.Number(value=1.0, label="Max value", scale=1) with gr.Row(): group_stability_metrics = gr.Dropdown( ['Label_Stability_Ratio', 'IQR_Parity', 'Std_Parity', 'Std_Ratio', 'Jitter_Parity'], From cb207bb64bdc75ef6dc5dfa779261b80dbb098e8 Mon Sep 17 00:00:00 2001 From: denysgerasymuk799 Date: Thu, 5 Oct 2023 01:41:06 +0300 Subject: [PATCH 09/36] Added an overall subgrop to heatmaps --- ...Multiple_Models_Interface_Vis_Income.ipynb | 91 ++++++++++--------- .../metrics_interactive_visualizer.py | 51 +++++++---- 2 files changed, 81 insertions(+), 61 deletions(-) diff --git a/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb b/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb index 7b653984..086dfd4a 100644 --- a/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb +++ b/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb @@ -2,15 +2,24 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 13, "id": "248cbed8", "metadata": { "ExecuteTime": { - "end_time": "2023-10-04T21:08:30.999391Z", - "start_time": "2023-10-04T21:08:30.521174Z" + "end_time": "2023-10-04T21:22:16.448256Z", + "start_time": "2023-10-04T21:22:16.399916Z" } }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The autoreload extension is already loaded. To reload it, use:\n", + " %reload_ext autoreload\n" + ] + } + ], "source": [ "%matplotlib inline\n", "%load_ext autoreload\n", @@ -19,12 +28,12 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 14, "id": "7ec6cd08", "metadata": { "ExecuteTime": { - "end_time": "2023-10-04T21:08:31.008054Z", - "start_time": "2023-10-04T21:08:31.000071Z" + "end_time": "2023-10-04T21:22:16.489117Z", + "start_time": "2023-10-04T21:22:16.447387Z" } }, "outputs": [], @@ -37,12 +46,12 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 15, "id": "b8cb69f2", "metadata": { "ExecuteTime": { - "end_time": "2023-10-04T21:08:31.018864Z", - "start_time": "2023-10-04T21:08:31.008657Z" + "end_time": "2023-10-04T21:22:16.493213Z", + "start_time": "2023-10-04T21:22:16.472246Z" } }, "outputs": [ @@ -72,12 +81,12 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 16, "id": "7a9241de", "metadata": { "ExecuteTime": { - "end_time": "2023-10-04T21:08:33.567112Z", - "start_time": "2023-10-04T21:08:31.017655Z" + "end_time": "2023-10-04T21:22:16.529742Z", + "start_time": "2023-10-04T21:22:16.494483Z" } }, "outputs": [], @@ -90,7 +99,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 17, "outputs": [], "source": [ "sensitive_attributes_dct = {'SEX': '2', 'RAC1P': ['2', '3', '4', '5', '6', '7', '8', '9'], 'SEX&RAC1P': None}" @@ -98,15 +107,15 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-04T21:08:33.593962Z", - "start_time": "2023-10-04T21:08:33.567969Z" + "end_time": "2023-10-04T21:22:16.537318Z", + "start_time": "2023-10-04T21:22:16.516511Z" } }, "id": "d3c53c7b72ecbcd0" }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 18, "outputs": [], "source": [ "ROOT_DIR = os.path.join('docs', 'examples')\n", @@ -116,15 +125,15 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-04T21:08:33.619601Z", - "start_time": "2023-10-04T21:08:33.593364Z" + "end_time": "2023-10-04T21:22:16.563352Z", + "start_time": "2023-10-04T21:22:16.537733Z" } }, "id": "2aab7c79ecdee914" }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 19, "outputs": [], "source": [ "subgroup_metrics_df['Model_Name'] = (subgroup_metrics_df['Model_Name'] + '__alpha=' +\n", @@ -135,15 +144,15 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-04T21:08:33.644681Z", - "start_time": "2023-10-04T21:08:33.620136Z" + "end_time": "2023-10-04T21:22:16.584758Z", + "start_time": "2023-10-04T21:22:16.563460Z" } }, "id": "2d922003e752a4b4" }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 20, "outputs": [], "source": [ "models_metrics_dct = dict()\n", @@ -153,21 +162,21 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-04T21:08:33.669581Z", - "start_time": "2023-10-04T21:08:33.643533Z" + "end_time": "2023-10-04T21:22:16.607231Z", + "start_time": "2023-10-04T21:22:16.584939Z" } }, "id": "833484748ed512e8" }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 21, "outputs": [ { "data": { "text/plain": "dict_keys(['LGBMClassifier__alpha=0.7', 'LGBMClassifier__alpha=0.0', 'LGBMClassifier__alpha=0.4', 'LogisticRegression__alpha=0.0', 'LogisticRegression__alpha=0.7', 'LogisticRegression__alpha=0.4', 'MLPClassifier__alpha=0.0', 'MLPClassifier__alpha=0.7', 'MLPClassifier__alpha=0.4', 'RandomForestClassifier__alpha=0.4', 'RandomForestClassifier__alpha=0.7', 'RandomForestClassifier__alpha=0.0'])" }, - "execution_count": 9, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" } @@ -178,8 +187,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-04T21:08:33.691780Z", - "start_time": "2023-10-04T21:08:33.667179Z" + "end_time": "2023-10-04T21:22:16.630707Z", + "start_time": "2023-10-04T21:22:16.608538Z" } }, "id": "15ed7d1ba1f22317" @@ -194,12 +203,12 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 25, "id": "435b9d98", "metadata": { "ExecuteTime": { - "end_time": "2023-10-04T21:08:33.716112Z", - "start_time": "2023-10-04T21:08:33.690511Z" + "end_time": "2023-10-04T22:04:26.837638Z", + "start_time": "2023-10-04T22:04:26.735350Z" } }, "outputs": [], @@ -210,7 +219,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 26, "outputs": [ { "name": "stdout", @@ -229,15 +238,15 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-04T21:11:38.266786Z", - "start_time": "2023-10-04T21:08:33.716571Z" + "end_time": "2023-10-04T22:40:36.211694Z", + "start_time": "2023-10-04T22:04:27.009071Z" } }, "id": "678a9dc8d51243f4" }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 24, "outputs": [ { "name": "stdout", @@ -253,20 +262,20 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-04T21:11:38.361088Z", - "start_time": "2023-10-04T21:11:38.269315Z" + "end_time": "2023-10-04T22:04:25.890691Z", + "start_time": "2023-10-04T22:04:25.777458Z" } }, "id": "277b6d1de837dab7" }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 24, "id": "2326c129", "metadata": { "ExecuteTime": { - "end_time": "2023-10-04T21:11:38.363712Z", - "start_time": "2023-10-04T21:11:38.360139Z" + "end_time": "2023-10-04T22:04:25.893162Z", + "start_time": "2023-10-04T22:04:25.889647Z" } }, "outputs": [], diff --git a/virny/custom_classes/metrics_interactive_visualizer.py b/virny/custom_classes/metrics_interactive_visualizer.py index 21e86f3d..24edc520 100644 --- a/virny/custom_classes/metrics_interactive_visualizer.py +++ b/virny/custom_classes/metrics_interactive_visualizer.py @@ -109,8 +109,8 @@ def start_web_app(self): value='Label_Stability_Ratio', multiselect=False, label="Constraint 4 (C4)", scale=2 ) - group_stab_min_val = gr.Number(value=1.0, label="Min value", scale=1) - group_stab_max_val = gr.Number(value=1.03, label="Max value", scale=1) + group_stab_min_val = gr.Number(value=0.98, label="Min value", scale=1) + group_stab_max_val = gr.Number(value=1.02, label="Max value", scale=1) btn_view1 = gr.Button("Submit") with gr.Column(scale=3): bar_plot_for_model_selection = gr.Plot(label="Plot") @@ -241,6 +241,29 @@ def start_web_app(self): def stop_web_app(self): self.demo.close() + def __filter_subgroup_metrics_df(self, results: dict, subgroup_metric: str, + selected_metric: str, selected_subgroup: str, defined_model_names: list): + results[subgroup_metric] = dict() + + # Get distinct sorted model names + sorted_model_names_arr = self.sorted_model_metrics_df[ + (self.sorted_model_metrics_df.Metric == selected_metric) & + (self.sorted_model_metrics_df.Subgroup == selected_subgroup) + ]['Model_Name'].values + sorted_model_names_arr = [model for model in sorted_model_names_arr if model in defined_model_names] + + # Add values to a results dict + for idx, model_name in enumerate(sorted_model_names_arr): + metric_value = self.sorted_model_metrics_df[ + (self.sorted_model_metrics_df.Metric == selected_metric) & + (self.sorted_model_metrics_df.Subgroup == selected_subgroup) & + (self.sorted_model_metrics_df.Model_Name == model_name) + ]['Value'].values[0] + metric_value = round(metric_value, 3) + results[subgroup_metric][model_name] = metric_value + + return results + def _create_bar_plot_for_model_selection(self, group_name, accuracy_metric, acc_min_val, acc_max_val, fairness_metric, fairness_min_val, fairness_max_val, subgroup_stability_metric, subgroup_stab_min_val, subgroup_stab_max_val, @@ -301,28 +324,16 @@ def _create_subgroup_model_rank_heatmap(self, model_names: list, subgroup_accura results = {} num_models = len(model_names) for metric in metrics_lst: + # Add an overall metric + subgroup_metric = metric + '_overall' + results = self.__filter_subgroup_metrics_df(results, subgroup_metric, metric, + selected_subgroup='overall', defined_model_names=model_names) + # Add a subgroup metric for group in groups_lst: for prefix in ['priv', 'dis']: subgroup = group + '_' + prefix subgroup_metric = metric + '_' + subgroup - results[subgroup_metric] = dict() - - # Get distinct sorted model names - sorted_model_names_arr = self.sorted_model_metrics_df[ - (self.sorted_model_metrics_df.Metric == metric) & - (self.sorted_model_metrics_df.Subgroup == subgroup) - ]['Model_Name'].values - sorted_model_names_arr = [model for model in sorted_model_names_arr if model in model_names] - - # Add values to a results dict - for idx, model_name in enumerate(sorted_model_names_arr): - metric_value = self.sorted_model_metrics_df[ - (self.sorted_model_metrics_df.Metric == metric) & - (self.sorted_model_metrics_df.Subgroup == subgroup) & - (self.sorted_model_metrics_df.Model_Name == model_name) - ]['Value'].values[0] - metric_value = round(metric_value, 3) - results[subgroup_metric][model_name] = metric_value + results = self.__filter_subgroup_metrics_df(results, subgroup_metric, metric, subgroup, model_names) model_metrics_matrix = pd.DataFrame(results).T sorted_matrix_by_rank = create_subgroup_sorted_matrix_by_rank(model_metrics_matrix) From 498b0efa82636a53035ff1176aa13d2dd787d577 Mon Sep 17 00:00:00 2001 From: denysgerasymuk799 Date: Thu, 5 Oct 2023 16:20:49 +0300 Subject: [PATCH 10/36] Added a gradio app for Ricci --- ...iple_Models_Interface_Vis_Law_School.ipynb | 91 +++--- .../Multiple_Models_Interface_Vis_Ricci.ipynb | 297 ++++++++++++++++++ docs/examples/ricci_group_metrics.csv | 133 ++++++++ docs/examples/ricci_subgroup_metrics.csv | 229 ++++++++++++++ 4 files changed, 709 insertions(+), 41 deletions(-) create mode 100644 docs/examples/Multiple_Models_Interface_Vis_Ricci.ipynb create mode 100644 docs/examples/ricci_group_metrics.csv create mode 100644 docs/examples/ricci_subgroup_metrics.csv diff --git a/docs/examples/Multiple_Models_Interface_Vis_Law_School.ipynb b/docs/examples/Multiple_Models_Interface_Vis_Law_School.ipynb index c88e03d5..51f3eda9 100644 --- a/docs/examples/Multiple_Models_Interface_Vis_Law_School.ipynb +++ b/docs/examples/Multiple_Models_Interface_Vis_Law_School.ipynb @@ -2,15 +2,24 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 13, "id": "248cbed8", "metadata": { "ExecuteTime": { - "end_time": "2023-10-04T21:15:46.248933Z", - "start_time": "2023-10-04T21:15:45.908524Z" + "end_time": "2023-10-04T22:41:38.880532Z", + "start_time": "2023-10-04T22:41:38.744525Z" } }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The autoreload extension is already loaded. To reload it, use:\n", + " %reload_ext autoreload\n" + ] + } + ], "source": [ "%matplotlib inline\n", "%load_ext autoreload\n", @@ -19,12 +28,12 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 14, "id": "7ec6cd08", "metadata": { "ExecuteTime": { - "end_time": "2023-10-04T21:15:46.257749Z", - "start_time": "2023-10-04T21:15:46.249557Z" + "end_time": "2023-10-04T22:41:38.897390Z", + "start_time": "2023-10-04T22:41:38.879544Z" } }, "outputs": [], @@ -37,12 +46,12 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 15, "id": "b8cb69f2", "metadata": { "ExecuteTime": { - "end_time": "2023-10-04T21:15:46.268273Z", - "start_time": "2023-10-04T21:15:46.257867Z" + "end_time": "2023-10-04T22:41:38.905091Z", + "start_time": "2023-10-04T22:41:38.881727Z" } }, "outputs": [ @@ -72,12 +81,12 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 16, "id": "7a9241de", "metadata": { "ExecuteTime": { - "end_time": "2023-10-04T21:15:47.510506Z", - "start_time": "2023-10-04T21:15:46.267180Z" + "end_time": "2023-10-04T22:41:38.938535Z", + "start_time": "2023-10-04T22:41:38.904769Z" } }, "outputs": [], @@ -90,7 +99,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 17, "outputs": [], "source": [ "sensitive_attributes_dct = {'male': '0.0', 'race': 'Non-White', 'male&race': None}" @@ -98,15 +107,15 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-04T21:15:47.534494Z", - "start_time": "2023-10-04T21:15:47.511483Z" + "end_time": "2023-10-04T22:41:38.946897Z", + "start_time": "2023-10-04T22:41:38.927198Z" } }, "id": "d3c53c7b72ecbcd0" }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 18, "outputs": [], "source": [ "ROOT_DIR = os.path.join('docs', 'examples')\n", @@ -116,15 +125,15 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-04T21:15:47.559988Z", - "start_time": "2023-10-04T21:15:47.534609Z" + "end_time": "2023-10-04T22:41:38.973205Z", + "start_time": "2023-10-04T22:41:38.947863Z" } }, "id": "2aab7c79ecdee914" }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 19, "outputs": [], "source": [ "subgroup_metrics_df['Model_Name'] = (subgroup_metrics_df['Model_Name'] + '__alpha=' +\n", @@ -135,15 +144,15 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-04T21:15:47.581842Z", - "start_time": "2023-10-04T21:15:47.560554Z" + "end_time": "2023-10-04T22:41:38.994980Z", + "start_time": "2023-10-04T22:41:38.973852Z" } }, "id": "2d922003e752a4b4" }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 20, "outputs": [], "source": [ "models_metrics_dct = dict()\n", @@ -153,21 +162,21 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-04T21:15:47.603973Z", - "start_time": "2023-10-04T21:15:47.582304Z" + "end_time": "2023-10-04T22:41:39.019414Z", + "start_time": "2023-10-04T22:41:38.994888Z" } }, "id": "833484748ed512e8" }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 21, "outputs": [ { "data": { "text/plain": "dict_keys(['LGBMClassifier__alpha=0.6', 'LGBMClassifier__alpha=0.0', 'LogisticRegression__alpha=0.6', 'LogisticRegression__alpha=0.0', 'MLPClassifier__alpha=0.0', 'MLPClassifier__alpha=0.6', 'RandomForestClassifier__alpha=0.6', 'RandomForestClassifier__alpha=0.0'])" }, - "execution_count": 9, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" } @@ -178,8 +187,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-04T21:15:47.625522Z", - "start_time": "2023-10-04T21:15:47.604575Z" + "end_time": "2023-10-04T22:41:39.040053Z", + "start_time": "2023-10-04T22:41:39.018488Z" } }, "id": "15ed7d1ba1f22317" @@ -194,12 +203,12 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 22, "id": "435b9d98", "metadata": { "ExecuteTime": { - "end_time": "2023-10-04T21:15:47.653413Z", - "start_time": "2023-10-04T21:15:47.624966Z" + "end_time": "2023-10-04T22:41:39.066833Z", + "start_time": "2023-10-04T22:41:39.039759Z" } }, "outputs": [], @@ -210,7 +219,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 23, "outputs": [ { "name": "stdout", @@ -229,15 +238,15 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-04T21:17:37.487583Z", - "start_time": "2023-10-04T21:15:47.653522Z" + "end_time": "2023-10-04T23:04:24.847056Z", + "start_time": "2023-10-04T22:41:39.066921Z" } }, "id": "678a9dc8d51243f4" }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 24, "outputs": [ { "name": "stdout", @@ -253,20 +262,20 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-04T21:17:37.530553Z", - "start_time": "2023-10-04T21:17:37.492738Z" + "end_time": "2023-10-04T23:04:24.902597Z", + "start_time": "2023-10-04T23:04:24.849984Z" } }, "id": "277b6d1de837dab7" }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 24, "id": "2326c129", "metadata": { "ExecuteTime": { - "end_time": "2023-10-04T21:17:37.533378Z", - "start_time": "2023-10-04T21:17:37.530182Z" + "end_time": "2023-10-04T23:04:24.904745Z", + "start_time": "2023-10-04T23:04:24.902886Z" } }, "outputs": [], diff --git a/docs/examples/Multiple_Models_Interface_Vis_Ricci.ipynb b/docs/examples/Multiple_Models_Interface_Vis_Ricci.ipynb new file mode 100644 index 00000000..b4d780d9 --- /dev/null +++ b/docs/examples/Multiple_Models_Interface_Vis_Ricci.ipynb @@ -0,0 +1,297 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "248cbed8", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-05T10:39:55.272406Z", + "start_time": "2023-10-05T10:39:54.897985Z" + } + }, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "%load_ext autoreload\n", + "%autoreload 2" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "7ec6cd08", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-05T10:39:55.281893Z", + "start_time": "2023-10-05T10:39:55.273119Z" + } + }, + "outputs": [], + "source": [ + "import os\n", + "import warnings\n", + "warnings.filterwarnings('ignore')\n", + "os.environ[\"PYTHONWARNINGS\"] = \"ignore\"" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "b8cb69f2", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-05T10:39:55.292533Z", + "start_time": "2023-10-05T10:39:55.282026Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Current location: /Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny\n" + ] + } + ], + "source": [ + "cur_folder_name = os.getcwd().split('/')[-1]\n", + "if cur_folder_name != \"Virny\":\n", + " os.chdir(\"../..\")\n", + "\n", + "print('Current location: ', os.getcwd())" + ] + }, + { + "cell_type": "markdown", + "id": "a578f2ab", + "metadata": {}, + "source": [ + "# Multiple Models Interface Usage" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "7a9241de", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-05T10:39:56.844327Z", + "start_time": "2023-10-05T10:39:55.291377Z" + } + }, + "outputs": [], + "source": [ + "import os\n", + "import pandas as pd\n", + "\n", + "from virny.custom_classes.metrics_interactive_visualizer import MetricsInteractiveVisualizer" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "outputs": [], + "source": [ + "sensitive_attributes_dct = {'Race': 'Non-White'}" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2023-10-05T10:39:56.870851Z", + "start_time": "2023-10-05T10:39:56.847550Z" + } + }, + "id": "d3c53c7b72ecbcd0" + }, + { + "cell_type": "code", + "execution_count": 6, + "outputs": [], + "source": [ + "ROOT_DIR = os.path.join('docs', 'examples')\n", + "subgroup_metrics_df = pd.read_csv(os.path.join(ROOT_DIR, 'ricci_subgroup_metrics.csv'), header=0)\n", + "models_composed_metrics_df = pd.read_csv(os.path.join(ROOT_DIR, 'ricci_group_metrics.csv'), header=0)" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2023-10-05T10:39:56.896386Z", + "start_time": "2023-10-05T10:39:56.868941Z" + } + }, + "id": "2aab7c79ecdee914" + }, + { + "cell_type": "code", + "execution_count": 7, + "outputs": [], + "source": [ + "subgroup_metrics_df['Model_Name'] = (subgroup_metrics_df['Model_Name'] + '__alpha=' +\n", + " subgroup_metrics_df['Intervention_Param'].astype(str))\n", + "models_composed_metrics_df['Model_Name'] = (models_composed_metrics_df['Model_Name'] + '__alpha=' \n", + " + models_composed_metrics_df['Intervention_Param'].astype(str))" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2023-10-05T10:39:56.916837Z", + "start_time": "2023-10-05T10:39:56.894764Z" + } + }, + "id": "2d922003e752a4b4" + }, + { + "cell_type": "code", + "execution_count": 8, + "outputs": [], + "source": [ + "models_metrics_dct = dict()\n", + "for model_name in subgroup_metrics_df['Model_Name'].unique():\n", + " models_metrics_dct[model_name] = subgroup_metrics_df[subgroup_metrics_df['Model_Name'] == model_name]" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2023-10-05T10:39:56.940693Z", + "start_time": "2023-10-05T10:39:56.916977Z" + } + }, + "id": "833484748ed512e8" + }, + { + "cell_type": "code", + "execution_count": 9, + "outputs": [ + { + "data": { + "text/plain": "dict_keys(['LGBMClassifier__alpha=0.0', 'LGBMClassifier__alpha=0.4', 'LGBMClassifier__alpha=0.7', 'LogisticRegression__alpha=0.0', 'LogisticRegression__alpha=0.4', 'LogisticRegression__alpha=0.7', 'MLPClassifier__alpha=0.7', 'MLPClassifier__alpha=0.0', 'MLPClassifier__alpha=0.4', 'RandomForestClassifier__alpha=0.0', 'RandomForestClassifier__alpha=0.4', 'RandomForestClassifier__alpha=0.7'])" + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "models_metrics_dct.keys()" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2023-10-05T10:39:56.964580Z", + "start_time": "2023-10-05T10:39:56.941618Z" + } + }, + "id": "15ed7d1ba1f22317" + }, + { + "cell_type": "markdown", + "id": "deb45226", + "metadata": {}, + "source": [ + "## Metrics Visualization and Reporting" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "435b9d98", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-05T10:39:56.991119Z", + "start_time": "2023-10-05T10:39:56.962485Z" + } + }, + "outputs": [], + "source": [ + "visualizer = MetricsInteractiveVisualizer(models_metrics_dct, models_composed_metrics_df,\n", + " sensitive_attributes_dct=sensitive_attributes_dct)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running on local URL: http://127.0.0.1:7860\n", + "\n", + "To create a public link, set `share=True` in `launch()`.\n", + "Keyboard interruption in main thread... closing server.\n" + ] + } + ], + "source": [ + "visualizer.start_web_app()" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2023-10-05T13:20:31.060413Z", + "start_time": "2023-10-05T10:39:56.991233Z" + } + }, + "id": "678a9dc8d51243f4" + }, + { + "cell_type": "code", + "execution_count": 12, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Closing server running on port: 7860\n" + ] + } + ], + "source": [ + "visualizer.stop_web_app()" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2023-10-05T13:20:31.101325Z", + "start_time": "2023-10-05T13:20:31.064318Z" + } + }, + "id": "277b6d1de837dab7" + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "2326c129", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-05T13:20:31.104256Z", + "start_time": "2023-10-05T13:20:31.102380Z" + } + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/examples/ricci_group_metrics.csv b/docs/examples/ricci_group_metrics.csv new file mode 100644 index 00000000..31cfbb3f --- /dev/null +++ b/docs/examples/ricci_group_metrics.csv @@ -0,0 +1,133 @@ +Metric,Race,Model_Name,Experiment_Iteration,Intervention_Param,Test_Set_Index +Accuracy_Parity,-0.2299465240641711,LGBMClassifier,Exp_iter_1,0.0,0 +Disparate_Impact,2.2647058823529416,LGBMClassifier,Exp_iter_1,0.0,0 +Equalized_Odds_FNR,0.0,LGBMClassifier,Exp_iter_1,0.0,0 +Equalized_Odds_FPR,0.0,LGBMClassifier,Exp_iter_1,0.0,0 +Equalized_Odds_TPR,0.0,LGBMClassifier,Exp_iter_1,0.0,0 +IQR_Parity,2.7755575615628914e-17,LGBMClassifier,Exp_iter_1,0.0,0 +Jitter_Parity,0.0,LGBMClassifier,Exp_iter_1,0.0,0 +Label_Stability_Ratio,1.0,LGBMClassifier,Exp_iter_1,0.0,0 +Statistical_Parity_Difference,3.0714285714285716,LGBMClassifier,Exp_iter_1,0.0,0 +Std_Parity,-1.3877787807814457e-17,LGBMClassifier,Exp_iter_1,0.0,0 +Std_Ratio,0.9999999999999998,LGBMClassifier,Exp_iter_1,0.0,0 +Accuracy_Parity,-0.2299465240641711,LGBMClassifier,Exp_iter_1,0.4,0 +Disparate_Impact,2.2647058823529416,LGBMClassifier,Exp_iter_1,0.4,0 +Equalized_Odds_FNR,0.0,LGBMClassifier,Exp_iter_1,0.4,0 +Equalized_Odds_FPR,0.0,LGBMClassifier,Exp_iter_1,0.4,0 +Equalized_Odds_TPR,0.0,LGBMClassifier,Exp_iter_1,0.4,0 +IQR_Parity,2.7755575615628914e-17,LGBMClassifier,Exp_iter_1,0.4,0 +Jitter_Parity,0.0,LGBMClassifier,Exp_iter_1,0.4,0 +Label_Stability_Ratio,1.0,LGBMClassifier,Exp_iter_1,0.4,0 +Statistical_Parity_Difference,3.0714285714285716,LGBMClassifier,Exp_iter_1,0.4,0 +Std_Parity,0.0,LGBMClassifier,Exp_iter_1,0.4,0 +Std_Ratio,1.0,LGBMClassifier,Exp_iter_1,0.4,0 +Accuracy_Parity,-0.2299465240641711,LGBMClassifier,Exp_iter_1,0.7,0 +Disparate_Impact,2.2647058823529416,LGBMClassifier,Exp_iter_1,0.7,0 +Equalized_Odds_FNR,0.0,LGBMClassifier,Exp_iter_1,0.7,0 +Equalized_Odds_FPR,0.0,LGBMClassifier,Exp_iter_1,0.7,0 +Equalized_Odds_TPR,0.0,LGBMClassifier,Exp_iter_1,0.7,0 +IQR_Parity,0.0,LGBMClassifier,Exp_iter_1,0.7,0 +Jitter_Parity,0.0,LGBMClassifier,Exp_iter_1,0.7,0 +Label_Stability_Ratio,1.0000000000000002,LGBMClassifier,Exp_iter_1,0.7,0 +Statistical_Parity_Difference,3.0714285714285716,LGBMClassifier,Exp_iter_1,0.7,0 +Std_Parity,-1.3877787807814457e-17,LGBMClassifier,Exp_iter_1,0.7,0 +Std_Ratio,0.9999999999999998,LGBMClassifier,Exp_iter_1,0.7,0 +Accuracy_Parity,0.3529411764705882,LogisticRegression,Exp_iter_1,0.0,0 +Disparate_Impact,0.5384615384615384,LogisticRegression,Exp_iter_1,0.0,0 +Equalized_Odds_FNR,0.0,LogisticRegression,Exp_iter_1,0.0,0 +Equalized_Odds_FPR,-0.6,LogisticRegression,Exp_iter_1,0.0,0 +Equalized_Odds_TPR,0.0,LogisticRegression,Exp_iter_1,0.0,0 +IQR_Parity,-0.004259721871489895,LogisticRegression,Exp_iter_1,0.0,0 +Jitter_Parity,-0.0640968210033926,LogisticRegression,Exp_iter_1,0.0,0 +Label_Stability_Ratio,1.0935446085768203,LogisticRegression,Exp_iter_1,0.0,0 +Statistical_Parity_Difference,-0.8571428571428572,LogisticRegression,Exp_iter_1,0.0,0 +Std_Parity,-0.0011073640847593519,LogisticRegression,Exp_iter_1,0.0,0 +Std_Ratio,0.9758617440249395,LogisticRegression,Exp_iter_1,0.0,0 +Accuracy_Parity,0.0267379679144385,LogisticRegression,Exp_iter_1,0.4,0 +Disparate_Impact,1.1666666666666665,LogisticRegression,Exp_iter_1,0.4,0 +Equalized_Odds_FNR,0.0,LogisticRegression,Exp_iter_1,0.4,0 +Equalized_Odds_FPR,-0.0888888888888889,LogisticRegression,Exp_iter_1,0.4,0 +Equalized_Odds_TPR,0.0,LogisticRegression,Exp_iter_1,0.4,0 +IQR_Parity,-0.02897288592163355,LogisticRegression,Exp_iter_1,0.4,0 +Jitter_Parity,-0.057898718189863724,LogisticRegression,Exp_iter_1,0.4,0 +Label_Stability_Ratio,1.1116523646686882,LogisticRegression,Exp_iter_1,0.4,0 +Statistical_Parity_Difference,0.2142857142857142,LogisticRegression,Exp_iter_1,0.4,0 +Std_Parity,-0.02372510499403515,LogisticRegression,Exp_iter_1,0.4,0 +Std_Ratio,0.6205686094932984,LogisticRegression,Exp_iter_1,0.4,0 +Accuracy_Parity,-0.06417112299465233,LogisticRegression,Exp_iter_1,0.7,0 +Disparate_Impact,1.5555555555555554,LogisticRegression,Exp_iter_1,0.7,0 +Equalized_Odds_FNR,0.0,LogisticRegression,Exp_iter_1,0.7,0 +Equalized_Odds_FPR,0.0222222222222222,LogisticRegression,Exp_iter_1,0.7,0 +Equalized_Odds_TPR,0.0,LogisticRegression,Exp_iter_1,0.7,0 +IQR_Parity,-0.026239708082403335,LogisticRegression,Exp_iter_1,0.7,0 +Jitter_Parity,-0.005885577620717217,LogisticRegression,Exp_iter_1,0.7,0 +Label_Stability_Ratio,0.9885615043717811,LogisticRegression,Exp_iter_1,0.7,0 +Statistical_Parity_Difference,0.7142857142857142,LogisticRegression,Exp_iter_1,0.7,0 +Std_Parity,-0.01916160626108921,LogisticRegression,Exp_iter_1,0.7,0 +Std_Ratio,0.749870952094999,LogisticRegression,Exp_iter_1,0.7,0 +Accuracy_Parity,-0.06417112299465233,MLPClassifier,Exp_iter_1,0.7,0 +Disparate_Impact,2.0,MLPClassifier,Exp_iter_1,0.7,0 +Equalized_Odds_FNR,-0.14285714285714285,MLPClassifier,Exp_iter_1,0.7,0 +Equalized_Odds_FPR,0.1222222222222222,MLPClassifier,Exp_iter_1,0.7,0 +Equalized_Odds_TPR,0.1428571428571429,MLPClassifier,Exp_iter_1,0.7,0 +IQR_Parity,-0.05854261516211538,MLPClassifier,Exp_iter_1,0.7,0 +Jitter_Parity,-0.006295515008201247,MLPClassifier,Exp_iter_1,0.7,0 +Label_Stability_Ratio,1.0171217205613179,MLPClassifier,Exp_iter_1,0.7,0 +Statistical_Parity_Difference,1.0,MLPClassifier,Exp_iter_1,0.7,0 +Std_Parity,0.004367751375921741,MLPClassifier,Exp_iter_1,0.7,0 +Std_Ratio,1.021641746544735,MLPClassifier,Exp_iter_1,0.7,0 +Accuracy_Parity,0.0,MLPClassifier,Exp_iter_1,0.0,0 +Disparate_Impact,1.0,MLPClassifier,Exp_iter_1,0.0,0 +Equalized_Odds_FNR,0.0,MLPClassifier,Exp_iter_1,0.0,0 +Equalized_Odds_FPR,0.0,MLPClassifier,Exp_iter_1,0.0,0 +Equalized_Odds_TPR,0.0,MLPClassifier,Exp_iter_1,0.0,0 +IQR_Parity,-0.14246344136147643,MLPClassifier,Exp_iter_1,0.0,0 +Jitter_Parity,-0.11034584688143848,MLPClassifier,Exp_iter_1,0.0,0 +Label_Stability_Ratio,1.1957288401253918,MLPClassifier,Exp_iter_1,0.0,0 +Statistical_Parity_Difference,0.0,MLPClassifier,Exp_iter_1,0.0,0 +Std_Parity,-0.12317270176886641,MLPClassifier,Exp_iter_1,0.0,0 +Std_Ratio,0.11675594996318969,MLPClassifier,Exp_iter_1,0.0,0 +Accuracy_Parity,0.07219251336898402,MLPClassifier,Exp_iter_1,0.4,0 +Disparate_Impact,1.25,MLPClassifier,Exp_iter_1,0.4,0 +Equalized_Odds_FNR,-0.14285714285714285,MLPClassifier,Exp_iter_1,0.4,0 +Equalized_Odds_FPR,-0.04444444444444445,MLPClassifier,Exp_iter_1,0.4,0 +Equalized_Odds_TPR,0.1428571428571429,MLPClassifier,Exp_iter_1,0.4,0 +IQR_Parity,-0.1782305060524368,MLPClassifier,Exp_iter_1,0.4,0 +Jitter_Parity,-0.09088436836585866,MLPClassifier,Exp_iter_1,0.4,0 +Label_Stability_Ratio,1.1823216340621405,MLPClassifier,Exp_iter_1,0.4,0 +Statistical_Parity_Difference,0.25,MLPClassifier,Exp_iter_1,0.4,0 +Std_Parity,-0.08577780370352184,MLPClassifier,Exp_iter_1,0.4,0 +Std_Ratio,0.6190997914544973,MLPClassifier,Exp_iter_1,0.4,0 +Accuracy_Parity,0.11764705882352944,RandomForestClassifier,Exp_iter_1,0.0,0 +Disparate_Impact,0.7777777777777777,RandomForestClassifier,Exp_iter_1,0.0,0 +Equalized_Odds_FNR,0.0,RandomForestClassifier,Exp_iter_1,0.0,0 +Equalized_Odds_FPR,-0.2,RandomForestClassifier,Exp_iter_1,0.0,0 +Equalized_Odds_TPR,0.0,RandomForestClassifier,Exp_iter_1,0.0,0 +IQR_Parity,-0.07018048128342244,RandomForestClassifier,Exp_iter_1,0.0,0 +Jitter_Parity,-0.08421653723159321,RandomForestClassifier,Exp_iter_1,0.0,0 +Label_Stability_Ratio,1.1554112554112557,RandomForestClassifier,Exp_iter_1,0.0,0 +Statistical_Parity_Difference,-0.2857142857142858,RandomForestClassifier,Exp_iter_1,0.0,0 +Std_Parity,-0.04209583589618668,RandomForestClassifier,Exp_iter_1,0.0,0 +Std_Ratio,0.4548023847532704,RandomForestClassifier,Exp_iter_1,0.0,0 +Accuracy_Parity,0.14438502673796794,RandomForestClassifier,Exp_iter_1,0.4,0 +Disparate_Impact,0.9545454545454546,RandomForestClassifier,Exp_iter_1,0.4,0 +Equalized_Odds_FNR,0.0,RandomForestClassifier,Exp_iter_1,0.4,0 +Equalized_Odds_FPR,-0.2888888888888889,RandomForestClassifier,Exp_iter_1,0.4,0 +Equalized_Odds_TPR,0.0,RandomForestClassifier,Exp_iter_1,0.4,0 +IQR_Parity,-0.07059491978609625,RandomForestClassifier,Exp_iter_1,0.4,0 +Jitter_Parity,-0.10266600381584051,RandomForestClassifier,Exp_iter_1,0.4,0 +Label_Stability_Ratio,1.229393468118196,RandomForestClassifier,Exp_iter_1,0.4,0 +Statistical_Parity_Difference,-0.0714285714285714,RandomForestClassifier,Exp_iter_1,0.4,0 +Std_Parity,-0.04122312272769589,RandomForestClassifier,Exp_iter_1,0.4,0 +Std_Ratio,0.607473282709729,RandomForestClassifier,Exp_iter_1,0.4,0 +Accuracy_Parity,-0.06417112299465233,RandomForestClassifier,Exp_iter_1,0.7,0 +Disparate_Impact,1.5555555555555554,RandomForestClassifier,Exp_iter_1,0.7,0 +Equalized_Odds_FNR,0.0,RandomForestClassifier,Exp_iter_1,0.7,0 +Equalized_Odds_FPR,0.0222222222222222,RandomForestClassifier,Exp_iter_1,0.7,0 +Equalized_Odds_TPR,0.0,RandomForestClassifier,Exp_iter_1,0.7,0 +IQR_Parity,-0.03575165472525095,RandomForestClassifier,Exp_iter_1,0.7,0 +Jitter_Parity,-0.04552387606479004,RandomForestClassifier,Exp_iter_1,0.7,0 +Label_Stability_Ratio,1.071062271062271,RandomForestClassifier,Exp_iter_1,0.7,0 +Statistical_Parity_Difference,0.7142857142857142,RandomForestClassifier,Exp_iter_1,0.7,0 +Std_Parity,-0.016581787315341434,RandomForestClassifier,Exp_iter_1,0.7,0 +Std_Ratio,0.8265703729361945,RandomForestClassifier,Exp_iter_1,0.7,0 diff --git a/docs/examples/ricci_subgroup_metrics.csv b/docs/examples/ricci_subgroup_metrics.csv new file mode 100644 index 00000000..42f9fdfd --- /dev/null +++ b/docs/examples/ricci_subgroup_metrics.csv @@ -0,0 +1,229 @@ +Metric,Bootstrap_Model_Seed,Model_Name,Model_Params,Run_Number,Dataset_Name,Num_Estimators,Tag,Record_Create_Date_Time,Session_Uuid,Experiment_Iteration,Dataset_Split_Seed,Model_Init_Seed,Fair_Intervention_Params_Lst,Intervention_Param,Race_dis,Race_priv,overall,Test_Set_Index +Accuracy,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.322,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,0.18181818181818182,0.4117647058823529,0.28205128205128205,0 +Aleatoric_Uncertainty,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.322,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,0.9735094905965549,0.9735094905965547,0.9735094905965548,0 +F1,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.322,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,0.3076923076923077,0.5833333333333334,0.44,0 +FNR,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.322,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,0.0,0.0,0.0,0 +FPR,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.322,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,1.0,1.0,1.0,0 +IQR,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.322,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,0.07936507936507944,0.07936507936507942,0.07936507936507943,0 +Jitter,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.322,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,0.19678391959798994,0.19678391959798994,0.19678391959798994,0 +Label_Stability,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.322,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,0.78,0.78,0.7800000000000002,0 +Mean,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.322,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,0.42777777777777765,0.42777777777777765,0.4277777777777776,0 +Overall_Uncertainty,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.322,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,0.984896885588681,0.9848968855886807,0.9848968855886809,0 +PPV,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.322,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,0.18181818181818182,0.4117647058823529,0.28205128205128205,0 +Per_Sample_Accuracy,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.322,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,0.2518181818181819,0.43117647058823527,0.32999999999999996,0 +Positive-Rate,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.322,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,5.5,2.4285714285714284,3.5454545454545454,0 +Sample_Size,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.322,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,,,39.0,0 +Selection-Rate,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.322,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,1.0,1.0,1.0,0 +Statistical_Bias,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.322,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,0.5459595959595962,0.5127450980392156,0.5314814814814816,0 +Std,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.322,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,0.06205500611410902,0.06205500611410903,0.06205500611410905,0 +TNR,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.322,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,0.0,0.0,0.0,0 +TPR,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.322,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,1.0,1.0,1.0,0 +Accuracy,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.429,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.18181818181818182,0.4117647058823529,0.28205128205128205,0 +Aleatoric_Uncertainty,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.429,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.9729961395248143,0.9729961395248147,0.972996139524815,0 +F1,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.429,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.3076923076923077,0.5833333333333334,0.44,0 +FNR,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.429,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.0,0.0,0.0,0 +FPR,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.429,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,1.0,1.0,1.0,0 +IQR,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.429,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.0833333333333334,0.08333333333333337,0.08333333333333338,0 +Jitter,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.429,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.2198492462311558,0.2198492462311558,0.2198492462311558,0 +Label_Stability,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.429,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.75,0.75,0.75,0 +Mean,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.429,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.42634920634920626,0.42634920634920626,0.4263492063492062,0 +Overall_Uncertainty,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.429,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.984291278451344,0.9842912784513438,0.9842912784513439,0 +PPV,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.429,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.18181818181818182,0.4117647058823529,0.28205128205128205,0 +Per_Sample_Accuracy,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.429,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.26136363636363635,0.4338235294117647,0.33653846153846156,0 +Positive-Rate,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.429,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,5.5,2.4285714285714284,3.5454545454545454,0 +Sample_Size,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.429,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,,,39.0,0 +Selection-Rate,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.429,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,1.0,1.0,1.0,0 +Statistical_Bias,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.429,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.546868686868687,0.5129971988795519,0.5321041921041921,0 +Std,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.429,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.061795142880967324,0.061795142880967324,0.061795142880967366,0 +TNR,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.429,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.0,0.0,0.0,0 +TPR,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.429,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,1.0,1.0,1.0,0 +Accuracy,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.954,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.18181818181818182,0.4117647058823529,0.28205128205128205,0 +Aleatoric_Uncertainty,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.954,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.9778290634912143,0.9778290634912146,0.9778290634912145,0 +F1,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.954,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.3076923076923077,0.5833333333333334,0.44,0 +FNR,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.954,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.0,0.0,0.0,0 +FPR,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.954,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,1.0,1.0,1.0,0 +IQR,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.954,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.0793650793650793,0.0793650793650793,0.07936507936507926,0 +Jitter,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.954,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.24201005025125627,0.24201005025125627,0.24201005025125627,0 +Label_Stability,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.954,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.7200000000000002,0.72,0.7199999999999998,0 +Mean,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.954,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.43650793650793657,0.43650793650793657,0.43650793650793657,0 +Overall_Uncertainty,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.954,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.9883368304150857,0.9883368304150855,0.9883368304150856,0 +PPV,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.954,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.18181818181818182,0.4117647058823529,0.28205128205128205,0 +Per_Sample_Accuracy,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.954,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.2709090909090909,0.43647058823529417,0.34307692307692317,0 +Positive-Rate,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.954,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,5.5,2.4285714285714284,3.5454545454545454,0 +Sample_Size,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.954,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,,,39.0,0 +Selection-Rate,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.954,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,1.0,1.0,1.0,0 +Statistical_Bias,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.954,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.5404040404040404,0.511204481792717,0.5276760276760276,0 +Std,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.954,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.05981622360177657,0.05981622360177658,0.0598162236017766,0 +TNR,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.954,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.0,0.0,0.0,0 +TPR,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 3, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 100}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.954,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,1.0,1.0,1.0,0 +Accuracy,101,LogisticRegression,"{'C': 0.1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.332,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,1.0,0.6470588235294118,0.8461538461538461,0 +Aleatoric_Uncertainty,101,LogisticRegression,"{'C': 0.1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.332,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,0.7472529086918805,0.7597234964713788,0.7526888059290976,0 +F1,101,LogisticRegression,"{'C': 0.1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.332,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,1.0,0.7,0.7857142857142857,0 +FNR,101,LogisticRegression,"{'C': 0.1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.332,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,0.0,0.0,0.0,0 +FPR,101,LogisticRegression,"{'C': 0.1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.332,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,0.0,0.6,0.21428571428571427,0 +IQR,101,LogisticRegression,"{'C': 0.1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.332,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,0.05725677658190709,0.06151649845339698,0.059113578423325756,0 +Jitter,101,LogisticRegression,"{'C': 0.1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.332,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,0.06359753312013754,0.12769435412353014,0.09153717304471629,0 +Label_Stability,101,LogisticRegression,"{'C': 0.1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.332,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,0.8986363636363636,0.821764705882353,0.8651282051282052,0 +Mean,101,LogisticRegression,"{'C': 0.1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.332,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,0.6503900112904303,0.40269780293629553,0.5424216127770896,0 +Overall_Uncertainty,101,LogisticRegression,"{'C': 0.1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.332,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,0.7555819673244829,0.7681733503787629,0.7610705189122459,0 +PPV,101,LogisticRegression,"{'C': 0.1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.332,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,1.0,0.5384615384615384,0.6470588235294118,0 +Per_Sample_Accuracy,101,LogisticRegression,"{'C': 0.1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.332,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,0.9493181818181817,0.6932352941176471,0.8376923076923077,0 +Positive-Rate,101,LogisticRegression,"{'C': 0.1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.332,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,1.0,1.8571428571428572,1.5454545454545454,0 +Sample_Size,101,LogisticRegression,"{'C': 0.1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.332,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,,,39.0,0 +Selection-Rate,101,LogisticRegression,"{'C': 0.1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.332,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,0.18181818181818182,0.7647058823529411,0.4358974358974359,0 +Statistical_Bias,101,LogisticRegression,"{'C': 0.1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.332,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,0.25104388666709493,0.3344348371334379,0.2873937881524239,0 +Std,101,LogisticRegression,"{'C': 0.1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.332,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,0.044768530424913335,0.045875894509672686,0.04525122759006484,0 +TNR,101,LogisticRegression,"{'C': 0.1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.332,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,1.0,0.4,0.7857142857142857,0 +TPR,101,LogisticRegression,"{'C': 0.1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l2', 'random_state': 101, 'solver': 'newton-cg', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.332,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,1.0,1.0,1.0,0 +Accuracy,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.440,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.9090909090909091,0.8823529411764706,0.8974358974358975,0 +Aleatoric_Uncertainty,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.440,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.33699756729590336,0.5035116995466515,0.40958065058469106,0 +F1,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.440,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.8,0.875,0.8461538461538461,0 +FNR,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.440,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.0,0.0,0.0,0 +FPR,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.440,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.1111111111111111,0.2,0.14285714285714285,0 +IQR,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.440,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.049224329992308594,0.07819721591394214,0.06185353667609759,0 +Jitter,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.440,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.05599132023754254,0.11389003842740626,0.08122922303827448,0 +Label_Stability,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.440,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.9213636363636364,0.8288235294117647,0.881025641025641,0 +Mean,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.440,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.7137223908000645,0.48094828601103157,0.612256755379204,0 +Overall_Uncertainty,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.440,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.351337129636055,0.5273659328929439,0.428067633619827,0 +PPV,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.440,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.6666666666666666,0.7777777777777778,0.7333333333333333,0 +Per_Sample_Accuracy,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.440,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.9161363636363635,0.8497058823529411,0.887179487179487,0 +Positive-Rate,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.440,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,1.5,1.2857142857142858,1.3636363636363635,0 +Sample_Size,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.440,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,,,39.0,0 +Selection-Rate,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.440,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.2727272727272727,0.5294117647058824,0.38461538461538464,0 +Statistical_Bias,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.440,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.12525504730734802,0.2086898556253517,0.16162406631775988,0 +Std,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.440,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.03880294510311703,0.06252805009715218,0.04914465753641441,0 +TNR,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.440,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.8888888888888888,0.8,0.8571428571428571,0 +TPR,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.440,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,1.0,1.0,1.0,0 +Accuracy,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.965,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.8181818181818182,0.8823529411764706,0.8461538461538461,0 +Aleatoric_Uncertainty,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.965,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.45960170285488827,0.515835456487896,0.4841138518744044,0 +F1,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.965,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.6666666666666666,0.875,0.7857142857142857,0 +FNR,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.965,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.0,0.0,0.0,0 +FPR,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.965,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.2222222222222222,0.2,0.21428571428571427,0 +IQR,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.965,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.07245045517540533,0.09869016325780866,0.08388827664722218,0 +Jitter,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.965,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.08059387848331959,0.0864794561040368,0.08315938667697897,0 +Label_Stability,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.965,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.8827272727272728,0.8929411764705882,0.8871794871794872,0 +Mean,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.965,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.6309915748840796,0.5065300807166099,0.5767391287085157,0 +Overall_Uncertainty,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.965,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.48335706694628494,0.5525283470435187,0.5135086505784126,0 +PPV,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.965,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.5,0.7777777777777778,0.6470588235294118,0 +Per_Sample_Accuracy,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.965,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.829090909090909,0.8741176470588236,0.8487179487179486,0 +Positive-Rate,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.965,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,2.0,1.2857142857142858,1.5454545454545454,0 +Sample_Size,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.965,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,,,39.0,0 +Selection-Rate,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.965,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.36363636363636365,0.5294117647058824,0.4358974358974359,0 +Statistical_Bias,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.965,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.20254440955805553,0.19969393286530776,0.20130189407660135,0 +Std,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.965,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.05744527495315021,0.07660688121423942,0.06579776999003524,0 +TNR,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.965,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.7777777777777778,0.8,0.7857142857142857,0 +TPR,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.965,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,1.0,1.0,1.0,0 +Accuracy,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'adam', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.986,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.8181818181818182,0.8823529411764706,0.8461538461538461,0 +Aleatoric_Uncertainty,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'adam', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.986,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.33204203980971764,0.3854737955308596,0.35533280512406157,0 +F1,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'adam', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.986,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.6666666666666666,0.8571428571428571,0.7692307692307693,0 +FNR,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'adam', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.986,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.0,0.14285714285714285,0.09090909090909091,0 +FPR,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'adam', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.986,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.2222222222222222,0.1,0.17857142857142858,0 +IQR,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'adam', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.986,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.12271396231956185,0.18125657748167723,0.14823253815945828,0 +Jitter,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'adam', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.986,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.21190726359063833,0.21820277859883958,0.21465146244040528,0 +Label_Stability,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'adam', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.986,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.7131818181818181,0.7011764705882353,0.7079487179487179,0 +Mean,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'adam', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.986,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.6064185916157215,0.4971536915233828,0.5587903018318816,0 +Overall_Uncertainty,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'adam', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.986,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.5584392043601321,0.5998500696890698,0.5764900943753102,0 +PPV,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'adam', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.986,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.5,0.8571428571428571,0.6666666666666666,0 +Per_Sample_Accuracy,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'adam', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.986,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.7584090909090908,0.7999999999999999,0.7765384615384614,0 +Positive-Rate,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'adam', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.986,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,2.0,1.0,1.3636363636363635,0 +Sample_Size,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'adam', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.986,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,,,39.0,0 +Selection-Rate,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'adam', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.986,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.36363636363636365,0.4117647058823529,0.38461538461538464,0 +Statistical_Bias,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'adam', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.986,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.23337856339350196,0.22727548039448447,0.23071824516316097,0 +Std,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'adam', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.986,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.20618840235218705,0.2018206509762653,0.20428451072678522,0 +TNR,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'adam', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.986,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.7777777777777778,0.9,0.8214285714285714,0 +TPR,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'adam', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.986,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,1.0,0.8571428571428571,0.9090909090909091,0 +Accuracy,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.351,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,1.0,1.0,1.0,0 +Aleatoric_Uncertainty,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.351,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,0.017886152509533817,0.08715135409347269,0.048078676276891795,0 +F1,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.351,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,1.0,1.0,1.0,0 +FNR,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.351,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,0.0,0.0,0.0,0 +FPR,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.351,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,0.0,0.0,0.0,0 +IQR,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.351,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,0.020699537461522158,0.1631629788229986,0.08279898626011443,0 +Jitter,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.351,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,0.016180904522612526,0.126526751404051,0.06428037624018045,0 +Label_Stability,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.351,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,0.979090909090909,0.8188235294117647,0.9092307692307693,0 +Mean,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.351,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,0.8296441174696434,0.4997150126395015,0.6858288666462482,0 +Overall_Uncertainty,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.351,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,0.03891369064632084,0.2909148674422839,0.14876035745481758,0 +PPV,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.351,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,1.0,1.0,1.0,0 +Per_Sample_Accuracy,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.351,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,0.9895454545454545,0.9094117647058824,0.9546153846153845,0 +Positive-Rate,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.351,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,1.0,1.0,1.0,0 +Sample_Size,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.351,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,,,39.0,0 +Selection-Rate,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.351,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,0.18181818181818182,0.4117647058823529,0.28205128205128205,0 +Statistical_Bias,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.351,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,0.011749377822083714,0.0985938602586932,0.04960466503804169,0 +Std,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.351,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,0.016282188149421783,0.1394548899182882,0.0699728530230302,0 +TNR,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.351,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,1.0,1.0,1.0,0 +TPR,101,MLPClassifier,"{'activation': 'logistic', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.351,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,1.0,1.0,1.0,0 +Accuracy,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.460,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.9545454545454546,0.8823529411764706,0.9230769230769231,0 +Aleatoric_Uncertainty,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.460,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.019742903314295127,0.049345639638436564,0.03264666017353627,0 +F1,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.460,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.8888888888888888,0.8571428571428571,0.8695652173913043,0 +FNR,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.460,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.0,0.14285714285714285,0.09090909090909091,0 +FPR,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.460,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.05555555555555555,0.1,0.07142857142857142,0 +IQR,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.460,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.06900940802527812,0.24723991407771492,0.14669962861223776,0 +Jitter,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.460,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.08922795797166976,0.1801123263375284,0.1288442211055247,0 +Label_Stability,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.460,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.879090909090909,0.7435294117647058,0.8199999999999998,0 +Mean,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.460,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.7366099368767967,0.5436120808232203,0.6524826662893403,0 +Overall_Uncertainty,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.460,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.22473388159472832,0.40615594842748426,0.30381529534233986,0 +PPV,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.460,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.8,0.8571428571428571,0.8333333333333334,0 +Per_Sample_Accuracy,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.460,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.9018181818181819,0.8264705882352942,0.8689743589743592,0 +Positive-Rate,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.460,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,1.25,1.0,1.0909090909090908,0 +Sample_Size,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.460,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,,,39.0,0 +Selection-Rate,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.460,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.22727272727272727,0.4117647058823529,0.3076923076923077,0 +Statistical_Bias,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.460,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.09774551706522229,0.17565716092191075,0.131707002848907,0 +Std,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.460,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.13941977240459089,0.22519757610811272,0.17681009709586964,0 +TNR,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.460,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.9444444444444444,0.9,0.9285714285714286,0 +TPR,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'constant', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'lbfgs', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.460,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,1.0,0.8571428571428571,0.9090909090909091,0 +Accuracy,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.341,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,1.0,0.8823529411764706,0.9487179487179487,0 +Aleatoric_Uncertainty,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.341,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,0.18366910158974167,0.37661590275368123,0.2677741174817153,0 +F1,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.341,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,1.0,0.875,0.9166666666666666,0 +FNR,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.341,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,0.0,0.0,0.0,0 +FPR,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.341,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,0.0,0.2,0.07142857142857142,0 +IQR,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.341,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,0.037613636363636356,0.1077941176470588,0.0682051282051282,0 +Jitter,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.341,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,0.0009090909090909094,0.08512562814068413,0.03761886354851622,0 +Label_Stability,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.341,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,0.9990909090909091,0.8647058823529411,0.9405128205128205,0 +Mean,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.341,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,0.8012977272727272,0.48387352941176465,0.6629333333333332,0 +Overall_Uncertainty,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.341,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,0.2068019969806863,0.4254470843134134,0.302108829920593,0 +PPV,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.341,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,1.0,0.7777777777777778,0.8461538461538461,0 +Per_Sample_Accuracy,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.341,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,0.9995454545454546,0.91,0.9605128205128205,0 +Positive-Rate,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.341,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,1.0,1.2857142857142858,1.1818181818181819,0 +Sample_Size,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.341,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,,,39.0,0 +Selection-Rate,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.341,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,0.18181818181818182,0.5294117647058824,0.3333333333333333,0 +Statistical_Bias,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.341,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,0.04173863636363639,0.1522617647058824,0.08991538461538467,0 +Std,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.341,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,0.03511623312054256,0.07721206901672924,0.05346570004964957,0 +TNR,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.341,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,1.0,0.8,0.9285714285714286,0 +TPR,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:50:29.341,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.0],0.0,1.0,1.0,1.0,0 +Accuracy,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.450,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.9090909090909091,0.7647058823529411,0.8461538461538461,0 +Aleatoric_Uncertainty,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.450,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.272845164645452,0.42735904351605347,0.34019736825571417,0 +F1,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.450,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.8,0.7777777777777778,0.7857142857142857,0 +FNR,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.450,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.0,0.0,0.0,0 +FPR,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.450,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.1111111111111111,0.4,0.21428571428571427,0 +IQR,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.450,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.08102272727272727,0.15161764705882352,0.1117948717948718,0 +Jitter,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.450,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.05041114664229504,0.15307715045813555,0.09516299445948184,0 +Label_Stability,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.450,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.93,0.7564705882352941,0.8543589743589743,0 +Mean,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.450,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.7103931818181818,0.46307647058823526,0.6025884615384615,0 +Overall_Uncertainty,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.450,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.3189058421131603,0.5022520487183918,0.3988259834539022,0 +PPV,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.450,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.6666666666666666,0.6363636363636364,0.6470588235294118,0 +Per_Sample_Accuracy,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.450,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.9136363636363637,0.7999999999999999,0.864102564102564,0 +Positive-Rate,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.450,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,1.5,1.5714285714285714,1.5454545454545454,0 +Sample_Size,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.450,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,,,39.0,0 +Selection-Rate,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.450,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.2727272727272727,0.6470588235294118,0.4358974358974359,0 +Statistical_Bias,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.450,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.12228409090909098,0.22866470588235302,0.1686551282051283,0 +Std,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.450,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.06379679289045975,0.10501991561815564,0.08176584638714769,0 +TNR,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.450,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,0.8888888888888888,0.6,0.7857142857142857,0 +TPR,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:52:13.450,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.4],0.4,1.0,1.0,1.0,0 +Accuracy,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 5, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.975,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.8181818181818182,0.8823529411764706,0.8461538461538461,0 +Aleatoric_Uncertainty,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 5, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.975,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.3736138589403957,0.49733889404460735,0.4275452844986417,0 +F1,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 5, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.975,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.6666666666666666,0.875,0.7857142857142857,0 +FNR,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 5, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.975,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.0,0.0,0.0,0 +FPR,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 5, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.975,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.2222222222222222,0.2,0.21428571428571427,0 +IQR,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 5, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.975,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.10521006329529055,0.1409617180205415,0.12079411791911789,0 +Jitter,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 5, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.975,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.08761534947463821,0.13313922553942825,0.10745909032341451,0 +Label_Stability,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 5, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.975,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.8600000000000001,0.8029411764705883,0.8351282051282052,0 +Mean,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 5, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.975,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.6203538533057853,0.5106819312876667,0.5725481437081439,0 +Overall_Uncertainty,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 5, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.975,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.42535702360304817,0.5548910385593142,0.4818205685839844,0 +PPV,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 5, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.975,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.5,0.7777777777777778,0.6470588235294118,0 +Per_Sample_Accuracy,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 5, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.975,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.7995454545454543,0.8585294117647058,0.8252564102564103,0 +Positive-Rate,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 5, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.975,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,2.0,1.2857142857142858,1.5454545454545454,0 +Sample_Size,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 5, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.975,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,,,39.0,0 +Selection-Rate,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 5, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.975,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.36363636363636365,0.5294117647058824,0.4358974358974359,0 +Statistical_Bias,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 5, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.975,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.21751490702479329,0.21198756429844656,0.21510555250305238,0 +Std,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 5, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.975,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.07902925444305965,0.09561104175840109,0.08625721301641362,0 +TNR,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 5, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.975,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,0.7777777777777778,0.8,0.7857142857142857,0 +TPR,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 10, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 5, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Ricci,200,OK,2023-08-06 20:53:03.975,d6a4d686-4369-4bca-95c8-7be5d0740b15,Exp_iter_1,100,100,[0.7],0.7,1.0,1.0,1.0,0 From e49c7c82f287685dded72a78b0697c04a9ad6151 Mon Sep 17 00:00:00 2001 From: denysgerasymuk799 Date: Sat, 7 Oct 2023 00:36:01 +0300 Subject: [PATCH 11/36] Added minor fixes to a model selection ap --- ...Multiple_Models_Interface_Vis_Income.ipynb | 83 +++++++++-------- ...iple_Models_Interface_Vis_Law_School.ipynb | 80 ++++++++-------- .../Multiple_Models_Interface_Vis_Ricci.ipynb | 91 ++++++++++--------- .../metrics_interactive_visualizer.py | 81 ++++++++--------- virny/utils/data_viz_utils.py | 10 +- 5 files changed, 171 insertions(+), 174 deletions(-) diff --git a/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb b/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb index 086dfd4a..8a24cd07 100644 --- a/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb +++ b/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb @@ -2,12 +2,12 @@ "cells": [ { "cell_type": "code", - "execution_count": 13, + "execution_count": 91, "id": "248cbed8", "metadata": { "ExecuteTime": { - "end_time": "2023-10-04T21:22:16.448256Z", - "start_time": "2023-10-04T21:22:16.399916Z" + "end_time": "2023-10-06T21:10:36.749502Z", + "start_time": "2023-10-06T21:10:36.493538Z" } }, "outputs": [ @@ -28,12 +28,12 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 92, "id": "7ec6cd08", "metadata": { "ExecuteTime": { - "end_time": "2023-10-04T21:22:16.489117Z", - "start_time": "2023-10-04T21:22:16.447387Z" + "end_time": "2023-10-06T21:10:36.782386Z", + "start_time": "2023-10-06T21:10:36.747786Z" } }, "outputs": [], @@ -46,12 +46,12 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 93, "id": "b8cb69f2", "metadata": { "ExecuteTime": { - "end_time": "2023-10-04T21:22:16.493213Z", - "start_time": "2023-10-04T21:22:16.472246Z" + "end_time": "2023-10-06T21:10:36.793383Z", + "start_time": "2023-10-06T21:10:36.770963Z" } }, "outputs": [ @@ -81,12 +81,12 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 94, "id": "7a9241de", "metadata": { "ExecuteTime": { - "end_time": "2023-10-04T21:22:16.529742Z", - "start_time": "2023-10-04T21:22:16.494483Z" + "end_time": "2023-10-06T21:10:36.813210Z", + "start_time": "2023-10-06T21:10:36.791765Z" } }, "outputs": [], @@ -99,7 +99,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 95, "outputs": [], "source": [ "sensitive_attributes_dct = {'SEX': '2', 'RAC1P': ['2', '3', '4', '5', '6', '7', '8', '9'], 'SEX&RAC1P': None}" @@ -107,15 +107,15 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-04T21:22:16.537318Z", - "start_time": "2023-10-04T21:22:16.516511Z" + "end_time": "2023-10-06T21:10:36.834736Z", + "start_time": "2023-10-06T21:10:36.814444Z" } }, "id": "d3c53c7b72ecbcd0" }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 96, "outputs": [], "source": [ "ROOT_DIR = os.path.join('docs', 'examples')\n", @@ -125,15 +125,15 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-04T21:22:16.563352Z", - "start_time": "2023-10-04T21:22:16.537733Z" + "end_time": "2023-10-06T21:10:36.872573Z", + "start_time": "2023-10-06T21:10:36.835382Z" } }, "id": "2aab7c79ecdee914" }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 97, "outputs": [], "source": [ "subgroup_metrics_df['Model_Name'] = (subgroup_metrics_df['Model_Name'] + '__alpha=' +\n", @@ -144,15 +144,15 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-04T21:22:16.584758Z", - "start_time": "2023-10-04T21:22:16.563460Z" + "end_time": "2023-10-06T21:10:36.884390Z", + "start_time": "2023-10-06T21:10:36.860961Z" } }, "id": "2d922003e752a4b4" }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 98, "outputs": [], "source": [ "models_metrics_dct = dict()\n", @@ -162,21 +162,21 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-04T21:22:16.607231Z", - "start_time": "2023-10-04T21:22:16.584939Z" + "end_time": "2023-10-06T21:10:36.909891Z", + "start_time": "2023-10-06T21:10:36.885939Z" } }, "id": "833484748ed512e8" }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 99, "outputs": [ { "data": { "text/plain": "dict_keys(['LGBMClassifier__alpha=0.7', 'LGBMClassifier__alpha=0.0', 'LGBMClassifier__alpha=0.4', 'LogisticRegression__alpha=0.0', 'LogisticRegression__alpha=0.7', 'LogisticRegression__alpha=0.4', 'MLPClassifier__alpha=0.0', 'MLPClassifier__alpha=0.7', 'MLPClassifier__alpha=0.4', 'RandomForestClassifier__alpha=0.4', 'RandomForestClassifier__alpha=0.7', 'RandomForestClassifier__alpha=0.0'])" }, - "execution_count": 21, + "execution_count": 99, "metadata": {}, "output_type": "execute_result" } @@ -187,8 +187,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-04T21:22:16.630707Z", - "start_time": "2023-10-04T21:22:16.608538Z" + "end_time": "2023-10-06T21:10:36.945035Z", + "start_time": "2023-10-06T21:10:36.910469Z" } }, "id": "15ed7d1ba1f22317" @@ -203,12 +203,12 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 119, "id": "435b9d98", "metadata": { "ExecuteTime": { - "end_time": "2023-10-04T22:04:26.837638Z", - "start_time": "2023-10-04T22:04:26.735350Z" + "end_time": "2023-10-06T21:29:47.511Z", + "start_time": "2023-10-06T21:29:47.468822Z" } }, "outputs": [], @@ -219,7 +219,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": null, "outputs": [ { "name": "stdout", @@ -227,8 +227,7 @@ "text": [ "Running on local URL: http://127.0.0.1:7860\n", "\n", - "To create a public link, set `share=True` in `launch()`.\n", - "Keyboard interruption in main thread... closing server.\n" + "To create a public link, set `share=True` in `launch()`.\n" ] } ], @@ -237,16 +236,16 @@ ], "metadata": { "collapsed": false, + "is_executing": true, "ExecuteTime": { - "end_time": "2023-10-04T22:40:36.211694Z", - "start_time": "2023-10-04T22:04:27.009071Z" + "start_time": "2023-10-06T21:29:47.543336Z" } }, "id": "678a9dc8d51243f4" }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 102, "outputs": [ { "name": "stdout", @@ -262,20 +261,20 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-04T22:04:25.890691Z", - "start_time": "2023-10-04T22:04:25.777458Z" + "end_time": "2023-10-06T21:14:23.138059Z", + "start_time": "2023-10-06T21:14:23.094188Z" } }, "id": "277b6d1de837dab7" }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 102, "id": "2326c129", "metadata": { "ExecuteTime": { - "end_time": "2023-10-04T22:04:25.893162Z", - "start_time": "2023-10-04T22:04:25.889647Z" + "end_time": "2023-10-06T21:14:23.140632Z", + "start_time": "2023-10-06T21:14:23.137188Z" } }, "outputs": [], diff --git a/docs/examples/Multiple_Models_Interface_Vis_Law_School.ipynb b/docs/examples/Multiple_Models_Interface_Vis_Law_School.ipynb index 51f3eda9..04753176 100644 --- a/docs/examples/Multiple_Models_Interface_Vis_Law_School.ipynb +++ b/docs/examples/Multiple_Models_Interface_Vis_Law_School.ipynb @@ -2,12 +2,12 @@ "cells": [ { "cell_type": "code", - "execution_count": 13, + "execution_count": 37, "id": "248cbed8", "metadata": { "ExecuteTime": { - "end_time": "2023-10-04T22:41:38.880532Z", - "start_time": "2023-10-04T22:41:38.744525Z" + "end_time": "2023-10-06T20:57:23.539739Z", + "start_time": "2023-10-06T20:57:23.403057Z" } }, "outputs": [ @@ -28,12 +28,12 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 38, "id": "7ec6cd08", "metadata": { "ExecuteTime": { - "end_time": "2023-10-04T22:41:38.897390Z", - "start_time": "2023-10-04T22:41:38.879544Z" + "end_time": "2023-10-06T20:57:23.574022Z", + "start_time": "2023-10-06T20:57:23.538351Z" } }, "outputs": [], @@ -46,12 +46,12 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 39, "id": "b8cb69f2", "metadata": { "ExecuteTime": { - "end_time": "2023-10-04T22:41:38.905091Z", - "start_time": "2023-10-04T22:41:38.881727Z" + "end_time": "2023-10-06T20:57:23.581730Z", + "start_time": "2023-10-06T20:57:23.560533Z" } }, "outputs": [ @@ -81,12 +81,12 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 40, "id": "7a9241de", "metadata": { "ExecuteTime": { - "end_time": "2023-10-04T22:41:38.938535Z", - "start_time": "2023-10-04T22:41:38.904769Z" + "end_time": "2023-10-06T20:57:23.606204Z", + "start_time": "2023-10-06T20:57:23.581940Z" } }, "outputs": [], @@ -99,7 +99,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 41, "outputs": [], "source": [ "sensitive_attributes_dct = {'male': '0.0', 'race': 'Non-White', 'male&race': None}" @@ -107,15 +107,15 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-04T22:41:38.946897Z", - "start_time": "2023-10-04T22:41:38.927198Z" + "end_time": "2023-10-06T20:57:23.625570Z", + "start_time": "2023-10-06T20:57:23.604454Z" } }, "id": "d3c53c7b72ecbcd0" }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 42, "outputs": [], "source": [ "ROOT_DIR = os.path.join('docs', 'examples')\n", @@ -125,15 +125,15 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-04T22:41:38.973205Z", - "start_time": "2023-10-04T22:41:38.947863Z" + "end_time": "2023-10-06T20:57:23.653982Z", + "start_time": "2023-10-06T20:57:23.626330Z" } }, "id": "2aab7c79ecdee914" }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 43, "outputs": [], "source": [ "subgroup_metrics_df['Model_Name'] = (subgroup_metrics_df['Model_Name'] + '__alpha=' +\n", @@ -144,15 +144,15 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-04T22:41:38.994980Z", - "start_time": "2023-10-04T22:41:38.973852Z" + "end_time": "2023-10-06T20:57:23.679479Z", + "start_time": "2023-10-06T20:57:23.654567Z" } }, "id": "2d922003e752a4b4" }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 44, "outputs": [], "source": [ "models_metrics_dct = dict()\n", @@ -162,21 +162,21 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-04T22:41:39.019414Z", - "start_time": "2023-10-04T22:41:38.994888Z" + "end_time": "2023-10-06T20:57:23.700549Z", + "start_time": "2023-10-06T20:57:23.677916Z" } }, "id": "833484748ed512e8" }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 45, "outputs": [ { "data": { "text/plain": "dict_keys(['LGBMClassifier__alpha=0.6', 'LGBMClassifier__alpha=0.0', 'LogisticRegression__alpha=0.6', 'LogisticRegression__alpha=0.0', 'MLPClassifier__alpha=0.0', 'MLPClassifier__alpha=0.6', 'RandomForestClassifier__alpha=0.6', 'RandomForestClassifier__alpha=0.0'])" }, - "execution_count": 21, + "execution_count": 45, "metadata": {}, "output_type": "execute_result" } @@ -187,8 +187,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-04T22:41:39.040053Z", - "start_time": "2023-10-04T22:41:39.018488Z" + "end_time": "2023-10-06T20:57:23.724011Z", + "start_time": "2023-10-06T20:57:23.701125Z" } }, "id": "15ed7d1ba1f22317" @@ -203,12 +203,12 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 53, "id": "435b9d98", "metadata": { "ExecuteTime": { - "end_time": "2023-10-04T22:41:39.066833Z", - "start_time": "2023-10-04T22:41:39.039759Z" + "end_time": "2023-10-06T21:03:32.115564Z", + "start_time": "2023-10-06T21:03:31.937977Z" } }, "outputs": [], @@ -219,7 +219,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 54, "outputs": [ { "name": "stdout", @@ -238,15 +238,15 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-04T23:04:24.847056Z", - "start_time": "2023-10-04T22:41:39.066921Z" + "end_time": "2023-10-06T21:09:25.295447Z", + "start_time": "2023-10-06T21:03:32.116976Z" } }, "id": "678a9dc8d51243f4" }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 48, "outputs": [ { "name": "stdout", @@ -262,20 +262,20 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-04T23:04:24.902597Z", - "start_time": "2023-10-04T23:04:24.849984Z" + "end_time": "2023-10-06T21:00:49.188809Z", + "start_time": "2023-10-06T21:00:49.151061Z" } }, "id": "277b6d1de837dab7" }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 48, "id": "2326c129", "metadata": { "ExecuteTime": { - "end_time": "2023-10-04T23:04:24.904745Z", - "start_time": "2023-10-04T23:04:24.902886Z" + "end_time": "2023-10-06T21:00:49.189515Z", + "start_time": "2023-10-06T21:00:49.186479Z" } }, "outputs": [], diff --git a/docs/examples/Multiple_Models_Interface_Vis_Ricci.ipynb b/docs/examples/Multiple_Models_Interface_Vis_Ricci.ipynb index b4d780d9..176a30ed 100644 --- a/docs/examples/Multiple_Models_Interface_Vis_Ricci.ipynb +++ b/docs/examples/Multiple_Models_Interface_Vis_Ricci.ipynb @@ -2,15 +2,24 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 25, "id": "248cbed8", "metadata": { "ExecuteTime": { - "end_time": "2023-10-05T10:39:55.272406Z", - "start_time": "2023-10-05T10:39:54.897985Z" + "end_time": "2023-10-06T21:09:29.050528Z", + "start_time": "2023-10-06T21:09:28.908204Z" } }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The autoreload extension is already loaded. To reload it, use:\n", + " %reload_ext autoreload\n" + ] + } + ], "source": [ "%matplotlib inline\n", "%load_ext autoreload\n", @@ -19,12 +28,12 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 26, "id": "7ec6cd08", "metadata": { "ExecuteTime": { - "end_time": "2023-10-05T10:39:55.281893Z", - "start_time": "2023-10-05T10:39:55.273119Z" + "end_time": "2023-10-06T21:09:29.086370Z", + "start_time": "2023-10-06T21:09:29.050228Z" } }, "outputs": [], @@ -37,12 +46,12 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 27, "id": "b8cb69f2", "metadata": { "ExecuteTime": { - "end_time": "2023-10-05T10:39:55.292533Z", - "start_time": "2023-10-05T10:39:55.282026Z" + "end_time": "2023-10-06T21:09:29.094601Z", + "start_time": "2023-10-06T21:09:29.073102Z" } }, "outputs": [ @@ -72,12 +81,12 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 28, "id": "7a9241de", "metadata": { "ExecuteTime": { - "end_time": "2023-10-05T10:39:56.844327Z", - "start_time": "2023-10-05T10:39:55.291377Z" + "end_time": "2023-10-06T21:09:29.128343Z", + "start_time": "2023-10-06T21:09:29.094781Z" } }, "outputs": [], @@ -90,7 +99,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 29, "outputs": [], "source": [ "sensitive_attributes_dct = {'Race': 'Non-White'}" @@ -98,15 +107,15 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-05T10:39:56.870851Z", - "start_time": "2023-10-05T10:39:56.847550Z" + "end_time": "2023-10-06T21:09:29.135958Z", + "start_time": "2023-10-06T21:09:29.115755Z" } }, "id": "d3c53c7b72ecbcd0" }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 30, "outputs": [], "source": [ "ROOT_DIR = os.path.join('docs', 'examples')\n", @@ -116,15 +125,15 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-05T10:39:56.896386Z", - "start_time": "2023-10-05T10:39:56.868941Z" + "end_time": "2023-10-06T21:09:29.163189Z", + "start_time": "2023-10-06T21:09:29.136609Z" } }, "id": "2aab7c79ecdee914" }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 31, "outputs": [], "source": [ "subgroup_metrics_df['Model_Name'] = (subgroup_metrics_df['Model_Name'] + '__alpha=' +\n", @@ -135,15 +144,15 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-05T10:39:56.916837Z", - "start_time": "2023-10-05T10:39:56.894764Z" + "end_time": "2023-10-06T21:09:29.187069Z", + "start_time": "2023-10-06T21:09:29.163967Z" } }, "id": "2d922003e752a4b4" }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 32, "outputs": [], "source": [ "models_metrics_dct = dict()\n", @@ -153,21 +162,21 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-05T10:39:56.940693Z", - "start_time": "2023-10-05T10:39:56.916977Z" + "end_time": "2023-10-06T21:09:29.210023Z", + "start_time": "2023-10-06T21:09:29.185859Z" } }, "id": "833484748ed512e8" }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 33, "outputs": [ { "data": { "text/plain": "dict_keys(['LGBMClassifier__alpha=0.0', 'LGBMClassifier__alpha=0.4', 'LGBMClassifier__alpha=0.7', 'LogisticRegression__alpha=0.0', 'LogisticRegression__alpha=0.4', 'LogisticRegression__alpha=0.7', 'MLPClassifier__alpha=0.7', 'MLPClassifier__alpha=0.0', 'MLPClassifier__alpha=0.4', 'RandomForestClassifier__alpha=0.0', 'RandomForestClassifier__alpha=0.4', 'RandomForestClassifier__alpha=0.7'])" }, - "execution_count": 9, + "execution_count": 33, "metadata": {}, "output_type": "execute_result" } @@ -178,8 +187,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-05T10:39:56.964580Z", - "start_time": "2023-10-05T10:39:56.941618Z" + "end_time": "2023-10-06T21:09:29.231487Z", + "start_time": "2023-10-06T21:09:29.210107Z" } }, "id": "15ed7d1ba1f22317" @@ -194,12 +203,12 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 34, "id": "435b9d98", "metadata": { "ExecuteTime": { - "end_time": "2023-10-05T10:39:56.991119Z", - "start_time": "2023-10-05T10:39:56.962485Z" + "end_time": "2023-10-06T21:09:29.260102Z", + "start_time": "2023-10-06T21:09:29.231557Z" } }, "outputs": [], @@ -210,7 +219,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 35, "outputs": [ { "name": "stdout", @@ -229,15 +238,15 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-05T13:20:31.060413Z", - "start_time": "2023-10-05T10:39:56.991233Z" + "end_time": "2023-10-06T21:10:28.861090Z", + "start_time": "2023-10-06T21:09:29.258554Z" } }, "id": "678a9dc8d51243f4" }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 36, "outputs": [ { "name": "stdout", @@ -253,20 +262,20 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-05T13:20:31.101325Z", - "start_time": "2023-10-05T13:20:31.064318Z" + "end_time": "2023-10-06T21:10:28.893637Z", + "start_time": "2023-10-06T21:10:28.857995Z" } }, "id": "277b6d1de837dab7" }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 36, "id": "2326c129", "metadata": { "ExecuteTime": { - "end_time": "2023-10-05T13:20:31.104256Z", - "start_time": "2023-10-05T13:20:31.102380Z" + "end_time": "2023-10-06T21:10:28.896502Z", + "start_time": "2023-10-06T21:10:28.892359Z" } }, "outputs": [], diff --git a/virny/custom_classes/metrics_interactive_visualizer.py b/virny/custom_classes/metrics_interactive_visualizer.py index 24edc520..0a151995 100644 --- a/virny/custom_classes/metrics_interactive_visualizer.py +++ b/virny/custom_classes/metrics_interactive_visualizer.py @@ -63,9 +63,6 @@ def _align_input_metric_df(self, model_metrics_df: pd.DataFrame, allowed_cols: l return model_metrics_df[filtered_cols] def start_web_app(self): - # css = """ - # .plot_output1 {position: right !important} - # """ with gr.Blocks(theme=gr.themes.Soft()) as demo: # ==================================== Bar Chart for Model Selection ==================================== gr.Markdown( @@ -81,7 +78,7 @@ def start_web_app(self): ) with gr.Row(): accuracy_metric = gr.Dropdown( - ['Statistical_Bias', 'TPR', 'TNR', 'PPV', 'FNR', 'FPR', 'Accuracy', 'F1'], + sorted(['Statistical_Bias', 'TPR', 'TNR', 'PPV', 'FNR', 'FPR', 'Accuracy', 'F1']), value='Accuracy', multiselect=False, label="Constraint 1 (C1)", scale=2 ) @@ -89,7 +86,7 @@ def start_web_app(self): acc_max_val = gr.Number(value=1.0, label="Max value", scale=1) with gr.Row(): fairness_metric = gr.Dropdown( - ['Equalized_Odds_TPR', 'Equalized_Odds_FPR', 'Disparate_Impact', 'Statistical_Parity_Difference', 'Accuracy_Parity'], + sorted(['Equalized_Odds_TPR', 'Equalized_Odds_FPR', 'Disparate_Impact', 'Statistical_Parity_Difference', 'Accuracy_Parity']), value='Equalized_Odds_FPR', multiselect=False, label="Constraint 2 (C2)", scale=2 ) @@ -97,7 +94,7 @@ def start_web_app(self): fairness_max_val = gr.Number(value=0.15, label="Max value", scale=1) with gr.Row(): subgroup_stability_metric = gr.Dropdown( - ['Std', 'IQR', 'Jitter', 'Label_Stability'], + sorted(['Std', 'IQR', 'Jitter', 'Label_Stability']), value='Label_Stability', multiselect=False, label="Constraint 3 (C3)", scale=2 ) @@ -105,7 +102,7 @@ def start_web_app(self): subgroup_stab_max_val = gr.Number(value=1.0, label="Max value", scale=1) with gr.Row(): group_stability_metrics = gr.Dropdown( - ['Label_Stability_Ratio', 'IQR_Parity', 'Std_Parity', 'Std_Ratio', 'Jitter_Parity'], + sorted(['Label_Stability_Ratio', 'IQR_Parity', 'Std_Parity', 'Std_Ratio', 'Jitter_Parity']), value='Label_Stability_Ratio', multiselect=False, label="Constraint 4 (C4)", scale=2 ) @@ -122,28 +119,28 @@ def start_web_app(self): subgroup_stability_metric, subgroup_stab_min_val, subgroup_stab_max_val, group_stability_metrics, group_stab_min_val, group_stab_max_val], outputs=[bar_plot_for_model_selection]) - # ======================================= Subgroup Metrics Heatmap ======================================= + # ======================================= Overall Metrics Heatmap ======================================= gr.Markdown( """ - ## Subgroup Metrics Heatmap - Select input arguments to create a subgroup metrics heatmap. + ## Overall Metrics Heatmap + Select input arguments to create an overall metrics heatmap. """) with gr.Row(): with gr.Column(scale=1): model_names = gr.Dropdown( - self.model_names, value=self.model_names[:4], max_choices=5, multiselect=True, + sorted(self.model_names), value=sorted(self.model_names)[:4], max_choices=5, multiselect=True, label="Model Names", info="Select model names to display on the heatmap:", ) accuracy_metrics = gr.Dropdown( - ['Statistical_Bias', 'TPR', 'TNR', 'PPV', 'FNR', 'FPR', 'Accuracy', 'F1'], + sorted(['Statistical_Bias', 'TPR', 'TNR', 'PPV', 'FNR', 'FPR', 'Accuracy', 'F1']), value=['Accuracy', 'F1'], multiselect=True, label="Accuracy Metrics", info="Select accuracy metrics to display on the heatmap:", ) uncertainty_metrics = gr.Dropdown( - ['Aleatoric_Uncertainty', 'Overall_Uncertainty'], + sorted(['Aleatoric_Uncertainty', 'Overall_Uncertainty']), value=['Aleatoric_Uncertainty', 'Overall_Uncertainty'], multiselect=True, label="Uncertainty Metrics", info="Select uncertainty metrics to display on the heatmap:", ) subgroup_stability_metrics = gr.Dropdown( - ['Std', 'IQR', 'Jitter', 'Label_Stability'], + sorted(['Std', 'IQR', 'Jitter', 'Label_Stability']), value=['Jitter', 'Label_Stability'], multiselect=True, label="Stability Metrics", info="Select stability metrics to display on the heatmap:", ) subgroup_btn_view2 = gr.Button("Submit") @@ -153,24 +150,24 @@ def start_web_app(self): subgroup_btn_view2.click(self._create_subgroup_model_rank_heatmap, inputs=[model_names, accuracy_metrics, uncertainty_metrics, subgroup_stability_metrics], outputs=[subgroup_model_ranking_heatmap]) - # ======================================== Group Metrics Heatmap ======================================== + # ======================================== Parity Metrics Heatmap ======================================== gr.Markdown( """ - ## Group Metrics Heatmap - Select input arguments to create a group metrics heatmap. + ## Parity Metrics Heatmap + Select input arguments to create a parity metrics heatmap. """) with gr.Row(): with gr.Column(scale=1): model_names = gr.Dropdown( - self.model_names, value=self.model_names[:4], max_choices=5, multiselect=True, + sorted(self.model_names), value=sorted(self.model_names)[:4], max_choices=5, multiselect=True, label="Model Names", info="Select model names to display on the heatmap:", ) fairness_metrics = gr.Dropdown( - ['Equalized_Odds_TPR', 'Equalized_Odds_FPR', 'Disparate_Impact', 'Statistical_Parity_Difference', 'Accuracy_Parity'], - value=['Equalized_Odds_TPR', 'Equalized_Odds_FPR'], multiselect=True, label="Error Parity Metrics", info="Select error parity metrics to display on the heatmap:", + sorted(['Equalized_Odds_TPR', 'Equalized_Odds_FPR', 'Disparate_Impact', 'Statistical_Parity_Difference', 'Accuracy_Parity']), + value=['Equalized_Odds_FPR', 'Equalized_Odds_TPR'], multiselect=True, label="Error Parity Metrics", info="Select error parity metrics to display on the heatmap:", ) group_stability_metrics = gr.Dropdown( - ['Label_Stability_Ratio', 'IQR_Parity', 'Std_Parity', 'Std_Ratio', 'Jitter_Parity'], + sorted(['Label_Stability_Ratio', 'IQR_Parity', 'Std_Parity', 'Std_Ratio', 'Jitter_Parity']), value=['Label_Stability_Ratio', 'Std_Parity'], multiselect=True, label="Stability Parity Metrics", info="Select stability parity metrics to display on the heatmap:", ) group_btn_view2 = gr.Button("Submit") @@ -188,19 +185,19 @@ def start_web_app(self): ## Subgroup Metrics Bar Chart """) subgroup_model_names = gr.Dropdown( - self.model_names, value=self.model_names[0], multiselect=False, + sorted(self.model_names), value=sorted(self.model_names)[0], multiselect=False, label="Model Names", info="Select one model to display on the bar chart:", ) accuracy_metrics = gr.Dropdown( - ['Statistical_Bias', 'TPR', 'TNR', 'PPV', 'FNR', 'FPR', 'Accuracy', 'F1'], + sorted(['Statistical_Bias', 'TPR', 'TNR', 'PPV', 'FNR', 'FPR', 'Accuracy', 'F1']), value=['Accuracy', 'F1'], multiselect=True, label="Accuracy Metrics", info="Select accuracy metrics to display on the heatmap:", ) uncertainty_metrics = gr.Dropdown( - ['Aleatoric_Uncertainty', 'Overall_Uncertainty'], + sorted(['Aleatoric_Uncertainty', 'Overall_Uncertainty']), value=['Aleatoric_Uncertainty', 'Overall_Uncertainty'], multiselect=True, label="Uncertainty Metrics", info="Select uncertainty metrics to display on the heatmap:", ) subgroup_stability_metrics = gr.Dropdown( - ['Std', 'IQR', 'Jitter', 'Label_Stability'], + sorted(['Std', 'IQR', 'Jitter', 'Label_Stability']), value=['Jitter', 'Label_Stability'], multiselect=True, label="Stability Metrics", info="Select stability metrics to display on the heatmap:", ) subgroup_btn_view3 = gr.Button("Submit") @@ -210,15 +207,15 @@ def start_web_app(self): ## Group Metrics Bar Chart """) group_model_names = gr.Dropdown( - self.model_names, value=self.model_names[0], multiselect=False, + sorted(self.model_names), value=sorted(self.model_names)[0], multiselect=False, label="Model Names", info="Select one model to display on the bar chart:", ) fairness_metrics = gr.Dropdown( - ['Equalized_Odds_TPR', 'Equalized_Odds_FPR', 'Disparate_Impact', 'Statistical_Parity_Difference', 'Accuracy_Parity'], - value=['Equalized_Odds_TPR', 'Equalized_Odds_FPR'], multiselect=True, label="Error Parity Metrics", info="Select error parity metrics to display on the heatmap:", + sorted(['Equalized_Odds_TPR', 'Equalized_Odds_FPR', 'Disparate_Impact', 'Statistical_Parity_Difference', 'Accuracy_Parity']), + value=['Equalized_Odds_FPR', 'Equalized_Odds_TPR'], multiselect=True, label="Error Parity Metrics", info="Select error parity metrics to display on the heatmap:", ) group_stability_metrics = gr.Dropdown( - ['Label_Stability_Ratio', 'IQR_Parity', 'Std_Parity', 'Std_Ratio', 'Jitter_Parity'], + sorted(['Label_Stability_Ratio', 'IQR_Parity', 'Std_Parity', 'Std_Ratio', 'Jitter_Parity']), value=['Label_Stability_Ratio', 'Std_Parity'], multiselect=True, label="Stability Parity Metrics", info="Select stability parity metrics to display on the heatmap:", ) group_btn_view3 = gr.Button("Submit") @@ -316,7 +313,6 @@ def _create_subgroup_model_rank_heatmap(self, model_names: list, subgroup_accura A list of subgroup stability metrics to visualize """ - groups_lst = self.sensitive_attributes_dct.keys() metrics_lst = subgroup_accuracy_metrics_lst + subgroup_uncertainty_metrics + subgroup_stability_metrics_lst # Find metric values for each model based on metric, subgroup, and model names. @@ -325,20 +321,14 @@ def _create_subgroup_model_rank_heatmap(self, model_names: list, subgroup_accura num_models = len(model_names) for metric in metrics_lst: # Add an overall metric - subgroup_metric = metric + '_overall' + subgroup_metric = metric results = self.__filter_subgroup_metrics_df(results, subgroup_metric, metric, selected_subgroup='overall', defined_model_names=model_names) - # Add a subgroup metric - for group in groups_lst: - for prefix in ['priv', 'dis']: - subgroup = group + '_' + prefix - subgroup_metric = metric + '_' + subgroup - results = self.__filter_subgroup_metrics_df(results, subgroup_metric, metric, subgroup, model_names) model_metrics_matrix = pd.DataFrame(results).T sorted_matrix_by_rank = create_subgroup_sorted_matrix_by_rank(model_metrics_matrix) - model_rank_heatmap, _ = create_model_rank_heatmap_visualization(model_metrics_matrix, sorted_matrix_by_rank, - num_models, top_adjust=1.) + model_rank_heatmap, _ = create_model_rank_heatmap_visualization(model_metrics_matrix, + sorted_matrix_by_rank, num_models) return model_rank_heatmap @@ -388,8 +378,8 @@ def _create_group_model_rank_heatmap(self, model_names: list, group_fairness_met model_metrics_matrix = pd.DataFrame(results).T sorted_matrix_by_rank = create_sorted_matrix_by_rank(model_metrics_matrix) - model_rank_heatmap, _ = create_model_rank_heatmap_visualization(model_metrics_matrix, sorted_matrix_by_rank, - num_models, top_adjust=0.78) + model_rank_heatmap, _ = create_model_rank_heatmap_visualization(model_metrics_matrix, + sorted_matrix_by_rank, num_models) return model_rank_heatmap @@ -420,6 +410,7 @@ def _create_metrics_bar_chart_per_one_model(self, model_name: str, metrics_names metrics_title = f'{metrics_type.capitalize()} Metrics' metrics_df = self.melted_model_composed_metrics_df if metrics_type == "group" else self.melted_model_metrics_df filtered_groups = [grp for grp in metrics_df.Subgroup.unique() if '_correct' not in grp and '_incorrect' not in grp] + filtered_groups = [grp for grp in filtered_groups if grp.lower() != 'overall'] + ['overall'] filtered_metrics_df = metrics_df[(metrics_df['Metric'].isin(metrics_names)) & (metrics_df['Model_Name'] == model_name) & (metrics_df['Subgroup'].isin(filtered_groups))] @@ -427,14 +418,14 @@ def _create_metrics_bar_chart_per_one_model(self, model_name: str, metrics_names base_font_size = 16 models_metrics_chart = ( alt.Chart().mark_bar().encode( - alt.Y('Subgroup:N', axis=None), + alt.Y('Subgroup:N', axis=None, sort=filtered_groups), alt.X('Value:Q', axis=alt.Axis(grid=True), title=''), alt.Color('Subgroup:N', scale=alt.Scale(scheme="tableau20"), + sort=filtered_groups, legend=alt.Legend(title=metrics_type.capitalize(), labelFontSize=base_font_size, - titleFontSize=base_font_size + 2) - ) + titleFontSize=base_font_size + 2)) ) ) @@ -457,7 +448,7 @@ def _create_metrics_bar_chart_per_one_model(self, model_name: str, metrics_names width=500, height=100 ).facet( - row=alt.Row('Metric:N', title=metrics_title) + row=alt.Row('Metric:N', title=metrics_title, sort=metrics_names) ).configure( padding={'top': 33}, ).configure_headerRow( diff --git a/virny/utils/data_viz_utils.py b/virny/utils/data_viz_utils.py index e90a3e71..8039a757 100644 --- a/virny/utils/data_viz_utils.py +++ b/virny/utils/data_viz_utils.py @@ -60,8 +60,7 @@ def create_subgroup_sorted_matrix_by_rank(model_metrics_matrix) -> np.array: return sorted_matrix_by_rank -def create_model_rank_heatmap_visualization(model_metrics_matrix, sorted_matrix_by_rank, num_models: int, - top_adjust: float = 0.92): +def create_model_rank_heatmap_visualization(model_metrics_matrix, sorted_matrix_by_rank, num_models: int): """ This heatmap includes group fairness and stability metrics and defined models. Using it, you can visually compare the models across defined group metrics. On this plot, @@ -80,13 +79,12 @@ def create_model_rank_heatmap_visualization(model_metrics_matrix, sorted_matrix_ Matrix of model ranks per metric where indexes are group metric names and columns are model names num_models Number of models to visualize - top_adjust - Percentage of a top padding for the heatmap """ font_increase = 4 matrix_width = 20 - matrix_height = model_metrics_matrix.shape[0] // 2 + matrix_height = model_metrics_matrix.shape[0] if model_metrics_matrix.shape[0] >= 3 \ + else model_metrics_matrix.shape[0] * 2.5 fig = plt.figure(figsize=(matrix_width, matrix_height)) rank_colors = sns.color_palette("coolwarm", n_colors=num_models).as_hex()[::-1] ax = sns.heatmap(sorted_matrix_by_rank, annot=model_metrics_matrix, cmap=rank_colors, @@ -95,7 +93,7 @@ def create_model_rank_heatmap_visualization(model_metrics_matrix, sorted_matrix_ ax.xaxis.tick_top() ax.tick_params(axis='x', rotation=10) ax.tick_params(labelsize=16 + font_increase) - fig.subplots_adjust(left=0.3, right=0.99, top=0.8) + fig.tight_layout() cbar = ax.collections[0].colorbar model_ranks = [idx for idx in range(num_models)] From 69306c5cdd7b640ec84a33f21ba2b1fb4bff0d4f Mon Sep 17 00:00:00 2001 From: denysgerasymuk799 Date: Sat, 7 Oct 2023 12:17:00 +0300 Subject: [PATCH 12/36] Reveresed a color bar for heatmaps --- .../Multiple_Models_Interface_Vis_Income.ipynb | 8 ++++---- .../metrics_interactive_visualizer.py | 14 +++++++------- virny/utils/data_viz_utils.py | 8 +++++--- 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb b/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb index 8a24cd07..df14ea69 100644 --- a/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb +++ b/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb @@ -203,12 +203,12 @@ }, { "cell_type": "code", - "execution_count": 119, + "execution_count": 136, "id": "435b9d98", "metadata": { "ExecuteTime": { - "end_time": "2023-10-06T21:29:47.511Z", - "start_time": "2023-10-06T21:29:47.468822Z" + "end_time": "2023-10-07T09:06:44.773742Z", + "start_time": "2023-10-07T09:06:44.711157Z" } }, "outputs": [], @@ -238,7 +238,7 @@ "collapsed": false, "is_executing": true, "ExecuteTime": { - "start_time": "2023-10-06T21:29:47.543336Z" + "start_time": "2023-10-07T09:06:45.327146Z" } }, "id": "678a9dc8d51243f4" diff --git a/virny/custom_classes/metrics_interactive_visualizer.py b/virny/custom_classes/metrics_interactive_visualizer.py index 0a151995..68dd4e7a 100644 --- a/virny/custom_classes/metrics_interactive_visualizer.py +++ b/virny/custom_classes/metrics_interactive_visualizer.py @@ -68,7 +68,7 @@ def start_web_app(self): gr.Markdown( """ ## Bar Chart for Model Selection - Select input arguments to create a bar chart for model selection. + Select input arguments to create a bar chart for model selection. Default values display the lowest and greatest limits of constraints. """) with gr.Row(): with gr.Column(scale=2): @@ -82,7 +82,7 @@ def start_web_app(self): value='Accuracy', multiselect=False, label="Constraint 1 (C1)", scale=2 ) - acc_min_val = gr.Number(value=0.7, label="Min value", scale=1) + acc_min_val = gr.Number(value=0.0, label="Min value", scale=1) acc_max_val = gr.Number(value=1.0, label="Max value", scale=1) with gr.Row(): fairness_metric = gr.Dropdown( @@ -90,15 +90,15 @@ def start_web_app(self): value='Equalized_Odds_FPR', multiselect=False, label="Constraint 2 (C2)", scale=2 ) - fairness_min_val = gr.Number(value=-0.15, label="Min value", scale=1) - fairness_max_val = gr.Number(value=0.15, label="Max value", scale=1) + fairness_min_val = gr.Number(value=-1.0, label="Min value", scale=1) + fairness_max_val = gr.Number(value=1.0, label="Max value", scale=1) with gr.Row(): subgroup_stability_metric = gr.Dropdown( sorted(['Std', 'IQR', 'Jitter', 'Label_Stability']), value='Label_Stability', multiselect=False, label="Constraint 3 (C3)", scale=2 ) - subgroup_stab_min_val = gr.Number(value=0.9, label="Min value", scale=1) + subgroup_stab_min_val = gr.Number(value=0.0, label="Min value", scale=1) subgroup_stab_max_val = gr.Number(value=1.0, label="Max value", scale=1) with gr.Row(): group_stability_metrics = gr.Dropdown( @@ -106,8 +106,8 @@ def start_web_app(self): value='Label_Stability_Ratio', multiselect=False, label="Constraint 4 (C4)", scale=2 ) - group_stab_min_val = gr.Number(value=0.98, label="Min value", scale=1) - group_stab_max_val = gr.Number(value=1.02, label="Max value", scale=1) + group_stab_min_val = gr.Number(value=0.1, label="Min value", scale=1) + group_stab_max_val = gr.Number(value=10.0, label="Max value", scale=1) btn_view1 = gr.Button("Submit") with gr.Column(scale=3): bar_plot_for_model_selection = gr.Plot(label="Plot") diff --git a/virny/utils/data_viz_utils.py b/virny/utils/data_viz_utils.py index 8039a757..439739b4 100644 --- a/virny/utils/data_viz_utils.py +++ b/virny/utils/data_viz_utils.py @@ -86,8 +86,10 @@ def create_model_rank_heatmap_visualization(model_metrics_matrix, sorted_matrix_ matrix_height = model_metrics_matrix.shape[0] if model_metrics_matrix.shape[0] >= 3 \ else model_metrics_matrix.shape[0] * 2.5 fig = plt.figure(figsize=(matrix_width, matrix_height)) - rank_colors = sns.color_palette("coolwarm", n_colors=num_models).as_hex()[::-1] - ax = sns.heatmap(sorted_matrix_by_rank, annot=model_metrics_matrix, cmap=rank_colors, + rank_colors = sns.color_palette("coolwarm", n_colors=num_models).as_hex() + # Convert ranks to minus ranks (1 --> -1; 4 --> -4) to align rank positions with a coolwarm color scheme + reversed_sorted_matrix_by_rank = sorted_matrix_by_rank * -1 + ax = sns.heatmap(reversed_sorted_matrix_by_rank, annot=model_metrics_matrix, cmap=rank_colors, fmt='', annot_kws={'color': 'black', 'alpha': 0.7, 'fontsize': 16 + font_increase}) ax.set(xlabel="", ylabel="") ax.xaxis.tick_top() @@ -97,7 +99,7 @@ def create_model_rank_heatmap_visualization(model_metrics_matrix, sorted_matrix_ cbar = ax.collections[0].colorbar model_ranks = [idx for idx in range(num_models)] - cbar.set_ticks([float(idx) for idx in model_ranks]) + cbar.set_ticks([float(idx) * -1 for idx in model_ranks]) tick_labels = [str(idx + 1) for idx in model_ranks] tick_labels[0] = tick_labels[0] + ', best' tick_labels[-1] = tick_labels[-1] + ', worst' From 6262752731cb70a8b9d73ec13f78b81670a7c812 Mon Sep 17 00:00:00 2001 From: denysgerasymuk799 Date: Sat, 7 Oct 2023 16:30:21 +0300 Subject: [PATCH 13/36] Added a table with model names that satisfy all 4 constraints --- .../Multiple_Models_Interface_Vis_Income.ipynb | 8 ++++---- .../metrics_interactive_visualizer.py | 15 +++++++++------ virny/utils/data_viz_utils.py | 13 +++++++++---- 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb b/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb index df14ea69..7466ede7 100644 --- a/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb +++ b/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb @@ -203,12 +203,12 @@ }, { "cell_type": "code", - "execution_count": 136, + "execution_count": 148, "id": "435b9d98", "metadata": { "ExecuteTime": { - "end_time": "2023-10-07T09:06:44.773742Z", - "start_time": "2023-10-07T09:06:44.711157Z" + "end_time": "2023-10-07T13:23:24.513519Z", + "start_time": "2023-10-07T13:23:24.200188Z" } }, "outputs": [], @@ -238,7 +238,7 @@ "collapsed": false, "is_executing": true, "ExecuteTime": { - "start_time": "2023-10-07T09:06:45.327146Z" + "start_time": "2023-10-07T13:23:24.514061Z" } }, "id": "678a9dc8d51243f4" diff --git a/virny/custom_classes/metrics_interactive_visualizer.py b/virny/custom_classes/metrics_interactive_visualizer.py index 68dd4e7a..43a1173c 100644 --- a/virny/custom_classes/metrics_interactive_visualizer.py +++ b/virny/custom_classes/metrics_interactive_visualizer.py @@ -110,7 +110,8 @@ def start_web_app(self): group_stab_max_val = gr.Number(value=10.0, label="Max value", scale=1) btn_view1 = gr.Button("Submit") with gr.Column(scale=3): - bar_plot_for_model_selection = gr.Plot(label="Plot") + bar_plot_for_model_selection = gr.Plot(label="Bar Chart") + df_with_models_satisfied_all_constraints = gr.DataFrame(label='Models that satisfy all 4 constraints') btn_view1.click(self._create_bar_plot_for_model_selection, inputs=[group_name, @@ -118,7 +119,7 @@ def start_web_app(self): fairness_metric, fairness_min_val, fairness_max_val, subgroup_stability_metric, subgroup_stab_min_val, subgroup_stab_max_val, group_stability_metrics, group_stab_min_val, group_stab_max_val], - outputs=[bar_plot_for_model_selection]) + outputs=[bar_plot_for_model_selection, df_with_models_satisfied_all_constraints]) # ======================================= Overall Metrics Heatmap ======================================= gr.Markdown( """ @@ -145,7 +146,7 @@ def start_web_app(self): ) subgroup_btn_view2 = gr.Button("Submit") with gr.Column(scale=2): - subgroup_model_ranking_heatmap = gr.Plot(label="Plot") + subgroup_model_ranking_heatmap = gr.Plot(label="Heatmap") subgroup_btn_view2.click(self._create_subgroup_model_rank_heatmap, inputs=[model_names, accuracy_metrics, uncertainty_metrics, subgroup_stability_metrics], @@ -172,7 +173,7 @@ def start_web_app(self): ) group_btn_view2 = gr.Button("Submit") with gr.Column(scale=2): - group_model_ranking_heatmap = gr.Plot(label="Plot") + group_model_ranking_heatmap = gr.Plot(label="Heatmap") group_btn_view2.click(self._create_group_model_rank_heatmap, inputs=[model_names, fairness_metrics, group_stability_metrics], @@ -221,9 +222,9 @@ def start_web_app(self): group_btn_view3 = gr.Button("Submit") with gr.Row(): with gr.Column(): - subgroup_metrics_bar_chart = gr.Plot(label="Plot") + subgroup_metrics_bar_chart = gr.Plot(label="Subgroup Bar Chart") with gr.Column(): - group_metrics_bar_chart = gr.Plot(label="Plot") + group_metrics_bar_chart = gr.Plot(label="Group Bar Chart") subgroup_btn_view3.click(self._create_subgroup_metrics_bar_chart_per_one_model, inputs=[subgroup_model_names, accuracy_metrics, uncertainty_metrics, subgroup_stability_metrics], @@ -326,6 +327,7 @@ def _create_subgroup_model_rank_heatmap(self, model_names: list, subgroup_accura selected_subgroup='overall', defined_model_names=model_names) model_metrics_matrix = pd.DataFrame(results).T + model_metrics_matrix = model_metrics_matrix[sorted(model_metrics_matrix.columns)] sorted_matrix_by_rank = create_subgroup_sorted_matrix_by_rank(model_metrics_matrix) model_rank_heatmap, _ = create_model_rank_heatmap_visualization(model_metrics_matrix, sorted_matrix_by_rank, num_models) @@ -377,6 +379,7 @@ def _create_group_model_rank_heatmap(self, model_names: list, group_fairness_met results[group_metric][model_name] = metric_value model_metrics_matrix = pd.DataFrame(results).T + model_metrics_matrix = model_metrics_matrix[sorted(model_metrics_matrix.columns)] sorted_matrix_by_rank = create_sorted_matrix_by_rank(model_metrics_matrix) model_rank_heatmap, _ = create_model_rank_heatmap_visualization(model_metrics_matrix, sorted_matrix_by_rank, num_models) diff --git a/virny/utils/data_viz_utils.py b/virny/utils/data_viz_utils.py index 439739b4..1ee8096c 100644 --- a/virny/utils/data_viz_utils.py +++ b/virny/utils/data_viz_utils.py @@ -112,8 +112,9 @@ def create_model_rank_heatmap_visualization(model_metrics_matrix, sorted_matrix_ def create_bar_plot_for_model_selection(all_subgroup_metrics_per_model_dct: dict, all_group_metrics_per_model_dct: dict, metrics_value_range_dct: dict, group: str): # Compute the number of models that satisfy the conditions - models_in_range_df = create_models_in_range_dct(all_subgroup_metrics_per_model_dct, all_group_metrics_per_model_dct, - metrics_value_range_dct, group) + models_in_range_df, df_with_models_satisfied_all_constraints = ( + create_models_in_range_dct(all_subgroup_metrics_per_model_dct, all_group_metrics_per_model_dct, + metrics_value_range_dct, group)) # Replace metric groups on their aliases metric_name_to_alias_dct = { # C1 @@ -184,7 +185,7 @@ def get_column_alias(metric_group): titleLimit=220, ).properties(width=650, height=450) - return bar_plot + return bar_plot, df_with_models_satisfied_all_constraints def create_models_in_range_dct(all_subgroup_metrics_per_model_dct: dict, all_group_metrics_per_model_dct: dict, @@ -217,6 +218,7 @@ def create_models_in_range_dct(all_subgroup_metrics_per_model_dct: dict, all_gro # Create a pandas condition for filtering based on the input value ranges models_in_range_df = pd.DataFrame() + df_with_models_satisfied_all_constraints = pd.DataFrame() for idx, (metric_group, value_range) in enumerate(metrics_value_range_dct.items()): pd_condition = None if '&' not in metric_group: @@ -253,4 +255,7 @@ def create_models_in_range_dct(all_subgroup_metrics_per_model_dct: dict, all_gro # Concatenate based on rows models_in_range_df = pd.concat([models_in_range_df, num_satisfied_models_df], ignore_index=True, sort=False) - return models_in_range_df + if metric_group.count('&') == 3: + df_with_models_satisfied_all_constraints = pivoted_model_metrics_df[pd_condition][['Model_Type', 'Model_Name']] + + return models_in_range_df, df_with_models_satisfied_all_constraints From 6146aae1bcfec042cb4219ddcb8af79cbcee8829 Mon Sep 17 00:00:00 2001 From: denysgerasymuk799 Date: Mon, 9 Oct 2023 01:08:05 +0300 Subject: [PATCH 14/36] Added tolerance to heatmaps --- ...Multiple_Models_Interface_Vis_Income.ipynb | 94 ++++++++----------- ...iple_Models_Interface_Vis_Law_School.ipynb | 80 ++++++++-------- .../Multiple_Models_Interface_Vis_Ricci.ipynb | 80 ++++++++-------- .../metrics_interactive_visualizer.py | 57 ++++++----- virny/utils/common_helpers.py | 15 +++ virny/utils/data_viz_utils.py | 56 ++++++++--- 6 files changed, 214 insertions(+), 168 deletions(-) diff --git a/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb b/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb index 7466ede7..2155fbb9 100644 --- a/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb +++ b/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb @@ -2,24 +2,15 @@ "cells": [ { "cell_type": "code", - "execution_count": 91, + "execution_count": 1, "id": "248cbed8", "metadata": { "ExecuteTime": { - "end_time": "2023-10-06T21:10:36.749502Z", - "start_time": "2023-10-06T21:10:36.493538Z" + "end_time": "2023-10-08T19:53:45.170627Z", + "start_time": "2023-10-08T19:53:44.682414Z" } }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The autoreload extension is already loaded. To reload it, use:\n", - " %reload_ext autoreload\n" - ] - } - ], + "outputs": [], "source": [ "%matplotlib inline\n", "%load_ext autoreload\n", @@ -28,12 +19,12 @@ }, { "cell_type": "code", - "execution_count": 92, + "execution_count": 2, "id": "7ec6cd08", "metadata": { "ExecuteTime": { - "end_time": "2023-10-06T21:10:36.782386Z", - "start_time": "2023-10-06T21:10:36.747786Z" + "end_time": "2023-10-08T19:53:45.179971Z", + "start_time": "2023-10-08T19:53:45.170956Z" } }, "outputs": [], @@ -46,12 +37,12 @@ }, { "cell_type": "code", - "execution_count": 93, + "execution_count": 3, "id": "b8cb69f2", "metadata": { "ExecuteTime": { - "end_time": "2023-10-06T21:10:36.793383Z", - "start_time": "2023-10-06T21:10:36.770963Z" + "end_time": "2023-10-08T19:53:45.190533Z", + "start_time": "2023-10-08T19:53:45.180261Z" } }, "outputs": [ @@ -81,12 +72,12 @@ }, { "cell_type": "code", - "execution_count": 94, + "execution_count": 4, "id": "7a9241de", "metadata": { "ExecuteTime": { - "end_time": "2023-10-06T21:10:36.813210Z", - "start_time": "2023-10-06T21:10:36.791765Z" + "end_time": "2023-10-08T19:53:47.366728Z", + "start_time": "2023-10-08T19:53:45.190219Z" } }, "outputs": [], @@ -99,7 +90,7 @@ }, { "cell_type": "code", - "execution_count": 95, + "execution_count": 5, "outputs": [], "source": [ "sensitive_attributes_dct = {'SEX': '2', 'RAC1P': ['2', '3', '4', '5', '6', '7', '8', '9'], 'SEX&RAC1P': None}" @@ -107,15 +98,15 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-06T21:10:36.834736Z", - "start_time": "2023-10-06T21:10:36.814444Z" + "end_time": "2023-10-08T19:53:47.391686Z", + "start_time": "2023-10-08T19:53:47.369626Z" } }, "id": "d3c53c7b72ecbcd0" }, { "cell_type": "code", - "execution_count": 96, + "execution_count": 6, "outputs": [], "source": [ "ROOT_DIR = os.path.join('docs', 'examples')\n", @@ -125,15 +116,15 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-06T21:10:36.872573Z", - "start_time": "2023-10-06T21:10:36.835382Z" + "end_time": "2023-10-08T19:53:47.419075Z", + "start_time": "2023-10-08T19:53:47.391397Z" } }, "id": "2aab7c79ecdee914" }, { "cell_type": "code", - "execution_count": 97, + "execution_count": 7, "outputs": [], "source": [ "subgroup_metrics_df['Model_Name'] = (subgroup_metrics_df['Model_Name'] + '__alpha=' +\n", @@ -144,15 +135,15 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-06T21:10:36.884390Z", - "start_time": "2023-10-06T21:10:36.860961Z" + "end_time": "2023-10-08T19:53:47.443543Z", + "start_time": "2023-10-08T19:53:47.419472Z" } }, "id": "2d922003e752a4b4" }, { "cell_type": "code", - "execution_count": 98, + "execution_count": 8, "outputs": [], "source": [ "models_metrics_dct = dict()\n", @@ -162,21 +153,21 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-06T21:10:36.909891Z", - "start_time": "2023-10-06T21:10:36.885939Z" + "end_time": "2023-10-08T19:53:47.469996Z", + "start_time": "2023-10-08T19:53:47.443240Z" } }, "id": "833484748ed512e8" }, { "cell_type": "code", - "execution_count": 99, + "execution_count": 9, "outputs": [ { "data": { "text/plain": "dict_keys(['LGBMClassifier__alpha=0.7', 'LGBMClassifier__alpha=0.0', 'LGBMClassifier__alpha=0.4', 'LogisticRegression__alpha=0.0', 'LogisticRegression__alpha=0.7', 'LogisticRegression__alpha=0.4', 'MLPClassifier__alpha=0.0', 'MLPClassifier__alpha=0.7', 'MLPClassifier__alpha=0.4', 'RandomForestClassifier__alpha=0.4', 'RandomForestClassifier__alpha=0.7', 'RandomForestClassifier__alpha=0.0'])" }, - "execution_count": 99, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -187,8 +178,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-06T21:10:36.945035Z", - "start_time": "2023-10-06T21:10:36.910469Z" + "end_time": "2023-10-08T19:53:47.513710Z", + "start_time": "2023-10-08T19:53:47.469016Z" } }, "id": "15ed7d1ba1f22317" @@ -203,12 +194,12 @@ }, { "cell_type": "code", - "execution_count": 148, + "execution_count": 66, "id": "435b9d98", "metadata": { "ExecuteTime": { - "end_time": "2023-10-07T13:23:24.513519Z", - "start_time": "2023-10-07T13:23:24.200188Z" + "end_time": "2023-10-08T22:06:28.762250Z", + "start_time": "2023-10-08T22:06:28.618558Z" } }, "outputs": [], @@ -238,14 +229,14 @@ "collapsed": false, "is_executing": true, "ExecuteTime": { - "start_time": "2023-10-07T13:23:24.514061Z" + "start_time": "2023-10-08T22:06:28.762615Z" } }, "id": "678a9dc8d51243f4" }, { "cell_type": "code", - "execution_count": 102, + "execution_count": 12, "outputs": [ { "name": "stdout", @@ -261,24 +252,21 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-06T21:14:23.138059Z", - "start_time": "2023-10-06T21:14:23.094188Z" + "end_time": "2023-10-08T20:42:21.447796Z", + "start_time": "2023-10-08T20:42:21.325905Z" } }, "id": "277b6d1de837dab7" }, { "cell_type": "code", - "execution_count": 102, - "id": "2326c129", + "execution_count": null, + "outputs": [], + "source": [], "metadata": { - "ExecuteTime": { - "end_time": "2023-10-06T21:14:23.140632Z", - "start_time": "2023-10-06T21:14:23.137188Z" - } + "collapsed": false }, - "outputs": [], - "source": [] + "id": "c207d4345ddca1db" } ], "metadata": { diff --git a/docs/examples/Multiple_Models_Interface_Vis_Law_School.ipynb b/docs/examples/Multiple_Models_Interface_Vis_Law_School.ipynb index 04753176..a2a5a603 100644 --- a/docs/examples/Multiple_Models_Interface_Vis_Law_School.ipynb +++ b/docs/examples/Multiple_Models_Interface_Vis_Law_School.ipynb @@ -2,12 +2,12 @@ "cells": [ { "cell_type": "code", - "execution_count": 37, + "execution_count": 55, "id": "248cbed8", "metadata": { "ExecuteTime": { - "end_time": "2023-10-06T20:57:23.539739Z", - "start_time": "2023-10-06T20:57:23.403057Z" + "end_time": "2023-10-07T13:37:09.385430Z", + "start_time": "2023-10-07T13:37:09.127608Z" } }, "outputs": [ @@ -28,12 +28,12 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 56, "id": "7ec6cd08", "metadata": { "ExecuteTime": { - "end_time": "2023-10-06T20:57:23.574022Z", - "start_time": "2023-10-06T20:57:23.538351Z" + "end_time": "2023-10-07T13:37:09.409539Z", + "start_time": "2023-10-07T13:37:09.385249Z" } }, "outputs": [], @@ -46,12 +46,12 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 57, "id": "b8cb69f2", "metadata": { "ExecuteTime": { - "end_time": "2023-10-06T20:57:23.581730Z", - "start_time": "2023-10-06T20:57:23.560533Z" + "end_time": "2023-10-07T13:37:09.430322Z", + "start_time": "2023-10-07T13:37:09.408329Z" } }, "outputs": [ @@ -81,12 +81,12 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 58, "id": "7a9241de", "metadata": { "ExecuteTime": { - "end_time": "2023-10-06T20:57:23.606204Z", - "start_time": "2023-10-06T20:57:23.581940Z" + "end_time": "2023-10-07T13:37:09.451279Z", + "start_time": "2023-10-07T13:37:09.431063Z" } }, "outputs": [], @@ -99,7 +99,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 59, "outputs": [], "source": [ "sensitive_attributes_dct = {'male': '0.0', 'race': 'Non-White', 'male&race': None}" @@ -107,15 +107,15 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-06T20:57:23.625570Z", - "start_time": "2023-10-06T20:57:23.604454Z" + "end_time": "2023-10-07T13:37:09.475696Z", + "start_time": "2023-10-07T13:37:09.453496Z" } }, "id": "d3c53c7b72ecbcd0" }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 60, "outputs": [], "source": [ "ROOT_DIR = os.path.join('docs', 'examples')\n", @@ -125,15 +125,15 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-06T20:57:23.653982Z", - "start_time": "2023-10-06T20:57:23.626330Z" + "end_time": "2023-10-07T13:37:09.500877Z", + "start_time": "2023-10-07T13:37:09.474723Z" } }, "id": "2aab7c79ecdee914" }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 61, "outputs": [], "source": [ "subgroup_metrics_df['Model_Name'] = (subgroup_metrics_df['Model_Name'] + '__alpha=' +\n", @@ -144,15 +144,15 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-06T20:57:23.679479Z", - "start_time": "2023-10-06T20:57:23.654567Z" + "end_time": "2023-10-07T13:37:09.520270Z", + "start_time": "2023-10-07T13:37:09.500217Z" } }, "id": "2d922003e752a4b4" }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 62, "outputs": [], "source": [ "models_metrics_dct = dict()\n", @@ -162,21 +162,21 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-06T20:57:23.700549Z", - "start_time": "2023-10-06T20:57:23.677916Z" + "end_time": "2023-10-07T13:37:09.543689Z", + "start_time": "2023-10-07T13:37:09.521274Z" } }, "id": "833484748ed512e8" }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 63, "outputs": [ { "data": { "text/plain": "dict_keys(['LGBMClassifier__alpha=0.6', 'LGBMClassifier__alpha=0.0', 'LogisticRegression__alpha=0.6', 'LogisticRegression__alpha=0.0', 'MLPClassifier__alpha=0.0', 'MLPClassifier__alpha=0.6', 'RandomForestClassifier__alpha=0.6', 'RandomForestClassifier__alpha=0.0'])" }, - "execution_count": 45, + "execution_count": 63, "metadata": {}, "output_type": "execute_result" } @@ -187,8 +187,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-06T20:57:23.724011Z", - "start_time": "2023-10-06T20:57:23.701125Z" + "end_time": "2023-10-07T13:37:09.565841Z", + "start_time": "2023-10-07T13:37:09.543823Z" } }, "id": "15ed7d1ba1f22317" @@ -203,12 +203,12 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": 64, "id": "435b9d98", "metadata": { "ExecuteTime": { - "end_time": "2023-10-06T21:03:32.115564Z", - "start_time": "2023-10-06T21:03:31.937977Z" + "end_time": "2023-10-07T13:37:09.593512Z", + "start_time": "2023-10-07T13:37:09.565293Z" } }, "outputs": [], @@ -219,7 +219,7 @@ }, { "cell_type": "code", - "execution_count": 54, + "execution_count": 65, "outputs": [ { "name": "stdout", @@ -238,15 +238,15 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-06T21:09:25.295447Z", - "start_time": "2023-10-06T21:03:32.116976Z" + "end_time": "2023-10-07T13:42:17.431036Z", + "start_time": "2023-10-07T13:37:09.593677Z" } }, "id": "678a9dc8d51243f4" }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 66, "outputs": [ { "name": "stdout", @@ -262,20 +262,20 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-06T21:00:49.188809Z", - "start_time": "2023-10-06T21:00:49.151061Z" + "end_time": "2023-10-07T13:42:17.479914Z", + "start_time": "2023-10-07T13:42:17.432456Z" } }, "id": "277b6d1de837dab7" }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 66, "id": "2326c129", "metadata": { "ExecuteTime": { - "end_time": "2023-10-06T21:00:49.189515Z", - "start_time": "2023-10-06T21:00:49.186479Z" + "end_time": "2023-10-07T13:42:17.482254Z", + "start_time": "2023-10-07T13:42:17.478725Z" } }, "outputs": [], diff --git a/docs/examples/Multiple_Models_Interface_Vis_Ricci.ipynb b/docs/examples/Multiple_Models_Interface_Vis_Ricci.ipynb index 176a30ed..8e21b6bc 100644 --- a/docs/examples/Multiple_Models_Interface_Vis_Ricci.ipynb +++ b/docs/examples/Multiple_Models_Interface_Vis_Ricci.ipynb @@ -2,12 +2,12 @@ "cells": [ { "cell_type": "code", - "execution_count": 25, + "execution_count": 37, "id": "248cbed8", "metadata": { "ExecuteTime": { - "end_time": "2023-10-06T21:09:29.050528Z", - "start_time": "2023-10-06T21:09:28.908204Z" + "end_time": "2023-10-07T13:42:22.642940Z", + "start_time": "2023-10-07T13:42:22.508015Z" } }, "outputs": [ @@ -28,12 +28,12 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 38, "id": "7ec6cd08", "metadata": { "ExecuteTime": { - "end_time": "2023-10-06T21:09:29.086370Z", - "start_time": "2023-10-06T21:09:29.050228Z" + "end_time": "2023-10-07T13:42:22.677119Z", + "start_time": "2023-10-07T13:42:22.641937Z" } }, "outputs": [], @@ -46,12 +46,12 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 39, "id": "b8cb69f2", "metadata": { "ExecuteTime": { - "end_time": "2023-10-06T21:09:29.094601Z", - "start_time": "2023-10-06T21:09:29.073102Z" + "end_time": "2023-10-07T13:42:22.689334Z", + "start_time": "2023-10-07T13:42:22.664188Z" } }, "outputs": [ @@ -81,12 +81,12 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 40, "id": "7a9241de", "metadata": { "ExecuteTime": { - "end_time": "2023-10-06T21:09:29.128343Z", - "start_time": "2023-10-06T21:09:29.094781Z" + "end_time": "2023-10-07T13:42:22.711038Z", + "start_time": "2023-10-07T13:42:22.687552Z" } }, "outputs": [], @@ -99,7 +99,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 41, "outputs": [], "source": [ "sensitive_attributes_dct = {'Race': 'Non-White'}" @@ -107,15 +107,15 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-06T21:09:29.135958Z", - "start_time": "2023-10-06T21:09:29.115755Z" + "end_time": "2023-10-07T13:42:22.732136Z", + "start_time": "2023-10-07T13:42:22.711244Z" } }, "id": "d3c53c7b72ecbcd0" }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 42, "outputs": [], "source": [ "ROOT_DIR = os.path.join('docs', 'examples')\n", @@ -125,15 +125,15 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-06T21:09:29.163189Z", - "start_time": "2023-10-06T21:09:29.136609Z" + "end_time": "2023-10-07T13:42:22.759203Z", + "start_time": "2023-10-07T13:42:22.732607Z" } }, "id": "2aab7c79ecdee914" }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 43, "outputs": [], "source": [ "subgroup_metrics_df['Model_Name'] = (subgroup_metrics_df['Model_Name'] + '__alpha=' +\n", @@ -144,15 +144,15 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-06T21:09:29.187069Z", - "start_time": "2023-10-06T21:09:29.163967Z" + "end_time": "2023-10-07T13:42:22.784062Z", + "start_time": "2023-10-07T13:42:22.759791Z" } }, "id": "2d922003e752a4b4" }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 44, "outputs": [], "source": [ "models_metrics_dct = dict()\n", @@ -162,21 +162,21 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-06T21:09:29.210023Z", - "start_time": "2023-10-06T21:09:29.185859Z" + "end_time": "2023-10-07T13:42:22.809161Z", + "start_time": "2023-10-07T13:42:22.782462Z" } }, "id": "833484748ed512e8" }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 45, "outputs": [ { "data": { "text/plain": "dict_keys(['LGBMClassifier__alpha=0.0', 'LGBMClassifier__alpha=0.4', 'LGBMClassifier__alpha=0.7', 'LogisticRegression__alpha=0.0', 'LogisticRegression__alpha=0.4', 'LogisticRegression__alpha=0.7', 'MLPClassifier__alpha=0.7', 'MLPClassifier__alpha=0.0', 'MLPClassifier__alpha=0.4', 'RandomForestClassifier__alpha=0.0', 'RandomForestClassifier__alpha=0.4', 'RandomForestClassifier__alpha=0.7'])" }, - "execution_count": 33, + "execution_count": 45, "metadata": {}, "output_type": "execute_result" } @@ -187,8 +187,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-06T21:09:29.231487Z", - "start_time": "2023-10-06T21:09:29.210107Z" + "end_time": "2023-10-07T13:42:22.831140Z", + "start_time": "2023-10-07T13:42:22.806994Z" } }, "id": "15ed7d1ba1f22317" @@ -203,12 +203,12 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 46, "id": "435b9d98", "metadata": { "ExecuteTime": { - "end_time": "2023-10-06T21:09:29.260102Z", - "start_time": "2023-10-06T21:09:29.231557Z" + "end_time": "2023-10-07T13:42:22.859150Z", + "start_time": "2023-10-07T13:42:22.830292Z" } }, "outputs": [], @@ -219,7 +219,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 47, "outputs": [ { "name": "stdout", @@ -238,15 +238,15 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-06T21:10:28.861090Z", - "start_time": "2023-10-06T21:09:29.258554Z" + "end_time": "2023-10-07T13:45:45.222662Z", + "start_time": "2023-10-07T13:42:22.859325Z" } }, "id": "678a9dc8d51243f4" }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 48, "outputs": [ { "name": "stdout", @@ -262,20 +262,20 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-06T21:10:28.893637Z", - "start_time": "2023-10-06T21:10:28.857995Z" + "end_time": "2023-10-07T13:45:45.264959Z", + "start_time": "2023-10-07T13:45:45.221841Z" } }, "id": "277b6d1de837dab7" }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 48, "id": "2326c129", "metadata": { "ExecuteTime": { - "end_time": "2023-10-06T21:10:28.896502Z", - "start_time": "2023-10-06T21:10:28.892359Z" + "end_time": "2023-10-07T13:45:45.265758Z", + "start_time": "2023-10-07T13:45:45.264074Z" } }, "outputs": [], diff --git a/virny/custom_classes/metrics_interactive_visualizer.py b/virny/custom_classes/metrics_interactive_visualizer.py index 43a1173c..e7b7efc9 100644 --- a/virny/custom_classes/metrics_interactive_visualizer.py +++ b/virny/custom_classes/metrics_interactive_visualizer.py @@ -2,6 +2,7 @@ import gradio as gr import altair as alt +from virny.utils.common_helpers import isfloat_regex, str_to_float from virny.utils.data_viz_utils import (create_model_rank_heatmap_visualization, create_sorted_matrix_by_rank, create_subgroup_sorted_matrix_by_rank, create_bar_plot_for_model_selection) @@ -82,32 +83,32 @@ def start_web_app(self): value='Accuracy', multiselect=False, label="Constraint 1 (C1)", scale=2 ) - acc_min_val = gr.Number(value=0.0, label="Min value", scale=1) - acc_max_val = gr.Number(value=1.0, label="Max value", scale=1) + acc_min_val = gr.Text(value="0.0", label="Min value", scale=1) + acc_max_val = gr.Text(value="1.0", label="Max value", scale=1) with gr.Row(): fairness_metric = gr.Dropdown( sorted(['Equalized_Odds_TPR', 'Equalized_Odds_FPR', 'Disparate_Impact', 'Statistical_Parity_Difference', 'Accuracy_Parity']), value='Equalized_Odds_FPR', multiselect=False, label="Constraint 2 (C2)", scale=2 ) - fairness_min_val = gr.Number(value=-1.0, label="Min value", scale=1) - fairness_max_val = gr.Number(value=1.0, label="Max value", scale=1) + fairness_min_val = gr.Text(value="-1.0", label="Min value", scale=1) + fairness_max_val = gr.Text(value="1.0", label="Max value", scale=1) with gr.Row(): subgroup_stability_metric = gr.Dropdown( sorted(['Std', 'IQR', 'Jitter', 'Label_Stability']), value='Label_Stability', multiselect=False, label="Constraint 3 (C3)", scale=2 ) - subgroup_stab_min_val = gr.Number(value=0.0, label="Min value", scale=1) - subgroup_stab_max_val = gr.Number(value=1.0, label="Max value", scale=1) + subgroup_stab_min_val = gr.Text(value="0.0", label="Min value", scale=1) + subgroup_stab_max_val = gr.Text(value="1.0", label="Max value", scale=1) with gr.Row(): group_stability_metrics = gr.Dropdown( sorted(['Label_Stability_Ratio', 'IQR_Parity', 'Std_Parity', 'Std_Ratio', 'Jitter_Parity']), value='Label_Stability_Ratio', multiselect=False, label="Constraint 4 (C4)", scale=2 ) - group_stab_min_val = gr.Number(value=0.1, label="Min value", scale=1) - group_stab_max_val = gr.Number(value=10.0, label="Max value", scale=1) + group_stab_min_val = gr.Text(value="0.1", label="Min value", scale=1) + group_stab_max_val = gr.Text(value="10.0", label="Max value", scale=1) btn_view1 = gr.Button("Submit") with gr.Column(scale=3): bar_plot_for_model_selection = gr.Plot(label="Bar Chart") @@ -132,6 +133,7 @@ def start_web_app(self): sorted(self.model_names), value=sorted(self.model_names)[:4], max_choices=5, multiselect=True, label="Model Names", info="Select model names to display on the heatmap:", ) + subgroup_tolerance = gr.Text(value="0.005", label="Tolerance", info="Define an acceptable tolerance for metric dense ranking.") accuracy_metrics = gr.Dropdown( sorted(['Statistical_Bias', 'TPR', 'TNR', 'PPV', 'FNR', 'FPR', 'Accuracy', 'F1']), value=['Accuracy', 'F1'], multiselect=True, label="Accuracy Metrics", info="Select accuracy metrics to display on the heatmap:", @@ -149,7 +151,7 @@ def start_web_app(self): subgroup_model_ranking_heatmap = gr.Plot(label="Heatmap") subgroup_btn_view2.click(self._create_subgroup_model_rank_heatmap, - inputs=[model_names, accuracy_metrics, uncertainty_metrics, subgroup_stability_metrics], + inputs=[model_names, accuracy_metrics, uncertainty_metrics, subgroup_stability_metrics, subgroup_tolerance], outputs=[subgroup_model_ranking_heatmap]) # ======================================== Parity Metrics Heatmap ======================================== gr.Markdown( @@ -163,6 +165,7 @@ def start_web_app(self): sorted(self.model_names), value=sorted(self.model_names)[:4], max_choices=5, multiselect=True, label="Model Names", info="Select model names to display on the heatmap:", ) + group_tolerance = gr.Text(value="0.005", label="Tolerance", info="Define an acceptable tolerance for metric dense ranking.") fairness_metrics = gr.Dropdown( sorted(['Equalized_Odds_TPR', 'Equalized_Odds_FPR', 'Disparate_Impact', 'Statistical_Parity_Difference', 'Accuracy_Parity']), value=['Equalized_Odds_FPR', 'Equalized_Odds_TPR'], multiselect=True, label="Error Parity Metrics", info="Select error parity metrics to display on the heatmap:", @@ -176,7 +179,7 @@ def start_web_app(self): group_model_ranking_heatmap = gr.Plot(label="Heatmap") group_btn_view2.click(self._create_group_model_rank_heatmap, - inputs=[model_names, fairness_metrics, group_stability_metrics], + inputs=[model_names, fairness_metrics, group_stability_metrics, group_tolerance], outputs=[group_model_ranking_heatmap]) # =============================== Subgroup and Group Metrics Bar Chart =============================== with gr.Row(): @@ -187,7 +190,7 @@ def start_web_app(self): """) subgroup_model_names = gr.Dropdown( sorted(self.model_names), value=sorted(self.model_names)[0], multiselect=False, - label="Model Names", info="Select one model to display on the bar chart:", + label="Model Name", info="Select one model to display on the bar chart:", ) accuracy_metrics = gr.Dropdown( sorted(['Statistical_Bias', 'TPR', 'TNR', 'PPV', 'FNR', 'FPR', 'Accuracy', 'F1']), @@ -209,7 +212,7 @@ def start_web_app(self): """) group_model_names = gr.Dropdown( sorted(self.model_names), value=sorted(self.model_names)[0], multiselect=False, - label="Model Names", info="Select one model to display on the bar chart:", + label="Model Name", info="Select one model to display on the bar chart:", ) fairness_metrics = gr.Dropdown( sorted(['Equalized_Odds_TPR', 'Equalized_Odds_FPR', 'Disparate_Impact', 'Statistical_Parity_Difference', 'Accuracy_Parity']), @@ -266,10 +269,10 @@ def _create_bar_plot_for_model_selection(self, group_name, accuracy_metric, acc_ fairness_metric, fairness_min_val, fairness_max_val, subgroup_stability_metric, subgroup_stab_min_val, subgroup_stab_max_val, group_stability_metrics, group_stab_min_val, group_stab_max_val): - accuracy_constraint = (accuracy_metric, acc_min_val, acc_max_val) - fairness_constraint = (fairness_metric, fairness_min_val, fairness_max_val) - subgroup_stability_constraint = (subgroup_stability_metric, subgroup_stab_min_val, subgroup_stab_max_val) - group_stability_constraint = (group_stability_metrics, group_stab_min_val, group_stab_max_val) + accuracy_constraint = (accuracy_metric, str_to_float(acc_min_val, 'C1 min value'), str_to_float(acc_max_val, 'C2 max value')) + fairness_constraint = (fairness_metric, str_to_float(fairness_min_val, 'C2 min value'), str_to_float(fairness_max_val, 'C2 max value')) + subgroup_stability_constraint = (subgroup_stability_metric, str_to_float(subgroup_stab_min_val, 'C3 min value'), str_to_float(subgroup_stab_max_val, 'C3 max value')) + group_stability_constraint = (group_stability_metrics, str_to_float(group_stab_min_val, 'C4 min value'), str_to_float(group_stab_max_val, 'C4 max value')) # Create individual constraints metrics_value_range_dct = dict() @@ -298,7 +301,8 @@ def _create_bar_plot_for_model_selection(self, group_name, accuracy_metric, acc_ group=group_name) def _create_subgroup_model_rank_heatmap(self, model_names: list, subgroup_accuracy_metrics_lst: list, - subgroup_uncertainty_metrics: list, subgroup_stability_metrics_lst: list): + subgroup_uncertainty_metrics: list, subgroup_stability_metrics_lst: list, + tolerance: str): """ Create a group model rank heatmap. @@ -312,8 +316,11 @@ def _create_subgroup_model_rank_heatmap(self, model_names: list, subgroup_accura A list of subgroup uncertainty metrics to visualize subgroup_stability_metrics_lst A list of subgroup stability metrics to visualize + tolerance + An acceptable value difference for metrics dense ranking """ + tolerance = str_to_float(tolerance, 'Tolerance') metrics_lst = subgroup_accuracy_metrics_lst + subgroup_uncertainty_metrics + subgroup_stability_metrics_lst # Find metric values for each model based on metric, subgroup, and model names. @@ -328,14 +335,13 @@ def _create_subgroup_model_rank_heatmap(self, model_names: list, subgroup_accura model_metrics_matrix = pd.DataFrame(results).T model_metrics_matrix = model_metrics_matrix[sorted(model_metrics_matrix.columns)] - sorted_matrix_by_rank = create_subgroup_sorted_matrix_by_rank(model_metrics_matrix) - model_rank_heatmap, _ = create_model_rank_heatmap_visualization(model_metrics_matrix, - sorted_matrix_by_rank, num_models) + sorted_matrix_by_rank = create_subgroup_sorted_matrix_by_rank(model_metrics_matrix, tolerance) + model_rank_heatmap, _ = create_model_rank_heatmap_visualization(model_metrics_matrix, sorted_matrix_by_rank) return model_rank_heatmap def _create_group_model_rank_heatmap(self, model_names: list, group_fairness_metrics_lst: list, - group_stability_metrics_lst: list): + group_stability_metrics_lst: list, tolerance: str): """ Create a group model rank heatmap. @@ -347,8 +353,12 @@ def _create_group_model_rank_heatmap(self, model_names: list, group_fairness_met A list of group fairness metrics to visualize group_stability_metrics_lst A list of group stability metrics to visualize + tolerance + An acceptable value difference for metrics dense ranking """ + tolerance = str_to_float(tolerance, 'Tolerance') + groups_lst = self.sensitive_attributes_dct.keys() metrics_lst = group_fairness_metrics_lst + group_stability_metrics_lst @@ -380,9 +390,8 @@ def _create_group_model_rank_heatmap(self, model_names: list, group_fairness_met model_metrics_matrix = pd.DataFrame(results).T model_metrics_matrix = model_metrics_matrix[sorted(model_metrics_matrix.columns)] - sorted_matrix_by_rank = create_sorted_matrix_by_rank(model_metrics_matrix) - model_rank_heatmap, _ = create_model_rank_heatmap_visualization(model_metrics_matrix, - sorted_matrix_by_rank, num_models) + sorted_matrix_by_rank = create_sorted_matrix_by_rank(model_metrics_matrix, tolerance) + model_rank_heatmap, _ = create_model_rank_heatmap_visualization(model_metrics_matrix, sorted_matrix_by_rank) return model_rank_heatmap diff --git a/virny/utils/common_helpers.py b/virny/utils/common_helpers.py index f99f227a..eaadcd75 100644 --- a/virny/utils/common_helpers.py +++ b/virny/utils/common_helpers.py @@ -1,4 +1,5 @@ import os +import re from datetime import datetime, timezone from sklearn.metrics import confusion_matrix @@ -71,6 +72,20 @@ def validate_config(config_obj): return True +def isfloat_regex(string): + # We have defined a pattern for float value + pattern = r'^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$' + # Find the match and convert to boolean + return bool(re.match(pattern, string)) + + +def str_to_float(str_var: str, var_name: str): + if isfloat_regex(str_var): + return float(str_var) + else: + raise ValueError(f"{var_name} must be a float number with a '.' separator.") + + def reset_model_seed(model, new_seed, verbose): if isinstance(model, base.Classifier): # For incremental models model.seed = new_seed diff --git a/virny/utils/data_viz_utils.py b/virny/utils/data_viz_utils.py index 1ee8096c..a4a6068e 100644 --- a/virny/utils/data_viz_utils.py +++ b/virny/utils/data_viz_utils.py @@ -4,7 +4,6 @@ import seaborn as sns from matplotlib import pyplot as plt -from IPython.display import display from virny.utils.common_helpers import check_substring_in_list @@ -33,7 +32,34 @@ def plot_generic(x, y, xlabel, ylabel, x_lim, y_lim, plot_title): plt.show() -def create_sorted_matrix_by_rank(model_metrics_matrix) -> np.array: +def rank_with_tolerance(pd_series: pd.Series, tolerance: float = 0.01, method: str = 'dense'): + """ + Rank a pandas series with defined tolerance. + Ref: https://stackoverflow.com/questions/72956450/pandas-ranking-with-tolerance + + Parameters + ---------- + pd_series + A pandas series to rank + tolerance + A float value for ranking + method + Ranking methods for numpy.rank() + + Returns + ------- + A pandas series with dense ranks for the input pd series. + + """ + tolerance += 1e-10 # Add 0.0000000001 for correct comparison of float numbers + vals = pd.Series(pd_series.unique()).sort_values() + vals.index = vals + vals = vals.mask(vals - vals.shift(1) <= tolerance, vals.shift(1)) + + return pd_series.map(vals).fillna(pd_series).rank(method=method) + + +def create_sorted_matrix_by_rank(model_metrics_matrix, tolerance) -> np.array: models_distances_matrix = model_metrics_matrix.copy(deep=True).T metric_names = models_distances_matrix.columns for metric_name in metric_names: @@ -42,11 +68,15 @@ def create_sorted_matrix_by_rank(model_metrics_matrix) -> np.array: models_distances_matrix[metric_name] = models_distances_matrix[metric_name].abs() models_distances_matrix = models_distances_matrix.T - sorted_matrix_by_rank = np.argsort(np.argsort(models_distances_matrix, axis=1), axis=1) + models_distances_df = pd.DataFrame(models_distances_matrix) + sorted_matrix_by_rank = models_distances_df.apply( + lambda row : rank_with_tolerance(row, tolerance, method='dense'), axis = 1 + ) + return sorted_matrix_by_rank -def create_subgroup_sorted_matrix_by_rank(model_metrics_matrix) -> np.array: +def create_subgroup_sorted_matrix_by_rank(model_metrics_matrix, tolerance) -> np.array: models_distances_matrix = model_metrics_matrix.copy(deep=True).T metric_names = models_distances_matrix.columns for metric_name in metric_names: @@ -56,11 +86,15 @@ def create_subgroup_sorted_matrix_by_rank(model_metrics_matrix) -> np.array: models_distances_matrix[metric_name] = models_distances_matrix[metric_name].abs() models_distances_matrix = models_distances_matrix.T - sorted_matrix_by_rank = np.argsort(np.argsort(models_distances_matrix, axis=1), axis=1) + models_distances_df = pd.DataFrame(models_distances_matrix) + sorted_matrix_by_rank = models_distances_df.apply( + lambda row : rank_with_tolerance(row, tolerance, method='dense'), axis = 1 + ) + return sorted_matrix_by_rank -def create_model_rank_heatmap_visualization(model_metrics_matrix, sorted_matrix_by_rank, num_models: int): +def create_model_rank_heatmap_visualization(model_metrics_matrix, sorted_matrix_by_rank): """ This heatmap includes group fairness and stability metrics and defined models. Using it, you can visually compare the models across defined group metrics. On this plot, @@ -77,16 +111,16 @@ def create_model_rank_heatmap_visualization(model_metrics_matrix, sorted_matrix_ Matrix of model metrics values where indexes are group metric names and columns are model names sorted_matrix_by_rank Matrix of model ranks per metric where indexes are group metric names and columns are model names - num_models - Number of models to visualize """ font_increase = 4 matrix_width = 20 matrix_height = model_metrics_matrix.shape[0] if model_metrics_matrix.shape[0] >= 3 \ else model_metrics_matrix.shape[0] * 2.5 + num_ranks = int(sorted_matrix_by_rank.values.max()) + fig = plt.figure(figsize=(matrix_width, matrix_height)) - rank_colors = sns.color_palette("coolwarm", n_colors=num_models).as_hex() + rank_colors = sns.color_palette("coolwarm", n_colors=num_ranks).as_hex() # Convert ranks to minus ranks (1 --> -1; 4 --> -4) to align rank positions with a coolwarm color scheme reversed_sorted_matrix_by_rank = sorted_matrix_by_rank * -1 ax = sns.heatmap(reversed_sorted_matrix_by_rank, annot=model_metrics_matrix, cmap=rank_colors, @@ -98,9 +132,9 @@ def create_model_rank_heatmap_visualization(model_metrics_matrix, sorted_matrix_ fig.tight_layout() cbar = ax.collections[0].colorbar - model_ranks = [idx for idx in range(num_models)] + model_ranks = [idx + 1 for idx in range(num_ranks)] cbar.set_ticks([float(idx) * -1 for idx in model_ranks]) - tick_labels = [str(idx + 1) for idx in model_ranks] + tick_labels = [str(idx) for idx in model_ranks] tick_labels[0] = tick_labels[0] + ', best' tick_labels[-1] = tick_labels[-1] + ', worst' cbar.set_ticklabels(tick_labels, fontsize=16 + font_increase) From b8ea3414ad0d9dc9b59c69526cf8a0d91a53c1ee Mon Sep 17 00:00:00 2001 From: denysgerasymuk799 Date: Mon, 9 Oct 2023 01:40:50 +0300 Subject: [PATCH 15/36] Added tolerance to heatmaps --- docs/examples/Multiple_Models_Interface_Vis_Income.ipynb | 8 ++++---- virny/custom_classes/metrics_interactive_visualizer.py | 4 ++-- virny/utils/data_viz_utils.py | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb b/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb index 2155fbb9..96262a8a 100644 --- a/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb +++ b/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb @@ -194,12 +194,12 @@ }, { "cell_type": "code", - "execution_count": 66, + "execution_count": 70, "id": "435b9d98", "metadata": { "ExecuteTime": { - "end_time": "2023-10-08T22:06:28.762250Z", - "start_time": "2023-10-08T22:06:28.618558Z" + "end_time": "2023-10-08T22:12:56.138844Z", + "start_time": "2023-10-08T22:12:56.085891Z" } }, "outputs": [], @@ -229,7 +229,7 @@ "collapsed": false, "is_executing": true, "ExecuteTime": { - "start_time": "2023-10-08T22:06:28.762615Z" + "start_time": "2023-10-08T22:12:56.178820Z" } }, "id": "678a9dc8d51243f4" diff --git a/virny/custom_classes/metrics_interactive_visualizer.py b/virny/custom_classes/metrics_interactive_visualizer.py index e7b7efc9..aa2ef476 100644 --- a/virny/custom_classes/metrics_interactive_visualizer.py +++ b/virny/custom_classes/metrics_interactive_visualizer.py @@ -260,7 +260,7 @@ def __filter_subgroup_metrics_df(self, results: dict, subgroup_metric: str, (self.sorted_model_metrics_df.Subgroup == selected_subgroup) & (self.sorted_model_metrics_df.Model_Name == model_name) ]['Value'].values[0] - metric_value = round(metric_value, 3) + metric_value = metric_value results[subgroup_metric][model_name] = metric_value return results @@ -385,7 +385,7 @@ def _create_group_model_rank_heatmap(self, model_names: list, group_fairness_met (self.sorted_model_composed_metrics_df.Subgroup == group) & (self.sorted_model_composed_metrics_df.Model_Name == model_name) ]['Value'].values[0] - metric_value = round(metric_value, 3) + metric_value = metric_value results[group_metric][model_name] = metric_value model_metrics_matrix = pd.DataFrame(results).T diff --git a/virny/utils/data_viz_utils.py b/virny/utils/data_viz_utils.py index a4a6068e..d251cd1a 100644 --- a/virny/utils/data_viz_utils.py +++ b/virny/utils/data_viz_utils.py @@ -123,7 +123,7 @@ def create_model_rank_heatmap_visualization(model_metrics_matrix, sorted_matrix_ rank_colors = sns.color_palette("coolwarm", n_colors=num_ranks).as_hex() # Convert ranks to minus ranks (1 --> -1; 4 --> -4) to align rank positions with a coolwarm color scheme reversed_sorted_matrix_by_rank = sorted_matrix_by_rank * -1 - ax = sns.heatmap(reversed_sorted_matrix_by_rank, annot=model_metrics_matrix, cmap=rank_colors, + ax = sns.heatmap(reversed_sorted_matrix_by_rank, annot=model_metrics_matrix.round(3), cmap=rank_colors, fmt='', annot_kws={'color': 'black', 'alpha': 0.7, 'fontsize': 16 + font_increase}) ax.set(xlabel="", ylabel="") ax.xaxis.tick_top() From b9812181f4dacecdb7ed35c166b948fc86090c32 Mon Sep 17 00:00:00 2001 From: denysgerasymuk799 Date: Tue, 10 Oct 2023 00:38:19 +0300 Subject: [PATCH 16/36] Added a test sample for data stats panel --- ...Multiple_Models_Interface_Vis_Income.ipynb | 89 +++++++++++-------- .../metrics_interactive_visualizer.py | 46 ++++++++++ virny/utils/data_viz_utils.py | 2 +- 3 files changed, 98 insertions(+), 39 deletions(-) diff --git a/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb b/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb index 96262a8a..4285f1df 100644 --- a/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb +++ b/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb @@ -2,15 +2,24 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 72, "id": "248cbed8", "metadata": { "ExecuteTime": { - "end_time": "2023-10-08T19:53:45.170627Z", - "start_time": "2023-10-08T19:53:44.682414Z" + "end_time": "2023-10-09T18:41:13.001910Z", + "start_time": "2023-10-09T18:41:12.938067Z" } }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The autoreload extension is already loaded. To reload it, use:\n", + " %reload_ext autoreload\n" + ] + } + ], "source": [ "%matplotlib inline\n", "%load_ext autoreload\n", @@ -19,12 +28,12 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 73, "id": "7ec6cd08", "metadata": { "ExecuteTime": { - "end_time": "2023-10-08T19:53:45.179971Z", - "start_time": "2023-10-08T19:53:45.170956Z" + "end_time": "2023-10-09T18:41:13.042184Z", + "start_time": "2023-10-09T18:41:13.000213Z" } }, "outputs": [], @@ -37,12 +46,12 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 74, "id": "b8cb69f2", "metadata": { "ExecuteTime": { - "end_time": "2023-10-08T19:53:45.190533Z", - "start_time": "2023-10-08T19:53:45.180261Z" + "end_time": "2023-10-09T18:41:13.046945Z", + "start_time": "2023-10-09T18:41:13.024368Z" } }, "outputs": [ @@ -72,12 +81,12 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 75, "id": "7a9241de", "metadata": { "ExecuteTime": { - "end_time": "2023-10-08T19:53:47.366728Z", - "start_time": "2023-10-08T19:53:45.190219Z" + "end_time": "2023-10-09T18:41:13.071700Z", + "start_time": "2023-10-09T18:41:13.047422Z" } }, "outputs": [], @@ -90,7 +99,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 76, "outputs": [], "source": [ "sensitive_attributes_dct = {'SEX': '2', 'RAC1P': ['2', '3', '4', '5', '6', '7', '8', '9'], 'SEX&RAC1P': None}" @@ -98,15 +107,15 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-08T19:53:47.391686Z", - "start_time": "2023-10-08T19:53:47.369626Z" + "end_time": "2023-10-09T18:41:13.095787Z", + "start_time": "2023-10-09T18:41:13.071607Z" } }, "id": "d3c53c7b72ecbcd0" }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 77, "outputs": [], "source": [ "ROOT_DIR = os.path.join('docs', 'examples')\n", @@ -116,15 +125,15 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-08T19:53:47.419075Z", - "start_time": "2023-10-08T19:53:47.391397Z" + "end_time": "2023-10-09T18:41:13.134622Z", + "start_time": "2023-10-09T18:41:13.094182Z" } }, "id": "2aab7c79ecdee914" }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 78, "outputs": [], "source": [ "subgroup_metrics_df['Model_Name'] = (subgroup_metrics_df['Model_Name'] + '__alpha=' +\n", @@ -135,15 +144,15 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-08T19:53:47.443543Z", - "start_time": "2023-10-08T19:53:47.419472Z" + "end_time": "2023-10-09T18:41:13.161705Z", + "start_time": "2023-10-09T18:41:13.134978Z" } }, "id": "2d922003e752a4b4" }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 79, "outputs": [], "source": [ "models_metrics_dct = dict()\n", @@ -153,21 +162,21 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-08T19:53:47.469996Z", - "start_time": "2023-10-08T19:53:47.443240Z" + "end_time": "2023-10-09T18:41:13.190514Z", + "start_time": "2023-10-09T18:41:13.160460Z" } }, "id": "833484748ed512e8" }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 80, "outputs": [ { "data": { "text/plain": "dict_keys(['LGBMClassifier__alpha=0.7', 'LGBMClassifier__alpha=0.0', 'LGBMClassifier__alpha=0.4', 'LogisticRegression__alpha=0.0', 'LogisticRegression__alpha=0.7', 'LogisticRegression__alpha=0.4', 'MLPClassifier__alpha=0.0', 'MLPClassifier__alpha=0.7', 'MLPClassifier__alpha=0.4', 'RandomForestClassifier__alpha=0.4', 'RandomForestClassifier__alpha=0.7', 'RandomForestClassifier__alpha=0.0'])" }, - "execution_count": 9, + "execution_count": 80, "metadata": {}, "output_type": "execute_result" } @@ -178,8 +187,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-08T19:53:47.513710Z", - "start_time": "2023-10-08T19:53:47.469016Z" + "end_time": "2023-10-09T18:41:13.212492Z", + "start_time": "2023-10-09T18:41:13.189317Z" } }, "id": "15ed7d1ba1f22317" @@ -194,12 +203,12 @@ }, { "cell_type": "code", - "execution_count": 70, + "execution_count": 110, "id": "435b9d98", "metadata": { "ExecuteTime": { - "end_time": "2023-10-08T22:12:56.138844Z", - "start_time": "2023-10-08T22:12:56.085891Z" + "end_time": "2023-10-09T21:33:22.941196Z", + "start_time": "2023-10-09T21:33:22.653493Z" } }, "outputs": [], @@ -229,14 +238,14 @@ "collapsed": false, "is_executing": true, "ExecuteTime": { - "start_time": "2023-10-08T22:12:56.178820Z" + "start_time": "2023-10-09T21:33:23.302903Z" } }, "id": "678a9dc8d51243f4" }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 83, "outputs": [ { "name": "stdout", @@ -252,19 +261,23 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-08T20:42:21.447796Z", - "start_time": "2023-10-08T20:42:21.325905Z" + "end_time": "2023-10-09T18:43:18.507269Z", + "start_time": "2023-10-09T18:43:18.460630Z" } }, "id": "277b6d1de837dab7" }, { "cell_type": "code", - "execution_count": null, + "execution_count": 83, "outputs": [], "source": [], "metadata": { - "collapsed": false + "collapsed": false, + "ExecuteTime": { + "end_time": "2023-10-09T18:43:18.509920Z", + "start_time": "2023-10-09T18:43:18.506670Z" + } }, "id": "c207d4345ddca1db" } diff --git a/virny/custom_classes/metrics_interactive_visualizer.py b/virny/custom_classes/metrics_interactive_visualizer.py index aa2ef476..65cbde38 100644 --- a/virny/custom_classes/metrics_interactive_visualizer.py +++ b/virny/custom_classes/metrics_interactive_visualizer.py @@ -25,6 +25,7 @@ class MetricsInteractiveVisualizer: def __init__(self, model_metrics_dct: dict, model_composed_metrics_df: pd.DataFrame, sensitive_attributes_dct: dict): self.demo = None + self.max_groups = 8 self.model_names = list(model_metrics_dct.keys()) self.sensitive_attributes_dct = sensitive_attributes_dct self.group_names = list(self.sensitive_attributes_dct.keys()) @@ -63,8 +64,53 @@ def _align_input_metric_df(self, model_metrics_df: pd.DataFrame, allowed_cols: l return model_metrics_df[filtered_cols] + def __variable_inputs(self, k): + k = int(k) + return [gr.Textbox(value='', visible=True)] * k + [gr.Textbox(value='', visible=False)] * (self.max_groups - k) + + def _test(self, grp_name1, grp_name2, grp_name3, grp_name4, grp_name5, grp_name6, grp_name7, grp_name8, + grp_dis_val1, grp_dis_val2, grp_dis_val3, grp_dis_val4, grp_dis_val5, grp_dis_val6, grp_dis_val7, grp_dis_val8): + grp_names = [grp_name1, grp_name2, grp_name3, grp_name4, grp_name5, grp_name6, grp_name7, grp_name8] + grp_names = [grp for grp in grp_names if grp != '' and grp is not None] + grp_dis_values = [grp_dis_val1, grp_dis_val2, grp_dis_val3, grp_dis_val4, grp_dis_val5, grp_dis_val6, grp_dis_val7, grp_dis_val8] + grp_dis_values = [grp for grp in grp_dis_values if grp != '' and grp is not None] + + inp_str1 = ' '.join(grp_names) + '.' + inp_str2 = ' '.join(grp_dis_values) + '.' + + return inp_str1 + ' | ' + inp_str2 + def start_web_app(self): with gr.Blocks(theme=gr.themes.Soft()) as demo: + # ==================================== Dataset Statistics ==================================== + gr.Markdown( + """ + ## Dataset Statistics + """) + with gr.Row(): + with gr.Column(scale=2): + default_val = 5 + s = gr.Slider(1, self.max_groups, value=default_val, step=1, label="How many groups to show:") + grp_names = [] + grp_dis_values = [] + for i in range(self.max_groups): + visibility = True if i + 1 <= default_val else False + with gr.Row(): + grp_name = gr.Text(label=f"Group {i + 1}", interactive=True, visible=visibility) + grp_dis_value = gr.Text(label="Disadvantage value", interactive=True, visible=visibility) + grp_names.append(grp_name) + grp_dis_values.append(grp_dis_value) + + s.change(self.__variable_inputs, s, grp_names) + s.change(self.__variable_inputs, s, grp_dis_values) + btn_view0 = gr.Button("Submit") + with gr.Column(scale=3): + test_output = gr.Text(label="Test") + + btn_view0.click(self._test, + inputs=[grp_names[0], grp_names[1], grp_names[2], grp_names[3], grp_names[4], grp_names[5], grp_names[6], grp_names[7], + grp_dis_values[0], grp_dis_values[1], grp_dis_values[2], grp_dis_values[3], grp_dis_values[4], grp_dis_values[5], grp_dis_values[6], grp_dis_values[7]], + outputs=[test_output]) # ==================================== Bar Chart for Model Selection ==================================== gr.Markdown( """ diff --git a/virny/utils/data_viz_utils.py b/virny/utils/data_viz_utils.py index d251cd1a..bed7deda 100644 --- a/virny/utils/data_viz_utils.py +++ b/virny/utils/data_viz_utils.py @@ -54,7 +54,7 @@ def rank_with_tolerance(pd_series: pd.Series, tolerance: float = 0.01, method: s tolerance += 1e-10 # Add 0.0000000001 for correct comparison of float numbers vals = pd.Series(pd_series.unique()).sort_values() vals.index = vals - vals = vals.mask(vals - vals.shift(1) <= tolerance, vals.shift(1)) + vals = vals.mask(vals - vals.shift(1) < tolerance, vals.shift(1)) return pd_series.map(vals).fillna(pd_series).rank(method=method) From 97ccb6fe20e4924813fc8124528f44223dd5ac40 Mon Sep 17 00:00:00 2001 From: denysgerasymuk799 Date: Tue, 10 Oct 2023 02:23:31 +0300 Subject: [PATCH 17/36] Added subgroup proportions and base rates --- ...Multiple_Models_Interface_Vis_Income.ipynb | 38 +++++---- .../metrics_interactive_visualizer.py | 84 ++++++++++++++----- virny/utils/data_viz_utils.py | 70 ++++++++++++++++ 3 files changed, 154 insertions(+), 38 deletions(-) diff --git a/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb b/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb index 4285f1df..88159598 100644 --- a/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb +++ b/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb @@ -81,12 +81,12 @@ }, { "cell_type": "code", - "execution_count": 75, + "execution_count": 113, "id": "7a9241de", "metadata": { "ExecuteTime": { - "end_time": "2023-10-09T18:41:13.071700Z", - "start_time": "2023-10-09T18:41:13.047422Z" + "end_time": "2023-10-09T22:39:14.946035Z", + "start_time": "2023-10-09T22:39:14.899470Z" } }, "outputs": [], @@ -94,21 +94,23 @@ "import os\n", "import pandas as pd\n", "\n", + "from virny.datasets import ACSIncomeDataset\n", "from virny.custom_classes.metrics_interactive_visualizer import MetricsInteractiveVisualizer" ] }, { "cell_type": "code", - "execution_count": 76, + "execution_count": 114, "outputs": [], "source": [ + "data_loader = ACSIncomeDataset(state=['GA'], year=2018, with_nulls=False, subsample_size=15_000, subsample_seed=42)\n", "sensitive_attributes_dct = {'SEX': '2', 'RAC1P': ['2', '3', '4', '5', '6', '7', '8', '9'], 'SEX&RAC1P': None}" ], "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-09T18:41:13.095787Z", - "start_time": "2023-10-09T18:41:13.071607Z" + "end_time": "2023-10-09T22:39:18.249850Z", + "start_time": "2023-10-09T22:39:16.778059Z" } }, "id": "d3c53c7b72ecbcd0" @@ -203,23 +205,24 @@ }, { "cell_type": "code", - "execution_count": 110, + "execution_count": 175, "id": "435b9d98", "metadata": { "ExecuteTime": { - "end_time": "2023-10-09T21:33:22.941196Z", - "start_time": "2023-10-09T21:33:22.653493Z" + "end_time": "2023-10-09T23:21:39.540076Z", + "start_time": "2023-10-09T23:21:39.222249Z" } }, "outputs": [], "source": [ - "visualizer = MetricsInteractiveVisualizer(models_metrics_dct, models_composed_metrics_df,\n", + "visualizer = MetricsInteractiveVisualizer(data_loader.X_data, data_loader.y_data,\n", + " models_metrics_dct, models_composed_metrics_df,\n", " sensitive_attributes_dct=sensitive_attributes_dct)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 176, "outputs": [ { "name": "stdout", @@ -227,7 +230,8 @@ "text": [ "Running on local URL: http://127.0.0.1:7860\n", "\n", - "To create a public link, set `share=True` in `launch()`.\n" + "To create a public link, set `share=True` in `launch()`.\n", + "Keyboard interruption in main thread... closing server.\n" ] } ], @@ -236,16 +240,16 @@ ], "metadata": { "collapsed": false, - "is_executing": true, "ExecuteTime": { - "start_time": "2023-10-09T21:33:23.302903Z" + "end_time": "2023-10-09T23:23:14.184149Z", + "start_time": "2023-10-09T23:21:39.540354Z" } }, "id": "678a9dc8d51243f4" }, { "cell_type": "code", - "execution_count": 83, + "execution_count": 130, "outputs": [ { "name": "stdout", @@ -261,8 +265,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-09T18:43:18.507269Z", - "start_time": "2023-10-09T18:43:18.460630Z" + "end_time": "2023-10-09T22:55:30.303832Z", + "start_time": "2023-10-09T22:55:29.989601Z" } }, "id": "277b6d1de837dab7" diff --git a/virny/custom_classes/metrics_interactive_visualizer.py b/virny/custom_classes/metrics_interactive_visualizer.py index 65cbde38..7fee74e1 100644 --- a/virny/custom_classes/metrics_interactive_visualizer.py +++ b/virny/custom_classes/metrics_interactive_visualizer.py @@ -2,9 +2,11 @@ import gradio as gr import altair as alt -from virny.utils.common_helpers import isfloat_regex, str_to_float +from virny.utils.common_helpers import str_to_float +from virny.utils.protected_groups_partitioning import create_test_protected_groups from virny.utils.data_viz_utils import (create_model_rank_heatmap_visualization, create_sorted_matrix_by_rank, - create_subgroup_sorted_matrix_by_rank, create_bar_plot_for_model_selection) + create_subgroup_sorted_matrix_by_rank, create_bar_plot_for_model_selection, + compute_proportions, compute_base_rates, create_col_facet_bar_chart) class MetricsInteractiveVisualizer: @@ -13,6 +15,10 @@ class MetricsInteractiveVisualizer: Parameters ---------- + X_data + An original features dataframe + y_data + An original target column pandas series model_metrics_dct Dictionary where keys are model names and values are dataframes of subgroup metrics for each model model_composed_metrics_df @@ -22,14 +28,18 @@ class MetricsInteractiveVisualizer: and values are privilege values for these attributes """ - def __init__(self, model_metrics_dct: dict, model_composed_metrics_df: pd.DataFrame, - sensitive_attributes_dct: dict): - self.demo = None - self.max_groups = 8 + def __init__(self, X_data: pd.DataFrame, y_data: pd.DataFrame, model_metrics_dct: dict, + model_composed_metrics_df: pd.DataFrame, sensitive_attributes_dct: dict): + self.X_data = X_data + self.y_data = y_data self.model_names = list(model_metrics_dct.keys()) self.sensitive_attributes_dct = sensitive_attributes_dct self.group_names = list(self.sensitive_attributes_dct.keys()) + # Technical attributes + self.demo = None + self.max_groups = 8 + # Create one metrics df with all model_dfs models_metrics_df = pd.DataFrame() for model_name in model_metrics_dct.keys(): @@ -68,18 +78,6 @@ def __variable_inputs(self, k): k = int(k) return [gr.Textbox(value='', visible=True)] * k + [gr.Textbox(value='', visible=False)] * (self.max_groups - k) - def _test(self, grp_name1, grp_name2, grp_name3, grp_name4, grp_name5, grp_name6, grp_name7, grp_name8, - grp_dis_val1, grp_dis_val2, grp_dis_val3, grp_dis_val4, grp_dis_val5, grp_dis_val6, grp_dis_val7, grp_dis_val8): - grp_names = [grp_name1, grp_name2, grp_name3, grp_name4, grp_name5, grp_name6, grp_name7, grp_name8] - grp_names = [grp for grp in grp_names if grp != '' and grp is not None] - grp_dis_values = [grp_dis_val1, grp_dis_val2, grp_dis_val3, grp_dis_val4, grp_dis_val5, grp_dis_val6, grp_dis_val7, grp_dis_val8] - grp_dis_values = [grp for grp in grp_dis_values if grp != '' and grp is not None] - - inp_str1 = ' '.join(grp_names) + '.' - inp_str2 = ' '.join(grp_dis_values) + '.' - - return inp_str1 + ' | ' + inp_str2 - def start_web_app(self): with gr.Blocks(theme=gr.themes.Soft()) as demo: # ==================================== Dataset Statistics ==================================== @@ -105,12 +103,12 @@ def start_web_app(self): s.change(self.__variable_inputs, s, grp_dis_values) btn_view0 = gr.Button("Submit") with gr.Column(scale=3): - test_output = gr.Text(label="Test") + dataset_proportions_bar_chart = gr.Plot(label="Subgroup Proportions and Base Rates") - btn_view0.click(self._test, + btn_view0.click(self._create_dataset_proportions_bar_chart, inputs=[grp_names[0], grp_names[1], grp_names[2], grp_names[3], grp_names[4], grp_names[5], grp_names[6], grp_names[7], grp_dis_values[0], grp_dis_values[1], grp_dis_values[2], grp_dis_values[3], grp_dis_values[4], grp_dis_values[5], grp_dis_values[6], grp_dis_values[7]], - outputs=[test_output]) + outputs=[dataset_proportions_bar_chart]) # ==================================== Bar Chart for Model Selection ==================================== gr.Markdown( """ @@ -311,6 +309,50 @@ def __filter_subgroup_metrics_df(self, results: dict, subgroup_metric: str, return results + def _create_dataset_proportions_bar_chart(self, grp_name1, grp_name2, grp_name3, grp_name4, grp_name5, grp_name6, grp_name7, grp_name8, + grp_dis_val1, grp_dis_val2, grp_dis_val3, grp_dis_val4, grp_dis_val5, grp_dis_val6, grp_dis_val7, grp_dis_val8): + grp_names = [grp_name1, grp_name2, grp_name3, grp_name4, grp_name5, grp_name6, grp_name7, grp_name8] + grp_names = [grp for grp in grp_names if grp != '' and grp is not None] + grp_dis_values = [grp_dis_val1, grp_dis_val2, grp_dis_val3, grp_dis_val4, grp_dis_val5, grp_dis_val6, grp_dis_val7, grp_dis_val8] + grp_dis_values = [grp for grp in grp_dis_values if grp != '' and grp is not None] + + # Create a sensitive attrs dict + input_sensitive_attrs_dct = dict() + for grp_name, grp_dis_val in zip(grp_names, grp_dis_values): + if '&' in grp_name: + input_sensitive_attrs_dct[grp_name] = None + else: + converted_grp_dis_val = eval(grp_dis_val) if '[' in grp_dis_val else grp_dis_val + input_sensitive_attrs_dct[grp_name] = converted_grp_dis_val + + # Partition on protected groups + protected_groups = create_test_protected_groups(self.X_data, self.X_data, input_sensitive_attrs_dct) + + # Create a df with group proportions and group base rates + subgroup_proportions_dct = compute_proportions(protected_groups, self.X_data) + subgroup_base_rates_dct = compute_base_rates(protected_groups, self.y_data) + subgroup_relative_base_rates_dct = dict() + for subgroup in subgroup_proportions_dct.keys(): + subgroup_relative_base_rates_dct[subgroup] = subgroup_base_rates_dct[subgroup] * subgroup_proportions_dct[subgroup] + + stats_df = pd.DataFrame(columns=['Subgroup', 'Value', 'Statistics_Type']) + for subgroup in subgroup_proportions_dct.keys(): + stats_df.loc[len(stats_df.index)] = [subgroup, subgroup_proportions_dct[subgroup], 'Proportion'] + stats_df.loc[len(stats_df.index)] = [subgroup, subgroup_relative_base_rates_dct[subgroup], 'Base_Rate'] + + # Create a row facet bar chart + col_facet_sort_by_lst = ['overall'] + [grp for grp in stats_df.Subgroup.unique() if grp.lower() != 'overall'] + col_facet_bar_chart = create_col_facet_bar_chart(stats_df, + x_col='Statistics_Type', + y_col='Value', + col_facet_by='Subgroup', + x_sort_by_lst=['Proportion', 'Base_Rate'], + col_facet_sort_by_lst=col_facet_sort_by_lst, + color_legend_title='Statistics Type', + facet_title='') + + return col_facet_bar_chart + def _create_bar_plot_for_model_selection(self, group_name, accuracy_metric, acc_min_val, acc_max_val, fairness_metric, fairness_min_val, fairness_max_val, subgroup_stability_metric, subgroup_stab_min_val, subgroup_stab_max_val, diff --git a/virny/utils/data_viz_utils.py b/virny/utils/data_viz_utils.py index bed7deda..6de8921c 100644 --- a/virny/utils/data_viz_utils.py +++ b/virny/utils/data_viz_utils.py @@ -4,6 +4,7 @@ import seaborn as sns from matplotlib import pyplot as plt +from altair.utils.schemapi import Undefined from virny.utils.common_helpers import check_substring_in_list @@ -59,6 +60,26 @@ def rank_with_tolerance(pd_series: pd.Series, tolerance: float = 0.01, method: s return pd_series.map(vals).fillna(pd_series).rank(method=method) +def compute_proportions(protected_groups, X_data): + subgroup_proportions_dct = {'overall': 1.0} + for col_name in protected_groups.keys(): + proportion = protected_groups[col_name].shape[0] / X_data.shape[0] + subgroup_proportions_dct[col_name] = proportion + + return subgroup_proportions_dct + + +def compute_base_rates(protected_groups, y_data): + overall_base_rate = y_data[y_data == 1].shape[0] / y_data.shape[0] + subgroup_base_rates_dct = {'overall': overall_base_rate} + for col_name in protected_groups.keys(): + filtered_df = y_data.iloc[protected_groups[col_name].index].copy(deep=True) + base_rate = filtered_df[filtered_df == 1].shape[0] / filtered_df.shape[0] + subgroup_base_rates_dct[col_name] = base_rate + + return subgroup_base_rates_dct + + def create_sorted_matrix_by_rank(model_metrics_matrix, tolerance) -> np.array: models_distances_matrix = model_metrics_matrix.copy(deep=True).T metric_names = models_distances_matrix.columns @@ -94,6 +115,55 @@ def create_subgroup_sorted_matrix_by_rank(model_metrics_matrix, tolerance) -> np return sorted_matrix_by_rank +def create_col_facet_bar_chart(df, x_col, y_col, col_facet_by, x_sort_by_lst=Undefined, + col_facet_sort_by_lst=Undefined, color_legend_title=Undefined, facet_title=Undefined): + base_font_size = 16 + bar_chart = ( + alt.Chart().mark_bar().encode( + alt.X(f'{x_col}:N', axis=None, sort=x_sort_by_lst), + alt.Y(f'{y_col}:Q', axis=alt.Axis(grid=True), title=''), + alt.Color(f'{x_col}:N', + scale=alt.Scale(scheme="tableau20"), + sort=x_sort_by_lst, + legend=alt.Legend(title=color_legend_title, + labelFontSize=base_font_size, + titleFontSize=base_font_size + 2, + orient='top')) + ) + ) + + text_labels = ( + bar_chart.mark_text( + baseline='middle', + fontSize=base_font_size, + dy=-10 + ).encode( + text=alt.Text('Value:Q', format=",.3f"), + color=alt.value("black") + ) + ) + + final_chart = ( + alt.layer( + bar_chart, text_labels, data=df + ).properties( + width=100, + height=500 + ).facet( + column=alt.Column(f'{col_facet_by}:N', title=facet_title, sort=col_facet_sort_by_lst) + ).configure( + padding={'top': 33}, + ).configure_headerColumn( + labelFontSize=base_font_size, + titleFontSize=base_font_size + 2 + ).configure_axis( + labelFontSize=base_font_size, titleFontSize=base_font_size + 2 + ) + ) + + return final_chart + + def create_model_rank_heatmap_visualization(model_metrics_matrix, sorted_matrix_by_rank): """ This heatmap includes group fairness and stability metrics and defined models. From ab3410437de3dafa8469ba7ffaa35662b2ce544e Mon Sep 17 00:00:00 2001 From: denysgerasymuk799 Date: Tue, 10 Oct 2023 22:27:53 +0300 Subject: [PATCH 18/36] Changed a default range for Label_Stability_Ratio --- ...Multiple_Models_Interface_Vis_Income.ipynb | 137 +++++++++++++++++- .../metrics_interactive_visualizer.py | 6 +- 2 files changed, 132 insertions(+), 11 deletions(-) diff --git a/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb b/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb index 88159598..08e31492 100644 --- a/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb +++ b/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb @@ -205,12 +205,12 @@ }, { "cell_type": "code", - "execution_count": 175, + "execution_count": 179, "id": "435b9d98", "metadata": { "ExecuteTime": { - "end_time": "2023-10-09T23:21:39.540076Z", - "start_time": "2023-10-09T23:21:39.222249Z" + "end_time": "2023-10-10T14:50:17.837898Z", + "start_time": "2023-10-10T14:50:17.676305Z" } }, "outputs": [], @@ -222,7 +222,7 @@ }, { "cell_type": "code", - "execution_count": 176, + "execution_count": null, "outputs": [ { "name": "stdout", @@ -230,8 +230,129 @@ "text": [ "Running on local URL: http://127.0.0.1:7860\n", "\n", - "To create a public link, set `share=True` in `launch()`.\n", - "Keyboard interruption in main thread... closing server.\n" + "To create a public link, set `share=True` in `launch()`.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/routes.py\", line 538, in predict\n", + " output = await route_utils.call_process_api(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/route_utils.py\", line 217, in call_process_api\n", + " output = await app.get_blocks().process_api(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/blocks.py\", line 1553, in process_api\n", + " result = await self.call_function(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/blocks.py\", line 1191, in call_function\n", + " prediction = await anyio.to_thread.run_sync(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/to_thread.py\", line 33, in run_sync\n", + " return await get_asynclib().run_sync_in_worker_thread(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/_backends/_asyncio.py\", line 877, in run_sync_in_worker_thread\n", + " return await future\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/_backends/_asyncio.py\", line 807, in run\n", + " result = context.run(func, *args)\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/utils.py\", line 659, in wrapper\n", + " response = f(*args, **kwargs)\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/custom_classes/metrics_interactive_visualizer.py\", line 329, in _create_dataset_proportions_bar_chart\n", + " protected_groups = create_test_protected_groups(self.X_data, self.X_data, input_sensitive_attrs_dct)\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/utils/protected_groups_partitioning.py\", line 73, in create_test_protected_groups\n", + " X_test_with_sensitive_attrs = init_features_df[plain_sensitive_attributes].loc[X_test.index]\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/pandas/core/frame.py\", line 3813, in __getitem__\n", + " indexer = self.columns._get_indexer_strict(key, \"columns\")[1]\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/pandas/core/indexes/base.py\", line 6070, in _get_indexer_strict\n", + " self._raise_if_missing(keyarr, indexer, axis_name)\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/pandas/core/indexes/base.py\", line 6133, in _raise_if_missing\n", + " raise KeyError(f\"{not_found} not in index\")\n", + "KeyError: \"['DIS', 'AGE'] not in index\"\n", + "Traceback (most recent call last):\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/routes.py\", line 538, in predict\n", + " output = await route_utils.call_process_api(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/route_utils.py\", line 217, in call_process_api\n", + " output = await app.get_blocks().process_api(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/blocks.py\", line 1553, in process_api\n", + " result = await self.call_function(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/blocks.py\", line 1191, in call_function\n", + " prediction = await anyio.to_thread.run_sync(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/to_thread.py\", line 33, in run_sync\n", + " return await get_asynclib().run_sync_in_worker_thread(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/_backends/_asyncio.py\", line 877, in run_sync_in_worker_thread\n", + " return await future\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/_backends/_asyncio.py\", line 807, in run\n", + " result = context.run(func, *args)\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/utils.py\", line 659, in wrapper\n", + " response = f(*args, **kwargs)\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/custom_classes/metrics_interactive_visualizer.py\", line 329, in _create_dataset_proportions_bar_chart\n", + " protected_groups = create_test_protected_groups(self.X_data, self.X_data, input_sensitive_attrs_dct)\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/utils/protected_groups_partitioning.py\", line 96, in create_test_protected_groups\n", + " raise ValueError(f\"Protected group ({dis_grp_name}) from X_test is empty. \"\n", + "ValueError: Protected group (AGEP_dis) from X_test is empty. Please check types of sensitive attributes in config or replace the sensitive attribute\n", + "Traceback (most recent call last):\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/routes.py\", line 538, in predict\n", + " output = await route_utils.call_process_api(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/route_utils.py\", line 217, in call_process_api\n", + " output = await app.get_blocks().process_api(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/blocks.py\", line 1553, in process_api\n", + " result = await self.call_function(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/blocks.py\", line 1191, in call_function\n", + " prediction = await anyio.to_thread.run_sync(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/to_thread.py\", line 33, in run_sync\n", + " return await get_asynclib().run_sync_in_worker_thread(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/_backends/_asyncio.py\", line 877, in run_sync_in_worker_thread\n", + " return await future\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/_backends/_asyncio.py\", line 807, in run\n", + " result = context.run(func, *args)\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/utils.py\", line 659, in wrapper\n", + " response = f(*args, **kwargs)\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/custom_classes/metrics_interactive_visualizer.py\", line 329, in _create_dataset_proportions_bar_chart\n", + " protected_groups = create_test_protected_groups(self.X_data, self.X_data, input_sensitive_attrs_dct)\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/utils/protected_groups_partitioning.py\", line 96, in create_test_protected_groups\n", + " raise ValueError(f\"Protected group ({dis_grp_name}) from X_test is empty. \"\n", + "ValueError: Protected group (AGEP_dis) from X_test is empty. Please check types of sensitive attributes in config or replace the sensitive attribute\n", + "Traceback (most recent call last):\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/routes.py\", line 538, in predict\n", + " output = await route_utils.call_process_api(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/route_utils.py\", line 217, in call_process_api\n", + " output = await app.get_blocks().process_api(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/blocks.py\", line 1553, in process_api\n", + " result = await self.call_function(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/blocks.py\", line 1191, in call_function\n", + " prediction = await anyio.to_thread.run_sync(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/to_thread.py\", line 33, in run_sync\n", + " return await get_asynclib().run_sync_in_worker_thread(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/_backends/_asyncio.py\", line 877, in run_sync_in_worker_thread\n", + " return await future\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/_backends/_asyncio.py\", line 807, in run\n", + " result = context.run(func, *args)\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/utils.py\", line 659, in wrapper\n", + " response = f(*args, **kwargs)\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/custom_classes/metrics_interactive_visualizer.py\", line 329, in _create_dataset_proportions_bar_chart\n", + " protected_groups = create_test_protected_groups(self.X_data, self.X_data, input_sensitive_attrs_dct)\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/utils/protected_groups_partitioning.py\", line 96, in create_test_protected_groups\n", + " raise ValueError(f\"Protected group ({dis_grp_name}) from X_test is empty. \"\n", + "ValueError: Protected group (AGEP_dis) from X_test is empty. Please check types of sensitive attributes in config or replace the sensitive attribute\n", + "Traceback (most recent call last):\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/routes.py\", line 538, in predict\n", + " output = await route_utils.call_process_api(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/route_utils.py\", line 217, in call_process_api\n", + " output = await app.get_blocks().process_api(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/blocks.py\", line 1553, in process_api\n", + " result = await self.call_function(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/blocks.py\", line 1191, in call_function\n", + " prediction = await anyio.to_thread.run_sync(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/to_thread.py\", line 33, in run_sync\n", + " return await get_asynclib().run_sync_in_worker_thread(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/_backends/_asyncio.py\", line 877, in run_sync_in_worker_thread\n", + " return await future\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/_backends/_asyncio.py\", line 807, in run\n", + " result = context.run(func, *args)\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/utils.py\", line 659, in wrapper\n", + " response = f(*args, **kwargs)\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/custom_classes/metrics_interactive_visualizer.py\", line 329, in _create_dataset_proportions_bar_chart\n", + " protected_groups = create_test_protected_groups(self.X_data, self.X_data, input_sensitive_attrs_dct)\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/utils/protected_groups_partitioning.py\", line 96, in create_test_protected_groups\n", + " raise ValueError(f\"Protected group ({dis_grp_name}) from X_test is empty. \"\n", + "ValueError: Protected group (AGEP_dis) from X_test is empty. Please check types of sensitive attributes in config or replace the sensitive attribute\n" ] } ], @@ -240,9 +361,9 @@ ], "metadata": { "collapsed": false, + "is_executing": true, "ExecuteTime": { - "end_time": "2023-10-09T23:23:14.184149Z", - "start_time": "2023-10-09T23:21:39.540354Z" + "start_time": "2023-10-10T14:50:17.852688Z" } }, "id": "678a9dc8d51243f4" diff --git a/virny/custom_classes/metrics_interactive_visualizer.py b/virny/custom_classes/metrics_interactive_visualizer.py index 7fee74e1..50c2fadc 100644 --- a/virny/custom_classes/metrics_interactive_visualizer.py +++ b/virny/custom_classes/metrics_interactive_visualizer.py @@ -76,7 +76,7 @@ def _align_input_metric_df(self, model_metrics_df: pd.DataFrame, allowed_cols: l def __variable_inputs(self, k): k = int(k) - return [gr.Textbox(value='', visible=True)] * k + [gr.Textbox(value='', visible=False)] * (self.max_groups - k) + return [gr.Textbox(visible=True)] * k + [gr.Textbox(value='', visible=False)] * (self.max_groups - k) def start_web_app(self): with gr.Blocks(theme=gr.themes.Soft()) as demo: @@ -151,8 +151,8 @@ def start_web_app(self): value='Label_Stability_Ratio', multiselect=False, label="Constraint 4 (C4)", scale=2 ) - group_stab_min_val = gr.Text(value="0.1", label="Min value", scale=1) - group_stab_max_val = gr.Text(value="10.0", label="Max value", scale=1) + group_stab_min_val = gr.Text(value="0.7", label="Min value", scale=1) + group_stab_max_val = gr.Text(value="1.5", label="Max value", scale=1) btn_view1 = gr.Button("Submit") with gr.Column(scale=3): bar_plot_for_model_selection = gr.Plot(label="Bar Chart") From 84cf426e8c90b7dc601d10a39835ab11889febd6 Mon Sep 17 00:00:00 2001 From: denysgerasymuk799 Date: Wed, 11 Oct 2023 23:02:18 +0300 Subject: [PATCH 19/36] Restructured section 3 in the gradio app --- ...Multiple_Models_Interface_Vis_Income.ipynb | 209 ++++-------------- .../metrics_interactive_visualizer.py | 64 +++--- 2 files changed, 73 insertions(+), 200 deletions(-) diff --git a/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb b/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb index 08e31492..cd39444c 100644 --- a/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb +++ b/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb @@ -2,24 +2,15 @@ "cells": [ { "cell_type": "code", - "execution_count": 72, + "execution_count": 1, "id": "248cbed8", "metadata": { "ExecuteTime": { - "end_time": "2023-10-09T18:41:13.001910Z", - "start_time": "2023-10-09T18:41:12.938067Z" + "end_time": "2023-10-11T19:05:26.386191Z", + "start_time": "2023-10-11T19:05:25.944121Z" } }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The autoreload extension is already loaded. To reload it, use:\n", - " %reload_ext autoreload\n" - ] - } - ], + "outputs": [], "source": [ "%matplotlib inline\n", "%load_ext autoreload\n", @@ -28,12 +19,12 @@ }, { "cell_type": "code", - "execution_count": 73, + "execution_count": 2, "id": "7ec6cd08", "metadata": { "ExecuteTime": { - "end_time": "2023-10-09T18:41:13.042184Z", - "start_time": "2023-10-09T18:41:13.000213Z" + "end_time": "2023-10-11T19:05:26.394513Z", + "start_time": "2023-10-11T19:05:26.385903Z" } }, "outputs": [], @@ -46,12 +37,12 @@ }, { "cell_type": "code", - "execution_count": 74, + "execution_count": 3, "id": "b8cb69f2", "metadata": { "ExecuteTime": { - "end_time": "2023-10-09T18:41:13.046945Z", - "start_time": "2023-10-09T18:41:13.024368Z" + "end_time": "2023-10-11T19:05:26.404007Z", + "start_time": "2023-10-11T19:05:26.395039Z" } }, "outputs": [ @@ -81,12 +72,12 @@ }, { "cell_type": "code", - "execution_count": 113, + "execution_count": 4, "id": "7a9241de", "metadata": { "ExecuteTime": { - "end_time": "2023-10-09T22:39:14.946035Z", - "start_time": "2023-10-09T22:39:14.899470Z" + "end_time": "2023-10-11T19:05:28.926284Z", + "start_time": "2023-10-11T19:05:26.405380Z" } }, "outputs": [], @@ -100,7 +91,7 @@ }, { "cell_type": "code", - "execution_count": 114, + "execution_count": 5, "outputs": [], "source": [ "data_loader = ACSIncomeDataset(state=['GA'], year=2018, with_nulls=False, subsample_size=15_000, subsample_seed=42)\n", @@ -109,15 +100,15 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-09T22:39:18.249850Z", - "start_time": "2023-10-09T22:39:16.778059Z" + "end_time": "2023-10-11T19:05:30.217781Z", + "start_time": "2023-10-11T19:05:28.929275Z" } }, "id": "d3c53c7b72ecbcd0" }, { "cell_type": "code", - "execution_count": 77, + "execution_count": 6, "outputs": [], "source": [ "ROOT_DIR = os.path.join('docs', 'examples')\n", @@ -127,15 +118,15 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-09T18:41:13.134622Z", - "start_time": "2023-10-09T18:41:13.094182Z" + "end_time": "2023-10-11T19:05:30.244888Z", + "start_time": "2023-10-11T19:05:30.218209Z" } }, "id": "2aab7c79ecdee914" }, { "cell_type": "code", - "execution_count": 78, + "execution_count": 7, "outputs": [], "source": [ "subgroup_metrics_df['Model_Name'] = (subgroup_metrics_df['Model_Name'] + '__alpha=' +\n", @@ -146,15 +137,15 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-09T18:41:13.161705Z", - "start_time": "2023-10-09T18:41:13.134978Z" + "end_time": "2023-10-11T19:05:30.270595Z", + "start_time": "2023-10-11T19:05:30.245746Z" } }, "id": "2d922003e752a4b4" }, { "cell_type": "code", - "execution_count": 79, + "execution_count": 8, "outputs": [], "source": [ "models_metrics_dct = dict()\n", @@ -164,21 +155,21 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-09T18:41:13.190514Z", - "start_time": "2023-10-09T18:41:13.160460Z" + "end_time": "2023-10-11T19:05:30.292095Z", + "start_time": "2023-10-11T19:05:30.268258Z" } }, "id": "833484748ed512e8" }, { "cell_type": "code", - "execution_count": 80, + "execution_count": 9, "outputs": [ { "data": { "text/plain": "dict_keys(['LGBMClassifier__alpha=0.7', 'LGBMClassifier__alpha=0.0', 'LGBMClassifier__alpha=0.4', 'LogisticRegression__alpha=0.0', 'LogisticRegression__alpha=0.7', 'LogisticRegression__alpha=0.4', 'MLPClassifier__alpha=0.0', 'MLPClassifier__alpha=0.7', 'MLPClassifier__alpha=0.4', 'RandomForestClassifier__alpha=0.4', 'RandomForestClassifier__alpha=0.7', 'RandomForestClassifier__alpha=0.0'])" }, - "execution_count": 80, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -189,8 +180,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-09T18:41:13.212492Z", - "start_time": "2023-10-09T18:41:13.189317Z" + "end_time": "2023-10-11T19:05:30.316436Z", + "start_time": "2023-10-11T19:05:30.292589Z" } }, "id": "15ed7d1ba1f22317" @@ -205,12 +196,12 @@ }, { "cell_type": "code", - "execution_count": 179, + "execution_count": 49, "id": "435b9d98", "metadata": { "ExecuteTime": { - "end_time": "2023-10-10T14:50:17.837898Z", - "start_time": "2023-10-10T14:50:17.676305Z" + "end_time": "2023-10-11T19:56:39.234085Z", + "start_time": "2023-10-11T19:56:39.056500Z" } }, "outputs": [], @@ -232,128 +223,6 @@ "\n", "To create a public link, set `share=True` in `launch()`.\n" ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Traceback (most recent call last):\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/routes.py\", line 538, in predict\n", - " output = await route_utils.call_process_api(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/route_utils.py\", line 217, in call_process_api\n", - " output = await app.get_blocks().process_api(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/blocks.py\", line 1553, in process_api\n", - " result = await self.call_function(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/blocks.py\", line 1191, in call_function\n", - " prediction = await anyio.to_thread.run_sync(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/to_thread.py\", line 33, in run_sync\n", - " return await get_asynclib().run_sync_in_worker_thread(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/_backends/_asyncio.py\", line 877, in run_sync_in_worker_thread\n", - " return await future\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/_backends/_asyncio.py\", line 807, in run\n", - " result = context.run(func, *args)\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/utils.py\", line 659, in wrapper\n", - " response = f(*args, **kwargs)\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/custom_classes/metrics_interactive_visualizer.py\", line 329, in _create_dataset_proportions_bar_chart\n", - " protected_groups = create_test_protected_groups(self.X_data, self.X_data, input_sensitive_attrs_dct)\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/utils/protected_groups_partitioning.py\", line 73, in create_test_protected_groups\n", - " X_test_with_sensitive_attrs = init_features_df[plain_sensitive_attributes].loc[X_test.index]\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/pandas/core/frame.py\", line 3813, in __getitem__\n", - " indexer = self.columns._get_indexer_strict(key, \"columns\")[1]\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/pandas/core/indexes/base.py\", line 6070, in _get_indexer_strict\n", - " self._raise_if_missing(keyarr, indexer, axis_name)\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/pandas/core/indexes/base.py\", line 6133, in _raise_if_missing\n", - " raise KeyError(f\"{not_found} not in index\")\n", - "KeyError: \"['DIS', 'AGE'] not in index\"\n", - "Traceback (most recent call last):\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/routes.py\", line 538, in predict\n", - " output = await route_utils.call_process_api(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/route_utils.py\", line 217, in call_process_api\n", - " output = await app.get_blocks().process_api(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/blocks.py\", line 1553, in process_api\n", - " result = await self.call_function(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/blocks.py\", line 1191, in call_function\n", - " prediction = await anyio.to_thread.run_sync(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/to_thread.py\", line 33, in run_sync\n", - " return await get_asynclib().run_sync_in_worker_thread(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/_backends/_asyncio.py\", line 877, in run_sync_in_worker_thread\n", - " return await future\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/_backends/_asyncio.py\", line 807, in run\n", - " result = context.run(func, *args)\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/utils.py\", line 659, in wrapper\n", - " response = f(*args, **kwargs)\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/custom_classes/metrics_interactive_visualizer.py\", line 329, in _create_dataset_proportions_bar_chart\n", - " protected_groups = create_test_protected_groups(self.X_data, self.X_data, input_sensitive_attrs_dct)\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/utils/protected_groups_partitioning.py\", line 96, in create_test_protected_groups\n", - " raise ValueError(f\"Protected group ({dis_grp_name}) from X_test is empty. \"\n", - "ValueError: Protected group (AGEP_dis) from X_test is empty. Please check types of sensitive attributes in config or replace the sensitive attribute\n", - "Traceback (most recent call last):\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/routes.py\", line 538, in predict\n", - " output = await route_utils.call_process_api(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/route_utils.py\", line 217, in call_process_api\n", - " output = await app.get_blocks().process_api(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/blocks.py\", line 1553, in process_api\n", - " result = await self.call_function(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/blocks.py\", line 1191, in call_function\n", - " prediction = await anyio.to_thread.run_sync(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/to_thread.py\", line 33, in run_sync\n", - " return await get_asynclib().run_sync_in_worker_thread(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/_backends/_asyncio.py\", line 877, in run_sync_in_worker_thread\n", - " return await future\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/_backends/_asyncio.py\", line 807, in run\n", - " result = context.run(func, *args)\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/utils.py\", line 659, in wrapper\n", - " response = f(*args, **kwargs)\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/custom_classes/metrics_interactive_visualizer.py\", line 329, in _create_dataset_proportions_bar_chart\n", - " protected_groups = create_test_protected_groups(self.X_data, self.X_data, input_sensitive_attrs_dct)\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/utils/protected_groups_partitioning.py\", line 96, in create_test_protected_groups\n", - " raise ValueError(f\"Protected group ({dis_grp_name}) from X_test is empty. \"\n", - "ValueError: Protected group (AGEP_dis) from X_test is empty. Please check types of sensitive attributes in config or replace the sensitive attribute\n", - "Traceback (most recent call last):\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/routes.py\", line 538, in predict\n", - " output = await route_utils.call_process_api(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/route_utils.py\", line 217, in call_process_api\n", - " output = await app.get_blocks().process_api(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/blocks.py\", line 1553, in process_api\n", - " result = await self.call_function(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/blocks.py\", line 1191, in call_function\n", - " prediction = await anyio.to_thread.run_sync(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/to_thread.py\", line 33, in run_sync\n", - " return await get_asynclib().run_sync_in_worker_thread(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/_backends/_asyncio.py\", line 877, in run_sync_in_worker_thread\n", - " return await future\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/_backends/_asyncio.py\", line 807, in run\n", - " result = context.run(func, *args)\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/utils.py\", line 659, in wrapper\n", - " response = f(*args, **kwargs)\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/custom_classes/metrics_interactive_visualizer.py\", line 329, in _create_dataset_proportions_bar_chart\n", - " protected_groups = create_test_protected_groups(self.X_data, self.X_data, input_sensitive_attrs_dct)\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/utils/protected_groups_partitioning.py\", line 96, in create_test_protected_groups\n", - " raise ValueError(f\"Protected group ({dis_grp_name}) from X_test is empty. \"\n", - "ValueError: Protected group (AGEP_dis) from X_test is empty. Please check types of sensitive attributes in config or replace the sensitive attribute\n", - "Traceback (most recent call last):\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/routes.py\", line 538, in predict\n", - " output = await route_utils.call_process_api(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/route_utils.py\", line 217, in call_process_api\n", - " output = await app.get_blocks().process_api(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/blocks.py\", line 1553, in process_api\n", - " result = await self.call_function(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/blocks.py\", line 1191, in call_function\n", - " prediction = await anyio.to_thread.run_sync(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/to_thread.py\", line 33, in run_sync\n", - " return await get_asynclib().run_sync_in_worker_thread(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/_backends/_asyncio.py\", line 877, in run_sync_in_worker_thread\n", - " return await future\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/_backends/_asyncio.py\", line 807, in run\n", - " result = context.run(func, *args)\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/utils.py\", line 659, in wrapper\n", - " response = f(*args, **kwargs)\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/custom_classes/metrics_interactive_visualizer.py\", line 329, in _create_dataset_proportions_bar_chart\n", - " protected_groups = create_test_protected_groups(self.X_data, self.X_data, input_sensitive_attrs_dct)\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/utils/protected_groups_partitioning.py\", line 96, in create_test_protected_groups\n", - " raise ValueError(f\"Protected group ({dis_grp_name}) from X_test is empty. \"\n", - "ValueError: Protected group (AGEP_dis) from X_test is empty. Please check types of sensitive attributes in config or replace the sensitive attribute\n" - ] } ], "source": [ @@ -363,14 +232,14 @@ "collapsed": false, "is_executing": true, "ExecuteTime": { - "start_time": "2023-10-10T14:50:17.852688Z" + "start_time": "2023-10-11T19:56:39.234618Z" } }, "id": "678a9dc8d51243f4" }, { "cell_type": "code", - "execution_count": 130, + "execution_count": 12, "outputs": [ { "name": "stdout", @@ -386,22 +255,22 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-09T22:55:30.303832Z", - "start_time": "2023-10-09T22:55:29.989601Z" + "end_time": "2023-10-11T19:21:09.901993Z", + "start_time": "2023-10-11T19:21:09.806669Z" } }, "id": "277b6d1de837dab7" }, { "cell_type": "code", - "execution_count": 83, + "execution_count": 12, "outputs": [], "source": [], "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-09T18:43:18.509920Z", - "start_time": "2023-10-09T18:43:18.506670Z" + "end_time": "2023-10-11T19:21:09.902311Z", + "start_time": "2023-10-11T19:21:09.899330Z" } }, "id": "c207d4345ddca1db" diff --git a/virny/custom_classes/metrics_interactive_visualizer.py b/virny/custom_classes/metrics_interactive_visualizer.py index 50c2fadc..20d39276 100644 --- a/virny/custom_classes/metrics_interactive_visualizer.py +++ b/virny/custom_classes/metrics_interactive_visualizer.py @@ -119,7 +119,7 @@ def start_web_app(self): with gr.Column(scale=2): group_name = gr.Dropdown( self.group_names, - value=self.group_names[0], multiselect=False, label="Group Name for Parity Metrics", + value=self.group_names[0], multiselect=False, label="Group Name for Disparity Metrics", ) with gr.Row(): accuracy_metric = gr.Dropdown( @@ -197,11 +197,11 @@ def start_web_app(self): subgroup_btn_view2.click(self._create_subgroup_model_rank_heatmap, inputs=[model_names, accuracy_metrics, uncertainty_metrics, subgroup_stability_metrics, subgroup_tolerance], outputs=[subgroup_model_ranking_heatmap]) - # ======================================== Parity Metrics Heatmap ======================================== + # ======================================== Disparity Metrics Heatmap ======================================== gr.Markdown( """ - ## Parity Metrics Heatmap - Select input arguments to create a parity metrics heatmap. + ## Disparity Metrics Heatmap + Select input arguments to create a disparity metrics heatmap. """) with gr.Row(): with gr.Column(scale=1): @@ -212,11 +212,11 @@ def start_web_app(self): group_tolerance = gr.Text(value="0.005", label="Tolerance", info="Define an acceptable tolerance for metric dense ranking.") fairness_metrics = gr.Dropdown( sorted(['Equalized_Odds_TPR', 'Equalized_Odds_FPR', 'Disparate_Impact', 'Statistical_Parity_Difference', 'Accuracy_Parity']), - value=['Equalized_Odds_FPR', 'Equalized_Odds_TPR'], multiselect=True, label="Error Parity Metrics", info="Select error parity metrics to display on the heatmap:", + value=['Equalized_Odds_FPR', 'Equalized_Odds_TPR'], multiselect=True, label="Error Disparity Metrics", info="Select error disparity metrics to display on the heatmap:", ) group_stability_metrics = gr.Dropdown( sorted(['Label_Stability_Ratio', 'IQR_Parity', 'Std_Parity', 'Std_Ratio', 'Jitter_Parity']), - value=['Label_Stability_Ratio', 'Std_Parity'], multiselect=True, label="Stability Parity Metrics", info="Select stability parity metrics to display on the heatmap:", + value=['Label_Stability_Ratio', 'Std_Parity'], multiselect=True, label="Stability Disparity Metrics", info="Select stability disparity metrics to display on the heatmap:", ) group_btn_view2 = gr.Button("Submit") with gr.Column(scale=2): @@ -225,17 +225,26 @@ def start_web_app(self): group_btn_view2.click(self._create_group_model_rank_heatmap, inputs=[model_names, fairness_metrics, group_stability_metrics, group_tolerance], outputs=[group_model_ranking_heatmap]) - # =============================== Subgroup and Group Metrics Bar Chart =============================== + # ============================ Group Specific and Disparity Metrics Bar Charts ============================ with gr.Row(): + # Scale column 1 to a half of a screen with gr.Column(): gr.Markdown( """ - ## Subgroup Metrics Bar Chart + ## Group Specific and Disparity Metrics Bar Charts """) - subgroup_model_names = gr.Dropdown( - sorted(self.model_names), value=sorted(self.model_names)[0], multiselect=False, - label="Model Name", info="Select one model to display on the bar chart:", + model_name_vw3 = gr.Dropdown( + sorted(self.model_names), value=sorted(self.model_names)[0], multiselect=False, scale=1, + label="Model Name", info="Select one model to display on the bar charts:", ) + with gr.Column(): + pass + with gr.Row(): + with gr.Column(): + gr.Markdown( + """ + ### Group Specific Metrics + """) accuracy_metrics = gr.Dropdown( sorted(['Statistical_Bias', 'TPR', 'TNR', 'PPV', 'FNR', 'FPR', 'Accuracy', 'F1']), value=['Accuracy', 'F1'], multiselect=True, label="Accuracy Metrics", info="Select accuracy metrics to display on the heatmap:", @@ -248,37 +257,32 @@ def start_web_app(self): sorted(['Std', 'IQR', 'Jitter', 'Label_Stability']), value=['Jitter', 'Label_Stability'], multiselect=True, label="Stability Metrics", info="Select stability metrics to display on the heatmap:", ) - subgroup_btn_view3 = gr.Button("Submit") + btn_view3 = gr.Button("Submit") with gr.Column(): gr.Markdown( """ - ## Group Metrics Bar Chart + ### Disparity Metrics """) - group_model_names = gr.Dropdown( - sorted(self.model_names), value=sorted(self.model_names)[0], multiselect=False, - label="Model Name", info="Select one model to display on the bar chart:", - ) fairness_metrics = gr.Dropdown( sorted(['Equalized_Odds_TPR', 'Equalized_Odds_FPR', 'Disparate_Impact', 'Statistical_Parity_Difference', 'Accuracy_Parity']), - value=['Equalized_Odds_FPR', 'Equalized_Odds_TPR'], multiselect=True, label="Error Parity Metrics", info="Select error parity metrics to display on the heatmap:", + value=['Equalized_Odds_FPR', 'Equalized_Odds_TPR'], multiselect=True, label="Error Disparity Metrics", info="Select error disparity metrics to display on the heatmap:", ) group_stability_metrics = gr.Dropdown( sorted(['Label_Stability_Ratio', 'IQR_Parity', 'Std_Parity', 'Std_Ratio', 'Jitter_Parity']), - value=['Label_Stability_Ratio', 'Std_Parity'], multiselect=True, label="Stability Parity Metrics", info="Select stability parity metrics to display on the heatmap:", + value=['Label_Stability_Ratio', 'Std_Parity'], multiselect=True, label="Stability Disparity Metrics", info="Select stability disparity metrics to display on the heatmap:", ) - group_btn_view3 = gr.Button("Submit") with gr.Row(): with gr.Column(): - subgroup_metrics_bar_chart = gr.Plot(label="Subgroup Bar Chart") + subgroup_metrics_bar_chart = gr.Plot(label="Group Specific Bar Chart") with gr.Column(): - group_metrics_bar_chart = gr.Plot(label="Group Bar Chart") + group_metrics_bar_chart = gr.Plot(label="Disparity Bar Chart") - subgroup_btn_view3.click(self._create_subgroup_metrics_bar_chart_per_one_model, - inputs=[subgroup_model_names, accuracy_metrics, uncertainty_metrics, subgroup_stability_metrics], - outputs=[subgroup_metrics_bar_chart]) - group_btn_view3.click(self._create_group_metrics_bar_chart_per_one_model, - inputs=[group_model_names, fairness_metrics, group_stability_metrics], - outputs=[group_metrics_bar_chart]) + btn_view3.click(self._create_subgroup_metrics_bar_chart_per_one_model, + inputs=[model_name_vw3, accuracy_metrics, uncertainty_metrics, subgroup_stability_metrics], + outputs=[subgroup_metrics_bar_chart]) + btn_view3.click(self._create_group_metrics_bar_chart_per_one_model, + inputs=[model_name_vw3, fairness_metrics, group_stability_metrics], + outputs=[group_metrics_bar_chart]) self.demo = demo self.demo.launch(inline=False, debug=True, show_error=True) @@ -507,7 +511,7 @@ def _create_metrics_bar_chart_per_one_model(self, model_name: str, metrics_names A metrics type ('subgroup' or 'group') to visualize """ - metrics_title = f'{metrics_type.capitalize()} Metrics' + metrics_title = 'Disparity Metrics' if metrics_type == "group" else 'Group Specific Metrics' metrics_df = self.melted_model_composed_metrics_df if metrics_type == "group" else self.melted_model_metrics_df filtered_groups = [grp for grp in metrics_df.Subgroup.unique() if '_correct' not in grp and '_incorrect' not in grp] filtered_groups = [grp for grp in filtered_groups if grp.lower() != 'overall'] + ['overall'] @@ -523,7 +527,7 @@ def _create_metrics_bar_chart_per_one_model(self, model_name: str, metrics_names alt.Color('Subgroup:N', scale=alt.Scale(scheme="tableau20"), sort=filtered_groups, - legend=alt.Legend(title=metrics_type.capitalize(), + legend=alt.Legend(title='Disparity' if metrics_type == 'group' else 'Group', labelFontSize=base_font_size, titleFontSize=base_font_size + 2)) ) From df44d29e1f9eefd73f1e7b2fa3b622a167216fa7 Mon Sep 17 00:00:00 2001 From: denysgerasymuk799 Date: Thu, 12 Oct 2023 11:46:46 +0300 Subject: [PATCH 20/36] Added dynamic variables for the stats bar chart --- ...Multiple_Models_Interface_Vis_Income.ipynb | 15 +-- .../metrics_interactive_visualizer.py | 27 +++-- virny/utils/data_viz_utils.py | 101 +++++++++++++++--- 3 files changed, 113 insertions(+), 30 deletions(-) diff --git a/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb b/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb index cd39444c..14f4a7e9 100644 --- a/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb +++ b/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb @@ -196,12 +196,12 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 205, "id": "435b9d98", "metadata": { "ExecuteTime": { - "end_time": "2023-10-11T19:56:39.234085Z", - "start_time": "2023-10-11T19:56:39.056500Z" + "end_time": "2023-10-11T22:43:14.195509Z", + "start_time": "2023-10-11T22:43:14.152189Z" } }, "outputs": [], @@ -213,7 +213,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 206, "outputs": [ { "name": "stdout", @@ -221,7 +221,8 @@ "text": [ "Running on local URL: http://127.0.0.1:7860\n", "\n", - "To create a public link, set `share=True` in `launch()`.\n" + "To create a public link, set `share=True` in `launch()`.\n", + "Keyboard interruption in main thread... closing server.\n" ] } ], @@ -230,9 +231,9 @@ ], "metadata": { "collapsed": false, - "is_executing": true, "ExecuteTime": { - "start_time": "2023-10-11T19:56:39.234618Z" + "end_time": "2023-10-11T23:08:56.632448Z", + "start_time": "2023-10-11T22:43:14.261225Z" } }, "id": "678a9dc8d51243f4" diff --git a/virny/custom_classes/metrics_interactive_visualizer.py b/virny/custom_classes/metrics_interactive_visualizer.py index 20d39276..bdd13609 100644 --- a/virny/custom_classes/metrics_interactive_visualizer.py +++ b/virny/custom_classes/metrics_interactive_visualizer.py @@ -6,7 +6,8 @@ from virny.utils.protected_groups_partitioning import create_test_protected_groups from virny.utils.data_viz_utils import (create_model_rank_heatmap_visualization, create_sorted_matrix_by_rank, create_subgroup_sorted_matrix_by_rank, create_bar_plot_for_model_selection, - compute_proportions, compute_base_rates, create_col_facet_bar_chart) + compute_proportions, compute_base_rates, create_col_facet_bar_chart, + create_row_facet_bar_chart) class MetricsInteractiveVisualizer: @@ -102,8 +103,8 @@ def start_web_app(self): s.change(self.__variable_inputs, s, grp_names) s.change(self.__variable_inputs, s, grp_dis_values) btn_view0 = gr.Button("Submit") - with gr.Column(scale=3): - dataset_proportions_bar_chart = gr.Plot(label="Subgroup Proportions and Base Rates") + with gr.Column(scale=4): + dataset_proportions_bar_chart = gr.Plot(label="Group Proportions and Base Rates") btn_view0.click(self._create_dataset_proportions_bar_chart, inputs=[grp_names[0], grp_names[1], grp_names[2], grp_names[3], grp_names[4], grp_names[5], grp_names[6], grp_names[7], @@ -337,21 +338,25 @@ def _create_dataset_proportions_bar_chart(self, grp_name1, grp_name2, grp_name3, subgroup_base_rates_dct = compute_base_rates(protected_groups, self.y_data) subgroup_relative_base_rates_dct = dict() for subgroup in subgroup_proportions_dct.keys(): - subgroup_relative_base_rates_dct[subgroup] = subgroup_base_rates_dct[subgroup] * subgroup_proportions_dct[subgroup] + pct = subgroup_base_rates_dct[subgroup]['percentage'] * subgroup_proportions_dct[subgroup]['percentage'] + subgroup_relative_base_rates_dct[subgroup] = {'percentage': pct, 'num_rows': subgroup_base_rates_dct[subgroup]['num_rows']} - stats_df = pd.DataFrame(columns=['Subgroup', 'Value', 'Statistics_Type']) + stats_df = pd.DataFrame(columns=['Subgroup', 'Percentage', 'Num_Rows', 'Statistics_Type']) for subgroup in subgroup_proportions_dct.keys(): - stats_df.loc[len(stats_df.index)] = [subgroup, subgroup_proportions_dct[subgroup], 'Proportion'] - stats_df.loc[len(stats_df.index)] = [subgroup, subgroup_relative_base_rates_dct[subgroup], 'Base_Rate'] + stats_df.loc[len(stats_df.index)] = [subgroup, subgroup_proportions_dct[subgroup]['percentage'], + subgroup_proportions_dct[subgroup]['num_rows'], 'Proportion'] + stats_df.loc[len(stats_df.index)] = [subgroup, subgroup_relative_base_rates_dct[subgroup]['percentage'], + subgroup_relative_base_rates_dct[subgroup]['num_rows'], 'Base_Rate'] # Create a row facet bar chart - col_facet_sort_by_lst = ['overall'] + [grp for grp in stats_df.Subgroup.unique() if grp.lower() != 'overall'] + facet_sort_by_lst = ['overall'] + [grp for grp in stats_df.Subgroup.unique() if grp.lower() != 'overall'] col_facet_bar_chart = create_col_facet_bar_chart(stats_df, x_col='Statistics_Type', - y_col='Value', - col_facet_by='Subgroup', + y_col='Num_Rows', + facet_column_name='Subgroup', + text_labels_column='Percentage', x_sort_by_lst=['Proportion', 'Base_Rate'], - col_facet_sort_by_lst=col_facet_sort_by_lst, + facet_sort_by_lst=facet_sort_by_lst, color_legend_title='Statistics Type', facet_title='') diff --git a/virny/utils/data_viz_utils.py b/virny/utils/data_viz_utils.py index 6de8921c..f8b51640 100644 --- a/virny/utils/data_viz_utils.py +++ b/virny/utils/data_viz_utils.py @@ -61,21 +61,21 @@ def rank_with_tolerance(pd_series: pd.Series, tolerance: float = 0.01, method: s def compute_proportions(protected_groups, X_data): - subgroup_proportions_dct = {'overall': 1.0} + subgroup_proportions_dct = {'overall': {'percentage': 1.0, 'num_rows': X_data.shape[0]}} for col_name in protected_groups.keys(): proportion = protected_groups[col_name].shape[0] / X_data.shape[0] - subgroup_proportions_dct[col_name] = proportion + subgroup_proportions_dct[col_name] = {'percentage': proportion, 'num_rows': protected_groups[col_name].shape[0]} return subgroup_proportions_dct def compute_base_rates(protected_groups, y_data): overall_base_rate = y_data[y_data == 1].shape[0] / y_data.shape[0] - subgroup_base_rates_dct = {'overall': overall_base_rate} + subgroup_base_rates_dct = {'overall': {'percentage': overall_base_rate, 'num_rows': y_data[y_data == 1].shape[0]}} for col_name in protected_groups.keys(): filtered_df = y_data.iloc[protected_groups[col_name].index].copy(deep=True) base_rate = filtered_df[filtered_df == 1].shape[0] / filtered_df.shape[0] - subgroup_base_rates_dct[col_name] = base_rate + subgroup_base_rates_dct[col_name] = {'percentage': base_rate, 'num_rows': filtered_df[filtered_df == 1].shape[0]} return subgroup_base_rates_dct @@ -115,16 +115,93 @@ def create_subgroup_sorted_matrix_by_rank(model_metrics_matrix, tolerance) -> np return sorted_matrix_by_rank -def create_col_facet_bar_chart(df, x_col, y_col, col_facet_by, x_sort_by_lst=Undefined, - col_facet_sort_by_lst=Undefined, color_legend_title=Undefined, facet_title=Undefined): +def create_col_facet_bar_chart(df, x_col, y_col, facet_column_name, text_labels_column, x_sort_by_lst=Undefined, + facet_sort_by_lst=Undefined, color_legend_title=Undefined, facet_title=Undefined): + num_facets = len(df[facet_column_name].unique()) + max_y_axis_limit = df[y_col].max() base_font_size = 16 + + # Set dynamic variables that adapt to the number of defined groups + dynamic_facet_width = 100 + dynamic_label_angle = -20 + dynamic_font_size = base_font_size + dynamic_top_padding = 40 + dynamic_legend_y_padding = -140 + if num_facets > 4 * 2 + 1 and num_facets <= 6 * 2 + 1: + dynamic_facet_width = 75 + dynamic_label_angle = -25 + dynamic_font_size -= 2 + dynamic_top_padding = 40 + dynamic_legend_y_padding = -160 + elif num_facets > 6 * 2 + 1: + dynamic_facet_width = 50 + dynamic_label_angle = -45 + dynamic_font_size -= 4 + dynamic_top_padding = 50 + dynamic_legend_y_padding = -200 + bar_chart = ( alt.Chart().mark_bar().encode( alt.X(f'{x_col}:N', axis=None, sort=x_sort_by_lst), - alt.Y(f'{y_col}:Q', axis=alt.Axis(grid=True), title=''), + alt.Y(f'{y_col}:Q', axis=alt.Axis(grid=True), title='', scale=alt.Scale(domain=[0, max_y_axis_limit])), alt.Color(f'{x_col}:N', scale=alt.Scale(scheme="tableau20"), sort=x_sort_by_lst, + legend=alt.Legend(title=color_legend_title, + labelFontSize=base_font_size, + titleFontSize=base_font_size + 2, + orient='none', + legendX=0, legendY=dynamic_legend_y_padding, + direction='horizontal')) + ) + ) + + text_labels = ( + bar_chart.mark_text( + baseline='middle', + fontSize=dynamic_font_size, + dy=-10 + ).encode( + text=alt.Text(f'{text_labels_column}:Q', format=",.2f"), + color=alt.value("black") + ) + ) + + final_chart = ( + alt.layer( + bar_chart, text_labels, data=df + ).properties( + width=dynamic_facet_width, + height=500 + ).facet( + column=alt.Column(f'{facet_column_name}:N', title=facet_title, + sort=facet_sort_by_lst, header=alt.Header(labelAngle=dynamic_label_angle, + labelAnchor='middle', + labelAlign='center', + labelPadding=-15)) + ).configure( + padding={'top': dynamic_top_padding}, + ).configure_headerColumn( + labelFontSize=base_font_size, + titleFontSize=base_font_size + 2, + ).configure_axis( + labelFontSize=base_font_size, titleFontSize=base_font_size + 2 + ) + ) + + return final_chart + + +def create_row_facet_bar_chart(df, x_col, y_col, facet_column_name, y_sort_by_lst=Undefined, + facet_sort_by_lst=Undefined, color_legend_title=Undefined, facet_title=Undefined): + base_font_size = 16 + bar_chart = ( + alt.Chart().mark_bar().encode( + alt.Y(f'{y_col}:N', axis=None, sort=y_sort_by_lst), + alt.X(f'{x_col}:Q', axis=alt.Axis(grid=True), title=''), + alt.Color(f'{y_col}:N', + scale=alt.Scale(scheme="tableau20"), + sort=y_sort_by_lst, legend=alt.Legend(title=color_legend_title, labelFontSize=base_font_size, titleFontSize=base_font_size + 2, @@ -136,7 +213,7 @@ def create_col_facet_bar_chart(df, x_col, y_col, col_facet_by, x_sort_by_lst=Und bar_chart.mark_text( baseline='middle', fontSize=base_font_size, - dy=-10 + dx=10 ).encode( text=alt.Text('Value:Q', format=",.3f"), color=alt.value("black") @@ -147,13 +224,13 @@ def create_col_facet_bar_chart(df, x_col, y_col, col_facet_by, x_sort_by_lst=Und alt.layer( bar_chart, text_labels, data=df ).properties( - width=100, - height=500 + width=500, + height=100 ).facet( - column=alt.Column(f'{col_facet_by}:N', title=facet_title, sort=col_facet_sort_by_lst) + row=alt.Row(f'{facet_column_name}:N', title=facet_title, sort=facet_sort_by_lst) ).configure( padding={'top': 33}, - ).configure_headerColumn( + ).configure_headerRow( labelFontSize=base_font_size, titleFontSize=base_font_size + 2 ).configure_axis( From 866f30f50c9b0706411ef42a0170657ff58b2474 Mon Sep 17 00:00:00 2001 From: denysgerasymuk799 Date: Fri, 13 Oct 2023 23:50:30 +0300 Subject: [PATCH 21/36] Added minor fixes to a visualization component --- ...Multiple_Models_Interface_Vis_Income.ipynb | 56 +++++++++---------- .../metrics_interactive_visualizer.py | 4 +- virny/utils/data_viz_utils.py | 10 ++-- 3 files changed, 34 insertions(+), 36 deletions(-) diff --git a/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb b/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb index 14f4a7e9..e19f415f 100644 --- a/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb +++ b/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb @@ -6,8 +6,8 @@ "id": "248cbed8", "metadata": { "ExecuteTime": { - "end_time": "2023-10-11T19:05:26.386191Z", - "start_time": "2023-10-11T19:05:25.944121Z" + "end_time": "2023-10-13T20:20:09.765631Z", + "start_time": "2023-10-13T20:20:09.381209Z" } }, "outputs": [], @@ -23,8 +23,8 @@ "id": "7ec6cd08", "metadata": { "ExecuteTime": { - "end_time": "2023-10-11T19:05:26.394513Z", - "start_time": "2023-10-11T19:05:26.385903Z" + "end_time": "2023-10-13T20:20:09.774183Z", + "start_time": "2023-10-13T20:20:09.765873Z" } }, "outputs": [], @@ -41,8 +41,8 @@ "id": "b8cb69f2", "metadata": { "ExecuteTime": { - "end_time": "2023-10-11T19:05:26.404007Z", - "start_time": "2023-10-11T19:05:26.395039Z" + "end_time": "2023-10-13T20:20:09.783681Z", + "start_time": "2023-10-13T20:20:09.774750Z" } }, "outputs": [ @@ -76,8 +76,8 @@ "id": "7a9241de", "metadata": { "ExecuteTime": { - "end_time": "2023-10-11T19:05:28.926284Z", - "start_time": "2023-10-11T19:05:26.405380Z" + "end_time": "2023-10-13T20:20:11.549308Z", + "start_time": "2023-10-13T20:20:09.784822Z" } }, "outputs": [], @@ -100,8 +100,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-11T19:05:30.217781Z", - "start_time": "2023-10-11T19:05:28.929275Z" + "end_time": "2023-10-13T20:20:12.860282Z", + "start_time": "2023-10-13T20:20:11.551544Z" } }, "id": "d3c53c7b72ecbcd0" @@ -118,8 +118,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-11T19:05:30.244888Z", - "start_time": "2023-10-11T19:05:30.218209Z" + "end_time": "2023-10-13T20:20:12.888990Z", + "start_time": "2023-10-13T20:20:12.860786Z" } }, "id": "2aab7c79ecdee914" @@ -137,8 +137,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-11T19:05:30.270595Z", - "start_time": "2023-10-11T19:05:30.245746Z" + "end_time": "2023-10-13T20:20:12.911932Z", + "start_time": "2023-10-13T20:20:12.888583Z" } }, "id": "2d922003e752a4b4" @@ -155,8 +155,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-11T19:05:30.292095Z", - "start_time": "2023-10-11T19:05:30.268258Z" + "end_time": "2023-10-13T20:20:12.937376Z", + "start_time": "2023-10-13T20:20:12.912368Z" } }, "id": "833484748ed512e8" @@ -180,8 +180,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-11T19:05:30.316436Z", - "start_time": "2023-10-11T19:05:30.292589Z" + "end_time": "2023-10-13T20:20:12.963217Z", + "start_time": "2023-10-13T20:20:12.935698Z" } }, "id": "15ed7d1ba1f22317" @@ -196,12 +196,12 @@ }, { "cell_type": "code", - "execution_count": 205, + "execution_count": 23, "id": "435b9d98", "metadata": { "ExecuteTime": { - "end_time": "2023-10-11T22:43:14.195509Z", - "start_time": "2023-10-11T22:43:14.152189Z" + "end_time": "2023-10-13T20:49:19.030436Z", + "start_time": "2023-10-13T20:49:18.977199Z" } }, "outputs": [], @@ -213,7 +213,7 @@ }, { "cell_type": "code", - "execution_count": 206, + "execution_count": 24, "outputs": [ { "name": "stdout", @@ -232,8 +232,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-11T23:08:56.632448Z", - "start_time": "2023-10-11T22:43:14.261225Z" + "end_time": "2023-10-13T20:50:05.536644Z", + "start_time": "2023-10-13T20:49:19.061199Z" } }, "id": "678a9dc8d51243f4" @@ -256,8 +256,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-11T19:21:09.901993Z", - "start_time": "2023-10-11T19:21:09.806669Z" + "end_time": "2023-10-13T20:23:04.989037Z", + "start_time": "2023-10-13T20:23:04.937593Z" } }, "id": "277b6d1de837dab7" @@ -270,8 +270,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-11T19:21:09.902311Z", - "start_time": "2023-10-11T19:21:09.899330Z" + "end_time": "2023-10-13T20:23:04.991061Z", + "start_time": "2023-10-13T20:23:04.988926Z" } }, "id": "c207d4345ddca1db" diff --git a/virny/custom_classes/metrics_interactive_visualizer.py b/virny/custom_classes/metrics_interactive_visualizer.py index bdd13609..54588226 100644 --- a/virny/custom_classes/metrics_interactive_visualizer.py +++ b/virny/custom_classes/metrics_interactive_visualizer.py @@ -6,8 +6,7 @@ from virny.utils.protected_groups_partitioning import create_test_protected_groups from virny.utils.data_viz_utils import (create_model_rank_heatmap_visualization, create_sorted_matrix_by_rank, create_subgroup_sorted_matrix_by_rank, create_bar_plot_for_model_selection, - compute_proportions, compute_base_rates, create_col_facet_bar_chart, - create_row_facet_bar_chart) + compute_proportions, compute_base_rates, create_col_facet_bar_chart) class MetricsInteractiveVisualizer: @@ -423,7 +422,6 @@ def _create_subgroup_model_rank_heatmap(self, model_names: list, subgroup_accura # Find metric values for each model based on metric, subgroup, and model names. # Add the values to a results dict. results = {} - num_models = len(model_names) for metric in metrics_lst: # Add an overall metric subgroup_metric = metric diff --git a/virny/utils/data_viz_utils.py b/virny/utils/data_viz_utils.py index f8b51640..32a3a9b2 100644 --- a/virny/utils/data_viz_utils.py +++ b/virny/utils/data_viz_utils.py @@ -267,7 +267,7 @@ def create_model_rank_heatmap_visualization(model_metrics_matrix, sorted_matrix_ num_ranks = int(sorted_matrix_by_rank.values.max()) fig = plt.figure(figsize=(matrix_width, matrix_height)) - rank_colors = sns.color_palette("coolwarm", n_colors=num_ranks).as_hex() + rank_colors = sns.color_palette("coolwarm_r", n_colors=num_ranks).as_hex() # Convert ranks to minus ranks (1 --> -1; 4 --> -4) to align rank positions with a coolwarm color scheme reversed_sorted_matrix_by_rank = sorted_matrix_by_rank * -1 ax = sns.heatmap(reversed_sorted_matrix_by_rank, annot=model_metrics_matrix.round(3), cmap=rank_colors, @@ -281,11 +281,11 @@ def create_model_rank_heatmap_visualization(model_metrics_matrix, sorted_matrix_ cbar = ax.collections[0].colorbar model_ranks = [idx + 1 for idx in range(num_ranks)] cbar.set_ticks([float(idx) * -1 for idx in model_ranks]) - tick_labels = [str(idx) for idx in model_ranks] - tick_labels[0] = tick_labels[0] + ', best' - tick_labels[-1] = tick_labels[-1] + ', worst' + tick_labels = ['' for _ in model_ranks] + if len(tick_labels) > 1: + tick_labels[0] = 'Best' + tick_labels[-1] = 'Worst' cbar.set_ticklabels(tick_labels, fontsize=16 + font_increase) - cbar.set_label('Model Ranks', fontsize=18 + font_increase) return fig, ax From 620f36f0ba7ea0e5f497e523f0c3e689ba5792ad Mon Sep 17 00:00:00 2001 From: denysgerasymuk799 Date: Tue, 28 Nov 2023 02:08:24 +0200 Subject: [PATCH 22/36] Added model performance summary --- ...Multiple_Models_Interface_Vis_Income.ipynb | 102 +++++---- virny/configs/constants.py | 1 + virny/custom_classes/metrics_composer.py | 3 +- .../metrics_interactive_visualizer.py | 205 ++++++++++++++++-- virny/utils/data_viz_utils.py | 26 +++ 5 files changed, 278 insertions(+), 59 deletions(-) diff --git a/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb b/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb index e19f415f..a37d4449 100644 --- a/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb +++ b/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb @@ -6,8 +6,8 @@ "id": "248cbed8", "metadata": { "ExecuteTime": { - "end_time": "2023-10-13T20:20:09.765631Z", - "start_time": "2023-10-13T20:20:09.381209Z" + "end_time": "2023-11-27T23:09:00.744106Z", + "start_time": "2023-11-27T23:09:00.258137Z" } }, "outputs": [], @@ -23,8 +23,8 @@ "id": "7ec6cd08", "metadata": { "ExecuteTime": { - "end_time": "2023-10-13T20:20:09.774183Z", - "start_time": "2023-10-13T20:20:09.765873Z" + "end_time": "2023-11-27T23:09:00.753238Z", + "start_time": "2023-11-27T23:09:00.743899Z" } }, "outputs": [], @@ -37,12 +37,12 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "id": "b8cb69f2", "metadata": { "ExecuteTime": { - "end_time": "2023-10-13T20:20:09.783681Z", - "start_time": "2023-10-13T20:20:09.774750Z" + "end_time": "2023-11-27T23:09:14.159592Z", + "start_time": "2023-11-27T23:09:14.145555Z" } }, "outputs": [ @@ -72,12 +72,12 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "id": "7a9241de", "metadata": { "ExecuteTime": { - "end_time": "2023-10-13T20:20:11.549308Z", - "start_time": "2023-10-13T20:20:09.784822Z" + "end_time": "2023-11-27T23:09:16.946143Z", + "start_time": "2023-11-27T23:09:15.322037Z" } }, "outputs": [], @@ -86,12 +86,13 @@ "import pandas as pd\n", "\n", "from virny.datasets import ACSIncomeDataset\n", + "from virny.custom_classes.metrics_composer import MetricsComposer\n", "from virny.custom_classes.metrics_interactive_visualizer import MetricsInteractiveVisualizer" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "outputs": [], "source": [ "data_loader = ACSIncomeDataset(state=['GA'], year=2018, with_nulls=False, subsample_size=15_000, subsample_seed=42)\n", @@ -100,52 +101,67 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-13T20:20:12.860282Z", - "start_time": "2023-10-13T20:20:11.551544Z" + "end_time": "2023-11-27T23:09:18.236763Z", + "start_time": "2023-11-27T23:09:16.949112Z" } }, "id": "d3c53c7b72ecbcd0" }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "outputs": [], "source": [ "ROOT_DIR = os.path.join('docs', 'examples')\n", "subgroup_metrics_df = pd.read_csv(os.path.join(ROOT_DIR, 'income_subgroup_metrics.csv'), header=0)\n", - "models_composed_metrics_df = pd.read_csv(os.path.join(ROOT_DIR, 'income_group_metrics.csv'), header=0)" + "subgroup_metrics_df['Model_Name'] = (subgroup_metrics_df['Model_Name'] + '__alpha=' +\n", + " subgroup_metrics_df['Intervention_Param'].astype(str))" ], "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-13T20:20:12.888990Z", - "start_time": "2023-10-13T20:20:12.860786Z" + "end_time": "2023-11-27T23:09:18.781790Z", + "start_time": "2023-11-27T23:09:18.747739Z" } }, "id": "2aab7c79ecdee914" }, { "cell_type": "code", - "execution_count": 7, - "outputs": [], + "execution_count": 8, + "outputs": [ + { + "data": { + "text/plain": " Metric SEX RAC1P SEX&RAC1P \\\n0 Accuracy_Parity 0.047756 0.074977 0.065217 \n1 Aleatoric_Uncertainty_Parity -0.039005 -0.011947 -0.009222 \n2 Aleatoric_Uncertainty_Ratio 0.935159 0.979638 0.984220 \n3 Equalized_Odds_FNR 0.030793 -0.110745 -0.052498 \n4 Equalized_Odds_FPR -0.021317 0.000952 -0.007008 \n\n Model_Name \n0 LGBMClassifier__alpha=0.7 \n1 LGBMClassifier__alpha=0.7 \n2 LGBMClassifier__alpha=0.7 \n3 LGBMClassifier__alpha=0.7 \n4 LGBMClassifier__alpha=0.7 ", + "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
MetricSEXRAC1PSEX&RAC1PModel_Name
0Accuracy_Parity0.0477560.0749770.065217LGBMClassifier__alpha=0.7
1Aleatoric_Uncertainty_Parity-0.039005-0.011947-0.009222LGBMClassifier__alpha=0.7
2Aleatoric_Uncertainty_Ratio0.9351590.9796380.984220LGBMClassifier__alpha=0.7
3Equalized_Odds_FNR0.030793-0.110745-0.052498LGBMClassifier__alpha=0.7
4Equalized_Odds_FPR-0.0213170.000952-0.007008LGBMClassifier__alpha=0.7
\n
" + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "subgroup_metrics_df['Model_Name'] = (subgroup_metrics_df['Model_Name'] + '__alpha=' +\n", - " subgroup_metrics_df['Intervention_Param'].astype(str))\n", - "models_composed_metrics_df['Model_Name'] = (models_composed_metrics_df['Model_Name'] + '__alpha=' \n", - " + models_composed_metrics_df['Intervention_Param'].astype(str))" + "model_names = subgroup_metrics_df['Model_Name'].unique()\n", + "models_metrics_dct = dict()\n", + "for model_name in model_names:\n", + " models_metrics_dct[model_name] = subgroup_metrics_df[subgroup_metrics_df['Model_Name'] == model_name]\n", + "\n", + "metrics_composer = MetricsComposer(models_metrics_dct, sensitive_attributes_dct)\n", + "models_composed_metrics_df = metrics_composer.compose_metrics()\n", + "models_composed_metrics_df.head()" ], "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-13T20:20:12.911932Z", - "start_time": "2023-10-13T20:20:12.888583Z" + "end_time": "2023-11-27T23:09:18.905842Z", + "start_time": "2023-11-27T23:09:18.850548Z" } }, - "id": "2d922003e752a4b4" + "id": "44ee5eff6054ce04" }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 10, "outputs": [], "source": [ "models_metrics_dct = dict()\n", @@ -155,21 +171,21 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-13T20:20:12.937376Z", - "start_time": "2023-10-13T20:20:12.912368Z" + "end_time": "2023-11-27T23:10:14.375071Z", + "start_time": "2023-11-27T23:10:14.339164Z" } }, "id": "833484748ed512e8" }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 11, "outputs": [ { "data": { "text/plain": "dict_keys(['LGBMClassifier__alpha=0.7', 'LGBMClassifier__alpha=0.0', 'LGBMClassifier__alpha=0.4', 'LogisticRegression__alpha=0.0', 'LogisticRegression__alpha=0.7', 'LogisticRegression__alpha=0.4', 'MLPClassifier__alpha=0.0', 'MLPClassifier__alpha=0.7', 'MLPClassifier__alpha=0.4', 'RandomForestClassifier__alpha=0.4', 'RandomForestClassifier__alpha=0.7', 'RandomForestClassifier__alpha=0.0'])" }, - "execution_count": 9, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -180,8 +196,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-13T20:20:12.963217Z", - "start_time": "2023-10-13T20:20:12.935698Z" + "end_time": "2023-11-27T23:10:15.006243Z", + "start_time": "2023-11-27T23:10:14.979880Z" } }, "id": "15ed7d1ba1f22317" @@ -196,12 +212,12 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 58, "id": "435b9d98", "metadata": { "ExecuteTime": { - "end_time": "2023-10-13T20:49:19.030436Z", - "start_time": "2023-10-13T20:49:18.977199Z" + "end_time": "2023-11-27T23:59:15.016940Z", + "start_time": "2023-11-27T23:59:14.968372Z" } }, "outputs": [], @@ -213,7 +229,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 59, "outputs": [ { "name": "stdout", @@ -232,8 +248,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-13T20:50:05.536644Z", - "start_time": "2023-10-13T20:49:19.061199Z" + "end_time": "2023-11-28T00:08:09.433964Z", + "start_time": "2023-11-27T23:59:15.062378Z" } }, "id": "678a9dc8d51243f4" @@ -256,8 +272,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-13T20:23:04.989037Z", - "start_time": "2023-10-13T20:23:04.937593Z" + "end_time": "2023-11-27T22:52:53.559673Z", + "start_time": "2023-11-27T22:52:53.432952Z" } }, "id": "277b6d1de837dab7" @@ -270,8 +286,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-13T20:23:04.991061Z", - "start_time": "2023-10-13T20:23:04.988926Z" + "end_time": "2023-11-27T22:52:53.561907Z", + "start_time": "2023-11-27T22:52:53.559309Z" } }, "id": "c207d4345ddca1db" diff --git a/virny/configs/constants.py b/virny/configs/constants.py index 81d145b2..fff71dab 100644 --- a/virny/configs/constants.py +++ b/virny/configs/constants.py @@ -54,6 +54,7 @@ class ReportType(Enum): # Stability disparity metrics LABEL_STABILITY_RATIO = 'Label_Stability_Ratio' +LABEL_STABILITY_DIFFERENCE = 'Label_Stability_Difference' IQR_PARITY = 'IQR_Parity' STD_PARITY = 'Std_Parity' STD_RATIO = 'Std_Ratio' diff --git a/virny/custom_classes/metrics_composer.py b/virny/custom_classes/metrics_composer.py index cbd58c4c..1aae0c97 100644 --- a/virny/custom_classes/metrics_composer.py +++ b/virny/custom_classes/metrics_composer.py @@ -32,7 +32,8 @@ def __init__(self, models_metrics_dct: dict, sensitive_attributes_dct: dict): POSITIVE_RATE: [(STATISTICAL_PARITY_DIFFERENCE, self._difference_operation), (DISPARATE_IMPACT, self._ratio_operation)], # Stability disparity metrics - LABEL_STABILITY: [(LABEL_STABILITY_RATIO, self._ratio_operation)], + LABEL_STABILITY: [(LABEL_STABILITY_RATIO, self._ratio_operation), + (LABEL_STABILITY_DIFFERENCE, self._difference_operation)], JITTER: [(JITTER_PARITY, self._difference_operation)], IQR: [(IQR_PARITY, self._difference_operation)], STD: [(STD_PARITY, self._difference_operation), diff --git a/virny/custom_classes/metrics_interactive_visualizer.py b/virny/custom_classes/metrics_interactive_visualizer.py index 54588226..69857337 100644 --- a/virny/custom_classes/metrics_interactive_visualizer.py +++ b/virny/custom_classes/metrics_interactive_visualizer.py @@ -1,12 +1,15 @@ import pandas as pd import gradio as gr import altair as alt +from pprint import pprint +from virny.configs.constants import * from virny.utils.common_helpers import str_to_float from virny.utils.protected_groups_partitioning import create_test_protected_groups from virny.utils.data_viz_utils import (create_model_rank_heatmap_visualization, create_sorted_matrix_by_rank, create_subgroup_sorted_matrix_by_rank, create_bar_plot_for_model_selection, - compute_proportions, compute_base_rates, create_col_facet_bar_chart) + compute_proportions, compute_base_rates, create_col_facet_bar_chart, + create_model_performance_summary_visualization) class MetricsInteractiveVisualizer: @@ -40,6 +43,14 @@ def __init__(self, X_data: pd.DataFrame, y_data: pd.DataFrame, model_metrics_dct self.demo = None self.max_groups = 8 + # Metric names + self.all_accuracy_metrics = [STATISTICAL_BIAS, TPR, TNR, PPV, FNR, FPR, F1, ACCURACY, POSITIVE_RATE] + self.all_stability_metrics = [STD, IQR, JITTER, LABEL_STABILITY] + self.all_uncertainty_metrics = [ALEATORIC_UNCERTAINTY, OVERALL_UNCERTAINTY] + self.all_error_disparity_metrics = [EQUALIZED_ODDS_TPR, EQUALIZED_ODDS_TNR, EQUALIZED_ODDS_FPR, EQUALIZED_ODDS_FNR, DISPARATE_IMPACT, STATISTICAL_PARITY_DIFFERENCE, ACCURACY_PARITY] + self.all_stability_disparity_metrics = [LABEL_STABILITY_RATIO, LABEL_STABILITY_DIFFERENCE, IQR_PARITY, STD_PARITY, STD_RATIO, JITTER_PARITY] + self.all_uncertainty_disparity_metrics = [OVERALL_UNCERTAINTY_PARITY, OVERALL_UNCERTAINTY_RATIO, ALEATORIC_UNCERTAINTY_PARITY, ALEATORIC_UNCERTAINTY_RATIO] + # Create one metrics df with all model_dfs models_metrics_df = pd.DataFrame() for model_name in model_metrics_dct.keys(): @@ -123,7 +134,7 @@ def start_web_app(self): ) with gr.Row(): accuracy_metric = gr.Dropdown( - sorted(['Statistical_Bias', 'TPR', 'TNR', 'PPV', 'FNR', 'FPR', 'Accuracy', 'F1']), + sorted(self.all_accuracy_metrics), value='Accuracy', multiselect=False, label="Constraint 1 (C1)", scale=2 ) @@ -131,7 +142,7 @@ def start_web_app(self): acc_max_val = gr.Text(value="1.0", label="Max value", scale=1) with gr.Row(): fairness_metric = gr.Dropdown( - sorted(['Equalized_Odds_TPR', 'Equalized_Odds_FPR', 'Disparate_Impact', 'Statistical_Parity_Difference', 'Accuracy_Parity']), + sorted(self.all_error_disparity_metrics), value='Equalized_Odds_FPR', multiselect=False, label="Constraint 2 (C2)", scale=2 ) @@ -139,7 +150,7 @@ def start_web_app(self): fairness_max_val = gr.Text(value="1.0", label="Max value", scale=1) with gr.Row(): subgroup_stability_metric = gr.Dropdown( - sorted(['Std', 'IQR', 'Jitter', 'Label_Stability']), + sorted(self.all_stability_metrics), value='Label_Stability', multiselect=False, label="Constraint 3 (C3)", scale=2 ) @@ -147,7 +158,7 @@ def start_web_app(self): subgroup_stab_max_val = gr.Text(value="1.0", label="Max value", scale=1) with gr.Row(): group_stability_metrics = gr.Dropdown( - sorted(['Label_Stability_Ratio', 'IQR_Parity', 'Std_Parity', 'Std_Ratio', 'Jitter_Parity']), + sorted(self.all_stability_disparity_metrics), value='Label_Stability_Ratio', multiselect=False, label="Constraint 4 (C4)", scale=2 ) @@ -179,15 +190,15 @@ def start_web_app(self): ) subgroup_tolerance = gr.Text(value="0.005", label="Tolerance", info="Define an acceptable tolerance for metric dense ranking.") accuracy_metrics = gr.Dropdown( - sorted(['Statistical_Bias', 'TPR', 'TNR', 'PPV', 'FNR', 'FPR', 'Accuracy', 'F1']), + sorted(self.all_accuracy_metrics), value=['Accuracy', 'F1'], multiselect=True, label="Accuracy Metrics", info="Select accuracy metrics to display on the heatmap:", ) uncertainty_metrics = gr.Dropdown( - sorted(['Aleatoric_Uncertainty', 'Overall_Uncertainty']), + sorted(self.all_uncertainty_metrics), value=['Aleatoric_Uncertainty', 'Overall_Uncertainty'], multiselect=True, label="Uncertainty Metrics", info="Select uncertainty metrics to display on the heatmap:", ) subgroup_stability_metrics = gr.Dropdown( - sorted(['Std', 'IQR', 'Jitter', 'Label_Stability']), + sorted(self.all_stability_metrics), value=['Jitter', 'Label_Stability'], multiselect=True, label="Stability Metrics", info="Select stability metrics to display on the heatmap:", ) subgroup_btn_view2 = gr.Button("Submit") @@ -211,11 +222,11 @@ def start_web_app(self): ) group_tolerance = gr.Text(value="0.005", label="Tolerance", info="Define an acceptable tolerance for metric dense ranking.") fairness_metrics = gr.Dropdown( - sorted(['Equalized_Odds_TPR', 'Equalized_Odds_FPR', 'Disparate_Impact', 'Statistical_Parity_Difference', 'Accuracy_Parity']), + sorted(self.all_error_disparity_metrics), value=['Equalized_Odds_FPR', 'Equalized_Odds_TPR'], multiselect=True, label="Error Disparity Metrics", info="Select error disparity metrics to display on the heatmap:", ) group_stability_metrics = gr.Dropdown( - sorted(['Label_Stability_Ratio', 'IQR_Parity', 'Std_Parity', 'Std_Ratio', 'Jitter_Parity']), + sorted(self.all_stability_disparity_metrics), value=['Label_Stability_Ratio', 'Std_Parity'], multiselect=True, label="Stability Disparity Metrics", info="Select stability disparity metrics to display on the heatmap:", ) group_btn_view2 = gr.Button("Submit") @@ -246,15 +257,15 @@ def start_web_app(self): ### Group Specific Metrics """) accuracy_metrics = gr.Dropdown( - sorted(['Statistical_Bias', 'TPR', 'TNR', 'PPV', 'FNR', 'FPR', 'Accuracy', 'F1']), + sorted(self.all_accuracy_metrics), value=['Accuracy', 'F1'], multiselect=True, label="Accuracy Metrics", info="Select accuracy metrics to display on the heatmap:", ) uncertainty_metrics = gr.Dropdown( - sorted(['Aleatoric_Uncertainty', 'Overall_Uncertainty']), + sorted(self.all_uncertainty_metrics), value=['Aleatoric_Uncertainty', 'Overall_Uncertainty'], multiselect=True, label="Uncertainty Metrics", info="Select uncertainty metrics to display on the heatmap:", ) subgroup_stability_metrics = gr.Dropdown( - sorted(['Std', 'IQR', 'Jitter', 'Label_Stability']), + sorted(self.all_stability_metrics), value=['Jitter', 'Label_Stability'], multiselect=True, label="Stability Metrics", info="Select stability metrics to display on the heatmap:", ) btn_view3 = gr.Button("Submit") @@ -264,11 +275,11 @@ def start_web_app(self): ### Disparity Metrics """) fairness_metrics = gr.Dropdown( - sorted(['Equalized_Odds_TPR', 'Equalized_Odds_FPR', 'Disparate_Impact', 'Statistical_Parity_Difference', 'Accuracy_Parity']), + sorted(self.all_error_disparity_metrics), value=['Equalized_Odds_FPR', 'Equalized_Odds_TPR'], multiselect=True, label="Error Disparity Metrics", info="Select error disparity metrics to display on the heatmap:", ) group_stability_metrics = gr.Dropdown( - sorted(['Label_Stability_Ratio', 'IQR_Parity', 'Std_Parity', 'Std_Ratio', 'Jitter_Parity']), + sorted(self.all_stability_disparity_metrics), value=['Label_Stability_Ratio', 'Std_Parity'], multiselect=True, label="Stability Disparity Metrics", info="Select stability disparity metrics to display on the heatmap:", ) with gr.Row(): @@ -283,6 +294,90 @@ def start_web_app(self): btn_view3.click(self._create_group_metrics_bar_chart_per_one_model, inputs=[model_name_vw3, fairness_metrics, group_stability_metrics], outputs=[group_metrics_bar_chart]) + # ============================ Model Performance Summary ============================ + with gr.Row(): + # Scale column 1 to a half of a screen + with gr.Column(): + gr.Markdown( + """ + ## Model Performance Summary + """) + model_name_vw4 = gr.Dropdown( + sorted(self.model_names), value=sorted(self.model_names)[0], multiselect=False, scale=1, + label="Model Name", info="Select one model to generate a performance summary:", + ) + with gr.Column(): + pass + with gr.Row(): + with gr.Column(): + gr.Markdown( + """ + ### Group Specific Metrics + """) + with gr.Row(): + accuracy_metric_vw4 = gr.Dropdown( + sorted(self.all_accuracy_metrics), + value=ACCURACY, multiselect=False, label="Accuracy Metric", + scale=3 + ) + acc_threshold_vw4 = gr.Text(value="0.0", label="Threshold", scale=2) + with gr.Row(): + subgroup_stability_metric_vw4 = gr.Dropdown( + sorted(self.all_stability_metrics), + value=LABEL_STABILITY, multiselect=False, label="Stability Metric", + scale=3 + ) + subgroup_stab_threshold_vw4 = gr.Text(value="0.0", label="Threshold", scale=2) + with gr.Row(): + subgroup_uncertainty_metric_vw4 = gr.Dropdown( + sorted(self.all_uncertainty_metrics), + value=ALEATORIC_UNCERTAINTY, multiselect=False, label="Uncertainty Metric", + scale=3 + ) + subgroup_uncertainty_threshold_vw4 = gr.Text(value="0.0", label="Threshold", scale=2) + + btn_view4 = gr.Button("Submit") + with gr.Column(): + gr.Markdown( + """ + ### Disparity Metrics + """) + with gr.Row(): + fairness_metric_vw4 = gr.Dropdown( + sorted(self.all_error_disparity_metrics), + value=EQUALIZED_ODDS_FPR, multiselect=False, label="Error Disparity Metric", + scale=2 + ) + fairness_min_val_vw4 = gr.Text(value="-1.0", label="Min value", scale=1) + fairness_max_val_vw4 = gr.Text(value="1.0", label="Max value", scale=1) + with gr.Row(): + group_stability_metrics_vw4 = gr.Dropdown( + sorted(self.all_stability_disparity_metrics), + value=LABEL_STABILITY_RATIO, multiselect=False, label="Stability Disparity Metric", + scale=2 + ) + group_stab_min_val_vw4 = gr.Text(value="0.7", label="Min value", scale=1) + group_stab_max_val_vw4 = gr.Text(value="1.5", label="Max value", scale=1) + with gr.Row(): + group_uncertainty_metrics_vw4 = gr.Dropdown( + sorted(self.all_uncertainty_disparity_metrics), + value=ALEATORIC_UNCERTAINTY_PARITY, multiselect=False, label="Uncertainty Disparity Metric", + scale=2 + ) + group_uncertainty_min_val_vw4 = gr.Text(value="-1.0", label="Min value", scale=1) + group_uncertainty_max_val_vw4 = gr.Text(value="1.0", label="Max value", scale=1) + with gr.Row(): + model_performance_summary = gr.Plot(label="Model Performance Summary") + + btn_view4.click(self._create_model_performance_summary, + inputs=[model_name_vw4, + accuracy_metric_vw4, acc_threshold_vw4, + subgroup_stability_metric_vw4, subgroup_stab_threshold_vw4, + subgroup_uncertainty_metric_vw4, subgroup_uncertainty_threshold_vw4, + fairness_metric_vw4, fairness_min_val_vw4, fairness_max_val_vw4, + group_stability_metrics_vw4, group_stab_min_val_vw4, group_stab_max_val_vw4, + group_uncertainty_metrics_vw4, group_uncertainty_min_val_vw4, group_uncertainty_max_val_vw4], + outputs=[model_performance_summary]) self.demo = demo self.demo.launch(inline=False, debug=True, show_error=True) @@ -313,6 +408,24 @@ def __filter_subgroup_metrics_df(self, results: dict, subgroup_metric: str, return results + def __check_metric_constraints(self, model_performance_dct, input_constraint_dct): + model_metrics_constraints_check_dct = dict() + for metric_dim in model_performance_dct.keys(): + model_metrics_constraints_check_dct[metric_dim] = dict() + for group in model_performance_dct[metric_dim]: + if group == 'Overall': + constraint_type = 'overall' + threshold = input_constraint_dct[metric_dim][constraint_type][1] + check = 1 if model_performance_dct[metric_dim][group] >= threshold else 0 + model_metrics_constraints_check_dct[metric_dim][group] = check + else: + constraint_type = 'disparity' + min_val, max_val = input_constraint_dct[metric_dim][constraint_type][1] + check = 1 if model_performance_dct[metric_dim][group] >= min_val and model_performance_dct[metric_dim][group] <= max_val else 0 + model_metrics_constraints_check_dct[metric_dim][group] = check + + return model_metrics_constraints_check_dct + def _create_dataset_proportions_bar_chart(self, grp_name1, grp_name2, grp_name3, grp_name4, grp_name5, grp_name6, grp_name7, grp_name8, grp_dis_val1, grp_dis_val2, grp_dis_val3, grp_dis_val4, grp_dis_val5, grp_dis_val6, grp_dis_val7, grp_dis_val8): grp_names = [grp_name1, grp_name2, grp_name3, grp_name4, grp_name5, grp_name6, grp_name7, grp_name8] @@ -490,6 +603,68 @@ def _create_group_model_rank_heatmap(self, model_names: list, group_fairness_met return model_rank_heatmap + def _create_model_performance_summary(self, model_name: str, accuracy_metric, acc_threshold, + stability_metric, stability_threshold, + uncertainty_metric, uncertainty_threshold, + fairness_metric, fairness_min_val, fairness_max_val, + group_stability_metrics, group_stab_min_val, group_stab_max_val, + group_uncertainty_metrics, group_uncertainty_min_val, group_uncertainty_max_val): + accuracy_constraint = (accuracy_metric, str_to_float(acc_threshold, 'Accuracy threshold')) + stability_constraint = (stability_metric, str_to_float(stability_threshold, 'Stability threshold')) + uncertainty_constraint = (uncertainty_metric, str_to_float(uncertainty_threshold, 'Uncertainty threshold')) + fairness_constraint = (fairness_metric, [str_to_float(fairness_min_val, 'Error disparity metric min value'), + str_to_float(fairness_max_val, 'Error disparity metric max value')]) + group_stability_constraint = (group_stability_metrics, [str_to_float(group_stab_min_val, 'Stability disparity min value'), + str_to_float(group_stab_max_val, 'Stability disparity max value')]) + group_uncertainty_constraint = (group_uncertainty_metrics, [str_to_float(group_uncertainty_min_val, 'Uncertainty disparity min value'), + str_to_float(group_uncertainty_max_val, 'Uncertainty disparity max value')]) + + input_constraints_dct = { + 'Accuracy': { + 'overall': accuracy_constraint, + 'disparity': fairness_constraint, + }, + 'Stability': { + 'overall': stability_constraint, + 'disparity': group_stability_constraint, + }, + 'Uncertainty': { + 'overall': uncertainty_constraint, + 'disparity': group_uncertainty_constraint, + }, + } + + # Extract overall and disparity metrics from metrics dfs. + # Add the values to a results dict. + model_performance_dct = {} + for metric_dim in input_constraints_dct.keys(): + model_performance_dct[metric_dim] = dict() + subgroup_metric = input_constraints_dct[metric_dim]['overall'][0] + model_performance_dct[metric_dim]['Overall'] = self.sorted_model_metrics_df[ + (self.sorted_model_metrics_df.Metric == subgroup_metric) & + (self.sorted_model_metrics_df.Subgroup == 'overall') & + (self.sorted_model_metrics_df.Model_Name == model_name) + ]['Value'].values[0] + + group_metric = input_constraints_dct[metric_dim]['disparity'][0] + for group_name in self.group_names: + model_performance_dct[metric_dim]['Disparity: ' + group_name] = self.sorted_model_composed_metrics_df[ + (self.sorted_model_composed_metrics_df.Metric == group_metric) & + (self.sorted_model_composed_metrics_df.Subgroup == group_name) & + (self.sorted_model_composed_metrics_df.Model_Name == model_name) + ]['Value'].values[0] + + metric_constraints_check_dct = self.__check_metric_constraints(model_performance_dct, input_constraints_dct) + + model_metrics_matrix = pd.DataFrame(model_performance_dct).T + aligned_column_names = ['Overall'] + [col for col in model_metrics_matrix.columns if col != 'Overall'] + model_metrics_matrix = model_metrics_matrix[aligned_column_names] + metric_constraints_check_matrix = pd.DataFrame(metric_constraints_check_dct).T + metric_constraints_check_matrix = metric_constraints_check_matrix[aligned_column_names] + + model_performance_summary, _ = create_model_performance_summary_visualization(model_metrics_matrix, metric_constraints_check_matrix) + return model_performance_summary + def _create_subgroup_metrics_bar_chart_per_one_model(self, model_name: str, subgroup_accuracy_metrics_lst: list, subgroup_uncertainty_metrics: list, subgroup_stability_metrics_lst: list): metrics_names = subgroup_accuracy_metrics_lst + subgroup_uncertainty_metrics + subgroup_stability_metrics_lst diff --git a/virny/utils/data_viz_utils.py b/virny/utils/data_viz_utils.py index e8b6aba9..84512ae4 100644 --- a/virny/utils/data_viz_utils.py +++ b/virny/utils/data_viz_utils.py @@ -266,6 +266,32 @@ def create_model_rank_heatmap_visualization(model_metrics_matrix, sorted_matrix_ return fig, ax +def create_model_performance_summary_visualization(main_matrix, matrix_for_colors): + font_increase = 6 + matrix_width = 20 + matrix_height = main_matrix.shape[0] if main_matrix.shape[0] >= 3 else main_matrix.shape[0] * 2.5 + + fig = plt.figure(figsize=(matrix_width, matrix_height)) + ax = sns.heatmap(matrix_for_colors, annot=main_matrix.round(3), + cmap=["#EE8367", "#58D68D"], # [red, green] + fmt='', linewidths=1.0, + vmin=0, vmax=1, + cbar_kws={"ticks":[0, 1]}, + annot_kws={'color': 'black', 'alpha': 0.7, 'fontsize': 10 + font_increase}) + ax.set(xlabel="", ylabel="") + ax.xaxis.tick_top() + ax.tick_params(axis='y', rotation=0) + ax.tick_params(labelsize=10 + font_increase) + fig.subplots_adjust(left=0.2, top=0.7) + + cbar = ax.collections[0].colorbar + tick_labels = ['Failed', 'Passed'] + cbar.set_ticks([0.25,0.75]) + cbar.set_ticklabels(tick_labels, fontsize=10 + font_increase) + + return fig, ax + + def create_bar_plot_for_model_selection(all_subgroup_metrics_per_model_dct: dict, all_group_metrics_per_model_dct: dict, metrics_value_range_dct: dict, group: str): # Compute the number of models that satisfy the conditions From 7d2e55724123e22a9936e062bce0ea4e50804b7a Mon Sep 17 00:00:00 2001 From: denysgerasymuk799 Date: Thu, 30 Nov 2023 00:00:54 +0200 Subject: [PATCH 23/36] Added Positive-Rate to a model performance summary plot --- ...Multiple_Models_Interface_Vis_Income.ipynb | 77 ++++++++-------- .../metrics_interactive_visualizer.py | 91 ++++++++++++------- virny/utils/data_viz_utils.py | 5 +- 3 files changed, 99 insertions(+), 74 deletions(-) diff --git a/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb b/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb index a37d4449..ca36b470 100644 --- a/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb +++ b/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb @@ -6,8 +6,8 @@ "id": "248cbed8", "metadata": { "ExecuteTime": { - "end_time": "2023-11-27T23:09:00.744106Z", - "start_time": "2023-11-27T23:09:00.258137Z" + "end_time": "2023-11-29T21:02:04.386021Z", + "start_time": "2023-11-29T21:02:03.727098Z" } }, "outputs": [], @@ -23,8 +23,8 @@ "id": "7ec6cd08", "metadata": { "ExecuteTime": { - "end_time": "2023-11-27T23:09:00.753238Z", - "start_time": "2023-11-27T23:09:00.743899Z" + "end_time": "2023-11-29T21:02:04.394975Z", + "start_time": "2023-11-29T21:02:04.386298Z" } }, "outputs": [], @@ -37,12 +37,12 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "id": "b8cb69f2", "metadata": { "ExecuteTime": { - "end_time": "2023-11-27T23:09:14.159592Z", - "start_time": "2023-11-27T23:09:14.145555Z" + "end_time": "2023-11-29T21:02:04.405571Z", + "start_time": "2023-11-29T21:02:04.395579Z" } }, "outputs": [ @@ -72,12 +72,12 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "id": "7a9241de", "metadata": { "ExecuteTime": { - "end_time": "2023-11-27T23:09:16.946143Z", - "start_time": "2023-11-27T23:09:15.322037Z" + "end_time": "2023-11-29T21:02:08.026244Z", + "start_time": "2023-11-29T21:02:04.404686Z" } }, "outputs": [], @@ -92,7 +92,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "outputs": [], "source": [ "data_loader = ACSIncomeDataset(state=['GA'], year=2018, with_nulls=False, subsample_size=15_000, subsample_seed=42)\n", @@ -101,15 +101,15 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-11-27T23:09:18.236763Z", - "start_time": "2023-11-27T23:09:16.949112Z" + "end_time": "2023-11-29T21:02:09.305496Z", + "start_time": "2023-11-29T21:02:08.029615Z" } }, "id": "d3c53c7b72ecbcd0" }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "outputs": [], "source": [ "ROOT_DIR = os.path.join('docs', 'examples')\n", @@ -120,22 +120,22 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-11-27T23:09:18.781790Z", - "start_time": "2023-11-27T23:09:18.747739Z" + "end_time": "2023-11-29T21:02:09.332604Z", + "start_time": "2023-11-29T21:02:09.305881Z" } }, "id": "2aab7c79ecdee914" }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "outputs": [ { "data": { "text/plain": " Metric SEX RAC1P SEX&RAC1P \\\n0 Accuracy_Parity 0.047756 0.074977 0.065217 \n1 Aleatoric_Uncertainty_Parity -0.039005 -0.011947 -0.009222 \n2 Aleatoric_Uncertainty_Ratio 0.935159 0.979638 0.984220 \n3 Equalized_Odds_FNR 0.030793 -0.110745 -0.052498 \n4 Equalized_Odds_FPR -0.021317 0.000952 -0.007008 \n\n Model_Name \n0 LGBMClassifier__alpha=0.7 \n1 LGBMClassifier__alpha=0.7 \n2 LGBMClassifier__alpha=0.7 \n3 LGBMClassifier__alpha=0.7 \n4 LGBMClassifier__alpha=0.7 ", "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
MetricSEXRAC1PSEX&RAC1PModel_Name
0Accuracy_Parity0.0477560.0749770.065217LGBMClassifier__alpha=0.7
1Aleatoric_Uncertainty_Parity-0.039005-0.011947-0.009222LGBMClassifier__alpha=0.7
2Aleatoric_Uncertainty_Ratio0.9351590.9796380.984220LGBMClassifier__alpha=0.7
3Equalized_Odds_FNR0.030793-0.110745-0.052498LGBMClassifier__alpha=0.7
4Equalized_Odds_FPR-0.0213170.000952-0.007008LGBMClassifier__alpha=0.7
\n
" }, - "execution_count": 8, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -153,15 +153,15 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-11-27T23:09:18.905842Z", - "start_time": "2023-11-27T23:09:18.850548Z" + "end_time": "2023-11-29T21:02:09.385835Z", + "start_time": "2023-11-29T21:02:09.332537Z" } }, "id": "44ee5eff6054ce04" }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 8, "outputs": [], "source": [ "models_metrics_dct = dict()\n", @@ -171,21 +171,21 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-11-27T23:10:14.375071Z", - "start_time": "2023-11-27T23:10:14.339164Z" + "end_time": "2023-11-29T21:02:09.407603Z", + "start_time": "2023-11-29T21:02:09.385768Z" } }, "id": "833484748ed512e8" }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 9, "outputs": [ { "data": { "text/plain": "dict_keys(['LGBMClassifier__alpha=0.7', 'LGBMClassifier__alpha=0.0', 'LGBMClassifier__alpha=0.4', 'LogisticRegression__alpha=0.0', 'LogisticRegression__alpha=0.7', 'LogisticRegression__alpha=0.4', 'MLPClassifier__alpha=0.0', 'MLPClassifier__alpha=0.7', 'MLPClassifier__alpha=0.4', 'RandomForestClassifier__alpha=0.4', 'RandomForestClassifier__alpha=0.7', 'RandomForestClassifier__alpha=0.0'])" }, - "execution_count": 11, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -196,8 +196,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-11-27T23:10:15.006243Z", - "start_time": "2023-11-27T23:10:14.979880Z" + "end_time": "2023-11-29T21:02:09.456986Z", + "start_time": "2023-11-29T21:02:09.407709Z" } }, "id": "15ed7d1ba1f22317" @@ -212,12 +212,12 @@ }, { "cell_type": "code", - "execution_count": 58, + "execution_count": 19, "id": "435b9d98", "metadata": { "ExecuteTime": { - "end_time": "2023-11-27T23:59:15.016940Z", - "start_time": "2023-11-27T23:59:14.968372Z" + "end_time": "2023-11-29T21:56:28.048524Z", + "start_time": "2023-11-29T21:56:27.922421Z" } }, "outputs": [], @@ -229,7 +229,7 @@ }, { "cell_type": "code", - "execution_count": 59, + "execution_count": null, "outputs": [ { "name": "stdout", @@ -237,8 +237,7 @@ "text": [ "Running on local URL: http://127.0.0.1:7860\n", "\n", - "To create a public link, set `share=True` in `launch()`.\n", - "Keyboard interruption in main thread... closing server.\n" + "To create a public link, set `share=True` in `launch()`.\n" ] } ], @@ -247,9 +246,9 @@ ], "metadata": { "collapsed": false, + "is_executing": true, "ExecuteTime": { - "end_time": "2023-11-28T00:08:09.433964Z", - "start_time": "2023-11-27T23:59:15.062378Z" + "start_time": "2023-11-29T21:56:28.049665Z" } }, "id": "678a9dc8d51243f4" @@ -272,8 +271,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-11-27T22:52:53.559673Z", - "start_time": "2023-11-27T22:52:53.432952Z" + "end_time": "2023-11-29T21:12:46.494378Z", + "start_time": "2023-11-29T21:12:46.442750Z" } }, "id": "277b6d1de837dab7" @@ -286,8 +285,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-11-27T22:52:53.561907Z", - "start_time": "2023-11-27T22:52:53.559309Z" + "end_time": "2023-11-29T21:12:46.501645Z", + "start_time": "2023-11-29T21:12:46.483631Z" } }, "id": "c207d4345ddca1db" diff --git a/virny/custom_classes/metrics_interactive_visualizer.py b/virny/custom_classes/metrics_interactive_visualizer.py index 69857337..5333ca08 100644 --- a/virny/custom_classes/metrics_interactive_visualizer.py +++ b/virny/custom_classes/metrics_interactive_visualizer.py @@ -316,25 +316,32 @@ def start_web_app(self): """) with gr.Row(): accuracy_metric_vw4 = gr.Dropdown( - sorted(self.all_accuracy_metrics), + sorted([metric for metric in self.all_accuracy_metrics if metric != POSITIVE_RATE]), value=ACCURACY, multiselect=False, label="Accuracy Metric", - scale=3 + scale=2 ) - acc_threshold_vw4 = gr.Text(value="0.0", label="Threshold", scale=2) + accuracy_min_val_vw4 = gr.Text(value="0.0", label="Min value", scale=1) + accuracy_max_val_vw4 = gr.Text(value="1.0", label="Max value", scale=1) with gr.Row(): subgroup_stability_metric_vw4 = gr.Dropdown( sorted(self.all_stability_metrics), value=LABEL_STABILITY, multiselect=False, label="Stability Metric", - scale=3 + scale=2 ) - subgroup_stab_threshold_vw4 = gr.Text(value="0.0", label="Threshold", scale=2) + subgroup_stab_min_val_vw4 = gr.Text(value="0.0", label="Min value", scale=1) + subgroup_stab_max_val_vw4 = gr.Text(value="1.0", label="Max value", scale=1) with gr.Row(): subgroup_uncertainty_metric_vw4 = gr.Dropdown( sorted(self.all_uncertainty_metrics), value=ALEATORIC_UNCERTAINTY, multiselect=False, label="Uncertainty Metric", - scale=3 + scale=2 ) - subgroup_uncertainty_threshold_vw4 = gr.Text(value="0.0", label="Threshold", scale=2) + subgroup_uncertainty_min_val_vw4 = gr.Text(value="0.0", label="Min value", scale=1) + subgroup_uncertainty_max_val_vw4 = gr.Text(value="1.0", label="Max value", scale=1) + with gr.Row(): + positive_rate_metric_vw4 = gr.Text(value=POSITIVE_RATE, label="Positive-Rate Metric", scale=2) + positive_rate_min_val_vw4 = gr.Text(value="0.0", label="Min value", scale=1) + positive_rate_max_val_vw4 = gr.Text(value="1.0", label="Max value", scale=1) btn_view4 = gr.Button("Submit") with gr.Column(): @@ -366,17 +373,27 @@ def start_web_app(self): ) group_uncertainty_min_val_vw4 = gr.Text(value="-1.0", label="Min value", scale=1) group_uncertainty_max_val_vw4 = gr.Text(value="1.0", label="Max value", scale=1) + with gr.Row(): + group_positive_rate_metrics_vw4 = gr.Dropdown( + sorted([DISPARATE_IMPACT, STATISTICAL_PARITY_DIFFERENCE]), + value=DISPARATE_IMPACT, multiselect=False, label="Positive-Rate Disparity Metric", + scale=2 + ) + group_positive_rate_min_val_vw4 = gr.Text(value="0.7", label="Min value", scale=1) + group_positive_rate_max_val_vw4 = gr.Text(value="1.5", label="Max value", scale=1) with gr.Row(): model_performance_summary = gr.Plot(label="Model Performance Summary") btn_view4.click(self._create_model_performance_summary, inputs=[model_name_vw4, - accuracy_metric_vw4, acc_threshold_vw4, - subgroup_stability_metric_vw4, subgroup_stab_threshold_vw4, - subgroup_uncertainty_metric_vw4, subgroup_uncertainty_threshold_vw4, + accuracy_metric_vw4, accuracy_min_val_vw4, accuracy_max_val_vw4, + subgroup_stability_metric_vw4, subgroup_stab_min_val_vw4, subgroup_stab_max_val_vw4, + subgroup_uncertainty_metric_vw4, subgroup_uncertainty_min_val_vw4, subgroup_uncertainty_max_val_vw4, + positive_rate_metric_vw4, positive_rate_min_val_vw4, positive_rate_max_val_vw4, fairness_metric_vw4, fairness_min_val_vw4, fairness_max_val_vw4, group_stability_metrics_vw4, group_stab_min_val_vw4, group_stab_max_val_vw4, - group_uncertainty_metrics_vw4, group_uncertainty_min_val_vw4, group_uncertainty_max_val_vw4], + group_uncertainty_metrics_vw4, group_uncertainty_min_val_vw4, group_uncertainty_max_val_vw4, + group_positive_rate_metrics_vw4, group_positive_rate_min_val_vw4, group_positive_rate_max_val_vw4], outputs=[model_performance_summary]) self.demo = demo @@ -413,16 +430,10 @@ def __check_metric_constraints(self, model_performance_dct, input_constraint_dct for metric_dim in model_performance_dct.keys(): model_metrics_constraints_check_dct[metric_dim] = dict() for group in model_performance_dct[metric_dim]: - if group == 'Overall': - constraint_type = 'overall' - threshold = input_constraint_dct[metric_dim][constraint_type][1] - check = 1 if model_performance_dct[metric_dim][group] >= threshold else 0 - model_metrics_constraints_check_dct[metric_dim][group] = check - else: - constraint_type = 'disparity' - min_val, max_val = input_constraint_dct[metric_dim][constraint_type][1] - check = 1 if model_performance_dct[metric_dim][group] >= min_val and model_performance_dct[metric_dim][group] <= max_val else 0 - model_metrics_constraints_check_dct[metric_dim][group] = check + constraint_type = 'overall' if group == 'Overall' else 'disparity' + min_val, max_val = input_constraint_dct[metric_dim][constraint_type][1] + check = 1 if model_performance_dct[metric_dim][group] >= min_val and model_performance_dct[metric_dim][group] <= max_val else 0 + model_metrics_constraints_check_dct[metric_dim][group] = check return model_metrics_constraints_check_dct @@ -603,21 +614,31 @@ def _create_group_model_rank_heatmap(self, model_names: list, group_fairness_met return model_rank_heatmap - def _create_model_performance_summary(self, model_name: str, accuracy_metric, acc_threshold, - stability_metric, stability_threshold, - uncertainty_metric, uncertainty_threshold, + def _create_model_performance_summary(self, model_name: str, accuracy_metric, accuracy_min_val, accuracy_max_val, + stability_metric, stability_min_val, stability_max_val, + uncertainty_metric, uncertainty_min_val, uncertainty_max_val, + positive_rate_metric, positive_rate_min_val, positive_rate_max_val, fairness_metric, fairness_min_val, fairness_max_val, - group_stability_metrics, group_stab_min_val, group_stab_max_val, - group_uncertainty_metrics, group_uncertainty_min_val, group_uncertainty_max_val): - accuracy_constraint = (accuracy_metric, str_to_float(acc_threshold, 'Accuracy threshold')) - stability_constraint = (stability_metric, str_to_float(stability_threshold, 'Stability threshold')) - uncertainty_constraint = (uncertainty_metric, str_to_float(uncertainty_threshold, 'Uncertainty threshold')) + group_stability_metric, group_stab_min_val, group_stab_max_val, + group_uncertainty_metric, group_uncertainty_min_val, group_uncertainty_max_val, + group_positive_rate_metric, group_positive_rate_min_val, group_positive_rate_max_val): + accuracy_constraint = (accuracy_metric, [str_to_float(accuracy_min_val, 'Accuracy min value'), + str_to_float(accuracy_max_val, 'Accuracy max value')]) + stability_constraint = (stability_metric, [str_to_float(stability_min_val, 'Stability min value'), + str_to_float(stability_max_val, 'Stability max value')]) + uncertainty_constraint = (uncertainty_metric, [str_to_float(uncertainty_min_val, 'Uncertainty min value'), + str_to_float(uncertainty_max_val, 'Uncertainty max value')]) + positive_rate_constraint = (positive_rate_metric, [str_to_float(positive_rate_min_val, 'Positive-Rate min value'), + str_to_float(positive_rate_max_val, 'Positive-Rate max value')]) + fairness_constraint = (fairness_metric, [str_to_float(fairness_min_val, 'Error disparity metric min value'), str_to_float(fairness_max_val, 'Error disparity metric max value')]) - group_stability_constraint = (group_stability_metrics, [str_to_float(group_stab_min_val, 'Stability disparity min value'), - str_to_float(group_stab_max_val, 'Stability disparity max value')]) - group_uncertainty_constraint = (group_uncertainty_metrics, [str_to_float(group_uncertainty_min_val, 'Uncertainty disparity min value'), - str_to_float(group_uncertainty_max_val, 'Uncertainty disparity max value')]) + group_stability_constraint = (group_stability_metric, [str_to_float(group_stab_min_val, 'Stability disparity min value'), + str_to_float(group_stab_max_val, 'Stability disparity max value')]) + group_uncertainty_constraint = (group_uncertainty_metric, [str_to_float(group_uncertainty_min_val, 'Uncertainty disparity min value'), + str_to_float(group_uncertainty_max_val, 'Uncertainty disparity max value')]) + group_positive_rate_constraint = (group_positive_rate_metric, [str_to_float(group_positive_rate_min_val, 'Positive-Rate disparity min value'), + str_to_float(group_positive_rate_max_val, 'Positive-Rate disparity max value')]) input_constraints_dct = { 'Accuracy': { @@ -632,6 +653,10 @@ def _create_model_performance_summary(self, model_name: str, accuracy_metric, ac 'overall': uncertainty_constraint, 'disparity': group_uncertainty_constraint, }, + 'Positive-Rate': { + 'overall': positive_rate_constraint, + 'disparity': group_positive_rate_constraint, + }, } # Extract overall and disparity metrics from metrics dfs. diff --git a/virny/utils/data_viz_utils.py b/virny/utils/data_viz_utils.py index 84512ae4..96e1a945 100644 --- a/virny/utils/data_viz_utils.py +++ b/virny/utils/data_viz_utils.py @@ -77,8 +77,8 @@ def create_subgroup_sorted_matrix_by_rank(model_metrics_matrix, tolerance) -> np models_distances_matrix = model_metrics_matrix.copy(deep=True).T metric_names = models_distances_matrix.columns for metric_name in metric_names: - if check_substring_in_list(metric_name, ['TPR', 'TNR', 'PPV', 'Accuracy', 'F1', 'Label_Stability']): - # Cast a metric to a case when the closer value to zero is the better + if check_substring_in_list(metric_name, ['TPR', 'TNR', 'PPV', 'Accuracy', 'F1', 'Label_Stability', 'Positive-Rate']): + # Cast a metric to a case when the closer value to one is the better models_distances_matrix[metric_name] = 1 - models_distances_matrix[metric_name] models_distances_matrix[metric_name] = models_distances_matrix[metric_name].abs() @@ -308,6 +308,7 @@ def create_bar_plot_for_model_selection(all_subgroup_metrics_per_model_dct: dict 'PPV': 'C1', 'Accuracy': 'C1', 'F1': 'C1', + 'Positive-Rate': 'C1', # C2 'Equalized_Odds_TPR': 'C2', 'Equalized_Odds_FPR': 'C2', From a773815fd7ef365f2f7a83fb2c0876f6066af5cd Mon Sep 17 00:00:00 2001 From: denysgerasymuk799 Date: Thu, 30 Nov 2023 00:19:00 +0200 Subject: [PATCH 24/36] Improved dataset stats plot --- .../Multiple_Models_Interface_Vis_Income.ipynb | 8 ++++---- .../metrics_interactive_visualizer.py | 16 +++++++++++++--- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb b/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb index ca36b470..561ddd14 100644 --- a/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb +++ b/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb @@ -212,12 +212,12 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 25, "id": "435b9d98", "metadata": { "ExecuteTime": { - "end_time": "2023-11-29T21:56:28.048524Z", - "start_time": "2023-11-29T21:56:27.922421Z" + "end_time": "2023-11-29T22:15:44.175233Z", + "start_time": "2023-11-29T22:15:43.997200Z" } }, "outputs": [], @@ -248,7 +248,7 @@ "collapsed": false, "is_executing": true, "ExecuteTime": { - "start_time": "2023-11-29T21:56:28.049665Z" + "start_time": "2023-11-29T22:15:44.176046Z" } }, "id": "678a9dc8d51243f4" diff --git a/virny/custom_classes/metrics_interactive_visualizer.py b/virny/custom_classes/metrics_interactive_visualizer.py index 5333ca08..f3fcdbac 100644 --- a/virny/custom_classes/metrics_interactive_visualizer.py +++ b/virny/custom_classes/metrics_interactive_visualizer.py @@ -102,11 +102,21 @@ def start_web_app(self): s = gr.Slider(1, self.max_groups, value=default_val, step=1, label="How many groups to show:") grp_names = [] grp_dis_values = [] + sensitive_attr_items = list(self.sensitive_attributes_dct.items()) for i in range(self.max_groups): visibility = True if i + 1 <= default_val else False with gr.Row(): - grp_name = gr.Text(label=f"Group {i + 1}", interactive=True, visible=visibility) - grp_dis_value = gr.Text(label="Disadvantage value", interactive=True, visible=visibility) + if visibility and i + 1 <= len(sensitive_attr_items): + grp, dis_value = sensitive_attr_items[i] + if dis_value is None: + dis_value = '-' + elif isinstance(dis_value, str): + dis_value = f"'{dis_value}'" + grp_name = gr.Text(label=f"Group {i + 1}", value=grp, interactive=True, visible=visibility) + grp_dis_value = gr.Text(label="Disadvantage value", value=dis_value, interactive=True, visible=visibility) + else: + grp_name = gr.Text(label=f"Group {i + 1}", interactive=True, visible=visibility) + grp_dis_value = gr.Text(label="Disadvantage value", interactive=True, visible=visibility) grp_names.append(grp_name) grp_dis_values.append(grp_dis_value) @@ -450,7 +460,7 @@ def _create_dataset_proportions_bar_chart(self, grp_name1, grp_name2, grp_name3, if '&' in grp_name: input_sensitive_attrs_dct[grp_name] = None else: - converted_grp_dis_val = eval(grp_dis_val) if '[' in grp_dis_val else grp_dis_val + converted_grp_dis_val = eval(grp_dis_val) input_sensitive_attrs_dct[grp_name] = converted_grp_dis_val # Partition on protected groups From 1d5ad3aacfcfad69cad634a81a02f00bdb8b779e Mon Sep 17 00:00:00 2001 From: denysgerasymuk799 Date: Thu, 30 Nov 2023 01:22:05 +0200 Subject: [PATCH 25/36] Added overall and disparity constraints to a model selection bar chart --- ...Multiple_Models_Interface_Vis_Income.ipynb | 8 +- .../metrics_interactive_visualizer.py | 97 +++++++++++-------- virny/utils/data_viz_utils.py | 53 ++++++++++ 3 files changed, 111 insertions(+), 47 deletions(-) diff --git a/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb b/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb index 561ddd14..b5faed57 100644 --- a/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb +++ b/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb @@ -212,12 +212,12 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 27, "id": "435b9d98", "metadata": { "ExecuteTime": { - "end_time": "2023-11-29T22:15:44.175233Z", - "start_time": "2023-11-29T22:15:43.997200Z" + "end_time": "2023-11-29T23:17:11.979632Z", + "start_time": "2023-11-29T23:17:11.761681Z" } }, "outputs": [], @@ -248,7 +248,7 @@ "collapsed": false, "is_executing": true, "ExecuteTime": { - "start_time": "2023-11-29T22:15:44.176046Z" + "start_time": "2023-11-29T23:17:11.980148Z" } }, "id": "678a9dc8d51243f4" diff --git a/virny/custom_classes/metrics_interactive_visualizer.py b/virny/custom_classes/metrics_interactive_visualizer.py index f3fcdbac..375866a4 100644 --- a/virny/custom_classes/metrics_interactive_visualizer.py +++ b/virny/custom_classes/metrics_interactive_visualizer.py @@ -7,7 +7,7 @@ from virny.utils.common_helpers import str_to_float from virny.utils.protected_groups_partitioning import create_test_protected_groups from virny.utils.data_viz_utils import (create_model_rank_heatmap_visualization, create_sorted_matrix_by_rank, - create_subgroup_sorted_matrix_by_rank, create_bar_plot_for_model_selection, + create_subgroup_sorted_matrix_by_rank, create_flexible_bar_plot_for_model_selection, compute_proportions, compute_base_rates, create_col_facet_bar_chart, create_model_performance_summary_visualization) @@ -51,6 +51,9 @@ def __init__(self, X_data: pd.DataFrame, y_data: pd.DataFrame, model_metrics_dct self.all_stability_disparity_metrics = [LABEL_STABILITY_RATIO, LABEL_STABILITY_DIFFERENCE, IQR_PARITY, STD_PARITY, STD_RATIO, JITTER_PARITY] self.all_uncertainty_disparity_metrics = [OVERALL_UNCERTAINTY_PARITY, OVERALL_UNCERTAINTY_RATIO, ALEATORIC_UNCERTAINTY_PARITY, ALEATORIC_UNCERTAINTY_RATIO] + self.all_overall_metrics = self.all_accuracy_metrics + self.all_stability_metrics + self.all_uncertainty_metrics + self.all_disparity_metrics = self.all_error_disparity_metrics + self.all_stability_disparity_metrics + self.all_uncertainty_disparity_metrics + # Create one metrics df with all model_dfs models_metrics_df = pd.DataFrame() for model_name in model_metrics_dct.keys(): @@ -143,37 +146,38 @@ def start_web_app(self): value=self.group_names[0], multiselect=False, label="Group Name for Disparity Metrics", ) with gr.Row(): - accuracy_metric = gr.Dropdown( - sorted(self.all_accuracy_metrics), - value='Accuracy', multiselect=False, label="Constraint 1 (C1)", + overall_metric1 = gr.Dropdown( + sorted(self.all_overall_metrics), + value='Accuracy', multiselect=False, label="Overall Constraint (C1)", scale=2 ) - acc_min_val = gr.Text(value="0.0", label="Min value", scale=1) - acc_max_val = gr.Text(value="1.0", label="Max value", scale=1) + overall_metric_min_val1 = gr.Text(value="0.0", label="Min value", scale=1) + overall_metric_max_val1 = gr.Text(value="1.0", label="Max value", scale=1) with gr.Row(): - fairness_metric = gr.Dropdown( - sorted(self.all_error_disparity_metrics), - value='Equalized_Odds_FPR', multiselect=False, label="Constraint 2 (C2)", + disparity_metric1 = gr.Dropdown( + sorted(self.all_disparity_metrics), + value='Equalized_Odds_FPR', multiselect=False, label="Disparity Constraint (C2)", scale=2 ) - fairness_min_val = gr.Text(value="-1.0", label="Min value", scale=1) - fairness_max_val = gr.Text(value="1.0", label="Max value", scale=1) + disparity_metric_min_val1 = gr.Text(value="-1.0", label="Min value", scale=1) + disparity_metric_max_val1 = gr.Text(value="1.0", label="Max value", scale=1) with gr.Row(): - subgroup_stability_metric = gr.Dropdown( - sorted(self.all_stability_metrics), - value='Label_Stability', multiselect=False, label="Constraint 3 (C3)", + overall_metric2 = gr.Dropdown( + sorted(self.all_overall_metrics), + value='Label_Stability', multiselect=False, label="Overall Constraint (C3)", scale=2 ) - subgroup_stab_min_val = gr.Text(value="0.0", label="Min value", scale=1) - subgroup_stab_max_val = gr.Text(value="1.0", label="Max value", scale=1) + overall_metric_min_val2 = gr.Text(value="0.0", label="Min value", scale=1) + overall_metric_max_val2 = gr.Text(value="1.0", label="Max value", scale=1) with gr.Row(): - group_stability_metrics = gr.Dropdown( - sorted(self.all_stability_disparity_metrics), - value='Label_Stability_Ratio', multiselect=False, label="Constraint 4 (C4)", + disparity_metric2 = gr.Dropdown( + sorted(self.all_disparity_metrics), + value='Label_Stability_Ratio', multiselect=False, label="Disparity Constraint (C4)", scale=2 ) - group_stab_min_val = gr.Text(value="0.7", label="Min value", scale=1) - group_stab_max_val = gr.Text(value="1.5", label="Max value", scale=1) + disparity_metric_min_val2 = gr.Text(value="0.7", label="Min value", scale=1) + disparity_metric_max_val2 = gr.Text(value="1.5", label="Max value", scale=1) + btn_view1 = gr.Button("Submit") with gr.Column(scale=3): bar_plot_for_model_selection = gr.Plot(label="Bar Chart") @@ -181,10 +185,10 @@ def start_web_app(self): btn_view1.click(self._create_bar_plot_for_model_selection, inputs=[group_name, - accuracy_metric, acc_min_val, acc_max_val, - fairness_metric, fairness_min_val, fairness_max_val, - subgroup_stability_metric, subgroup_stab_min_val, subgroup_stab_max_val, - group_stability_metrics, group_stab_min_val, group_stab_max_val], + overall_metric1, overall_metric_min_val1, overall_metric_max_val1, + disparity_metric1, disparity_metric_min_val1, disparity_metric_max_val1, + overall_metric2, overall_metric_min_val2, overall_metric_max_val2, + disparity_metric2, disparity_metric_min_val2, disparity_metric_max_val2], outputs=[bar_plot_for_model_selection, df_with_models_satisfied_all_constraints]) # ======================================= Overall Metrics Heatmap ======================================= gr.Markdown( @@ -495,25 +499,31 @@ def _create_dataset_proportions_bar_chart(self, grp_name1, grp_name2, grp_name3, return col_facet_bar_chart - def _create_bar_plot_for_model_selection(self, group_name, accuracy_metric, acc_min_val, acc_max_val, - fairness_metric, fairness_min_val, fairness_max_val, - subgroup_stability_metric, subgroup_stab_min_val, subgroup_stab_max_val, - group_stability_metrics, group_stab_min_val, group_stab_max_val): - accuracy_constraint = (accuracy_metric, str_to_float(acc_min_val, 'C1 min value'), str_to_float(acc_max_val, 'C2 max value')) - fairness_constraint = (fairness_metric, str_to_float(fairness_min_val, 'C2 min value'), str_to_float(fairness_max_val, 'C2 max value')) - subgroup_stability_constraint = (subgroup_stability_metric, str_to_float(subgroup_stab_min_val, 'C3 min value'), str_to_float(subgroup_stab_max_val, 'C3 max value')) - group_stability_constraint = (group_stability_metrics, str_to_float(group_stab_min_val, 'C4 min value'), str_to_float(group_stab_max_val, 'C4 max value')) + def _create_bar_plot_for_model_selection(self, group_name, overall_metric1, overall_metric_min_val1, overall_metric_max_val1, + disparity_metric1, disparity_metric_min_val1, disparity_metric_max_val1, + overall_metric2, overall_metric_min_val2, overall_metric_max_val2, + disparity_metric2, disparity_metric_min_val2, disparity_metric_max_val2): + metric_name_to_alias_dct = { + overall_metric1: 'C1', + disparity_metric1: 'C2', + overall_metric2: 'C3', + disparity_metric2: 'C4', + } + overall_constraint1 = (overall_metric1, str_to_float(overall_metric_min_val1, 'C1 min value'), str_to_float(overall_metric_max_val1, 'C2 max value')) + disparity_constraint1 = (disparity_metric1, str_to_float(disparity_metric_min_val1, 'C2 min value'), str_to_float(disparity_metric_max_val1, 'C2 max value')) + overall_constraint2 = (overall_metric2, str_to_float(overall_metric_min_val2, 'C3 min value'), str_to_float(overall_metric_max_val2, 'C3 max value')) + disparity_constraint2 = (disparity_metric2, str_to_float(disparity_metric_min_val2, 'C4 min value'), str_to_float(disparity_metric_max_val2, 'C4 max value')) # Create individual constraints metrics_value_range_dct = dict() - for constraint in [accuracy_constraint, fairness_constraint, subgroup_stability_constraint, group_stability_constraint]: + for constraint in [overall_constraint1, disparity_constraint1, overall_constraint2, disparity_constraint2]: metrics_value_range_dct[constraint[0]] = [constraint[1], constraint[2]] # Create intersectional constraints - metrics_value_range_dct[f'{accuracy_constraint[0]}&{fairness_constraint[0]}'] = None - metrics_value_range_dct[f'{accuracy_constraint[0]}&{subgroup_stability_constraint[0]}'] = None - metrics_value_range_dct[f'{accuracy_constraint[0]}&{group_stability_constraint[0]}'] = None - metrics_value_range_dct[(f'{accuracy_constraint[0]}&{fairness_constraint[0]}' - f'&{subgroup_stability_constraint[0]}&{group_stability_constraint[0]}')] = None + metrics_value_range_dct[f'{overall_constraint1[0]}&{disparity_constraint1[0]}'] = None + metrics_value_range_dct[f'{overall_constraint1[0]}&{overall_constraint2[0]}'] = None + metrics_value_range_dct[f'{overall_constraint1[0]}&{disparity_constraint2[0]}'] = None + metrics_value_range_dct[(f'{overall_constraint1[0]}&{disparity_constraint1[0]}' + f'&{overall_constraint2[0]}&{disparity_constraint2[0]}')] = None melted_all_subgroup_metrics_per_model_dct = dict() for model_name in self.melted_model_metrics_df['Model_Name'].unique(): @@ -525,10 +535,11 @@ def _create_bar_plot_for_model_selection(self, group_name, accuracy_metric, acc_ melted_all_group_metrics_per_model_dct[model_name] = ( self.melted_model_composed_metrics_df)[self.melted_model_composed_metrics_df.Model_Name == model_name] - return create_bar_plot_for_model_selection(melted_all_subgroup_metrics_per_model_dct, - melted_all_group_metrics_per_model_dct, - metrics_value_range_dct, - group=group_name) + return create_flexible_bar_plot_for_model_selection(melted_all_subgroup_metrics_per_model_dct, + melted_all_group_metrics_per_model_dct, + metrics_value_range_dct, + group=group_name, + metric_name_to_alias_dct=metric_name_to_alias_dct) def _create_subgroup_model_rank_heatmap(self, model_names: list, subgroup_accuracy_metrics_lst: list, subgroup_uncertainty_metrics: list, subgroup_stability_metrics_lst: list, diff --git a/virny/utils/data_viz_utils.py b/virny/utils/data_viz_utils.py index 96e1a945..ab4534bd 100644 --- a/virny/utils/data_viz_utils.py +++ b/virny/utils/data_viz_utils.py @@ -292,6 +292,58 @@ def create_model_performance_summary_visualization(main_matrix, matrix_for_color return fig, ax +def create_flexible_bar_plot_for_model_selection(all_subgroup_metrics_per_model_dct: dict, all_group_metrics_per_model_dct: dict, + metrics_value_range_dct: dict, group: str, metric_name_to_alias_dct: dict): + # Compute the number of models that satisfy the conditions + models_in_range_df, df_with_models_satisfied_all_constraints = ( + create_models_in_range_dct(all_subgroup_metrics_per_model_dct, all_group_metrics_per_model_dct, + metrics_value_range_dct, group)) + + def get_column_alias(metric_group): + if '&' not in metric_group: + alias = metric_name_to_alias_dct[metric_group] + else: + metrics = metric_group.split('&') + alias = None + for idx, metric in enumerate(metrics): + if idx == 0: + alias = metric_name_to_alias_dct[metric] + else: + alias += ' & ' + metric_name_to_alias_dct[metric] + + return alias + + # Replace metric groups on their aliases + models_in_range_df['Alias'] = models_in_range_df['Metric_Group'].apply(get_column_alias) + models_in_range_df['Title'] = models_in_range_df['Alias'] + + base_font_size = 14 + bar_plot = alt.Chart(models_in_range_df).mark_bar().encode( + x=alt.X("Title", type="nominal", title='Metric Group', axis=alt.Axis(labelAngle=-30), + sort=alt.Sort(order='ascending')), + y=alt.Y("Number_of_Models", title="Number of Models", type="quantitative"), + color=alt.Color('Model_Type', legend=alt.Legend(title='Model Type')) + ).configure(padding={'top': 33} + ).configure_axis( + labelFontSize=base_font_size + 2, + titleFontSize=base_font_size + 4, + labelFontWeight='normal', + titleFontWeight='normal', + labelLimit=300, + tickMinStep=1, + ).configure_title( + fontSize=base_font_size + 2 + ).configure_legend( + titleFontSize=base_font_size + 4, + labelFontSize=base_font_size + 2, + symbolStrokeWidth=4, + labelLimit=300, + titleLimit=220, + ).properties(width=650, height=450) + + return bar_plot, df_with_models_satisfied_all_constraints + + def create_bar_plot_for_model_selection(all_subgroup_metrics_per_model_dct: dict, all_group_metrics_per_model_dct: dict, metrics_value_range_dct: dict, group: str): # Compute the number of models that satisfy the conditions @@ -323,6 +375,7 @@ def create_bar_plot_for_model_selection(all_subgroup_metrics_per_model_dct: dict # C4 'IQR_Parity': 'C4', 'Label_Stability_Ratio': 'C4', + 'Label_Stability_Difference': 'C4', 'Std_Parity': 'C4', 'Std_Ratio': 'C4', 'Jitter_Parity': 'C4', From 2a6e71ee8b4e6986a016c1ca693913c7a016e509 Mon Sep 17 00:00:00 2001 From: denysgerasymuk799 Date: Thu, 30 Nov 2023 01:51:28 +0200 Subject: [PATCH 26/36] Added uncertainty disparity bar charts --- ...Multiple_Models_Interface_Vis_Income.ipynb | 8 ++-- .../metrics_interactive_visualizer.py | 37 +++++++++++++------ 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb b/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb index b5faed57..18bcc88c 100644 --- a/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb +++ b/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb @@ -212,12 +212,12 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 35, "id": "435b9d98", "metadata": { "ExecuteTime": { - "end_time": "2023-11-29T23:17:11.979632Z", - "start_time": "2023-11-29T23:17:11.761681Z" + "end_time": "2023-11-29T23:48:34.526173Z", + "start_time": "2023-11-29T23:48:34.278833Z" } }, "outputs": [], @@ -248,7 +248,7 @@ "collapsed": false, "is_executing": true, "ExecuteTime": { - "start_time": "2023-11-29T23:17:11.980148Z" + "start_time": "2023-11-29T23:48:34.526950Z" } }, "id": "678a9dc8d51243f4" diff --git a/virny/custom_classes/metrics_interactive_visualizer.py b/virny/custom_classes/metrics_interactive_visualizer.py index 375866a4..1b399eb5 100644 --- a/virny/custom_classes/metrics_interactive_visualizer.py +++ b/virny/custom_classes/metrics_interactive_visualizer.py @@ -133,6 +133,7 @@ def start_web_app(self): inputs=[grp_names[0], grp_names[1], grp_names[2], grp_names[3], grp_names[4], grp_names[5], grp_names[6], grp_names[7], grp_dis_values[0], grp_dis_values[1], grp_dis_values[2], grp_dis_values[3], grp_dis_values[4], grp_dis_values[5], grp_dis_values[6], grp_dis_values[7]], outputs=[dataset_proportions_bar_chart]) + # ==================================== Bar Chart for Model Selection ==================================== gr.Markdown( """ @@ -190,6 +191,7 @@ def start_web_app(self): overall_metric2, overall_metric_min_val2, overall_metric_max_val2, disparity_metric2, disparity_metric_min_val2, disparity_metric_max_val2], outputs=[bar_plot_for_model_selection, df_with_models_satisfied_all_constraints]) + # ======================================= Overall Metrics Heatmap ======================================= gr.Markdown( """ @@ -222,6 +224,7 @@ def start_web_app(self): subgroup_btn_view2.click(self._create_subgroup_model_rank_heatmap, inputs=[model_names, accuracy_metrics, uncertainty_metrics, subgroup_stability_metrics, subgroup_tolerance], outputs=[subgroup_model_ranking_heatmap]) + # ======================================== Disparity Metrics Heatmap ======================================== gr.Markdown( """ @@ -235,11 +238,15 @@ def start_web_app(self): label="Model Names", info="Select model names to display on the heatmap:", ) group_tolerance = gr.Text(value="0.005", label="Tolerance", info="Define an acceptable tolerance for metric dense ranking.") - fairness_metrics = gr.Dropdown( + fairness_metrics_vw2 = gr.Dropdown( sorted(self.all_error_disparity_metrics), value=['Equalized_Odds_FPR', 'Equalized_Odds_TPR'], multiselect=True, label="Error Disparity Metrics", info="Select error disparity metrics to display on the heatmap:", ) - group_stability_metrics = gr.Dropdown( + group_uncertainty_metrics_vw2 = gr.Dropdown( + sorted(self.all_uncertainty_disparity_metrics), + value=['Overall_Uncertainty_Parity'], multiselect=True, label="Uncertainty Disparity Metrics", info="Select uncertainty disparity metrics to display on the heatmap:", + ) + group_stability_metrics_vw2 = gr.Dropdown( sorted(self.all_stability_disparity_metrics), value=['Label_Stability_Ratio', 'Std_Parity'], multiselect=True, label="Stability Disparity Metrics", info="Select stability disparity metrics to display on the heatmap:", ) @@ -248,8 +255,9 @@ def start_web_app(self): group_model_ranking_heatmap = gr.Plot(label="Heatmap") group_btn_view2.click(self._create_group_model_rank_heatmap, - inputs=[model_names, fairness_metrics, group_stability_metrics, group_tolerance], + inputs=[model_names, fairness_metrics_vw2, group_uncertainty_metrics_vw2, group_stability_metrics_vw2, group_tolerance], outputs=[group_model_ranking_heatmap]) + # ============================ Group Specific and Disparity Metrics Bar Charts ============================ with gr.Row(): # Scale column 1 to a half of a screen @@ -288,11 +296,15 @@ def start_web_app(self): """ ### Disparity Metrics """) - fairness_metrics = gr.Dropdown( + fairness_metrics_vw3 = gr.Dropdown( sorted(self.all_error_disparity_metrics), value=['Equalized_Odds_FPR', 'Equalized_Odds_TPR'], multiselect=True, label="Error Disparity Metrics", info="Select error disparity metrics to display on the heatmap:", ) - group_stability_metrics = gr.Dropdown( + group_uncertainty_metrics_vw3 = gr.Dropdown( + sorted(self.all_uncertainty_disparity_metrics), + value=['Aleatoric_Uncertainty_Ratio', 'Overall_Uncertainty_Parity'], multiselect=True, label="Uncertainty Disparity Metrics", info="Select uncertainty disparity metrics to display on the heatmap:", + ) + group_stability_metrics_vw3 = gr.Dropdown( sorted(self.all_stability_disparity_metrics), value=['Label_Stability_Ratio', 'Std_Parity'], multiselect=True, label="Stability Disparity Metrics", info="Select stability disparity metrics to display on the heatmap:", ) @@ -306,8 +318,9 @@ def start_web_app(self): inputs=[model_name_vw3, accuracy_metrics, uncertainty_metrics, subgroup_stability_metrics], outputs=[subgroup_metrics_bar_chart]) btn_view3.click(self._create_group_metrics_bar_chart_per_one_model, - inputs=[model_name_vw3, fairness_metrics, group_stability_metrics], + inputs=[model_name_vw3, fairness_metrics_vw3, group_uncertainty_metrics_vw3, group_stability_metrics_vw3], outputs=[group_metrics_bar_chart]) + # ============================ Model Performance Summary ============================ with gr.Row(): # Scale column 1 to a half of a screen @@ -326,7 +339,7 @@ def start_web_app(self): with gr.Column(): gr.Markdown( """ - ### Group Specific Metrics + ### Overall Metrics """) with gr.Row(): accuracy_metric_vw4 = gr.Dropdown( @@ -581,7 +594,7 @@ def _create_subgroup_model_rank_heatmap(self, model_names: list, subgroup_accura return model_rank_heatmap def _create_group_model_rank_heatmap(self, model_names: list, group_fairness_metrics_lst: list, - group_stability_metrics_lst: list, tolerance: str): + group_uncertainty_metrics: list, group_stability_metrics_lst: list, tolerance: str): """ Create a group model rank heatmap. @@ -591,6 +604,8 @@ def _create_group_model_rank_heatmap(self, model_names: list, group_fairness_met A list of selected model names to display on the heatmap group_fairness_metrics_lst A list of group fairness metrics to visualize + group_uncertainty_metrics + A list of group uncertainty metrics to visualize group_stability_metrics_lst A list of group stability metrics to visualize tolerance @@ -600,12 +615,11 @@ def _create_group_model_rank_heatmap(self, model_names: list, group_fairness_met tolerance = str_to_float(tolerance, 'Tolerance') groups_lst = self.sensitive_attributes_dct.keys() - metrics_lst = group_fairness_metrics_lst + group_stability_metrics_lst + metrics_lst = group_fairness_metrics_lst + group_uncertainty_metrics + group_stability_metrics_lst # Find metric values for each model based on metric, group, and model names. # Add the values to a results dict. results = {} - num_models = len(model_names) for metric in metrics_lst: for group in groups_lst: group_metric = metric + '_' + group @@ -717,8 +731,9 @@ def _create_subgroup_metrics_bar_chart_per_one_model(self, model_name: str, subg return self._create_metrics_bar_chart_per_one_model(model_name, metrics_names, metrics_type='subgroup') def _create_group_metrics_bar_chart_per_one_model(self, model_name: str, group_fairness_metrics_lst: list, + group_uncertainty_metrics_lst: list, group_stability_metrics_lst: list): - metrics_names = group_fairness_metrics_lst + group_stability_metrics_lst + metrics_names = group_fairness_metrics_lst + group_uncertainty_metrics_lst + group_stability_metrics_lst return self._create_metrics_bar_chart_per_one_model(model_name, metrics_names, metrics_type='group') def _create_metrics_bar_chart_per_one_model(self, model_name: str, metrics_names: list, metrics_type: str): From ae533db9489def237c44fb8f81714a08a8323f49 Mon Sep 17 00:00:00 2001 From: denysgerasymuk799 Date: Thu, 30 Nov 2023 14:19:38 +0200 Subject: [PATCH 27/36] Set red-green color palette --- ...Multiple_Models_Interface_Vis_Income.ipynb | 197 +++++++++++++++--- .../metrics_interactive_visualizer.py | 16 +- virny/utils/data_viz_utils.py | 3 +- 3 files changed, 184 insertions(+), 32 deletions(-) diff --git a/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb b/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb index 18bcc88c..a7f8a5b4 100644 --- a/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb +++ b/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb @@ -6,8 +6,8 @@ "id": "248cbed8", "metadata": { "ExecuteTime": { - "end_time": "2023-11-29T21:02:04.386021Z", - "start_time": "2023-11-29T21:02:03.727098Z" + "end_time": "2023-11-30T10:14:44.773220Z", + "start_time": "2023-11-30T10:14:44.118473Z" } }, "outputs": [], @@ -23,8 +23,8 @@ "id": "7ec6cd08", "metadata": { "ExecuteTime": { - "end_time": "2023-11-29T21:02:04.394975Z", - "start_time": "2023-11-29T21:02:04.386298Z" + "end_time": "2023-11-30T10:14:44.781386Z", + "start_time": "2023-11-30T10:14:44.773120Z" } }, "outputs": [], @@ -41,8 +41,8 @@ "id": "b8cb69f2", "metadata": { "ExecuteTime": { - "end_time": "2023-11-29T21:02:04.405571Z", - "start_time": "2023-11-29T21:02:04.395579Z" + "end_time": "2023-11-30T10:14:44.791947Z", + "start_time": "2023-11-30T10:14:44.781906Z" } }, "outputs": [ @@ -76,8 +76,8 @@ "id": "7a9241de", "metadata": { "ExecuteTime": { - "end_time": "2023-11-29T21:02:08.026244Z", - "start_time": "2023-11-29T21:02:04.404686Z" + "end_time": "2023-11-30T10:14:46.531174Z", + "start_time": "2023-11-30T10:14:44.792591Z" } }, "outputs": [], @@ -101,8 +101,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-11-29T21:02:09.305496Z", - "start_time": "2023-11-29T21:02:08.029615Z" + "end_time": "2023-11-30T10:14:47.863288Z", + "start_time": "2023-11-30T10:14:46.532997Z" } }, "id": "d3c53c7b72ecbcd0" @@ -120,8 +120,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-11-29T21:02:09.332604Z", - "start_time": "2023-11-29T21:02:09.305881Z" + "end_time": "2023-11-30T10:14:47.892811Z", + "start_time": "2023-11-30T10:14:47.863607Z" } }, "id": "2aab7c79ecdee914" @@ -153,8 +153,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-11-29T21:02:09.385835Z", - "start_time": "2023-11-29T21:02:09.332537Z" + "end_time": "2023-11-30T10:14:47.944316Z", + "start_time": "2023-11-30T10:14:47.890948Z" } }, "id": "44ee5eff6054ce04" @@ -171,8 +171,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-11-29T21:02:09.407603Z", - "start_time": "2023-11-29T21:02:09.385768Z" + "end_time": "2023-11-30T10:14:47.966498Z", + "start_time": "2023-11-30T10:14:47.944256Z" } }, "id": "833484748ed512e8" @@ -196,8 +196,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-11-29T21:02:09.456986Z", - "start_time": "2023-11-29T21:02:09.407709Z" + "end_time": "2023-11-30T10:14:48.034503Z", + "start_time": "2023-11-30T10:14:47.966623Z" } }, "id": "15ed7d1ba1f22317" @@ -212,12 +212,12 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 73, "id": "435b9d98", "metadata": { "ExecuteTime": { - "end_time": "2023-11-29T23:48:34.526173Z", - "start_time": "2023-11-29T23:48:34.278833Z" + "end_time": "2023-11-30T12:18:02.265521Z", + "start_time": "2023-11-30T12:18:02.001588Z" } }, "outputs": [], @@ -239,6 +239,54 @@ "\n", "To create a public link, set `share=True` in `launch()`.\n" ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/routes.py\", line 538, in predict\n", + " output = await route_utils.call_process_api(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/route_utils.py\", line 217, in call_process_api\n", + " output = await app.get_blocks().process_api(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/blocks.py\", line 1553, in process_api\n", + " result = await self.call_function(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/blocks.py\", line 1191, in call_function\n", + " prediction = await anyio.to_thread.run_sync(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/to_thread.py\", line 33, in run_sync\n", + " return await get_asynclib().run_sync_in_worker_thread(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/_backends/_asyncio.py\", line 877, in run_sync_in_worker_thread\n", + " return await future\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/_backends/_asyncio.py\", line 807, in run\n", + " result = context.run(func, *args)\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/utils.py\", line 659, in wrapper\n", + " response = f(*args, **kwargs)\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/custom_classes/metrics_interactive_visualizer.py\", line 622, in _create_group_model_rank_heatmap\n", + " tolerance = str_to_float(tolerance, 'Tolerance')\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/utils/common_helpers.py\", line 86, in str_to_float\n", + " raise ValueError(f\"{var_name} must be a float number with a '.' separator.\")\n", + "ValueError: Tolerance must be a float number with a '.' separator.\n", + "Traceback (most recent call last):\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/routes.py\", line 538, in predict\n", + " output = await route_utils.call_process_api(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/route_utils.py\", line 217, in call_process_api\n", + " output = await app.get_blocks().process_api(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/blocks.py\", line 1553, in process_api\n", + " result = await self.call_function(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/blocks.py\", line 1191, in call_function\n", + " prediction = await anyio.to_thread.run_sync(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/to_thread.py\", line 33, in run_sync\n", + " return await get_asynclib().run_sync_in_worker_thread(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/_backends/_asyncio.py\", line 877, in run_sync_in_worker_thread\n", + " return await future\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/_backends/_asyncio.py\", line 807, in run\n", + " result = context.run(func, *args)\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/utils.py\", line 659, in wrapper\n", + " response = f(*args, **kwargs)\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/custom_classes/metrics_interactive_visualizer.py\", line 624, in _create_group_model_rank_heatmap\n", + " raise ValueError('Tolerance cannot be smaller than 0.001')\n", + "ValueError: Tolerance cannot be smaller than 0.001\n" + ] } ], "source": [ @@ -248,7 +296,7 @@ "collapsed": false, "is_executing": true, "ExecuteTime": { - "start_time": "2023-11-29T23:48:34.526950Z" + "start_time": "2023-11-30T12:18:02.266315Z" } }, "id": "678a9dc8d51243f4" @@ -271,25 +319,118 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-11-29T21:12:46.494378Z", - "start_time": "2023-11-29T21:12:46.442750Z" + "end_time": "2023-11-30T10:20:01.084744Z", + "start_time": "2023-11-30T10:20:01.041733Z" } }, "id": "277b6d1de837dab7" }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "outputs": [], "source": [], + "metadata": { + "collapsed": false + }, + "id": "21c0ad91536f0af5" + }, + { + "cell_type": "code", + "execution_count": 63, + "outputs": [], + "source": [ + "def rank_with_tolerance(pd_series: pd.Series, tolerance: float = 0.01, method: str = 'dense'):\n", + " \"\"\"\n", + " Rank a pandas series with defined tolerance.\n", + " Ref: https://stackoverflow.com/questions/72956450/pandas-ranking-with-tolerance\n", + "\n", + " Parameters\n", + " ----------\n", + " pd_series\n", + " A pandas series to rank\n", + " tolerance\n", + " A float value for ranking\n", + " method\n", + " Ranking methods for numpy.rank()\n", + "\n", + " Returns\n", + " -------\n", + " A pandas series with dense ranks for the input pd series.\n", + "\n", + " \"\"\"\n", + " tolerance += 1e-10 # Add 0.0000000001 for correct comparison of float numbers\n", + " vals = pd.Series(pd_series.unique()).sort_values()\n", + " vals.index = vals\n", + " print('vals1 -- ', vals)\n", + " vals = vals.mask(vals - vals.shift(1) < tolerance, vals.shift(1))\n", + " print('vals2 -- ', vals)\n", + "\n", + " return pd_series.map(vals).fillna(pd_series).rank(method=method)" + ], "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-11-29T21:12:46.501645Z", - "start_time": "2023-11-29T21:12:46.483631Z" + "end_time": "2023-11-30T11:49:03.109586Z", + "start_time": "2023-11-30T11:49:03.043461Z" } }, - "id": "c207d4345ddca1db" + "id": "58f9830c22542b19" + }, + { + "cell_type": "code", + "execution_count": 70, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "vals1 -- 0.002102 0.002102\n", + "0.002214 0.002214\n", + "0.003088 0.003088\n", + "0.004906 0.004906\n", + "dtype: float64\n", + "vals2 -- 0.002102 0.002102\n", + "0.002214 0.002102\n", + "0.003088 0.002214\n", + "0.004906 0.003088\n", + "dtype: float64\n" + ] + }, + { + "data": { + "text/plain": "0 1.0\n1 2.0\n2 1.0\n3 3.0\ndtype: float64" + }, + "execution_count": 70, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "\n", + "# df = pd.Series([0.002, 0.003, 0.002, 0.005])\n", + "df = pd.Series([0.002102,0.003088,0.002214,0.004906])\n", + "rank_with_tolerance(df, tolerance=0.005)" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2023-11-30T11:58:02.372653Z", + "start_time": "2023-11-30T11:58:02.323106Z" + } + }, + "id": "1a8bdd34f4e1b2a2" + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [], + "metadata": { + "collapsed": false + }, + "id": "ec5d1085c5fc393a" } ], "metadata": { diff --git a/virny/custom_classes/metrics_interactive_visualizer.py b/virny/custom_classes/metrics_interactive_visualizer.py index 1b399eb5..4fc38399 100644 --- a/virny/custom_classes/metrics_interactive_visualizer.py +++ b/virny/custom_classes/metrics_interactive_visualizer.py @@ -339,7 +339,7 @@ def start_web_app(self): with gr.Column(): gr.Markdown( """ - ### Overall Metrics + ### Overall Metric Constraints """) with gr.Row(): accuracy_metric_vw4 = gr.Dropdown( @@ -366,7 +366,11 @@ def start_web_app(self): subgroup_uncertainty_min_val_vw4 = gr.Text(value="0.0", label="Min value", scale=1) subgroup_uncertainty_max_val_vw4 = gr.Text(value="1.0", label="Max value", scale=1) with gr.Row(): - positive_rate_metric_vw4 = gr.Text(value=POSITIVE_RATE, label="Positive-Rate Metric", scale=2) + positive_rate_metric_vw4 = gr.Dropdown( + [POSITIVE_RATE], + value=POSITIVE_RATE, multiselect=False, label="Positive-Rate Metric", + scale=2 + ) positive_rate_min_val_vw4 = gr.Text(value="0.0", label="Min value", scale=1) positive_rate_max_val_vw4 = gr.Text(value="1.0", label="Max value", scale=1) @@ -374,7 +378,7 @@ def start_web_app(self): with gr.Column(): gr.Markdown( """ - ### Disparity Metrics + ### Disparity Metric Constraints """) with gr.Row(): fairness_metric_vw4 = gr.Dropdown( @@ -575,6 +579,8 @@ def _create_subgroup_model_rank_heatmap(self, model_names: list, subgroup_accura """ tolerance = str_to_float(tolerance, 'Tolerance') + if tolerance < 0.001: + raise ValueError('Tolerance cannot be smaller than 0.001') metrics_lst = subgroup_accuracy_metrics_lst + subgroup_uncertainty_metrics + subgroup_stability_metrics_lst # Find metric values for each model based on metric, subgroup, and model names. @@ -588,6 +594,7 @@ def _create_subgroup_model_rank_heatmap(self, model_names: list, subgroup_accura model_metrics_matrix = pd.DataFrame(results).T model_metrics_matrix = model_metrics_matrix[sorted(model_metrics_matrix.columns)] + model_metrics_matrix = model_metrics_matrix.round(3) # round to make tolerance more precise sorted_matrix_by_rank = create_subgroup_sorted_matrix_by_rank(model_metrics_matrix, tolerance) model_rank_heatmap, _ = create_model_rank_heatmap_visualization(model_metrics_matrix, sorted_matrix_by_rank) @@ -613,6 +620,8 @@ def _create_group_model_rank_heatmap(self, model_names: list, group_fairness_met """ tolerance = str_to_float(tolerance, 'Tolerance') + if tolerance < 0.001: + raise ValueError('Tolerance cannot be smaller than 0.001') groups_lst = self.sensitive_attributes_dct.keys() metrics_lst = group_fairness_metrics_lst + group_uncertainty_metrics + group_stability_metrics_lst @@ -644,6 +653,7 @@ def _create_group_model_rank_heatmap(self, model_names: list, group_fairness_met model_metrics_matrix = pd.DataFrame(results).T model_metrics_matrix = model_metrics_matrix[sorted(model_metrics_matrix.columns)] + model_metrics_matrix = model_metrics_matrix.round(3) # round to make tolerance more precise sorted_matrix_by_rank = create_sorted_matrix_by_rank(model_metrics_matrix, tolerance) model_rank_heatmap, _ = create_model_rank_heatmap_visualization(model_metrics_matrix, sorted_matrix_by_rank) diff --git a/virny/utils/data_viz_utils.py b/virny/utils/data_viz_utils.py index ab4534bd..bbc4b900 100644 --- a/virny/utils/data_viz_utils.py +++ b/virny/utils/data_viz_utils.py @@ -7,6 +7,7 @@ from altair.utils.schemapi import Undefined from virny.utils.common_helpers import check_substring_in_list +from IPython.display import display def rank_with_tolerance(pd_series: pd.Series, tolerance: float = 0.01, method: str = 'dense'): @@ -243,7 +244,7 @@ def create_model_rank_heatmap_visualization(model_metrics_matrix, sorted_matrix_ num_ranks = int(sorted_matrix_by_rank.values.max()) fig = plt.figure(figsize=(matrix_width, matrix_height)) - rank_colors = sns.color_palette("coolwarm_r", n_colors=num_ranks).as_hex() + rank_colors = sns.diverging_palette(13, 145, s=75, l=70, n=num_ranks).as_hex() # Convert ranks to minus ranks (1 --> -1; 4 --> -4) to align rank positions with a coolwarm color scheme reversed_sorted_matrix_by_rank = sorted_matrix_by_rank * -1 ax = sns.heatmap(reversed_sorted_matrix_by_rank, annot=model_metrics_matrix.round(3), cmap=rank_colors, From c1feaf941bf116b9ae4e331548ea5fa00b8c1b93 Mon Sep 17 00:00:00 2001 From: denysgerasymuk799 Date: Thu, 7 Dec 2023 20:00:38 +0200 Subject: [PATCH 28/36] Added test metrics for ACS Public Coverage --- ...Multiple_Models_Interface_Vis_Income.ipynb | 218 ++----------- ...iple_Models_Interface_Vis_Law_School.ipynb | 132 ++++---- ...ultiple_Models_Interface_Vis_Pub_Cov.ipynb | 308 ++++++++++++++++++ docs/examples/pub_cov_subgroup_metrics.csv | 153 +++++++++ 4 files changed, 553 insertions(+), 258 deletions(-) create mode 100644 docs/examples/Multiple_Models_Interface_Vis_Pub_Cov.ipynb create mode 100644 docs/examples/pub_cov_subgroup_metrics.csv diff --git a/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb b/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb index a7f8a5b4..aac2e942 100644 --- a/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb +++ b/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb @@ -6,8 +6,8 @@ "id": "248cbed8", "metadata": { "ExecuteTime": { - "end_time": "2023-11-30T10:14:44.773220Z", - "start_time": "2023-11-30T10:14:44.118473Z" + "end_time": "2023-12-03T22:09:30.506501Z", + "start_time": "2023-12-03T22:09:29.758579Z" } }, "outputs": [], @@ -23,8 +23,8 @@ "id": "7ec6cd08", "metadata": { "ExecuteTime": { - "end_time": "2023-11-30T10:14:44.781386Z", - "start_time": "2023-11-30T10:14:44.773120Z" + "end_time": "2023-12-03T22:09:30.515379Z", + "start_time": "2023-12-03T22:09:30.506765Z" } }, "outputs": [], @@ -41,8 +41,8 @@ "id": "b8cb69f2", "metadata": { "ExecuteTime": { - "end_time": "2023-11-30T10:14:44.791947Z", - "start_time": "2023-11-30T10:14:44.781906Z" + "end_time": "2023-12-03T22:09:30.525236Z", + "start_time": "2023-12-03T22:09:30.515761Z" } }, "outputs": [ @@ -76,8 +76,8 @@ "id": "7a9241de", "metadata": { "ExecuteTime": { - "end_time": "2023-11-30T10:14:46.531174Z", - "start_time": "2023-11-30T10:14:44.792591Z" + "end_time": "2023-12-03T22:09:33.037405Z", + "start_time": "2023-12-03T22:09:30.526188Z" } }, "outputs": [], @@ -101,8 +101,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-11-30T10:14:47.863288Z", - "start_time": "2023-11-30T10:14:46.532997Z" + "end_time": "2023-12-03T22:09:34.393655Z", + "start_time": "2023-12-03T22:09:33.038803Z" } }, "id": "d3c53c7b72ecbcd0" @@ -120,8 +120,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-11-30T10:14:47.892811Z", - "start_time": "2023-11-30T10:14:47.863607Z" + "end_time": "2023-12-03T22:09:34.420850Z", + "start_time": "2023-12-03T22:09:34.393834Z" } }, "id": "2aab7c79ecdee914" @@ -153,30 +153,12 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-11-30T10:14:47.944316Z", - "start_time": "2023-11-30T10:14:47.890948Z" + "end_time": "2023-12-03T22:09:34.476159Z", + "start_time": "2023-12-03T22:09:34.421313Z" } }, "id": "44ee5eff6054ce04" }, - { - "cell_type": "code", - "execution_count": 8, - "outputs": [], - "source": [ - "models_metrics_dct = dict()\n", - "for model_name in subgroup_metrics_df['Model_Name'].unique():\n", - " models_metrics_dct[model_name] = subgroup_metrics_df[subgroup_metrics_df['Model_Name'] == model_name]" - ], - "metadata": { - "collapsed": false, - "ExecuteTime": { - "end_time": "2023-11-30T10:14:47.966498Z", - "start_time": "2023-11-30T10:14:47.944256Z" - } - }, - "id": "833484748ed512e8" - }, { "cell_type": "code", "execution_count": 9, @@ -196,8 +178,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-11-30T10:14:48.034503Z", - "start_time": "2023-11-30T10:14:47.966623Z" + "end_time": "2023-12-03T22:09:34.566417Z", + "start_time": "2023-12-03T22:09:34.499412Z" } }, "id": "15ed7d1ba1f22317" @@ -212,12 +194,12 @@ }, { "cell_type": "code", - "execution_count": 73, + "execution_count": 10, "id": "435b9d98", "metadata": { "ExecuteTime": { - "end_time": "2023-11-30T12:18:02.265521Z", - "start_time": "2023-11-30T12:18:02.001588Z" + "end_time": "2023-12-03T22:09:34.588762Z", + "start_time": "2023-12-03T22:09:34.523515Z" } }, "outputs": [], @@ -229,7 +211,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "outputs": [ { "name": "stdout", @@ -237,55 +219,8 @@ "text": [ "Running on local URL: http://127.0.0.1:7860\n", "\n", - "To create a public link, set `share=True` in `launch()`.\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Traceback (most recent call last):\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/routes.py\", line 538, in predict\n", - " output = await route_utils.call_process_api(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/route_utils.py\", line 217, in call_process_api\n", - " output = await app.get_blocks().process_api(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/blocks.py\", line 1553, in process_api\n", - " result = await self.call_function(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/blocks.py\", line 1191, in call_function\n", - " prediction = await anyio.to_thread.run_sync(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/to_thread.py\", line 33, in run_sync\n", - " return await get_asynclib().run_sync_in_worker_thread(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/_backends/_asyncio.py\", line 877, in run_sync_in_worker_thread\n", - " return await future\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/_backends/_asyncio.py\", line 807, in run\n", - " result = context.run(func, *args)\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/utils.py\", line 659, in wrapper\n", - " response = f(*args, **kwargs)\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/custom_classes/metrics_interactive_visualizer.py\", line 622, in _create_group_model_rank_heatmap\n", - " tolerance = str_to_float(tolerance, 'Tolerance')\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/utils/common_helpers.py\", line 86, in str_to_float\n", - " raise ValueError(f\"{var_name} must be a float number with a '.' separator.\")\n", - "ValueError: Tolerance must be a float number with a '.' separator.\n", - "Traceback (most recent call last):\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/routes.py\", line 538, in predict\n", - " output = await route_utils.call_process_api(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/route_utils.py\", line 217, in call_process_api\n", - " output = await app.get_blocks().process_api(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/blocks.py\", line 1553, in process_api\n", - " result = await self.call_function(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/blocks.py\", line 1191, in call_function\n", - " prediction = await anyio.to_thread.run_sync(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/to_thread.py\", line 33, in run_sync\n", - " return await get_asynclib().run_sync_in_worker_thread(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/_backends/_asyncio.py\", line 877, in run_sync_in_worker_thread\n", - " return await future\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/_backends/_asyncio.py\", line 807, in run\n", - " result = context.run(func, *args)\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/utils.py\", line 659, in wrapper\n", - " response = f(*args, **kwargs)\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/custom_classes/metrics_interactive_visualizer.py\", line 624, in _create_group_model_rank_heatmap\n", - " raise ValueError('Tolerance cannot be smaller than 0.001')\n", - "ValueError: Tolerance cannot be smaller than 0.001\n" + "To create a public link, set `share=True` in `launch()`.\n", + "Keyboard interruption in main thread... closing server.\n" ] } ], @@ -294,9 +229,9 @@ ], "metadata": { "collapsed": false, - "is_executing": true, "ExecuteTime": { - "start_time": "2023-11-30T12:18:02.266315Z" + "end_time": "2023-12-03T23:42:27.309199Z", + "start_time": "2023-12-03T22:09:34.550444Z" } }, "id": "678a9dc8d51243f4" @@ -319,118 +254,25 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-11-30T10:20:01.084744Z", - "start_time": "2023-11-30T10:20:01.041733Z" + "end_time": "2023-12-03T23:42:27.346512Z", + "start_time": "2023-12-03T23:42:27.314034Z" } }, "id": "277b6d1de837dab7" }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "outputs": [], "source": [], - "metadata": { - "collapsed": false - }, - "id": "21c0ad91536f0af5" - }, - { - "cell_type": "code", - "execution_count": 63, - "outputs": [], - "source": [ - "def rank_with_tolerance(pd_series: pd.Series, tolerance: float = 0.01, method: str = 'dense'):\n", - " \"\"\"\n", - " Rank a pandas series with defined tolerance.\n", - " Ref: https://stackoverflow.com/questions/72956450/pandas-ranking-with-tolerance\n", - "\n", - " Parameters\n", - " ----------\n", - " pd_series\n", - " A pandas series to rank\n", - " tolerance\n", - " A float value for ranking\n", - " method\n", - " Ranking methods for numpy.rank()\n", - "\n", - " Returns\n", - " -------\n", - " A pandas series with dense ranks for the input pd series.\n", - "\n", - " \"\"\"\n", - " tolerance += 1e-10 # Add 0.0000000001 for correct comparison of float numbers\n", - " vals = pd.Series(pd_series.unique()).sort_values()\n", - " vals.index = vals\n", - " print('vals1 -- ', vals)\n", - " vals = vals.mask(vals - vals.shift(1) < tolerance, vals.shift(1))\n", - " print('vals2 -- ', vals)\n", - "\n", - " return pd_series.map(vals).fillna(pd_series).rank(method=method)" - ], "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-11-30T11:49:03.109586Z", - "start_time": "2023-11-30T11:49:03.043461Z" + "end_time": "2023-12-03T23:42:27.349708Z", + "start_time": "2023-12-03T23:42:27.345872Z" } }, - "id": "58f9830c22542b19" - }, - { - "cell_type": "code", - "execution_count": 70, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "vals1 -- 0.002102 0.002102\n", - "0.002214 0.002214\n", - "0.003088 0.003088\n", - "0.004906 0.004906\n", - "dtype: float64\n", - "vals2 -- 0.002102 0.002102\n", - "0.002214 0.002102\n", - "0.003088 0.002214\n", - "0.004906 0.003088\n", - "dtype: float64\n" - ] - }, - { - "data": { - "text/plain": "0 1.0\n1 2.0\n2 1.0\n3 3.0\ndtype: float64" - }, - "execution_count": 70, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import pandas as pd\n", - "\n", - "# df = pd.Series([0.002, 0.003, 0.002, 0.005])\n", - "df = pd.Series([0.002102,0.003088,0.002214,0.004906])\n", - "rank_with_tolerance(df, tolerance=0.005)" - ], - "metadata": { - "collapsed": false, - "ExecuteTime": { - "end_time": "2023-11-30T11:58:02.372653Z", - "start_time": "2023-11-30T11:58:02.323106Z" - } - }, - "id": "1a8bdd34f4e1b2a2" - }, - { - "cell_type": "code", - "execution_count": null, - "outputs": [], - "source": [], - "metadata": { - "collapsed": false - }, - "id": "ec5d1085c5fc393a" + "id": "21c0ad91536f0af5" } ], "metadata": { diff --git a/docs/examples/Multiple_Models_Interface_Vis_Law_School.ipynb b/docs/examples/Multiple_Models_Interface_Vis_Law_School.ipynb index a2a5a603..e9af1c88 100644 --- a/docs/examples/Multiple_Models_Interface_Vis_Law_School.ipynb +++ b/docs/examples/Multiple_Models_Interface_Vis_Law_School.ipynb @@ -2,24 +2,15 @@ "cells": [ { "cell_type": "code", - "execution_count": 55, + "execution_count": 1, "id": "248cbed8", "metadata": { "ExecuteTime": { - "end_time": "2023-10-07T13:37:09.385430Z", - "start_time": "2023-10-07T13:37:09.127608Z" + "end_time": "2023-12-06T15:49:13.844713Z", + "start_time": "2023-12-06T15:49:13.202938Z" } }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The autoreload extension is already loaded. To reload it, use:\n", - " %reload_ext autoreload\n" - ] - } - ], + "outputs": [], "source": [ "%matplotlib inline\n", "%load_ext autoreload\n", @@ -28,12 +19,12 @@ }, { "cell_type": "code", - "execution_count": 56, + "execution_count": 2, "id": "7ec6cd08", "metadata": { "ExecuteTime": { - "end_time": "2023-10-07T13:37:09.409539Z", - "start_time": "2023-10-07T13:37:09.385249Z" + "end_time": "2023-12-06T15:49:13.852965Z", + "start_time": "2023-12-06T15:49:13.844443Z" } }, "outputs": [], @@ -46,12 +37,12 @@ }, { "cell_type": "code", - "execution_count": 57, + "execution_count": 3, "id": "b8cb69f2", "metadata": { "ExecuteTime": { - "end_time": "2023-10-07T13:37:09.430322Z", - "start_time": "2023-10-07T13:37:09.408329Z" + "end_time": "2023-12-06T15:49:13.862149Z", + "start_time": "2023-12-06T15:49:13.853366Z" } }, "outputs": [ @@ -81,12 +72,12 @@ }, { "cell_type": "code", - "execution_count": 58, + "execution_count": 4, "id": "7a9241de", "metadata": { "ExecuteTime": { - "end_time": "2023-10-07T13:37:09.451279Z", - "start_time": "2023-10-07T13:37:09.431063Z" + "end_time": "2023-12-06T15:49:16.237279Z", + "start_time": "2023-12-06T15:49:13.862719Z" } }, "outputs": [], @@ -94,89 +85,89 @@ "import os\n", "import pandas as pd\n", "\n", + "from virny.datasets import LawSchoolDataset\n", + "from virny.custom_classes.metrics_composer import MetricsComposer\n", "from virny.custom_classes.metrics_interactive_visualizer import MetricsInteractiveVisualizer" ] }, { "cell_type": "code", - "execution_count": 59, + "execution_count": 5, "outputs": [], "source": [ + "data_loader = LawSchoolDataset()\n", "sensitive_attributes_dct = {'male': '0.0', 'race': 'Non-White', 'male&race': None}" ], "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-07T13:37:09.475696Z", - "start_time": "2023-10-07T13:37:09.453496Z" + "end_time": "2023-12-06T15:49:16.300788Z", + "start_time": "2023-12-06T15:49:16.238957Z" } }, "id": "d3c53c7b72ecbcd0" }, { "cell_type": "code", - "execution_count": 60, + "execution_count": 6, "outputs": [], "source": [ "ROOT_DIR = os.path.join('docs', 'examples')\n", "subgroup_metrics_df = pd.read_csv(os.path.join(ROOT_DIR, 'law_school_subgroup_metrics.csv'), header=0)\n", - "models_composed_metrics_df = pd.read_csv(os.path.join(ROOT_DIR, 'law_school_group_metrics.csv'), header=0)" + "subgroup_metrics_df['Model_Name'] = (subgroup_metrics_df['Model_Name'] + '__alpha=' +\n", + " subgroup_metrics_df['Intervention_Param'].astype(str))" ], "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-07T13:37:09.500877Z", - "start_time": "2023-10-07T13:37:09.474723Z" + "end_time": "2023-12-06T15:49:16.328190Z", + "start_time": "2023-12-06T15:49:16.301062Z" } }, "id": "2aab7c79ecdee914" }, { "cell_type": "code", - "execution_count": 61, - "outputs": [], - "source": [ - "subgroup_metrics_df['Model_Name'] = (subgroup_metrics_df['Model_Name'] + '__alpha=' +\n", - " subgroup_metrics_df['Intervention_Param'].astype(str))\n", - "models_composed_metrics_df['Model_Name'] = (models_composed_metrics_df['Model_Name'] + '__alpha=' \n", - " + models_composed_metrics_df['Intervention_Param'].astype(str))" - ], - "metadata": { - "collapsed": false, - "ExecuteTime": { - "end_time": "2023-10-07T13:37:09.520270Z", - "start_time": "2023-10-07T13:37:09.500217Z" + "execution_count": 7, + "outputs": [ + { + "data": { + "text/plain": " Metric male race male&race \\\n0 Accuracy_Parity -0.024413 -0.158856 -0.162998 \n1 Aleatoric_Uncertainty_Parity -0.016769 0.317464 0.274695 \n2 Aleatoric_Uncertainty_Ratio 0.951019 2.126816 1.880052 \n3 Equalized_Odds_FNR 0.006853 0.089260 0.092334 \n4 Equalized_Odds_FPR 0.027311 -0.289259 -0.156572 \n\n Model_Name \n0 LGBMClassifier__alpha=0.6 \n1 LGBMClassifier__alpha=0.6 \n2 LGBMClassifier__alpha=0.6 \n3 LGBMClassifier__alpha=0.6 \n4 LGBMClassifier__alpha=0.6 ", + "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
Metricmaleracemale&raceModel_Name
0Accuracy_Parity-0.024413-0.158856-0.162998LGBMClassifier__alpha=0.6
1Aleatoric_Uncertainty_Parity-0.0167690.3174640.274695LGBMClassifier__alpha=0.6
2Aleatoric_Uncertainty_Ratio0.9510192.1268161.880052LGBMClassifier__alpha=0.6
3Equalized_Odds_FNR0.0068530.0892600.092334LGBMClassifier__alpha=0.6
4Equalized_Odds_FPR0.027311-0.289259-0.156572LGBMClassifier__alpha=0.6
\n
" + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" } - }, - "id": "2d922003e752a4b4" - }, - { - "cell_type": "code", - "execution_count": 62, - "outputs": [], + ], "source": [ + "model_names = subgroup_metrics_df['Model_Name'].unique()\n", "models_metrics_dct = dict()\n", - "for model_name in subgroup_metrics_df['Model_Name'].unique():\n", - " models_metrics_dct[model_name] = subgroup_metrics_df[subgroup_metrics_df['Model_Name'] == model_name]" + "for model_name in model_names:\n", + " models_metrics_dct[model_name] = subgroup_metrics_df[subgroup_metrics_df['Model_Name'] == model_name]\n", + "\n", + "metrics_composer = MetricsComposer(models_metrics_dct, sensitive_attributes_dct)\n", + "models_composed_metrics_df = metrics_composer.compose_metrics()\n", + "models_composed_metrics_df.head()" ], "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-07T13:37:09.543689Z", - "start_time": "2023-10-07T13:37:09.521274Z" + "end_time": "2023-12-06T15:49:16.379226Z", + "start_time": "2023-12-06T15:49:16.327124Z" } }, "id": "833484748ed512e8" }, { "cell_type": "code", - "execution_count": 63, + "execution_count": 8, "outputs": [ { "data": { "text/plain": "dict_keys(['LGBMClassifier__alpha=0.6', 'LGBMClassifier__alpha=0.0', 'LogisticRegression__alpha=0.6', 'LogisticRegression__alpha=0.0', 'MLPClassifier__alpha=0.0', 'MLPClassifier__alpha=0.6', 'RandomForestClassifier__alpha=0.6', 'RandomForestClassifier__alpha=0.0'])" }, - "execution_count": 63, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -187,8 +178,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-07T13:37:09.565841Z", - "start_time": "2023-10-07T13:37:09.543823Z" + "end_time": "2023-12-06T15:49:16.400186Z", + "start_time": "2023-12-06T15:49:16.376928Z" } }, "id": "15ed7d1ba1f22317" @@ -203,23 +194,24 @@ }, { "cell_type": "code", - "execution_count": 64, + "execution_count": 9, "id": "435b9d98", "metadata": { "ExecuteTime": { - "end_time": "2023-10-07T13:37:09.593512Z", - "start_time": "2023-10-07T13:37:09.565293Z" + "end_time": "2023-12-06T15:49:16.482456Z", + "start_time": "2023-12-06T15:49:16.398934Z" } }, "outputs": [], "source": [ - "visualizer = MetricsInteractiveVisualizer(models_metrics_dct, models_composed_metrics_df,\n", + "visualizer = MetricsInteractiveVisualizer(data_loader.X_data, data_loader.y_data,\n", + " models_metrics_dct, models_composed_metrics_df,\n", " sensitive_attributes_dct=sensitive_attributes_dct)" ] }, { "cell_type": "code", - "execution_count": 65, + "execution_count": 10, "outputs": [ { "name": "stdout", @@ -238,15 +230,15 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-07T13:42:17.431036Z", - "start_time": "2023-10-07T13:37:09.593677Z" + "end_time": "2023-12-06T23:49:32.410119Z", + "start_time": "2023-12-06T15:49:16.428590Z" } }, "id": "678a9dc8d51243f4" }, { "cell_type": "code", - "execution_count": 66, + "execution_count": 11, "outputs": [ { "name": "stdout", @@ -262,20 +254,20 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-10-07T13:42:17.479914Z", - "start_time": "2023-10-07T13:42:17.432456Z" + "end_time": "2023-12-06T23:49:32.447145Z", + "start_time": "2023-12-06T23:49:32.406866Z" } }, "id": "277b6d1de837dab7" }, { "cell_type": "code", - "execution_count": 66, + "execution_count": 11, "id": "2326c129", "metadata": { "ExecuteTime": { - "end_time": "2023-10-07T13:42:17.482254Z", - "start_time": "2023-10-07T13:42:17.478725Z" + "end_time": "2023-12-06T23:49:32.450211Z", + "start_time": "2023-12-06T23:49:32.446290Z" } }, "outputs": [], diff --git a/docs/examples/Multiple_Models_Interface_Vis_Pub_Cov.ipynb b/docs/examples/Multiple_Models_Interface_Vis_Pub_Cov.ipynb new file mode 100644 index 00000000..6caf5b8b --- /dev/null +++ b/docs/examples/Multiple_Models_Interface_Vis_Pub_Cov.ipynb @@ -0,0 +1,308 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 19, + "id": "248cbed8", + "metadata": { + "ExecuteTime": { + "end_time": "2023-12-07T00:13:42.978064Z", + "start_time": "2023-12-07T00:13:42.914700Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The autoreload extension is already loaded. To reload it, use:\n", + " %reload_ext autoreload\n" + ] + } + ], + "source": [ + "%matplotlib inline\n", + "%load_ext autoreload\n", + "%autoreload 2" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "7ec6cd08", + "metadata": { + "ExecuteTime": { + "end_time": "2023-12-07T00:13:42.983725Z", + "start_time": "2023-12-07T00:13:42.954698Z" + } + }, + "outputs": [], + "source": [ + "import os\n", + "import warnings\n", + "warnings.filterwarnings('ignore')\n", + "os.environ[\"PYTHONWARNINGS\"] = \"ignore\"" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "b8cb69f2", + "metadata": { + "ExecuteTime": { + "end_time": "2023-12-07T00:13:43.018895Z", + "start_time": "2023-12-07T00:13:42.982387Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Current location: /Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny\n" + ] + } + ], + "source": [ + "cur_folder_name = os.getcwd().split('/')[-1]\n", + "if cur_folder_name != \"Virny\":\n", + " os.chdir(\"../..\")\n", + "\n", + "print('Current location: ', os.getcwd())" + ] + }, + { + "cell_type": "markdown", + "id": "a578f2ab", + "metadata": {}, + "source": [ + "# Multiple Models Interface Usage" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "7a9241de", + "metadata": { + "ExecuteTime": { + "end_time": "2023-12-07T00:13:43.027909Z", + "start_time": "2023-12-07T00:13:43.006390Z" + } + }, + "outputs": [], + "source": [ + "import os\n", + "import pandas as pd\n", + "\n", + "from virny.datasets import ACSPublicCoverageDataset\n", + "from virny.custom_classes.metrics_composer import MetricsComposer\n", + "from virny.custom_classes.metrics_interactive_visualizer import MetricsInteractiveVisualizer" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "outputs": [], + "source": [ + "data_loader = ACSPublicCoverageDataset(state=['CA'], year=2018, with_nulls=False,\n", + " subsample_size=15_000, subsample_seed=42)\n", + "sensitive_attributes_dct = {'SEX': '2', 'RAC1P': ['2', '3', '4', '5', '6', '7', '8', '9'], 'SEX&RAC1P': None}" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2023-12-07T00:13:48.771709Z", + "start_time": "2023-12-07T00:13:43.029632Z" + } + }, + "id": "d3c53c7b72ecbcd0" + }, + { + "cell_type": "code", + "execution_count": 24, + "outputs": [], + "source": [ + "ROOT_DIR = os.path.join('docs', 'examples')\n", + "subgroup_metrics_df = pd.read_csv(os.path.join(ROOT_DIR, 'pub_cov_subgroup_metrics.csv'), header=0)\n", + "subgroup_metrics_df['Model_Name'] = (subgroup_metrics_df['Model_Name'] + '__alpha=' +\n", + " subgroup_metrics_df['Intervention_Param'].astype(str))" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2023-12-07T00:13:48.805639Z", + "start_time": "2023-12-07T00:13:48.768740Z" + } + }, + "id": "2aab7c79ecdee914" + }, + { + "cell_type": "code", + "execution_count": 25, + "outputs": [ + { + "data": { + "text/plain": " Metric SEX RAC1P SEX&RAC1P \\\n0 Accuracy_Parity 0.026847 0.016299 0.040212 \n1 Aleatoric_Uncertainty_Parity -0.013240 0.027276 0.007235 \n2 Aleatoric_Uncertainty_Ratio 0.983584 1.034689 1.009077 \n3 Equalized_Odds_FNR 0.004275 -0.000359 -0.008617 \n4 Equalized_Odds_FPR -0.012072 -0.024172 -0.040481 \n\n Model_Name \n0 LGBMClassifier__alpha=0.6 \n1 LGBMClassifier__alpha=0.6 \n2 LGBMClassifier__alpha=0.6 \n3 LGBMClassifier__alpha=0.6 \n4 LGBMClassifier__alpha=0.6 ", + "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
MetricSEXRAC1PSEX&RAC1PModel_Name
0Accuracy_Parity0.0268470.0162990.040212LGBMClassifier__alpha=0.6
1Aleatoric_Uncertainty_Parity-0.0132400.0272760.007235LGBMClassifier__alpha=0.6
2Aleatoric_Uncertainty_Ratio0.9835841.0346891.009077LGBMClassifier__alpha=0.6
3Equalized_Odds_FNR0.004275-0.000359-0.008617LGBMClassifier__alpha=0.6
4Equalized_Odds_FPR-0.012072-0.024172-0.040481LGBMClassifier__alpha=0.6
\n
" + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model_names = subgroup_metrics_df['Model_Name'].unique()\n", + "models_metrics_dct = dict()\n", + "for model_name in model_names:\n", + " models_metrics_dct[model_name] = subgroup_metrics_df[subgroup_metrics_df['Model_Name'] == model_name]\n", + "\n", + "metrics_composer = MetricsComposer(models_metrics_dct, sensitive_attributes_dct)\n", + "models_composed_metrics_df = metrics_composer.compose_metrics()\n", + "models_composed_metrics_df.head()" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2023-12-07T00:13:48.849022Z", + "start_time": "2023-12-07T00:13:48.802693Z" + } + }, + "id": "833484748ed512e8" + }, + { + "cell_type": "code", + "execution_count": 26, + "outputs": [ + { + "data": { + "text/plain": "dict_keys(['LGBMClassifier__alpha=0.6', 'LGBMClassifier__alpha=0.0', 'LogisticRegression__alpha=0.0', 'LogisticRegression__alpha=0.6', 'MLPClassifier__alpha=0.0', 'MLPClassifier__alpha=0.6', 'RandomForestClassifier__alpha=0.0', 'RandomForestClassifier__alpha=0.6'])" + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "models_metrics_dct.keys()" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2023-12-07T00:13:48.873723Z", + "start_time": "2023-12-07T00:13:48.848261Z" + } + }, + "id": "15ed7d1ba1f22317" + }, + { + "cell_type": "markdown", + "id": "deb45226", + "metadata": {}, + "source": [ + "## Metrics Visualization and Reporting" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "435b9d98", + "metadata": { + "ExecuteTime": { + "end_time": "2023-12-07T00:13:48.959344Z", + "start_time": "2023-12-07T00:13:48.871083Z" + } + }, + "outputs": [], + "source": [ + "visualizer = MetricsInteractiveVisualizer(data_loader.X_data, data_loader.y_data,\n", + " models_metrics_dct, models_composed_metrics_df,\n", + " sensitive_attributes_dct=sensitive_attributes_dct)" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running on local URL: http://127.0.0.1:7860\n", + "\n", + "To create a public link, set `share=True` in `launch()`.\n", + "Keyboard interruption in main thread... closing server.\n" + ] + } + ], + "source": [ + "visualizer.start_web_app()" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2023-12-07T00:15:48.056146Z", + "start_time": "2023-12-07T00:13:48.898642Z" + } + }, + "id": "678a9dc8d51243f4" + }, + { + "cell_type": "code", + "execution_count": 29, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Closing server running on port: 7860\n" + ] + } + ], + "source": [ + "visualizer.stop_web_app()" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2023-12-07T00:15:48.092702Z", + "start_time": "2023-12-07T00:15:48.056394Z" + } + }, + "id": "277b6d1de837dab7" + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "2326c129", + "metadata": { + "ExecuteTime": { + "end_time": "2023-12-07T00:15:48.095103Z", + "start_time": "2023-12-07T00:15:48.092153Z" + } + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/examples/pub_cov_subgroup_metrics.csv b/docs/examples/pub_cov_subgroup_metrics.csv new file mode 100644 index 00000000..788e1430 --- /dev/null +++ b/docs/examples/pub_cov_subgroup_metrics.csv @@ -0,0 +1,153 @@ +Metric,Bootstrap_Model_Seed,Model_Name,Model_Params,Run_Number,Dataset_Name,Num_Estimators,Test_Set_Index,Tag,Record_Create_Date_Time,Session_Uuid,Experiment_Iteration,Dataset_Split_Seed,Model_Init_Seed,Fair_Intervention_Params_Lst,Intervention_Param,RAC1P_dis,RAC1P_dis_correct,RAC1P_dis_incorrect,RAC1P_priv,RAC1P_priv_correct,RAC1P_priv_incorrect,SEX&RAC1P_dis,SEX&RAC1P_dis_correct,SEX&RAC1P_dis_incorrect,SEX&RAC1P_priv,SEX&RAC1P_priv_correct,SEX&RAC1P_priv_incorrect,SEX_dis,SEX_dis_correct,SEX_dis_incorrect,SEX_priv,SEX_priv_correct,SEX_priv_incorrect,overall +Accuracy,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 200}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.469,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.7106382978723405,1.0,0.0,0.6943396226415094,1.0,0.0,0.7309523809523809,1.0,0.0,0.6907407407407408,1.0,0.0,0.7137767220902613,1.0,0.0,0.6869300911854104,1.0,0.0,0.702 +Accuracy,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 9, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 300}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.855,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.7078014184397163,1.0,0.0,0.7069182389937106,1.0,0.0,0.7261904761904762,1.0,0.0,0.7,1.0,0.0,0.7173396674584323,1.0,0.0,0.6945288753799392,1.0,0.0,0.7073333333333334 +Aleatoric_Uncertainty,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 200}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.469,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.8135845655489112,0.7866469125149843,0.8797402722645846,0.7863084864764371,0.7565593407316595,0.8538867928596355,0.8043374515789166,0.7763233060898863,0.8804466787039809,0.7971024405533379,0.768632177324783,0.860691711117715,0.79332014755367,0.7625311455668369,0.8701010197283034,0.8065604881771425,0.7819682317880847,0.8605201963706094,0.7991282436405 +Aleatoric_Uncertainty,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 9, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 300}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.855,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.8148785905804831,0.7881025075981596,0.8797391022706743,0.7900820491165612,0.7635308789915832,0.8541239272720874,0.8053079922995199,0.7766991635658756,0.8811835815496201,0.8003474802232484,0.774436852377195,0.8608056118640398,0.7956992195010564,0.7657742495399613,0.871643260914928,0.8094618428374122,0.7873957517781504,0.8596320100716537,0.8017364236046045 +F1,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 200}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.469,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.5363636363636364,1.0,0.0,0.5244618395303327,1.0,0.0,0.5461847389558233,1.0,0.0,0.5242165242165242,1.0,0.0,0.52465483234714,1.0,0.0,0.536036036036036,1.0,0.0,0.5299684542586751 +F1,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 9, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 300}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.855,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.5275229357798165,1.0,0.0,0.5458089668615984,1.0,0.0,0.5344129554655871,1.0,0.0,0.5384615384615384,1.0,0.0,0.5258964143426295,1.0,0.0,0.5503355704697986,1.0,0.0,0.5374077976817703 +FNR,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 200}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.469,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.5645756457564576,0.0,1.0,0.564935064935065,0.0,1.0,0.5584415584415584,0.0,1.0,0.5670588235294117,0.0,1.0,0.5667752442996743,0.0,1.0,0.5625,0.0,1.0,0.5647668393782384 +FNR,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 9, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 300}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.855,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.5756457564575646,0.0,1.0,0.5454545454545454,0.0,1.0,0.5714285714285714,0.0,1.0,0.5552941176470588,0.0,1.0,0.5700325732899023,0.0,1.0,0.5477941176470589,0.0,1.0,0.5595854922279793 +FPR,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 200}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.469,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.1175115207373272,0.0,1.0,0.14168377823408623,0.0,1.0,0.10150375939849623,0.0,1.0,0.14198473282442747,0.0,1.0,0.1252336448598131,0.0,1.0,0.13730569948186527,0.0,1.0,0.13029315960912052 +FPR,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 9, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 300}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.855,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.1152073732718894,0.0,1.0,0.13347022587268995,0.0,1.0,0.10150375939849623,0.0,1.0,0.13435114503816795,0.0,1.0,0.11775700934579439,0.0,1.0,0.13471502590673576,0.0,1.0,0.1248642779587405 +IQR,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 200}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.469,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.08182418362009894,0.07839051166541347,0.09025687797940002,0.07926075106534702,0.07627944599108963,0.0860330983945243,0.08132420456867172,0.07721459907427747,0.09248923896494633,0.08013164873173936,0.07731235739363329,0.0864286287863116,0.07966814664427953,0.07606107596458073,0.08866337269614244,0.08148596819853691,0.07890972096624026,0.08713870484415868,0.08046556436608042 +IQR,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 9, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 300}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.855,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.0773868546726484,0.07399641405350874,0.08559962102677801,0.07475981335012077,0.07219855164645576,0.08093762054951874,0.07639056726578859,0.0723454923738037,0.08711880937061808,0.0758405054684555,0.07332595431745884,0.0817077914874477,0.07522697625213055,0.07182547366190477,0.08385936097690525,0.0769767023605915,0.07465472767225059,0.0822560179455258,0.07599452277170875 +Jitter,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 200}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.469,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.10372621975123697,0.08655623426514021,0.14589368410681852,0.10018779431750162,0.07782472143325488,0.15098786111627707,0.09357406078008795,0.07452310411997025,0.14533196958241826,0.10506960729573904,0.08504735473614684,0.14978996780308892,0.09908915121927978,0.07721034456809772,0.15364999270209795,0.10538482686991034,0.08831969582425019,0.14282870663999295,0.10185085427135611 +Jitter,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 9, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 300}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.855,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.09982073488007233,0.08075044561485044,0.14601527052738977,0.09032824499857926,0.07421404173894527,0.12919597989949616,0.09085343383584372,0.07117472608946632,0.14304478916322408,0.09632049134561811,0.07975459307117581,0.13497425398597693,0.09284283651034325,0.07357382941196199,0.14174401418858906,0.09728100991278386,0.08219731040322947,0.1315757893947365,0.09478971524288303 +Label_Stability,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 200}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.469,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.85022695035461,0.8754291417165668,0.7883333333333333,0.8580754716981133,0.8917572463768116,0.7815637860082304,0.8659523809523809,0.8943973941368077,0.7886725663716815,0.849888888888889,0.8797050938337801,0.7832934131736528,0.8592636579572447,0.8914475873544093,0.7790041493775934,0.8481458966565351,0.874070796460177,0.7912621359223301,0.8543866666666666 +Label_Stability,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 9, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 300}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.855,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.8559290780141845,0.8847695390781564,0.7860679611650486,0.8760251572327045,0.898914590747331,0.8208154506437768,0.8690238095238095,0.8987868852459017,0.7900869565217392,0.8656296296296296,0.8896296296296295,0.8096296296296298,0.8692161520190025,0.896887417218543,0.7989915966386556,0.8632066869300912,0.886148796498906,0.8110447761194031,0.8665799999999999 +Mean,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 200}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.469,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.6264553066342766,0.6350224175892961,0.6054154900241553,0.6280926825239275,0.6391419380456405,0.6029931391165794,0.6328264669792415,0.6414983469204215,0.6092665807673632,0.6251829237522277,0.6354056146231387,0.6023502070166001,0.6309943982951967,0.6428417639960218,0.6014497228338032,0.6226252134029358,0.6296563735659773,0.607197619258786,0.6273231158557915 +Mean,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 9, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 300}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.855,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.6286012173714474,0.6365736957866985,0.6092892429578048,0.6296421676798395,0.6373699060606255,0.6110027300403467,0.6346636366829191,0.6436055319289313,0.6109481753782781,0.6270098649495525,0.6343286695308334,0.609932654259897,0.6331384161126694,0.6434338032235482,0.6070106269741369,0.6240529410113603,0.6284860924652322,0.6139735867107661,0.6291529210348952 +Overall_Uncertainty,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 200}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.469,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.8274442448734235,0.8000071226934146,0.8948265890507979,0.7999419940216349,0.7698496376961211,0.868299939254901,0.8182029164174677,0.7895586229561058,0.896024138476212,0.8107933823959507,0.7819920525873124,0.8751221010703346,0.8068965450963882,0.775618304922437,0.8848974676878604,0.8205094026015264,0.7956061221665376,0.8751515519054823,0.8128680519219754 +Overall_Uncertainty,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 9, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 300}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.855,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.8271963320338425,0.7998580167111532,0.8934187560436576,0.8021624647050382,0.7753173398547557,0.8669133667044315,0.8175326721439048,0.7882031667287702,0.8953196212883927,0.8125267140962261,0.7863168379430732,0.8736830917869162,0.8077521965089973,0.7773050213920191,0.8850214980663708,0.8218316475133565,0.7994863510206975,0.8726366251110933,0.8139283823495762 +PPV,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 200}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.469,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.6982248520710059,1.0,0.0,0.6600985221674877,1.0,0.0,0.7157894736842105,1.0,0.0,0.6642599277978339,1.0,0.0,0.665,1.0,0.0,0.6918604651162791,1.0,0.0,0.6774193548387096 +PPV,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 9, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 300}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.855,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.696969696969697,1.0,0.0,0.6829268292682927,1.0,0.0,0.7096774193548387,1.0,0.0,0.6823104693140795,1.0,0.0,0.676923076923077,1.0,0.0,0.7028571428571428,1.0,0.0,0.6891891891891891 +Per_Sample_Accuracy,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 200}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.469,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.6969716312056737,0.9376347305389221,0.1059313725490196,0.6898930817610063,0.9452445652173914,0.10983539094650205,0.7206904761904762,0.9470684039087948,0.1056637168141593,0.682537037037037,0.9393833780160857,0.10886227544910179,0.7064964370546318,0.9453743760399336,0.1107883817427386,0.6762310030395138,0.9366371681415928,0.10485436893203884,0.69322 +Per_Sample_Accuracy,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 9, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 300}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.855,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.698418439716312,0.942304609218437,0.10764563106796117,0.6974465408805032,0.9494395017793595,0.08963519313304721,0.7180833333333334,0.9492622950819674,0.10495652173913043,0.6900555555555555,0.9448015873015873,0.09564814814814815,0.7087173396674584,0.9483609271523178,0.10054621848739495,0.6840653495440729,0.9430743982494529,0.09517412935323383,0.6979033333333333 +Positive-Rate,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 200}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.469,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.6236162361623616,1.0,0.3333333333333333,0.6590909090909091,1.0,0.39655172413793105,0.6168831168831169,1.0,0.313953488372093,0.6517647058823529,1.0,0.38589211618257263,0.6514657980456026,1.0,0.3850574712643678,0.6323529411764706,1.0,0.3464052287581699,0.6424870466321243 +Positive-Rate,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 9, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 300}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.855,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.6088560885608856,1.0,0.32051282051282054,0.6655844155844156,1.0,0.3869047619047619,0.6038961038961039,1.0,0.3068181818181818,0.6517647058823529,1.0,0.3728813559322034,0.6351791530944625,1.0,0.36,0.6433823529411765,1.0,0.348993288590604,0.6390328151986183 +Sample_Size,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 200}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.469,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,705.0,501.0,204.0,795.0,552.0,243.0,420.0,307.0,113.0,1080.0,746.0,334.0,842.0,601.0,241.0,658.0,452.0,206.0,1500.0 +Sample_Size,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 9, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 300}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.855,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,705.0,499.0,206.0,795.0,562.0,233.0,420.0,305.0,115.0,1080.0,756.0,324.0,842.0,604.0,238.0,658.0,457.0,201.0,1500.0 +Selection-Rate,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 200}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.469,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.2397163120567376,0.23552894211576847,0.25,0.25534591194968553,0.2427536231884058,0.2839506172839506,0.2261904761904762,0.22149837133550487,0.23893805309734514,0.2564814814814815,0.24664879356568364,0.27844311377245506,0.2375296912114014,0.22129783693843594,0.27800829875518673,0.2613981762917933,0.26327433628318586,0.25728155339805825,0.248 +Selection-Rate,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 9, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 300}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.855,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.23404255319148937,0.23046092184368738,0.24271844660194175,0.2578616352201258,0.2491103202846975,0.27896995708154504,0.22142857142857142,0.21639344262295082,0.23478260869565218,0.2564814814814815,0.25,0.2716049382716049,0.23159144893111638,0.2185430463576159,0.2647058823529412,0.26595744680851063,0.26914660831509846,0.25870646766169153,0.24666666666666667 +Statistical_Bias,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 200}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.469,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.38804196536167723,0.27890668733283297,0.6560653687560446,0.38599008865027307,0.2618247960764881,0.6680445804228218,0.3742132501958383,0.27018099381110705,0.6568495573649756,0.3919093897913865,0.26985787223587254,0.6645154739123851,0.37782562371741985,0.2650796811075449,0.6589887420100957,0.39863606517763234,0.2764306403591511,0.6667761235172126,0.3869544707046331 +Statistical_Bias,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 9, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 300}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.855,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.3885559433466212,0.27831558860610534,0.6555944725481619,0.38442822435245805,0.26520669854078754,0.6719925913316805,0.375213865977643,0.2692348260487328,0.6562887110064918,0.3907060691749649,0.27223415522421385,0.6671405350600507,0.37724518776147836,0.2658507318554373,0.6599437229179861,0.3980424473015309,0.27866914935160836,0.6694533784613047,0.3863682522797147 +Std,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 200}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.469,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.06074480598098658,0.05844502290559612,0.06639280265143079,0.05888889877355031,0.056772735070150515,0.06369598669238441,0.06031208764363007,0.05766774070193739,0.06749628685690134,0.05954693141781796,0.05752749308167824,0.06405741345003427,0.059162182534331226,0.05669577574866198,0.06531284841892547,0.06052766724568562,0.058728639401506376,0.06447504872903037,0.059761175161045364 +Std,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 9, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 300}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.855,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.05724953332096407,0.05479888693824584,0.06318580781114079,0.05557350053362412,0.053752796291960545,0.059965070421241856,0.05658861834255801,0.053703144311385224,0.06424139729479886,0.056272809455218974,0.05446330302023016,0.06049499113685953,0.05578663878039028,0.053308143239740924,0.06207660225329872,0.0570965107331645,0.05548270805571768,0.06076570388536947,0.056361235943673905 +TNR,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 200}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.469,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.8824884792626728,1.0,0.0,0.8583162217659137,1.0,0.0,0.8984962406015038,1.0,0.0,0.8580152671755725,1.0,0.0,0.874766355140187,1.0,0.0,0.8626943005181347,1.0,0.0,0.8697068403908795 +TNR,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 9, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 300}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.855,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.8847926267281107,1.0,0.0,0.86652977412731,1.0,0.0,0.8984962406015038,1.0,0.0,0.8656488549618321,1.0,0.0,0.8822429906542056,1.0,0.0,0.8652849740932642,1.0,0.0,0.8751357220412594 +TPR,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 11, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 20, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 200}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.469,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.4354243542435424,1.0,0.0,0.43506493506493504,1.0,0.0,0.44155844155844154,1.0,0.0,0.4329411764705882,1.0,0.0,0.43322475570032576,1.0,0.0,0.4375,1.0,0.0,0.43523316062176165 +TPR,101,LGBMClassifier,"{'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': 9, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': -1, 'num_leaves': 351, 'objective': None, 'random_state': 101, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'silent': 'warn', 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'min_data_in_leaf': 300}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.855,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.42435424354243545,1.0,0.0,0.45454545454545453,1.0,0.0,0.42857142857142855,1.0,0.0,0.4447058823529412,1.0,0.0,0.42996742671009774,1.0,0.0,0.4522058823529412,1.0,0.0,0.44041450777202074 +Accuracy,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.908,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.6936170212765957,1.0,0.0,0.6641509433962264,1.0,0.0,0.7095238095238096,1.0,0.0,0.6657407407407407,1.0,0.0,0.6805225653206651,1.0,0.0,0.6747720364741642,1.0,0.0,0.678 +Accuracy,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.517,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.6936170212765957,1.0,0.0,0.6591194968553459,1.0,0.0,0.7095238095238096,1.0,0.0,0.6620370370370371,1.0,0.0,0.6781472684085511,1.0,0.0,0.6717325227963525,1.0,0.0,0.6753333333333333 +Aleatoric_Uncertainty,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.908,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.8515697157623061,0.830273708447981,0.8997815100989034,0.8348278134330117,0.8088630094213481,0.8861739427145041,0.8509770547299633,0.8296747971442832,0.903010438013018,0.8394762947269311,0.8147989191328764,0.8886259707715997,0.8467183943701027,0.8218368971854656,0.8997187582615417,0.8375499593192154,0.8157003835996907,0.882882723896173,0.84269650752778 +Aleatoric_Uncertainty,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.517,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.8504975521910515,0.8291507966101547,0.8988242349644708,0.8339844357109005,0.8065692616739931,0.886993849715843,0.8502673199637264,0.828748814196903,0.9028289160171146,0.8384315984260112,0.8127690713690363,0.8887020281403594,0.8463033278714274,0.820803400214462,0.9000319577316752,0.8359133717585339,0.8131635546087789,0.882466238333496,0.8417456004565714 +F1,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.908,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.47058823529411764,1.0,0.0,0.4517453798767967,1.0,0.0,0.47863247863247865,1.0,0.0,0.45385779122541603,1.0,0.0,0.4407484407484408,1.0,0.0,0.4830917874396135,1.0,0.0,0.46033519553072627 +F1,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.517,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.46798029556650245,1.0,0.0,0.4458077709611452,1.0,0.0,0.47413793103448276,1.0,0.0,0.4494720965309201,1.0,0.0,0.4342379958246347,1.0,0.0,0.4807692307692308,1.0,0.0,0.4558659217877095 +FNR,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.908,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.6457564575645757,0.0,1.0,0.6428571428571429,0.0,1.0,0.6363636363636364,0.0,1.0,0.6470588235294118,0.0,1.0,0.6547231270358306,0.0,1.0,0.6323529411764706,0.0,1.0,0.6442141623488774 +FNR,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.517,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.6494464944649446,0.0,1.0,0.6461038961038961,0.0,1.0,0.6428571428571429,0.0,1.0,0.6494117647058824,0.0,1.0,0.6612377850162866,0.0,1.0,0.6323529411764706,0.0,1.0,0.6476683937823834 +FPR,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.908,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.0944700460829493,0.0,1.0,0.14168377823408623,0.0,1.0,0.09022556390977443,0.0,1.0,0.13129770992366413,0.0,1.0,0.12710280373831775,0.0,1.0,0.10880829015544041,0.0,1.0,0.11943539630836048 +FPR,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.517,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.09216589861751152,0.0,1.0,0.14784394250513347,0.0,1.0,0.08646616541353383,0.0,1.0,0.13587786259541984,0.0,1.0,0.12710280373831775,0.0,1.0,0.11398963730569948,0.0,1.0,0.12160694896851248 +IQR,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.908,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.038117359330767035,0.03679087601014397,0.041120370181622026,0.038256580190871976,0.037163104731888705,0.04041895862661418,0.03836409203429037,0.03681656696640721,0.04214411228207054,0.03812388974586299,0.037053575398342545,0.040255623861838605,0.038572413945265886,0.03672344915452171,0.04251091515380274,0.03770326297571445,0.03732054347265023,0.03849731652412807,0.03819114638662266 +IQR,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.517,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.03716673753970955,0.03576627382150582,0.040337231790643045,0.03698256008895322,0.035666982878341184,0.03952633299803333,0.03723794966665782,0.03533935692747032,0.04187549586565682,0.037003468866867374,0.035871438549064286,0.039221007708591216,0.037240538881360766,0.03516629474978872,0.041610994228695235,0.03684977431323295,0.03642364847248363,0.03772175404291444,0.0370691234908087 +Jitter,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.908,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.04138087601126203,0.03137610342099107,0.06403056951423793,0.05556632217692276,0.04481488883812897,0.07682758361095354,0.03823342905001187,0.02805065596438884,0.06310610429195429,0.053046947701470705,0.042623199446464845,0.07380782026475709,0.049878967282970914,0.03660755785910355,0.07814854943864306,0.047645369705670494,0.040605957716508496,0.062250504860748915,0.04889916247906253 +Jitter,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.517,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.04132036066859113,0.031948906084616084,0.0625362925739811,0.05358616984292591,0.04110169166442774,0.07772589886702996,0.03834194783441002,0.02836126943442296,0.06272098195897755,0.05150763074632467,0.04015194855395816,0.07375232326013738,0.048660344477733555,0.03495208089484144,0.07754380759888109,0.04674749125566955,0.038920052752451396,0.0627647496742977,0.04782123953098891 +Label_Stability,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.908,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.9414042553191491,0.9575051124744377,0.9049537037037039,0.9201886792452829,0.9338825757575757,0.8931086142322098,0.9462142857142857,0.9622818791946308,0.9069672131147541,0.9239166666666666,0.9381780250347704,0.8955124653739611,0.9289073634204276,0.9478010471204187,0.8886617100371748,0.9317629179331306,0.9419369369369369,0.9106542056074766,0.93016 +Label_Stability,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.517,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.9424113475177305,0.9570961145194273,0.9091666666666667,0.9237484276729558,0.9414885496183206,0.8894464944649447,0.9469523809523809,0.9626845637583893,0.9085245901639346,0.9269074074074074,0.9433286713286714,0.8947397260273973,0.9312232779097388,0.9517863397548162,0.8878966789667897,0.9341793313069908,0.9454524886877828,0.9111111111111112,0.9325200000000001 +Mean,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.908,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.6288360246290604,0.6363864744460471,0.6117426451822714,0.6288371788481966,0.642370058834907,0.6020755285373985,0.6315260899769207,0.641783083975156,0.6064721210304114,0.6277907377384233,0.638543835944856,0.6063739022524816,0.6310346148789993,0.6477686092195549,0.5953893406888936,0.6260240255618337,0.6288129819507721,0.6202375926801105,0.6288366363652027 +Mean,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.517,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.6290729831079517,0.6366689361605433,0.6118765893916679,0.6295174814626796,0.6439561029507577,0.60159926131599,0.6314645318987215,0.6419338237273378,0.6058919993993149,0.6284701365337714,0.6398151444167217,0.6062463539685401,0.6311814330382298,0.6484439317366778,0.5948091571828287,0.6269119821211955,0.6300964314639359,0.6203956552254026,0.6293085672359575 +Overall_Uncertainty,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.908,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.8549267929668882,0.8335009110820216,0.9034326089006838,0.8384033957460167,0.8124002416253632,0.8898253634452867,0.8542986584559523,0.832829242890242,0.9067403456574414,0.843008011211333,0.8182839481446567,0.8922506742167075,0.8501800590830288,0.8250999645455408,0.9036034574844435,0.8410372019936616,0.8192499851637508,0.8862405864445042,0.8461693924398265 +Overall_Uncertainty,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.517,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.8538325680863391,0.832312730832533,0.9025510885359282,0.8373037289546026,0.8098620981517936,0.8903642992153846,0.853563330438458,0.8318124083351024,0.9066926319696058,0.8417702094774311,0.8160679260486544,0.8921185181118844,0.8495869644310914,0.8238903019608642,0.9037301167207586,0.8392951382504544,0.8165776072149208,0.8857819378694636,0.8450722833465186 +PPV,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.908,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.7007299270072993,1.0,0.0,0.6145251396648045,1.0,0.0,0.7,1.0,0.0,0.635593220338983,1.0,0.0,0.6091954022988506,1.0,0.0,0.704225352112676,1.0,0.0,0.6518987341772152 +PPV,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.517,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.7037037037037037,1.0,0.0,0.6022099447513812,1.0,0.0,0.7051282051282052,1.0,0.0,0.6260504201680672,1.0,0.0,0.6046511627906976,1.0,0.0,0.6944444444444444,1.0,0.0,0.6455696202531646 +Per_Sample_Accuracy,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.908,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.6934397163120567,0.9787525562372188,0.04752314814814816,0.6601949685534592,0.9667897727272727,0.05389513108614232,0.7096547619047617,0.9811409395973154,0.04651639344262295,0.662662037037037,0.9689777468706536,0.05257617728531856,0.680688836104513,0.9739005235602095,0.05611524163568773,0.6695896656534955,0.9707882882882882,0.044672897196261684,0.67582 +Per_Sample_Accuracy,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.517,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.6927801418439716,0.9785480572597137,0.04583333333333334,0.6587169811320756,0.9707251908396946,0.05542435424354243,0.7097857142857144,0.9813422818791946,0.04647540983606558,0.6610925925925926,0.9716503496503497,0.05273972602739726,0.6799940617577198,0.975893169877408,0.056531365313653145,0.6679863221884498,0.9727036199095023,0.04444444444444445,0.6747266666666667 +Positive-Rate,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.908,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.5055350553505535,1.0,0.2342857142857143,0.5811688311688312,1.0,0.3484848484848485,0.5194805194805194,1.0,0.24489795918367346,0.5552941176470588,1.0,0.31272727272727274,0.5667752442996743,1.0,0.3383084577114428,0.5220588235294118,1.0,0.2441860465116279,0.5457685664939551 +Positive-Rate,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.517,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.4981549815498155,1.0,0.22727272727272727,0.5876623376623377,1.0,0.36180904522613067,0.5064935064935064,1.0,0.23232323232323232,0.56,1.0,0.322463768115942,0.5602605863192183,1.0,0.33497536945812806,0.5294117647058824,1.0,0.2558139534883721,0.5457685664939551 +Sample_Size,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.908,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,705.0,489.0,216.0,795.0,528.0,267.0,420.0,298.0,122.0,1080.0,719.0,361.0,842.0,573.0,269.0,658.0,444.0,214.0,1500.0 +Sample_Size,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.517,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,705.0,489.0,216.0,795.0,524.0,271.0,420.0,298.0,122.0,1080.0,715.0,365.0,842.0,571.0,271.0,658.0,442.0,216.0,1500.0 +Selection-Rate,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.908,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.19432624113475178,0.19631901840490798,0.18981481481481483,0.22515723270440252,0.20833333333333334,0.25842696629213485,0.19047619047619047,0.18791946308724833,0.19672131147540983,0.21851851851851853,0.2086230876216968,0.23822714681440443,0.20665083135391923,0.1849912739965096,0.2527881040892193,0.21580547112462006,0.22522522522522523,0.19626168224299065,0.21066666666666667 +Selection-Rate,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.517,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.19148936170212766,0.19427402862985685,0.18518518518518517,0.22767295597484277,0.20801526717557253,0.2656826568265683,0.18571428571428572,0.18456375838926176,0.1885245901639344,0.22037037037037038,0.2083916083916084,0.24383561643835616,0.2042755344418052,0.18213660245183888,0.25092250922509224,0.2188449848024316,0.22624434389140272,0.2037037037037037,0.21066666666666667 +Statistical_Bias,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.908,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.4039291937726283,0.29349073469117737,0.6539495941931354,0.4087428626725564,0.28275627983019525,0.6578848691922816,0.3960629764865914,0.29149180749724696,0.6514909138540066,0.41053167343520086,0.28643633710730076,0.6576910829082206,0.40351857941126507,0.2883183735394532,0.6489078655248269,0.41027053734057767,0.2874005787752751,0.6651969934293362,0.4064804382895902 +Statistical_Bias,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.517,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.4036191387901632,0.2926940987099507,0.6547411045273106,0.40883293669159354,0.280566544015709,0.6568461830464403,0.39555014263916305,0.29080184109709023,0.65141074804521,0.41059501630410494,0.284594873687363,0.6574172134848459,0.4035569797393647,0.2872536582475763,0.6486093656132066,0.4099980251920011,0.285344897000071,0.6650752597328954,0.40638245167792125 +Std,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.908,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.028175265359520384,0.02722587397867902,0.030324581957814022,0.028620160323482583,0.02767576962960001,0.030487719448463856,0.02825427030311296,0.027118207992728415,0.03102924217601947,0.028472033341039888,0.027600880053087314,0.030207100415937122,0.02860264326558721,0.027150130097744484,0.031696658303408336,0.02816590259271443,0.027858635572061394,0.02880340986920951,0.02841105969042035 +Std,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.517,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.02798776425030242,0.026920845190441814,0.030403150455264618,0.027768179514933208,0.026766427576262006,0.02970514636313878,0.028044448850024377,0.026679762461346936,0.03137786314367912,0.027804081475763767,0.026908156831616716,0.02955911194306552,0.027963585810352985,0.026459865881110697,0.031131940347612554,0.027753400088932973,0.027333298484102108,0.028613052446966505,0.027871384340556738 +TNR,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.908,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.9055299539170507,1.0,0.0,0.8583162217659137,1.0,0.0,0.9097744360902256,1.0,0.0,0.8687022900763359,1.0,0.0,0.8728971962616823,1.0,0.0,0.8911917098445595,1.0,0.0,0.8805646036916395 +TNR,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.517,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.9078341013824884,1.0,0.0,0.8521560574948666,1.0,0.0,0.9135338345864662,1.0,0.0,0.8641221374045801,1.0,0.0,0.8728971962616823,1.0,0.0,0.8860103626943006,1.0,0.0,0.8783930510314875 +TPR,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.908,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.35424354243542433,1.0,0.0,0.35714285714285715,1.0,0.0,0.36363636363636365,1.0,0.0,0.35294117647058826,1.0,0.0,0.34527687296416937,1.0,0.0,0.36764705882352944,1.0,0.0,0.35578583765112265 +TPR,101,LogisticRegression,"{'C': 1, 'class_weight': None, 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 'l1_ratio': None, 'max_iter': 1000, 'multi_class': 'auto', 'n_jobs': None, 'penalty': 'l1', 'random_state': 101, 'solver': 'saga', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.517,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.3505535055350554,1.0,0.0,0.3538961038961039,1.0,0.0,0.35714285714285715,1.0,0.0,0.35058823529411764,1.0,0.0,0.33876221498371334,1.0,0.0,0.36764705882352944,1.0,0.0,0.35233160621761656 +Accuracy,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'adaptive', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-02 03:07:47.064,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.6836879432624113,1.0,0.0,0.6716981132075471,1.0,0.0,0.7166666666666667,1.0,0.0,0.6620370370370371,1.0,0.0,0.6971496437054632,1.0,0.0,0.6519756838905775,1.0,0.0,0.6773333333333333 +Accuracy,101,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'adaptive', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-02 03:29:51.795,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.699290780141844,1.0,0.0,0.6880503144654088,1.0,0.0,0.7428571428571429,1.0,0.0,0.674074074074074,1.0,0.0,0.7197149643705463,1.0,0.0,0.6595744680851063,1.0,0.0,0.6933333333333334 +Aleatoric_Uncertainty,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'adaptive', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-02 03:07:47.064,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.6734669507897533,0.6358225553074892,0.754832863894916,0.6432666301876696,0.612212372928401,0.7068029266491616,0.6638838015619872,0.6284473587534197,0.7535171569013045,0.6549629394906842,0.6212940193247506,0.7209171255691568,0.6482803086577847,0.6134498917246337,0.7284585625391954,0.6692084368026119,0.6370461360364009,0.7294600832161686,0.657460780870649 +Aleatoric_Uncertainty,101,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'adaptive', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-02 03:29:51.795,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.781055339814094,0.7465782157257179,0.8612309161139501,0.7608481153169574,0.7275322647798578,0.8343310598483826,0.7740517435189649,0.7463522578190568,0.8540724799853656,0.7689041981184743,0.7323644295986477,0.8444750830117523,0.7670183928660977,0.7366964718963996,0.8448789187459159,0.7746030082867222,0.7363713069542466,0.8486769296183935,0.7703455108306116 +F1,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'adaptive', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-02 03:07:47.064,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.5098901098901099,1.0,0.0,0.5175600739371534,1.0,0.0,0.5576208178438662,1.0,0.0,0.49793672627235214,1.0,0.0,0.5372050816696915,1.0,0.0,0.4853932584269663,1.0,0.0,0.5140562248995983 +F1,101,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'adaptive', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-02 03:29:51.795,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.5023474178403756,1.0,0.0,0.5303030303030303,1.0,0.0,0.5609756097560976,1.0,0.0,0.5028248587570622,1.0,0.0,0.5408560311284046,1.0,0.0,0.4909090909090909,1.0,0.0,0.5178197064989518 +FNR,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'adaptive', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-02 03:07:47.064,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.5719557195571956,0.0,1.0,0.5454545454545454,0.0,1.0,0.512987012987013,0.0,1.0,0.5741176470588235,0.0,1.0,0.5179153094462541,0.0,1.0,0.6029411764705882,0.0,1.0,0.5578583765112263 +FNR,101,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'adaptive', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-02 03:29:51.795,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.6051660516605166,0.0,1.0,0.5454545454545454,0.0,1.0,0.551948051948052,0.0,1.0,0.5811764705882353,0.0,1.0,0.5472312703583062,0.0,1.0,0.6029411764705882,0.0,1.0,0.5734024179620034 +FPR,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'adaptive', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-02 03:07:47.064,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.15668202764976957,0.0,1.0,0.19096509240246407,0.0,1.0,0.15037593984962405,0.0,1.0,0.18473282442748093,0.0,1.0,0.17943925233644858,0.0,1.0,0.16839378238341968,0.0,1.0,0.1748099891422367 +FPR,101,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'adaptive', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-02 03:29:51.795,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.11059907834101383,0.0,1.0,0.16427104722792607,0.0,1.0,0.08646616541353383,0.0,1.0,0.16030534351145037,0.0,1.0,0.12710280373831775,0.0,1.0,0.15544041450777202,0.0,1.0,0.13897937024972856 +IQR,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'adaptive', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-02 03:07:47.064,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.19740234097160045,0.18280456630925876,0.2289544817215946,0.19257741575077017,0.1760082627737494,0.22647752184168618,0.19849937390022518,0.18435556703849623,0.23427488537401006,0.19342403598957966,0.1770757868582623,0.22544868839750273,0.19394541103344892,0.1777863421140638,0.23114295399689616,0.19599644349039003,0.18121125981652556,0.22369445133356838,0.19484513060456038 +IQR,101,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'adaptive', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-02 03:29:51.795,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.10239573721699301,0.09750872100302697,0.11376035511079136,0.10043012416393095,0.09447631316527576,0.11356211858435185,0.10255748865820903,0.09838706200739884,0.11460538787166065,0.1008859242702383,0.09485381787031551,0.1133614170518968,0.10159505122177855,0.0961041737336831,0.11569450782256598,0.10104545641271674,0.0956479573117193,0.11150311092089933,0.1013539622988701 +Jitter,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'adaptive', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-02 03:07:47.064,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.1980338572294045,0.16986884630621635,0.25891069698266933,0.19071742359596736,0.1619660098244067,0.24954215522057213,0.20184733189757914,0.17530993839631456,0.26897132722435835,0.19116513121161505,0.1616760023895709,0.24893150684932258,0.19871190871220515,0.16821244210832387,0.2689204847768004,0.18832643460463006,0.1622982043082556,0.23708674376245972,0.19415614740368436 +Jitter,101,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'adaptive', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-02 03:29:51.795,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.11943169749456542,0.0952585442425127,0.17564568123636615,0.11473910432666616,0.08781044160473164,0.1741341789593184,0.11531347212251827,0.09872197526092326,0.16324446305602197,0.11757895961287973,0.08817790877464315,0.17838567839195912,0.11802844388211825,0.09649178234406798,0.1733302103739032,0.115557727848972,0.08414920223236413,0.1764117462311557,0.11694462311557688 +Label_Stability,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'adaptive', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-02 03:07:47.064,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.7214751773049645,0.7664315352697095,0.624304932735426,0.7278364779874216,0.7740823970037454,0.6332183908045976,0.7129523809523809,0.7563787375415283,0.6031092436974789,0.7294722222222222,0.7763776223776222,0.6375890410958903,0.7150712589073633,0.765587734241908,0.5987843137254902,0.737355623100304,0.7771095571095571,0.6628820960698688,0.7248466666666666 +Label_Stability,101,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'adaptive', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-02 03:29:51.795,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.8313617021276596,0.8675659229208924,0.7471698113207547,0.8394213836477988,0.879689213893967,0.7506048387096774,0.8380952380952381,0.8632371794871796,0.765462962962963,0.8346759259259259,0.8785302197802197,0.7439772727272728,0.8336698337292162,0.865990099009901,0.750677966101695,0.8381458966565349,0.8850460829493088,0.7472767857142858,0.8356333333333333 +Mean,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'adaptive', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-02 03:07:47.064,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.6268832189161339,0.6394571057183438,0.5997055801777249,0.6271454467968993,0.6472972060306217,0.5859154106635361,0.6283275463763558,0.640526254786101,0.5974719898105297,0.6265145648716111,0.6448624199803878,0.5905728760968838,0.6285165494945291,0.6493207302624522,0.5806261412169961,0.6251099769985043,0.6357197303322476,0.6052340635479547,0.6270221996929396 +Mean,101,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'adaptive', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-02 03:29:51.795,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.6337148095287487,0.6441222519584647,0.6095125967087016,0.6213376553073015,0.6383457444284133,0.5838238458345264,0.6404188502095424,0.6456805156072316,0.6252184835051068,0.6219967218509859,0.6391141092697925,0.5865948524166357,0.6322827035174826,0.6467312742012516,0.5951817126939056,0.6205932223789548,0.6331987102578495,0.5961700896135964,0.6271549177913817 +Overall_Uncertainty,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'adaptive', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-02 03:07:47.064,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.7630064139306723,0.7195558682829732,0.8569219430884788,0.7328423894325358,0.6945848579793925,0.8111164193021854,0.7547546468681712,0.7135321397827071,0.8590233412608156,0.7440113608660721,0.7034420539843271,0.8234827428399017,0.7381459941360415,0.6963443701786747,0.8343716932065294,0.7583743075341077,0.7202333272226261,0.8298261876809441,0.7470194809466599 +Overall_Uncertainty,101,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'adaptive', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-02 03:29:51.795,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.8056917329887449,0.770104683231916,0.8884484100175968,0.7850945949368143,0.7505783337391364,0.8612252194333054,0.7989648483866314,0.7702179135518367,0.8820115490204833,0.7931459614902291,0.7553845719237215,0.8712433808209603,0.7915628332087555,0.7598973487276575,0.8728733569186939,0.7988859713830705,0.759746921796502,0.874717879957047,0.7947752498212217 +PPV,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'adaptive', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-02 03:07:47.064,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.6304347826086957,1.0,0.0,0.6008583690987125,1.0,0.0,0.6521739130434783,1.0,0.0,0.5993377483443708,1.0,0.0,0.6065573770491803,1.0,0.0,0.6242774566473989,1.0,0.0,0.6139088729016786 +PPV,101,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'adaptive', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-02 03:29:51.795,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.6903225806451613,1.0,0.0,0.6363636363636364,1.0,0.0,0.75,1.0,0.0,0.6289752650176679,1.0,0.0,0.6714975845410628,1.0,0.0,0.6428571428571429,1.0,0.0,0.6586666666666666 +Per_Sample_Accuracy,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'adaptive', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-02 03:07:47.064,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.6633333333333333,0.8832157676348549,0.18807174887892375,0.6560691823899372,0.8870411985018727,0.18350574712643677,0.6855952380952383,0.878189368770764,0.19844537815126048,0.6493287037037037,0.8881888111888113,0.18142465753424658,0.676229216152019,0.8827938671209541,0.20072549019607844,0.6380547112462006,0.8885547785547787,0.16877729257641919,0.6594833333333333 +Per_Sample_Accuracy,101,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'adaptive', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-02 03:29:51.795,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.6909007092198582,0.9336409736308315,0.12641509433962264,0.6855849056603773,0.9397349177330895,0.1250201612903226,0.722047619047619,0.9313942307692309,0.11726851851851851,0.674875,0.9391826923076921,0.12823863636363636,0.7062767220902613,0.9327805280528051,0.12466101694915253,0.6648024316109422,0.9425230414746544,0.12671875,0.6880833333333334 +Positive-Rate,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'adaptive', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-02 03:07:47.064,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.6789667896678967,1.0,0.43870967741935485,0.7564935064935064,1.0,0.5535714285714286,0.7467532467532467,1.0,0.5063291139240507,0.7105882352941176,1.0,0.4959016393442623,0.7947882736156352,1.0,0.6037735849056604,0.6360294117647058,1.0,0.39634146341463417,0.7202072538860104 +Positive-Rate,101,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'adaptive', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-02 03:29:51.795,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.5719557195571956,1.0,0.2926829268292683,0.7142857142857143,1.0,0.47619047619047616,0.5974025974025974,1.0,0.27058823529411763,0.6658823529411765,1.0,0.4251012145748988,0.6742671009771987,1.0,0.40476190476190477,0.6176470588235294,1.0,0.36585365853658536,0.6476683937823834 +Sample_Size,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'adaptive', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-02 03:07:47.064,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,705.0,482.0,223.0,795.0,534.0,261.0,420.0,301.0,119.0,1080.0,715.0,365.0,842.0,587.0,255.0,658.0,429.0,229.0,1500.0 +Sample_Size,101,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'adaptive', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-02 03:29:51.795,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,705.0,493.0,212.0,795.0,547.0,248.0,420.0,312.0,108.0,1080.0,728.0,352.0,842.0,606.0,236.0,658.0,434.0,224.0,1500.0 +Selection-Rate,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'adaptive', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-02 03:07:47.064,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.26099290780141843,0.24066390041493776,0.30493273542600896,0.2930817610062893,0.26217228464419473,0.3563218390804598,0.27380952380952384,0.24916943521594684,0.33613445378151263,0.2796296296296296,0.25314685314685315,0.3315068493150685,0.28978622327790976,0.252129471890971,0.3764705882352941,0.2629179331306991,0.2517482517482518,0.2838427947598253,0.278 +Selection-Rate,101,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'adaptive', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-02 03:29:51.795,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.2198581560283688,0.21703853955375255,0.22641509433962265,0.27672955974842767,0.25594149908592323,0.3225806451612903,0.21904761904761905,0.22115384615384615,0.21296296296296297,0.262037037037037,0.2445054945054945,0.29829545454545453,0.24584323040380046,0.22937293729372937,0.288135593220339,0.2553191489361702,0.2488479262672811,0.26785714285714285,0.25 +Statistical_Bias,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'adaptive', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-02 03:07:47.064,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.3807297343465652,0.24043401327901134,0.6839698130665696,0.38502426159287184,0.22966931237853958,0.702876916307253,0.36421403247177536,0.23949117075643667,0.6796895062223379,0.3903137565208481,0.23279127945865197,0.6988851841906295,0.3698416524788147,0.23153238656439104,0.6882241587210368,0.39985118433662564,0.2392146766837437,0.7007815851361293,0.38300583378710773 +Statistical_Bias,101,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'adaptive', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-02 03:29:51.795,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.38266821347089364,0.26278602092236697,0.6614508593502505,0.38427330220947087,0.25266759895435514,0.674548784792327,0.3669845276107789,0.2629394621083681,0.6675591612844096,0.38994894829350213,0.2551175450067971,0.6688048050910056,0.3738418003464737,0.2587440196602731,0.6693894914305313,0.3959020818568063,0.255676979328649,0.6675882180051109,0.3835189105023396 +Std,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'adaptive', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-02 03:07:47.064,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.14326876020416268,0.13488905680934812,0.16138094422344795,0.14038936167965027,0.13102049914123828,0.1595578390570909,0.1435257016110795,0.1354974257399826,0.1638325170497363,0.1410492812987067,0.13174370178432485,0.15927801925153698,0.14147619336093312,0.13223476255983316,0.16274960465601418,0.1420836833880714,0.13370551585292537,0.15777902780980788,0.14174267898617107 +Std,101,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'adaptive', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-02 03:29:51.795,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.07717572599192868,0.0735985901671812,0.0854942541126858,0.0754735976902358,0.07139093512785967,0.08447850261612189,0.07739913936048744,0.0743956555491502,0.08607587037101722,0.07583588745985413,0.07159821694508889,0.08460016056993681,0.0764659167428356,0.07263366650877591,0.08630635590317527,0.07602750013765901,0.07216346673511836,0.08351406485508149,0.07627359799203146 +TNR,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'adaptive', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-02 03:07:47.064,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.8433179723502304,1.0,0.0,0.8090349075975359,1.0,0.0,0.849624060150376,1.0,0.0,0.815267175572519,1.0,0.0,0.8205607476635514,1.0,0.0,0.8316062176165803,1.0,0.0,0.8251900108577633 +TNR,101,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'adaptive', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-02 03:29:51.795,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.8894009216589862,1.0,0.0,0.8357289527720739,1.0,0.0,0.9135338345864662,1.0,0.0,0.8396946564885496,1.0,0.0,0.8728971962616823,1.0,0.0,0.844559585492228,1.0,0.0,0.8610206297502715 +TPR,101,MLPClassifier,"{'activation': 'relu', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'adaptive', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-02 03:07:47.064,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.4280442804428044,1.0,0.0,0.45454545454545453,1.0,0.0,0.487012987012987,1.0,0.0,0.4258823529411765,1.0,0.0,0.4820846905537459,1.0,0.0,0.39705882352941174,1.0,0.0,0.4421416234887737 +TPR,101,MLPClassifier,"{'activation': 'tanh', 'alpha': 0.0001, 'batch_size': 'auto', 'beta_1': 0.9, 'beta_2': 0.999, 'early_stopping': False, 'epsilon': 1e-08, 'hidden_layer_sizes': (100, 100), 'learning_rate': 'adaptive', 'learning_rate_init': 0.001, 'max_fun': 15000, 'max_iter': 1000, 'momentum': 0.9, 'n_iter_no_change': 10, 'nesterovs_momentum': True, 'power_t': 0.5, 'random_state': 101, 'shuffle': True, 'solver': 'sgd', 'tol': 0.0001, 'validation_fraction': 0.1, 'verbose': False, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-02 03:29:51.795,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.3948339483394834,1.0,0.0,0.45454545454545453,1.0,0.0,0.44805194805194803,1.0,0.0,0.4188235294117647,1.0,0.0,0.4527687296416938,1.0,0.0,0.39705882352941174,1.0,0.0,0.4265975820379965 +Accuracy,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 30, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 2, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.960,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.6893617021276596,1.0,0.0,0.6930817610062893,1.0,0.0,0.7214285714285714,1.0,0.0,0.6796296296296296,1.0,0.0,0.7078384798099763,1.0,0.0,0.6702127659574468,1.0,0.0,0.6913333333333334 +Accuracy,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 50, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.565,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.6964539007092199,1.0,0.0,0.7094339622641509,1.0,0.0,0.7309523809523809,1.0,0.0,0.6925925925925925,1.0,0.0,0.7173396674584323,1.0,0.0,0.6854103343465046,1.0,0.0,0.7033333333333334 +Aleatoric_Uncertainty,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 30, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 2, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.960,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.8265278046565147,0.7975502828170815,0.8908340859988187,0.8052374105955816,0.7779358296129241,0.8668897512572382,0.8200500638136052,0.7920365756256592,0.8925978152746957,0.8133748304672369,0.7851021759553788,0.8733520802120462,0.8115114985349681,0.7818886797601712,0.8832806041844763,0.8200200029481567,0.7942095837386864,0.8724734355351442,0.8152438958042203 +Aleatoric_Uncertainty,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 50, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.565,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.8059884095781719,0.7779248233370963,0.87037729202849,0.7802950117382066,0.7587581699545302,0.8328784695996504,0.7990200554270445,0.7700997239821913,0.87759122138784,0.7897851294491914,0.7666846000672949,0.8418309004662357,0.7867516757360068,0.7589139142914507,0.8573987678053848,0.7995614773780664,0.7794161682501841,0.843452947990022,0.7923709087229902 +F1,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 30, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 2, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.960,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.47980997624703087,1.0,0.0,0.5196850393700787,1.0,0.0,0.5185185185185185,1.0,0.0,0.4956268221574344,1.0,0.0,0.508,1.0,0.0,0.49417249417249415,1.0,0.0,0.5016146393972013 +F1,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 50, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.565,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.5180180180180181,1.0,0.0,0.5583173996175909,1.0,0.0,0.5637065637065637,1.0,0.0,0.5310734463276836,1.0,0.0,0.5475285171102662,1.0,0.0,0.5306122448979592,1.0,0.0,0.5398138572905895 +FNR,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 30, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 2, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.960,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.6273062730627307,0.0,1.0,0.5714285714285714,0.0,1.0,0.5909090909090909,0.0,1.0,0.6,0.0,1.0,0.5863192182410424,0.0,1.0,0.6102941176470589,0.0,1.0,0.5975820379965457 +FNR,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 50, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.565,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.5756457564575646,0.0,1.0,0.525974025974026,0.0,1.0,0.525974025974026,0.0,1.0,0.5576470588235294,0.0,1.0,0.5309446254071661,0.0,1.0,0.5698529411764706,0.0,1.0,0.5492227979274611 +FPR,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 30, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 2, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.960,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.11290322580645161,0.0,1.0,0.13963039014373715,0.0,1.0,0.09774436090225563,0.0,1.0,0.13893129770992366,0.0,1.0,0.1233644859813084,0.0,1.0,0.13212435233160622,0.0,1.0,0.1270358306188925 +FPR,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 50, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.565,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.1336405529953917,0.0,1.0,0.14168377823408623,0.0,1.0,0.12030075187969924,0.0,1.0,0.1450381679389313,0.0,1.0,0.14018691588785046,0.0,1.0,0.13471502590673576,0.0,1.0,0.13789359391965256 +IQR,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 30, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 2, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.960,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.09776421660070099,0.0940498348150208,0.10600709124837483,0.09374550306009548,0.08961279492790766,0.10307797101433933,0.09797245970902345,0.09470073514538789,0.1064453874251052,0.09472501348007432,0.0904503364800064,0.10379325890796408,0.0962010005902325,0.09220329877879334,0.10588648953176803,0.09490912635151116,0.09100159558552472,0.10285023726303202,0.09563429842418009 +IQR,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 50, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.565,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.1207941869859492,0.11635802082019236,0.1309724934690642,0.11358428015227655,0.11017298061722683,0.12191316732876158,0.12011261720412818,0.1163947162741175,0.13021346309362625,0.11575194937075944,0.1116793735222945,0.12492751182452982,0.11636081196523013,0.11196666001228317,0.12751235725758284,0.11775623232740162,0.11450440497430449,0.12484113153632342,0.11697293636410268 +Jitter,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 30, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 2, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.960,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.12010812929897735,0.09040459499141575,0.18602556159794617,0.11619348313896595,0.09408539977564596,0.16611788450448553,0.11975604211533854,0.09335671758130959,0.18812352360090467,0.11736343755816346,0.09194905042925952,0.1712771952246759,0.12165184592797744,0.09428644902364411,0.18795175062297384,0.11340303340410304,0.08975728985059661,0.1614572864321672,0.11803336683416711 +Jitter,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 50, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.565,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.14798210912719284,0.11922627393587004,0.2139592823932739,0.13750804336145894,0.12304750703873996,0.17281428788966008,0.14480043072505172,0.11917453718104416,0.2144212211499789,0.1415093523171437,0.12212875876709137,0.18517406308653261,0.14332965301567188,0.1187002063296616,0.20583463536168317,0.1412807197079603,0.12470946751493756,0.17738523535552456,0.14243085427135782 +Label_Stability,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 30, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 2, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.960,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.8327517730496454,0.8777572016460906,0.7328767123287672,0.8358364779874214,0.8700725952813068,0.7585245901639344,0.8298333333333333,0.8703300330033005,0.7249572649572651,0.8361574074074074,0.8750544959128065,0.7536416184971098,0.8261995249406177,0.8687751677852349,0.7230487804878049,0.8448632218844986,0.8802947845804989,0.7728571428571428,0.8343866666666666 +Label_Stability,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 50, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.565,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.7915886524822696,0.8361303462321793,0.689392523364486,0.8065408805031448,0.8279432624113476,0.7542857142857143,0.7948095238095237,0.8357328990228015,0.6836283185840707,0.8013425925925927,0.830120320855615,0.7365060240963854,0.797375296912114,0.8357450331125827,0.7000000000000001,0.8022492401215805,0.8264079822616409,0.7496135265700484,0.7995133333333333 +Mean,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 30, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 2, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.960,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.6310213290382105,0.6425665246743147,0.6054004839279516,0.6302442873839554,0.6420513559569972,0.6035816038440128,0.634175393028981,0.644039514658144,0.6086298472714047,0.6292227596018621,0.6415717373060011,0.6030257953393243,0.6343332491371193,0.6478028111088064,0.6016996762301046,0.625844452384086,0.6348461512543622,0.6075506772606214,0.6306094969614554 +Mean,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 50, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.565,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.6266304518626915,0.6381430994381714,0.6002159193413799,0.6268039975505542,0.6354801705539582,0.6056206141136714,0.6308651962489352,0.641309833563162,0.6024890577049739,0.6251113557327179,0.6348355068351389,0.6032027261405161,0.6305354175828034,0.643579740023169,0.5974313387845647,0.6218431991051179,0.6275319624004004,0.6094488404279563,0.6267224310772587 +Overall_Uncertainty,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 30, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 2, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.960,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.8456335234676194,0.8161565751515625,0.9110481211005133,0.823353932162184,0.7953033351622403,0.8866976983382863,0.8393379321639337,0.8109307300219629,0.9129053018136535,0.8316815542636626,0.8026597029991811,0.8932481404721296,0.8302834439049512,0.8000792359062137,0.9034611185685593,0.8383576752973237,0.8118299514692753,0.8922688559801324,0.8338253400757388 +Overall_Uncertainty,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 50, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.565,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.8358419462127025,0.8069680384892964,0.9020900242136015,0.807959798268302,0.7857410536201801,0.8622081618247559,0.8289040384477072,0.7995476067218015,0.9086600078269381,0.8180156625511282,0.7940082164123436,0.8721047279481486,0.8153565585646567,0.7866877715809292,0.8881126398174781,0.8283683729358883,0.8075828095457759,0.8736547936554084,0.8210644078021703 +PPV,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 30, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 2, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.960,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.6733333333333333,1.0,0.0,0.66,1.0,0.0,0.7078651685393258,1.0,0.0,0.6513409961685823,1.0,0.0,0.6580310880829016,1.0,0.0,0.6751592356687898,1.0,0.0,0.6657142857142857 +PPV,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 50, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.565,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.6647398843930635,1.0,0.0,0.6790697674418604,1.0,0.0,0.6952380952380952,1.0,0.0,0.6643109540636042,1.0,0.0,0.6575342465753424,1.0,0.0,0.6923076923076923,1.0,0.0,0.6726804123711341 +Per_Sample_Accuracy,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 30, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 2, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.960,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.6889432624113476,0.9388374485596709,0.1343835616438356,0.685125786163522,0.9348729582577132,0.12114754098360656,0.713202380952381,0.9350990099009903,0.13854700854700852,0.676699074074074,0.9374046321525885,0.12364161849710983,0.7020902612826603,0.9343540268456376,0.13936991869918697,0.6675075987841945,0.9399433106575963,0.1138479262672811,0.68692 +Per_Sample_Accuracy,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 50, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.565,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.6865460992907801,0.9179429735234217,0.1556308411214953,0.6840880503144653,0.9139539007092199,0.12285714285714286,0.7134047619047619,0.917671009771987,0.15845132743362833,0.6742916666666667,0.9150467914438504,0.13186746987951808,0.7007779097387175,0.9177566225165563,0.15012605042016808,0.6653647416413374,0.9132039911308204,0.12538647342995168,0.6852433333333333 +Positive-Rate,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 30, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 2, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.960,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.5535055350553506,1.0,0.28823529411764703,0.6493506493506493,1.0,0.38636363636363635,0.577922077922078,1.0,0.2857142857142857,0.6141176470588235,1.0,0.3568627450980392,0.6286644951140065,1.0,0.36666666666666664,0.5772058823529411,1.0,0.3072289156626506,0.6044905008635578 +Positive-Rate,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 50, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.565,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.6383763837638377,1.0,0.3717948717948718,0.698051948051948,1.0,0.42592592592592593,0.6818181818181818,1.0,0.3950617283950617,0.6658823529411765,1.0,0.4008438818565401,0.7133550488599348,1.0,0.4601226993865031,0.6213235294117647,1.0,0.33548387096774196,0.6701208981001727 +Sample_Size,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 30, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 2, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.960,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,705.0,486.0,219.0,795.0,551.0,244.0,420.0,303.0,117.0,1080.0,734.0,346.0,842.0,596.0,246.0,658.0,441.0,217.0,1500.0 +Sample_Size,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 50, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.565,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,705.0,491.0,214.0,795.0,564.0,231.0,420.0,307.0,113.0,1080.0,748.0,332.0,842.0,604.0,238.0,658.0,451.0,207.0,1500.0 +Selection-Rate,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 30, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 2, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.960,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.2127659574468085,0.20781893004115226,0.2237442922374429,0.25157232704402516,0.2395644283121597,0.2786885245901639,0.2119047619047619,0.2079207920792079,0.2222222222222222,0.24166666666666667,0.23160762942779292,0.2630057803468208,0.22921615201900236,0.21308724832214765,0.2682926829268293,0.23860182370820668,0.24036281179138322,0.2350230414746544,0.23333333333333334 +Selection-Rate,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 50, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.565,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.2453900709219858,0.23421588594704684,0.27102803738317754,0.27044025157232704,0.25886524822695034,0.2987012987012987,0.25,0.23778501628664495,0.2831858407079646,0.262037037037037,0.25133689839572193,0.286144578313253,0.26009501187648454,0.23841059602649006,0.31512605042016806,0.256838905775076,0.25942350332594233,0.25120772946859904,0.25866666666666666 +Statistical_Bias,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 30, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 2, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.960,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.39568703604637867,0.28458620508216764,0.6422395650354499,0.3942061322411184,0.2773123586040772,0.6581752686100107,0.38163450778574454,0.2817164153175404,0.6403967472546834,0.4000617984021977,0.28031053326916255,0.6541006094069601,0.38515223218103145,0.27803639883682396,0.644668641421469,0.4073785046321545,0.28434991282093636,0.6574043525065658,0.39490215702959086 +Statistical_Bias,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 50, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.565,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.3930658275524083,0.28263691861975415,0.6464330905707877,0.3932696577871171,0.27761160212138475,0.675655559932022,0.3760299855503612,0.2779786792735978,0.6424171627801519,0.3998409189204206,0.280759647194874,0.6681324588321943,0.3819627206936393,0.27447714280776647,0.654741246084678,0.40752002361878664,0.28728043543873466,0.6694913002816052,0.3931738575768039 +Std,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 30, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 2, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.960,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.07138170520710842,0.06883232555967064,0.07703923264388815,0.0685578124754467,0.06568594637599239,0.07504305108528007,0.0713728152178547,0.06906699981411775,0.07734428587881452,0.06930646360878946,0.06637352279495103,0.07552836695375303,0.07010424381613034,0.06735623463028029,0.07676202216884026,0.06960454376262892,0.06689603364064554,0.07510893530085318,0.06988504205932772 +Std,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 50, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.565,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.08719113374979333,0.08411282120286062,0.09425399104205477,0.08246286338476243,0.08000786245602967,0.08845689162634371,0.08669444508147052,0.08406093977471062,0.09384918958744656,0.08390375810210444,0.08103893198525286,0.09035824585934837,0.08422602181233907,0.0810713362549355,0.09223203053785067,0.08527266765729623,0.08305264420803606,0.09010953034143314,0.08468515045632696 +TNR,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 30, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 2, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.960,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.8870967741935484,1.0,0.0,0.8603696098562629,1.0,0.0,0.9022556390977443,1.0,0.0,0.8610687022900764,1.0,0.0,0.8766355140186916,1.0,0.0,0.8678756476683938,1.0,0.0,0.8729641693811075 +TNR,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 50, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.565,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.8663594470046083,1.0,0.0,0.8583162217659137,1.0,0.0,0.8796992481203008,1.0,0.0,0.8549618320610687,1.0,0.0,0.8598130841121495,1.0,0.0,0.8652849740932642,1.0,0.0,0.8621064060803475 +TPR,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 30, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 2, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:06:10.960,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.0],0.0,0.3726937269372694,1.0,0.0,0.42857142857142855,1.0,0.0,0.4090909090909091,1.0,0.0,0.4,1.0,0.0,0.41368078175895767,1.0,0.0,0.3897058823529412,1.0,0.0,0.40241796200345425 +TPR,101,RandomForestClassifier,"{'bootstrap': True, 'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': 50, 'max_features': 'sqrt', 'max_leaf_nodes': None, 'max_samples': None, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'min_samples_split': 10, 'min_weight_fraction_leaf': 0.0, 'n_estimators': 100, 'n_jobs': None, 'oob_score': False, 'random_state': 101, 'verbose': 0, 'warm_start': False}",Run_1,Folktables_CA_2018_Public_Coverage,200,0,OK,2023-08-01 23:13:20.565,c42fae24-694f-408e-98df-ce099940a961,Exp_iter_1,100,100,[0.6],0.6,0.42435424354243545,1.0,0.0,0.474025974025974,1.0,0.0,0.474025974025974,1.0,0.0,0.4423529411764706,1.0,0.0,0.46905537459283386,1.0,0.0,0.43014705882352944,1.0,0.0,0.45077720207253885 From 612b0253abeef54e4e90b972fd0c4e0e2604af50 Mon Sep 17 00:00:00 2001 From: denysgerasymuk799 Date: Sun, 10 Dec 2023 18:38:25 +0200 Subject: [PATCH 29/36] Save current version of tolerance --- ...iple_Models_Interface_Vis_Law_School.ipynb | 78 ++++++++++++------- .../metrics_interactive_visualizer.py | 12 +-- virny/utils/data_viz_utils.py | 52 +++++++++---- 3 files changed, 96 insertions(+), 46 deletions(-) diff --git a/docs/examples/Multiple_Models_Interface_Vis_Law_School.ipynb b/docs/examples/Multiple_Models_Interface_Vis_Law_School.ipynb index e9af1c88..034d205e 100644 --- a/docs/examples/Multiple_Models_Interface_Vis_Law_School.ipynb +++ b/docs/examples/Multiple_Models_Interface_Vis_Law_School.ipynb @@ -6,8 +6,8 @@ "id": "248cbed8", "metadata": { "ExecuteTime": { - "end_time": "2023-12-06T15:49:13.844713Z", - "start_time": "2023-12-06T15:49:13.202938Z" + "end_time": "2023-12-10T13:46:04.887856Z", + "start_time": "2023-12-10T13:46:04.026304Z" } }, "outputs": [], @@ -23,8 +23,8 @@ "id": "7ec6cd08", "metadata": { "ExecuteTime": { - "end_time": "2023-12-06T15:49:13.852965Z", - "start_time": "2023-12-06T15:49:13.844443Z" + "end_time": "2023-12-10T13:46:04.897038Z", + "start_time": "2023-12-10T13:46:04.888481Z" } }, "outputs": [], @@ -41,8 +41,8 @@ "id": "b8cb69f2", "metadata": { "ExecuteTime": { - "end_time": "2023-12-06T15:49:13.862149Z", - "start_time": "2023-12-06T15:49:13.853366Z" + "end_time": "2023-12-10T13:46:04.906348Z", + "start_time": "2023-12-10T13:46:04.897731Z" } }, "outputs": [ @@ -76,8 +76,8 @@ "id": "7a9241de", "metadata": { "ExecuteTime": { - "end_time": "2023-12-06T15:49:16.237279Z", - "start_time": "2023-12-06T15:49:13.862719Z" + "end_time": "2023-12-10T13:46:09.457388Z", + "start_time": "2023-12-10T13:46:04.907162Z" } }, "outputs": [], @@ -101,8 +101,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-12-06T15:49:16.300788Z", - "start_time": "2023-12-06T15:49:16.238957Z" + "end_time": "2023-12-10T13:46:09.518413Z", + "start_time": "2023-12-10T13:46:09.456301Z" } }, "id": "d3c53c7b72ecbcd0" @@ -120,8 +120,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-12-06T15:49:16.328190Z", - "start_time": "2023-12-06T15:49:16.301062Z" + "end_time": "2023-12-10T13:46:09.544781Z", + "start_time": "2023-12-10T13:46:09.518981Z" } }, "id": "2aab7c79ecdee914" @@ -153,8 +153,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-12-06T15:49:16.379226Z", - "start_time": "2023-12-06T15:49:16.327124Z" + "end_time": "2023-12-10T13:46:09.592998Z", + "start_time": "2023-12-10T13:46:09.545292Z" } }, "id": "833484748ed512e8" @@ -178,8 +178,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-12-06T15:49:16.400186Z", - "start_time": "2023-12-06T15:49:16.376928Z" + "end_time": "2023-12-10T13:46:09.615874Z", + "start_time": "2023-12-10T13:46:09.592514Z" } }, "id": "15ed7d1ba1f22317" @@ -194,12 +194,12 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 48, "id": "435b9d98", "metadata": { "ExecuteTime": { - "end_time": "2023-12-06T15:49:16.482456Z", - "start_time": "2023-12-06T15:49:16.398934Z" + "end_time": "2023-12-10T16:04:29.715738Z", + "start_time": "2023-12-10T16:04:29.547860Z" } }, "outputs": [], @@ -211,7 +211,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "outputs": [ { "name": "stdout", @@ -219,9 +219,33 @@ "text": [ "Running on local URL: http://127.0.0.1:7860\n", "\n", + "Thanks for being a Gradio user! If you have questions or feedback, please join our Discord server and chat with us: https://discord.gg/feTf9x3ZSB\n", + "\n", "To create a public link, set `share=True` in `launch()`.\n", - "Keyboard interruption in main thread... closing server.\n" + "{1: [0.001, 0.0075], 2: [0.0075, 0.013999999999999999], 3: [0.013999999999999999, 0.020499999999999997], 4: [0.020499999999999997, 0.027]}\n", + "{1: [0.259, 0.3015], 2: [0.3015, 0.344], 3: [0.344, 0.38649999999999995], 4: [0.38649999999999995, 0.429]}\n", + "{1: [0.147, 0.1885], 2: [0.1885, 0.23], 3: [0.23, 0.2715], 4: [0.2715, 0.313]}\n", + "{1: [0.0, 0.0035], 2: [0.0035, 0.007]}\n", + "{1: [0.077, 0.08524999999999999], 2: [0.08524999999999999, 0.0935], 3: [0.0935, 0.10175000000000001], 4: [0.10175000000000001, 0.11]}\n", + "{1: [0.075, 0.081], 2: [0.081, 0.08700000000000001], 3: [0.08700000000000001, 0.09300000000000001], 4: [0.09300000000000001, 0.099]}\n", + "{1: [0.008, 0.0125], 2: [0.0125, 0.017]}\n", + "{1: [0.296, 0.30474999999999997], 2: [0.30474999999999997, 0.3135], 3: [0.3135, 0.32225000000000004], 4: [0.32225000000000004, 0.331]}\n", + "{1: [0.268, 0.27425], 2: [0.27425, 0.28049999999999997], 3: [0.28049999999999997, 0.28674999999999995], 4: [0.28674999999999995, 0.293]}\n", + "{1: [0.0009999999999998899, 0.0040000000000000036]}\n", + "{1: [0.041000000000000036, 0.05275000000000002], 2: [0.05275000000000002, 0.0645], 3: [0.0645, 0.07624999999999998], 4: [0.07624999999999998, 0.08799999999999997]}\n", + "{1: [0.031000000000000028, 0.04300000000000001], 2: [0.04300000000000001, 0.05499999999999999], 3: [0.05499999999999999, 0.06699999999999998], 4: [0.06699999999999998, 0.07899999999999996]}\n", + "{1: [0.0, 0.001]}\n", + "{1: [0.011, 0.015], 2: [0.015, 0.019], 3: [0.019, 0.023]}\n", + "{1: [0.01, 0.014499999999999999], 2: [0.014499999999999999, 0.019]}\n" ] + }, + { + "data": { + "text/plain": " LGBMClassifier__alpha=0.0 \\\nEqualized_Odds_FPR_male 2.0 \nEqualized_Odds_FPR_race 3.0 \nEqualized_Odds_FPR_male&race 2.0 \nEqualized_Odds_TPR_male 2.0 \nEqualized_Odds_TPR_race 4.0 \nEqualized_Odds_TPR_male&race 4.0 \nOverall_Uncertainty_Parity_male 2.0 \nOverall_Uncertainty_Parity_race 3.0 \nOverall_Uncertainty_Parity_male&race 3.0 \nLabel_Stability_Ratio_male 1.0 \nLabel_Stability_Ratio_race 2.0 \nLabel_Stability_Ratio_male&race 3.0 \nStd_Parity_male 1.0 \nStd_Parity_race 2.0 \nStd_Parity_male&race 2.0 \n\n LGBMClassifier__alpha=0.6 \\\nEqualized_Odds_FPR_male 2.0 \nEqualized_Odds_FPR_race 1.0 \nEqualized_Odds_FPR_male&race 1.0 \nEqualized_Odds_TPR_male 2.0 \nEqualized_Odds_TPR_race 2.0 \nEqualized_Odds_TPR_male&race 3.0 \nOverall_Uncertainty_Parity_male 2.0 \nOverall_Uncertainty_Parity_race 2.0 \nOverall_Uncertainty_Parity_male&race 2.0 \nLabel_Stability_Ratio_male 1.0 \nLabel_Stability_Ratio_race 2.0 \nLabel_Stability_Ratio_male&race 2.0 \nStd_Parity_male 1.0 \nStd_Parity_race 2.0 \nStd_Parity_male&race 2.0 \n\n LogisticRegression__alpha=0.0 \\\nEqualized_Odds_FPR_male 1.0 \nEqualized_Odds_FPR_race 2.0 \nEqualized_Odds_FPR_male&race 2.0 \nEqualized_Odds_TPR_male 1.0 \nEqualized_Odds_TPR_race 3.0 \nEqualized_Odds_TPR_male&race 1.0 \nOverall_Uncertainty_Parity_male 1.0 \nOverall_Uncertainty_Parity_race 3.0 \nOverall_Uncertainty_Parity_male&race 3.0 \nLabel_Stability_Ratio_male 1.0 \nLabel_Stability_Ratio_race 1.0 \nLabel_Stability_Ratio_male&race 1.0 \nStd_Parity_male 1.0 \nStd_Parity_race 1.0 \nStd_Parity_male&race 1.0 \n\n LogisticRegression__alpha=0.6 \nEqualized_Odds_FPR_male 1.0 \nEqualized_Odds_FPR_race 1.0 \nEqualized_Odds_FPR_male&race 1.0 \nEqualized_Odds_TPR_male 2.0 \nEqualized_Odds_TPR_race 1.0 \nEqualized_Odds_TPR_male&race 2.0 \nOverall_Uncertainty_Parity_male 1.0 \nOverall_Uncertainty_Parity_race 1.0 \nOverall_Uncertainty_Parity_male&race 1.0 \nLabel_Stability_Ratio_male 1.0 \nLabel_Stability_Ratio_race 1.0 \nLabel_Stability_Ratio_male&race 1.0 \nStd_Parity_male 1.0 \nStd_Parity_race 1.0 \nStd_Parity_male&race 1.0 ", + "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
LGBMClassifier__alpha=0.0LGBMClassifier__alpha=0.6LogisticRegression__alpha=0.0LogisticRegression__alpha=0.6
Equalized_Odds_FPR_male2.02.01.01.0
Equalized_Odds_FPR_race3.01.02.01.0
Equalized_Odds_FPR_male&race2.01.02.01.0
Equalized_Odds_TPR_male2.02.01.02.0
Equalized_Odds_TPR_race4.02.03.01.0
Equalized_Odds_TPR_male&race4.03.01.02.0
Overall_Uncertainty_Parity_male2.02.01.01.0
Overall_Uncertainty_Parity_race3.02.03.01.0
Overall_Uncertainty_Parity_male&race3.02.03.01.0
Label_Stability_Ratio_male1.01.01.01.0
Label_Stability_Ratio_race2.02.01.01.0
Label_Stability_Ratio_male&race3.02.01.01.0
Std_Parity_male1.01.01.01.0
Std_Parity_race2.02.01.01.0
Std_Parity_male&race2.02.01.01.0
\n
" + }, + "metadata": {}, + "output_type": "display_data" } ], "source": [ @@ -229,9 +253,9 @@ ], "metadata": { "collapsed": false, + "is_executing": true, "ExecuteTime": { - "end_time": "2023-12-06T23:49:32.410119Z", - "start_time": "2023-12-06T15:49:16.428590Z" + "start_time": "2023-12-10T16:04:29.716786Z" } }, "id": "678a9dc8d51243f4" @@ -254,8 +278,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-12-06T23:49:32.447145Z", - "start_time": "2023-12-06T23:49:32.406866Z" + "end_time": "2023-12-10T14:45:32.225285Z", + "start_time": "2023-12-10T14:45:32.184623Z" } }, "id": "277b6d1de837dab7" @@ -266,8 +290,8 @@ "id": "2326c129", "metadata": { "ExecuteTime": { - "end_time": "2023-12-06T23:49:32.450211Z", - "start_time": "2023-12-06T23:49:32.446290Z" + "end_time": "2023-12-10T14:45:32.227687Z", + "start_time": "2023-12-10T14:45:32.224834Z" } }, "outputs": [], diff --git a/virny/custom_classes/metrics_interactive_visualizer.py b/virny/custom_classes/metrics_interactive_visualizer.py index 4fc38399..ebc91aa2 100644 --- a/virny/custom_classes/metrics_interactive_visualizer.py +++ b/virny/custom_classes/metrics_interactive_visualizer.py @@ -215,7 +215,7 @@ def start_web_app(self): ) subgroup_stability_metrics = gr.Dropdown( sorted(self.all_stability_metrics), - value=['Jitter', 'Label_Stability'], multiselect=True, label="Stability Metrics", info="Select stability metrics to display on the heatmap:", + value=['Std', 'Label_Stability'], multiselect=True, label="Stability Metrics", info="Select stability metrics to display on the heatmap:", ) subgroup_btn_view2 = gr.Button("Submit") with gr.Column(scale=2): @@ -288,7 +288,7 @@ def start_web_app(self): ) subgroup_stability_metrics = gr.Dropdown( sorted(self.all_stability_metrics), - value=['Jitter', 'Label_Stability'], multiselect=True, label="Stability Metrics", info="Select stability metrics to display on the heatmap:", + value=['Std', 'Label_Stability'], multiselect=True, label="Stability Metrics", info="Select stability metrics to display on the heatmap:", ) btn_view3 = gr.Button("Submit") with gr.Column(): @@ -579,8 +579,8 @@ def _create_subgroup_model_rank_heatmap(self, model_names: list, subgroup_accura """ tolerance = str_to_float(tolerance, 'Tolerance') - if tolerance < 0.001: - raise ValueError('Tolerance cannot be smaller than 0.001') + if tolerance < 0.001 or tolerance > 0.2: + raise ValueError('Tolerance should be in the [0.001, 0.2] range') metrics_lst = subgroup_accuracy_metrics_lst + subgroup_uncertainty_metrics + subgroup_stability_metrics_lst # Find metric values for each model based on metric, subgroup, and model names. @@ -620,8 +620,8 @@ def _create_group_model_rank_heatmap(self, model_names: list, group_fairness_met """ tolerance = str_to_float(tolerance, 'Tolerance') - if tolerance < 0.001: - raise ValueError('Tolerance cannot be smaller than 0.001') + if tolerance < 0.001 or tolerance > 0.2: + raise ValueError('Tolerance should be in the [0.001, 0.2] range') groups_lst = self.sensitive_attributes_dct.keys() metrics_lst = group_fairness_metrics_lst + group_uncertainty_metrics + group_stability_metrics_lst diff --git a/virny/utils/data_viz_utils.py b/virny/utils/data_viz_utils.py index bbc4b900..28b6d7cd 100644 --- a/virny/utils/data_viz_utils.py +++ b/virny/utils/data_viz_utils.py @@ -1,3 +1,4 @@ +import math import numpy as np import pandas as pd import altair as alt @@ -10,7 +11,7 @@ from IPython.display import display -def rank_with_tolerance(pd_series: pd.Series, tolerance: float = 0.01, method: str = 'dense'): +def rank_with_tolerance(pd_series: pd.Series, tolerance: float = 0.001): """ Rank a pandas series with defined tolerance. Ref: https://stackoverflow.com/questions/72956450/pandas-ranking-with-tolerance @@ -21,20 +22,41 @@ def rank_with_tolerance(pd_series: pd.Series, tolerance: float = 0.01, method: s A pandas series to rank tolerance A float value for ranking - method - Ranking methods for numpy.rank() Returns ------- A pandas series with dense ranks for the input pd series. """ - tolerance += 1e-10 # Add 0.0000000001 for correct comparison of float numbers - vals = pd.Series(pd_series.unique()).sort_values() - vals.index = vals - vals = vals.mask(vals - vals.shift(1) < tolerance, vals.shift(1)) - - return pd_series.map(vals).fillna(pd_series).rank(method=method) + min_val, max_val = pd_series.min(), pd_series.max() + num_ranks = len(pd_series) + num_bins = math.ceil((max_val - min_val) / tolerance) + # The number of ranks cannot be smaller than 1 and greater than the number of compared models + if num_bins == 0: + num_bins = 1 + elif num_bins > num_ranks: + num_bins = num_ranks + + # Create a dictionary with bin constraints + bin_size = (max_val - min_val) / num_bins + bin_constraints_dct = dict() + min_bin_limit = min_val + for n_bin in range(num_bins): + rank = n_bin + 1 + max_bin_limit = min_bin_limit + bin_size if n_bin + 1 < num_bins else max_val + bin_constraints_dct[rank] = [min_bin_limit, max_bin_limit] + min_bin_limit = max_bin_limit + + print(bin_constraints_dct) + + def get_rank_with_tolerance(val): + for n_bin in range(num_bins): + rank = n_bin + 1 + min_constrain, max_constraint = bin_constraints_dct[rank] + if min_constrain <= val <= max_constraint: + return rank + + return pd_series.apply(get_rank_with_tolerance).rank(method='dense') def compute_proportions(protected_groups, X_data): @@ -68,7 +90,7 @@ def create_sorted_matrix_by_rank(model_metrics_matrix, tolerance) -> np.array: models_distances_matrix = models_distances_matrix.T models_distances_df = pd.DataFrame(models_distances_matrix) sorted_matrix_by_rank = models_distances_df.apply( - lambda row : rank_with_tolerance(row, tolerance, method='dense'), axis = 1 + lambda row : rank_with_tolerance(row, tolerance), axis = 1 ) return sorted_matrix_by_rank @@ -86,7 +108,7 @@ def create_subgroup_sorted_matrix_by_rank(model_metrics_matrix, tolerance) -> np models_distances_matrix = models_distances_matrix.T models_distances_df = pd.DataFrame(models_distances_matrix) sorted_matrix_by_rank = models_distances_df.apply( - lambda row : rank_with_tolerance(row, tolerance, method='dense'), axis = 1 + lambda row : rank_with_tolerance(row, tolerance), axis = 1 ) return sorted_matrix_by_rank @@ -244,8 +266,12 @@ def create_model_rank_heatmap_visualization(model_metrics_matrix, sorted_matrix_ num_ranks = int(sorted_matrix_by_rank.values.max()) fig = plt.figure(figsize=(matrix_width, matrix_height)) - rank_colors = sns.diverging_palette(13, 145, s=75, l=70, n=num_ranks).as_hex() - # Convert ranks to minus ranks (1 --> -1; 4 --> -4) to align rank positions with a coolwarm color scheme + # Set a green color when there is only one rank + if num_ranks == 1: + rank_colors = sns.diverging_palette(145, 13, s=75, l=70, n=num_ranks).as_hex() + else: + rank_colors = sns.diverging_palette(13, 145, s=75, l=70, n=num_ranks).as_hex() + # Convert ranks to minus ranks (1 --> -1; 4 --> -4) to align rank positions with a color scheme reversed_sorted_matrix_by_rank = sorted_matrix_by_rank * -1 ax = sns.heatmap(reversed_sorted_matrix_by_rank, annot=model_metrics_matrix.round(3), cmap=rank_colors, fmt='', annot_kws={'color': 'black', 'alpha': 0.7, 'fontsize': 16 + font_increase}) From 8259f793b34f5deeb8eb5d36f8a64cbd7a41c664 Mon Sep 17 00:00:00 2001 From: denysgerasymuk799 Date: Sun, 10 Dec 2023 18:59:52 +0200 Subject: [PATCH 30/36] Added dynamic tolerance --- ...iple_Models_Interface_Vis_Law_School.ipynb | 48 ++++++++----------- virny/utils/data_viz_utils.py | 45 ++++++++--------- 2 files changed, 42 insertions(+), 51 deletions(-) diff --git a/docs/examples/Multiple_Models_Interface_Vis_Law_School.ipynb b/docs/examples/Multiple_Models_Interface_Vis_Law_School.ipynb index 034d205e..b629e5c5 100644 --- a/docs/examples/Multiple_Models_Interface_Vis_Law_School.ipynb +++ b/docs/examples/Multiple_Models_Interface_Vis_Law_School.ipynb @@ -194,12 +194,12 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 50, "id": "435b9d98", "metadata": { "ExecuteTime": { - "end_time": "2023-12-10T16:04:29.715738Z", - "start_time": "2023-12-10T16:04:29.547860Z" + "end_time": "2023-12-10T16:57:44.803014Z", + "start_time": "2023-12-10T16:57:44.583738Z" } }, "outputs": [], @@ -219,33 +219,23 @@ "text": [ "Running on local URL: http://127.0.0.1:7860\n", "\n", - "Thanks for being a Gradio user! If you have questions or feedback, please join our Discord server and chat with us: https://discord.gg/feTf9x3ZSB\n", - "\n", "To create a public link, set `share=True` in `launch()`.\n", - "{1: [0.001, 0.0075], 2: [0.0075, 0.013999999999999999], 3: [0.013999999999999999, 0.020499999999999997], 4: [0.020499999999999997, 0.027]}\n", - "{1: [0.259, 0.3015], 2: [0.3015, 0.344], 3: [0.344, 0.38649999999999995], 4: [0.38649999999999995, 0.429]}\n", - "{1: [0.147, 0.1885], 2: [0.1885, 0.23], 3: [0.23, 0.2715], 4: [0.2715, 0.313]}\n", - "{1: [0.0, 0.0035], 2: [0.0035, 0.007]}\n", - "{1: [0.077, 0.08524999999999999], 2: [0.08524999999999999, 0.0935], 3: [0.0935, 0.10175000000000001], 4: [0.10175000000000001, 0.11]}\n", - "{1: [0.075, 0.081], 2: [0.081, 0.08700000000000001], 3: [0.08700000000000001, 0.09300000000000001], 4: [0.09300000000000001, 0.099]}\n", - "{1: [0.008, 0.0125], 2: [0.0125, 0.017]}\n", - "{1: [0.296, 0.30474999999999997], 2: [0.30474999999999997, 0.3135], 3: [0.3135, 0.32225000000000004], 4: [0.32225000000000004, 0.331]}\n", - "{1: [0.268, 0.27425], 2: [0.27425, 0.28049999999999997], 3: [0.28049999999999997, 0.28674999999999995], 4: [0.28674999999999995, 0.293]}\n", - "{1: [0.0009999999999998899, 0.0040000000000000036]}\n", - "{1: [0.041000000000000036, 0.05275000000000002], 2: [0.05275000000000002, 0.0645], 3: [0.0645, 0.07624999999999998], 4: [0.07624999999999998, 0.08799999999999997]}\n", - "{1: [0.031000000000000028, 0.04300000000000001], 2: [0.04300000000000001, 0.05499999999999999], 3: [0.05499999999999999, 0.06699999999999998], 4: [0.06699999999999998, 0.07899999999999996]}\n", - "{1: [0.0, 0.001]}\n", - "{1: [0.011, 0.015], 2: [0.015, 0.019], 3: [0.019, 0.023]}\n", - "{1: [0.01, 0.014499999999999999], 2: [0.014499999999999999, 0.019]}\n" + "{'0.001': 1, '0.002': 1, '0.025': 3, '0.027': 3}\n", + "{'0.259': 1, '0.289': 2, '0.377': 3, '0.429': 4}\n", + "{'0.147': 1, '0.157': 2, '0.274': 3, '0.313': 4}\n", + "{'0.0': 1, '0.005': 1, '0.007': 4}\n", + "{'0.077': 1, '0.089': 2, '0.099': 3, '0.11': 4}\n", + "{'0.075': 1, '0.085': 2, '0.092': 3, '0.099': 4}\n", + "{'0.008': 1, '0.011': 1, '0.015': 3, '0.017': 3}\n", + "{'0.296': 1, '0.322': 2, '0.323': 2, '0.331': 4}\n", + "{'0.268': 1, '0.279': 2, '0.287': 3, '0.293': 4}\n", + "{'0.001': 1, '0.002': 1, '0.004': 1}\n", + "{'0.041': 1, '0.045': 1, '0.078': 3, '0.088': 4}\n", + "{'0.031': 1, '0.033': 1, '0.055': 3, '0.079': 4}\n", + "{'0.0': 1, '0.001': 1}\n", + "{'0.011': 1, '0.013': 1, '0.022': 3, '0.023': 3}\n", + "{'0.01': 1, '0.011': 1, '0.019': 3}\n" ] - }, - { - "data": { - "text/plain": " LGBMClassifier__alpha=0.0 \\\nEqualized_Odds_FPR_male 2.0 \nEqualized_Odds_FPR_race 3.0 \nEqualized_Odds_FPR_male&race 2.0 \nEqualized_Odds_TPR_male 2.0 \nEqualized_Odds_TPR_race 4.0 \nEqualized_Odds_TPR_male&race 4.0 \nOverall_Uncertainty_Parity_male 2.0 \nOverall_Uncertainty_Parity_race 3.0 \nOverall_Uncertainty_Parity_male&race 3.0 \nLabel_Stability_Ratio_male 1.0 \nLabel_Stability_Ratio_race 2.0 \nLabel_Stability_Ratio_male&race 3.0 \nStd_Parity_male 1.0 \nStd_Parity_race 2.0 \nStd_Parity_male&race 2.0 \n\n LGBMClassifier__alpha=0.6 \\\nEqualized_Odds_FPR_male 2.0 \nEqualized_Odds_FPR_race 1.0 \nEqualized_Odds_FPR_male&race 1.0 \nEqualized_Odds_TPR_male 2.0 \nEqualized_Odds_TPR_race 2.0 \nEqualized_Odds_TPR_male&race 3.0 \nOverall_Uncertainty_Parity_male 2.0 \nOverall_Uncertainty_Parity_race 2.0 \nOverall_Uncertainty_Parity_male&race 2.0 \nLabel_Stability_Ratio_male 1.0 \nLabel_Stability_Ratio_race 2.0 \nLabel_Stability_Ratio_male&race 2.0 \nStd_Parity_male 1.0 \nStd_Parity_race 2.0 \nStd_Parity_male&race 2.0 \n\n LogisticRegression__alpha=0.0 \\\nEqualized_Odds_FPR_male 1.0 \nEqualized_Odds_FPR_race 2.0 \nEqualized_Odds_FPR_male&race 2.0 \nEqualized_Odds_TPR_male 1.0 \nEqualized_Odds_TPR_race 3.0 \nEqualized_Odds_TPR_male&race 1.0 \nOverall_Uncertainty_Parity_male 1.0 \nOverall_Uncertainty_Parity_race 3.0 \nOverall_Uncertainty_Parity_male&race 3.0 \nLabel_Stability_Ratio_male 1.0 \nLabel_Stability_Ratio_race 1.0 \nLabel_Stability_Ratio_male&race 1.0 \nStd_Parity_male 1.0 \nStd_Parity_race 1.0 \nStd_Parity_male&race 1.0 \n\n LogisticRegression__alpha=0.6 \nEqualized_Odds_FPR_male 1.0 \nEqualized_Odds_FPR_race 1.0 \nEqualized_Odds_FPR_male&race 1.0 \nEqualized_Odds_TPR_male 2.0 \nEqualized_Odds_TPR_race 1.0 \nEqualized_Odds_TPR_male&race 2.0 \nOverall_Uncertainty_Parity_male 1.0 \nOverall_Uncertainty_Parity_race 1.0 \nOverall_Uncertainty_Parity_male&race 1.0 \nLabel_Stability_Ratio_male 1.0 \nLabel_Stability_Ratio_race 1.0 \nLabel_Stability_Ratio_male&race 1.0 \nStd_Parity_male 1.0 \nStd_Parity_race 1.0 \nStd_Parity_male&race 1.0 ", - "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
LGBMClassifier__alpha=0.0LGBMClassifier__alpha=0.6LogisticRegression__alpha=0.0LogisticRegression__alpha=0.6
Equalized_Odds_FPR_male2.02.01.01.0
Equalized_Odds_FPR_race3.01.02.01.0
Equalized_Odds_FPR_male&race2.01.02.01.0
Equalized_Odds_TPR_male2.02.01.02.0
Equalized_Odds_TPR_race4.02.03.01.0
Equalized_Odds_TPR_male&race4.03.01.02.0
Overall_Uncertainty_Parity_male2.02.01.01.0
Overall_Uncertainty_Parity_race3.02.03.01.0
Overall_Uncertainty_Parity_male&race3.02.03.01.0
Label_Stability_Ratio_male1.01.01.01.0
Label_Stability_Ratio_race2.02.01.01.0
Label_Stability_Ratio_male&race3.02.01.01.0
Std_Parity_male1.01.01.01.0
Std_Parity_race2.02.01.01.0
Std_Parity_male&race2.02.01.01.0
\n
" - }, - "metadata": {}, - "output_type": "display_data" } ], "source": [ @@ -255,7 +245,7 @@ "collapsed": false, "is_executing": true, "ExecuteTime": { - "start_time": "2023-12-10T16:04:29.716786Z" + "start_time": "2023-12-10T16:57:44.803707Z" } }, "id": "678a9dc8d51243f4" diff --git a/virny/utils/data_viz_utils.py b/virny/utils/data_viz_utils.py index 28b6d7cd..41307f44 100644 --- a/virny/utils/data_viz_utils.py +++ b/virny/utils/data_viz_utils.py @@ -28,33 +28,34 @@ def rank_with_tolerance(pd_series: pd.Series, tolerance: float = 0.001): A pandas series with dense ranks for the input pd series. """ - min_val, max_val = pd_series.min(), pd_series.max() - num_ranks = len(pd_series) - num_bins = math.ceil((max_val - min_val) / tolerance) - # The number of ranks cannot be smaller than 1 and greater than the number of compared models - if num_bins == 0: - num_bins = 1 - elif num_bins > num_ranks: - num_bins = num_ranks + sorted_vals = sorted(pd_series.tolist()) # Create a dictionary with bin constraints - bin_size = (max_val - min_val) / num_bins bin_constraints_dct = dict() - min_bin_limit = min_val - for n_bin in range(num_bins): - rank = n_bin + 1 - max_bin_limit = min_bin_limit + bin_size if n_bin + 1 < num_bins else max_val - bin_constraints_dct[rank] = [min_bin_limit, max_bin_limit] - min_bin_limit = max_bin_limit - - print(bin_constraints_dct) + for i in range(len(sorted_vals)): + val = sorted_vals[i] + rank = i + 1 + bin_constraints_dct[rank] = [val - tolerance, val + tolerance] + + # Assign ranks for each pandas series value + assigned_ranks_dct = dict() + for i in range(len(sorted_vals)): + val = sorted_vals[i] + max_rank = i + 1 + actual_rank = None + for rank in bin_constraints_dct.keys(): + min_limit, max_limit = bin_constraints_dct[rank] + if min_limit <= val <= max_limit: + actual_rank = rank + break + + assigned_ranks_dct[str(round(val, 3))] = actual_rank + # Dynamically delete constraints from bin_constraints_dct to keep values in the same bin with tolerance + if actual_rank != max_rank: + del bin_constraints_dct[max_rank] def get_rank_with_tolerance(val): - for n_bin in range(num_bins): - rank = n_bin + 1 - min_constrain, max_constraint = bin_constraints_dct[rank] - if min_constrain <= val <= max_constraint: - return rank + return assigned_ranks_dct[str(round(val, 3))] return pd_series.apply(get_rank_with_tolerance).rank(method='dense') From 87318fd3a45cd5d2c08551178ec6bad719d7a361 Mon Sep 17 00:00:00 2001 From: denysgerasymuk799 Date: Sun, 10 Dec 2023 19:24:50 +0200 Subject: [PATCH 31/36] Added tests for tolerance --- ...iple_Models_Interface_Vis_Law_School.ipynb | 89 +++++++++++++++---- tests/utils/test_data_viz_utils.py | 43 +++++++++ virny/utils/data_viz_utils.py | 4 +- 3 files changed, 116 insertions(+), 20 deletions(-) create mode 100644 tests/utils/test_data_viz_utils.py diff --git a/docs/examples/Multiple_Models_Interface_Vis_Law_School.ipynb b/docs/examples/Multiple_Models_Interface_Vis_Law_School.ipynb index b629e5c5..0533721d 100644 --- a/docs/examples/Multiple_Models_Interface_Vis_Law_School.ipynb +++ b/docs/examples/Multiple_Models_Interface_Vis_Law_School.ipynb @@ -194,12 +194,12 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 56, "id": "435b9d98", "metadata": { "ExecuteTime": { - "end_time": "2023-12-10T16:57:44.803014Z", - "start_time": "2023-12-10T16:57:44.583738Z" + "end_time": "2023-12-10T17:18:16.810646Z", + "start_time": "2023-12-10T17:18:16.756447Z" } }, "outputs": [], @@ -220,21 +220,72 @@ "Running on local URL: http://127.0.0.1:7860\n", "\n", "To create a public link, set `share=True` in `launch()`.\n", - "{'0.001': 1, '0.002': 1, '0.025': 3, '0.027': 3}\n", - "{'0.259': 1, '0.289': 2, '0.377': 3, '0.429': 4}\n", - "{'0.147': 1, '0.157': 2, '0.274': 3, '0.313': 4}\n", - "{'0.0': 1, '0.005': 1, '0.007': 4}\n", - "{'0.077': 1, '0.089': 2, '0.099': 3, '0.11': 4}\n", - "{'0.075': 1, '0.085': 2, '0.092': 3, '0.099': 4}\n", - "{'0.008': 1, '0.011': 1, '0.015': 3, '0.017': 3}\n", - "{'0.296': 1, '0.322': 2, '0.323': 2, '0.331': 4}\n", - "{'0.268': 1, '0.279': 2, '0.287': 3, '0.293': 4}\n", - "{'0.001': 1, '0.002': 1, '0.004': 1}\n", - "{'0.041': 1, '0.045': 1, '0.078': 3, '0.088': 4}\n", - "{'0.031': 1, '0.033': 1, '0.055': 3, '0.079': 4}\n", - "{'0.0': 1, '0.001': 1}\n", - "{'0.011': 1, '0.013': 1, '0.022': 3, '0.023': 3}\n", - "{'0.01': 1, '0.011': 1, '0.019': 3}\n" + "{1: [-0.009, 0.011], 2: [-0.008, 0.012], 3: [0.015, 0.035], 4: [0.017, 0.037]}\n", + "{1: [0.249, 0.269], 2: [0.279, 0.299], 3: [0.367, 0.387], 4: [0.419, 0.439]}\n", + "{1: [0.137, 0.157], 2: [0.147, 0.167], 3: [0.264, 0.284], 4: [0.303, 0.323]}\n", + "{1: [-0.01, 0.01], 2: [-0.005, 0.015], 3: [-0.005, 0.015], 4: [-0.003, 0.017]}\n", + "{1: [0.067, 0.087], 2: [0.079, 0.099], 3: [0.089, 0.109], 4: [0.1, 0.12]}\n", + "{1: [0.065, 0.085], 2: [0.075, 0.095], 3: [0.082, 0.102], 4: [0.089, 0.109]}\n", + "{1: [-0.002, 0.018], 2: [0.001, 0.021], 3: [0.005, 0.025], 4: [0.007, 0.027]}\n", + "{1: [0.286, 0.306], 2: [0.312, 0.332], 3: [0.313, 0.333], 4: [0.321, 0.341]}\n", + "{1: [0.258, 0.278], 2: [0.269, 0.289], 3: [0.277, 0.297], 4: [0.283, 0.303]}\n", + "{1: [-0.009, 0.011], 2: [-0.009, 0.011], 3: [-0.008, 0.012], 4: [-0.006, 0.014]}\n", + "{1: [0.031, 0.051], 2: [0.035, 0.055], 3: [0.068, 0.088], 4: [0.078, 0.098]}\n", + "{1: [0.021, 0.041], 2: [0.023, 0.043], 3: [0.045, 0.065], 4: [0.069, 0.089]}\n", + "{1: [-0.01, 0.01], 2: [-0.01, 0.01], 3: [-0.009, 0.011], 4: [-0.009, 0.011]}\n", + "{1: [0.001, 0.021], 2: [0.003, 0.023], 3: [0.012, 0.032], 4: [0.013, 0.033]}\n", + "{1: [0.0, 0.02], 2: [0.001, 0.021], 3: [0.009, 0.029], 4: [0.009, 0.029]}\n", + "{1: [0.086, 0.106], 2: [0.087, 0.107], 3: [0.09, 0.11], 4: [0.09, 0.11]}\n", + "{1: [0.042, 0.062], 2: [0.043, 0.063], 3: [0.045, 0.065], 4: [0.045, 0.065]}\n", + "{1: [0.323, 0.343], 2: [0.325, 0.345], 3: [0.334, 0.354], 4: [0.334, 0.354]}\n", + "{1: [0.33, 0.35], 2: [0.33, 0.35], 3: [0.335, 0.355], 4: [0.335, 0.355]}\n", + "{1: [-0.001, 0.019], 2: [-0.001, 0.019], 3: [0.013, 0.033], 4: [0.016, 0.036]}\n", + "{1: [0.003, 0.023], 2: [0.005, 0.025], 3: [0.018, 0.038], 4: [0.022, 0.042]}\n", + "{1: [0.091, 0.101], 2: [0.092, 0.102], 3: [0.095, 0.105], 4: [0.095, 0.105]}\n", + "{1: [0.047, 0.057], 2: [0.048, 0.058], 3: [0.05, 0.06], 4: [0.05, 0.06]}\n", + "{1: [0.328, 0.338], 2: [0.33, 0.34], 3: [0.339, 0.349], 4: [0.339, 0.349]}\n", + "{1: [0.335, 0.345], 2: [0.335, 0.345], 3: [0.34, 0.35], 4: [0.34, 0.35]}\n", + "{1: [0.004, 0.014], 2: [0.004, 0.014], 3: [0.018, 0.028], 4: [0.021, 0.031]}\n", + "{1: [0.008, 0.018], 2: [0.01, 0.02], 3: [0.023, 0.033], 4: [0.027, 0.037]}\n", + "{1: [0.092, 0.102], 2: [0.095, 0.105], 3: [0.095, 0.105], 4: [0.105, 0.115]}\n", + "{1: [0.048, 0.058], 2: [0.05, 0.06], 3: [0.05, 0.06], 4: [0.055, 0.065]}\n", + "{1: [0.048, 0.058], 2: [0.33, 0.34], 3: [0.339, 0.349], 4: [0.339, 0.349]}\n", + "{1: [0.315, 0.325], 2: [0.335, 0.345], 3: [0.34, 0.35], 4: [0.34, 0.35]}\n", + "{1: [0.004, 0.014], 2: [0.004, 0.014], 3: [0.018, 0.028], 4: [0.172, 0.182]}\n", + "{1: [0.008, 0.018], 2: [0.01, 0.02], 3: [0.023, 0.033], 4: [0.183, 0.193]}\n", + "{1: [0.087, 0.107], 2: [0.09, 0.11], 3: [0.09, 0.11], 4: [0.1, 0.12]}\n", + "{1: [0.043, 0.063], 2: [0.045, 0.065], 3: [0.045, 0.065], 4: [0.05, 0.07]}\n", + "{1: [0.043, 0.063], 2: [0.325, 0.345], 3: [0.334, 0.354], 4: [0.334, 0.354]}\n", + "{1: [0.31, 0.33], 2: [0.33, 0.35], 3: [0.335, 0.355], 4: [0.335, 0.355]}\n", + "{1: [-0.001, 0.019], 2: [-0.001, 0.019], 3: [0.013, 0.033], 4: [0.167, 0.187]}\n", + "{1: [0.003, 0.023], 2: [0.005, 0.025], 3: [0.018, 0.038], 4: [0.178, 0.198]}\n", + "{1: [0.09, 0.11], 2: [0.1, 0.12]}\n", + "{1: [0.045, 0.065], 2: [0.05, 0.07]}\n", + "{1: [0.043, 0.063], 2: [0.334, 0.354]}\n", + "{1: [0.31, 0.33], 2: [0.335, 0.355]}\n", + "{1: [-0.001, 0.019], 2: [0.167, 0.187]}\n", + "{1: [0.005, 0.025], 2: [0.178, 0.198]}\n", + "{1: [0.091, 0.101], 2: [0.092, 0.102], 3: [0.095, 0.105], 4: [0.095, 0.105]}\n", + "{1: [0.047, 0.057], 2: [0.048, 0.058], 3: [0.05, 0.06], 4: [0.05, 0.06]}\n", + "{1: [0.328, 0.338], 2: [0.33, 0.34], 3: [0.339, 0.349], 4: [0.339, 0.349]}\n", + "{1: [0.335, 0.345], 2: [0.335, 0.345], 3: [0.34, 0.35], 4: [0.34, 0.35]}\n", + "{1: [0.004, 0.014], 2: [0.004, 0.014], 3: [0.018, 0.028], 4: [0.021, 0.031]}\n", + "{1: [0.008, 0.018], 2: [0.01, 0.02], 3: [0.023, 0.033], 4: [0.027, 0.037]}\n", + "{1: [-0.004, 0.006], 2: [-0.003, 0.007], 3: [0.02, 0.03], 4: [0.022, 0.032]}\n", + "{1: [0.254, 0.264], 2: [0.284, 0.294], 3: [0.372, 0.382], 4: [0.424, 0.434]}\n", + "{1: [0.142, 0.152], 2: [0.152, 0.162], 3: [0.269, 0.279], 4: [0.308, 0.318]}\n", + "{1: [-0.005, 0.005], 2: [0.0, 0.01], 3: [0.0, 0.01], 4: [0.002, 0.012]}\n", + "{1: [0.072, 0.082], 2: [0.084, 0.094], 3: [0.094, 0.104], 4: [0.105, 0.115]}\n", + "{1: [0.07, 0.08], 2: [0.08, 0.09], 3: [0.087, 0.097], 4: [0.094, 0.104]}\n", + "{1: [0.003, 0.013], 2: [0.006, 0.016], 3: [0.01, 0.02], 4: [0.012, 0.022]}\n", + "{1: [0.291, 0.301], 2: [0.317, 0.327], 3: [0.318, 0.328], 4: [0.326, 0.336]}\n", + "{1: [0.263, 0.273], 2: [0.274, 0.284], 3: [0.282, 0.292], 4: [0.288, 0.298]}\n", + "{1: [-0.004, 0.006], 2: [-0.004, 0.006], 3: [-0.003, 0.007], 4: [-0.001, 0.009]}\n", + "{1: [0.036, 0.046], 2: [0.04, 0.05], 3: [0.073, 0.083], 4: [0.083, 0.093]}\n", + "{1: [0.026, 0.036], 2: [0.028, 0.038], 3: [0.05, 0.06], 4: [0.074, 0.084]}\n", + "{1: [-0.005, 0.005], 2: [-0.005, 0.005], 3: [-0.004, 0.006], 4: [-0.004, 0.006]}\n", + "{1: [0.006, 0.016], 2: [0.008, 0.018], 3: [0.017, 0.027], 4: [0.018, 0.028]}\n", + "{1: [0.005, 0.015], 2: [0.006, 0.016], 3: [0.014, 0.024], 4: [0.014, 0.024]}\n" ] } ], @@ -245,7 +296,7 @@ "collapsed": false, "is_executing": true, "ExecuteTime": { - "start_time": "2023-12-10T16:57:44.803707Z" + "start_time": "2023-12-10T17:18:16.842929Z" } }, "id": "678a9dc8d51243f4" diff --git a/tests/utils/test_data_viz_utils.py b/tests/utils/test_data_viz_utils.py new file mode 100644 index 00000000..6595c281 --- /dev/null +++ b/tests/utils/test_data_viz_utils.py @@ -0,0 +1,43 @@ +import pandas as pd + +from virny.utils.data_viz_utils import rank_with_tolerance + + +def test_rank_with_tolerance_true1(): + tolerance = 0.005 + pd_series = pd.Series([0.025, 0.027, 0.001, 0.002]) # should be only positive numbers + expected_ranks = [2, 2, 1, 1] + actual_ranks = rank_with_tolerance(pd_series, tolerance) + assert actual_ranks.tolist() == expected_ranks + + +def test_rank_with_tolerance_true2(): + tolerance = 0.005 + pd_series = pd.Series([0.429, 0.289, 0.377, 0.259]) # should be only positive numbers + expected_ranks = [4, 2, 3, 1] + actual_ranks = rank_with_tolerance(pd_series, tolerance) + assert actual_ranks.tolist() == expected_ranks + + +def test_rank_with_tolerance_true3(): + tolerance = 0.005 + pd_series = pd.Series([0.313, 0.157, 0.274, 0.147]) # should be only positive numbers + expected_ranks = [4, 2, 3, 1] + actual_ranks = rank_with_tolerance(pd_series, tolerance) + assert actual_ranks.tolist() == expected_ranks + + +def test_rank_with_tolerance_true4(): + tolerance = 0.005 + pd_series = pd.Series([0.001, 0.001, 0.0, 0.0]) # should be only positive numbers + expected_ranks = [1, 1, 1, 1] + actual_ranks = rank_with_tolerance(pd_series, tolerance) + assert actual_ranks.tolist() == expected_ranks + + +def test_rank_with_tolerance_true5(): + tolerance = 0.01 + pd_series = pd.Series([0.099, 0.092, 0.075, 0.085]) # should be only positive numbers + expected_ranks = [2, 2, 1, 1] + actual_ranks = rank_with_tolerance(pd_series, tolerance) + assert actual_ranks.tolist() == expected_ranks diff --git a/virny/utils/data_viz_utils.py b/virny/utils/data_viz_utils.py index 41307f44..c208adfa 100644 --- a/virny/utils/data_viz_utils.py +++ b/virny/utils/data_viz_utils.py @@ -35,7 +35,9 @@ def rank_with_tolerance(pd_series: pd.Series, tolerance: float = 0.001): for i in range(len(sorted_vals)): val = sorted_vals[i] rank = i + 1 - bin_constraints_dct[rank] = [val - tolerance, val + tolerance] + bin_constraints_dct[rank] = [round(val - tolerance, 3), round(val + tolerance, 3)] + + print(bin_constraints_dct) # Assign ranks for each pandas series value assigned_ranks_dct = dict() From 52ea84346baca512f20328a95316188e0755a609 Mon Sep 17 00:00:00 2001 From: denysgerasymuk799 Date: Sun, 10 Dec 2023 19:25:51 +0200 Subject: [PATCH 32/36] Added tests for tolerance --- virny/utils/data_viz_utils.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/virny/utils/data_viz_utils.py b/virny/utils/data_viz_utils.py index c208adfa..41dba3cc 100644 --- a/virny/utils/data_viz_utils.py +++ b/virny/utils/data_viz_utils.py @@ -37,8 +37,6 @@ def rank_with_tolerance(pd_series: pd.Series, tolerance: float = 0.001): rank = i + 1 bin_constraints_dct[rank] = [round(val - tolerance, 3), round(val + tolerance, 3)] - print(bin_constraints_dct) - # Assign ranks for each pandas series value assigned_ranks_dct = dict() for i in range(len(sorted_vals)): From 1d2cc3cc5dfa4957b4a24c45f8bde3f3c33b99bd Mon Sep 17 00:00:00 2001 From: denysgerasymuk799 Date: Sun, 17 Dec 2023 23:45:17 +0200 Subject: [PATCH 33/36] wip --- ...Multiple_Models_Interface_Vis_Income.ipynb | 60 ++++---- ...iple_Models_Interface_Vis_Law_School.ipynb | 132 ++++-------------- 2 files changed, 56 insertions(+), 136 deletions(-) diff --git a/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb b/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb index aac2e942..ecd29b0e 100644 --- a/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb +++ b/docs/examples/Multiple_Models_Interface_Vis_Income.ipynb @@ -6,8 +6,8 @@ "id": "248cbed8", "metadata": { "ExecuteTime": { - "end_time": "2023-12-03T22:09:30.506501Z", - "start_time": "2023-12-03T22:09:29.758579Z" + "end_time": "2023-12-10T22:37:44.370856Z", + "start_time": "2023-12-10T22:37:43.972175Z" } }, "outputs": [], @@ -23,8 +23,8 @@ "id": "7ec6cd08", "metadata": { "ExecuteTime": { - "end_time": "2023-12-03T22:09:30.515379Z", - "start_time": "2023-12-03T22:09:30.506765Z" + "end_time": "2023-12-10T22:37:44.380242Z", + "start_time": "2023-12-10T22:37:44.371542Z" } }, "outputs": [], @@ -41,8 +41,8 @@ "id": "b8cb69f2", "metadata": { "ExecuteTime": { - "end_time": "2023-12-03T22:09:30.525236Z", - "start_time": "2023-12-03T22:09:30.515761Z" + "end_time": "2023-12-10T22:37:44.391659Z", + "start_time": "2023-12-10T22:37:44.380644Z" } }, "outputs": [ @@ -76,8 +76,8 @@ "id": "7a9241de", "metadata": { "ExecuteTime": { - "end_time": "2023-12-03T22:09:33.037405Z", - "start_time": "2023-12-03T22:09:30.526188Z" + "end_time": "2023-12-10T22:37:45.918385Z", + "start_time": "2023-12-10T22:37:44.390547Z" } }, "outputs": [], @@ -101,8 +101,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-12-03T22:09:34.393655Z", - "start_time": "2023-12-03T22:09:33.038803Z" + "end_time": "2023-12-10T22:37:47.214487Z", + "start_time": "2023-12-10T22:37:45.921391Z" } }, "id": "d3c53c7b72ecbcd0" @@ -120,8 +120,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-12-03T22:09:34.420850Z", - "start_time": "2023-12-03T22:09:34.393834Z" + "end_time": "2023-12-10T22:37:47.242581Z", + "start_time": "2023-12-10T22:37:47.214727Z" } }, "id": "2aab7c79ecdee914" @@ -153,21 +153,21 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-12-03T22:09:34.476159Z", - "start_time": "2023-12-03T22:09:34.421313Z" + "end_time": "2023-12-10T22:37:47.297089Z", + "start_time": "2023-12-10T22:37:47.240439Z" } }, "id": "44ee5eff6054ce04" }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 8, "outputs": [ { "data": { "text/plain": "dict_keys(['LGBMClassifier__alpha=0.7', 'LGBMClassifier__alpha=0.0', 'LGBMClassifier__alpha=0.4', 'LogisticRegression__alpha=0.0', 'LogisticRegression__alpha=0.7', 'LogisticRegression__alpha=0.4', 'MLPClassifier__alpha=0.0', 'MLPClassifier__alpha=0.7', 'MLPClassifier__alpha=0.4', 'RandomForestClassifier__alpha=0.4', 'RandomForestClassifier__alpha=0.7', 'RandomForestClassifier__alpha=0.0'])" }, - "execution_count": 9, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -178,8 +178,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-12-03T22:09:34.566417Z", - "start_time": "2023-12-03T22:09:34.499412Z" + "end_time": "2023-12-10T22:37:47.328697Z", + "start_time": "2023-12-10T22:37:47.295950Z" } }, "id": "15ed7d1ba1f22317" @@ -194,12 +194,12 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 9, "id": "435b9d98", "metadata": { "ExecuteTime": { - "end_time": "2023-12-03T22:09:34.588762Z", - "start_time": "2023-12-03T22:09:34.523515Z" + "end_time": "2023-12-10T22:37:47.374721Z", + "start_time": "2023-12-10T22:37:47.317882Z" } }, "outputs": [], @@ -211,7 +211,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 10, "outputs": [ { "name": "stdout", @@ -230,15 +230,15 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-12-03T23:42:27.309199Z", - "start_time": "2023-12-03T22:09:34.550444Z" + "end_time": "2023-12-11T00:26:17.429094Z", + "start_time": "2023-12-10T22:37:47.343749Z" } }, "id": "678a9dc8d51243f4" }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 11, "outputs": [ { "name": "stdout", @@ -254,22 +254,22 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-12-03T23:42:27.346512Z", - "start_time": "2023-12-03T23:42:27.314034Z" + "end_time": "2023-12-11T00:26:17.482944Z", + "start_time": "2023-12-11T00:26:17.438287Z" } }, "id": "277b6d1de837dab7" }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 11, "outputs": [], "source": [], "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-12-03T23:42:27.349708Z", - "start_time": "2023-12-03T23:42:27.345872Z" + "end_time": "2023-12-11T00:26:17.483195Z", + "start_time": "2023-12-11T00:26:17.479725Z" } }, "id": "21c0ad91536f0af5" diff --git a/docs/examples/Multiple_Models_Interface_Vis_Law_School.ipynb b/docs/examples/Multiple_Models_Interface_Vis_Law_School.ipynb index 0533721d..1826cdfe 100644 --- a/docs/examples/Multiple_Models_Interface_Vis_Law_School.ipynb +++ b/docs/examples/Multiple_Models_Interface_Vis_Law_School.ipynb @@ -6,8 +6,8 @@ "id": "248cbed8", "metadata": { "ExecuteTime": { - "end_time": "2023-12-10T13:46:04.887856Z", - "start_time": "2023-12-10T13:46:04.026304Z" + "end_time": "2023-12-16T22:10:21.409266Z", + "start_time": "2023-12-16T22:10:20.679843Z" } }, "outputs": [], @@ -23,8 +23,8 @@ "id": "7ec6cd08", "metadata": { "ExecuteTime": { - "end_time": "2023-12-10T13:46:04.897038Z", - "start_time": "2023-12-10T13:46:04.888481Z" + "end_time": "2023-12-16T22:10:21.418422Z", + "start_time": "2023-12-16T22:10:21.408919Z" } }, "outputs": [], @@ -41,8 +41,8 @@ "id": "b8cb69f2", "metadata": { "ExecuteTime": { - "end_time": "2023-12-10T13:46:04.906348Z", - "start_time": "2023-12-10T13:46:04.897731Z" + "end_time": "2023-12-16T22:10:21.429731Z", + "start_time": "2023-12-16T22:10:21.418780Z" } }, "outputs": [ @@ -76,8 +76,8 @@ "id": "7a9241de", "metadata": { "ExecuteTime": { - "end_time": "2023-12-10T13:46:09.457388Z", - "start_time": "2023-12-10T13:46:04.907162Z" + "end_time": "2023-12-16T22:10:25.046057Z", + "start_time": "2023-12-16T22:10:21.428148Z" } }, "outputs": [], @@ -101,8 +101,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-12-10T13:46:09.518413Z", - "start_time": "2023-12-10T13:46:09.456301Z" + "end_time": "2023-12-16T22:10:25.116829Z", + "start_time": "2023-12-16T22:10:25.048929Z" } }, "id": "d3c53c7b72ecbcd0" @@ -120,8 +120,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-12-10T13:46:09.544781Z", - "start_time": "2023-12-10T13:46:09.518981Z" + "end_time": "2023-12-16T22:10:25.144265Z", + "start_time": "2023-12-16T22:10:25.117061Z" } }, "id": "2aab7c79ecdee914" @@ -153,8 +153,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-12-10T13:46:09.592998Z", - "start_time": "2023-12-10T13:46:09.545292Z" + "end_time": "2023-12-16T22:10:25.193827Z", + "start_time": "2023-12-16T22:10:25.143225Z" } }, "id": "833484748ed512e8" @@ -178,8 +178,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-12-10T13:46:09.615874Z", - "start_time": "2023-12-10T13:46:09.592514Z" + "end_time": "2023-12-16T22:10:25.218033Z", + "start_time": "2023-12-16T22:10:25.193714Z" } }, "id": "15ed7d1ba1f22317" @@ -194,12 +194,12 @@ }, { "cell_type": "code", - "execution_count": 56, + "execution_count": 9, "id": "435b9d98", "metadata": { "ExecuteTime": { - "end_time": "2023-12-10T17:18:16.810646Z", - "start_time": "2023-12-10T17:18:16.756447Z" + "end_time": "2023-12-16T22:10:25.293585Z", + "start_time": "2023-12-16T22:10:25.217304Z" } }, "outputs": [], @@ -219,73 +219,7 @@ "text": [ "Running on local URL: http://127.0.0.1:7860\n", "\n", - "To create a public link, set `share=True` in `launch()`.\n", - "{1: [-0.009, 0.011], 2: [-0.008, 0.012], 3: [0.015, 0.035], 4: [0.017, 0.037]}\n", - "{1: [0.249, 0.269], 2: [0.279, 0.299], 3: [0.367, 0.387], 4: [0.419, 0.439]}\n", - "{1: [0.137, 0.157], 2: [0.147, 0.167], 3: [0.264, 0.284], 4: [0.303, 0.323]}\n", - "{1: [-0.01, 0.01], 2: [-0.005, 0.015], 3: [-0.005, 0.015], 4: [-0.003, 0.017]}\n", - "{1: [0.067, 0.087], 2: [0.079, 0.099], 3: [0.089, 0.109], 4: [0.1, 0.12]}\n", - "{1: [0.065, 0.085], 2: [0.075, 0.095], 3: [0.082, 0.102], 4: [0.089, 0.109]}\n", - "{1: [-0.002, 0.018], 2: [0.001, 0.021], 3: [0.005, 0.025], 4: [0.007, 0.027]}\n", - "{1: [0.286, 0.306], 2: [0.312, 0.332], 3: [0.313, 0.333], 4: [0.321, 0.341]}\n", - "{1: [0.258, 0.278], 2: [0.269, 0.289], 3: [0.277, 0.297], 4: [0.283, 0.303]}\n", - "{1: [-0.009, 0.011], 2: [-0.009, 0.011], 3: [-0.008, 0.012], 4: [-0.006, 0.014]}\n", - "{1: [0.031, 0.051], 2: [0.035, 0.055], 3: [0.068, 0.088], 4: [0.078, 0.098]}\n", - "{1: [0.021, 0.041], 2: [0.023, 0.043], 3: [0.045, 0.065], 4: [0.069, 0.089]}\n", - "{1: [-0.01, 0.01], 2: [-0.01, 0.01], 3: [-0.009, 0.011], 4: [-0.009, 0.011]}\n", - "{1: [0.001, 0.021], 2: [0.003, 0.023], 3: [0.012, 0.032], 4: [0.013, 0.033]}\n", - "{1: [0.0, 0.02], 2: [0.001, 0.021], 3: [0.009, 0.029], 4: [0.009, 0.029]}\n", - "{1: [0.086, 0.106], 2: [0.087, 0.107], 3: [0.09, 0.11], 4: [0.09, 0.11]}\n", - "{1: [0.042, 0.062], 2: [0.043, 0.063], 3: [0.045, 0.065], 4: [0.045, 0.065]}\n", - "{1: [0.323, 0.343], 2: [0.325, 0.345], 3: [0.334, 0.354], 4: [0.334, 0.354]}\n", - "{1: [0.33, 0.35], 2: [0.33, 0.35], 3: [0.335, 0.355], 4: [0.335, 0.355]}\n", - "{1: [-0.001, 0.019], 2: [-0.001, 0.019], 3: [0.013, 0.033], 4: [0.016, 0.036]}\n", - "{1: [0.003, 0.023], 2: [0.005, 0.025], 3: [0.018, 0.038], 4: [0.022, 0.042]}\n", - "{1: [0.091, 0.101], 2: [0.092, 0.102], 3: [0.095, 0.105], 4: [0.095, 0.105]}\n", - "{1: [0.047, 0.057], 2: [0.048, 0.058], 3: [0.05, 0.06], 4: [0.05, 0.06]}\n", - "{1: [0.328, 0.338], 2: [0.33, 0.34], 3: [0.339, 0.349], 4: [0.339, 0.349]}\n", - "{1: [0.335, 0.345], 2: [0.335, 0.345], 3: [0.34, 0.35], 4: [0.34, 0.35]}\n", - "{1: [0.004, 0.014], 2: [0.004, 0.014], 3: [0.018, 0.028], 4: [0.021, 0.031]}\n", - "{1: [0.008, 0.018], 2: [0.01, 0.02], 3: [0.023, 0.033], 4: [0.027, 0.037]}\n", - "{1: [0.092, 0.102], 2: [0.095, 0.105], 3: [0.095, 0.105], 4: [0.105, 0.115]}\n", - "{1: [0.048, 0.058], 2: [0.05, 0.06], 3: [0.05, 0.06], 4: [0.055, 0.065]}\n", - "{1: [0.048, 0.058], 2: [0.33, 0.34], 3: [0.339, 0.349], 4: [0.339, 0.349]}\n", - "{1: [0.315, 0.325], 2: [0.335, 0.345], 3: [0.34, 0.35], 4: [0.34, 0.35]}\n", - "{1: [0.004, 0.014], 2: [0.004, 0.014], 3: [0.018, 0.028], 4: [0.172, 0.182]}\n", - "{1: [0.008, 0.018], 2: [0.01, 0.02], 3: [0.023, 0.033], 4: [0.183, 0.193]}\n", - "{1: [0.087, 0.107], 2: [0.09, 0.11], 3: [0.09, 0.11], 4: [0.1, 0.12]}\n", - "{1: [0.043, 0.063], 2: [0.045, 0.065], 3: [0.045, 0.065], 4: [0.05, 0.07]}\n", - "{1: [0.043, 0.063], 2: [0.325, 0.345], 3: [0.334, 0.354], 4: [0.334, 0.354]}\n", - "{1: [0.31, 0.33], 2: [0.33, 0.35], 3: [0.335, 0.355], 4: [0.335, 0.355]}\n", - "{1: [-0.001, 0.019], 2: [-0.001, 0.019], 3: [0.013, 0.033], 4: [0.167, 0.187]}\n", - "{1: [0.003, 0.023], 2: [0.005, 0.025], 3: [0.018, 0.038], 4: [0.178, 0.198]}\n", - "{1: [0.09, 0.11], 2: [0.1, 0.12]}\n", - "{1: [0.045, 0.065], 2: [0.05, 0.07]}\n", - "{1: [0.043, 0.063], 2: [0.334, 0.354]}\n", - "{1: [0.31, 0.33], 2: [0.335, 0.355]}\n", - "{1: [-0.001, 0.019], 2: [0.167, 0.187]}\n", - "{1: [0.005, 0.025], 2: [0.178, 0.198]}\n", - "{1: [0.091, 0.101], 2: [0.092, 0.102], 3: [0.095, 0.105], 4: [0.095, 0.105]}\n", - "{1: [0.047, 0.057], 2: [0.048, 0.058], 3: [0.05, 0.06], 4: [0.05, 0.06]}\n", - "{1: [0.328, 0.338], 2: [0.33, 0.34], 3: [0.339, 0.349], 4: [0.339, 0.349]}\n", - "{1: [0.335, 0.345], 2: [0.335, 0.345], 3: [0.34, 0.35], 4: [0.34, 0.35]}\n", - "{1: [0.004, 0.014], 2: [0.004, 0.014], 3: [0.018, 0.028], 4: [0.021, 0.031]}\n", - "{1: [0.008, 0.018], 2: [0.01, 0.02], 3: [0.023, 0.033], 4: [0.027, 0.037]}\n", - "{1: [-0.004, 0.006], 2: [-0.003, 0.007], 3: [0.02, 0.03], 4: [0.022, 0.032]}\n", - "{1: [0.254, 0.264], 2: [0.284, 0.294], 3: [0.372, 0.382], 4: [0.424, 0.434]}\n", - "{1: [0.142, 0.152], 2: [0.152, 0.162], 3: [0.269, 0.279], 4: [0.308, 0.318]}\n", - "{1: [-0.005, 0.005], 2: [0.0, 0.01], 3: [0.0, 0.01], 4: [0.002, 0.012]}\n", - "{1: [0.072, 0.082], 2: [0.084, 0.094], 3: [0.094, 0.104], 4: [0.105, 0.115]}\n", - "{1: [0.07, 0.08], 2: [0.08, 0.09], 3: [0.087, 0.097], 4: [0.094, 0.104]}\n", - "{1: [0.003, 0.013], 2: [0.006, 0.016], 3: [0.01, 0.02], 4: [0.012, 0.022]}\n", - "{1: [0.291, 0.301], 2: [0.317, 0.327], 3: [0.318, 0.328], 4: [0.326, 0.336]}\n", - "{1: [0.263, 0.273], 2: [0.274, 0.284], 3: [0.282, 0.292], 4: [0.288, 0.298]}\n", - "{1: [-0.004, 0.006], 2: [-0.004, 0.006], 3: [-0.003, 0.007], 4: [-0.001, 0.009]}\n", - "{1: [0.036, 0.046], 2: [0.04, 0.05], 3: [0.073, 0.083], 4: [0.083, 0.093]}\n", - "{1: [0.026, 0.036], 2: [0.028, 0.038], 3: [0.05, 0.06], 4: [0.074, 0.084]}\n", - "{1: [-0.005, 0.005], 2: [-0.005, 0.005], 3: [-0.004, 0.006], 4: [-0.004, 0.006]}\n", - "{1: [0.006, 0.016], 2: [0.008, 0.018], 3: [0.017, 0.027], 4: [0.018, 0.028]}\n", - "{1: [0.005, 0.015], 2: [0.006, 0.016], 3: [0.014, 0.024], 4: [0.014, 0.024]}\n" + "To create a public link, set `share=True` in `launch()`.\n" ] } ], @@ -296,44 +230,30 @@ "collapsed": false, "is_executing": true, "ExecuteTime": { - "start_time": "2023-12-10T17:18:16.842929Z" + "start_time": "2023-12-16T22:10:25.247210Z" } }, "id": "678a9dc8d51243f4" }, { "cell_type": "code", - "execution_count": 11, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Closing server running on port: 7860\n" - ] - } - ], + "execution_count": null, + "outputs": [], "source": [ "visualizer.stop_web_app()" ], "metadata": { "collapsed": false, - "ExecuteTime": { - "end_time": "2023-12-10T14:45:32.225285Z", - "start_time": "2023-12-10T14:45:32.184623Z" - } + "is_executing": true }, "id": "277b6d1de837dab7" }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "id": "2326c129", "metadata": { - "ExecuteTime": { - "end_time": "2023-12-10T14:45:32.227687Z", - "start_time": "2023-12-10T14:45:32.224834Z" - } + "is_executing": true }, "outputs": [], "source": [] From 06c60fc1f84eceaa709dc8422854fbcd976e2e57 Mon Sep 17 00:00:00 2001 From: denysgerasymuk799 Date: Mon, 18 Dec 2023 01:37:30 +0200 Subject: [PATCH 34/36] Added error handling for a dataset stats screen --- ...iple_Models_Interface_Vis_Law_School.ipynb | 150 +++++++++++++++--- .../metrics_interactive_visualizer.py | 15 +- virny/utils/protected_groups_partitioning.py | 10 +- 3 files changed, 145 insertions(+), 30 deletions(-) diff --git a/docs/examples/Multiple_Models_Interface_Vis_Law_School.ipynb b/docs/examples/Multiple_Models_Interface_Vis_Law_School.ipynb index 1826cdfe..83931cbb 100644 --- a/docs/examples/Multiple_Models_Interface_Vis_Law_School.ipynb +++ b/docs/examples/Multiple_Models_Interface_Vis_Law_School.ipynb @@ -6,8 +6,8 @@ "id": "248cbed8", "metadata": { "ExecuteTime": { - "end_time": "2023-12-16T22:10:21.409266Z", - "start_time": "2023-12-16T22:10:20.679843Z" + "end_time": "2023-12-17T21:47:39.813777Z", + "start_time": "2023-12-17T21:47:39.261544Z" } }, "outputs": [], @@ -23,8 +23,8 @@ "id": "7ec6cd08", "metadata": { "ExecuteTime": { - "end_time": "2023-12-16T22:10:21.418422Z", - "start_time": "2023-12-16T22:10:21.408919Z" + "end_time": "2023-12-17T21:47:39.822610Z", + "start_time": "2023-12-17T21:47:39.813658Z" } }, "outputs": [], @@ -41,8 +41,8 @@ "id": "b8cb69f2", "metadata": { "ExecuteTime": { - "end_time": "2023-12-16T22:10:21.429731Z", - "start_time": "2023-12-16T22:10:21.418780Z" + "end_time": "2023-12-17T21:47:39.832179Z", + "start_time": "2023-12-17T21:47:39.823116Z" } }, "outputs": [ @@ -76,8 +76,8 @@ "id": "7a9241de", "metadata": { "ExecuteTime": { - "end_time": "2023-12-16T22:10:25.046057Z", - "start_time": "2023-12-16T22:10:21.428148Z" + "end_time": "2023-12-17T21:47:42.380425Z", + "start_time": "2023-12-17T21:47:39.833097Z" } }, "outputs": [], @@ -101,8 +101,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-12-16T22:10:25.116829Z", - "start_time": "2023-12-16T22:10:25.048929Z" + "end_time": "2023-12-17T21:47:42.452856Z", + "start_time": "2023-12-17T21:47:42.383371Z" } }, "id": "d3c53c7b72ecbcd0" @@ -120,8 +120,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-12-16T22:10:25.144265Z", - "start_time": "2023-12-16T22:10:25.117061Z" + "end_time": "2023-12-17T21:47:42.480240Z", + "start_time": "2023-12-17T21:47:42.453731Z" } }, "id": "2aab7c79ecdee914" @@ -153,8 +153,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-12-16T22:10:25.193827Z", - "start_time": "2023-12-16T22:10:25.143225Z" + "end_time": "2023-12-17T21:47:42.525340Z", + "start_time": "2023-12-17T21:47:42.478528Z" } }, "id": "833484748ed512e8" @@ -178,8 +178,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-12-16T22:10:25.218033Z", - "start_time": "2023-12-16T22:10:25.193714Z" + "end_time": "2023-12-17T21:47:42.548956Z", + "start_time": "2023-12-17T21:47:42.525477Z" } }, "id": "15ed7d1ba1f22317" @@ -194,12 +194,12 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 18, "id": "435b9d98", "metadata": { "ExecuteTime": { - "end_time": "2023-12-16T22:10:25.293585Z", - "start_time": "2023-12-16T22:10:25.217304Z" + "end_time": "2023-12-17T23:34:25.339529Z", + "start_time": "2023-12-17T23:34:25.210287Z" } }, "outputs": [], @@ -221,6 +221,92 @@ "\n", "To create a public link, set `share=True` in `launch()`.\n" ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/custom_classes/metrics_interactive_visualizer.py\", line 489, in _create_dataset_proportions_bar_chart\n", + " converted_grp_dis_val = eval(grp_dis_val)\n", + " File \"\", line 1, in \n", + "NameError: name 'Non' is not defined\n", + "\n", + "During handling of the above exception, another exception occurred:\n", + "\n", + "Traceback (most recent call last):\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/routes.py\", line 538, in predict\n", + " output = await route_utils.call_process_api(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/route_utils.py\", line 217, in call_process_api\n", + " output = await app.get_blocks().process_api(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/blocks.py\", line 1553, in process_api\n", + " result = await self.call_function(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/blocks.py\", line 1191, in call_function\n", + " prediction = await anyio.to_thread.run_sync(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/to_thread.py\", line 33, in run_sync\n", + " return await get_asynclib().run_sync_in_worker_thread(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/_backends/_asyncio.py\", line 877, in run_sync_in_worker_thread\n", + " return await future\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/_backends/_asyncio.py\", line 807, in run\n", + " result = context.run(func, *args)\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/utils.py\", line 659, in wrapper\n", + " response = f(*args, **kwargs)\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/custom_classes/metrics_interactive_visualizer.py\", line 492, in _create_dataset_proportions_bar_chart\n", + " raise ValueError(f\"Type casting error with the {grp_dis_val} value. Use quotes for string disavantaged values.\")\n", + "ValueError: Type casting error with the Non-White value. Use quotes for string disavantaged values.\n", + "Traceback (most recent call last):\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/custom_classes/metrics_interactive_visualizer.py\", line 489, in _create_dataset_proportions_bar_chart\n", + " converted_grp_dis_val = eval(grp_dis_val)\n", + " File \"\", line 1\n", + " 'Non-White\"\n", + " ^\n", + "SyntaxError: EOL while scanning string literal\n", + "\n", + "During handling of the above exception, another exception occurred:\n", + "\n", + "Traceback (most recent call last):\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/routes.py\", line 538, in predict\n", + " output = await route_utils.call_process_api(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/route_utils.py\", line 217, in call_process_api\n", + " output = await app.get_blocks().process_api(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/blocks.py\", line 1553, in process_api\n", + " result = await self.call_function(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/blocks.py\", line 1191, in call_function\n", + " prediction = await anyio.to_thread.run_sync(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/to_thread.py\", line 33, in run_sync\n", + " return await get_asynclib().run_sync_in_worker_thread(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/_backends/_asyncio.py\", line 877, in run_sync_in_worker_thread\n", + " return await future\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/_backends/_asyncio.py\", line 807, in run\n", + " result = context.run(func, *args)\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/utils.py\", line 659, in wrapper\n", + " response = f(*args, **kwargs)\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/custom_classes/metrics_interactive_visualizer.py\", line 492, in _create_dataset_proportions_bar_chart\n", + " raise ValueError(f\"Type casting error with the {grp_dis_val} value. Use quotes for string disavantaged values.\")\n", + "ValueError: Type casting error with the 'Non-White\" value. Use quotes for string disavantaged values.\n", + "Traceback (most recent call last):\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/routes.py\", line 538, in predict\n", + " output = await route_utils.call_process_api(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/route_utils.py\", line 217, in call_process_api\n", + " output = await app.get_blocks().process_api(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/blocks.py\", line 1553, in process_api\n", + " result = await self.call_function(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/blocks.py\", line 1191, in call_function\n", + " prediction = await anyio.to_thread.run_sync(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/to_thread.py\", line 33, in run_sync\n", + " return await get_asynclib().run_sync_in_worker_thread(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/_backends/_asyncio.py\", line 877, in run_sync_in_worker_thread\n", + " return await future\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/_backends/_asyncio.py\", line 807, in run\n", + " result = context.run(func, *args)\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/utils.py\", line 659, in wrapper\n", + " response = f(*args, **kwargs)\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/custom_classes/metrics_interactive_visualizer.py\", line 495, in _create_dataset_proportions_bar_chart\n", + " protected_groups = create_test_protected_groups(self.X_data, self.X_data, input_sensitive_attrs_dct)\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/utils/protected_groups_partitioning.py\", line 104, in create_test_protected_groups\n", + " raise ValueError(f\"Protected group ({dis_grp_name}) from X_test is empty. \"\n", + "ValueError: Protected group (race_dis) from X_test is empty. Please check types of sensitive attributes in config or replace the sensitive attribute\n" + ] } ], "source": [ @@ -230,30 +316,44 @@ "collapsed": false, "is_executing": true, "ExecuteTime": { - "start_time": "2023-12-16T22:10:25.247210Z" + "start_time": "2023-12-17T23:34:25.340065Z" } }, "id": "678a9dc8d51243f4" }, { "cell_type": "code", - "execution_count": null, - "outputs": [], + "execution_count": 11, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Closing server running on port: 7860\n" + ] + } + ], "source": [ "visualizer.stop_web_app()" ], "metadata": { "collapsed": false, - "is_executing": true + "ExecuteTime": { + "end_time": "2023-12-17T23:11:31.184662Z", + "start_time": "2023-12-17T23:11:31.135723Z" + } }, "id": "277b6d1de837dab7" }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "id": "2326c129", "metadata": { - "is_executing": true + "ExecuteTime": { + "end_time": "2023-12-17T23:11:31.184935Z", + "start_time": "2023-12-17T23:11:31.183840Z" + } }, "outputs": [], "source": [] diff --git a/virny/custom_classes/metrics_interactive_visualizer.py b/virny/custom_classes/metrics_interactive_visualizer.py index ebc91aa2..cbe4908d 100644 --- a/virny/custom_classes/metrics_interactive_visualizer.py +++ b/virny/custom_classes/metrics_interactive_visualizer.py @@ -471,9 +471,13 @@ def __check_metric_constraints(self, model_performance_dct, input_constraint_dct def _create_dataset_proportions_bar_chart(self, grp_name1, grp_name2, grp_name3, grp_name4, grp_name5, grp_name6, grp_name7, grp_name8, grp_dis_val1, grp_dis_val2, grp_dis_val3, grp_dis_val4, grp_dis_val5, grp_dis_val6, grp_dis_val7, grp_dis_val8): grp_names = [grp_name1, grp_name2, grp_name3, grp_name4, grp_name5, grp_name6, grp_name7, grp_name8] - grp_names = [grp for grp in grp_names if grp != '' and grp is not None] + grp_names = [grp.strip() for grp in grp_names if grp != '' and grp is not None] grp_dis_values = [grp_dis_val1, grp_dis_val2, grp_dis_val3, grp_dis_val4, grp_dis_val5, grp_dis_val6, grp_dis_val7, grp_dis_val8] - grp_dis_values = [grp for grp in grp_dis_values if grp != '' and grp is not None] + grp_dis_values = [grp.strip() for grp in grp_dis_values if grp != '' and grp is not None] + + if len(grp_names) != len(grp_dis_values): + raise ValueError("Numbers of sensitive attributes and their disadvantaged groups are different." + "Please, put '-' as a disadvantaged value for intersectional sensitive attributes.") # Create a sensitive attrs dict input_sensitive_attrs_dct = dict() @@ -481,8 +485,11 @@ def _create_dataset_proportions_bar_chart(self, grp_name1, grp_name2, grp_name3, if '&' in grp_name: input_sensitive_attrs_dct[grp_name] = None else: - converted_grp_dis_val = eval(grp_dis_val) - input_sensitive_attrs_dct[grp_name] = converted_grp_dis_val + try: + converted_grp_dis_val = eval(grp_dis_val) + input_sensitive_attrs_dct[grp_name] = converted_grp_dis_val + except Exception as _: + raise ValueError(f"Type casting error with the {grp_dis_val} value. Use quotes for string disavantaged values.") # Partition on protected groups protected_groups = create_test_protected_groups(self.X_data, self.X_data, input_sensitive_attrs_dct) diff --git a/virny/utils/protected_groups_partitioning.py b/virny/utils/protected_groups_partitioning.py index 658198d7..e13a20b6 100644 --- a/virny/utils/protected_groups_partitioning.py +++ b/virny/utils/protected_groups_partitioning.py @@ -70,8 +70,16 @@ def create_test_protected_groups(X_test: pd.DataFrame, init_features_df: pd.Data """ plain_sensitive_attributes = [attr for attr in sensitive_attributes_dct.keys() if INTERSECTION_SIGN not in attr] - X_test_with_sensitive_attrs = init_features_df[plain_sensitive_attributes].loc[X_test.index] + # Check spelling of sensitive attributes + attrs_with_errors = [] + for attr in plain_sensitive_attributes: + if attr not in init_features_df.columns: + attrs_with_errors.append(attr) + if len(attrs_with_errors) > 0: + raise ValueError(f"At least one of sensitive attributes is not in dataset columns. Check spelling of {attrs_with_errors} attributes.") + + X_test_with_sensitive_attrs = init_features_df[plain_sensitive_attributes].loc[X_test.index] groups = dict() for attr in sensitive_attributes_dct.keys(): attr = attr.strip() From f06cc9ff6d1a743e24d62bd5bb888057e7868143 Mon Sep 17 00:00:00 2001 From: denysgerasymuk799 Date: Mon, 18 Dec 2023 18:02:20 +0200 Subject: [PATCH 35/36] Added all error handling --- ...iple_Models_Interface_Vis_Law_School.ipynb | 141 +++++++++++------- .../metrics_interactive_visualizer.py | 11 +- virny/utils/data_viz_utils.py | 4 +- 3 files changed, 97 insertions(+), 59 deletions(-) diff --git a/docs/examples/Multiple_Models_Interface_Vis_Law_School.ipynb b/docs/examples/Multiple_Models_Interface_Vis_Law_School.ipynb index 83931cbb..90a3a0df 100644 --- a/docs/examples/Multiple_Models_Interface_Vis_Law_School.ipynb +++ b/docs/examples/Multiple_Models_Interface_Vis_Law_School.ipynb @@ -6,8 +6,8 @@ "id": "248cbed8", "metadata": { "ExecuteTime": { - "end_time": "2023-12-17T21:47:39.813777Z", - "start_time": "2023-12-17T21:47:39.261544Z" + "end_time": "2023-12-18T15:30:30.826849Z", + "start_time": "2023-12-18T15:30:30.355864Z" } }, "outputs": [], @@ -23,8 +23,8 @@ "id": "7ec6cd08", "metadata": { "ExecuteTime": { - "end_time": "2023-12-17T21:47:39.822610Z", - "start_time": "2023-12-17T21:47:39.813658Z" + "end_time": "2023-12-18T15:30:30.836146Z", + "start_time": "2023-12-18T15:30:30.826225Z" } }, "outputs": [], @@ -41,8 +41,8 @@ "id": "b8cb69f2", "metadata": { "ExecuteTime": { - "end_time": "2023-12-17T21:47:39.832179Z", - "start_time": "2023-12-17T21:47:39.823116Z" + "end_time": "2023-12-18T15:30:30.848252Z", + "start_time": "2023-12-18T15:30:30.836766Z" } }, "outputs": [ @@ -76,8 +76,8 @@ "id": "7a9241de", "metadata": { "ExecuteTime": { - "end_time": "2023-12-17T21:47:42.380425Z", - "start_time": "2023-12-17T21:47:39.833097Z" + "end_time": "2023-12-18T15:30:32.569645Z", + "start_time": "2023-12-18T15:30:30.847803Z" } }, "outputs": [], @@ -101,8 +101,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-12-17T21:47:42.452856Z", - "start_time": "2023-12-17T21:47:42.383371Z" + "end_time": "2023-12-18T15:30:32.635886Z", + "start_time": "2023-12-18T15:30:32.573395Z" } }, "id": "d3c53c7b72ecbcd0" @@ -120,8 +120,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-12-17T21:47:42.480240Z", - "start_time": "2023-12-17T21:47:42.453731Z" + "end_time": "2023-12-18T15:30:32.664462Z", + "start_time": "2023-12-18T15:30:32.635793Z" } }, "id": "2aab7c79ecdee914" @@ -153,8 +153,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-12-17T21:47:42.525340Z", - "start_time": "2023-12-17T21:47:42.478528Z" + "end_time": "2023-12-18T15:30:32.712298Z", + "start_time": "2023-12-18T15:30:32.663822Z" } }, "id": "833484748ed512e8" @@ -178,8 +178,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-12-17T21:47:42.548956Z", - "start_time": "2023-12-17T21:47:42.525477Z" + "end_time": "2023-12-18T15:30:32.759812Z", + "start_time": "2023-12-18T15:30:32.712204Z" } }, "id": "15ed7d1ba1f22317" @@ -194,12 +194,12 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 9, "id": "435b9d98", "metadata": { "ExecuteTime": { - "end_time": "2023-12-17T23:34:25.339529Z", - "start_time": "2023-12-17T23:34:25.210287Z" + "end_time": "2023-12-18T15:30:32.808353Z", + "start_time": "2023-12-18T15:30:32.738229Z" } }, "outputs": [], @@ -211,7 +211,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "outputs": [ { "name": "stdout", @@ -227,13 +227,29 @@ "output_type": "stream", "text": [ "Traceback (most recent call last):\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/custom_classes/metrics_interactive_visualizer.py\", line 489, in _create_dataset_proportions_bar_chart\n", - " converted_grp_dis_val = eval(grp_dis_val)\n", - " File \"\", line 1, in \n", - "NameError: name 'Non' is not defined\n", - "\n", - "During handling of the above exception, another exception occurred:\n", - "\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/routes.py\", line 538, in predict\n", + " output = await route_utils.call_process_api(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/route_utils.py\", line 217, in call_process_api\n", + " output = await app.get_blocks().process_api(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/blocks.py\", line 1553, in process_api\n", + " result = await self.call_function(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/blocks.py\", line 1191, in call_function\n", + " prediction = await anyio.to_thread.run_sync(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/to_thread.py\", line 33, in run_sync\n", + " return await get_asynclib().run_sync_in_worker_thread(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/_backends/_asyncio.py\", line 877, in run_sync_in_worker_thread\n", + " return await future\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/_backends/_asyncio.py\", line 807, in run\n", + " result = context.run(func, *args)\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/utils.py\", line 659, in wrapper\n", + " response = f(*args, **kwargs)\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/custom_classes/metrics_interactive_visualizer.py\", line 609, in _create_subgroup_model_rank_heatmap\n", + " model_rank_heatmap, _ = create_model_rank_heatmap_visualization(model_metrics_matrix, sorted_matrix_by_rank)\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/utils/data_viz_utils.py\", line 267, in create_model_rank_heatmap_visualization\n", + " num_ranks = int(sorted_matrix_by_rank.values.max())\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/numpy/core/_methods.py\", line 41, in _amax\n", + " return umr_maximum(a, axis, None, out, keepdims, initial, where)\n", + "ValueError: zero-size array to reduction operation maximum which has no identity\n", "Traceback (most recent call last):\n", " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/routes.py\", line 538, in predict\n", " output = await route_utils.call_process_api(\n", @@ -251,19 +267,29 @@ " result = context.run(func, *args)\n", " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/utils.py\", line 659, in wrapper\n", " response = f(*args, **kwargs)\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/custom_classes/metrics_interactive_visualizer.py\", line 492, in _create_dataset_proportions_bar_chart\n", - " raise ValueError(f\"Type casting error with the {grp_dis_val} value. Use quotes for string disavantaged values.\")\n", - "ValueError: Type casting error with the Non-White value. Use quotes for string disavantaged values.\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/custom_classes/metrics_interactive_visualizer.py\", line 593, in _create_subgroup_model_rank_heatmap\n", + " raise ValueError('Tolerance should be in the [0.001, 0.2] range')\n", + "ValueError: Tolerance should be in the [0.001, 0.2] range\n", "Traceback (most recent call last):\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/custom_classes/metrics_interactive_visualizer.py\", line 489, in _create_dataset_proportions_bar_chart\n", - " converted_grp_dis_val = eval(grp_dis_val)\n", - " File \"\", line 1\n", - " 'Non-White\"\n", - " ^\n", - "SyntaxError: EOL while scanning string literal\n", - "\n", - "During handling of the above exception, another exception occurred:\n", - "\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/routes.py\", line 538, in predict\n", + " output = await route_utils.call_process_api(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/route_utils.py\", line 217, in call_process_api\n", + " output = await app.get_blocks().process_api(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/blocks.py\", line 1553, in process_api\n", + " result = await self.call_function(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/blocks.py\", line 1191, in call_function\n", + " prediction = await anyio.to_thread.run_sync(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/to_thread.py\", line 33, in run_sync\n", + " return await get_asynclib().run_sync_in_worker_thread(\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/_backends/_asyncio.py\", line 877, in run_sync_in_worker_thread\n", + " return await future\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/_backends/_asyncio.py\", line 807, in run\n", + " result = context.run(func, *args)\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/utils.py\", line 659, in wrapper\n", + " response = f(*args, **kwargs)\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/custom_classes/metrics_interactive_visualizer.py\", line 593, in _create_subgroup_model_rank_heatmap\n", + " raise ValueError('Tolerance should be in the [0.001, 0.2] range')\n", + "ValueError: Tolerance should be in the [0.001, 0.2] range\n", "Traceback (most recent call last):\n", " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/routes.py\", line 538, in predict\n", " output = await route_utils.call_process_api(\n", @@ -281,9 +307,11 @@ " result = context.run(func, *args)\n", " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/utils.py\", line 659, in wrapper\n", " response = f(*args, **kwargs)\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/custom_classes/metrics_interactive_visualizer.py\", line 492, in _create_dataset_proportions_bar_chart\n", - " raise ValueError(f\"Type casting error with the {grp_dis_val} value. Use quotes for string disavantaged values.\")\n", - "ValueError: Type casting error with the 'Non-White\" value. Use quotes for string disavantaged values.\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/custom_classes/metrics_interactive_visualizer.py\", line 591, in _create_subgroup_model_rank_heatmap\n", + " tolerance = str_to_float(tolerance, 'Tolerance')\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/utils/common_helpers.py\", line 86, in str_to_float\n", + " raise ValueError(f\"{var_name} must be a float number with a '.' separator.\")\n", + "ValueError: Tolerance must be a float number with a '.' separator.\n", "Traceback (most recent call last):\n", " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/routes.py\", line 538, in predict\n", " output = await route_utils.call_process_api(\n", @@ -301,11 +329,18 @@ " result = context.run(func, *args)\n", " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/utils.py\", line 659, in wrapper\n", " response = f(*args, **kwargs)\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/custom_classes/metrics_interactive_visualizer.py\", line 495, in _create_dataset_proportions_bar_chart\n", - " protected_groups = create_test_protected_groups(self.X_data, self.X_data, input_sensitive_attrs_dct)\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/utils/protected_groups_partitioning.py\", line 104, in create_test_protected_groups\n", - " raise ValueError(f\"Protected group ({dis_grp_name}) from X_test is empty. \"\n", - "ValueError: Protected group (race_dis) from X_test is empty. Please check types of sensitive attributes in config or replace the sensitive attribute\n" + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/custom_classes/metrics_interactive_visualizer.py\", line 591, in _create_subgroup_model_rank_heatmap\n", + " tolerance = str_to_float(tolerance, 'Tolerance')\n", + " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/utils/common_helpers.py\", line 86, in str_to_float\n", + " raise ValueError(f\"{var_name} must be a float number with a '.' separator.\")\n", + "ValueError: Tolerance must be a float number with a '.' separator.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Keyboard interruption in main thread... closing server.\n" ] } ], @@ -314,9 +349,9 @@ ], "metadata": { "collapsed": false, - "is_executing": true, "ExecuteTime": { - "start_time": "2023-12-17T23:34:25.340065Z" + "end_time": "2023-12-18T16:02:02.572226Z", + "start_time": "2023-12-18T15:30:32.768235Z" } }, "id": "678a9dc8d51243f4" @@ -339,8 +374,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-12-17T23:11:31.184662Z", - "start_time": "2023-12-17T23:11:31.135723Z" + "end_time": "2023-12-18T16:02:02.620717Z", + "start_time": "2023-12-18T16:02:02.578812Z" } }, "id": "277b6d1de837dab7" @@ -351,8 +386,8 @@ "id": "2326c129", "metadata": { "ExecuteTime": { - "end_time": "2023-12-17T23:11:31.184935Z", - "start_time": "2023-12-17T23:11:31.183840Z" + "end_time": "2023-12-18T16:02:02.623767Z", + "start_time": "2023-12-18T16:02:02.619001Z" } }, "outputs": [], diff --git a/virny/custom_classes/metrics_interactive_visualizer.py b/virny/custom_classes/metrics_interactive_visualizer.py index cbe4908d..18fee7da 100644 --- a/virny/custom_classes/metrics_interactive_visualizer.py +++ b/virny/custom_classes/metrics_interactive_visualizer.py @@ -463,6 +463,9 @@ def __check_metric_constraints(self, model_performance_dct, input_constraint_dct for group in model_performance_dct[metric_dim]: constraint_type = 'overall' if group == 'Overall' else 'disparity' min_val, max_val = input_constraint_dct[metric_dim][constraint_type][1] + if min_val > max_val: + raise ValueError(f'Max value for the {metric_dim} {constraint_type} dimension should be greater than min value.') + check = 1 if model_performance_dct[metric_dim][group] >= min_val and model_performance_dct[metric_dim][group] <= max_val else 0 model_metrics_constraints_check_dct[metric_dim][group] = check @@ -533,10 +536,10 @@ def _create_bar_plot_for_model_selection(self, group_name, overall_metric1, over overall_metric2: 'C3', disparity_metric2: 'C4', } - overall_constraint1 = (overall_metric1, str_to_float(overall_metric_min_val1, 'C1 min value'), str_to_float(overall_metric_max_val1, 'C2 max value')) - disparity_constraint1 = (disparity_metric1, str_to_float(disparity_metric_min_val1, 'C2 min value'), str_to_float(disparity_metric_max_val1, 'C2 max value')) - overall_constraint2 = (overall_metric2, str_to_float(overall_metric_min_val2, 'C3 min value'), str_to_float(overall_metric_max_val2, 'C3 max value')) - disparity_constraint2 = (disparity_metric2, str_to_float(disparity_metric_min_val2, 'C4 min value'), str_to_float(disparity_metric_max_val2, 'C4 max value')) + overall_constraint1 = (overall_metric1, str_to_float(overall_metric_min_val1, 'Overall Constraint (C1) min value'), str_to_float(overall_metric_max_val1, 'Overall Constraint (C1) max value')) + disparity_constraint1 = (disparity_metric1, str_to_float(disparity_metric_min_val1, 'Disparity Constraint (C2) min value'), str_to_float(disparity_metric_max_val1, 'Disparity Constraint (C2) max value')) + overall_constraint2 = (overall_metric2, str_to_float(overall_metric_min_val2, 'Overall Constraint (C3) min value'), str_to_float(overall_metric_max_val2, 'Overall Constraint (C3) max value')) + disparity_constraint2 = (disparity_metric2, str_to_float(disparity_metric_min_val2, 'Disparity Constraint (C4) min value'), str_to_float(disparity_metric_max_val2, 'Disparity Constraint (C4) max value')) # Create individual constraints metrics_value_range_dct = dict() diff --git a/virny/utils/data_viz_utils.py b/virny/utils/data_viz_utils.py index 41dba3cc..8cae6f28 100644 --- a/virny/utils/data_viz_utils.py +++ b/virny/utils/data_viz_utils.py @@ -489,7 +489,7 @@ def create_models_in_range_dct(all_subgroup_metrics_per_model_dct: dict, all_gro if '&' not in metric_group: min_range_val, max_range_val = value_range if max_range_val < min_range_val: - raise ValueError('The second element in the input range must be greater than the first element, ' + raise ValueError('The second value in the input range must be greater than the first value, ' 'so to be in the following format -- (min_range_val, max_range_val)') metric = metric_group pd_condition = (pivoted_model_metrics_df[metric] >= min_range_val) & (pivoted_model_metrics_df[metric] <= max_range_val) @@ -498,7 +498,7 @@ def create_models_in_range_dct(all_subgroup_metrics_per_model_dct: dict, all_gro for idx, metric in enumerate(metrics): min_range_val, max_range_val = metrics_value_range_dct[metric] if max_range_val < min_range_val: - raise ValueError('The second element in the input range must be greater than the first element, ' + raise ValueError('The second value in the input range must be greater than the first value, ' 'so to be in the following format -- (min_range_val, max_range_val)') if idx == 0: pd_condition = (pivoted_model_metrics_df[metric] >= min_range_val) & (pivoted_model_metrics_df[metric] <= max_range_val) From b3c88f2a19dae401d50857081b111a7d64fe2d4c Mon Sep 17 00:00:00 2001 From: denysgerasymuk799 Date: Mon, 18 Dec 2023 22:23:06 +0200 Subject: [PATCH 36/36] wip --- ...iple_Models_Interface_Vis_Law_School.ipynb | 170 +++--------------- 1 file changed, 25 insertions(+), 145 deletions(-) diff --git a/docs/examples/Multiple_Models_Interface_Vis_Law_School.ipynb b/docs/examples/Multiple_Models_Interface_Vis_Law_School.ipynb index 90a3a0df..3b630e94 100644 --- a/docs/examples/Multiple_Models_Interface_Vis_Law_School.ipynb +++ b/docs/examples/Multiple_Models_Interface_Vis_Law_School.ipynb @@ -6,8 +6,8 @@ "id": "248cbed8", "metadata": { "ExecuteTime": { - "end_time": "2023-12-18T15:30:30.826849Z", - "start_time": "2023-12-18T15:30:30.355864Z" + "end_time": "2023-12-18T17:11:51.087426Z", + "start_time": "2023-12-18T17:11:50.720930Z" } }, "outputs": [], @@ -23,8 +23,8 @@ "id": "7ec6cd08", "metadata": { "ExecuteTime": { - "end_time": "2023-12-18T15:30:30.836146Z", - "start_time": "2023-12-18T15:30:30.826225Z" + "end_time": "2023-12-18T17:11:51.096433Z", + "start_time": "2023-12-18T17:11:51.087934Z" } }, "outputs": [], @@ -41,8 +41,8 @@ "id": "b8cb69f2", "metadata": { "ExecuteTime": { - "end_time": "2023-12-18T15:30:30.848252Z", - "start_time": "2023-12-18T15:30:30.836766Z" + "end_time": "2023-12-18T17:11:51.105608Z", + "start_time": "2023-12-18T17:11:51.096820Z" } }, "outputs": [ @@ -76,8 +76,8 @@ "id": "7a9241de", "metadata": { "ExecuteTime": { - "end_time": "2023-12-18T15:30:32.569645Z", - "start_time": "2023-12-18T15:30:30.847803Z" + "end_time": "2023-12-18T17:11:52.701377Z", + "start_time": "2023-12-18T17:11:51.106232Z" } }, "outputs": [], @@ -101,8 +101,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-12-18T15:30:32.635886Z", - "start_time": "2023-12-18T15:30:32.573395Z" + "end_time": "2023-12-18T17:11:52.766489Z", + "start_time": "2023-12-18T17:11:52.704609Z" } }, "id": "d3c53c7b72ecbcd0" @@ -120,8 +120,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-12-18T15:30:32.664462Z", - "start_time": "2023-12-18T15:30:32.635793Z" + "end_time": "2023-12-18T17:11:52.791981Z", + "start_time": "2023-12-18T17:11:52.767057Z" } }, "id": "2aab7c79ecdee914" @@ -153,8 +153,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-12-18T15:30:32.712298Z", - "start_time": "2023-12-18T15:30:32.663822Z" + "end_time": "2023-12-18T17:11:52.842306Z", + "start_time": "2023-12-18T17:11:52.792667Z" } }, "id": "833484748ed512e8" @@ -178,8 +178,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-12-18T15:30:32.759812Z", - "start_time": "2023-12-18T15:30:32.712204Z" + "end_time": "2023-12-18T17:11:52.877906Z", + "start_time": "2023-12-18T17:11:52.842425Z" } }, "id": "15ed7d1ba1f22317" @@ -198,8 +198,8 @@ "id": "435b9d98", "metadata": { "ExecuteTime": { - "end_time": "2023-12-18T15:30:32.808353Z", - "start_time": "2023-12-18T15:30:32.738229Z" + "end_time": "2023-12-18T17:11:52.959909Z", + "start_time": "2023-12-18T17:11:52.864927Z" } }, "outputs": [], @@ -219,127 +219,7 @@ "text": [ "Running on local URL: http://127.0.0.1:7860\n", "\n", - "To create a public link, set `share=True` in `launch()`.\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Traceback (most recent call last):\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/routes.py\", line 538, in predict\n", - " output = await route_utils.call_process_api(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/route_utils.py\", line 217, in call_process_api\n", - " output = await app.get_blocks().process_api(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/blocks.py\", line 1553, in process_api\n", - " result = await self.call_function(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/blocks.py\", line 1191, in call_function\n", - " prediction = await anyio.to_thread.run_sync(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/to_thread.py\", line 33, in run_sync\n", - " return await get_asynclib().run_sync_in_worker_thread(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/_backends/_asyncio.py\", line 877, in run_sync_in_worker_thread\n", - " return await future\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/_backends/_asyncio.py\", line 807, in run\n", - " result = context.run(func, *args)\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/utils.py\", line 659, in wrapper\n", - " response = f(*args, **kwargs)\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/custom_classes/metrics_interactive_visualizer.py\", line 609, in _create_subgroup_model_rank_heatmap\n", - " model_rank_heatmap, _ = create_model_rank_heatmap_visualization(model_metrics_matrix, sorted_matrix_by_rank)\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/utils/data_viz_utils.py\", line 267, in create_model_rank_heatmap_visualization\n", - " num_ranks = int(sorted_matrix_by_rank.values.max())\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/numpy/core/_methods.py\", line 41, in _amax\n", - " return umr_maximum(a, axis, None, out, keepdims, initial, where)\n", - "ValueError: zero-size array to reduction operation maximum which has no identity\n", - "Traceback (most recent call last):\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/routes.py\", line 538, in predict\n", - " output = await route_utils.call_process_api(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/route_utils.py\", line 217, in call_process_api\n", - " output = await app.get_blocks().process_api(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/blocks.py\", line 1553, in process_api\n", - " result = await self.call_function(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/blocks.py\", line 1191, in call_function\n", - " prediction = await anyio.to_thread.run_sync(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/to_thread.py\", line 33, in run_sync\n", - " return await get_asynclib().run_sync_in_worker_thread(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/_backends/_asyncio.py\", line 877, in run_sync_in_worker_thread\n", - " return await future\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/_backends/_asyncio.py\", line 807, in run\n", - " result = context.run(func, *args)\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/utils.py\", line 659, in wrapper\n", - " response = f(*args, **kwargs)\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/custom_classes/metrics_interactive_visualizer.py\", line 593, in _create_subgroup_model_rank_heatmap\n", - " raise ValueError('Tolerance should be in the [0.001, 0.2] range')\n", - "ValueError: Tolerance should be in the [0.001, 0.2] range\n", - "Traceback (most recent call last):\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/routes.py\", line 538, in predict\n", - " output = await route_utils.call_process_api(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/route_utils.py\", line 217, in call_process_api\n", - " output = await app.get_blocks().process_api(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/blocks.py\", line 1553, in process_api\n", - " result = await self.call_function(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/blocks.py\", line 1191, in call_function\n", - " prediction = await anyio.to_thread.run_sync(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/to_thread.py\", line 33, in run_sync\n", - " return await get_asynclib().run_sync_in_worker_thread(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/_backends/_asyncio.py\", line 877, in run_sync_in_worker_thread\n", - " return await future\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/_backends/_asyncio.py\", line 807, in run\n", - " result = context.run(func, *args)\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/utils.py\", line 659, in wrapper\n", - " response = f(*args, **kwargs)\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/custom_classes/metrics_interactive_visualizer.py\", line 593, in _create_subgroup_model_rank_heatmap\n", - " raise ValueError('Tolerance should be in the [0.001, 0.2] range')\n", - "ValueError: Tolerance should be in the [0.001, 0.2] range\n", - "Traceback (most recent call last):\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/routes.py\", line 538, in predict\n", - " output = await route_utils.call_process_api(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/route_utils.py\", line 217, in call_process_api\n", - " output = await app.get_blocks().process_api(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/blocks.py\", line 1553, in process_api\n", - " result = await self.call_function(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/blocks.py\", line 1191, in call_function\n", - " prediction = await anyio.to_thread.run_sync(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/to_thread.py\", line 33, in run_sync\n", - " return await get_asynclib().run_sync_in_worker_thread(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/_backends/_asyncio.py\", line 877, in run_sync_in_worker_thread\n", - " return await future\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/_backends/_asyncio.py\", line 807, in run\n", - " result = context.run(func, *args)\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/utils.py\", line 659, in wrapper\n", - " response = f(*args, **kwargs)\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/custom_classes/metrics_interactive_visualizer.py\", line 591, in _create_subgroup_model_rank_heatmap\n", - " tolerance = str_to_float(tolerance, 'Tolerance')\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/utils/common_helpers.py\", line 86, in str_to_float\n", - " raise ValueError(f\"{var_name} must be a float number with a '.' separator.\")\n", - "ValueError: Tolerance must be a float number with a '.' separator.\n", - "Traceback (most recent call last):\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/routes.py\", line 538, in predict\n", - " output = await route_utils.call_process_api(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/route_utils.py\", line 217, in call_process_api\n", - " output = await app.get_blocks().process_api(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/blocks.py\", line 1553, in process_api\n", - " result = await self.call_function(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/blocks.py\", line 1191, in call_function\n", - " prediction = await anyio.to_thread.run_sync(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/to_thread.py\", line 33, in run_sync\n", - " return await get_asynclib().run_sync_in_worker_thread(\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/_backends/_asyncio.py\", line 877, in run_sync_in_worker_thread\n", - " return await future\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/anyio/_backends/_asyncio.py\", line 807, in run\n", - " result = context.run(func, *args)\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny_env/lib/python3.9/site-packages/gradio/utils.py\", line 659, in wrapper\n", - " response = f(*args, **kwargs)\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/custom_classes/metrics_interactive_visualizer.py\", line 591, in _create_subgroup_model_rank_heatmap\n", - " tolerance = str_to_float(tolerance, 'Tolerance')\n", - " File \"/Users/denys_herasymuk/UCU/4course_2term/Bachelor_Thesis/Code/Virny/virny/utils/common_helpers.py\", line 86, in str_to_float\n", - " raise ValueError(f\"{var_name} must be a float number with a '.' separator.\")\n", - "ValueError: Tolerance must be a float number with a '.' separator.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "To create a public link, set `share=True` in `launch()`.\n", "Keyboard interruption in main thread... closing server.\n" ] } @@ -350,8 +230,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-12-18T16:02:02.572226Z", - "start_time": "2023-12-18T15:30:32.768235Z" + "end_time": "2023-12-18T17:14:45.540473Z", + "start_time": "2023-12-18T17:11:52.892884Z" } }, "id": "678a9dc8d51243f4" @@ -374,8 +254,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-12-18T16:02:02.620717Z", - "start_time": "2023-12-18T16:02:02.578812Z" + "end_time": "2023-12-18T17:14:45.583530Z", + "start_time": "2023-12-18T17:14:45.541605Z" } }, "id": "277b6d1de837dab7" @@ -386,8 +266,8 @@ "id": "2326c129", "metadata": { "ExecuteTime": { - "end_time": "2023-12-18T16:02:02.623767Z", - "start_time": "2023-12-18T16:02:02.619001Z" + "end_time": "2023-12-18T17:14:45.584046Z", + "start_time": "2023-12-18T17:14:45.581453Z" } }, "outputs": [],