Étude de cas Pandas DataFrame to Fairness Indicators

Voir sur TensorFlow.org Exécuter dans Google Colab Voir sur GitHub Télécharger le cahier

Aperçu de l'étude de cas

Dans cette étude de cas , nous appliquerons tensorflow modèle d' analyse et des indicateurs d' équité pour évaluer les données stockées en tant que Pandas dataframe, où chaque ligne contient de la vérité au sol, diverses caractéristiques et une prévision de modèle. Nous montrerons comment ce workflow peut être utilisé pour repérer les problèmes d'équité potentiels, indépendamment du cadre utilisé pour construire et entraîner le modèle. Comme dans cette étude de cas, nous pouvons analyser les résultats de n'importe quel framework d'apprentissage automatique (par exemple TensorFlow, JAX, etc.) une fois qu'ils sont convertis en Pandas DataFrame.

Pour cet exercice, nous allons tirer parti du réseau de Deep Neural (DNN) modèle qui a été développé dans les contraintes de forme pour l' éthique avec tensorflow Lattice étude de cas en utilisant l'ensemble de données d'admission Faculté de droit de l'admission Law School Conseil (CTAS). Ce classificateur tente de prédire si un étudiant réussira ou non la barre, en fonction de son score au test d'admission à la faculté de droit (LSAT) et de sa moyenne cumulative de premier cycle. Ce classificateur tente de prédire si un étudiant réussira ou non la barre, en fonction de son score LSAT et de sa moyenne cumulative de premier cycle.

Ensemble de données LSAC

L'ensemble de données utilisé dans cette étude de cas ont été recueillis pour une étude intitulée « Barre longitudinale nationale CTAS Passage étude. CTAS Rapport de recherche Série 'par Linda Wightman en 1998. L'ensemble de données est actuellement hébergé ici .

  • dnn_bar_pass_prediction: La prédiction de LSAT du modèle DNN.
  • sexe: le sexe de l'élève.
  • LSAT: LSAT reçu par l'étudiant.
  • pass_bar: étiquette indiquant si la vérité au sol l'étudiant ou non finalement passé la barre.
  • course: Course de l'étudiant.
  • ugpa: Un premier cycle GPA de l' étudiant.
!pip install -q -U pip==20.2

!pip install -q -U \
  tensorflow-model-analysis==0.30.0 \
  tensorflow-data-validation==0.30.0 \
  tfx-bsl==0.30.0

Importation des packages requis :

import os
import tempfile
import pandas as pd
import six.moves.urllib as urllib
import pprint

import tensorflow_model_analysis as tfma
from google.protobuf import text_format

import tensorflow as tf
tf.compat.v1.enable_v2_behavior()

Téléchargez les données et explorez l'ensemble de données initial.

# Download the LSAT dataset and setup the required filepaths.
_DATA_ROOT = tempfile.mkdtemp(prefix='lsat-data')
_DATA_PATH = 'https://storage.googleapis.com/lawschool_dataset/bar_pass_prediction.csv'
_DATA_FILEPATH = os.path.join(_DATA_ROOT, 'bar_pass_prediction.csv')

data = urllib.request.urlopen(_DATA_PATH)

_LSAT_DF = pd.read_csv(data)

# To simpliy the case study, we will only use the columns that will be used for
# our model.
_COLUMN_NAMES = [
  'dnn_bar_pass_prediction',
  'gender',
  'lsat',
  'pass_bar',
  'race1',
  'ugpa',
]

_LSAT_DF.dropna()
_LSAT_DF['gender'] = _LSAT_DF['gender'].astype(str)
_LSAT_DF['race1'] = _LSAT_DF['race1'].astype(str)
_LSAT_DF = _LSAT_DF[_COLUMN_NAMES]

_LSAT_DF.head()

Configurez les indicateurs d'équité.

Il y a plusieurs paramètres que vous devrez prendre en compte lors de l'utilisation d'indicateurs d'équité avec un DataFrame

  • Votre DataFrame d'entrée doit contenir une colonne de prédiction et une colonne d'étiquette de votre modèle. Par défaut , les indicateurs d' équité recherchera une colonne de prédiction appelée prediction et une colonne d'étiquette appelée label de votre dataframe.

    • Si l'une de ces valeurs n'est pas trouvée, une KeyError sera levée.
  • En plus d'une trame de données, vous aurez également besoin d'inclure un eval_config qui devrait inclure les paramètres de calcul, des tranches pour calculer les métriques sur, et les noms de colonnes par exemple des étiquettes et des prévisions.

    • metrics_specs fixeront les paramètres de calcul. Les FairnessIndicators métriques seront nécessaires pour rendre les mesures d'équité et vous pouvez voir la liste de paramètres facultatifs supplémentaires ici .

    • slicing_specs est un paramètre de découpage en option pour indiquer ce que la fonction que vous êtes intéressé à enquêter. Dans cette étude de cas, race1 est utilisé, mais vous pouvez également définir cette valeur sur une autre caractéristique (par exemple, le sexe dans le contexte de ce DataFrame). Si slicing_specs n'est pas fourni toutes les fonctionnalités seront incluses.

    • Si votre dataframe comprend une colonne d'étiquette ou de prédiction qui est différente de la valeur par défaut de prediction ou l' label , vous pouvez configurer le label_key et prediction_key à une nouvelle valeur.

  • Si output_path n'est pas spécifié un répertoire temporaire sera créé.

# Specify Fairness Indicators in eval_config.
eval_config = text_format.Parse("""
  model_specs {
    prediction_key: 'dnn_bar_pass_prediction',
    label_key: 'pass_bar'
  }
  metrics_specs {
    metrics {class_name: "AUC"}
    metrics {
      class_name: "FairnessIndicators"
      config: '{"thresholds": [0.50, 0.90]}'
    }
  }
  slicing_specs {
    feature_keys: 'race1'
  }
  slicing_specs {}
  """, tfma.EvalConfig())

# Run TensorFlow Model Analysis.
eval_result = tfma.analyze_raw_data(
  data=_LSAT_DF,
  eval_config=eval_config,
  output_path=_DATA_ROOT)
WARNING:apache_beam.runners.interactive.interactive_environment:Dependencies required for Interactive Beam PCollection visualization are not available, please use: `pip install apache-beam[interactive]` to install necessary dependencies to enable all data visualization features.
WARNING:apache_beam.io.tfrecordio:Couldn't find python-snappy so the implementation of _TFRecordUtil._masked_crc32c is not as fast as it could be.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow_model_analysis/writers/metrics_plots_and_validations_writer.py:113: tf_record_iterator (from tensorflow.python.lib.io.tf_record) is deprecated and will be removed in a future version.
Instructions for updating:
Use eager execution and: 
`tf.data.TFRecordDataset(path)`
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow_model_analysis/writers/metrics_plots_and_validations_writer.py:113: tf_record_iterator (from tensorflow.python.lib.io.tf_record) is deprecated and will be removed in a future version.
Instructions for updating:
Use eager execution and: 
`tf.data.TFRecordDataset(path)`

Explorez les performances du modèle avec les indicateurs d'équité.

Après avoir exécuté les indicateurs d'équité, nous pouvons visualiser différentes métriques que nous avons sélectionnées pour analyser les performances de nos modèles. Dans cette étude de cas, nous avons inclus des indicateurs d'équité et choisi arbitrairement l'AUC.

Lorsque nous examinons pour la première fois l'AUC globale pour chaque tranche de course, nous pouvons voir un léger écart dans les performances du modèle, mais rien de vraiment alarmant.

  • Asie: 0,58
  • Noir: 0,58
  • Hispanique: 0,58
  • Autres: 0,64
  • Blanc: 0,6

Cependant, lorsque nous examinons les taux de faux négatifs répartis par race, notre modèle prédit à nouveau de manière incorrecte la probabilité qu'un utilisateur passe la barre à des taux différents et, cette fois, le fait par beaucoup.

  • Asie: 0,01
  • Noir: 0,05
  • Hispanique: 0,02
  • Autre: 0,01
  • Blanc: 0,01

Plus particulièrement, la différence entre les étudiants noirs et blancs est d'environ 380%, ce qui signifie que notre modèle est presque 4 fois plus susceptible de prédire à tort qu'un étudiant noir ne passera pas la barre, qu'un étudiant blanc. Si nous devions poursuivre cet effort, un praticien pourrait utiliser ces résultats comme un signal qu'il devrait passer plus de temps à s'assurer que son modèle fonctionne bien pour des personnes de tous horizons.

# Render Fairness Indicators.
tfma.addons.fairness.view.widget_view.render_fairness_indicator(eval_result)
FairnessIndicatorViewer(slicingMetrics=[{'sliceValue': 'Overall', 'slice': 'Overall', 'metrics': {'auc': {'dou…

tfma.EvalResult

Le eval_result objet, rendu ci - dessus dans render_fairness_indicator() , a sa propre API qui peut être utilisé pour lire les résultats TFMA dans vos programmes.

get_slice_names() et get_metric_names()

Pour obtenir les tranches et les métriques évaluées, vous pouvez utiliser les fonctions respectives.

pp = pprint.PrettyPrinter()

print("Slices:")
pp.pprint(eval_result.get_slice_names())
print("\nMetrics:")
pp.pprint(eval_result.get_metric_names())
Slices:
[(),
 (('race1', 'white'),),
 (('race1', 'hisp'),),
 (('race1', 'asian'),),
 (('race1', 'black'),),
 (('race1', 'nan'),),
 (('race1', 'other'),)]

Metrics:
['fairness_indicators_metrics/negative_rate@0.9',
 'fairness_indicators_metrics/true_negative_rate@0.5',
 'fairness_indicators_metrics/false_positive_rate@0.9',
 'fairness_indicators_metrics/false_discovery_rate@0.9',
 'fairness_indicators_metrics/false_positive_rate@0.5',
 'auc',
 'fairness_indicators_metrics/false_discovery_rate@0.5',
 'fairness_indicators_metrics/false_omission_rate@0.9',
 'fairness_indicators_metrics/false_omission_rate@0.5',
 'fairness_indicators_metrics/true_positive_rate@0.5',
 'fairness_indicators_metrics/positive_rate@0.9',
 'fairness_indicators_metrics/false_negative_rate@0.9',
 'fairness_indicators_metrics/negative_rate@0.5',
 'fairness_indicators_metrics/true_positive_rate@0.9',
 'fairness_indicators_metrics/true_negative_rate@0.9',
 'fairness_indicators_metrics/false_negative_rate@0.5',
 'fairness_indicators_metrics/positive_rate@0.5']

get_metrics_for_slice() et get_metrics_for_all_slices()

Si vous souhaitez obtenir les paramètres pour une tranche particulière, vous pouvez utiliser get_metrics_for_slice() . Il retourne un nom de métrique mapping dictionnaire valeurs métriques .

baseline_slice = ()
black_slice = (('race1', 'black'),)

print("Baseline metric values:")
pp.pprint(eval_result.get_metrics_for_slice(baseline_slice))
print("Black metric values:")
pp.pprint(eval_result.get_metrics_for_slice(black_slice))
Baseline metric values:
{'auc': {'doubleValue': 0.6286112666130066},
 'fairness_indicators_metrics/false_discovery_rate@0.5': {'doubleValue': 0.052173524948674464},
 'fairness_indicators_metrics/false_discovery_rate@0.9': {'doubleValue': 0.0502241746297722},
 'fairness_indicators_metrics/false_negative_rate@0.5': {'doubleValue': 4.7085412939071474e-05},
 'fairness_indicators_metrics/false_negative_rate@0.9': {'doubleValue': 0.012524719841793012},
 'fairness_indicators_metrics/false_omission_rate@0.5': {'doubleValue': 1.0},
 'fairness_indicators_metrics/false_omission_rate@0.9': {'doubleValue': 0.8159509202453987},
 'fairness_indicators_metrics/false_positive_rate@0.5': {'doubleValue': 1.0},
 'fairness_indicators_metrics/false_positive_rate@0.9': {'doubleValue': 0.9486740804106074},
 'fairness_indicators_metrics/negative_rate@0.5': {'doubleValue': 4.462891060829205e-05},
 'fairness_indicators_metrics/negative_rate@0.9': {'doubleValue': 0.014549024858303209},
 'fairness_indicators_metrics/positive_rate@0.5': {'doubleValue': 0.9999553710893917},
 'fairness_indicators_metrics/positive_rate@0.9': {'doubleValue': 0.9854509751416968},
 'fairness_indicators_metrics/true_negative_rate@0.5': {'doubleValue': 0.0},
 'fairness_indicators_metrics/true_negative_rate@0.9': {'doubleValue': 0.05132591958939264},
 'fairness_indicators_metrics/true_positive_rate@0.5': {'doubleValue': 0.9999529145870609},
 'fairness_indicators_metrics/true_positive_rate@0.9': {'doubleValue': 0.987475280158207} }
Black metric values:
{'auc': {'doubleValue': 0.5779293775558472},
 'fairness_indicators_metrics/false_discovery_rate@0.5': {'doubleValue': 0.22189128816083395},
 'fairness_indicators_metrics/false_discovery_rate@0.9': {'doubleValue': 0.21048451151707703},
 'fairness_indicators_metrics/false_negative_rate@0.5': {'doubleValue': 0.0},
 'fairness_indicators_metrics/false_negative_rate@0.9': {'doubleValue': 0.04880382775119617},
 'fairness_indicators_metrics/false_omission_rate@0.5': {'doubleValue': 'NaN'},
 'fairness_indicators_metrics/false_omission_rate@0.9': {'doubleValue': 0.6071428571428571},
 'fairness_indicators_metrics/false_positive_rate@0.5': {'doubleValue': 1.0},
 'fairness_indicators_metrics/false_positive_rate@0.9': {'doubleValue': 0.889261744966443},
 'fairness_indicators_metrics/negative_rate@0.5': {'doubleValue': 0.0},
 'fairness_indicators_metrics/negative_rate@0.9': {'doubleValue': 0.06254653760238273},
 'fairness_indicators_metrics/positive_rate@0.5': {'doubleValue': 1.0},
 'fairness_indicators_metrics/positive_rate@0.9': {'doubleValue': 0.9374534623976173},
 'fairness_indicators_metrics/true_negative_rate@0.5': {'doubleValue': 0.0},
 'fairness_indicators_metrics/true_negative_rate@0.9': {'doubleValue': 0.11073825503355705},
 'fairness_indicators_metrics/true_positive_rate@0.5': {'doubleValue': 1.0},
 'fairness_indicators_metrics/true_positive_rate@0.9': {'doubleValue': 0.9511961722488038} }

Si vous souhaitez obtenir les paramètres pour toutes les tranches, get_metrics_for_all_slices() retourne une cartographie dictionnaire chaque tranche correspondant aux get_metrics_for_slices(slice) .

pp.pprint(eval_result.get_metrics_for_all_slices())
{(): {'auc': {'doubleValue': 0.6286112666130066},
      'fairness_indicators_metrics/false_discovery_rate@0.5': {'doubleValue': 0.052173524948674464},
      'fairness_indicators_metrics/false_discovery_rate@0.9': {'doubleValue': 0.0502241746297722},
      'fairness_indicators_metrics/false_negative_rate@0.5': {'doubleValue': 4.7085412939071474e-05},
      'fairness_indicators_metrics/false_negative_rate@0.9': {'doubleValue': 0.012524719841793012},
      'fairness_indicators_metrics/false_omission_rate@0.5': {'doubleValue': 1.0},
      'fairness_indicators_metrics/false_omission_rate@0.9': {'doubleValue': 0.8159509202453987},
      'fairness_indicators_metrics/false_positive_rate@0.5': {'doubleValue': 1.0},
      'fairness_indicators_metrics/false_positive_rate@0.9': {'doubleValue': 0.9486740804106074},
      'fairness_indicators_metrics/negative_rate@0.5': {'doubleValue': 4.462891060829205e-05},
      'fairness_indicators_metrics/negative_rate@0.9': {'doubleValue': 0.014549024858303209},
      'fairness_indicators_metrics/positive_rate@0.5': {'doubleValue': 0.9999553710893917},
      'fairness_indicators_metrics/positive_rate@0.9': {'doubleValue': 0.9854509751416968},
      'fairness_indicators_metrics/true_negative_rate@0.5': {'doubleValue': 0.0},
      'fairness_indicators_metrics/true_negative_rate@0.9': {'doubleValue': 0.05132591958939264},
      'fairness_indicators_metrics/true_positive_rate@0.5': {'doubleValue': 0.9999529145870609},
      'fairness_indicators_metrics/true_positive_rate@0.9': {'doubleValue': 0.987475280158207} },
 (('race1', 'asian'),): {'auc': {'doubleValue': 0.5817844271659851},
                         'fairness_indicators_metrics/false_discovery_rate@0.5': {'doubleValue': 0.07803790412486064},
                         'fairness_indicators_metrics/false_discovery_rate@0.9': {'doubleValue': 0.07674943566591422},
                         'fairness_indicators_metrics/false_negative_rate@0.5': {'doubleValue': 0.0},
                         'fairness_indicators_metrics/false_negative_rate@0.9': {'doubleValue': 0.010882708585247884},
                         'fairness_indicators_metrics/false_omission_rate@0.5': {'doubleValue': 'NaN'},
                         'fairness_indicators_metrics/false_omission_rate@0.9': {'doubleValue': 0.8181818181818182},
                         'fairness_indicators_metrics/false_positive_rate@0.5': {'doubleValue': 1.0},
                         'fairness_indicators_metrics/false_positive_rate@0.9': {'doubleValue': 0.9714285714285714},
                         'fairness_indicators_metrics/negative_rate@0.5': {'doubleValue': 0.0},
                         'fairness_indicators_metrics/negative_rate@0.9': {'doubleValue': 0.012263099219620958},
                         'fairness_indicators_metrics/positive_rate@0.5': {'doubleValue': 1.0},
                         'fairness_indicators_metrics/positive_rate@0.9': {'doubleValue': 0.987736900780379},
                         'fairness_indicators_metrics/true_negative_rate@0.5': {'doubleValue': 0.0},
                         'fairness_indicators_metrics/true_negative_rate@0.9': {'doubleValue': 0.02857142857142857},
                         'fairness_indicators_metrics/true_positive_rate@0.5': {'doubleValue': 1.0},
                         'fairness_indicators_metrics/true_positive_rate@0.9': {'doubleValue': 0.9891172914147521} },
 (('race1', 'black'),): {'auc': {'doubleValue': 0.5779293775558472},
                         'fairness_indicators_metrics/false_discovery_rate@0.5': {'doubleValue': 0.22189128816083395},
                         'fairness_indicators_metrics/false_discovery_rate@0.9': {'doubleValue': 0.21048451151707703},
                         'fairness_indicators_metrics/false_negative_rate@0.5': {'doubleValue': 0.0},
                         'fairness_indicators_metrics/false_negative_rate@0.9': {'doubleValue': 0.04880382775119617},
                         'fairness_indicators_metrics/false_omission_rate@0.5': {'doubleValue': 'NaN'},
                         'fairness_indicators_metrics/false_omission_rate@0.9': {'doubleValue': 0.6071428571428571},
                         'fairness_indicators_metrics/false_positive_rate@0.5': {'doubleValue': 1.0},
                         'fairness_indicators_metrics/false_positive_rate@0.9': {'doubleValue': 0.889261744966443},
                         'fairness_indicators_metrics/negative_rate@0.5': {'doubleValue': 0.0},
                         'fairness_indicators_metrics/negative_rate@0.9': {'doubleValue': 0.06254653760238273},
                         'fairness_indicators_metrics/positive_rate@0.5': {'doubleValue': 1.0},
                         'fairness_indicators_metrics/positive_rate@0.9': {'doubleValue': 0.9374534623976173},
                         'fairness_indicators_metrics/true_negative_rate@0.5': {'doubleValue': 0.0},
                         'fairness_indicators_metrics/true_negative_rate@0.9': {'doubleValue': 0.11073825503355705},
                         'fairness_indicators_metrics/true_positive_rate@0.5': {'doubleValue': 1.0},
                         'fairness_indicators_metrics/true_positive_rate@0.9': {'doubleValue': 0.9511961722488038} },
 (('race1', 'hisp'),): {'auc': {'doubleValue': 0.5754180550575256},
                        'fairness_indicators_metrics/false_discovery_rate@0.5': {'doubleValue': 0.124634858812074},
                        'fairness_indicators_metrics/false_discovery_rate@0.9': {'doubleValue': 0.12139303482587065},
                        'fairness_indicators_metrics/false_negative_rate@0.5': {'doubleValue': 0.0},
                        'fairness_indicators_metrics/false_negative_rate@0.9': {'doubleValue': 0.017797552836484983},
                        'fairness_indicators_metrics/false_omission_rate@0.5': {'doubleValue': 'NaN'},
                        'fairness_indicators_metrics/false_omission_rate@0.9': {'doubleValue': 0.7272727272727273},
                        'fairness_indicators_metrics/false_positive_rate@0.5': {'doubleValue': 1.0},
                        'fairness_indicators_metrics/false_positive_rate@0.9': {'doubleValue': 0.953125},
                        'fairness_indicators_metrics/negative_rate@0.5': {'doubleValue': 0.0},
                        'fairness_indicators_metrics/negative_rate@0.9': {'doubleValue': 0.021421616358325218},
                        'fairness_indicators_metrics/positive_rate@0.5': {'doubleValue': 1.0},
                        'fairness_indicators_metrics/positive_rate@0.9': {'doubleValue': 0.9785783836416748},
                        'fairness_indicators_metrics/true_negative_rate@0.5': {'doubleValue': 0.0},
                        'fairness_indicators_metrics/true_negative_rate@0.9': {'doubleValue': 0.046875},
                        'fairness_indicators_metrics/true_positive_rate@0.5': {'doubleValue': 1.0},
                        'fairness_indicators_metrics/true_positive_rate@0.9': {'doubleValue': 0.982202447163515} },
 (('race1', 'nan'),): {'auc': {'doubleValue': 0.7142857313156128},
                       'fairness_indicators_metrics/false_discovery_rate@0.5': {'doubleValue': 0.125},
                       'fairness_indicators_metrics/false_discovery_rate@0.9': {'doubleValue': 0.125},
                       'fairness_indicators_metrics/false_negative_rate@0.5': {'doubleValue': 0.0},
                       'fairness_indicators_metrics/false_negative_rate@0.9': {'doubleValue': 0.0},
                       'fairness_indicators_metrics/false_omission_rate@0.5': {'doubleValue': 'NaN'},
                       'fairness_indicators_metrics/false_omission_rate@0.9': {'doubleValue': 'NaN'},
                       'fairness_indicators_metrics/false_positive_rate@0.5': {'doubleValue': 1.0},
                       'fairness_indicators_metrics/false_positive_rate@0.9': {'doubleValue': 1.0},
                       'fairness_indicators_metrics/negative_rate@0.5': {'doubleValue': 0.0},
                       'fairness_indicators_metrics/negative_rate@0.9': {'doubleValue': 0.0},
                       'fairness_indicators_metrics/positive_rate@0.5': {'doubleValue': 1.0},
                       'fairness_indicators_metrics/positive_rate@0.9': {'doubleValue': 1.0},
                       'fairness_indicators_metrics/true_negative_rate@0.5': {'doubleValue': 0.0},
                       'fairness_indicators_metrics/true_negative_rate@0.9': {'doubleValue': 0.0},
                       'fairness_indicators_metrics/true_positive_rate@0.5': {'doubleValue': 1.0},
                       'fairness_indicators_metrics/true_positive_rate@0.9': {'doubleValue': 1.0} },
 (('race1', 'other'),): {'auc': {'doubleValue': 0.6389539241790771},
                         'fairness_indicators_metrics/false_discovery_rate@0.5': {'doubleValue': 0.10294117647058823},
                         'fairness_indicators_metrics/false_discovery_rate@0.9': {'doubleValue': 0.09523809523809523},
                         'fairness_indicators_metrics/false_negative_rate@0.5': {'doubleValue': 0.0},
                         'fairness_indicators_metrics/false_negative_rate@0.9': {'doubleValue': 0.01366120218579235},
                         'fairness_indicators_metrics/false_omission_rate@0.5': {'doubleValue': 'NaN'},
                         'fairness_indicators_metrics/false_omission_rate@0.9': {'doubleValue': 0.5555555555555556},
                         'fairness_indicators_metrics/false_positive_rate@0.5': {'doubleValue': 1.0},
                         'fairness_indicators_metrics/false_positive_rate@0.9': {'doubleValue': 0.9047619047619048},
                         'fairness_indicators_metrics/negative_rate@0.5': {'doubleValue': 0.0},
                         'fairness_indicators_metrics/negative_rate@0.9': {'doubleValue': 0.022058823529411766},
                         'fairness_indicators_metrics/positive_rate@0.5': {'doubleValue': 1.0},
                         'fairness_indicators_metrics/positive_rate@0.9': {'doubleValue': 0.9779411764705882},
                         'fairness_indicators_metrics/true_negative_rate@0.5': {'doubleValue': 0.0},
                         'fairness_indicators_metrics/true_negative_rate@0.9': {'doubleValue': 0.09523809523809523},
                         'fairness_indicators_metrics/true_positive_rate@0.5': {'doubleValue': 1.0},
                         'fairness_indicators_metrics/true_positive_rate@0.9': {'doubleValue': 0.9863387978142076} },
 (('race1', 'white'),): {'auc': {'doubleValue': 0.5987964272499084},
                         'fairness_indicators_metrics/false_discovery_rate@0.5': {'doubleValue': 0.03360940422121293},
                         'fairness_indicators_metrics/false_discovery_rate@0.9': {'doubleValue': 0.03316050982933679},
                         'fairness_indicators_metrics/false_negative_rate@0.5': {'doubleValue': 5.52883286338254e-05},
                         'fairness_indicators_metrics/false_negative_rate@0.9': {'doubleValue': 0.010228340797257698},
                         'fairness_indicators_metrics/false_omission_rate@0.5': {'doubleValue': 1.0},
                         'fairness_indicators_metrics/false_omission_rate@0.9': {'doubleValue': 0.925},
                         'fairness_indicators_metrics/false_positive_rate@0.5': {'doubleValue': 1.0},
                         'fairness_indicators_metrics/false_positive_rate@0.9': {'doubleValue': 0.9761526232114467},
                         'fairness_indicators_metrics/negative_rate@0.5': {'doubleValue': 5.3430220132506944e-05},
                         'fairness_indicators_metrics/negative_rate@0.9': {'doubleValue': 0.010686044026501388},
                         'fairness_indicators_metrics/positive_rate@0.5': {'doubleValue': 0.9999465697798675},
                         'fairness_indicators_metrics/positive_rate@0.9': {'doubleValue': 0.9893139559734986},
                         'fairness_indicators_metrics/true_negative_rate@0.5': {'doubleValue': 0.0},
                         'fairness_indicators_metrics/true_negative_rate@0.9': {'doubleValue': 0.02384737678855326},
                         'fairness_indicators_metrics/true_positive_rate@0.5': {'doubleValue': 0.9999447116713662},
                         'fairness_indicators_metrics/true_positive_rate@0.9': {'doubleValue': 0.9897716592027423} } }

Conclusion

Dans cette étude de cas, nous avons importé un ensemble de données dans un Pandas DataFrame que nous avons ensuite analysé avec des indicateurs d'équité. Comprendre les résultats de votre modèle et des données sous-jacentes est une étape importante pour garantir que votre modèle ne reflète pas un biais préjudiciable. Dans le contexte de cette étude de cas, nous avons examiné l'ensemble de données du LSAC et comment les prédictions de ces données pourraient être impactées par une course d'étudiants. Le concept de « ce qui est injuste et de ce qui est juste a été introduit dans plusieurs disciplines depuis plus de 50 ans, notamment dans l'éducation, l'embauche et l'apprentissage automatique ». 1 L' équité indicateur est un outil pour aider à atténuer les préoccupations d'équité dans votre modèle d' apprentissage machine.

Pour plus d' informations sur l' utilisation des indicateurs d' équité et de ressources pour en savoir plus sur les préoccupations d'équité voir ici .


  1. Hutchinson, B., Mitchell, M. (2018). 50 ans de (non)équité de test : leçons pour l'apprentissage automatique. https://arxiv.org/abs/1811.10104

appendice

Vous trouverez ci-dessous quelques fonctions permettant de convertir les modèles ML en Pandas DataFrame.

# TensorFlow Estimator to Pandas DataFrame:

# _X_VALUE =  # X value of binary estimator.
# _Y_VALUE =  # Y value of binary estimator.
# _GROUND_TRUTH_LABEL =  # Ground truth value of binary estimator.

def _get_predicted_probabilities(estimator, input_df, get_input_fn):
  predictions = estimator.predict(
      input_fn=get_input_fn(input_df=input_df, num_epochs=1))
  return [prediction['probabilities'][1] for prediction in predictions]

def _get_input_fn_law(input_df, num_epochs, batch_size=None):
  return tf.compat.v1.estimator.inputs.pandas_input_fn(
      x=input_df[[_X_VALUE, _Y_VALUE]],
      y=input_df[_GROUND_TRUTH_LABEL],
      num_epochs=num_epochs,
      batch_size=batch_size or len(input_df),
      shuffle=False)

def estimator_to_dataframe(estimator, input_df, num_keypoints=20):
  x = np.linspace(min(input_df[_X_VALUE]), max(input_df[_X_VALUE]), num_keypoints)
  y = np.linspace(min(input_df[_Y_VALUE]), max(input_df[_Y_VALUE]), num_keypoints)

  x_grid, y_grid = np.meshgrid(x, y)

  positions = np.vstack([x_grid.ravel(), y_grid.ravel()])
  plot_df = pd.DataFrame(positions.T, columns=[_X_VALUE, _Y_VALUE])
  plot_df[_GROUND_TRUTH_LABEL] = np.ones(len(plot_df))
  predictions = _get_predicted_probabilities(
      estimator=estimator, input_df=plot_df, get_input_fn=_get_input_fn_law)
  return pd.DataFrame(
      data=np.array(np.reshape(predictions, x_grid.shape)).flatten())