Studium przypadku Pandas DataFrame do wskaźników uczciwości

Zobacz na TensorFlow.org Uruchom w Google Colab Zobacz na GitHub Pobierz notatnik

Przegląd studium przypadku

W tym studium przypadku będziemy stosować TensorFlow model analizy i rzetelności wskaźników do oceny danych zapisanych jako pandy DataFrame, gdzie każdy wiersz zawiera mieloną etykiety prawdę różne funkcje, a także przewidywania modelu. Pokażemy, jak ten przepływ pracy może być wykorzystany do wykrycia potencjalnych problemów ze sprawiedliwością, niezależnie od struktury użytej do budowy i szkolenia modelu. Podobnie jak w tym studium przypadku, możemy analizować wyniki z dowolnego frameworka uczenia maszynowego (np. TensorFlow, JAX itp.) po ich przekonwertowaniu na Pandas DataFrame.

W tym ćwiczeniu będziemy wykorzystywać model Głębokie Neural Network (DNN), który został opracowany w Ograniczeń kształt Etyki z Tensorflow Lattice studium przypadku używając Law School Admissions zestawu danych z rekrutacji Law School Rady (LSAC). Ten klasyfikator próbuje przewidzieć, czy uczeń zda poprzeczkę, czy nie, na podstawie jego wyniku w teście wstępnym do szkoły prawniczej (LSAT) i licencjatu GPA. Ten klasyfikator próbuje przewidzieć, czy uczeń zda poprzeczkę, czy nie, na podstawie wyniku LSAT i licencjatu GPA.

Zbiór danych LSAC

Zbiór danych stosowane w tym badaniu sprawa została pierwotnie zbierane do badania o nazwie " LSAC Narodowy wzdłużna Bar Przejście Study. Raport z badań LSAC Series "Linda Wightman w roku 1998. Zbiór danych jest obecnie gospodarzem tutaj .

  • dnn_bar_pass_prediction: Przewidywanie LAST z modelu DNN.
  • Płeć: Płeć studenta.
  • LAST: LAST wynik otrzymanych przez studenta.
  • pass_bar: Parter prawda etykieta wskazującą, czy uczeń ostatecznie przeszedł w poprzeczkę.
  • wyścig: Wyścig studenta.
  • ugpa: studenta licencjackich GPA.
!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

Importowanie wymaganych pakietów:

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()

Pobierz dane i zapoznaj się z początkowym zbiorem danych.

# 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()

Skonfiguruj wskaźniki uczciwości.

Istnieje kilka parametrów, które należy wziąć pod uwagę podczas korzystania ze wskaźników rzetelności z ramką DataFrame

  • Wejściowa ramka DataFrame musi zawierać kolumnę przewidywania i kolumnę etykiety z modelu. Fairness Wskaźniki domyślnie będzie wyglądać na kolumnie o nazwie przewidywania prediction i kolumny label o nazwie label w swoim DataFrame.

    • Jeśli żadna z tych wartości nie zostanie znaleziona, zostanie zgłoszony KeyError.
  • Oprócz DataFrame, będzie trzeba także zawierać eval_config które powinny zawierać metryki do obliczania, plastry do obliczania metryki włączona i nazwy kolumn na przykład etykiety i prognoz.

    • metrics_specs ustawi metryki do obliczania. W FairnessIndicators metryczne będą wymagane do renderowania metryki uczciwości i można zobaczyć listę dodatkowych opcjonalnych metryk tutaj .

    • slicing_specs to opcjonalny parametr krojenie aby określić, jakie oferują jesteś zainteresowany w badaniu. W tym studium przypadku używana jest rasa1, jednak można również ustawić tę wartość na inną cechę (na przykład płeć w kontekście tej ramki DataFrame). Jeśli slicing_specs nie jest przewidziane wszystkie funkcje zostaną włączone.

    • Jeśli DataFrame zawiera kolumnę etykiety lub predykcji, który jest inny od domyślnego prediction lub label , można skonfigurować label_key i prediction_key do nowej wartości.

  • Jeśli output_path nie jest określona zostanie utworzony katalog tymczasowy.

# 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)`

Poznaj wydajność modelu za pomocą wskaźników uczciwości.

Po uruchomieniu wskaźników rzetelności możemy zwizualizować różne metryki, które wybraliśmy do analizy wydajności naszych modeli. W tym studium przypadku uwzględniliśmy wskaźniki uczciwości i arbitralnie wybraliśmy AUC.

Kiedy po raz pierwszy przyjrzymy się ogólnej wartości AUC dla każdego wycinka wyścigu, możemy zauważyć niewielką rozbieżność w osiągach modelu, ale nic, co jest prawdopodobnie niepokojące.

  • Asian: 0,58
  • Czarny: 0,58
  • Hiszpanie: 0,58
  • Inne: 0.64
  • Biały: 0,6

Jednak, gdy spojrzymy na fałszywie ujemne stawki podzielone według rasy, nasz model ponownie błędnie przewiduje prawdopodobieństwo, że użytkownik przekroczy poprzeczkę przy różnych stawkach, i tym razem robi to w dużym stopniu.

  • Asian: 0.01
  • Czarny: 0,05
  • Hiszpanie: 0,02
  • Inne: 0,01
  • Biały: 0.01

Przede wszystkim różnica między czarnymi i białymi uczniami wynosi około 380%, co oznacza, że ​​nasz model jest prawie 4 razy bardziej podatny na błędne przewidywanie, że czarny uczeń nie przekroczy poprzeczki, niż uczeń biały. Gdybyśmy mieli kontynuować ten wysiłek, praktycy mogliby wykorzystać te wyniki jako sygnał, że powinni poświęcić więcej czasu na upewnianie się, że ich model działa dobrze dla osób ze wszystkich środowisk.

# 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

eval_result obiekt, wydanego powyżej w render_fairness_indicator() , posiada własny interfejs API, który może być wykorzystany do odczytu wyników TFMA w swoich programach.

get_slice_names() i get_metric_names()

Aby uzyskać ocenione wycinki i metryki, możesz użyć odpowiednich funkcji.

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() i get_metrics_for_all_slices()

Jeżeli chcesz uzyskać dane dla określonego wycinka, można użyć get_metrics_for_slice() . Zwraca słownika mapowania nazw metrycznych do wartości metryki .

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} }

Jeśli chcesz dostać metryki dla wszystkich plastrów, get_metrics_for_all_slices() zwraca słownika mapowanie każdej plaster do odpowiednich 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} } }

Wniosek

W ramach tego studium przypadku zaimportowaliśmy zestaw danych do ramki Pandas DataFrame, którą następnie przeanalizowaliśmy za pomocą wskaźników rzetelności. Zrozumienie wyników modelu i bazowych danych jest ważnym krokiem w zapewnieniu, że model nie odzwierciedla szkodliwych stronniczości. W kontekście tego studium przypadku przeanalizowaliśmy zestaw danych LSAC i jaki wpływ na prognozy na podstawie tych danych może mieć wyścig studentów. Pojęcie „co jest niesprawiedliwe, a co sprawiedliwe, zostało wprowadzone w wielu dyscyplinach od ponad 50 lat, w tym w edukacji, zatrudnianiu i uczeniu maszynowym”. 1 Uczciwość Indicator to narzędzie, aby pomóc złagodzić obawy uczciwość w komputerze uczących model.

Aby uzyskać więcej informacji na temat korzystania Wskaźniki i zasobów uczciwości, aby dowiedzieć się więcej o uczciwość obawy zobaczyć tutaj .


  1. Hutchinson, B., Mitchell, M. (2018). 50 lat (nie)uczciwości testów: lekcje uczenia maszynowego. https://arxiv.org/abs/1811.10104

załącznik

Poniżej znajduje się kilka funkcji ułatwiających konwersję modeli ML do 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())