MinDiff Verilerinin Hazırlanması

Tanıtım

MinDiff'i uygularken, girdilerinizi modele aktarmadan önce seçip şekillendirirken karmaşık kararlar vermeniz gerekecektir. Bu kararlar, modelinizdeki MinDiff'in davranışını büyük ölçüde belirleyecektir.

Bu kılavuz, bu sürecin teknik yönlerini kapsayacak, ancak bir modelin adalet açısından nasıl değerlendirileceğini veya değerlendirme için belirli dilimlerin ve metriklerin nasıl tanımlanacağını tartışmayacaktır. Bakınız Adil Göstergeler rehberlik bu konuda ayrıntılı bilgi için.

MinDiff göstermek için, bu kılavuz kullanan UCI gelir veri kümesi . Model görevi, bir bireyin çeşitli kişisel özelliklere dayalı olarak 50 bin doları aşan bir gelire sahip olup olmadığını tahmin etmektir. Bu kılavuz arasındaki FNR'nin içinde sorunlu bir boşluk (yanlış negatif oranı) bulunduğunu varsayar "Male" ve "Female" dilimler ve model sahibi (siz) sorunu gidermek için MinDiff uygulanmasına karar vermiştir. Bir MinDiff uygulamasını tercih edebilir hangi senaryolar hakkında daha fazla bilgi için bkz gereksinimleri sayfasına .

MinDiff, iki veri kümesindeki örnekler arasındaki dağılım puanlarındaki farkı cezalandırarak çalışır. Bu kılavuz, bu ek MinDiff setlerinin nasıl seçileceğini ve oluşturulacağını ve ayrıca eğitim için bir modele geçirilebilmesi için her şeyin nasıl birlikte paketleneceğini gösterecektir.

Kurmak

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

Orjinal veri

Gösteri amacıyla ve çalışma sürelerini azaltmak için bu kılavuz, UCI Gelir veri setinin yalnızca örnek bir kısmını kullanır. Gerçek bir üretim ortamında, tam veri seti kullanılacaktır.

# 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

Dönüştürülüyor tf.data.Dataset

MinDiffModel girdi bir olmasını gerektirir tf.data.Dataset . MinDiff'i entegre etmeden önce farklı bir girdi formatı kullanıyorsanız, girdi verilerinizi dönüştürmeniz gerekecektir.

Kullanım tf.data.Dataset.from_tensor_slices dönüştürmek tf.data.Dataset .

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

Bkz Model.fit giriş iki yöntem arasındaki denklik ile ilgili ayrıntılar için belgelere.

Bu kılavuzda, girdi Pandas DataFrame olarak indirilir ve bu nedenle bu dönüştürmeye ihtiyaç duyar.

# 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 verileri oluşturma

Eğitim sırasında MinDiff, modeli iki ek veri kümesi (orijinal veri kümesinden örnekler içerebilir) arasındaki tahminlerdeki farklılıkları azaltmaya teşvik edecektir. Bu iki veri kümesinin seçimi, MinDiff'in model üzerindeki etkisini belirleyecek kilit karardır.

İki veri kümesi, düzeltmeye çalıştığınız performans eşitsizliği belirgin ve iyi temsil edilecek şekilde seçilmelidir. Hedef arasında FNR'nin bir boşluk azaltmak için olduğu "Male" ve "Female" dilimler, bir tek pozitif etiketli ile veri kümesi oluşturmak Bu araçlar "Male" sadece pozitif etiketli olan örnekler ve başka "Female" örnekleri; bunlar MinDiff veri kümeleri olacaktır.

İlk olarak, mevcut verileri inceleyin.

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

Orijinal veri kümesinin alt kümelerinden MinDiff veri kümeleri oluşturmak tamamen kabul edilebilir.

5000 veya daha fazla pozitif orada olmasa da "Male" önerildiği gibi örnekler gereksinimleri rehberlik , oradaki 2.000 vardır ve daha fazla veri toplama önce birçok ile denemek için makul.

min_diff_male_ds = df_to_dataset(male_pos)

Pozitif "Female" örnekleri ise bu ek örneklerde çekerek gerektirecektir yüzden muhtemelen iyi performans için çok küçük ve 385. çok daha seyrek olarak.

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

Tam veri kümesini kullanmak, MinDiff için kullanılabilecek örnek sayısını üç katından fazla artırdı. Hala düşük ama ilk geçiş olarak denemek yeterli.

min_diff_female_ds = df_to_dataset(augmented_female_pos)

Her iki MinDiff veri seti, önerilen 5.000 veya daha fazla örnekten önemli ölçüde daha küçüktür. MinDiff'i mevcut verilerle uygulamaya çalışmak mantıklı olsa da, eğitim sırasında düşük performans veya fazla uyum gözlemlerseniz ek veri toplamayı düşünmeniz gerekebilir.

kullanılması tf.data.Dataset.filter

Alternatif olarak, dönüştürülmüş orijinal doğrudan iki MinDiff veri setlerini oluşturabilir 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()

Elde edilen alternate_min_diff_male_ds ve alternate_min_diff_female_ds çıktı olarak eşdeğer olacaktır min_diff_male_ds ve min_diff_female_ds sırasıyla.

Eğitim Veri Kümenizi Oluşturma

Son bir adım olarak, üç veri kümesinin (yeni oluşturulan ikisi ve orijinal), modele geçirilebilecek tek bir veri kümesinde birleştirilmesi gerekir.

Veri kümelerini gruplama

Birleştirmeden önce, veri kümelerinin toplu hale getirilmesi gerekir.

  • Orijinal veri kümesi, MinDiff'i entegre etmeden önce kullanılan aynı toplu işlemi kullanabilir.
  • MinDiff veri kümelerinin, orijinal veri kümesiyle aynı toplu iş boyutuna sahip olması gerekmez. Her durumda, daha küçük olanı da aynı şekilde performans gösterecektir. Birbirleriyle aynı parti boyutuna sahip olmaları bile gerekmese de, en iyi performans için bunu yapmaları önerilir.

Kesinlikle gerekli olmasa da, kullanım tavsiye edilir drop_remainder=True onlar tutarlı toplu boyutlarına sahip olmasını sağlayacaktır bu iki MinDiff veri kümeleri için.

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)

İle Veri Kümeleri Ambalaj pack_min_diff_data

Veri kümeleri hazırlandıktan sonra, bunları daha sonra modele iletilecek olan tek bir veri kümesinde paketleyin. Ortaya çıkan veri kümesinden tek bir toplu iş, daha önce hazırladığınız üç veri kümesinin her birinden bir toplu iş içerecektir.

Sağlanan kullanarak bunu yapabilirsiniz utils işlevi tensorflow_model_remediation paketinin:

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)

Ve bu kadar! Diğer kullanmak mümkün olacak util gerekirse paketten her bir serinin paketinde işlevleri.

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)

Yeni oluşturduğunuz verilerle artık MinDiff'i modelinize uygulamaya hazırsınız! Bu yapıldığında nasıl yapılacağını öğrenmek için başlayarak diğer kılavuzları bir göz atın lütfen MinDiffModel ile MinDiff entegre .

Özel Paketleme Formatı Kullanma (isteğe bağlı)

Seçtiğiniz herhangi bir şekilde üç veri kümesini bir araya getirmeye karar verebilirsiniz. Tek gereksinim, modelin verileri nasıl yorumlayacağını bildiğinden emin olmanız gerekmesidir. Varsayılan uygulaması MinDiffModel veriler kullanılarak doluydu varsayar min_diff.keras.utils.pack_min_diff_data .

İstediğiniz kadar biçiminde giriş kolay bir yolu size kullanılan aldıktan sonra son adım olarak verileri dönüştürmektir 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)

Modeliniz ayrıntılı olarak bu özelleştirilmiş girişi nasıl okunacağını bilmek gerekir Özelleştirme MinDiffModel rehber .

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']

Ek kaynaklar

  • Adalet değerlendirmeye derin tartışmalara için bkz Adil Göstergeler rehberlik
  • İyileştirme ve MinDiff hakkında genel bilgi için, bkz düzeltme bakış .
  • MinDiff çevreleyen gereksinimleri hakkında ayrıntılı bilgi için bkz bu kılavuzu .
  • Keras içinde MinDiff kullanma konusunda uçtan uca öğretici görmek için bkz bu öğretici .

Bu kılavuz, MinDiff'i uygularken izleyebileceğiniz süreci ve karar verme sürecini özetlemektedir. Kılavuzların geri kalanı bu çerçeveyi oluşturur. Bunu kolaylaştırmak için, bu kılavuzda bulunan mantık, yardımcı işlevlere dahil edilmiştir:

  • get_uci_data : Bu fonksiyon zaten bu kılavuzda kullanılır. Bir döner DataFrame (% 100 belirtilmemiş ise) gösterilir ne oranı örneklenir gösterilen bölünme UCI gelir verilerini ihtiva etmektedir.
  • df_to_dataset : Bu fonksiyon, bir dönüştüren DataFrame bir içine tf.data.Dataset bir parametre olarak batch_size geçemediğinden ilave işlevsellik ile, bu kılavuz ayrıntılı olarak.
  • get_uci_with_min_diff_dataset : Bu fonksiyon döner bir tf.data.Dataset bu kılavuzda açıklandığı gibi orijinal veri ve MinDiff verisini içeren bir araya fonksiyonları util Model İyileştirme Kitaplığı kullanılarak paketlenmiş.

Kılavuzların geri kalanı, kitaplığın diğer bölümlerinin nasıl kullanılacağını göstermek için bunlardan oluşacaktır.