Ta strona została przetłumaczona przez Cloud Translation API.
Switch to English

Pandy DataFrame do Fairness Wskaźniki Case Study

W tym ćwiczeniu dowiesz się, jak korzystać z uczciwości Wskaźniki pandy DataFrame.

Case Study Przegląd

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ć stosowany do wykrycia potencjalnych problemów uczciwości, niezależnie od tego, ramowego użyte do skonstruowania i trenować model. Jak w tym studium przypadku, możemy analizować wyniki z dowolnego ramach uczenia maszynowego (np TensorFlow Jax, etc), gdy są one konwertowane do Pandy 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óby przewidywania tego, czy uczeń przechodzi pasek, w oparciu o ich Law School Admission Test (LAST) Wynik i licencjackich GPA. Ten klasyfikator próby przewidywania tego, czy uczeń przechodzi pasek, na podstawie ich ocena LAST i licencjackich GPA.

LSAC Dataset

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 \
  tensorflow-model-analysis==0.22.2 \
  tensorflow-data-validation==0.22.1 \
  tfx-bsl==0.22.1 \
  pyarrow==0.16.0

 
ERROR: tensorflow-serving-api 2.2.0 has requirement tensorflow~=2.2.0, but you'll have tensorflow 2.3.0 which is incompatible.
ERROR: tensorflow-transform 0.22.0 has requirement tensorflow!=2.0.*,<2.3,>=1.15, but you'll have tensorflow 2.3.0 which is incompatible.
WARNING: You are using pip version 20.1.1; however, version 20.2 is available.
You should consider upgrading via the '/tmpfs/src/tf_docs_env/bin/python -m pip install --upgrade pip' command.

Importowanie wymaganych pakietów:

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

import tensorflow_model_analysis as tfma
from google.protobuf import text_format

 

Pobierz dane i odkrywania początkowy zestaw 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()
 

Konfiguracja Wskaźniki Uczciwość.

Istnieje kilka parametrów, które trzeba wziąć pod uwagę przy korzystaniu rzetelności wskaźników z DataFrame

  • Twój DataFrame wejście musi zawierać kolumnę przewidywania i kolumny etykiet od 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żeli którakolwiek z tych wartości nie znalazł KeyError zostaną podniesione.
  • 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 ramach tego studium przypadku race1 jest używany, jednak można również ustawić tę wartość do innej funkcji (na przykład płeć w kontekście tego 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.6/site-packages/tensorflow_model_analysis/writers/metrics_plots_and_validations_writer.py:68: 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.6/site-packages/tensorflow_model_analysis/writers/metrics_plots_and_validations_writer.py:68: 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)`

Zbadać wydajność modelu sprawiedliwie wskaźników.

Po uruchomieniu rzetelności wskaźników, możemy wizualizować różne wskaźniki, które wybraliśmy do przeanalizować nasze osiągi modeli. W ramach tego studium przypadku dołączyliśmy rzetelności wskaźników i samowolnie wybrał AUC.

Kiedy po raz pierwszy spojrzeć na ogólną AUC dla każdego wycinka wyścigu widzimy niewielką różnicę w wydajności modelu, ale nic, co niewątpliwie jest alarmujący.

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

Jednak, gdy spojrzymy na fałszywej stóp negatywne rozdzielone przez rasę, nasz model znowu błędnie przewiduje prawdopodobieństwo użytkownik przechodzi pasek z różnymi szybkościami, a tym czasie robi tak przez wielu.

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

Przede wszystkim różnica pomiędzy czernią a bielą studentów jest o 380%, co oznacza, że ​​nasz model jest prawie 4x częściej błędnie przewidują, że czarny uczeń nie przejdzie pasek, niż whilte studenta. Gdybyśmy mieli kontynuować ten wysiłek, lekarz może wykorzystać te wyniki jako sygnał, że powinni spędzać więcej czasu zapewniając, że ich model działa dobrze dla ludzi ze wszystkich środowisk.

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

Wniosek

W ramach tego studium przypadku sprowadziliśmy zestawu danych do Pandy DataFrame które następnie analizowane z rzetelności wskaźników. Zrozumienie wyników modelu oraz bazowego danych jest ważnym krokiem w zapewnieniu model nie odzwierciedla szkodliwych uprzedzeń. W kontekście tego case study zbadaliśmy zestawu danych LSAC jak i przewidywania z tych danych może być wpływ wyścigu studentów. Pojęcie „co jest niesprawiedliwe i to, co jest sprawiedliwe zostały wprowadzone w wielu dziedzinach od ponad 50 lat, w tym w kształcenie, zatrudnienie i uczenia maszynowego.” 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 Test (nie) sprawiedliwości: Lekcje dla uczenia maszynowego. https://arxiv.org/abs/1811.10104

dodatek

Poniżej przedstawiamy kilka funkcji ułatwiających convert ML modele do Pandy 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())
 
Zobacz na TensorFlow.org