Memulai Validasi Data TensorFlow

TensorFlow Data Validation (TFDV) dapat menganalisis data pelatihan dan penayangan untuk:

API inti mendukung setiap fungsionalitas, dengan metode praktis yang dibangun di atas dan dapat dipanggil dalam konteks notebook.

Menghitung statistik data deskriptif

TFDV dapat menghitung statistik deskriptif yang memberikan gambaran singkat tentang data dalam hal fitur yang ada dan bentuk distribusi nilainya. Alat seperti Ikhtisar Aspek dapat memberikan visualisasi ringkas dari statistik ini untuk memudahkan penelusuran.

Misalnya, path tersebut menunjuk ke file dalam format TFRecord (yang menyimpan rekaman bertipe tensorflow.Example ). Cuplikan berikut mengilustrasikan penghitungan statistik menggunakan TFDV:

    stats = tfdv.generate_statistics_from_tfrecord(data_location=path)

Nilai yang dikembalikan adalah buffer protokol DatasetFeatureStatisticsList . Buku catatan contoh berisi visualisasi statistik menggunakan Facets Overview :

    tfdv.visualize_statistics(stats)

Tangkapan layar visualisasi statistik

Contoh sebelumnya mengasumsikan bahwa data disimpan dalam file TFRecord . TFDV juga mendukung format input CSV, dengan ekstensibilitas untuk format umum lainnya. Anda dapat menemukan decoder data yang tersedia di sini . Selain itu, TFDV menyediakan fungsi utilitas tfdv.generate_statistics_from_dataframe untuk pengguna dengan data dalam memori yang direpresentasikan sebagai DataFrame panda.

Selain menghitung kumpulan statistik data default, TFDV juga dapat menghitung statistik untuk domain semantik (misalnya, gambar, teks). Untuk mengaktifkan penghitungan statistik domain semantik, berikan objek tfdv.StatsOptions dengan enable_semantic_domain_stats disetel ke True ke tfdv.generate_statistics_from_tfrecord .

Berjalan di Google Cloud

Secara internal, TFDV menggunakan kerangka kerja pemrosesan paralel data Apache Beam untuk menskalakan komputasi statistik pada kumpulan data besar. Untuk aplikasi yang ingin berintegrasi lebih dalam dengan TFDV (mis. melampirkan pembuatan statistik di akhir pipa pembuatan data, membuat statistik untuk data dalam format kustom ), API juga membuka Beam PTransform untuk pembuatan statistik.

Untuk menjalankan TFDV di Google Cloud, file wheel TFDV harus didownload dan diberikan kepada pekerja Dataflow. Unduh file roda ke direktori saat ini sebagai berikut:

pip download tensorflow_data_validation \
  --no-deps \
  --platform manylinux2010_x86_64 \
  --only-binary=:all:

Cuplikan berikut menunjukkan contoh penggunaan TFDV di Google Cloud:


import tensorflow_data_validation as tfdv
from apache_beam.options.pipeline_options import PipelineOptions, GoogleCloudOptions, StandardOptions, SetupOptions

PROJECT_ID = ''
JOB_NAME = ''
GCS_STAGING_LOCATION = ''
GCS_TMP_LOCATION = ''
GCS_DATA_LOCATION = ''
# GCS_STATS_OUTPUT_PATH is the file path to which to output the data statistics
# result.
GCS_STATS_OUTPUT_PATH = ''

PATH_TO_WHL_FILE = ''


# Create and set your PipelineOptions.
options = PipelineOptions()

# For Cloud execution, set the Cloud Platform project, job_name,
# staging location, temp_location and specify DataflowRunner.
google_cloud_options = options.view_as(GoogleCloudOptions)
google_cloud_options.project = PROJECT_ID
google_cloud_options.job_name = JOB_NAME
google_cloud_options.staging_location = GCS_STAGING_LOCATION
google_cloud_options.temp_location = GCS_TMP_LOCATION
options.view_as(StandardOptions).runner = 'DataflowRunner'

setup_options = options.view_as(SetupOptions)
# PATH_TO_WHL_FILE should point to the downloaded tfdv wheel file.
setup_options.extra_packages = [PATH_TO_WHL_FILE]

tfdv.generate_statistics_from_tfrecord(GCS_DATA_LOCATION,
                                       output_path=GCS_STATS_OUTPUT_PATH,
                                       pipeline_options=options)

Dalam hal ini, proto statistik yang dihasilkan disimpan dalam file TFRecord yang ditulis ke GCS_STATS_OUTPUT_PATH .

CATATAN Saat memanggil salah satu fungsi tfdv.generate_statistics_... (misalnya, tfdv.generate_statistics_from_tfrecord ) di Google Cloud, Anda harus menyediakan output_path . Menentukan Tidak Ada dapat menyebabkan kesalahan.

Menyimpulkan skema atas data

Skema menjelaskan properti yang diharapkan dari data. Beberapa properti ini adalah:

  • fitur mana yang diharapkan hadir
  • tipe mereka
  • jumlah nilai untuk fitur di setiap contoh
  • kehadiran setiap fitur di semua contoh
  • domain fitur yang diharapkan.

Singkatnya, skema menggambarkan ekspektasi untuk data yang "benar" dan dengan demikian dapat digunakan untuk mendeteksi kesalahan dalam data (dijelaskan di bawah). Selain itu, skema yang sama dapat digunakan untuk menyiapkan Transformasi TensorFlow untuk transformasi data. Perhatikan bahwa skema diharapkan cukup statis, misalnya, beberapa kumpulan data dapat sesuai dengan skema yang sama, sedangkan statistik (dijelaskan di atas) dapat bervariasi per kumpulan data.

Karena menulis skema dapat menjadi tugas yang membosankan, terutama untuk kumpulan data dengan banyak fitur, TFDV menyediakan metode untuk menghasilkan versi awal skema berdasarkan statistik deskriptif:

    schema = tfdv.infer_schema(stats)

Secara umum, TFDV menggunakan heuristik konservatif untuk menyimpulkan properti data yang stabil dari statistik untuk menghindari overfitting skema ke dataset tertentu. Sangat disarankan untuk meninjau skema yang disimpulkan dan memperbaikinya sesuai kebutuhan , untuk menangkap pengetahuan domain apa pun tentang data yang mungkin terlewatkan oleh heuristik TFDV.

Secara default, tfdv.infer_schema menyimpulkan bentuk setiap fitur yang diperlukan, jika value_count.min sama dengan value_count.max untuk fitur tersebut. Setel argumen infer_feature_shape ke False untuk menonaktifkan inferensi bentuk.

Skema itu sendiri disimpan sebagai buffer protokol Skema dan karenanya dapat diperbarui/diedit menggunakan API buffer protokol standar. TFDV juga menyediakan beberapa metode utilitas untuk mempermudah pembaruan ini. Misalnya, skema tersebut berisi bait berikut untuk mendeskripsikan fitur string yang diperlukan payment_type yang mengambil satu nilai:

feature {
  name: "payment_type"
  value_count {
    min: 1
    max: 1
  }
  type: BYTES
  domain: "payment_type"
  presence {
    min_fraction: 1.0
    min_count: 1
  }
}

Untuk menandai bahwa fitur harus diisi setidaknya 50% dari contoh:

    tfdv.get_feature(schema, 'payment_type').presence.min_fraction = 0.5

Buku catatan contoh berisi visualisasi skema sederhana sebagai tabel, mencantumkan setiap fitur dan karakteristik utamanya sebagaimana dikodekan dalam skema.

Tangkapan layar visualisasi skema

Memeriksa data untuk kesalahan

Mengingat skema, adalah mungkin untuk memeriksa apakah kumpulan data sesuai dengan ekspektasi yang ditetapkan dalam skema atau apakah terdapat anomali data . Anda dapat memeriksa data Anda untuk kesalahan (a) secara agregat di seluruh kumpulan data dengan mencocokkan statistik kumpulan data dengan skema, atau (b) dengan memeriksa kesalahan berdasarkan per contoh.

Mencocokkan statistik kumpulan data dengan skema

Untuk memeriksa kesalahan dalam agregat, TFDV mencocokkan statistik kumpulan data dengan skema dan menandai perbedaan apa pun. Misalnya:

    # Assume that other_path points to another TFRecord file
    other_stats = tfdv.generate_statistics_from_tfrecord(data_location=other_path)
    anomalies = tfdv.validate_statistics(statistics=other_stats, schema=schema)

Hasilnya adalah turunan dari penyangga protokol Anomali dan menjelaskan kesalahan apa pun yang statistiknya tidak sesuai dengan skema. Misalnya, data di other_path berisi contoh dengan nilai untuk payment_type fitur di luar domain yang ditentukan dalam skema.

Ini menghasilkan anomali

   payment_type  Unexpected string values  Examples contain values missing from the schema: Prcard (<1%).

menunjukkan bahwa nilai di luar domain ditemukan dalam statistik di <1% dari nilai fitur.

Jika ini yang diharapkan, maka skema dapat diperbarui sebagai berikut:

   tfdv.get_domain(schema, 'payment_type').value.append('Prcard')

Jika anomali benar-benar menunjukkan kesalahan data, maka data yang mendasarinya harus diperbaiki sebelum digunakan untuk pelatihan.

Berbagai jenis anomali yang dapat dideteksi oleh modul ini tercantum di sini .

Buku catatan contoh berisi visualisasi sederhana dari anomali sebagai tabel, daftar fitur di mana kesalahan terdeteksi dan deskripsi singkat dari setiap kesalahan.

Tangkapan layar anomali

Memeriksa kesalahan berdasarkan per contoh

TFDV juga menyediakan opsi untuk memvalidasi data berdasarkan per contoh, alih-alih membandingkan statistik set data dengan skema. TFDV menyediakan fungsi untuk memvalidasi data berdasarkan per contoh dan kemudian menghasilkan statistik ringkasan untuk contoh anomali yang ditemukan. Misalnya:

   options = tfdv.StatsOptions(schema=schema)
   anomalous_example_stats = tfdv.validate_examples_in_tfrecord(
       data_location=input, stats_options=options)

anomalous_example_stats yang dikembalikan validate_examples_in_tfrecord adalah buffer protokol DatasetFeatureStatisticsList di mana setiap kumpulan data terdiri dari kumpulan contoh yang menunjukkan anomali tertentu. Anda dapat menggunakan ini untuk menentukan jumlah contoh dalam kumpulan data Anda yang menunjukkan anomali tertentu dan karakteristik dari contoh tersebut.

Lingkungan Skema

Secara default, validasi mengasumsikan bahwa semua kumpulan data dalam alur mengikuti satu skema. Dalam beberapa kasus, memperkenalkan sedikit variasi skema diperlukan, misalnya fitur yang digunakan sebagai label diperlukan selama pelatihan (dan harus divalidasi), tetapi tidak ada selama penyajian.

Lingkungan dapat digunakan untuk mengekspresikan persyaratan tersebut. Secara khusus, fitur dalam skema dapat dikaitkan dengan sekumpulan lingkungan menggunakan default_environment, in_environment, dan not_in_environment.

Misalnya, jika fitur tips digunakan sebagai label dalam pelatihan, tetapi tidak ada dalam data penayangan. Tanpa lingkungan yang ditentukan, itu akan muncul sebagai anomali.

    serving_stats = tfdv.generate_statistics_from_tfrecord(data_location=serving_data_path)
    serving_anomalies = tfdv.validate_statistics(serving_stats, schema)

Tangkapan layar anomali penyajian

Untuk memperbaikinya, kita perlu menyetel lingkungan default untuk semua fitur menjadi 'TRAINING' dan 'SERVING', dan mengecualikan fitur 'tips' dari lingkungan SERVING.

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

Memeriksa kemiringan dan penyimpangan data

Selain memeriksa apakah kumpulan data sesuai dengan harapan yang ditetapkan dalam skema, TFDV juga menyediakan fungsionalitas untuk mendeteksi:

  • condong antara pelatihan dan penyajian data
  • melayang di antara hari yang berbeda dari data pelatihan

TFDV melakukan pemeriksaan ini dengan membandingkan statistik kumpulan data yang berbeda berdasarkan pembanding penyimpangan/kemiringan yang ditentukan dalam skema. Misalnya, untuk memeriksa apakah ada kecondongan antara fitur 'payment_type' dalam pelatihan dan penyajian dataset:

    # Assume we have already generated the statistics of training dataset, and
    # inferred a schema from it.
    serving_stats = tfdv.generate_statistics_from_tfrecord(data_location=serving_data_path)
    # Add a skew comparator to schema for 'payment_type' and set the threshold
    # of L-infinity norm for triggering skew anomaly to be 0.01.
    tfdv.get_feature(schema, 'payment_type').skew_comparator.infinity_norm.threshold = 0.01
    skew_anomalies = tfdv.validate_statistics(
        statistics=train_stats, schema=schema, serving_statistics=serving_stats)

CATATAN L-infinity norm hanya akan mendeteksi kemiringan untuk fitur kategorikal. Alih-alih menentukan ambang infinity_norm , menentukan ambang batas jensen_shannon_divergence di skew_comparator akan mendeteksi kemiringan untuk fitur numerik dan kategorikal.

Sama dengan memeriksa apakah kumpulan data sesuai dengan ekspektasi yang ditetapkan dalam skema, hasilnya juga merupakan turunan dari buffer protokol Anomali dan menjelaskan setiap kemiringan antara kumpulan data pelatihan dan penyajian. Misalnya, data penyajian berisi lebih banyak contoh dengan fitur payement_type yang memiliki nilai Cash , ini menghasilkan anomali miring

   payment_type  High L-infinity distance between serving and training  The L-infinity distance between serving and training is 0.0435984 (up to six significant digits), above the threshold 0.01. The feature value with maximum difference is: Cash

Jika anomali benar-benar menunjukkan kecondongan antara pelatihan dan penyajian data, penyelidikan lebih lanjut diperlukan karena hal ini dapat berdampak langsung pada kinerja model.

Buku catatan contoh berisi contoh sederhana pemeriksaan anomali berbasis kemiringan.

Mendeteksi pergeseran antara hari yang berbeda dari data pelatihan dapat dilakukan dengan cara yang sama

    # Assume we have already generated the statistics of training dataset for
    # day 2, and inferred a schema from it.
    train_day1_stats = tfdv.generate_statistics_from_tfrecord(data_location=train_day1_data_path)
    # Add a drift comparator to schema for 'payment_type' and set the threshold
    # of L-infinity norm for triggering drift anomaly to be 0.01.
    tfdv.get_feature(schema, 'payment_type').drift_comparator.infinity_norm.threshold = 0.01
    drift_anomalies = tfdv.validate_statistics(
        statistics=train_day2_stats, schema=schema, previous_statistics=train_day1_stats)

CATATAN L-infinity norm hanya akan mendeteksi kemiringan untuk fitur kategorikal. Alih-alih menentukan ambang infinity_norm , menentukan ambang batas jensen_shannon_divergence di skew_comparator akan mendeteksi kemiringan untuk fitur numerik dan kategorikal.

Menulis konektor data kustom

Untuk menghitung statistik data, TFDV menyediakan beberapa metode mudah untuk menangani input data dalam berbagai format (misalnya TFRecord dari tf.train.Example , CSV, dll). Jika format data Anda tidak ada dalam daftar ini, Anda perlu menulis konektor data khusus untuk membaca data input, dan menghubungkannya dengan API inti TFDV untuk menghitung statistik data.

API inti TFDV untuk menghitung statistik data adalah Beam PTransform yang mengambil PCollection kumpulan contoh masukan (kumpulan contoh masukan direpresentasikan sebagai Arrow RecordBatch), dan mengeluarkan PCollection yang berisi buffer protokol DatasetFeatureStatisticsList tunggal.

Setelah Anda mengimplementasikan konektor data kustom yang mengelompokkan contoh input Anda dalam Arrow RecordBatch, Anda perlu menghubungkannya dengan tfdv.GenerateStatistics API untuk menghitung statistik data. Ambil contoh TFRecord dari tf.train.Example . tfx_bsl menyediakan konektor data TFExampleRecord , dan di bawah ini adalah contoh cara menghubungkannya dengan API tfdv.GenerateStatistics .

import tensorflow_data_validation as tfdv
from tfx_bsl.public import tfxio
import apache_beam as beam
from tensorflow_metadata.proto.v0 import statistics_pb2

DATA_LOCATION = ''
OUTPUT_LOCATION = ''

with beam.Pipeline() as p:
    _ = (
    p
    # 1. Read and decode the data with tfx_bsl.
    | 'TFXIORead' >> (
          tfxio.TFExampleRecord(
              file_pattern=[DATA_LOCATION],
              telemetry_descriptors=['my', 'tfdv']).BeamSource())
    # 2. Invoke TFDV `GenerateStatistics` API to compute the data statistics.
    | 'GenerateStatistics' >> tfdv.GenerateStatistics()
    # 3. Materialize the generated data statistics.
    | 'WriteStatsOutput' >> WriteStatisticsToTFRecord(OUTPUT_LOCATION))

Menghitung statistik atas irisan data

TFDV dapat dikonfigurasi untuk menghitung statistik pada irisan data. Slicing dapat diaktifkan dengan menyediakan fungsi slicing yang menggunakan Arrow RecordBatch dan menghasilkan urutan tuple form (slice key, record batch) . TFDV menyediakan cara mudah untuk menghasilkan fungsi pemotongan berbasis nilai fitur yang dapat disediakan sebagai bagian dari tfdv.StatsOptions saat menghitung statistik.

Saat pemotongan diaktifkan, proto DatasetFeatureStatisticsList keluaran berisi beberapa proto DatasetFeatureStatistics , satu untuk setiap irisan. Setiap irisan diidentifikasi dengan nama unik yang ditetapkan sebagai nama kumpulan data di proto DatasetFeatureStatistics . Secara default TFDV menghitung statistik untuk keseluruhan dataset selain irisan yang dikonfigurasi.

import tensorflow_data_validation as tfdv
from tensorflow_data_validation.utils import slicing_util

# Slice on country feature (i.e., every unique value of the feature).
slice_fn1 = slicing_util.get_feature_value_slicer(features={'country': None})

# Slice on the cross of country and state feature (i.e., every unique pair of
# values of the cross).
slice_fn2 = slicing_util.get_feature_value_slicer(
    features={'country': None, 'state': None})

# Slice on specific values of a feature.
slice_fn3 = slicing_util.get_feature_value_slicer(
    features={'age': [10, 50, 70]})

stats_options = tfdv.StatsOptions(
    slice_functions=[slice_fn1, slice_fn2, slice_fn3])