Ein tiefer Einblick in die Datenvalidierung mit Tensorflow Information Validation

Stellen Sie sich Folgendes vor: Wir haben eine voll funktionsfähige Pipeline für maschinelles Lernen, und sie läuft einwandfrei. Additionally beschließen wir, sie in die Produktionsumgebung zu übertragen. In der Produktion läuft alles intestine, und eines Tages kommt es zu einer winzigen Änderung in einer der Komponenten, die Eingabedaten für unsere Pipeline generiert, und die Pipeline bricht zusammen. Ups!!!

Foto von Sarah Kilian An Unsplash

Warum ist das passiert??

Da ML-Modelle stark von den verwendeten Daten abhängen, sollten Sie sich an das alte Sprichwort „Rubbish In, Rubbish Out“ erinnern. Mit den richtigen Daten funktioniert die Pipeline intestine, bei jeder Änderung jedoch neigt die Pipeline dazu, aus dem Ruder zu laufen.

In Pipelines eingespeiste Daten werden größtenteils durch automatisierte Systeme generiert, wodurch die Kontrolle über die Artwork der generierten Daten geringer wird.

Additionally, was machen wir?

Die Antwort lautet Datenvalidierung.

Die Datenvalidierung ist das Schutzsystem, das überprüft, ob die Daten im geeigneten Format für die Verwendung durch die Pipeline vorliegen.

Lesen Sie diesen Artikel, um zu verstehen, warum die Validierung in einer ML-Pipeline so wichtig ist, und um die 5 Phasen der Validierung beim maschinellen Lernen kennenzulernen.

TensorFlow Information Validation (TFDV) ist ein Teil des TFX-Ökosystems, das zur Validierung von Daten in einer ML-Pipeline verwendet werden kann.

TFDV berechnet beschreibende Statistiken und Schemata und identifiziert Anomalien durch Vergleich der Trainings- und Bereitstellungsdaten. Dadurch wird sichergestellt, dass Trainings- und Bereitstellungsdaten konsistent sind und die Pipeline nicht beschädigt wird oder unbeabsichtigte Vorhersagen erstellt.

Bei Google wollte man, dass TFDV bereits im frühesten Stadium eines ML-Prozesses eingesetzt wird. Daher sorgte man dafür, dass TFDV mit Notebooks verwendet werden kann. Dasselbe werden wir hier tun.

Zu Beginn müssen wir die Tensorflow-Information-Validation-Bibliothek mithilfe von Pip installieren. Erstellen Sie vorzugsweise eine virtuelle Umgebung und beginnen Sie mit Ihren Installationen.

Ein Wort der Warnung: Stellen Sie vor der Set up die Versionskompatibilität der TFX-Bibliotheken sicher

pip set up tensorflow-data-validation

Im Folgenden sind die Schritte aufgeführt, die wir für den Datenvalidierungsprozess ausführen:

  1. Generieren von Statistiken aus Trainingsdaten
  2. Ableiten eines Schemas aus Trainingsdaten
  3. Statistiken für Evaluierungsdaten erstellen und mit Trainingsdaten vergleichen
  4. Erkennen und Beheben von Anomalien
  5. Auf Abweichungen und Datenverzerrungen prüfen
  6. Speichern des Schemas

Wir werden hier 3 Arten von Datensätzen verwenden: Trainingsdaten, Evaluierungsdaten und Bereitstellungsdaten, um die Echtzeitnutzung zu simulieren. Das ML-Modell wird mithilfe der Trainingsdaten trainiert. Evaluierungsdaten, auch Testdaten genannt, sind ein Teil der Daten, die zum Testen des Modells bestimmt sind, sobald die Trainingsphase abgeschlossen ist. Bereitstellungsdaten werden dem Modell in der Produktionsumgebung zur Erstellung von Vorhersagen präsentiert.

Der gesamte in diesem Artikel besprochene Code ist in meinem GitHub-Repo verfügbar. Sie können ihn hier herunterladen: Hier.

Wir werden den Raumschiff-Titanic-Datensatz von Kaggle verwenden. Sie können mehr erfahren und den Datensatz hier herunterladen. Verknüpfung.

Beispielansicht des Raumschiff-Titanic-Datensatzes

Die Daten bestehen aus einer Mischung numerischer und kategorialer Daten. Es handelt sich um einen Klassifizierungsdatensatz, und die Klassenbezeichnung lautet Transported. Es enthält den Wert True oder False.

Daten Beschreibung

Die notwendigen Importe werden durchgeführt und die Pfade für die CSV-Datei definiert. Der eigentliche Datensatz enthält die Trainings- und Testdaten. Ich habe manuell einige Fehler eingefügt und die Datei als „titanic_test_anomalies.csv“ gespeichert (Diese Datei ist in Kaggle nicht verfügbar. Sie können sie von meinem GitHub-Repository herunterladen. Verknüpfung).

Hier verwenden wir ANOMALOUS_DATA als Auswertungsdaten und TEST_DATA als Bereitstellungsdaten.

import tensorflow_data_validation as tfdv
import tensorflow as tf

TRAIN_DATA = '/information/titanic_train.csv'
TEST_DATA = '/information/titanic_test.csv'
ANOMALOUS_DATA = '/information/titanic_test_anomalies.csv'

Der erste Schritt besteht darin, die Trainingsdaten zu analysieren und ihre statistischen Eigenschaften zu ermitteln. TFDV hat die generate_statistics_from_csv Funktion, die Daten direkt aus einer CSV-Datei liest. TFDV hat auch eine generate_statistics_from_tfrecord Funktion, wenn Sie die Daten als TFRecord .

Der visualize_statistics Die Funktion präsentiert eine 8-Punkte-Zusammenfassung zusammen mit hilfreichen Diagrammen, die uns helfen können, die zugrunde liegenden Statistiken der Daten zu verstehen. Dies wird als Facettenansicht bezeichnet. Einige wichtige Particulars, die unsere Aufmerksamkeit erfordern, sind rot hervorgehoben. Hier stehen zahlreiche weitere Funktionen zur Analyse der Daten zur Verfügung. Probieren Sie sie aus und lernen Sie sie besser kennen.

# Generate statistics for coaching information
train_stats=tfdv.generate_statistics_from_csv(TRAIN_DATA)
tfdv.visualize_statistics(train_stats)
Für den Datensatz generierte Statistiken

Hier sehen wir fehlende Werte in den Funktionen „Alter“ und „Zimmerservice“, die imputiert werden müssen. Wir sehen auch, dass „Zimmerservice“ 65,52 % Nullen hat. Das ist die Artwork und Weise, wie diese speziellen Daten verteilt sind, additionally betrachten wir es nicht als Anomalie und machen weiter.

Sobald alle Probleme zufriedenstellend gelöst sind, leiten wir das Schema ab mithilfe der infer_schema Funktion.

schema=tfdv.infer_schema(statistics=train_stats)
tfdv.display_schema(schema=schema)

Ein Schema wird normalerweise in zwei Abschnitten dargestellt. Der erste Abschnitt enthält Particulars wie Datentyp, Präsenz, Wertigkeit und Domäne. Der zweite Abschnitt enthält die Werte, die die Domäne ausmachen.

Abschnitt 1: Particulars zu den Funktionen
Abschnitt 2: Domänenwerte

Dies ist das anfängliche Rohschema. Wir werden es in den späteren Schritten verfeinern.

Jetzt holen wir uns die Auswertungsdaten und generieren die Statistiken. Wir müssen verstehen, wie mit Anomalien umgegangen werden muss, deshalb verwenden wir ANOMALOUS_DATA als unsere Auswertungsdaten. Wir haben manuell Anomalien in diese Daten eingeführt.

Nachdem wir die Statistiken erstellt haben, visualisieren wir die Daten. Die Visualisierung kann nur für die Auswertungsdaten angewendet werden (wie wir es für die Trainingsdaten getan haben), es ist jedoch sinnvoller, die Statistiken der Auswertungsdaten mit den Trainingsstatistiken zu vergleichen. Auf diese Weise können wir verstehen, wie sehr sich die Auswertungsdaten von den Trainingsdaten unterscheiden.

# Generate statistics for analysis information

eval_stats=tfdv.generate_statistics_from_csv(ANOMALOUS_DATA)

tfdv.visualize_statistics(lhs_statistics = train_stats, rhs_statistics = eval_stats,
lhs_name = "Coaching Information", rhs_name = "Analysis Information")

Vergleich der Statistiken der Trainingsdaten und der Auswertungsdaten

Hier können wir sehen, dass die RoomService-Funktion in den Auswertungsdaten fehlt (großes Warnsignal). Die anderen Funktionen scheinen ziemlich in Ordnung zu sein, da sie ähnliche Verteilungen wie die Trainingsdaten aufweisen.

Da in einer Produktionsumgebung jedoch eine Schätzung allein nicht ausreicht, werden wir TFDV bitten, tatsächlich zu analysieren und zu melden, ob alles in Ordnung ist.

Unser nächster Schritt ist die Validierung der aus den Auswertungsdaten gewonnenen Statistiken. Wir werden sie mit dem Schema vergleichen, das wir mit den Trainingsdaten erstellt haben. Die display_anomalies Die Funktion gibt uns eine tabellarische Ansicht der von TFDV identifizierten Anomalien sowie eine Beschreibung.

# Figuring out Anomalies
anomalies=tfdv.validate_statistics(statistics=eval_stats, schema=schema)
tfdv.display_anomalies(anomalies)
Anomalieliste bereitgestellt von TFDV

Aus der Tabelle können wir ersehen, dass in unseren Auswertungsdaten zwei Spalten fehlen (Transported und RoomService), die Vacation spot-Funktion einen zusätzlichen Wert namens „Anomaly“ in ihrer Domäne aufweist (der in den Trainingsdaten nicht vorhanden conflict), die CryoSleep- und VIP-Funktionen die Werte „TRUE“ und „FALSE“ aufweisen, die in den Trainingsdaten nicht vorhanden sind und schließlich enthalten 5 Funktionen ganzzahlige Werte, während das Schema Gleitkommawerte erwartet.

Das ist eine Handvoll. Additionally machen wir uns an die Arbeit.

Es gibt zwei Möglichkeiten, Anomalien zu beheben: Entweder Sie verarbeiten die Auswertungsdaten (manuell), um sicherzustellen, dass sie dem Schema entsprechen, oder Sie ändern das Schema, um sicherzustellen, dass diese Anomalien akzeptiert werden. Auch hier muss ein Fachexperte entscheiden, welche Anomalien akzeptabel sind und welche eine Datenverarbeitung erfordern.

Beginnen wir mit der Funktion „Ziel“. Wir haben einen neuen Wert „Anomalie“ gefunden, der in der Domänenliste der Trainingsdaten fehlte. Fügen wir ihn der Domäne hinzu und sagen, dass er auch ein akzeptabler Wert für die Funktion ist.

# Including a brand new worth for 'Vacation spot'
destination_domain=tfdv.get_domain(schema, 'Vacation spot')
destination_domain.worth.append('Anomaly')

anomalies=tfdv.validate_statistics(statistics=eval_stats, schema=schema)
tfdv.display_anomalies(anomalies)

Wir haben diese Anomalie entfernt und sie wird in der Anomalieliste nicht mehr angezeigt. Fahren wir mit der nächsten fort.

Zielanomalie wurde behoben

Wenn wir uns die VIP- und CryoSleep-Domänen ansehen, sehen wir, dass die Trainingsdaten Kleinbuchstaben haben, während die Auswertungsdaten dieselben Werte in Großbuchstaben haben. Eine Möglichkeit besteht darin, die Daten vorzuverarbeiten und sicherzustellen, dass alle Daten in Klein- oder Großbuchstaben umgewandelt werden. Wir werden diese Werte jedoch in die Domäne einfügen. Da VIP und CryoSleep denselben Wertesatz (true und false) verwenden, legen wir die Domäne von CryoSleep so fest, dass sie die Domäne von VIP verwendet.

# Including information in CAPS to area for VIP and CryoSleep

vip_domain=tfdv.get_domain(schema, 'VIP')
vip_domain.worth.prolong(('TRUE','FALSE'))

# Setting area of 1 function to a different
tfdv.set_domain(schema, 'CryoSleep', vip_domain)

anomalies=tfdv.validate_statistics(statistics=eval_stats, schema=schema)
tfdv.display_anomalies(anomalies)

Behobene Anomalien von CryoSleep und VIP

Es ist ziemlich sicher, ganzzahlige Merkmale in Gleitkommazahlen umzuwandeln. Daher bitten wir die Auswertungsdaten, Datentypen aus dem Schema der Trainingsdaten abzuleiten. Dadurch wird das Downside im Zusammenhang mit Datentypen gelöst.

# INT will be safely transformed to FLOAT. So we are able to safely ignore it and ask TFDV to make use of schema

choices = tfdv.StatsOptions(schema=schema, infer_type_from_schema=True)
eval_stats=tfdv.generate_statistics_from_csv(ANOMALOUS_DATA, stats_options=choices)

anomalies=tfdv.validate_statistics(statistics=eval_stats, schema=schema)
tfdv.display_anomalies(anomalies)

Behobenes Datentypproblem

Schließlich landen wir beim letzten Satz von Anomalien; 2 Spalten, die in den Trainingsdaten vorhanden sind, fehlen in den Auswertungsdaten.

„Transportiert“ ist die Klassenbezeichnung und wird in den Auswertungsdaten offensichtlich nicht verfügbar sein. Um Fälle zu lösen, in denen wir wissen, dass sich Trainings- und Auswertungsfunktionen voneinander unterscheiden können, können wir mehrere Umgebungen erstellen. Hier erstellen wir eine Trainings- und eine Serving-Umgebung. Wir geben an, dass die Funktion „Transportiert“ in der Trainingsumgebung verfügbar sein wird, in der Serving-Umgebung jedoch nicht.

# Transported is the category label and won't be out there in Analysis information.
# To point that we set two environments; Coaching and Serving

schema.default_environment.append('Coaching')
schema.default_environment.append('Serving')

tfdv.get_feature(schema, 'Transported').not_in_environment.append('Serving')

serving_anomalies_with_environment=tfdv.validate_statistics(
statistics=eval_stats, schema=schema, atmosphere='Serving')

tfdv.display_anomalies(serving_anomalies_with_environment)

„RoomService“ ist eine erforderliche Funktion, die in der Serving-Umgebung nicht verfügbar ist. In solchen Fällen sind manuelle Eingriffe durch Fachexperten erforderlich.

Beheben Sie weiterhin Probleme, bis Sie diese Ausgabe erhalten.

Alle Anomalien behoben

Alle Anomalien wurden behoben

Der nächste Schritt besteht darin, nach Abweichungen und Schiefen zu suchen. Schiefen entstehen durch Unregelmäßigkeiten in der Datenverteilung. Wenn ein Modell zu Beginn trainiert wird, sind seine Vorhersagen normalerweise perfekt. Mit der Zeit ändert sich jedoch die Datenverteilung und es kommt zu mehr Klassifizierungsfehlern, was als Abweichung bezeichnet wird. Diese Probleme erfordern ein erneutes Trainieren des Modells.

Die L-Infinity-Distanz wird verwendet, um Schiefe und Drift zu messen. Ein Schwellenwert wird basierend auf der L-Infinity-Distanz festgelegt. Wenn der Unterschied zwischen den analysierten Options in der Trainings- und der Bereitstellungsumgebung den angegebenen Schwellenwert überschreitet, wird davon ausgegangen, dass das Characteristic eine Drift erfahren hat. Für die Schiefe wird ein ähnlicher schwellenwertbasierter Ansatz verfolgt. Für unser Beispiel haben wir den Schwellenwert sowohl für Drift als auch für Schiefe auf 0,01 festgelegt.

serving_stats = tfdv.generate_statistics_from_csv(TEST_DATA)

# Skew Comparator
spa_analyze=tfdv.get_feature(schema, 'Spa')
spa_analyze.skew_comparator.infinity_norm.threshold=0.01

# Drift Comparator
CryoSleep_analyze=tfdv.get_feature(schema, 'CryoSleep')
CryoSleep_analyze.drift_comparator.infinity_norm.threshold=0.01

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

Wir können sehen, dass der von „Spa“ gezeigte Schiefstand akzeptabel ist (da es nicht in der Anomalieliste aufgeführt ist), „CryoSleep“ weist jedoch hohe Driftwerte auf. Beim Erstellen automatisierter Pipelines könnten diese Anomalien als Auslöser für eine automatisierte Neuschulung des Modells verwendet werden.

Hohe Schiefe im Kryoschlaf

Nachdem alle Anomalien behoben wurden, kann das Schema als Artefakt oder im Metadaten-Repository gespeichert und in der ML-Pipeline verwendet werden.

# Saving the Schema
from tensorflow.python.lib.io import file_io
from google.protobuf import text_format

file_io.recursive_create_dir('schema')
schema_file = os.path.be a part of('schema', 'schema.pbtxt')
tfdv.write_schema_text(schema, schema_file)

# Loading the Schema
loaded_schema= tfdv.load_schema_text(schema_file)
loaded_schema

Sie können das Pocket book und die Datendateien aus meinem GitHub-Repository herunterladen, indem Sie Folgendes verwenden: Verknüpfung

In den folgenden Artikeln erfahren Sie, welche Möglichkeiten Sie haben und wie Sie das richtige Framework für Ihr ML-Pipeline-Projekt auswählen.

Vielen Dank, dass Sie meinen Artikel gelesen haben. Wenn er Ihnen gefällt, ermutigen Sie mich bitte mit ein paar Applaus, und wenn Sie eher am anderen Ende des Spektrums stehen, lassen Sie mich in den Kommentaren wissen, was verbessert werden kann. Ciao.

Sofern nicht anders angegeben, stammen alle Bilder vom Autor.

Von admin

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert