Introduction aux indicateurs d'équité

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

Aperçu

Les indicateurs d' équité est une suite d'outils intégrés au - dessus de tensorflow modèle d' analyse (TFMA) qui permettent une évaluation régulière des mesures d'équité dans les pipelines de produits. TFMA est une bibliothèque permettant d'évaluer les modèles d'apprentissage automatique TensorFlow et non TensorFlow. Il vous permet d'évaluer vos modèles sur de grandes quantités de données de manière distribuée, de calculer des graphiques et d'autres métriques sur différentes tranches de données et de les visualiser dans des cahiers.

Les indicateurs d' équité est fourni avec tensorflow validation de données (TFDV) et What-If outil . L'utilisation d'indicateurs d'équité vous permet de :

  • Évaluer les performances du modèle, réparties sur des groupes d'utilisateurs définis
  • Gagnez en confiance sur les résultats avec des intervalles de confiance et des évaluations à plusieurs seuils
  • Évaluer la distribution des ensembles de données
  • Plongez en profondeur dans les tranches individuelles pour explorer les causes profondes et les opportunités d'amélioration

Dans ce cahier, vous utiliserez les indicateurs d' équité pour résoudre les problèmes d'équité dans un modèle que vous entraînez en utilisant l' ensemble de données Civil Commentaires . Regardez cette vidéo pour plus de détails et le contexte sur le scénario du monde réel est basé sur ce qui est aussi l' une des principales motivations pour la création d' indicateurs d' équité.

Base de données

Dans ce cahier, vous travaillerez avec l' ensemble de données Civil Commentaires , environ 2 millions de commentaires publics rendus publics par la Civil Commentaires plate - forme en 2017 pour la recherche en cours. Cet effort a été parrainé par Jigsaw , qui ont accueilli des concours sur Kaggle pour classer les commentaires toxiques ainsi que de minimiser le biais du modèle involontaire.

Chaque commentaire de texte individuel dans l'ensemble de données a une étiquette de toxicité, l'étiquette étant 1 si le commentaire est toxique et 0 si le commentaire est non toxique. Dans les données, un sous-ensemble de commentaires est étiqueté avec une variété d'attributs d'identité, y compris des catégories pour le sexe, l'orientation sexuelle, la religion et la race ou l'origine ethnique.

Installer

Installer l' fairness-indicators et witwidget .

pip install -q -U pip==20.2

pip install -q fairness-indicators
pip install -q witwidget

Vous devez redémarrer l'environnement d'exécution Colab après l'installation. Sélectionnez Runtime> Redémarrer l' exécution dans le menu Colab.

Ne poursuivez pas le reste de ce didacticiel sans avoir au préalable redémarré l'environnement d'exécution.

Importez toutes les autres bibliothèques requises.

import os
import tempfile
import apache_beam as beam
import numpy as np
import pandas as pd
from datetime import datetime
import pprint

from google.protobuf import text_format

import tensorflow_hub as hub
import tensorflow as tf
import tensorflow_model_analysis as tfma
import tensorflow_data_validation as tfdv

from tfx_bsl.tfxio import tensor_adapter
from tfx_bsl.tfxio import tf_example_record

from tensorflow_model_analysis.addons.fairness.post_export_metrics import fairness_indicators
from tensorflow_model_analysis.addons.fairness.view import widget_view

from fairness_indicators.tutorial_utils import util

from witwidget.notebook.visualization import WitConfigBuilder
from witwidget.notebook.visualization import WitWidget

from tensorflow_metadata.proto.v0 import schema_pb2

Télécharger et analyser les données

Par défaut, ce bloc-notes télécharge une version prétraitée de cet ensemble de données, mais vous pouvez utiliser l'ensemble de données d'origine et réexécuter les étapes de traitement si vous le souhaitez. Dans l'ensemble de données d'origine, chaque commentaire est étiqueté avec le pourcentage d'évaluateurs qui pensent qu'un commentaire correspond à une identité particulière. Par exemple, un commentaire peut être libellé comme suit : { masculin : 0,3, féminin : 1,0, transgenre : 0,0, hétérosexuel : 0,8, homosexual_gay_or_lesbian : 1,0 } L'étape de traitement regroupe l'identité par catégorie (genre, orientation_sexuelle, etc.) et supprime identités avec un score inférieur à 0,5. Ainsi, l'exemple ci-dessus serait converti en ce qui suit : des évaluateurs qui pensent qu'un commentaire correspond à une identité particulière. Par exemple, le commentaire serait libellé comme suit : { gender : [female], sexual_orientation : [heterosexual, homosexual_gay_or_lesbian] }

download_original_data = False

if download_original_data:
  train_tf_file = tf.keras.utils.get_file('train_tf.tfrecord',
                                          'https://storage.googleapis.com/civil_comments_dataset/train_tf.tfrecord')
  validate_tf_file = tf.keras.utils.get_file('validate_tf.tfrecord',
                                             'https://storage.googleapis.com/civil_comments_dataset/validate_tf.tfrecord')

  # The identity terms list will be grouped together by their categories
  # (see 'IDENTITY_COLUMNS') on threshould 0.5. Only the identity term column,
  # text column and label column will be kept after processing.
  train_tf_file = util.convert_comments_data(train_tf_file)
  validate_tf_file = util.convert_comments_data(validate_tf_file)

else:
  train_tf_file = tf.keras.utils.get_file('train_tf_processed.tfrecord',
                                          'https://storage.googleapis.com/civil_comments_dataset/train_tf_processed.tfrecord')
  validate_tf_file = tf.keras.utils.get_file('validate_tf_processed.tfrecord',
                                             'https://storage.googleapis.com/civil_comments_dataset/validate_tf_processed.tfrecord')

Utilisez TFDV pour analyser les données et y trouver des problèmes potentiels, tels que des valeurs manquantes et des déséquilibres de données, qui peuvent entraîner des disparités d'équité.

stats = tfdv.generate_statistics_from_tfrecord(data_location=train_tf_file)
tfdv.visualize_statistics(stats)
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:root:Make sure that locally built Python SDK docker image has Python 3.7 interpreter.
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_data_validation/utils/stats_util.py:247: 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_data_validation/utils/stats_util.py:247: 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)`

TFDV montre qu'il existe des déséquilibres importants dans les données qui pourraient conduire à des résultats de modèle biaisés.

  • L'étiquette de toxicité (la valeur prédite par le modèle) est déséquilibrée. Seuls 8 % des exemples de l'ensemble d'apprentissage sont toxiques, ce qui signifie qu'un classificateur pourrait obtenir une précision de 92 % en prédisant que tous les commentaires sont non toxiques.

  • Dans les domaines relatifs aux termes identitaires, seuls 6,6k des 1,08 million (0,61 %) d'exemples de formation traitent de l'homosexualité, et ceux liés à la bisexualité sont encore plus rares. Cela indique que les performances sur ces tranches peuvent souffrir du manque de données d'entraînement.

Préparer les données

Définissez une carte des caractéristiques pour analyser les données. Chaque exemple aura une étiquette, le texte de commentaire, et l' identité comporte l' sexual orientation , le gender , la religion , la race et le disability qui sont associés au texte.

BASE_DIR = tempfile.gettempdir()

TEXT_FEATURE = 'comment_text'
LABEL = 'toxicity'
FEATURE_MAP = {
    # Label:
    LABEL: tf.io.FixedLenFeature([], tf.float32),
    # Text:
    TEXT_FEATURE:  tf.io.FixedLenFeature([], tf.string),

    # Identities:
    'sexual_orientation':tf.io.VarLenFeature(tf.string),
    'gender':tf.io.VarLenFeature(tf.string),
    'religion':tf.io.VarLenFeature(tf.string),
    'race':tf.io.VarLenFeature(tf.string),
    'disability':tf.io.VarLenFeature(tf.string),
}

Ensuite, configurez une fonction d'entrée pour alimenter le modèle en données. Ajoutez une colonne de pondération à chaque exemple et augmentez la pondération des exemples toxiques pour tenir compte du déséquilibre de classe identifié par le TFDV. N'utilisez que des fonctionnalités d'identité pendant la phase d'évaluation, car seuls les commentaires sont introduits dans le modèle pendant la formation.

def train_input_fn():
  def parse_function(serialized):
    parsed_example = tf.io.parse_single_example(
        serialized=serialized, features=FEATURE_MAP)
    # Adds a weight column to deal with unbalanced classes.
    parsed_example['weight'] = tf.add(parsed_example[LABEL], 0.1)
    return (parsed_example,
            parsed_example[LABEL])
  train_dataset = tf.data.TFRecordDataset(
      filenames=[train_tf_file]).map(parse_function).batch(512)
  return train_dataset

Former le modèle

Créez et entraînez un modèle d'apprentissage en profondeur sur les données.

model_dir = os.path.join(BASE_DIR, 'train', datetime.now().strftime(
    "%Y%m%d-%H%M%S"))

embedded_text_feature_column = hub.text_embedding_column(
    key=TEXT_FEATURE,
    module_spec='https://tfhub.dev/google/nnlm-en-dim128/1')

classifier = tf.estimator.DNNClassifier(
    hidden_units=[500, 100],
    weight_column='weight',
    feature_columns=[embedded_text_feature_column],
    optimizer=tf.keras.optimizers.Adagrad(learning_rate=0.003),
    loss_reduction=tf.losses.Reduction.SUM,
    n_classes=2,
    model_dir=model_dir)

classifier.train(input_fn=train_input_fn, steps=1000)
INFO:tensorflow:Using default config.
INFO:tensorflow:Using default config.
INFO:tensorflow:Using config: {'_model_dir': '/tmp/train/20210923-205025', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true
graph_options {
  rewrite_options {
    meta_optimizer_iterations: ONE
  }
}
, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_checkpoint_save_graph_def': True, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}
INFO:tensorflow:Using config: {'_model_dir': '/tmp/train/20210923-205025', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true
graph_options {
  rewrite_options {
    meta_optimizer_iterations: ONE
  }
}
, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_checkpoint_save_graph_def': True, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/training/training_util.py:236: Variable.initialized_value (from tensorflow.python.ops.variables) is deprecated and will be removed in a future version.
Instructions for updating:
Use Variable.read_value. Variables in 2.X are initialized automatically both in eager and graph (inside tf.defun) contexts.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/training/training_util.py:236: Variable.initialized_value (from tensorflow.python.ops.variables) is deprecated and will be removed in a future version.
Instructions for updating:
Use Variable.read_value. Variables in 2.X are initialized automatically both in eager and graph (inside tf.defun) contexts.
INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Saver not created because there are no variables in the graph to restore
2021-09-23 20:50:26.540914: W tensorflow/core/common_runtime/graph_constructor.cc:1511] Importing a graph with a lower producer version 26 into an existing graph with producer version 808. Shape inference will have run different parts of the graph with different producer versions.
INFO:tensorflow:Saver not created because there are no variables in the graph to restore
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow_estimator/python/estimator/head/base_head.py:512: NumericColumn._get_dense_tensor (from tensorflow.python.feature_column.feature_column_v2) is deprecated and will be removed in a future version.
Instructions for updating:
The old _FeatureColumn APIs are being deprecated. Please use the new FeatureColumn APIs instead.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow_estimator/python/estimator/head/base_head.py:512: NumericColumn._get_dense_tensor (from tensorflow.python.feature_column.feature_column_v2) is deprecated and will be removed in a future version.
Instructions for updating:
The old _FeatureColumn APIs are being deprecated. Please use the new FeatureColumn APIs instead.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/feature_column/feature_column.py:2192: NumericColumn._transform_feature (from tensorflow.python.feature_column.feature_column_v2) is deprecated and will be removed in a future version.
Instructions for updating:
The old _FeatureColumn APIs are being deprecated. Please use the new FeatureColumn APIs instead.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/feature_column/feature_column.py:2192: NumericColumn._transform_feature (from tensorflow.python.feature_column.feature_column_v2) is deprecated and will be removed in a future version.
Instructions for updating:
The old _FeatureColumn APIs are being deprecated. Please use the new FeatureColumn APIs instead.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/keras/optimizer_v2/adagrad.py:84: calling Constant.__init__ (from tensorflow.python.ops.init_ops) with dtype is deprecated and will be removed in a future version.
Instructions for updating:
Call initializer instance with the dtype argument instead of passing it to the constructor
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/keras/optimizer_v2/adagrad.py:84: calling Constant.__init__ (from tensorflow.python.ops.init_ops) with dtype is deprecated and will be removed in a future version.
Instructions for updating:
Call initializer instance with the dtype argument instead of passing it to the constructor
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Create CheckpointSaverHook.
INFO:tensorflow:Create CheckpointSaverHook.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0...
INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0...
INFO:tensorflow:Saving checkpoints for 0 into /tmp/train/20210923-205025/model.ckpt.
INFO:tensorflow:Saving checkpoints for 0 into /tmp/train/20210923-205025/model.ckpt.
INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...
INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...
INFO:tensorflow:loss = 59.34932, step = 0
INFO:tensorflow:loss = 59.34932, step = 0
INFO:tensorflow:global_step/sec: 108.435
INFO:tensorflow:global_step/sec: 108.435
INFO:tensorflow:loss = 56.416668, step = 100 (0.924 sec)
INFO:tensorflow:loss = 56.416668, step = 100 (0.924 sec)
INFO:tensorflow:global_step/sec: 116.367
INFO:tensorflow:global_step/sec: 116.367
INFO:tensorflow:loss = 47.250374, step = 200 (0.859 sec)
INFO:tensorflow:loss = 47.250374, step = 200 (0.859 sec)
INFO:tensorflow:global_step/sec: 116.333
INFO:tensorflow:global_step/sec: 116.333
INFO:tensorflow:loss = 55.81682, step = 300 (0.860 sec)
INFO:tensorflow:loss = 55.81682, step = 300 (0.860 sec)
INFO:tensorflow:global_step/sec: 116.844
INFO:tensorflow:global_step/sec: 116.844
INFO:tensorflow:loss = 55.814293, step = 400 (0.856 sec)
INFO:tensorflow:loss = 55.814293, step = 400 (0.856 sec)
INFO:tensorflow:global_step/sec: 114.434
INFO:tensorflow:global_step/sec: 114.434
INFO:tensorflow:loss = 41.805046, step = 500 (0.874 sec)
INFO:tensorflow:loss = 41.805046, step = 500 (0.874 sec)
INFO:tensorflow:global_step/sec: 115.693
INFO:tensorflow:global_step/sec: 115.693
INFO:tensorflow:loss = 45.53726, step = 600 (0.864 sec)
INFO:tensorflow:loss = 45.53726, step = 600 (0.864 sec)
INFO:tensorflow:global_step/sec: 115.772
INFO:tensorflow:global_step/sec: 115.772
INFO:tensorflow:loss = 51.17028, step = 700 (0.864 sec)
INFO:tensorflow:loss = 51.17028, step = 700 (0.864 sec)
INFO:tensorflow:global_step/sec: 116.131
INFO:tensorflow:global_step/sec: 116.131
INFO:tensorflow:loss = 47.696205, step = 800 (0.861 sec)
INFO:tensorflow:loss = 47.696205, step = 800 (0.861 sec)
INFO:tensorflow:global_step/sec: 115.609
INFO:tensorflow:global_step/sec: 115.609
INFO:tensorflow:loss = 47.800926, step = 900 (0.865 sec)
INFO:tensorflow:loss = 47.800926, step = 900 (0.865 sec)
INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 1000...
INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 1000...
INFO:tensorflow:Saving checkpoints for 1000 into /tmp/train/20210923-205025/model.ckpt.
INFO:tensorflow:Saving checkpoints for 1000 into /tmp/train/20210923-205025/model.ckpt.
INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 1000...
INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 1000...
INFO:tensorflow:Loss for final step: 50.67367.
INFO:tensorflow:Loss for final step: 50.67367.
<tensorflow_estimator.python.estimator.canned.dnn.DNNClassifierV2 at 0x7f113351ebd0>

Analyser le modèle

Après avoir obtenu le modèle formé, analysez-le pour calculer des métriques d'équité à l'aide de TFMA et d'indicateurs d'équité. Commencez par exporter le modèle en tant que SavedModel .

Exporter le modèle enregistré

def eval_input_receiver_fn():
  serialized_tf_example = tf.compat.v1.placeholder(
      dtype=tf.string, shape=[None], name='input_example_placeholder')

  # This *must* be a dictionary containing a single key 'examples', which
  # points to the input placeholder.
  receiver_tensors = {'examples': serialized_tf_example}

  features = tf.io.parse_example(serialized_tf_example, FEATURE_MAP)
  features['weight'] = tf.ones_like(features[LABEL])

  return tfma.export.EvalInputReceiver(
    features=features,
    receiver_tensors=receiver_tensors,
    labels=features[LABEL])

tfma_export_dir = tfma.export.export_eval_savedmodel(
  estimator=classifier,
  export_dir_base=os.path.join(BASE_DIR, 'tfma_eval_model'),
  eval_input_receiver_fn=eval_input_receiver_fn)
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow_model_analysis/eval_saved_model/encoding.py:141: build_tensor_info (from tensorflow.python.saved_model.utils_impl) is deprecated and will be removed in a future version.
Instructions for updating:
This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.utils.build_tensor_info or tf.compat.v1.saved_model.build_tensor_info.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow_model_analysis/eval_saved_model/encoding.py:141: build_tensor_info (from tensorflow.python.saved_model.utils_impl) is deprecated and will be removed in a future version.
Instructions for updating:
This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.utils.build_tensor_info or tf.compat.v1.saved_model.build_tensor_info.
INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Saver not created because there are no variables in the graph to restore
2021-09-23 20:50:39.359797: W tensorflow/core/common_runtime/graph_constructor.cc:1511] Importing a graph with a lower producer version 26 into an existing graph with producer version 808. Shape inference will have run different parts of the graph with different producer versions.
INFO:tensorflow:Saver not created because there are no variables in the graph to restore
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Signatures INCLUDED in export for Classify: None
INFO:tensorflow:Signatures INCLUDED in export for Classify: None
INFO:tensorflow:Signatures INCLUDED in export for Regress: None
INFO:tensorflow:Signatures INCLUDED in export for Regress: None
INFO:tensorflow:Signatures INCLUDED in export for Predict: None
INFO:tensorflow:Signatures INCLUDED in export for Predict: None
INFO:tensorflow:Signatures INCLUDED in export for Train: None
INFO:tensorflow:Signatures INCLUDED in export for Train: None
INFO:tensorflow:Signatures INCLUDED in export for Eval: ['eval']
INFO:tensorflow:Signatures INCLUDED in export for Eval: ['eval']
WARNING:tensorflow:Export includes no default signature!
WARNING:tensorflow:Export includes no default signature!
INFO:tensorflow:Restoring parameters from /tmp/train/20210923-205025/model.ckpt-1000
INFO:tensorflow:Restoring parameters from /tmp/train/20210923-205025/model.ckpt-1000
INFO:tensorflow:Assets added to graph.
INFO:tensorflow:Assets added to graph.
INFO:tensorflow:Assets written to: /tmp/tfma_eval_model/temp-1632430239/assets
INFO:tensorflow:Assets written to: /tmp/tfma_eval_model/temp-1632430239/assets
INFO:tensorflow:SavedModel written to: /tmp/tfma_eval_model/temp-1632430239/saved_model.pb
INFO:tensorflow:SavedModel written to: /tmp/tfma_eval_model/temp-1632430239/saved_model.pb

Calculer les métriques d'équité

Sélectionnez l'identité pour laquelle calculer les métriques et si vous souhaitez exécuter avec des intervalles de confiance à l'aide de la liste déroulante dans le panneau de droite.

Options de calcul des indicateurs d'équité

Slice selection: sexual_orientation
Compute confidence intervals: False
WARNING:root:Make sure that locally built Python SDK docker image has Python 3.7 interpreter.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow_model_analysis/eval_saved_model/load.py:169: load (from tensorflow.python.saved_model.loader_impl) is deprecated and will be removed in a future version.
Instructions for updating:
This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.loader.load or tf.compat.v1.saved_model.load. There will be a new function for importing SavedModels in Tensorflow 2.0.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow_model_analysis/eval_saved_model/load.py:169: load (from tensorflow.python.saved_model.loader_impl) is deprecated and will be removed in a future version.
Instructions for updating:
This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.loader.load or tf.compat.v1.saved_model.load. There will be a new function for importing SavedModels in Tensorflow 2.0.
INFO:tensorflow:Restoring parameters from /tmp/tfma_eval_model/1632430239/variables/variables
INFO:tensorflow:Restoring parameters from /tmp/tfma_eval_model/1632430239/variables/variables
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow_model_analysis/eval_saved_model/graph_ref.py:189: get_tensor_from_tensor_info (from tensorflow.python.saved_model.utils_impl) is deprecated and will be removed in a future version.
Instructions for updating:
This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.utils.get_tensor_from_tensor_info or tf.compat.v1.saved_model.get_tensor_from_tensor_info.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow_model_analysis/eval_saved_model/graph_ref.py:189: get_tensor_from_tensor_info (from tensorflow.python.saved_model.utils_impl) is deprecated and will be removed in a future version.
Instructions for updating:
This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.utils.get_tensor_from_tensor_info or tf.compat.v1.saved_model.get_tensor_from_tensor_info.
WARNING:apache_beam.io.filebasedsink:Deleting 1 existing files in target path matching: 
WARNING:apache_beam.io.filebasedsink:Deleting 1 existing files in target path matching: 
WARNING:apache_beam.io.filebasedsink:Deleting 1 existing files in target path matching:

Visualisez les données à l'aide de l'outil de simulation

Dans cette section, vous utiliserez l'interface visuelle interactive de l'outil What-If pour explorer et manipuler les données à un micro-niveau.

Chaque point du nuage de points sur le panneau de droite représente l'un des exemples du sous-ensemble chargé dans l'outil. Cliquez sur l'un des points pour voir les détails de cet exemple particulier dans le panneau de gauche. Le texte du commentaire, la toxicité de la vérité terrain et les identités applicables sont affichés. En bas de ce panneau de gauche, vous voyez les résultats d'inférence du modèle que vous venez d'entraîner.

Modifier le texte de l'exemple, puis cliquez sur le bouton d'inférence Exécuter pour afficher la façon dont vos modifications ont provoqué la prédiction de la toxicité perçue au changement.

DEFAULT_MAX_EXAMPLES = 1000

# Load 100000 examples in memory. When first rendered, 
# What-If Tool should only display 1000 of these due to browser constraints.
def wit_dataset(file, num_examples=100000):
  dataset = tf.data.TFRecordDataset(
      filenames=[file]).take(num_examples)
  return [tf.train.Example.FromString(d.numpy()) for d in dataset]

wit_data = wit_dataset(train_tf_file)
config_builder = WitConfigBuilder(wit_data[:DEFAULT_MAX_EXAMPLES]).set_estimator_and_feature_spec(
    classifier, FEATURE_MAP).set_label_vocab(['non-toxicity', LABEL]).set_target_feature(LABEL)
wit = WitWidget(config_builder)

Indicateurs d'équité de rendu

Affichez le widget Indicateurs d'équité avec les résultats d'évaluation exportés.

Ci-dessous, vous verrez des graphiques à barres affichant les performances de chaque tranche de données sur les métriques sélectionnées. Vous pouvez ajuster la tranche de comparaison de la ligne de base ainsi que le ou les seuils affichés à l'aide des menus déroulants en haut de la visualisation.

Le widget Indicateur d'équité est intégré à l'outil What-If rendu ci-dessus. Si vous sélectionnez une tranche des données dans le graphique à barres, l'outil What-If se mettra à jour pour vous montrer des exemples de la tranche sélectionnée. Lorsque les rechargements de données dans le What-If Outil ci - dessus, essayez de modifier des couleurs par la toxicité. Cela peut vous donner une compréhension visuelle du bilan de toxicité des exemples par tranche.

event_handlers={'slice-selected':
                wit.create_selection_callback(wit_data, DEFAULT_MAX_EXAMPLES)}
widget_view.render_fairness_indicator(eval_result=eval_result,
                                      slicing_column=slice_selection,
                                      event_handlers=event_handlers
                                      )
FairnessIndicatorViewer(slicingMetrics=[{'sliceValue': 'Overall', 'slice': 'Overall', 'metrics': {'prediction/…

Avec cet ensemble de données et cette tâche particuliers, des taux de faux positifs et de faux négatifs systématiquement plus élevés pour certaines identités peuvent avoir des conséquences négatives. Par exemple, dans un système de modération de contenu, un taux de faux positifs plus élevé que l'ensemble pour un certain groupe peut entraîner le silence de ces voix. Ainsi, il est important d'évaluer régulièrement ces types de critères lorsque vous développez et améliorez des modèles, et d'utiliser des outils tels que les indicateurs d'équité, TFDV et WIT pour vous aider à mettre en lumière les problèmes potentiels. Une fois que vous avez identifié les problèmes d'équité, vous pouvez expérimenter de nouvelles sources de données, l'équilibrage des données ou d'autres techniques pour améliorer les performances sur les groupes les moins performants.

Voir ici pour plus d' informations et des conseils sur la façon d'utiliser des indicateurs d' équité.

Utiliser les résultats de l'évaluation de l'équité

Le eval_result objet, rendu ci - dessus dans render_fairness_indicator() , a sa propre API que vous pouvez exploiter pour lire les résultats TFMA dans vos programmes.

Obtenez des tranches et des métriques évaluées

Utilisez get_slice_names() et get_metric_names() pour obtenir respectivement les tranches évaluées et métriques.

pp = pprint.PrettyPrinter()

print("Slices:")
pp.pprint(eval_result.get_slice_names())
print("\nMetrics:")
pp.pprint(eval_result.get_metric_names())
Slices:
[(),
 (('sexual_orientation', 'homosexual_gay_or_lesbian'),),
 (('sexual_orientation', 'heterosexual'),),
 (('sexual_orientation', 'bisexual'),),
 (('sexual_orientation', 'other_sexual_orientation'),)]

Metrics:
['fairness_indicators_metrics/negative_rate@0.1',
 'fairness_indicators_metrics/positive_rate@0.7',
 'fairness_indicators_metrics/false_discovery_rate@0.9',
 'fairness_indicators_metrics/false_negative_rate@0.3',
 'fairness_indicators_metrics/false_omission_rate@0.1',
 'accuracy',
 'fairness_indicators_metrics/false_discovery_rate@0.7',
 'fairness_indicators_metrics/false_negative_rate@0.7',
 'label/mean',
 'fairness_indicators_metrics/true_positive_rate@0.5',
 'fairness_indicators_metrics/false_positive_rate@0.1',
 'recall',
 'fairness_indicators_metrics/false_omission_rate@0.7',
 'fairness_indicators_metrics/false_positive_rate@0.7',
 'auc_precision_recall',
 'fairness_indicators_metrics/negative_rate@0.7',
 'fairness_indicators_metrics/negative_rate@0.3',
 'fairness_indicators_metrics/false_discovery_rate@0.3',
 'fairness_indicators_metrics/true_negative_rate@0.9',
 'fairness_indicators_metrics/false_omission_rate@0.3',
 'fairness_indicators_metrics/false_negative_rate@0.1',
 'fairness_indicators_metrics/true_negative_rate@0.3',
 'fairness_indicators_metrics/true_positive_rate@0.7',
 'fairness_indicators_metrics/false_positive_rate@0.3',
 'fairness_indicators_metrics/true_positive_rate@0.1',
 'fairness_indicators_metrics/true_positive_rate@0.9',
 'fairness_indicators_metrics/false_negative_rate@0.9',
 'fairness_indicators_metrics/positive_rate@0.5',
 'fairness_indicators_metrics/positive_rate@0.9',
 'fairness_indicators_metrics/negative_rate@0.9',
 'fairness_indicators_metrics/true_negative_rate@0.1',
 'fairness_indicators_metrics/false_omission_rate@0.5',
 'post_export_metrics/example_count',
 'fairness_indicators_metrics/false_omission_rate@0.9',
 'fairness_indicators_metrics/negative_rate@0.5',
 'fairness_indicators_metrics/false_positive_rate@0.5',
 'fairness_indicators_metrics/positive_rate@0.3',
 'prediction/mean',
 'accuracy_baseline',
 'fairness_indicators_metrics/true_negative_rate@0.5',
 'fairness_indicators_metrics/false_discovery_rate@0.5',
 'fairness_indicators_metrics/false_discovery_rate@0.1',
 'precision',
 'fairness_indicators_metrics/false_positive_rate@0.9',
 'fairness_indicators_metrics/true_positive_rate@0.3',
 'auc',
 'average_loss',
 'fairness_indicators_metrics/positive_rate@0.1',
 'fairness_indicators_metrics/false_negative_rate@0.5',
 'fairness_indicators_metrics/true_negative_rate@0.7']

Utilisez get_metrics_for_slice() pour obtenir les paramètres pour une tranche particulière en tant que noms de métriques mappage dictionnaire valeurs métriques .

baseline_slice = ()
heterosexual_slice = (('sexual_orientation', 'heterosexual'),)

print("Baseline metric values:")
pp.pprint(eval_result.get_metrics_for_slice(baseline_slice))
print("\nHeterosexual metric values:")
pp.pprint(eval_result.get_metrics_for_slice(heterosexual_slice))
Baseline metric values:
{'accuracy': {'doubleValue': 0.7174859642982483},
 'accuracy_baseline': {'doubleValue': 0.9198060631752014},
 'auc': {'doubleValue': 0.796409547328949},
 'auc_precision_recall': {'doubleValue': 0.3000231087207794},
 'average_loss': {'doubleValue': 0.5615971088409424},
 'fairness_indicators_metrics/false_discovery_rate@0.1': {'doubleValue': 0.9139404145348933},
 'fairness_indicators_metrics/false_discovery_rate@0.3': {'doubleValue': 0.8796606156634021},
 'fairness_indicators_metrics/false_discovery_rate@0.5': {'doubleValue': 0.816806708107944},
 'fairness_indicators_metrics/false_discovery_rate@0.7': {'doubleValue': 0.7090802784427505},
 'fairness_indicators_metrics/false_discovery_rate@0.9': {'doubleValue': 0.4814937210839392},
 'fairness_indicators_metrics/false_negative_rate@0.1': {'doubleValue': 0.006079867348348763},
 'fairness_indicators_metrics/false_negative_rate@0.3': {'doubleValue': 0.08696628437197734},
 'fairness_indicators_metrics/false_negative_rate@0.5': {'doubleValue': 0.2705713693519414},
 'fairness_indicators_metrics/false_negative_rate@0.7': {'doubleValue': 0.5445108470360647},
 'fairness_indicators_metrics/false_negative_rate@0.9': {'doubleValue': 0.891598728755009},
 'fairness_indicators_metrics/false_omission_rate@0.1': {'doubleValue': 0.006604499315158452},
 'fairness_indicators_metrics/false_omission_rate@0.3': {'doubleValue': 0.017811407791031682},
 'fairness_indicators_metrics/false_omission_rate@0.5': {'doubleValue': 0.03187681488249431},
 'fairness_indicators_metrics/false_omission_rate@0.7': {'doubleValue': 0.04993640137936933},
 'fairness_indicators_metrics/false_omission_rate@0.9': {'doubleValue': 0.07271999842219298},
 'fairness_indicators_metrics/false_positive_rate@0.1': {'doubleValue': 0.9202700382800194},
 'fairness_indicators_metrics/false_positive_rate@0.3': {'doubleValue': 0.5818879187535954},
 'fairness_indicators_metrics/false_positive_rate@0.5': {'doubleValue': 0.28355525303665063},
 'fairness_indicators_metrics/false_positive_rate@0.7': {'doubleValue': 0.09679333307231039},
 'fairness_indicators_metrics/false_positive_rate@0.9': {'doubleValue': 0.00877639469079322},
 'fairness_indicators_metrics/negative_rate@0.1': {'doubleValue': 0.07382367199944595},
 'fairness_indicators_metrics/negative_rate@0.3': {'doubleValue': 0.39155620195304386},
 'fairness_indicators_metrics/negative_rate@0.5': {'doubleValue': 0.6806884133250225},
 'fairness_indicators_metrics/negative_rate@0.7': {'doubleValue': 0.8744414433132488},
 'fairness_indicators_metrics/negative_rate@0.9': {'doubleValue': 0.9832342960038783},
 'fairness_indicators_metrics/positive_rate@0.1': {'doubleValue': 0.926176328000554},
 'fairness_indicators_metrics/positive_rate@0.3': {'doubleValue': 0.6084437980469561},
 'fairness_indicators_metrics/positive_rate@0.5': {'doubleValue': 0.3193115866749775},
 'fairness_indicators_metrics/positive_rate@0.7': {'doubleValue': 0.12555855668675117},
 'fairness_indicators_metrics/positive_rate@0.9': {'doubleValue': 0.016765703996121616},
 'fairness_indicators_metrics/true_negative_rate@0.1': {'doubleValue': 0.0797299617199806},
 'fairness_indicators_metrics/true_negative_rate@0.3': {'doubleValue': 0.41811208124640464},
 'fairness_indicators_metrics/true_negative_rate@0.5': {'doubleValue': 0.7164447469633494},
 'fairness_indicators_metrics/true_negative_rate@0.7': {'doubleValue': 0.9032066669276896},
 'fairness_indicators_metrics/true_negative_rate@0.9': {'doubleValue': 0.9912236053092068},
 'fairness_indicators_metrics/true_positive_rate@0.1': {'doubleValue': 0.9939201326516512},
 'fairness_indicators_metrics/true_positive_rate@0.3': {'doubleValue': 0.9130337156280227},
 'fairness_indicators_metrics/true_positive_rate@0.5': {'doubleValue': 0.7294286306480586},
 'fairness_indicators_metrics/true_positive_rate@0.7': {'doubleValue': 0.45548915296393533},
 'fairness_indicators_metrics/true_positive_rate@0.9': {'doubleValue': 0.10840127124499102},
 'label/mean': {'doubleValue': 0.08019392192363739},
 'post_export_metrics/example_count': {'doubleValue': 721950.0},
 'precision': {'doubleValue': 0.18319329619407654},
 'prediction/mean': {'doubleValue': 0.3998037576675415},
 'recall': {'doubleValue': 0.7294286489486694} }

Heterosexual metric values:
{'accuracy': {'doubleValue': 0.5203251838684082},
 'accuracy_baseline': {'doubleValue': 0.7601625919342041},
 'auc': {'doubleValue': 0.6672822833061218},
 'auc_precision_recall': {'doubleValue': 0.4065391719341278},
 'average_loss': {'doubleValue': 0.8273133039474487},
 'fairness_indicators_metrics/false_discovery_rate@0.1': {'doubleValue': 0.7541666666666667},
 'fairness_indicators_metrics/false_discovery_rate@0.3': {'doubleValue': 0.7272727272727273},
 'fairness_indicators_metrics/false_discovery_rate@0.5': {'doubleValue': 0.7062937062937062},
 'fairness_indicators_metrics/false_discovery_rate@0.7': {'doubleValue': 0.655367231638418},
 'fairness_indicators_metrics/false_discovery_rate@0.9': {'doubleValue': 0.4473684210526316},
 'fairness_indicators_metrics/false_negative_rate@0.1': {'doubleValue': 0.0},
 'fairness_indicators_metrics/false_negative_rate@0.3': {'doubleValue': 0.0847457627118644},
 'fairness_indicators_metrics/false_negative_rate@0.5': {'doubleValue': 0.288135593220339},
 'fairness_indicators_metrics/false_negative_rate@0.7': {'doubleValue': 0.4830508474576271},
 'fairness_indicators_metrics/false_negative_rate@0.9': {'doubleValue': 0.8220338983050848},
 'fairness_indicators_metrics/false_omission_rate@0.1': {'doubleValue': 0.0},
 'fairness_indicators_metrics/false_omission_rate@0.3': {'doubleValue': 0.10416666666666667},
 'fairness_indicators_metrics/false_omission_rate@0.5': {'doubleValue': 0.1650485436893204},
 'fairness_indicators_metrics/false_omission_rate@0.7': {'doubleValue': 0.18095238095238095},
 'fairness_indicators_metrics/false_omission_rate@0.9': {'doubleValue': 0.21365638766519823},
 'fairness_indicators_metrics/false_positive_rate@0.1': {'doubleValue': 0.9679144385026738},
 'fairness_indicators_metrics/false_positive_rate@0.3': {'doubleValue': 0.7700534759358288},
 'fairness_indicators_metrics/false_positive_rate@0.5': {'doubleValue': 0.5401069518716578},
 'fairness_indicators_metrics/false_positive_rate@0.7': {'doubleValue': 0.31016042780748665},
 'fairness_indicators_metrics/false_positive_rate@0.9': {'doubleValue': 0.045454545454545456},
 'fairness_indicators_metrics/negative_rate@0.1': {'doubleValue': 0.024390243902439025},
 'fairness_indicators_metrics/negative_rate@0.3': {'doubleValue': 0.1951219512195122},
 'fairness_indicators_metrics/negative_rate@0.5': {'doubleValue': 0.4186991869918699},
 'fairness_indicators_metrics/negative_rate@0.7': {'doubleValue': 0.6402439024390244},
 'fairness_indicators_metrics/negative_rate@0.9': {'doubleValue': 0.9227642276422764},
 'fairness_indicators_metrics/positive_rate@0.1': {'doubleValue': 0.975609756097561},
 'fairness_indicators_metrics/positive_rate@0.3': {'doubleValue': 0.8048780487804879},
 'fairness_indicators_metrics/positive_rate@0.5': {'doubleValue': 0.5813008130081301},
 'fairness_indicators_metrics/positive_rate@0.7': {'doubleValue': 0.3597560975609756},
 'fairness_indicators_metrics/positive_rate@0.9': {'doubleValue': 0.07723577235772358},
 'fairness_indicators_metrics/true_negative_rate@0.1': {'doubleValue': 0.03208556149732621},
 'fairness_indicators_metrics/true_negative_rate@0.3': {'doubleValue': 0.22994652406417113},
 'fairness_indicators_metrics/true_negative_rate@0.5': {'doubleValue': 0.45989304812834225},
 'fairness_indicators_metrics/true_negative_rate@0.7': {'doubleValue': 0.6898395721925134},
 'fairness_indicators_metrics/true_negative_rate@0.9': {'doubleValue': 0.9545454545454546},
 'fairness_indicators_metrics/true_positive_rate@0.1': {'doubleValue': 1.0},
 'fairness_indicators_metrics/true_positive_rate@0.3': {'doubleValue': 0.9152542372881356},
 'fairness_indicators_metrics/true_positive_rate@0.5': {'doubleValue': 0.711864406779661},
 'fairness_indicators_metrics/true_positive_rate@0.7': {'doubleValue': 0.5169491525423728},
 'fairness_indicators_metrics/true_positive_rate@0.9': {'doubleValue': 0.17796610169491525},
 'label/mean': {'doubleValue': 0.2398373931646347},
 'post_export_metrics/example_count': {'doubleValue': 492.0},
 'precision': {'doubleValue': 0.2937062978744507},
 'prediction/mean': {'doubleValue': 0.5578703880310059},
 'recall': {'doubleValue': 0.7118644118309021} }

Utilisez get_metrics_for_all_slices() pour obtenir les paramètres pour toutes les tranches comme une application dictionnaire chaque tranche au vous obtenez de dictionnaire des paramètres correspondants en cours d' exécution get_metrics_for_slice() sur elle.

pp.pprint(eval_result.get_metrics_for_all_slices())
{(): {'accuracy': {'doubleValue': 0.7174859642982483},
      'accuracy_baseline': {'doubleValue': 0.9198060631752014},
      'auc': {'doubleValue': 0.796409547328949},
      'auc_precision_recall': {'doubleValue': 0.3000231087207794},
      'average_loss': {'doubleValue': 0.5615971088409424},
      'fairness_indicators_metrics/false_discovery_rate@0.1': {'doubleValue': 0.9139404145348933},
      'fairness_indicators_metrics/false_discovery_rate@0.3': {'doubleValue': 0.8796606156634021},
      'fairness_indicators_metrics/false_discovery_rate@0.5': {'doubleValue': 0.816806708107944},
      'fairness_indicators_metrics/false_discovery_rate@0.7': {'doubleValue': 0.7090802784427505},
      'fairness_indicators_metrics/false_discovery_rate@0.9': {'doubleValue': 0.4814937210839392},
      'fairness_indicators_metrics/false_negative_rate@0.1': {'doubleValue': 0.006079867348348763},
      'fairness_indicators_metrics/false_negative_rate@0.3': {'doubleValue': 0.08696628437197734},
      'fairness_indicators_metrics/false_negative_rate@0.5': {'doubleValue': 0.2705713693519414},
      'fairness_indicators_metrics/false_negative_rate@0.7': {'doubleValue': 0.5445108470360647},
      'fairness_indicators_metrics/false_negative_rate@0.9': {'doubleValue': 0.891598728755009},
      'fairness_indicators_metrics/false_omission_rate@0.1': {'doubleValue': 0.006604499315158452},
      'fairness_indicators_metrics/false_omission_rate@0.3': {'doubleValue': 0.017811407791031682},
      'fairness_indicators_metrics/false_omission_rate@0.5': {'doubleValue': 0.03187681488249431},
      'fairness_indicators_metrics/false_omission_rate@0.7': {'doubleValue': 0.04993640137936933},
      'fairness_indicators_metrics/false_omission_rate@0.9': {'doubleValue': 0.07271999842219298},
      'fairness_indicators_metrics/false_positive_rate@0.1': {'doubleValue': 0.9202700382800194},
      'fairness_indicators_metrics/false_positive_rate@0.3': {'doubleValue': 0.5818879187535954},
      'fairness_indicators_metrics/false_positive_rate@0.5': {'doubleValue': 0.28355525303665063},
      'fairness_indicators_metrics/false_positive_rate@0.7': {'doubleValue': 0.09679333307231039},
      'fairness_indicators_metrics/false_positive_rate@0.9': {'doubleValue': 0.00877639469079322},
      'fairness_indicators_metrics/negative_rate@0.1': {'doubleValue': 0.07382367199944595},
      'fairness_indicators_metrics/negative_rate@0.3': {'doubleValue': 0.39155620195304386},
      'fairness_indicators_metrics/negative_rate@0.5': {'doubleValue': 0.6806884133250225},
      'fairness_indicators_metrics/negative_rate@0.7': {'doubleValue': 0.8744414433132488},
      'fairness_indicators_metrics/negative_rate@0.9': {'doubleValue': 0.9832342960038783},
      'fairness_indicators_metrics/positive_rate@0.1': {'doubleValue': 0.926176328000554},
      'fairness_indicators_metrics/positive_rate@0.3': {'doubleValue': 0.6084437980469561},
      'fairness_indicators_metrics/positive_rate@0.5': {'doubleValue': 0.3193115866749775},
      'fairness_indicators_metrics/positive_rate@0.7': {'doubleValue': 0.12555855668675117},
      'fairness_indicators_metrics/positive_rate@0.9': {'doubleValue': 0.016765703996121616},
      'fairness_indicators_metrics/true_negative_rate@0.1': {'doubleValue': 0.0797299617199806},
      'fairness_indicators_metrics/true_negative_rate@0.3': {'doubleValue': 0.41811208124640464},
      'fairness_indicators_metrics/true_negative_rate@0.5': {'doubleValue': 0.7164447469633494},
      'fairness_indicators_metrics/true_negative_rate@0.7': {'doubleValue': 0.9032066669276896},
      'fairness_indicators_metrics/true_negative_rate@0.9': {'doubleValue': 0.9912236053092068},
      'fairness_indicators_metrics/true_positive_rate@0.1': {'doubleValue': 0.9939201326516512},
      'fairness_indicators_metrics/true_positive_rate@0.3': {'doubleValue': 0.9130337156280227},
      'fairness_indicators_metrics/true_positive_rate@0.5': {'doubleValue': 0.7294286306480586},
      'fairness_indicators_metrics/true_positive_rate@0.7': {'doubleValue': 0.45548915296393533},
      'fairness_indicators_metrics/true_positive_rate@0.9': {'doubleValue': 0.10840127124499102},
      'label/mean': {'doubleValue': 0.08019392192363739},
      'post_export_metrics/example_count': {'doubleValue': 721950.0},
      'precision': {'doubleValue': 0.18319329619407654},
      'prediction/mean': {'doubleValue': 0.3998037576675415},
      'recall': {'doubleValue': 0.7294286489486694} },
 (('sexual_orientation', 'bisexual'),): {'accuracy': {'doubleValue': 0.5258620977401733},
                                         'accuracy_baseline': {'doubleValue': 0.8017241358757019},
                                         'auc': {'doubleValue': 0.6252922415733337},
                                         'auc_precision_recall': {'doubleValue': 0.3546649217605591},
                                         'average_loss': {'doubleValue': 0.7461641430854797},
                                         'fairness_indicators_metrics/false_discovery_rate@0.1': {'doubleValue': 0.7870370370370371},
                                         'fairness_indicators_metrics/false_discovery_rate@0.3': {'doubleValue': 0.7816091954022989},
                                         'fairness_indicators_metrics/false_discovery_rate@0.5': {'doubleValue': 0.7666666666666667},
                                         'fairness_indicators_metrics/false_discovery_rate@0.7': {'doubleValue': 0.7037037037037037},
                                         'fairness_indicators_metrics/false_discovery_rate@0.9': {'doubleValue': 0.0},
                                         'fairness_indicators_metrics/false_negative_rate@0.1': {'doubleValue': 0.0},
                                         'fairness_indicators_metrics/false_negative_rate@0.3': {'doubleValue': 0.17391304347826086},
                                         'fairness_indicators_metrics/false_negative_rate@0.5': {'doubleValue': 0.391304347826087},
                                         'fairness_indicators_metrics/false_negative_rate@0.7': {'doubleValue': 0.6521739130434783},
                                         'fairness_indicators_metrics/false_negative_rate@0.9': {'doubleValue': 0.9130434782608695},
                                         'fairness_indicators_metrics/false_omission_rate@0.1': {'doubleValue': 0.0},
                                         'fairness_indicators_metrics/false_omission_rate@0.3': {'doubleValue': 0.13793103448275862},
                                         'fairness_indicators_metrics/false_omission_rate@0.5': {'doubleValue': 0.16071428571428573},
                                         'fairness_indicators_metrics/false_omission_rate@0.7': {'doubleValue': 0.16853932584269662},
                                         'fairness_indicators_metrics/false_omission_rate@0.9': {'doubleValue': 0.18421052631578946},
                                         'fairness_indicators_metrics/false_positive_rate@0.1': {'doubleValue': 0.9139784946236559},
                                         'fairness_indicators_metrics/false_positive_rate@0.3': {'doubleValue': 0.7311827956989247},
                                         'fairness_indicators_metrics/false_positive_rate@0.5': {'doubleValue': 0.4946236559139785},
                                         'fairness_indicators_metrics/false_positive_rate@0.7': {'doubleValue': 0.20430107526881722},
                                         'fairness_indicators_metrics/false_positive_rate@0.9': {'doubleValue': 0.0},
                                         'fairness_indicators_metrics/negative_rate@0.1': {'doubleValue': 0.06896551724137931},
                                         'fairness_indicators_metrics/negative_rate@0.3': {'doubleValue': 0.25},
                                         'fairness_indicators_metrics/negative_rate@0.5': {'doubleValue': 0.4827586206896552},
                                         'fairness_indicators_metrics/negative_rate@0.7': {'doubleValue': 0.7672413793103449},
                                         'fairness_indicators_metrics/negative_rate@0.9': {'doubleValue': 0.9827586206896551},
                                         'fairness_indicators_metrics/positive_rate@0.1': {'doubleValue': 0.9310344827586207},
                                         'fairness_indicators_metrics/positive_rate@0.3': {'doubleValue': 0.75},
                                         'fairness_indicators_metrics/positive_rate@0.5': {'doubleValue': 0.5172413793103449},
                                         'fairness_indicators_metrics/positive_rate@0.7': {'doubleValue': 0.23275862068965517},
                                         'fairness_indicators_metrics/positive_rate@0.9': {'doubleValue': 0.017241379310344827},
                                         'fairness_indicators_metrics/true_negative_rate@0.1': {'doubleValue': 0.08602150537634409},
                                         'fairness_indicators_metrics/true_negative_rate@0.3': {'doubleValue': 0.26881720430107525},
                                         'fairness_indicators_metrics/true_negative_rate@0.5': {'doubleValue': 0.5053763440860215},
                                         'fairness_indicators_metrics/true_negative_rate@0.7': {'doubleValue': 0.7956989247311828},
                                         'fairness_indicators_metrics/true_negative_rate@0.9': {'doubleValue': 1.0},
                                         'fairness_indicators_metrics/true_positive_rate@0.1': {'doubleValue': 1.0},
                                         'fairness_indicators_metrics/true_positive_rate@0.3': {'doubleValue': 0.8260869565217391},
                                         'fairness_indicators_metrics/true_positive_rate@0.5': {'doubleValue': 0.6086956521739131},
                                         'fairness_indicators_metrics/true_positive_rate@0.7': {'doubleValue': 0.34782608695652173},
                                         'fairness_indicators_metrics/true_positive_rate@0.9': {'doubleValue': 0.08695652173913043},
                                         'label/mean': {'doubleValue': 0.1982758641242981},
                                         'post_export_metrics/example_count': {'doubleValue': 116.0},
                                         'precision': {'doubleValue': 0.23333333432674408},
                                         'prediction/mean': {'doubleValue': 0.4908219575881958},
                                         'recall': {'doubleValue': 0.6086956262588501} },
 (('sexual_orientation', 'heterosexual'),): {'accuracy': {'doubleValue': 0.5203251838684082},
                                             'accuracy_baseline': {'doubleValue': 0.7601625919342041},
                                             'auc': {'doubleValue': 0.6672822833061218},
                                             'auc_precision_recall': {'doubleValue': 0.4065391719341278},
                                             'average_loss': {'doubleValue': 0.8273133039474487},
                                             'fairness_indicators_metrics/false_discovery_rate@0.1': {'doubleValue': 0.7541666666666667},
                                             'fairness_indicators_metrics/false_discovery_rate@0.3': {'doubleValue': 0.7272727272727273},
                                             'fairness_indicators_metrics/false_discovery_rate@0.5': {'doubleValue': 0.7062937062937062},
                                             'fairness_indicators_metrics/false_discovery_rate@0.7': {'doubleValue': 0.655367231638418},
                                             'fairness_indicators_metrics/false_discovery_rate@0.9': {'doubleValue': 0.4473684210526316},
                                             'fairness_indicators_metrics/false_negative_rate@0.1': {'doubleValue': 0.0},
                                             'fairness_indicators_metrics/false_negative_rate@0.3': {'doubleValue': 0.0847457627118644},
                                             'fairness_indicators_metrics/false_negative_rate@0.5': {'doubleValue': 0.288135593220339},
                                             'fairness_indicators_metrics/false_negative_rate@0.7': {'doubleValue': 0.4830508474576271},
                                             'fairness_indicators_metrics/false_negative_rate@0.9': {'doubleValue': 0.8220338983050848},
                                             'fairness_indicators_metrics/false_omission_rate@0.1': {'doubleValue': 0.0},
                                             'fairness_indicators_metrics/false_omission_rate@0.3': {'doubleValue': 0.10416666666666667},
                                             'fairness_indicators_metrics/false_omission_rate@0.5': {'doubleValue': 0.1650485436893204},
                                             'fairness_indicators_metrics/false_omission_rate@0.7': {'doubleValue': 0.18095238095238095},
                                             'fairness_indicators_metrics/false_omission_rate@0.9': {'doubleValue': 0.21365638766519823},
                                             'fairness_indicators_metrics/false_positive_rate@0.1': {'doubleValue': 0.9679144385026738},
                                             'fairness_indicators_metrics/false_positive_rate@0.3': {'doubleValue': 0.7700534759358288},
                                             'fairness_indicators_metrics/false_positive_rate@0.5': {'doubleValue': 0.5401069518716578},
                                             'fairness_indicators_metrics/false_positive_rate@0.7': {'doubleValue': 0.31016042780748665},
                                             'fairness_indicators_metrics/false_positive_rate@0.9': {'doubleValue': 0.045454545454545456},
                                             'fairness_indicators_metrics/negative_rate@0.1': {'doubleValue': 0.024390243902439025},
                                             'fairness_indicators_metrics/negative_rate@0.3': {'doubleValue': 0.1951219512195122},
                                             'fairness_indicators_metrics/negative_rate@0.5': {'doubleValue': 0.4186991869918699},
                                             'fairness_indicators_metrics/negative_rate@0.7': {'doubleValue': 0.6402439024390244},
                                             'fairness_indicators_metrics/negative_rate@0.9': {'doubleValue': 0.9227642276422764},
                                             'fairness_indicators_metrics/positive_rate@0.1': {'doubleValue': 0.975609756097561},
                                             'fairness_indicators_metrics/positive_rate@0.3': {'doubleValue': 0.8048780487804879},
                                             'fairness_indicators_metrics/positive_rate@0.5': {'doubleValue': 0.5813008130081301},
                                             'fairness_indicators_metrics/positive_rate@0.7': {'doubleValue': 0.3597560975609756},
                                             'fairness_indicators_metrics/positive_rate@0.9': {'doubleValue': 0.07723577235772358},
                                             'fairness_indicators_metrics/true_negative_rate@0.1': {'doubleValue': 0.03208556149732621},
                                             'fairness_indicators_metrics/true_negative_rate@0.3': {'doubleValue': 0.22994652406417113},
                                             'fairness_indicators_metrics/true_negative_rate@0.5': {'doubleValue': 0.45989304812834225},
                                             'fairness_indicators_metrics/true_negative_rate@0.7': {'doubleValue': 0.6898395721925134},
                                             'fairness_indicators_metrics/true_negative_rate@0.9': {'doubleValue': 0.9545454545454546},
                                             'fairness_indicators_metrics/true_positive_rate@0.1': {'doubleValue': 1.0},
                                             'fairness_indicators_metrics/true_positive_rate@0.3': {'doubleValue': 0.9152542372881356},
                                             'fairness_indicators_metrics/true_positive_rate@0.5': {'doubleValue': 0.711864406779661},
                                             'fairness_indicators_metrics/true_positive_rate@0.7': {'doubleValue': 0.5169491525423728},
                                             'fairness_indicators_metrics/true_positive_rate@0.9': {'doubleValue': 0.17796610169491525},
                                             'label/mean': {'doubleValue': 0.2398373931646347},
                                             'post_export_metrics/example_count': {'doubleValue': 492.0},
                                             'precision': {'doubleValue': 0.2937062978744507},
                                             'prediction/mean': {'doubleValue': 0.5578703880310059},
                                             'recall': {'doubleValue': 0.7118644118309021} },
 (('sexual_orientation', 'homosexual_gay_or_lesbian'),): {'accuracy': {'doubleValue': 0.5851936340332031},
                                                          'accuracy_baseline': {'doubleValue': 0.7182232141494751},
                                                          'auc': {'doubleValue': 0.7057511806488037},
                                                          'auc_precision_recall': {'doubleValue': 0.469566285610199},
                                                          'average_loss': {'doubleValue': 0.7369641661643982},
                                                          'fairness_indicators_metrics/false_discovery_rate@0.1': {'doubleValue': 0.7107050831576481},
                                                          'fairness_indicators_metrics/false_discovery_rate@0.3': {'doubleValue': 0.6717557251908397},
                                                          'fairness_indicators_metrics/false_discovery_rate@0.5': {'doubleValue': 0.6172690763052209},
                                                          'fairness_indicators_metrics/false_discovery_rate@0.7': {'doubleValue': 0.5427319211102994},
                                                          'fairness_indicators_metrics/false_discovery_rate@0.9': {'doubleValue': 0.4092664092664093},
                                                          'fairness_indicators_metrics/false_negative_rate@0.1': {'doubleValue': 0.0016168148746968471},
                                                          'fairness_indicators_metrics/false_negative_rate@0.3': {'doubleValue': 0.06143896523848019},
                                                          'fairness_indicators_metrics/false_negative_rate@0.5': {'doubleValue': 0.22958771220695232},
                                                          'fairness_indicators_metrics/false_negative_rate@0.7': {'doubleValue': 0.4939369442198868},
                                                          'fairness_indicators_metrics/false_negative_rate@0.9': {'doubleValue': 0.8763136620856912},
                                                          'fairness_indicators_metrics/false_omission_rate@0.1': {'doubleValue': 0.01652892561983471},
                                                          'fairness_indicators_metrics/false_omission_rate@0.3': {'doubleValue': 0.08909730363423213},
                                                          'fairness_indicators_metrics/false_omission_rate@0.5': {'doubleValue': 0.14947368421052631},
                                                          'fairness_indicators_metrics/false_omission_rate@0.7': {'doubleValue': 0.20225091029460443},
                                                          'fairness_indicators_metrics/false_omission_rate@0.9': {'doubleValue': 0.2624061970467199},
                                                          'fairness_indicators_metrics/false_positive_rate@0.1': {'doubleValue': 0.9622581668252458},
                                                          'fairness_indicators_metrics/false_positive_rate@0.3': {'doubleValue': 0.7535680304471931},
                                                          'fairness_indicators_metrics/false_positive_rate@0.5': {'doubleValue': 0.4874722486520774},
                                                          'fairness_indicators_metrics/false_positive_rate@0.7': {'doubleValue': 0.2356485886457342},
                                                          'fairness_indicators_metrics/false_positive_rate@0.9': {'doubleValue': 0.03361877576910879},
                                                          'fairness_indicators_metrics/negative_rate@0.1': {'doubleValue': 0.0275626423690205},
                                                          'fairness_indicators_metrics/negative_rate@0.3': {'doubleValue': 0.19430523917995443},
                                                          'fairness_indicators_metrics/negative_rate@0.5': {'doubleValue': 0.4328018223234624},
                                                          'fairness_indicators_metrics/negative_rate@0.7': {'doubleValue': 0.6881548974943053},
                                                          'fairness_indicators_metrics/negative_rate@0.9': {'doubleValue': 0.941002277904328},
                                                          'fairness_indicators_metrics/positive_rate@0.1': {'doubleValue': 0.9724373576309795},
                                                          'fairness_indicators_metrics/positive_rate@0.3': {'doubleValue': 0.8056947608200455},
                                                          'fairness_indicators_metrics/positive_rate@0.5': {'doubleValue': 0.5671981776765376},
                                                          'fairness_indicators_metrics/positive_rate@0.7': {'doubleValue': 0.31184510250569475},
                                                          'fairness_indicators_metrics/positive_rate@0.9': {'doubleValue': 0.05899772209567198},
                                                          'fairness_indicators_metrics/true_negative_rate@0.1': {'doubleValue': 0.0377418331747542},
                                                          'fairness_indicators_metrics/true_negative_rate@0.3': {'doubleValue': 0.24643196955280686},
                                                          'fairness_indicators_metrics/true_negative_rate@0.5': {'doubleValue': 0.5125277513479226},
                                                          'fairness_indicators_metrics/true_negative_rate@0.7': {'doubleValue': 0.7643514113542658},
                                                          'fairness_indicators_metrics/true_negative_rate@0.9': {'doubleValue': 0.9663812242308912},
                                                          'fairness_indicators_metrics/true_positive_rate@0.1': {'doubleValue': 0.9983831851253031},
                                                          'fairness_indicators_metrics/true_positive_rate@0.3': {'doubleValue': 0.9385610347615198},
                                                          'fairness_indicators_metrics/true_positive_rate@0.5': {'doubleValue': 0.7704122877930477},
                                                          'fairness_indicators_metrics/true_positive_rate@0.7': {'doubleValue': 0.5060630557801131},
                                                          'fairness_indicators_metrics/true_positive_rate@0.9': {'doubleValue': 0.12368633791430882},
                                                          'label/mean': {'doubleValue': 0.2817767560482025},
                                                          'post_export_metrics/example_count': {'doubleValue': 4390.0},
                                                          'precision': {'doubleValue': 0.3827309310436249},
                                                          'prediction/mean': {'doubleValue': 0.5428739786148071},
                                                          'recall': {'doubleValue': 0.770412266254425} },
 (('sexual_orientation', 'other_sexual_orientation'),): {'accuracy': {'doubleValue': 0.6000000238418579},
                                                         'accuracy_baseline': {'doubleValue': 0.800000011920929},
                                                         'auc': {'doubleValue': 1.0},
                                                         'auc_precision_recall': {'doubleValue': 1.0},
                                                         'average_loss': {'doubleValue': 0.7521011829376221},
                                                         'fairness_indicators_metrics/false_discovery_rate@0.1': {'doubleValue': 0.8},
                                                         'fairness_indicators_metrics/false_discovery_rate@0.3': {'doubleValue': 0.75},
                                                         'fairness_indicators_metrics/false_discovery_rate@0.5': {'doubleValue': 0.6666666666666666},
                                                         'fairness_indicators_metrics/false_discovery_rate@0.7': {'doubleValue': 0.5},
                                                         'fairness_indicators_metrics/false_discovery_rate@0.9': {'doubleValue': 0.0},
                                                         'fairness_indicators_metrics/false_negative_rate@0.1': {'doubleValue': 0.0},
                                                         'fairness_indicators_metrics/false_negative_rate@0.3': {'doubleValue': 0.0},
                                                         'fairness_indicators_metrics/false_negative_rate@0.5': {'doubleValue': 0.0},
                                                         'fairness_indicators_metrics/false_negative_rate@0.7': {'doubleValue': 0.0},
                                                         'fairness_indicators_metrics/false_negative_rate@0.9': {'doubleValue': 0.0},
                                                         'fairness_indicators_metrics/false_omission_rate@0.1': {'doubleValue': 'NaN'},
                                                         'fairness_indicators_metrics/false_omission_rate@0.3': {'doubleValue': 0.0},
                                                         'fairness_indicators_metrics/false_omission_rate@0.5': {'doubleValue': 0.0},
                                                         'fairness_indicators_metrics/false_omission_rate@0.7': {'doubleValue': 0.0},
                                                         'fairness_indicators_metrics/false_omission_rate@0.9': {'doubleValue': 0.0},
                                                         'fairness_indicators_metrics/false_positive_rate@0.1': {'doubleValue': 1.0},
                                                         'fairness_indicators_metrics/false_positive_rate@0.3': {'doubleValue': 0.75},
                                                         'fairness_indicators_metrics/false_positive_rate@0.5': {'doubleValue': 0.5},
                                                         'fairness_indicators_metrics/false_positive_rate@0.7': {'doubleValue': 0.25},
                                                         'fairness_indicators_metrics/false_positive_rate@0.9': {'doubleValue': 0.0},
                                                         'fairness_indicators_metrics/negative_rate@0.1': {'doubleValue': 0.0},
                                                         'fairness_indicators_metrics/negative_rate@0.3': {'doubleValue': 0.2},
                                                         'fairness_indicators_metrics/negative_rate@0.5': {'doubleValue': 0.4},
                                                         'fairness_indicators_metrics/negative_rate@0.7': {'doubleValue': 0.6},
                                                         'fairness_indicators_metrics/negative_rate@0.9': {'doubleValue': 0.8},
                                                         'fairness_indicators_metrics/positive_rate@0.1': {'doubleValue': 1.0},
                                                         'fairness_indicators_metrics/positive_rate@0.3': {'doubleValue': 0.8},
                                                         'fairness_indicators_metrics/positive_rate@0.5': {'doubleValue': 0.6},
                                                         'fairness_indicators_metrics/positive_rate@0.7': {'doubleValue': 0.4},
                                                         'fairness_indicators_metrics/positive_rate@0.9': {'doubleValue': 0.2},
                                                         'fairness_indicators_metrics/true_negative_rate@0.1': {'doubleValue': 0.0},
                                                         'fairness_indicators_metrics/true_negative_rate@0.3': {'doubleValue': 0.25},
                                                         'fairness_indicators_metrics/true_negative_rate@0.5': {'doubleValue': 0.5},
                                                         'fairness_indicators_metrics/true_negative_rate@0.7': {'doubleValue': 0.75},
                                                         'fairness_indicators_metrics/true_negative_rate@0.9': {'doubleValue': 1.0},
                                                         'fairness_indicators_metrics/true_positive_rate@0.1': {'doubleValue': 1.0},
                                                         'fairness_indicators_metrics/true_positive_rate@0.3': {'doubleValue': 1.0},
                                                         'fairness_indicators_metrics/true_positive_rate@0.5': {'doubleValue': 1.0},
                                                         'fairness_indicators_metrics/true_positive_rate@0.7': {'doubleValue': 1.0},
                                                         'fairness_indicators_metrics/true_positive_rate@0.9': {'doubleValue': 1.0},
                                                         'label/mean': {'doubleValue': 0.20000000298023224},
                                                         'post_export_metrics/example_count': {'doubleValue': 5.0},
                                                         'precision': {'doubleValue': 0.3333333432674408},
                                                         'prediction/mean': {'doubleValue': 0.6101843118667603},
                                                         'recall': {'doubleValue': 1.0} } }