Questa pagina è stata tradotta dall'API Cloud Translation.
Switch to English

Pandas dataframe alla correttezza Indicatori Case Study

In questa attività, si apprenderà come utilizzare indicatori di congruità con una Panda dataframe.

Case Study Panoramica

In questo caso di studio applicheremo tensorflow Modello di analisi e Fairness indicatori per valutare i dati memorizzati come Pandas dataframe, in cui ogni riga contiene etichette verità a terra, varie caratteristiche, e un modello di previsione. Mostreremo come questo flusso di lavoro può essere utilizzato per individuare potenziali problemi di equità, indipendente da quello framework utilizzato per costruire e formare il modello. Come in questo caso di studio, siamo in grado di analizzare i risultati da qualsiasi quadro di apprendimento della macchina (ad es tensorflow, JAX, ecc) una volta che essi vengono convertiti in un Pandas dataframe.

Per questo esercizio, faremo leva il modello profondo Neural Network (DNN) che è stato sviluppato nei vincoli di forma per l'Etica con tensorflow Lattice caso di studio utilizzando la Law School Admissions set di dati da parte del Consiglio di ammissione Law School (LSAC). Questo classificatore tentativi di prevedere o meno uno studente passerà al bar, in base alla loro Law School Admission Test (LAST) punteggio e di laurea GPA. Questo classificatore tentativi di prevedere o meno uno studente passerà al bar, in base al loro punteggio LAST e laurea GPA.

LSAC Dataset

Il dataset utilizzato in questo caso di studio è stato originariamente raccolti per uno studio denominato ' LSAC National Longitudinal Study Bar Passage. LSAC Research Report Series 'da Linda Wightman nel 1998. Il set di dati è attualmente ospitato qui .

  • dnn_bar_pass_prediction: La previsione LSAT dal modello DNN.
  • genere: Sesso dello studente.
  • LSAT: LSAT punteggio ricevuto dallo studente.
  • pass_bar: Etichetta verità a terra che indica se o no lo studente alla fine ha superato il bar.
  • gara: Corsa dello studente.
  • ugpa: Uno studente universitario 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.

L'importazione di pacchetti necessari:

 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

 

Scarica i dati ed esplorare il set di dati iniziale.

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

Configurare Fairness indicatori.

Ci sono diversi parametri che avrete bisogno di prendere in considerazione quando si utilizzano Fairness indicatori con un dataframe

  • Il tuo dataframe input deve contenere una colonna di previsione e la colonna etichetta dal modello. Per impostazione predefinita Fairness indicatori cercare una colonna di previsione chiamato prediction e una colonna etichetta chiamata label all'interno del vostro dataframe.

    • Se uno di questi valori non si trovano verrà sollevata una KeyError.
  • Oltre a un dataframe, avrete anche bisogno di includere un eval_config che dovrebbe includere le metriche per calcolare, fette per calcolare le metriche ei nomi delle colonne per esempio le etichette e le previsioni.

    • metrics_specs imposterà i parametri per il calcolo. I FairnessIndicators metriche saranno tenuti a rendere le metriche di correttezza e si può vedere un elenco di metriche opzionali qui .

    • slicing_specs è un parametro opzionale per affettare per specificare Quale caratteristica che ti interessa indagare. All'interno viene utilizzato questo studio gara1 caso, tuttavia è anche possibile impostare questo valore a un'altra caratteristica (per esempio di genere nel contesto di questo dataframe). Se slicing_specs non è prevista saranno incluse tutte le caratteristiche.

    • Se il dataframe include una colonna etichetta o previsione che è diverso da quello predefinito prediction o label , è possibile configurare il label_key e prediction_key ad un nuovo valore.

  • Se output_path non è specificato verrà creata una directory temporanea.

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

Esplora prestazioni del modello con equità indicatori.

Dopo l'esecuzione di Equità indicatori, possiamo visualizzare diverse metriche che abbiamo selezionato per analizzare le nostre prestazioni modelli. In questo caso di studio abbiamo incluso Equità Indicatori e arbitrariamente scelto AUC.

Quando abbiamo prima esaminare l'AUC complessiva per ogni sezione di gara possiamo vedere una leggera discrepanza in termini di prestazioni del modello, ma niente che è senza dubbio allarmante.

  • Asiatico: 0.58
  • Nero: 0.58
  • Ispanica: 0.58
  • Altro: 0.64
  • Bianco: 0.6

Tuttavia, quando guardiamo la falsa tassi negativi divisa da gara, il nostro modello di nuovo predice in modo non corretto la probabilità che un utente passa la barra a velocità diverse e, questa volta, lo fa da un sacco.

  • Asiatico: 0.01
  • Nero: 0.05
  • Ispanica: 0.02
  • Altro: 0.01
  • Bianco: 0.01

In particolare la differenza tra studenti bianchi e neri è di circa 380%, il che significa che il nostro modello è quasi 4 volte più probabilità di predire in modo non corretto che uno studente nero non passerà il bar, di uno studente whilte. Se dovessimo continuare con questo sforzo, un praticante potrebbe utilizzare questi risultati come un segnale che dovrebbero spendere più tempo per garantire che il loro modello funziona bene per le persone provenienti da ogni settore.

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

Conclusione

In questo caso di studio abbiamo importato un insieme di dati in una Panda dataframe che abbiamo poi analizzato con equità indicatori. Comprendere i risultati del modello e fondamentale dati è un passo importante per garantire il modello non riflette polarizzazione nocivo. Nel contesto di questo caso di studio abbiamo esaminato il set di dati LSAC e come le previsioni di questi dati potrebbero venire influenzati da una gara di studenti. Il concetto di “ciò che è ingiusto e ciò che è giusto sono state introdotte in più discipline per oltre 50 anni, di cui in materia di istruzione, assunzioni, e machine learning”. 1 Indicatore Equità è uno strumento per contribuire a mitigare le preoccupazioni di correttezza nella vostra macchina di apprendimento del modello.

Per ulteriori informazioni sull'utilizzo di congruità Gli indicatori e le risorse per saperne di più circa le preoccupazioni di correttezza vedere qui .


  1. Hutchinson, B., Mitchell, M. (2018). 50 anni di test (Un) l'equità: lezioni per l'apprendimento automatico. https://arxiv.org/abs/1811.10104

Appendice

Qui di seguito sono alcune funzioni per contribuire a convertire modelli ML a Panda 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())
 
View on TensorFlow.org