Ta strona została przetłumaczona przez Cloud Translation API.
Switch to English

Walidacja danych TensorFlow

Przykład kluczowego komponentu TensorFlow Extended

Ten przykładowy notatnik colab ilustruje, jak TensorFlow Data Validation (TFDV) może być używany do badania i wizualizacji zbioru danych. Obejmuje to przeglądanie statystyk opisowych, wnioskowanie o schemacie, sprawdzanie i naprawianie anomalii oraz sprawdzanie dryfu i pochylenia w naszym zbiorze danych. Ważne jest, aby zrozumieć cechy zestawu danych, w tym, jak może się on zmieniać w czasie w potoku produkcyjnym. Ważne jest również, aby szukać anomalii w danych i porównywać zestawy danych dotyczące uczenia, oceny i udostępniania, aby upewnić się, że są one spójne.

Wykorzystamy dane ze zbioru danych Taxi Trips opublikowanego przez miasto Chicago.

Przeczytaj więcej o zbiorze danych w Google BigQuery . Poznaj pełny zestaw danych w interfejsie użytkownika BigQuery .

Kolumny w zbiorze danych to:

pickup_community_area opłata trip_start_month
trip_start_hour trip_start_day trip_start_timestamp
pickup_latitude pickup_longitude dropoff_latitude
dropoff_longitude trip_miles pickup_census_tract
dropoff_census_tract typ płatności firma
trip_seconds dropoff_community_area wskazówki

Upgrade Pip

Aby uniknąć aktualizacji Pipa w systemie podczas pracy lokalnie, upewnij się, że działamy w Colab. Systemy lokalne można oczywiście aktualizować oddzielnie.

try:
  import colab
  !pip install --upgrade pip
except:
  pass

Zainstaluj TensorFlow

pip install tensorflow==2.2.0
Collecting tensorflow==2.2.0
  Using cached tensorflow-2.2.0-cp36-cp36m-manylinux2010_x86_64.whl (516.2 MB)
Requirement already satisfied: gast==0.3.3 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorflow==2.2.0) (0.3.3)
Requirement already satisfied: wheel>=0.26; python_version >= "3" in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorflow==2.2.0) (0.35.1)
Requirement already satisfied: astunparse==1.6.3 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorflow==2.2.0) (1.6.3)
Requirement already satisfied: opt-einsum>=2.3.2 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorflow==2.2.0) (3.3.0)
Requirement already satisfied: absl-py>=0.7.0 in /home/kbuilder/.local/lib/python3.6/site-packages (from tensorflow==2.2.0) (0.9.0)
Requirement already satisfied: protobuf>=3.8.0 in /home/kbuilder/.local/lib/python3.6/site-packages (from tensorflow==2.2.0) (3.13.0)
Collecting tensorflow-estimator<2.3.0,>=2.2.0
  Using cached tensorflow_estimator-2.2.0-py2.py3-none-any.whl (454 kB)
Requirement already satisfied: h5py<2.11.0,>=2.10.0 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorflow==2.2.0) (2.10.0)
Requirement already satisfied: google-pasta>=0.1.8 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorflow==2.2.0) (0.2.0)
Requirement already satisfied: wrapt>=1.11.1 in /home/kbuilder/.local/lib/python3.6/site-packages (from tensorflow==2.2.0) (1.12.1)
Requirement already satisfied: grpcio>=1.8.6 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorflow==2.2.0) (1.31.0)
Requirement already satisfied: numpy<2.0,>=1.16.0 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorflow==2.2.0) (1.18.5)
Requirement already satisfied: termcolor>=1.1.0 in /home/kbuilder/.local/lib/python3.6/site-packages (from tensorflow==2.2.0) (1.1.0)
Requirement already satisfied: scipy==1.4.1; python_version >= "3" in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorflow==2.2.0) (1.4.1)
Collecting tensorboard<2.3.0,>=2.2.0
  Using cached tensorboard-2.2.2-py3-none-any.whl (3.0 MB)
Requirement already satisfied: keras-preprocessing>=1.1.0 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorflow==2.2.0) (1.1.2)
Requirement already satisfied: six>=1.12.0 in /home/kbuilder/.local/lib/python3.6/site-packages (from tensorflow==2.2.0) (1.15.0)
Requirement already satisfied: setuptools in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from protobuf>=3.8.0->tensorflow==2.2.0) (49.6.0)
Requirement already satisfied: tensorboard-plugin-wit>=1.6.0 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (1.7.0)
Requirement already satisfied: werkzeug>=0.11.15 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (1.0.1)
Requirement already satisfied: google-auth<2,>=1.6.3 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (1.20.1)
Requirement already satisfied: requests<3,>=2.21.0 in /home/kbuilder/.local/lib/python3.6/site-packages (from tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (2.24.0)
Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (0.4.1)
Requirement already satisfied: markdown>=2.6.8 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (3.2.2)
Requirement already satisfied: pyasn1-modules>=0.2.1 in /usr/lib/python3/dist-packages (from google-auth<2,>=1.6.3->tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (0.2.1)
Requirement already satisfied: rsa<5,>=3.1.4; python_version >= "3.5" in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from google-auth<2,>=1.6.3->tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (4.6)
Requirement already satisfied: cachetools<5.0,>=2.0.0 in /home/kbuilder/.local/lib/python3.6/site-packages (from google-auth<2,>=1.6.3->tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (4.1.1)
Requirement already satisfied: certifi>=2017.4.17 in /home/kbuilder/.local/lib/python3.6/site-packages (from requests<3,>=2.21.0->tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (2020.6.20)
Requirement already satisfied: chardet<4,>=3.0.2 in /usr/lib/python3/dist-packages (from requests<3,>=2.21.0->tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (3.0.4)
Requirement already satisfied: idna<3,>=2.5 in /usr/lib/python3/dist-packages (from requests<3,>=2.21.0->tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (2.6)
Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/lib/python3/dist-packages (from requests<3,>=2.21.0->tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (1.22)
Requirement already satisfied: requests-oauthlib>=0.7.0 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (1.3.0)
Requirement already satisfied: importlib-metadata; python_version < "3.8" in /home/kbuilder/.local/lib/python3.6/site-packages (from markdown>=2.6.8->tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (1.7.0)
Requirement already satisfied: pyasn1>=0.1.3 in /usr/lib/python3/dist-packages (from rsa<5,>=3.1.4; python_version >= "3.5"->google-auth<2,>=1.6.3->tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (0.4.2)
Requirement already satisfied: oauthlib>=3.0.0 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (3.1.0)
Requirement already satisfied: zipp>=0.5 in /home/kbuilder/.local/lib/python3.6/site-packages (from importlib-metadata; python_version < "3.8"->markdown>=2.6.8->tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (3.1.0)
Installing collected packages: tensorflow-estimator, tensorboard, tensorflow
  Attempting uninstall: tensorflow-estimator
    Found existing installation: tensorflow-estimator 2.3.0
    Uninstalling tensorflow-estimator-2.3.0:
      Successfully uninstalled tensorflow-estimator-2.3.0
  Attempting uninstall: tensorboard
    Found existing installation: tensorboard 2.3.0
    Uninstalling tensorboard-2.3.0:
      Successfully uninstalled tensorboard-2.3.0
  Attempting uninstall: tensorflow
    Found existing installation: tensorflow 2.3.0
    Uninstalling tensorflow-2.3.0:
      Successfully uninstalled tensorflow-2.3.0
Successfully installed tensorboard-2.2.2 tensorflow-2.2.0 tensorflow-estimator-2.2.0

Sprawdź wersję Pythona

import sys

# Confirm that we're using Python 3
assert sys.version_info.major is 3, 'Oops, not running Python 3. Use Runtime > Change runtime type'

Zainstaluj TFDV

Spowoduje to ściągnięcie wszystkich zależności, co zajmie minutę. Proszę zignorować ostrzeżenia lub błędy dotyczące niezgodnych wersji zależności.

import tensorflow as tf

print('Installing TensorFlow Data Validation')
!pip install -q tensorflow_data_validation[visualization]
Installing TensorFlow Data Validation

Czy zrestartowałeś środowisko wykonawcze?

Jeśli używasz Google Colab, przy pierwszym uruchomieniu powyższej komórki musisz ponownie uruchomić środowisko wykonawcze (Środowisko wykonawcze> Uruchom ponownie środowisko wykonawcze ...). Wynika to ze sposobu, w jaki Colab ładuje paczki.

Załaduj pliki

Pobieramy nasz zestaw danych z Google Cloud Storage.

import os
import tempfile, urllib, zipfile

# Set up some globals for our file paths
BASE_DIR = tempfile.mkdtemp()
DATA_DIR = os.path.join(BASE_DIR, 'data')
OUTPUT_DIR = os.path.join(BASE_DIR, 'chicago_taxi_output')
TRAIN_DATA = os.path.join(DATA_DIR, 'train', 'data.csv')
EVAL_DATA = os.path.join(DATA_DIR, 'eval', 'data.csv')
SERVING_DATA = os.path.join(DATA_DIR, 'serving', 'data.csv')

# Download the zip file from GCP and unzip it
zip, headers = urllib.request.urlretrieve('https://storage.googleapis.com/artifacts.tfx-oss-public.appspot.com/datasets/chicago_data.zip')
zipfile.ZipFile(zip).extractall(BASE_DIR)
zipfile.ZipFile(zip).close()

print("Here's what we downloaded:")
!ls -R {os.path.join(BASE_DIR, 'data')}
Here's what we downloaded:
/tmp/tmpgsqn6btn/data:
eval  serving  train

/tmp/tmpgsqn6btn/data/eval:
data.csv

/tmp/tmpgsqn6btn/data/serving:
data.csv

/tmp/tmpgsqn6btn/data/train:
data.csv

Sprawdź wersję

import tensorflow_data_validation as tfdv
print('TFDV version: {}'.format(tfdv.version.__version__))
TFDV version: 0.23.0

Obliczaj i wizualizuj statystyki

Najpierw użyjemy tfdv.generate_statistics_from_csv do obliczenia statystyk dla naszych danych szkoleniowych. (zignoruj ​​zgryźliwe ostrzeżenia)

TFDV może obliczać statystyki opisowe, które zapewniają szybki przegląd danych pod względem obecnych cech i kształtów ich rozkładów wartości.

Wewnętrznie, TFDV wykorzystuje platformę przetwarzania równoległego danych Apache Beam do skalowania obliczeń statystyk na duże zbiory danych. W przypadku aplikacji, które chcą głębiej zintegrować się z TFDV (np. Dołączyć generowanie statystyk na końcu potoku generowania danych), API udostępnia również Beam PTransform do generowania statystyk.

train_stats = tfdv.generate_statistics_from_csv(data_location=TRAIN_DATA)
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_data_validation/utils/stats_util.py:229: 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_data_validation/utils/stats_util.py:229: 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)`

Teraz tfdv.visualize_statistics , który wykorzystuje Facets do stworzenia zwięzłej wizualizacji naszych danych szkoleniowych:

  • Zwróć uwagę, że cechy numeryczne i cechy katagoryczne są wizualizowane osobno, a wykresy są wyświetlane, pokazując rozkłady dla każdego elementu.
  • Zwróć uwagę, że funkcje z brakującymi lub zerowymi wartościami wyświetlają procent na czerwono jako wizualny wskaźnik, że mogą wystąpić problemy z przykładami w tych funkcjach. Odsetek to procent przykładów, które mają brakujące lub zerowe wartości dla tej funkcji.
  • Zauważ, że nie ma przykładów z wartościami dla pickup_census_tract . To okazja do redukcji wymiarowości!
  • Spróbuj kliknąć „rozwiń” nad wykresami, aby zmienić sposób wyświetlania
  • Spróbuj najechać kursorem na słupki na wykresach, aby wyświetlić zakresy i liczby segmentów
  • Spróbuj przełączyć się między skalą logarytmiczną a skalą liniową i zwróć uwagę, że skala logarytmiczna ujawnia znacznie więcej szczegółów na temat funkcji payment_type
  • Spróbuj wybrać „kwantyle” z menu „Wykres do pokazania” i najedź kursorem na znaczniki, aby wyświetlić procenty kwantylowe
tfdv.visualize_statistics(train_stats)

Wnioskuj schemat

Teraz tfdv.infer_schema aby utworzyć schemat dla naszych danych. Schemat definiuje ograniczenia dla danych, które są istotne dla ML. Przykładowe ograniczenia obejmują typ danych każdego elementu, niezależnie od tego, czy jest on liczbowy lub jakościowy, lub częstotliwość jego obecności w danych. Dla cech kategorialnych schemat definiuje również dziedzinę - listę dopuszczalnych wartości. Ponieważ pisanie schematu może być żmudnym zadaniem, szczególnie w przypadku zestawów danych z dużą ilością funkcji, TFDV zapewnia metodę generowania początkowej wersji schematu na podstawie statystyk opisowych.

Poprawność schematu jest ważna, ponieważ reszta naszego potoku produkcyjnego będzie polegać na schemacie generowanym przez TFDV, aby był poprawny. Schemat zawiera również dokumentację danych, a więc jest przydatny, gdy różni programiści pracują nad tymi samymi danymi. Użyjmy tfdv.display_schema aby wyświetlić wywnioskowany schemat, abyśmy mogli go przejrzeć.

schema = tfdv.infer_schema(statistics=train_stats)
tfdv.display_schema(schema=schema)
/tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow_data_validation/utils/display_util.py:138: FutureWarning: Passing a negative integer is deprecated in version 1.0 and will not be supported in future version. Instead, use None to not limit the column width.
  pd.set_option('max_colwidth', -1)

Sprawdź dane oceny pod kątem błędów

Jak dotąd patrzyliśmy tylko na dane treningowe. Ważne jest, aby nasze dane oceny były spójne z naszymi danymi szkoleniowymi, w tym, że używają tego samego schematu. Ważne jest również, aby dane ewaluacyjne zawierały przykłady mniej więcej takich samych zakresów wartości naszych funkcji numerycznych, jak nasze dane szkoleniowe, tak aby nasze pokrycie powierzchni strat podczas oceny było mniej więcej takie samo jak podczas treningu. To samo dotyczy cech kategorycznych. W przeciwnym razie możemy mieć problemy ze szkoleniem, które nie zostaną zidentyfikowane podczas oceny, ponieważ nie oceniliśmy części naszej powierzchni strat.

  • Zwróć uwagę, że każda funkcja zawiera teraz statystyki dla zestawów danych uczących i ocen.
  • Zauważ, że wykresy mają teraz nałożone zarówno zestawy danych uczących, jak i oceniających, co ułatwia ich porównywanie.
  • Zauważ, że wykresy zawierają teraz widok wartości procentowych, który można łączyć z logiem lub domyślnymi skalami liniowymi.
  • Zwróć uwagę, że średnia i mediana dla trip_miles są różne dla treningu i zestawów danych oceny. Czy to spowoduje problemy?
  • Wow, maksymalna liczba tips jest bardzo różna w przypadku szkoleń i zestawów danych do oceny. Czy to spowoduje problemy?
  • Kliknij rozwiń na wykresie Funkcje liczbowe i wybierz skalę logarytmiczną. Przejrzyj funkcję trip_seconds i zwróć uwagę na różnicę w maks. Czy ocena pominie część powierzchni straty?
# Compute stats for evaluation data
eval_stats = tfdv.generate_statistics_from_csv(data_location=EVAL_DATA)

# Compare evaluation data with training data
tfdv.visualize_statistics(lhs_statistics=eval_stats, rhs_statistics=train_stats,
                          lhs_name='EVAL_DATASET', rhs_name='TRAIN_DATASET')

Sprawdź anomalie oceny

Czy nasz zestaw danych oceny jest zgodny ze schematem z naszego zestawu danych szkoleniowych? Jest to szczególnie ważne w przypadku cech kategorialnych, w których chcemy określić zakres dopuszczalnych wartości.

# Check eval data for errors by validating the eval data stats using the previously inferred schema.
anomalies = tfdv.validate_statistics(statistics=eval_stats, schema=schema)
tfdv.display_anomalies(anomalies)
/tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow_data_validation/utils/display_util.py:173: FutureWarning: Passing a negative integer is deprecated in version 1.0 and will not be supported in future version. Instead, use None to not limit the column width.
  pd.set_option('max_colwidth', -1)

Napraw anomalie oceny w schemacie

Ups! Wygląda na to, że mamy nowe wartości dla company w naszych danych ewaluacyjnych, których nie mieliśmy w naszych danych szkoleniowych. Mamy też nową wartość payment_type . Należy je traktować jako anomalie, ale to, co z nimi zrobimy, zależy od wiedzy naszej domeny o danych. Jeśli anomalia naprawdę wskazuje na błąd danych, należy naprawić dane bazowe. W przeciwnym razie możemy po prostu zaktualizować schemat, aby uwzględnić wartości w zbiorze danych eval.

Dopóki nie zmienimy naszego zestawu danych oceny, nie możemy naprawić wszystkiego, ale możemy naprawić rzeczy w schemacie, które możemy zaakceptować. Obejmuje to rozluźnienie naszego spojrzenia na to, co jest, a co nie jest anomalią dla określonych funkcji, a także aktualizację naszego schematu, aby uwzględnić brakujące wartości dla cech kategorialnych. TFDV umożliwiło nam odkrycie tego, co musimy naprawić.

Wprowadźmy te poprawki teraz, a następnie przejrzyjmy je jeszcze raz.

# Relax the minimum fraction of values that must come from the domain for feature company.
company = tfdv.get_feature(schema, 'company')
company.distribution_constraints.min_domain_mass = 0.9

# Add new value to the domain of feature payment_type.
payment_type_domain = tfdv.get_domain(schema, 'payment_type')
payment_type_domain.value.append('Prcard')

# Validate eval stats after updating the schema 
updated_anomalies = tfdv.validate_statistics(eval_stats, schema)
tfdv.display_anomalies(updated_anomalies)

Hej, spójrz na to! Sprawdziliśmy, że dane dotyczące szkolenia i oceny są teraz spójne! Dzięki TFDV;)

Środowiska schematu

Na potrzeby tego przykładu wyodrębniliśmy również zbiór danych „obsługujących”, więc powinniśmy to również sprawdzić. Domyślnie wszystkie zestawy danych w potoku powinny używać tego samego schematu, ale często są wyjątki. Na przykład w uczeniu nadzorowanym musimy uwzględnić etykiety w naszym zbiorze danych, ale kiedy udostępniamy model do wnioskowania, etykiety nie zostaną uwzględnione. W niektórych przypadkach konieczne jest wprowadzenie niewielkich różnic w schemacie.

Do wyrażenia takich wymagań można użyć środowisk . W szczególności funkcje w schemacie mogą być powiązane z zestawem środowisk przy użyciu default_environment , in_environment i not_in_environment .

Na przykład w tym zbiorze danych funkcja tips jest dołączona jako etykieta do uczenia, ale brakuje jej w wyświetlanych danych. Bez określonego środowiska pojawi się jako anomalia.

serving_stats = tfdv.generate_statistics_from_csv(SERVING_DATA)
serving_anomalies = tfdv.validate_statistics(serving_stats, schema)

tfdv.display_anomalies(serving_anomalies)
/tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow_data_validation/utils/display_util.py:173: FutureWarning: Passing a negative integer is deprecated in version 1.0 and will not be supported in future version. Instead, use None to not limit the column width.
  pd.set_option('max_colwidth', -1)

Zajmiemy się funkcją tips poniżej. Mamy również wartość INT w naszych sekundach podróży, gdzie nasz schemat oczekiwał FLOAT. Uświadamiając nam tę różnicę, TFDV pomaga wykryć niespójności w sposobie generowania danych na potrzeby szkolenia i udostępniania. Bardzo łatwo jest nie zdawać sobie sprawy z takich problemów, dopóki wydajność modelu nie ucierpi, czasami katastrofalnie. Może to być znaczący problem, ale w każdym przypadku powinien stanowić podstawę do dalszych badań.

W tym przypadku możemy bezpiecznie przekonwertować wartości INT na FLOAT, więc chcemy powiedzieć TFDV, aby użył naszego schematu do wywnioskowania typu. Zróbmy to teraz.

options = tfdv.StatsOptions(schema=schema, infer_type_from_schema=True)
serving_stats = tfdv.generate_statistics_from_csv(SERVING_DATA, stats_options=options)
serving_anomalies = tfdv.validate_statistics(serving_stats, schema)

tfdv.display_anomalies(serving_anomalies)
/tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow_data_validation/utils/display_util.py:173: FutureWarning: Passing a negative integer is deprecated in version 1.0 and will not be supported in future version. Instead, use None to not limit the column width.
  pd.set_option('max_colwidth', -1)

Teraz mamy tylko funkcję tips (która jest naszą etykietą) pokazującą się jako anomalia („Usunięto kolumnę”). Oczywiście nie spodziewamy się, że w naszych serwowanych danych będą znajdować się etykiety, więc powiedzmy TFDV, aby to zignorowało.

# All features are by default in both TRAINING and SERVING environments.
schema.default_environment.append('TRAINING')
schema.default_environment.append('SERVING')

# Specify that 'tips' feature is not in SERVING environment.
tfdv.get_feature(schema, 'tips').not_in_environment.append('SERVING')

serving_anomalies_with_env = tfdv.validate_statistics(
    serving_stats, schema, environment='SERVING')

tfdv.display_anomalies(serving_anomalies_with_env)

Sprawdź dryf i pochylenie

Oprócz sprawdzania, czy zestaw danych jest zgodny z oczekiwaniami określonymi w schemacie, TFDV zapewnia również funkcje wykrywania dryfu i pochylenia. TFDV przeprowadza tę kontrolę, porównując statystyki różnych zestawów danych w oparciu o komparatory dryftu / skosu określone w schemacie.

Dryf

Wykrywanie dryftu jest obsługiwane w przypadku cech kategorialnych i między kolejnymi zakresami danych (tj. Między zakresem N i zakresem N + 1), na przykład między różnymi dniami danych treningowych. Dryft wyrażamy w postaci odległości L-nieskończoności i można ustawić odległość progową, aby otrzymywać ostrzeżenia, gdy dryf jest większy niż jest to dopuszczalne. Ustawienie właściwej odległości jest zwykle procesem iteracyjnym wymagającym wiedzy dziedzinowej i eksperymentów.

Krzywy

TFDV może wykryć trzy różne rodzaje odchyleń w danych - pochylenie schematu, pochylenie funkcji i pochylenie dystrybucji.

Pochylenie schematu

Pochylenie schematu występuje, gdy dane uczące i udostępniane nie są zgodne z tym samym schematem. Oczekuje się, że zarówno dane uczące, jak i dane dotyczące udostępniania będą zgodne z tym samym schematem. Wszelkie oczekiwane odchylenia między nimi (takie jak funkcja etykiety jest obecna tylko w danych uczących, ale nie w udostępnianiu) powinny być określone w polu environment w schemacie.

Pochylenie funkcji

Pochylenie elementu występuje, gdy wartości elementów, na których trenuje model, różnią się od wartości cech, które widzi w czasie udostępniania. Na przykład może się to zdarzyć, gdy:

  • Źródło danych, które udostępnia pewne wartości funkcji, jest modyfikowane między uczeniem a czasem udostępniania
  • Istnieje inna logika tworzenia funkcji między uczeniem a serwowaniem. Na przykład, jeśli zastosujesz transformację tylko w jednej z dwóch ścieżek kodu.

Pochylenie dystrybucji

Pochylenie dystrybucji występuje, gdy dystrybucja zestawu danych szkoleniowych znacznie różni się od dystrybucji obsługującego zestawu danych. Jedną z głównych przyczyn pochylenia dystrybucji jest używanie innego kodu lub różnych źródeł danych do generowania zestawu danych szkoleniowych. Innym powodem jest wadliwy mechanizm próbkowania, który wybiera niereprezentatywną podpróbkę serwowanych danych do treningu.

# Add skew comparator for 'payment_type' feature.
payment_type = tfdv.get_feature(schema, 'payment_type')
payment_type.skew_comparator.infinity_norm.threshold = 0.01

# Add drift comparator for 'company' feature.
company=tfdv.get_feature(schema, 'company')
company.drift_comparator.infinity_norm.threshold = 0.001

skew_anomalies = tfdv.validate_statistics(train_stats, schema,
                                          previous_statistics=eval_stats,
                                          serving_statistics=serving_stats)

tfdv.display_anomalies(skew_anomalies)
/tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow_data_validation/utils/display_util.py:173: FutureWarning: Passing a negative integer is deprecated in version 1.0 and will not be supported in future version. Instead, use None to not limit the column width.
  pd.set_option('max_colwidth', -1)

W tym przykładzie widzimy pewne odchylenie, ale jest ono znacznie poniżej ustawionego progu.

Zablokuj schemat

Teraz, gdy schemat został sprawdzony i opracowany, zapiszemy go w pliku, aby odzwierciedlić jego stan „zamrożony”.

from tensorflow.python.lib.io import file_io
from google.protobuf import text_format

file_io.recursive_create_dir(OUTPUT_DIR)
schema_file = os.path.join(OUTPUT_DIR, 'schema.pbtxt')
tfdv.write_schema_text(schema, schema_file)

!cat {schema_file}
feature {
  name: "pickup_community_area"
  type: INT
  presence {
    min_fraction: 1.0
    min_count: 1
  }
  shape {
    dim {
      size: 1
    }
  }
}
feature {
  name: "fare"
  type: FLOAT
  presence {
    min_fraction: 1.0
    min_count: 1
  }
  shape {
    dim {
      size: 1
    }
  }
}
feature {
  name: "trip_start_month"
  type: INT
  presence {
    min_fraction: 1.0
    min_count: 1
  }
  shape {
    dim {
      size: 1
    }
  }
}
feature {
  name: "trip_start_hour"
  type: INT
  presence {
    min_fraction: 1.0
    min_count: 1
  }
  shape {
    dim {
      size: 1
    }
  }
}
feature {
  name: "trip_start_day"
  type: INT
  presence {
    min_fraction: 1.0
    min_count: 1
  }
  shape {
    dim {
      size: 1
    }
  }
}
feature {
  name: "trip_start_timestamp"
  type: INT
  presence {
    min_fraction: 1.0
    min_count: 1
  }
  shape {
    dim {
      size: 1
    }
  }
}
feature {
  name: "pickup_latitude"
  type: FLOAT
  presence {
    min_fraction: 1.0
    min_count: 1
  }
  shape {
    dim {
      size: 1
    }
  }
}
feature {
  name: "pickup_longitude"
  type: FLOAT
  presence {
    min_fraction: 1.0
    min_count: 1
  }
  shape {
    dim {
      size: 1
    }
  }
}
feature {
  name: "dropoff_latitude"
  value_count {
    min: 1
    max: 1
  }
  type: FLOAT
  presence {
    min_count: 1
  }
}
feature {
  name: "dropoff_longitude"
  value_count {
    min: 1
    max: 1
  }
  type: FLOAT
  presence {
    min_count: 1
  }
}
feature {
  name: "trip_miles"
  type: FLOAT
  presence {
    min_fraction: 1.0
    min_count: 1
  }
  shape {
    dim {
      size: 1
    }
  }
}
feature {
  name: "pickup_census_tract"
  type: BYTES
  presence {
    min_count: 0
  }
}
feature {
  name: "dropoff_census_tract"
  value_count {
    min: 1
    max: 1
  }
  type: INT
  presence {
    min_count: 1
  }
}
feature {
  name: "payment_type"
  type: BYTES
  domain: "payment_type"
  presence {
    min_fraction: 1.0
    min_count: 1
  }
  skew_comparator {
    infinity_norm {
      threshold: 0.01
    }
  }
  shape {
    dim {
      size: 1
    }
  }
}
feature {
  name: "company"
  value_count {
    min: 1
    max: 1
  }
  type: BYTES
  domain: "company"
  presence {
    min_count: 1
  }
  distribution_constraints {
    min_domain_mass: 0.9
  }
  drift_comparator {
    infinity_norm {
      threshold: 0.001
    }
  }
}
feature {
  name: "trip_seconds"
  type: INT
  presence {
    min_fraction: 1.0
    min_count: 1
  }
  shape {
    dim {
      size: 1
    }
  }
}
feature {
  name: "dropoff_community_area"
  value_count {
    min: 1
    max: 1
  }
  type: INT
  presence {
    min_count: 1
  }
}
feature {
  name: "tips"
  type: FLOAT
  presence {
    min_fraction: 1.0
    min_count: 1
  }
  not_in_environment: "SERVING"
  shape {
    dim {
      size: 1
    }
  }
}
string_domain {
  name: "payment_type"
  value: "Cash"
  value: "Credit Card"
  value: "Dispute"
  value: "No Charge"
  value: "Pcard"
  value: "Unknown"
  value: "Prcard"
}
string_domain {
  name: "company"
  value: "0118 - 42111 Godfrey S.Awir"
  value: "0694 - 59280 Chinesco Trans Inc"
  value: "1085 - 72312 N and W Cab Co"
  value: "2733 - 74600 Benny Jona"
  value: "2809 - 95474 C & D Cab Co Inc."
  value: "3011 - 66308 JBL Cab Inc."
  value: "3152 - 97284 Crystal Abernathy"
  value: "3201 - C&D Cab Co Inc"
  value: "3201 - CID Cab Co Inc"
  value: "3253 - 91138 Gaither Cab Co."
  value: "3385 - 23210 Eman Cab"
  value: "3623 - 72222 Arrington Enterprises"
  value: "3897 - Ilie Malec"
  value: "4053 - Adwar H. Nikola"
  value: "4197 - 41842 Royal Star"
  value: "4615 - 83503 Tyrone Henderson"
  value: "4615 - Tyrone Henderson"
  value: "4623 - Jay Kim"
  value: "5006 - 39261 Salifu Bawa"
  value: "5006 - Salifu Bawa"
  value: "5074 - 54002 Ahzmi Inc"
  value: "5074 - Ahzmi Inc"
  value: "5129 - 87128"
  value: "5129 - 98755 Mengisti Taxi"
  value: "5129 - Mengisti Taxi"
  value: "5724 - KYVI Cab Inc"
  value: "585 - Valley Cab Co"
  value: "5864 - 73614 Thomas Owusu"
  value: "5864 - Thomas Owusu"
  value: "5874 - 73628 Sergey Cab Corp."
  value: "5997 - 65283 AW Services Inc."
  value: "5997 - AW Services Inc."
  value: "6488 - 83287 Zuha Taxi"
  value: "6743 - Luhak Corp"
  value: "Blue Ribbon Taxi Association Inc."
  value: "C & D Cab Co Inc"
  value: "Chicago Elite Cab Corp."
  value: "Chicago Elite Cab Corp. (Chicago Carriag"
  value: "Chicago Medallion Leasing INC"
  value: "Chicago Medallion Management"
  value: "Choice Taxi Association"
  value: "Dispatch Taxi Affiliation"
  value: "KOAM Taxi Association"
  value: "Northwest Management LLC"
  value: "Taxi Affiliation Services"
  value: "Top Cab Affiliation"
}
default_environment: "TRAINING"
default_environment: "SERVING"

Kiedy używać TFDV

Łatwo jest pomyśleć o TFDV jako o zastosowaniu tylko na początku twojego potoku treningowego, tak jak tutaj zrobiliśmy, ale w rzeczywistości ma wiele zastosowań. Oto kilka więcej:

  • Sprawdzanie poprawności nowych danych pod kątem wnioskowania, aby upewnić się, że nie zaczęliśmy nagle otrzymywać złych funkcji
  • Sprawdzanie poprawności nowych danych pod kątem wnioskowania, aby upewnić się, że nasz model przeszedł szkolenie w tej części powierzchni decyzyjnej
  • Weryfikacja naszych danych po ich przekształceniu i wykonaniu inżynierii funkcji (prawdopodobnie przy użyciu transformacji TensorFlow ), aby upewnić się, że nie zrobiliśmy czegoś złego