Wstęp
Istnieją dwa kroki, aby zintegrować MinDiff z twoim modelem:
Przygotowanie danych (objętych w prowadnicy preparatu wejściowego ).
Zmień lub stwórz model, który zintegruje MinDiff podczas treningu.
Podręcznik ten obejmie najprostszy sposób, aby zakończyć drugi krok: using MinDiffModel
.
Ustawiać
pip install -q --upgrade tensorflow-model-remediation
import tensorflow as tf
tf.get_logger().setLevel('ERROR') # Avoid TF warnings.
from tensorflow_model_remediation import min_diff
from tensorflow_model_remediation.tools.tutorials_utils import uci as tutorials_utils
Najpierw pobierz dane. Dla zwięzłości, logika przygotowanie wejścia zostały uwzględnione z pomocnikiem do funkcji opisanych w przewodniku przygotowania wejścia . Możesz przeczytać pełny przewodnik, aby uzyskać szczegółowe informacje na temat tego procesu.
# Original DataFrame for training, sampled at 0.3 for reduced runtimes.
train_df = tutorials_utils.get_uci_data(split='train', sample=0.3)
# Dataset needed to train with MinDiff.
train_with_min_diff_ds = (
tutorials_utils.get_uci_with_min_diff_dataset(split='train', sample=0.3))
Oryginalny model
Podręcznik ten wykorzystuje podstawowe, niewyregulowanym keras.Model
pomocą API Functional aby podświetlić za pomocą MinDiff. W rzeczywistej aplikacji należy starannie wybrać architekturę modelu i użyć strojenia, aby poprawić jakość modelu przed próbą rozwiązania jakichkolwiek problemów ze sprawiedliwością.
Od MinDiffModel
został zaprojektowany do pracy z większością Keras Model
klas, mamy zbitek logikę budowy modelu do funkcji pomocniczych: get_uci_model
.
Trening z Pandas DataFrame
Ten przewodnik szkoli prędkość w jednej epoce, ale może łatwo poprawić wydajność modelu, zwiększając liczbę epok.
model = tutorials_utils.get_uci_model()
model.compile(optimizer='adam', loss='binary_crossentropy')
df_without_target = train_df.drop(['target'], axis=1) # Drop 'target' for x.
_ = model.fit(
x=dict(df_without_target), # The model expects a dictionary of features.
y=train_df['target'],
batch_size=128,
epochs=1)
77/77 [==============================] - 3s 23ms/step - loss: 0.8589
Szkolenie z tf.data.Dataset
Równoważnik szkolenia z tf.data.Dataset
byłby bardzo podobny (chociaż inicjalizacji i losowości wejściowe mogą dawać nieco różne wyniki).
model = tutorials_utils.get_uci_model()
model.compile(optimizer='adam', loss='binary_crossentropy')
_ = model.fit(
tutorials_utils.df_to_dataset(train_df, batch_size=128), # Converted to Dataset.
epochs=1)
77/77 [==============================] - 3s 23ms/step - loss: 0.6416
Integracja MinDiff do treningu
Po przygotowaniu danych zastosuj MinDiff do swojego modelu, wykonując następujące czynności:
- Utwórz oryginalny model tak, jak bez MinDiff.
original_model = tutorials_utils.get_uci_model()
- Owinąć go w
MinDiffModel
.
min_diff_model = min_diff.keras.MinDiffModel(
original_model=original_model,
loss=min_diff.losses.MMDLoss(),
loss_weight=1)
- Skompiluj to tak, jak byś bez MinDiff.
min_diff_model.compile(optimizer='adam', loss='binary_crossentropy')
- Trenować go z zestawu danych MinDiff (
train_with_min_diff_ds
w tym przypadku).
_ = min_diff_model.fit(train_with_min_diff_ds, epochs=1)
77/77 [==============================] - 6s 31ms/step - loss: 0.7883 - min_diff_loss: 0.0379
Ocena i przewidywanie z MinDiffModel
Zarówno oceny i przewidywania z MinDiffModel
są podobne do robi tak z oryginalnego modelu.
Dzwoniąc evaluate
można przejść w dowolnym oryginalnego zbioru danych lub jeden zawierający dane MinDiff. Jeśli wybierzesz to drugie, można również uzyskać min_diff_loss
metryczny oprócz wszelkich innych wskaźników mierzonych loss
będzie również obejmować min_diff_loss
.
Dzwoniąc evaluate
można przejść w dowolnym oryginalnego zbioru danych lub jeden zawierający dane MinDiff. Jeśli uwzględnisz MinDiff w wywołaniu do oceny, dwie rzeczy będą się różnić:
- Dodatkowym metryczny nazywa
min_diff_loss
będzie obecny na wyjściu. - Wartość
loss
metryki będzie sumą pierwotnegoloss
danych (nie pokazany na wyjściu) imin_diff_loss
.
_ = min_diff_model.evaluate(
tutorials_utils.df_to_dataset(train_df, batch_size=128))
# Calling with MinDiff data will include min_diff_loss in metrics.
_ = min_diff_model.evaluate(train_with_min_diff_ds)
77/77 [==============================] - 2s 22ms/step - loss: 0.4638 77/77 [==============================] - 3s 32ms/step - loss: 0.5087 - min_diff_loss: 0.0451
Dzwoniąc predict
można również przekazać technicznie w zbiorze danych z danymi MinDiff ale będzie ignorowane i nie wpływa na wydajność.
_ = min_diff_model.predict(
tutorials_utils.df_to_dataset(train_df, batch_size=128))
_ = min_diff_model.predict(train_with_min_diff_ds) # Identical to results above.
Ograniczenia stosowania MinDiffModel
bezpośrednio
W przypadku korzystania z MinDiffModel
jak opisano powyżej, większość metod użyje implementacje domyślne tf.keras.Model
(wyjątki podane w dokumentacji API ).
print('MinDiffModel.fit == keras.Model.fit')
print(min_diff.keras.MinDiffModel.fit == tf.keras.Model.fit)
print('MinDiffModel.train_step == keras.Model.train_step')
print(min_diff.keras.MinDiffModel.train_step == tf.keras.Model.train_step)
MinDiffModel.fit == keras.Model.fit True MinDiffModel.train_step == keras.Model.train_step True
Dla keras.Sequential
lub keras.Model
, to jest w porządku, ponieważ korzystają z tych samych funkcji.
print('Sequential.fit == keras.Model.fit')
print(tf.keras.Sequential.fit == tf.keras.Model.fit)
print('tf.keras.Sequential.train_step == keras.Model.train_step')
print(tf.keras.Sequential.train_step == tf.keras.Model.train_step)
Sequential.fit == keras.Model.fit True tf.keras.Sequential.train_step == keras.Model.train_step True
Jednakże, jeśli twój model jest podklasą keras.Model
, owijając go MinDiffModel
skutecznie stracić dostosowywania.
class CustomModel(tf.keras.Model):
def train_step(self, **kwargs):
pass # Custom implementation.
print('CustomModel.train_step == keras.Model.train_step')
print(CustomModel.train_step == tf.keras.Model.train_step)
CustomModel.train_step == keras.Model.train_step False
Jeśli jest to Twój przypadek użycia, nie należy używać MinDiffModel
bezpośrednio. Zamiast tego trzeba będzie rozszerzyć ją, jak to opisano w przewodniku dostosowywania .
Dodatkowe zasoby
- Dla dogłębnej dyskusji na temat oceny rzetelności patrz wytyczne Fairness Indicators
- Aby uzyskać ogólne informacje na naprawę i MinDiff, zobacz przegląd naprawcze .
- Szczegółowe informacje na temat wymagań otaczających MinDiff zobaczyć ten podręcznik .
- Aby zobaczyć samouczek end-to-end na wykorzystaniu MinDiff w Keras, zobacz ten samouczek .