ML 커뮤니티 데이는 11월 9일입니다! TensorFlow, JAX에서 업데이트를 우리와 함께, 더 자세히 알아보기

MinDiff 데이터 준비

소개

MinDiff를 구현할 때 모델에 전달하기 전에 입력을 선택하고 구성 할 때 복잡한 결정을 내려야합니다. 이러한 결정은 모델 내에서 MinDiff의 동작을 크게 결정합니다.

이 가이드에서는이 프로세스의 기술적 측면을 다루지 만 공정성을 위해 모델을 평가하는 방법이나 평가를 위해 특정 조각과 메트릭을 식별하는 방법에 대해서는 설명하지 않습니다. 이에 대한 자세한 내용은 공정성 지표 지침 을 참조하십시오.

MinDiff를 보여주기 위해이 가이드에서는 UCI 소득 데이터 세트를 사용합니다. 모델 작업은 다양한 개인 속성을 기반으로 개인의 소득이 $ 50,000를 초과하는지 여부를 예측하는 것입니다. 이 가이드에서는 "Male""Female" 슬라이스 사이에 FNR (가 음성 비율)에 문제가있는 간격이 있고 모델 소유자 (귀하)가 문제를 해결하기 위해 MinDiff를 적용하기로 결정했다고 가정합니다. MinDiff 적용을 선택할 수있는 시나리오에 대한 자세한 내용은 요구 사항 페이지를 참조하십시오 .

MinDiff는 두 데이터 세트의 예제 간의 분포 점수 차이에 페널티를주는 방식으로 작동합니다. 이 가이드는 이러한 추가 MinDiff 세트를 선택하고 구성하는 방법과 학습을 위해 모델로 전달할 수 있도록 모든 것을 함께 패키징하는 방법을 보여줍니다.

설정

pip install -q --upgrade tensorflow-model-remediation
import tensorflow as tf
from tensorflow_model_remediation import min_diff
from tensorflow_model_remediation.tools.tutorials_utils import uci as tutorials_utils

원본 데이터

데모 목적과 런타임 감소를 위해이 가이드에서는 UCI 소득 데이터 세트의 일부만 사용합니다. 실제 프로덕션 환경에서는 전체 데이터 세트가 활용됩니다.

# Sampled at 0.3 for reduced runtimes.
train = tutorials_utils.get_uci_data(split='train', sample=0.3)

print(len(train), 'train examples')
9768 train examples

tf.data.Dataset 변환

MinDiffModel 은 입력이tf.data.Dataset 합니다. MinDiff를 통합하기 전에 다른 형식의 입력을 사용했다면 입력 데이터를 변환해야합니다.

사용 tf.data.Dataset.from_tensor_slices 로 변환하는tf.data.Dataset .

dataset = tf.data.Dataset.from_tensor_slices((x, y, weights))
dataset.shuffle(...)  # Optional.
dataset.batch(batch_size)

두 입력 방법 간의 동등성에 대한 자세한 내용은 Model.fit 문서를 참조하십시오.

이 가이드에서 입력은 Pandas DataFrame으로 다운로드되므로이 변환이 필요합니다.

# Function to convert a DataFrame into a tf.data.Dataset.
def df_to_dataset(dataframe, shuffle=True):
  dataframe = dataframe.copy()
  labels = dataframe.pop('target')
  ds = tf.data.Dataset.from_tensor_slices((dict(dataframe), labels))
  if shuffle:
    ds = ds.shuffle(buffer_size=5000)  # Reasonable but arbitrary buffer_size.
  return ds

# Convert the train DataFrame into a Dataset.
original_train_ds = df_to_dataset(train)

MinDiff 데이터 생성

훈련 중에 MinDiff는 모델이 두 개의 추가 데이터 세트 (원래 데이터 세트의 예를 포함 할 수 있음) 간의 예측 차이를 줄 이도록 권장합니다. 이 두 데이터 세트의 선택은 MinDiff가 모델에 미치는 영향을 결정하는 주요 결정입니다.

수정하려는 성능 차이가 분명하고 잘 표현되도록 두 데이터 세트를 선택해야합니다. 목표 사이 FNR의 격차를 줄일 수 있기 때문에 "Male""Female" 조각, 하나 개의 단지에 긍정적 인 표시와 데이터 세트 생성이 수단 "Male" 유일한 긍정적 분류와 예와 다른 "Female" 예; 이것이 MinDiff 데이터 셋이 될 것입니다.

먼저 존재하는 데이터를 조사하십시오.

female_pos = train[(train['sex'] == ' Female') & (train['target'] == 1)]
male_pos = train[(train['sex'] == ' Male') & (train['target'] == 1)]
print(len(female_pos), 'positively labeled female examples')
print(len(male_pos), 'positively labeled male examples')
385 positively labeled female examples
2063 positively labeled male examples

원래 데이터 세트의 하위 집합에서 MinDiff 데이터 세트를 만드는 것은 완벽하게 허용됩니다.

요구 사항 지침 에서 권장하는 긍정적 인 "Male" 예가 5,000 개 이상은 아니지만 2,000 개가 넘으며 더 많은 데이터를 수집하기 전에 많은 수로 시도하는 것이 합리적입니다.

min_diff_male_ds = df_to_dataset(male_pos)

그러나 긍정적 인 "Female" 예는 385에서 훨씬 부족합니다. 이것은 좋은 성능을 얻기에는 너무 작기 때문에 추가 예를 들어야합니다.

full_uci_train = tutorials_utils.get_uci_data(split='train')
augmented_female_pos = full_uci_train[((full_uci_train['sex'] == ' Female') &
                                       (full_uci_train['target'] == 1))]
print(len(augmented_female_pos), 'positively labeled female examples')
1179 positively labeled female examples

전체 데이터 세트를 사용하면 MinDiff에 사용할 수있는 예제 수가 3 배 이상 증가했습니다. 여전히 낮지 만 첫 번째 패스로 시도하기에 충분합니다.

min_diff_female_ds = df_to_dataset(augmented_female_pos)

두 MinDiff 데이터 세트는 권장되는 5,000 개 이상의 예제보다 훨씬 작습니다. 현재 데이터에 MinDiff를 적용하는 것이 합리적이지만 훈련 중에 성능이 저하되거나 과적 합이 관찰되는 경우 추가 데이터 수집을 고려해야 할 수도 있습니다.

tf.data.Dataset.filter 사용

또는 변환 된 원본 Dataset 에서 직접 두 개의 MinDiff 데이터 세트를 만들 수 있습니다.

# Male
def male_predicate(x, y):
  return tf.equal(x['sex'], b' Male') and tf.equal(y, 0)

alternate_min_diff_male_ds = original_train_ds.filter(male_predicate).cache()

# Female
def female_predicate(x, y):
  return tf.equal(x['sex'], b' Female') and tf.equal(y, 0)

full_uci_train_ds = df_to_dataset(full_uci_train)
alternate_min_diff_female_ds = full_uci_train_ds.filter(female_predicate).cache()

결과 alternate_min_diff_male_dsalternate_min_diff_female_ds 는 출력에서 ​​각각 min_diff_male_dsmin_diff_female_dsmin_diff_female_ds 합니다.

훈련 데이터 세트 구성

마지막 단계로 세 개의 데이터 세트 (새로 생성 된 두 개의 데이터 세트와 원본)를 모델에 전달할 수있는 단일 데이터 세트로 병합해야합니다.

데이터 세트 일괄 처리

병합하기 전에 데이터 세트를 일괄 처리해야합니다.

  • 원래 데이터 세트는 MinDiff를 통합하기 전에 사용 된 것과 동일한 일괄 처리를 사용할 수 있습니다.
  • MinDiff 데이터 세트는 원래 데이터 세트와 동일한 배치 크기를 가질 필요가 없습니다. 아마도 더 작은 것이 똑같이 작동 할 것입니다. 서로 동일한 배치 크기를 가질 필요는 없지만 최상의 성능을 위해 그렇게하는 것이 좋습니다.

꼭 필요한 것은 아니지만 두 개의 MinDiff 데이터 세트에 대해 drop_remainder=True 를 사용하는 것이 좋습니다. 이렇게하면 배치 크기가 일관되게 보장됩니다.

original_train_ds = original_train_ds.batch(128)  # Same as before MinDiff.

# The MinDiff datasets can have a different batch_size from original_train_ds
min_diff_female_ds = min_diff_female_ds.batch(32, drop_remainder=True)
# Ideally we use the same batch size for both MinDiff datasets.
min_diff_male_ds = min_diff_male_ds.batch(32, drop_remainder=True)

pack_min_diff_data 데이터 세트 pack_min_diff_data

데이터 세트가 준비되면 단일 데이터 세트로 압축하여 모델로 전달합니다. 결과 데이터 세트의 단일 배치에는 이전에 준비한 세 개의 데이터 세트 각각의 배치가 하나씩 포함됩니다.

tensorflow_model_remediation 패키지에 제공된 utils 함수를 사용하여이를 수행 할 수 있습니다.

train_with_min_diff_ds = min_diff.keras.utils.pack_min_diff_data(
    original_dataset=original_train_ds,
    sensitive_group_dataset=min_diff_female_ds,
    nonsensitive_group_dataset=min_diff_male_ds)

그리고 그게 다야! 필요한 경우 패키지의 다른 util 함수를 사용하여 개별 배치의 압축을 풀 수 있습니다.

for inputs, original_labels in train_with_min_diff_ds.take(1):
  # Unpacking min_diff_data
  min_diff_data = min_diff.keras.utils.unpack_min_diff_data(inputs)
  min_diff_examples, min_diff_membership = min_diff_data
  # Unpacking original data
  original_inputs = min_diff.keras.utils.unpack_original_inputs(inputs)

새로 형성된 데이터로 이제 모델에 MinDiff를 적용 할 준비가되었습니다! 이것이 어떻게 수행되는지 알아 보려면 MinDiff를 MinDiffModel통합 하기 시작하는 다른 가이드 를 참조하십시오 .

사용자 지정 포장 형식 사용 (선택 사항)

원하는 방식으로 세 개의 데이터 세트를 함께 압축 할 수 있습니다. 유일한 요구 사항은 모델이 데이터를 해석하는 방법을 알고 있는지 확인해야한다는 것입니다. MinDiffModel 의 기본 구현은 데이터가 min_diff.keras.utils.pack_min_diff_data 사용하여 압축 MinDiffModel 가정합니다.

원하는대로 입력 형식을 지정하는 쉬운 방법 중 하나는 min_diff.keras.utils.pack_min_diff_data 사용한 후 마지막 단계로 데이터를 변환하는 min_diff.keras.utils.pack_min_diff_data 입니다.

# Reformat input to be a dict.
def _reformat_input(inputs, original_labels):
  unpacked_min_diff_data = min_diff.keras.utils.unpack_min_diff_data(inputs)
  unpacked_original_inputs = min_diff.keras.utils.unpack_original_inputs(inputs)

  return {
      'min_diff_data': unpacked_min_diff_data,
      'original_data': (unpacked_original_inputs, original_labels)}

customized_train_with_min_diff_ds = train_with_min_diff_ds.map(_reformat_input)

모델은 MinDiffModel 사용자 지정 가이드에 자세히 설명 된 대로이 사용자 지정 입력을 읽는 방법을 알아야합니다.

for batch in customized_train_with_min_diff_ds.take(1):
  # Customized unpacking of min_diff_data
  min_diff_data = batch['min_diff_data']
  # Customized unpacking of original_data
  original_data = batch['original_data']

추가 자료

  • 공정성 평가에 대한 심층 토론은 공정성 지표 지침을 참조하십시오.
  • 수정 및 MinDiff에 대한 일반 정보는 수정 개요를 참조하십시오.
  • MinDiff와 관련된 요구 사항에 대한 자세한 내용은 이 가이드를 참조하십시오.
  • Keras에서 MinDiff를 사용하는 방법에 대한 종단 간 자습서를 보려면 이 자습서를 참조하십시오.

이 가이드는 MinDiff를 적용 할 때마다 따를 수있는 프로세스와 의사 결정에 대해 설명합니다. 나머지 가이드는이 프레임 워크를 기반으로합니다. 이 작업을 더 쉽게하기 위해이 가이드에있는 로직이 도우미 함수에 포함되었습니다.

  • get_uci_data :이 함수는이 가이드에서 이미 사용되었습니다. 표시된 비율로 샘플링 된 표시된 분할의 UCI 수입 데이터가 포함 된 DataFrame 을 반환합니다 (지정되지 않은 경우 100 %).
  • df_to_dataset :이 함수는 변환 DataFrame (A) 내로tf.data.Dataset 파라미터로 BATCH_SIZE을 통과 할 수 있다는 추가 기능이 가이드에 자세히 설명한다.
  • get_uci_with_min_diff_dataset :이 함수는이 가이드에 설명 된대로 모델 수정 라이브러리 유틸리티 함수를 사용하여 함께 압축 된 원본 데이터와 MinDiff 데이터를 모두 포함하는tf.data.Dataset 을 반환합니다.

나머지 가이드는 라이브러리의 다른 부분을 사용하는 방법을 보여주기 위해 이들을 기반으로합니다.