TensorFlow Veri Doğrulaması (TFDV), eğitim ve sunum verilerini şu amaçlarla analiz edebilir:
tanımlayıcı istatistikleri hesaplamak ,
bir şema çıkarmak,
veri anormalliklerini tespit edin.
Çekirdek API, üstte oluşturulan ve not defterleri bağlamında çağrılabilen kolaylık yöntemleriyle her bir işlevsellik parçasını destekler.
Açıklayıcı veri istatistiklerinin hesaplanması
TFDV, mevcut özellikler ve değer dağılımlarının şekilleri açısından verilere hızlı bir genel bakış sağlayan tanımlayıcı istatistikleri hesaplayabilir. Özelliklere Genel Bakış gibi araçlar, kolay göz atma için bu istatistiklerin kısa ve öz bir görselleştirmesini sağlayabilir.
Örneğin, path
TFRecord
biçimindeki ( tensorflow.Example
türündeki kayıtları tutan) bir dosyaya işaret ettiğini varsayalım. Aşağıdaki kod parçası, TFDV kullanılarak istatistiklerin hesaplanmasını göstermektedir:
stats = tfdv.generate_statistics_from_tfrecord(data_location=path)
Döndürülen değer, bir DatasetFeatureStatisticsList protokol arabelleğidir. Örnek not defteri, Yönlere Genel Bakış kullanılarak istatistiklerin bir görselleştirmesini içerir:
tfdv.visualize_statistics(stats)
Önceki örnek, verilerin bir TFRecord
dosyasında saklandığını varsayar. TFDV, diğer yaygın biçimler için genişletilebilirlik ile birlikte CSV giriş biçimini de destekler. Mevcut veri kod çözücülerini burada bulabilirsiniz. Ayrıca TFDV, pandas DataFrame olarak temsil edilen bellek içi verileri olan kullanıcılar için tfdv.generate_statistics_from_dataframe
yardımcı programı işlevini sağlar.
Varsayılan bir veri istatistikleri kümesini hesaplamaya ek olarak, TFDV aynı zamanda semantik alanlar (örn. resimler, metin) için istatistikleri de hesaplayabilir. Semantik etki alanı istatistiklerinin hesaplanmasını etkinleştirmek için, enable_semantic_domain_stats
True olarak ayarlanmış bir tfdv.StatsOptions nesnesini tfdv.generate_statistics_from_tfrecord
öğesine iletin.
Google Cloud'da çalışıyor
Dahili olarak TFDV, büyük veri kümeleri üzerinde istatistiklerin hesaplanmasını ölçeklendirmek için Apache Beam'in veri paralel işleme çerçevesini kullanır. TFDV ile daha derin entegre olmak isteyen uygulamalar için (örneğin, bir veri oluşturma ardışık düzeninin sonuna istatistik oluşturma ekleme, özel biçimde veriler için istatistik oluşturma ), API ayrıca istatistik oluşturma için bir Beam PTransform sunar.
TFDV'yi Google Cloud'da çalıştırmak için TFDV tekerlek dosyası indirilmeli ve Dataflow çalışanlarına sağlanmalıdır. Wheel dosyasını şu şekilde mevcut dizine indirin:
pip download tensorflow_data_validation \
--no-deps \
--platform manylinux2010_x86_64 \
--only-binary=:all:
Aşağıdaki snippet, Google Cloud'da örnek bir TFDV kullanımını göstermektedir:
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)
Bu durumda, oluşturulan istatistik protokolü, GCS_STATS_OUTPUT_PATH
konumuna yazılan bir TFRecord dosyasında depolanır.
NOT Google Cloud'da tfdv.generate_statistics_...
işlevlerinden herhangi birini (ör. tfdv.generate_statistics_from_tfrecord
) çağırırken bir output_path
sağlamanız gerekir. Hiçbiri belirtilmesi bir hataya neden olabilir.
Veriler üzerinden bir şema çıkarma
Şema, verilerin beklenen özelliklerini açıklar. Bu özelliklerden bazıları şunlardır:
- hangi özelliklerin bulunması bekleniyor
- onların türü
- her örnekte bir özellik için değerlerin sayısı
- tüm örneklerde her bir özelliğin varlığı
- özelliklerin beklenen alanları.
Kısaca, şema "doğru" veri beklentilerini açıklar ve böylece verideki hataları tespit etmek için kullanılabilir (aşağıda açıklanmıştır). Ayrıca, veri dönüşümleri için TensorFlow Transform'u ayarlamak için aynı şema kullanılabilir. Şemanın oldukça durağan olmasının beklendiğini unutmayın; örneğin, birkaç veri kümesi aynı şemaya uygun olabilirken istatistikler (yukarıda açıklanmıştır) veri kümesine göre değişiklik gösterebilir.
Bir şema yazmak, özellikle çok sayıda özelliğe sahip veri kümeleri için sıkıcı bir görev olabileceğinden, TFDV, tanımlayıcı istatistiklere dayalı olarak şemanın ilk sürümünü oluşturmak için bir yöntem sağlar:
schema = tfdv.infer_schema(stats)
Genel olarak TFDV, şemayı belirli veri kümesine fazla uydurmaktan kaçınmak için istatistiklerden kararlı veri özellikleri çıkarmak için muhafazakar buluşsal yöntemler kullanır. TFDV'nin buluşsal yönteminin gözden kaçırmış olabileceği veriler hakkında herhangi bir etki alanı bilgisini yakalamak için, çıkarsanan şemanın gözden geçirilmesi ve gerektiğinde rafine edilmesi şiddetle tavsiye edilir.
Varsayılan olarak, özellik için value_count.min
değeri value_count.max
değerine eşitse, tfdv.infer_schema
gerekli her özelliğin şeklini çıkarır. Şekil çıkarımını devre dışı bırakmak için infer_feature_shape
bağımsız değişkenini Yanlış olarak ayarlayın.
Şemanın kendisi bir Şema protokol arabelleği olarak saklanır ve bu nedenle standart protokol arabelleği API'si kullanılarak güncellenebilir/düzenlenebilir. TFDV, bu güncellemeleri kolaylaştırmak için birkaç yardımcı yöntem de sağlar. Örneğin, şemanın, tek bir değer alan gerekli bir payment_type
dize özelliğini açıklamak için aşağıdaki dörtlüğü içerdiğini varsayalım:
feature {
name: "payment_type"
value_count {
min: 1
max: 1
}
type: BYTES
domain: "payment_type"
presence {
min_fraction: 1.0
min_count: 1
}
}
Özelliğin örneklerin en az %50'sinde doldurulması gerektiğini işaretlemek için:
tfdv.get_feature(schema, 'payment_type').presence.min_fraction = 0.5
Örnek not defteri , şemada kodlanmış olarak her bir özelliği ve ana özelliklerini listeleyen bir tablo olarak şemanın basit bir görselleştirmesini içerir.
Hatalar için verileri kontrol etme
Bir şema verildiğinde, bir veri setinin şemada belirlenen beklentilere uyup uymadığını veya herhangi bir veri anomalisi olup olmadığını kontrol etmek mümkündür. Verilerinizi (a) veri kümesinin istatistiklerini şemayla eşleştirerek tüm veri kümesi genelinde toplu olarak veya (b) her örneğe göre hataları kontrol ederek hataları kontrol edebilirsiniz.
Veri kümesinin istatistiklerini bir şemaya göre eşleştirme
Toplamdaki hataları kontrol etmek için TFDV, veri kümesinin istatistiklerini şemayla eşleştirir ve tutarsızlıkları işaretler. Örneğin:
# 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)
Sonuç, Anomaliler protokol arabelleğinin bir örneğidir ve istatistiklerin şemayla uyuşmadığı hataları açıklar. Örneğin, other_path
verilerin şemada belirtilen etki alanı dışında payment_type
özelliği için değerler içeren örnekler içerdiğini varsayalım.
Bu bir anormallik yaratır
payment_type Unexpected string values Examples contain values missing from the schema: Prcard (<1%).
özellik değerlerinin <%1'inde istatistiklerde alan dışı bir değerin bulunduğunu belirtir.
Bu bekleniyorsa, şema şu şekilde güncellenebilir:
tfdv.get_domain(schema, 'payment_type').value.append('Prcard')
Anomali gerçekten bir veri hatasını gösteriyorsa, eğitim için kullanılmadan önce temeldeki veriler düzeltilmelidir.
Bu modül tarafından tespit edilebilen çeşitli anomali türleri burada listelenmiştir.
Örnek not defteri , hataların algılandığı özellikleri ve her hatanın kısa bir açıklamasını listeleyen bir tablo olarak anormalliklerin basit bir görselleştirmesini içerir.
Örnek bazında hataları kontrol etme
TFDV ayrıca, veri kümesi genelindeki istatistikleri şemayla karşılaştırmak yerine, verileri örnek bazında doğrulama seçeneği sunar. TFDV, verileri örnek bazında doğrulamak ve ardından bulunan anormal örnekler için özet istatistikler oluşturmak için işlevler sağlar. Örneğin:
options = tfdv.StatsOptions(schema=schema)
anomalous_example_stats = tfdv.validate_examples_in_tfrecord(
data_location=input, stats_options=options)
validate_examples_in_tfrecord
döndürdüğü anomalous_example_stats
, her veri kümesinin belirli bir anormallik sergileyen örnek kümesinden oluştuğu bir DatasetFeatureStatisticsList protokol arabelleğidir. Bunu, veri kümenizdeki belirli bir anormalliği sergileyen örneklerin sayısını ve bu örneklerin özelliklerini belirlemek için kullanabilirsiniz.
Şema Ortamları
Varsayılan olarak doğrulamalar, bir ardışık düzendeki tüm veri kümelerinin tek bir şemaya bağlı olduğunu varsayar. Bazı durumlarda, küçük şema varyasyonlarının tanıtılması gerekir; örneğin, etiket olarak kullanılan özellikler eğitim sırasında gereklidir (ve doğrulanmalıdır), ancak sunum sırasında eksiktir.
Bu tür gereksinimleri ifade etmek için ortamlar kullanılabilir. Özellikle şemadaki özellikler, default_environment, in_environment ve not_in_environment kullanılarak bir dizi ortamla ilişkilendirilebilir.
Örneğin, ipuçları özelliği eğitimde etiket olarak kullanılıyor ancak sunum verilerinde eksikse. Ortam belirtilmezse, bir anormallik olarak görünür.
serving_stats = tfdv.generate_statistics_from_tfrecord(data_location=serving_data_path)
serving_anomalies = tfdv.validate_statistics(serving_stats, schema)
Bunu düzeltmek için, tüm özellikler için varsayılan ortamı hem 'EĞİTİM' hem de 'SERVING' olarak ayarlamamız ve 'ipuçları' özelliğini SERVING ortamından çıkarmamız gerekiyor.
# 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')
Veri çarpıklığını ve kaymasını kontrol etme
TFDV, bir veri kümesinin şemada belirlenen beklentilere uyup uymadığını kontrol etmenin yanı sıra şunları tespit etmek için işlevler de sağlar:
- eğitim ve sunum verileri arasında kayma
- farklı eğitim günleri verileri arasında kayma
TFDV, şemada belirtilen sapma/eğiklik karşılaştırıcılarına dayalı olarak farklı veri kümelerinin istatistiklerini karşılaştırarak bu denetimi gerçekleştirir. Örneğin, eğitim ve sunum veri kümesindeki "payment_type" özelliği arasında herhangi bir sapma olup olmadığını kontrol etmek için:
# 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)
NOT L-sonsuz normu yalnızca kategorik özellikler için eğriliği algılar. Bir infinity_norm
eşiği belirtmek yerine, skew_comparator
bir jensen_shannon_divergence
eşiği belirtmek, hem sayısal hem de kategorik özellikler için eğriliği algılar.
Bir veri kümesinin şemada belirlenen beklentilere uyup uymadığının kontrol edilmesiyle aynı şekilde, sonuç aynı zamanda Anomaliler protokol arabelleğinin bir örneğidir ve eğitim ile hizmet veren veri kümeleri arasındaki eğriliği açıklar. Örneğin, sunum verilerinin Cash
değerine sahip payement_type
özelliğine sahip önemli ölçüde daha fazla örnek içerdiğini varsayalım, bu bir çarpıklık anomalisi oluşturur
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
Anormallik, eğitim ve sunum verileri arasında gerçekten bir çarpıklık olduğunu gösteriyorsa, bunun model performansı üzerinde doğrudan bir etkisi olabileceğinden daha fazla araştırma yapılması gerekir.
Örnek not defteri, eğriliğe dayalı anormallikleri denetlemenin basit bir örneğini içerir.
Eğitim verilerinin farklı günleri arasındaki kaymanın tespiti benzer şekilde yapılabilir.
# 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)
NOT L-sonsuz normu yalnızca kategorik özellikler için eğriliği algılar. Bir infinity_norm
eşiği belirtmek yerine, skew_comparator
bir jensen_shannon_divergence
eşiği belirtmek, hem sayısal hem de kategorik özellikler için eğriliği algılar.
Özel veri bağlayıcısı yazma
Veri istatistiklerini hesaplamak için TFDV, çeşitli formatlardaki girdi verilerini işlemek için birkaç uygun yöntem sağlar (örn. TFRecord
of tf.train.Example , CSV, vb.). Veri formatınız bu listede yoksa, giriş verilerini okumak için özel bir veri bağlayıcısı yazmanız ve veri istatistiklerini hesaplamak için bunu TFDV çekirdek API'sine bağlamanız gerekir.
Veri istatistiklerini hesaplamaya yönelik TFDV çekirdek API'si, girdi örnekleri toplu işlerinin bir PCollection'ını alan (bir grup girdi örneği bir Arrow RecordBatch olarak temsil edilir) ve tek bir DatasetFeatureStatisticsList
protokol arabelleği içeren bir PCollection çıkaran bir Beam PTransform'dur .
Girdi örneklerinizi bir Arrow RecordBatch'te toplayan özel veri bağlayıcıyı uyguladıktan sonra, veri istatistiklerini hesaplamak için onu tfdv.GenerateStatistics
API'sine bağlamanız gerekir. Örneğin tf.train.Example
'ın TFRecord
alın. tfx_bsl
TFExampleRecord veri bağlayıcısını sağlar ve aşağıda bunun tfdv.GenerateStatistics
API ile nasıl bağlanacağına dair bir örnek verilmiştir.
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))
Veri dilimleri üzerinden hesaplama istatistikleri
TFDV, veri dilimleri üzerinden istatistikleri hesaplamak için yapılandırılabilir. Dilimleme, Arrow RecordBatch
alan ve bir form demetleri dizisi (slice key, record batch)
çıkaran dilimleme işlevleri sağlanarak etkinleştirilebilir. TFDV, istatistikleri hesaplarken tfdv.StatsOptions
bir parçası olarak sağlanabilen özellik değerine dayalı dilimleme işlevleri oluşturmak için kolay bir yol sağlar.
Dilimleme etkinleştirildiğinde, DatasetFeatureStatisticsList çıktı protosu, her dilim için bir tane olmak üzere birden çok DatasetFeatureStatistics protosu içerir. Her dilim, DatasetFeatureStatistics protokolünde veri kümesi adı olarak ayarlanan benzersiz bir adla tanımlanır. Varsayılan olarak TFDV, yapılandırılan dilimlere ek olarak genel veri kümesi için istatistikleri hesaplar.
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])