Treten Sie der SIG TFX-Addons-Community bei und helfen Sie, TFX noch besser zu machen!

TensorFlow-Datenvalidierung

Ein Beispiel für eine Schlüsselkomponente von TensorFlow Extended

Dieses Beispiel-Colab-Notizbuch zeigt, wie TensorFlow Data Validation (TFDV) zur Untersuchung und Visualisierung Ihres Datensatzes verwendet werden kann. Dazu gehört das Betrachten deskriptiver Statistiken, das Ableiten eines Schemas, das Überprüfen und Beheben von Anomalien sowie das Überprüfen auf Drift und Versatz in unserem Datensatz. Es ist wichtig, die Eigenschaften Ihres Datasets zu verstehen, einschließlich der möglichen Änderungen in Ihrer Produktionspipeline im Laufe der Zeit. Es ist auch wichtig, nach Anomalien in Ihren Daten zu suchen und Ihre Trainings-, Bewertungs- und Bereitstellungsdatensätze zu vergleichen, um sicherzustellen, dass sie konsistent sind.

Wir verwenden Daten aus dem von der Stadt Chicago veröffentlichten Taxi Trips-Datensatz .

Weitere Informationen zum Datensatz finden Sie in Google BigQuery . Durchsuchen Sie den vollständigen Datensatz in der BigQuery-Benutzeroberfläche .

Die Spalten im Datensatz sind:

pickup_community_area Fahrpreis 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 Zahlungsart Unternehmen
trip_seconds dropoff_community_area Tipps

Upgrade Pip

Um zu vermeiden, dass Pip in einem System aktualisiert wird, wenn es lokal ausgeführt wird, stellen Sie sicher, dass wir in Colab ausgeführt werden. Lokale Systeme können natürlich separat aktualisiert werden.

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

Installieren Sie TensorFlow

pip install tensorflow==2.2.0

Überprüfen Sie die Python-Version

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'

Installieren Sie TFDV

Dadurch werden alle Abhängigkeiten berücksichtigt, was eine Minute dauert. Bitte ignorieren Sie die Warnungen oder Fehler in Bezug auf inkompatible Abhängigkeitsversionen.

import tensorflow as tf

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

Haben Sie die Laufzeit neu gestartet?

Wenn Sie Google Colab verwenden und die obige Zelle zum ersten Mal ausführen, müssen Sie die Laufzeit neu starten (Laufzeit> Laufzeit neu starten ...). Dies liegt an der Art und Weise, wie Colab Pakete lädt.

Laden Sie die Dateien

Wir werden unseren Datensatz von Google Cloud Storage herunterladen.

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/tmp9ac2o66s/data:
eval  serving  train

/tmp/tmp9ac2o66s/data/eval:
data.csv

/tmp/tmp9ac2o66s/data/serving:
data.csv

/tmp/tmp9ac2o66s/data/train:
data.csv

Überprüfe die Version

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

Statistiken berechnen und visualisieren

Zuerst verwenden wir tfdv.generate_statistics_from_csv , um Statistiken für unsere Trainingsdaten zu berechnen. (Ignorieren Sie die bissigen Warnungen)

TFDV kann beschreibende Statistiken berechnen, die einen schnellen Überblick über die Daten hinsichtlich der vorhandenen Merkmale und der Formen ihrer Wertverteilungen bieten.

Intern verwendet TFDV das datenparallele Verarbeitungsframework von Apache Beam , um die Berechnung von Statistiken über große Datenmengen zu skalieren. Für Anwendungen, die eine tiefere Integration in TFDV wünschen (z. B. Anhängen der Statistikgenerierung am Ende einer Datengenerierungspipeline), stellt die API auch eine Beam-PTransform für die Statistikgenerierung bereit.

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:247: 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:247: 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)`

Verwenden tfdv.visualize_statistics nun tfdv.visualize_statistics , das Facetten verwendet , um eine prägnante Visualisierung unserer Trainingsdaten zu erstellen:

  • Beachten Sie, dass numerische Merkmale und katagorische Merkmale separat dargestellt werden und dass Diagramme mit den Verteilungen für jedes Merkmal angezeigt werden.
  • Beachten Sie, dass Features mit fehlenden oder Nullwerten einen Prozentsatz in Rot als visuellen Indikator dafür anzeigen, dass Probleme mit Beispielen in diesen Features auftreten können. Der Prozentsatz ist der Prozentsatz der Beispiele, bei denen für diese Funktion Werte fehlen oder Null sind.
  • Beachten Sie, dass es keine Beispiele mit Werten für pickup_census_tract . Dies ist eine Gelegenheit zur Reduzierung der Dimensionalität!
  • Klicken Sie über den Diagrammen auf "Erweitern", um die Anzeige zu ändern
  • Bewegen Sie den Mauszeiger über Balken in den Diagrammen, um die Bucket-Bereiche und -Zahlen anzuzeigen
  • Versuchen Sie, zwischen der Protokoll- und der linearen Skala zu wechseln, und stellen Sie fest, dass die Protokollskala viel detailliertere payment_type kategorialen Funktion " payment_type
  • Versuchen Sie, "Quantile" aus dem Menü "Diagramm zum Anzeigen" auszuwählen, und bewegen Sie den Mauszeiger über die Markierungen, um die Quantilprozentsätze anzuzeigen
tfdv.visualize_statistics(train_stats)

Schliessen Sie ein Schema

Verwenden tfdv.infer_schema nun tfdv.infer_schema , um ein Schema für unsere Daten zu erstellen. Ein Schema definiert Einschränkungen für die Daten, die für ML relevant sind. Beispielhafte Einschränkungen umfassen den Datentyp jedes Features, unabhängig davon, ob es numerisch oder kategorisch ist, oder die Häufigkeit seines Vorhandenseins in den Daten. Für kategoriale Features definiert das Schema auch die Domäne - die Liste der akzeptablen Werte. Da das Schreiben eines Schemas eine mühsame Aufgabe sein kann, insbesondere für Datasets mit vielen Funktionen, bietet TFDV eine Methode zum Generieren einer ersten Version des Schemas basierend auf den beschreibenden Statistiken.

Es ist wichtig, das richtige Schema zu finden, da sich der Rest unserer Produktionspipeline auf das von TFDV generierte Schema stützt, um korrekt zu sein. Das Schema enthält auch eine Dokumentation für die Daten und ist daher nützlich, wenn verschiedene Entwickler an denselben Daten arbeiten. Verwenden tfdv.display_schema , um das abgeleitete Schema anzuzeigen, damit wir es überprüfen können.

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:151: 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)

Überprüfen Sie die Auswertungsdaten auf Fehler

Bisher haben wir uns nur die Trainingsdaten angesehen. Es ist wichtig, dass unsere Bewertungsdaten mit unseren Trainingsdaten übereinstimmen, einschließlich der Verwendung des gleichen Schemas. Es ist auch wichtig, dass die Bewertungsdaten Beispiele für ungefähr dieselben Wertebereiche für unsere numerischen Merkmale wie unsere Trainingsdaten enthalten, damit unsere Abdeckung der Verlustfläche während der Bewertung ungefähr dieselbe ist wie während des Trainings. Gleiches gilt für kategoriale Merkmale. Andernfalls haben wir möglicherweise Trainingsprobleme, die bei der Bewertung nicht identifiziert werden, da wir einen Teil unserer Verlustfläche nicht bewertet haben.

  • Beachten Sie, dass jede Funktion jetzt Statistiken sowohl für die Trainings- als auch für die Evaluierungsdatensätze enthält.
  • Beachten Sie, dass in den Diagrammen jetzt sowohl die Trainings- als auch die Bewertungsdatensätze überlagert sind, sodass Sie sie leicht vergleichen können.
  • Beachten Sie, dass die Diagramme jetzt eine Prozentansicht enthalten, die mit dem Protokoll oder den standardmäßigen linearen Skalen kombiniert werden kann.
  • Beachten Sie, dass der Mittelwert und der Median für trip_miles für das Training im Vergleich zu den Bewertungsdatensätzen unterschiedlich sind. Wird das Probleme verursachen?
  • Wow, die maximalen tips unterscheiden sich für das Training stark von den Bewertungsdatensätzen. Wird das Probleme verursachen?
  • Klicken Sie im Diagramm "Numerische Merkmale" auf "Erweitern" und wählen Sie die Protokollskala aus. Überprüfen Sie die Funktion trip_seconds und stellen Sie den Unterschied zwischen max. Wird die Bewertung Teile der Verlustfläche verfehlen?
# 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')

Überprüfen Sie, ob Bewertungsanomalien vorliegen

Entspricht unser Bewertungsdatensatz dem Schema aus unserem Trainingsdatensatz? Dies ist besonders wichtig für kategoriale Merkmale, bei denen wir den Bereich akzeptabler Werte identifizieren möchten.

# 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:186: 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)

Behebung von Bewertungsanomalien im Schema

Hoppla! Es sieht so aus, als hätten wir einige neue Werte für das company in unseren Bewertungsdaten, die wir nicht in unseren Trainingsdaten hatten. Wir haben auch einen neuen Wert für payment_type . Diese sollten als Anomalien betrachtet werden, aber was wir dagegen tun, hängt von unserem Domänenwissen über die Daten ab. Wenn eine Anomalie tatsächlich auf einen Datenfehler hinweist, sollten die zugrunde liegenden Daten behoben werden. Andernfalls können wir das Schema einfach aktualisieren, um die Werte in das eval-Dataset aufzunehmen.

Wenn wir unseren Bewertungsdatensatz nicht ändern, können wir nicht alles reparieren, aber wir können Dinge in dem Schema reparieren, die wir gerne akzeptieren. Dazu gehört die Lockerung unserer Sicht auf das, was eine Anomalie für bestimmte Features ist und was nicht, sowie die Aktualisierung unseres Schemas, um fehlende Werte für kategoriale Features einzuschließen. TFDV hat es uns ermöglicht, herauszufinden, was wir reparieren müssen.

Lassen Sie uns diese Korrekturen jetzt vornehmen und dann noch einmal überprüfen.

# 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)

Hey, sieh dir das an! Wir haben überprüft, dass die Trainings- und Bewertungsdaten jetzt konsistent sind! Danke TFDV;)

Schemaumgebungen

Wir haben für dieses Beispiel auch einen "Serving" -Datensatz abgespalten, daher sollten wir dies ebenfalls überprüfen. Standardmäßig sollten alle Datasets in einer Pipeline dasselbe Schema verwenden, es gibt jedoch häufig Ausnahmen. Zum Beispiel müssen wir beim überwachten Lernen Beschriftungen in unseren Datensatz aufnehmen, aber wenn wir das Modell als Inferenz verwenden, werden die Beschriftungen nicht aufgenommen. In einigen Fällen ist die Einführung geringfügiger Schemaabweichungen erforderlich.

Umgebungen können verwendet werden, um solche Anforderungen auszudrücken. Insbesondere können Features im Schema mit einer Reihe von Umgebungen default_environment , indem default_environment , in_environment und not_in_environment .

Zum Beispiel in diesem Datensatz der tips wird Feature als Label für das Training aufgenommen, aber es ist in den Serving - Daten fehlt. Ohne Angabe der Umgebung wird dies als Anomalie angezeigt.

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:186: 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)

Wir werden uns mit den folgenden tips befassen. Wir haben auch einen INT-Wert in unseren Auslöse-Sekunden, in denen unser Schema einen FLOAT erwartet. Indem TFDV uns auf diesen Unterschied aufmerksam macht, hilft es, Inkonsistenzen in der Art und Weise aufzudecken, wie die Daten für Schulungen und Dienste generiert werden. Es ist sehr leicht, sich solcher Probleme nicht bewusst zu sein, bis die Modellleistung leidet, manchmal katastrophal. Es kann ein bedeutendes Problem sein oder auch nicht, aber in jedem Fall sollte dies Anlass für weitere Untersuchungen sein.

In diesem Fall können wir INT-Werte sicher in FLOATs konvertieren. Daher möchten wir TFDV anweisen, unser Schema zu verwenden, um auf den Typ zu schließen. Lass uns das jetzt machen.

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:186: 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)

Jetzt haben wir nur noch die tips (die unser Etikett ist), die als Anomalie angezeigt wird ('Spalte gelöscht'). Natürlich erwarten wir keine Labels in unseren Serving-Daten. Lassen Sie uns TFDV also anweisen, dies zu ignorieren.

# 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)

Auf Drift und Schrägstellung prüfen

TFDV prüft nicht nur, ob ein Datensatz den im Schema festgelegten Erwartungen entspricht, sondern bietet auch Funktionen zum Erkennen von Drift und Versatz. TFDV führt diese Prüfung durch, indem die Statistiken der verschiedenen Datensätze basierend auf den im Schema angegebenen Drift / Skew-Komparatoren verglichen werden.

Drift

Die Drifterkennung wird für kategoriale Merkmale und zwischen aufeinanderfolgenden Datenbereichen (dh zwischen Bereich N und Bereich N + 1) unterstützt, z. B. zwischen verschiedenen Tagen mit Trainingsdaten. Wir drücken die Drift als L-Unendlichkeitsabstand aus , und Sie können den Schwellenabstand so einstellen, dass Sie Warnungen erhalten, wenn die Drift höher als akzeptabel ist. Das Einstellen der richtigen Entfernung ist normalerweise ein iterativer Prozess, der Domänenkenntnisse und Experimente erfordert.

Schrägstellung

TFDV kann drei verschiedene Arten von Versatz in Ihren Daten erkennen - Schema-Versatz, Feature-Versatz und Verteilungsversatz.

Schema-Versatz

Ein Schema-Versatz tritt auf, wenn die Trainings- und Serving-Daten nicht mit demselben Schema übereinstimmen. Es wird erwartet, dass sowohl Trainings- als auch Serving-Daten demselben Schema entsprechen. Alle erwarteten Abweichungen zwischen den beiden (z. B. die Beschriftungsfunktion, die nur in den Trainingsdaten, aber nicht im Serving vorhanden ist) sollten über das Feld "Umgebungen" im Schema angegeben werden.

Feature Skew

Feature-Skew tritt auf, wenn sich die Feature-Werte, auf denen ein Modell trainiert, von den Feature-Werten unterscheiden, die es zur Bereitstellungszeit sieht. Dies kann beispielsweise passieren, wenn:

  • Eine Datenquelle, die einige Funktionswerte bereitstellt, wird zwischen Trainings- und Serving-Zeit geändert
  • Es gibt eine unterschiedliche Logik zum Generieren von Funktionen zwischen Training und Serving. Wenn Sie beispielsweise eine Transformation nur in einem der beiden Codepfade anwenden.

Verteilungsversatz

Verteilungsversatz tritt auf, wenn sich die Verteilung des Trainingsdatensatzes erheblich von der Verteilung des Serving-Datensatzes unterscheidet. Eine der Hauptursachen für Verteilungsversatz ist die Verwendung unterschiedlichen Codes oder unterschiedlicher Datenquellen zum Generieren des Trainingsdatensatzes. Ein weiterer Grund ist ein fehlerhafter Stichprobenmechanismus, der eine nicht repräsentative Teilstichprobe der zu trainierenden Serving-Daten auswählt.

# 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:186: 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)

In diesem Beispiel sehen wir eine gewisse Abweichung, die jedoch deutlich unter dem von uns festgelegten Schwellenwert liegt.

Frieren Sie das Schema ein

Nachdem das Schema überprüft und kuratiert wurde, werden wir es in einer Datei speichern, um seinen "eingefrorenen" Zustand widerzuspiegeln.

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: "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: "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: "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"

Wann wird TFDV verwendet?

Es ist leicht vorstellbar, dass TFDV nur für den Start Ihrer Trainingspipeline gilt, wie wir es hier getan haben, aber tatsächlich hat es viele Verwendungsmöglichkeiten. Hier noch ein paar mehr:

  • Überprüfen Sie neue Daten auf Rückschlüsse, um sicherzustellen, dass wir nicht plötzlich schlechte Funktionen erhalten
  • Validierung neuer Daten auf Inferenz, um sicherzustellen, dass unser Modell auf diesem Teil der Entscheidungsoberfläche trainiert hat
  • Überprüfen Sie unsere Daten, nachdem Sie sie transformiert und das Feature-Engineering durchgeführt haben (wahrscheinlich mithilfe von TensorFlow Transform ), um sicherzustellen, dass wir nichts falsch gemacht haben