MinDiff 데이터 준비

소개

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

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

MinDiff을 보여주기 위해,이 가이드는 사용 UCI 소득 데이터 집합을 . 모델 작업은 다양한 개인 속성을 기반으로 개인의 소득이 $50,000를 초과하는지 여부를 예측하는 것입니다. 이 가이드 사이의 FNR에 문제가 격차 (위음성 율)가 있다고 가정 "Male""Female" 조각 및 모델 소유자가 (당신이) 문제를 해결하기 위해 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 데이터 세트를 생성하는 것은 완벽하게 허용됩니다.

5,000 더 긍정적이 아니지만 "Male" 말씀 드린 예 요구 사항 안내 , 저기 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에 사용할 수 있는 예제 수가 세 배 이상 있습니다. 아직 미미하지만 첫 번째 패스로 시도하기에 충분합니다.

min_diff_female_ds = df_to_dataset(augmented_female_pos)

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

사용 tf.data.Dataset.filter

또는, 변환 된 원본에서 직접이 개 MinDiff 데이터 세트를 생성 할 수 있습니다 Dataset .

# 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_ds 각각.

훈련 데이터 세트 구성

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

데이터세트 일괄 처리

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

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

반드시 필요한 것은 아니지만, 사용을 권장 drop_remainder=True 들이 일관된 배치 크기를 가지고 있는지 확인한다이 같은 두 MinDiff 데이터 세트에 대한.

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

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

당신은 제공된 사용하여이 작업을 수행 할 수 utils 의 기능 tensorflow_model_remediation 패키지를 :

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를 적용할 준비가 되었습니다! 이 작업이 완료 방법에 대한 자세한 내용은,로 시작하는 다른 가이드를 살펴 보시기 바랍니다 MinDiffModel와 MinDiff 통합을 .

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

어떤 방식으로든 3개의 데이터세트를 함께 묶기로 결정할 수 있습니다. 유일한 요구 사항은 모델이 데이터를 해석하는 방법을 알고 있는지 확인해야 한다는 것입니다. 의 기본 구현 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를 적용할 때마다 따를 수 있는 프로세스와 의사 결정에 대해 설명합니다. 나머지 가이드는 이 프레임워크를 기반으로 합니다. 이를 쉽게 하기 위해 이 가이드에 있는 논리를 도우미 함수로 고려했습니다.

  • get_uci_data :이 기능은 이미이 설명서에 사용된다. 그것은 반환 DataFrame (100 % 지정되지 않은 경우) 표시됩니다 어떤 속도로 샘플링 표시된 분할에서 UCI 소득 데이터를 포함합니다.
  • df_to_dataset :이 함수는 변환 DataFrame (A) 내로 tf.data.Dataset 파라미터로 BATCH_SIZE을 통과 할 수 있다는 추가 기능이 가이드에 자세히 설명한다.
  • get_uci_with_min_diff_dataset 이 기능은 리턴 tf.data.Dataset 이 설명서에 기재된 바와 같이 원래의 데이터와 MinDiff 데이터를 모두 포함 함께 기능 util을 재조정 모델 라이브러리를 사용하여 포장.

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