Hari Komunitas ML adalah 9 November! Bergabung dengan kami untuk update dari TensorFlow, JAX, dan lebih Pelajari lebih lanjut

Mulailah dengan Validasi Data Tensorflow

Tensorflow Data Validation (TFDV) dapat menganalisis pelatihan dan menyajikan data ke:

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

Menghitung statistik data deskriptif

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

Misalnya, path menunjuk ke file dalam format TFRecord (yang menyimpan rekaman jenis tensorflow.Example ). Cuplikan berikut menggambarkan 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 Ikhtisar Faset :

    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 dekoder 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 pandas.

Selain menghitung sekumpulan statistik data default, TFDV juga dapat menghitung statistik untuk domain semantik (misalnya, gambar, teks). Untuk mengaktifkan komputasi statistik domain semantik, teruskan objek enable_semantic_domain_stats dengan enable_semantic_domain_stats disetel ke True to tfdv.generate_statistics_from_tfrecord .

Berjalan di Google Cloud

Secara internal, TFDV menggunakan kerangka kerja pemrosesan data-paralel Apache Beam untuk mengukur komputasi statistik pada kumpulan data besar. Untuk aplikasi yang ingin berintegrasi lebih dalam dengan TFDV (mis. Melampirkan pembuatan statistik di akhir jalur penghasil data, menghasilkan statistik untuk data dalam format kustom ), API juga mengekspos Beam PTransform untuk pembuatan statistik.

Untuk menjalankan TFDV di Google Cloud, file roda TFDV harus diunduh 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 kasus 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 memberikan output_path . Menentukan Tidak Ada dapat menyebabkan kesalahan.

Menyimpulkan skema atas data

Skema menjelaskan properti data yang diharapkan. Beberapa dari 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 menjelaskan 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 mengikuti skema yang sama, sedangkan statistik (dijelaskan di atas) dapat bervariasi per kumpulan data.

Karena menulis skema bisa 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 set data tertentu. Sangat disarankan untuk meninjau skema yang disimpulkan dan menyempurnakannya sesuai kebutuhan , untuk menangkap pengetahuan domain apa pun tentang data yang mungkin terlewatkan oleh heuristik TFDV.

Secara default, tfdv.infer_schema menyimpulkan bentuk dari 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 dengan demikian dapat diperbarui / diedit menggunakan API buffer protokol standar. TFDV juga menyediakan beberapa metode utilitas untuk mempermudah pembaruan ini. Misalnya, skema berisi bait berikut untuk mendeskripsikan string fitur payment_type yang diperlukan 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 tersebut harus diisi setidaknya di 50% contoh:

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

Notebook contoh berisi visualisasi skema sederhana sebagai tabel, mencantumkan setiap fitur dan karakteristik utamanya sebagai yang dikodekan dalam skema.

Tangkapan layar visualisasi skema

Memeriksa kesalahan pada data

Dengan adanya skema, dimungkinkan untuk memeriksa apakah kumpulan data sesuai dengan harapan yang ditetapkan dalam skema atau apakah ada anomali data . Anda dapat memeriksa data Anda untuk kesalahan (a) dalam agregat di seluruh kumpulan data dengan mencocokkan statistik kumpulan data dengan skema, atau (b) dengan memeriksa kesalahan per contoh.

Mencocokkan statistik kumpulan data dengan skema

Untuk memeriksa kesalahan secara agregat, TFDV mencocokkan statistik kumpulan data dengan skema dan menandai setiap perbedaan. Sebagai contoh:

    # 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 instance buffer protokol Anomali dan menjelaskan kesalahan apa pun yang statistiknya tidak sesuai dengan skema. Misalnya, data di other_path berisi contoh dengan nilai untuk fitur payment_type 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 diharapkan, 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 .

Notebook contoh berisi visualisasi sederhana dari anomali sebagai tabel, mencantumkan fitur di mana kesalahan terdeteksi dan deskripsi singkat untuk setiap kesalahan.

Tangkapan layar anomali

Memeriksa kesalahan per contoh

TFDV juga menyediakan opsi untuk memvalidasi data per contoh, daripada membandingkan statistik seluruh kumpulan data dengan skema. TFDV menyediakan fungsi untuk memvalidasi data pada basis per contoh dan kemudian menghasilkan statistik ringkasan untuk contoh anomali yang ditemukan. Sebagai contoh:

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

The anomalous_example_stats yang validate_examples_in_tfrecord pengembalian adalah DatasetFeatureStatisticsList protokol penyangga di mana setiap dataset terdiri dari himpunan 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 set data dalam pipeline mematuhi satu skema. Dalam beberapa kasus, pengenalan sedikit variasi skema diperlukan, misalnya fitur yang digunakan sebagai label diperlukan selama pelatihan (dan harus divalidasi), tetapi hilang selama penayangan.

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

Misalnya, jika fitur tips digunakan sebagai label dalam pelatihan, tetapi tidak ada dalam data penyajian. Tanpa lingkungan yang ditentukan, ini 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 dari 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 data skew dan drift

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

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

TFDV melakukan pemeriksaan ini dengan membandingkan statistik dari kumpulan data yang berbeda berdasarkan pembanding drift / skew yang ditentukan dalam skema. Misalnya, untuk memeriksa apakah ada kemiringan antara fitur 'payment_type' dalam pelatihan dan set data penayangan:

    # 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 Untuk mendeteksi kemiringan untuk fitur numerik, tentukan ambang batas jensen_shannon_divergence alih-alih ambang batas infinity_norm di skew_comparator .

Sama dengan memeriksa apakah sebuah set data sesuai dengan ekspektasi yang ditetapkan dalam skema, hasilnya juga merupakan instance dari buffer protokol Anomali dan menjelaskan setiap kemiringan antara set data pelatihan dan penyajian. Misalnya, data penayangan berisi lebih banyak contoh secara signifikan dengan fitur payement_type bernilai Cash , ini menghasilkan anomali kemiringan

   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 ketidaksesuaian antara data pelatihan dan penayangan, penyelidikan lebih lanjut diperlukan karena hal ini dapat berdampak langsung pada performa model.

Notebook contoh berisi contoh sederhana untuk memeriksa anomali berbasis kemiringan.

Mendeteksi penyimpangan di antara hari yang berbeda dari data pelatihan dapat dilakukan dengan cara yang serupa

    # 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 Untuk mendeteksi kemiringan untuk fitur numerik, tentukan ambang jensen_shannon_divergence alih-alih ambang infinity_norm di drift_comparator .

Menulis konektor data khusus

Untuk menghitung statistik data, TFDV menyediakan beberapa metode praktis untuk menangani data masukan 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 masukan, dan menghubungkannya dengan API inti TFDV untuk menghitung statistik data.

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

Setelah Anda menerapkan konektor data khusus yang mengumpulkan contoh masukan Anda dalam Arrow RecordBatch, Anda perlu menghubungkannya dengan API tfdv.GenerateStatistics untuk menghitung statistik data. Ambil TFRecord dari tf.train.Example sebagai contoh. tfx_bsl menyediakan konektor data TFExampleRecord , dan di bawah ini adalah contoh cara menghubungkannya dengan tfdv.GenerateStatistics API.

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. Mengiris dapat diaktifkan dengan menyediakan fungsi pemotongan yang mengambil Arrow RecordBatch dan mengeluarkan urutan tupel bentuk (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.

Jika pemotongan diaktifkan, proto DatasetFeatureStatisticsList berisi beberapa proto DatasetFeatureStatistics , satu untuk setiap potongan. Setiap potongan diidentifikasi dengan nama unik yang ditetapkan sebagai nama kumpulan data dalam 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])