Bu sayfa, Cloud Translation API ile çevrilmiştir.
Switch to English

TensorFlow Veri Doğrulaması

TensorFlow Extended Anahtar Bileşenine Bir Örnek

Bu örnek colab not defteri, veri kümenizi araştırmak ve görselleştirmek için TensorFlow Veri Doğrulamanın (TFDV) nasıl kullanılabileceğini gösterir. Bu, tanımlayıcı istatistiklere bakmayı, bir şemayı çıkarmayı, anormallikleri kontrol etmeyi ve düzeltmeyi ve veri setimizde kayma ve çarpıklığı kontrol etmeyi içerir. Üretim hattınızda zaman içinde nasıl değişebileceği de dahil olmak üzere veri kümenizin özelliklerini anlamak önemlidir. Verilerinizdeki anormallikleri aramak ve tutarlı olduklarından emin olmak için eğitim, değerlendirme ve hizmet veri kümelerinizi karşılaştırmak da önemlidir.

Chicago Şehri tarafından yayınlanan Taxi Trips veri kümesindeki verileri kullanacağız.

Google BigQuery'deki veri kümesi hakkında daha fazla bilgi edinin. BigQuery kullanıcı arayüzündeki tüm veri kümesini keşfedin.

Veri kümesindeki sütunlar şunlardır:

pickup_community_area Ücret 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 ödeme şekli şirket
trip_seconds dropoff_community_area ipuçları

Pip'i Yükselt

Yerel olarak çalışırken bir sistemde Pip'i yükseltmekten kaçınmak için Colab'da çalıştığımızdan emin olun. Yerel sistemler elbette ayrı olarak yükseltilebilir.

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

TensorFlow'u yükleyin

pip install tensorflow==2.2.0
Collecting tensorflow==2.2.0
  Using cached tensorflow-2.2.0-cp36-cp36m-manylinux2010_x86_64.whl (516.2 MB)
Requirement already satisfied: gast==0.3.3 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorflow==2.2.0) (0.3.3)
Requirement already satisfied: wheel>=0.26; python_version >= "3" in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorflow==2.2.0) (0.35.1)
Requirement already satisfied: astunparse==1.6.3 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorflow==2.2.0) (1.6.3)
Requirement already satisfied: opt-einsum>=2.3.2 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorflow==2.2.0) (3.3.0)
Requirement already satisfied: absl-py>=0.7.0 in /home/kbuilder/.local/lib/python3.6/site-packages (from tensorflow==2.2.0) (0.9.0)
Requirement already satisfied: protobuf>=3.8.0 in /home/kbuilder/.local/lib/python3.6/site-packages (from tensorflow==2.2.0) (3.13.0)
Collecting tensorflow-estimator<2.3.0,>=2.2.0
  Using cached tensorflow_estimator-2.2.0-py2.py3-none-any.whl (454 kB)
Requirement already satisfied: h5py<2.11.0,>=2.10.0 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorflow==2.2.0) (2.10.0)
Requirement already satisfied: google-pasta>=0.1.8 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorflow==2.2.0) (0.2.0)
Requirement already satisfied: wrapt>=1.11.1 in /home/kbuilder/.local/lib/python3.6/site-packages (from tensorflow==2.2.0) (1.12.1)
Requirement already satisfied: grpcio>=1.8.6 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorflow==2.2.0) (1.31.0)
Requirement already satisfied: numpy<2.0,>=1.16.0 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorflow==2.2.0) (1.18.5)
Requirement already satisfied: termcolor>=1.1.0 in /home/kbuilder/.local/lib/python3.6/site-packages (from tensorflow==2.2.0) (1.1.0)
Requirement already satisfied: scipy==1.4.1; python_version >= "3" in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorflow==2.2.0) (1.4.1)
Collecting tensorboard<2.3.0,>=2.2.0
  Using cached tensorboard-2.2.2-py3-none-any.whl (3.0 MB)
Requirement already satisfied: keras-preprocessing>=1.1.0 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorflow==2.2.0) (1.1.2)
Requirement already satisfied: six>=1.12.0 in /home/kbuilder/.local/lib/python3.6/site-packages (from tensorflow==2.2.0) (1.15.0)
Requirement already satisfied: setuptools in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from protobuf>=3.8.0->tensorflow==2.2.0) (49.6.0)
Requirement already satisfied: tensorboard-plugin-wit>=1.6.0 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (1.7.0)
Requirement already satisfied: werkzeug>=0.11.15 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (1.0.1)
Requirement already satisfied: google-auth<2,>=1.6.3 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (1.20.1)
Requirement already satisfied: requests<3,>=2.21.0 in /home/kbuilder/.local/lib/python3.6/site-packages (from tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (2.24.0)
Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (0.4.1)
Requirement already satisfied: markdown>=2.6.8 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (3.2.2)
Requirement already satisfied: pyasn1-modules>=0.2.1 in /usr/lib/python3/dist-packages (from google-auth<2,>=1.6.3->tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (0.2.1)
Requirement already satisfied: rsa<5,>=3.1.4; python_version >= "3.5" in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from google-auth<2,>=1.6.3->tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (4.6)
Requirement already satisfied: cachetools<5.0,>=2.0.0 in /home/kbuilder/.local/lib/python3.6/site-packages (from google-auth<2,>=1.6.3->tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (4.1.1)
Requirement already satisfied: certifi>=2017.4.17 in /home/kbuilder/.local/lib/python3.6/site-packages (from requests<3,>=2.21.0->tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (2020.6.20)
Requirement already satisfied: chardet<4,>=3.0.2 in /usr/lib/python3/dist-packages (from requests<3,>=2.21.0->tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (3.0.4)
Requirement already satisfied: idna<3,>=2.5 in /usr/lib/python3/dist-packages (from requests<3,>=2.21.0->tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (2.6)
Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/lib/python3/dist-packages (from requests<3,>=2.21.0->tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (1.22)
Requirement already satisfied: requests-oauthlib>=0.7.0 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (1.3.0)
Requirement already satisfied: importlib-metadata; python_version < "3.8" in /home/kbuilder/.local/lib/python3.6/site-packages (from markdown>=2.6.8->tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (1.7.0)
Requirement already satisfied: pyasn1>=0.1.3 in /usr/lib/python3/dist-packages (from rsa<5,>=3.1.4; python_version >= "3.5"->google-auth<2,>=1.6.3->tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (0.4.2)
Requirement already satisfied: oauthlib>=3.0.0 in /tmpfs/src/tf_docs_env/lib/python3.6/site-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (3.1.0)
Requirement already satisfied: zipp>=0.5 in /home/kbuilder/.local/lib/python3.6/site-packages (from importlib-metadata; python_version < "3.8"->markdown>=2.6.8->tensorboard<2.3.0,>=2.2.0->tensorflow==2.2.0) (3.1.0)
Installing collected packages: tensorflow-estimator, tensorboard, tensorflow
  Attempting uninstall: tensorflow-estimator
    Found existing installation: tensorflow-estimator 2.3.0
    Uninstalling tensorflow-estimator-2.3.0:
      Successfully uninstalled tensorflow-estimator-2.3.0
  Attempting uninstall: tensorboard
    Found existing installation: tensorboard 2.3.0
    Uninstalling tensorboard-2.3.0:
      Successfully uninstalled tensorboard-2.3.0
  Attempting uninstall: tensorflow
    Found existing installation: tensorflow 2.3.0
    Uninstalling tensorflow-2.3.0:
      Successfully uninstalled tensorflow-2.3.0
Successfully installed tensorboard-2.2.2 tensorflow-2.2.0 tensorflow-estimator-2.2.0

Python sürümünü kontrol edin

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'

TFDV'yi yükleyin

Bu, bir dakika sürecek olan tüm bağımlılıkları çekecektir. Lütfen uyumsuz bağımlılık sürümleriyle ilgili uyarıları veya hataları dikkate almayın.

import tensorflow as tf

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

Çalışma zamanını yeniden başlattınız mı?

Google Colab kullanıyorsanız, yukarıdaki hücreyi ilk kez çalıştırdığınızda, çalışma zamanını yeniden başlatmanız gerekir (Çalışma Zamanı> Çalışma zamanını yeniden başlat ...). Bunun nedeni, Colab'ın paketleri yükleme biçimidir.

Dosyaları Yükleyin

Veri kümemizi Google Cloud Storage'dan indireceğiz.

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

/tmp/tmpgsqn6btn/data/eval:
data.csv

/tmp/tmpgsqn6btn/data/serving:
data.csv

/tmp/tmpgsqn6btn/data/train:
data.csv

Versiyonu kontrol et

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

İstatistikleri hesaplayın ve görselleştirin

İlk olarak, eğitim verilerimizin istatistiklerini hesaplamak için tfdv.generate_statistics_from_csv kullanacağız. (hızlı uyarıları dikkate almayın)

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.

Dahili olarak TFDV, büyük veri kümeleri üzerinde istatistik hesaplamasını ölçeklendirmek için Apache Beam'in veri paralel işleme çerçevesini kullanır. TFDV ile daha derin entegre etmek isteyen uygulamalar için (örneğin, bir veri oluşturma ardışık düzeninin sonunda istatistik üretimini eklemek), API ayrıca istatistik üretimi için bir Işın PT dönüşümü sunar.

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

Şimdi kullanalım tfdv.visualize_statistics kullanır Façetaları bizim eğitim verilerinin özlü görselleştirme oluşturmak için:

  • Sayısal unsurların ve katagorik unsurların ayrı ayrı görselleştirildiğine ve her unsur için dağılımları gösteren grafiklerin görüntülendiğine dikkat edin.
  • Eksik veya sıfır değerlere sahip özelliklerin, bu özelliklerde örneklerle ilgili sorunlar olabileceğinin görsel bir göstergesi olarak kırmızı renkte bir yüzde görüntülediğine dikkat edin. Yüzde, o özellik için eksik veya sıfır değerleri olan örneklerin yüzdesidir.
  • pickup_census_tract için değerlere sahip hiçbir örnek olmadığına dikkat edin. Bu boyutsallığı azaltma fırsatıdır!
  • Görünümü değiştirmek için grafiklerin üzerindeki "genişlet" i tıklamayı deneyin
  • Bölüm aralıklarını ve sayılarını görüntülemek için grafiklerdeki çubukların üzerine gelmeyi deneyin
  • Günlük ve doğrusal ölçekler arasında geçiş payment_type ve günlük ölçeğinin payment_type kategorik özelliği hakkında çok daha fazla ayrıntıyı nasıl ortaya çıkardığına dikkat edin.
  • "Gösterilecek grafik" menüsünden "nicelikler" i seçmeyi deneyin ve miktar yüzdelerini göstermek için imleçlerin üzerine gelin
tfdv.visualize_statistics(train_stats)

Bir şema çıkarmak

Şimdi verilerimiz için bir şema oluşturmak için tfdv.infer_schema . Bir şema, ML ile ilgili veriler için kısıtlamaları tanımlar. Örnek kısıtlamalar, ister sayısal ister kategorik olsun, her özelliğin veri türünü veya verilerdeki varlığının sıklığını içerir. Kategorik özellikler için şema aynı zamanda etki alanını - kabul edilebilir değerler listesi - tanımlar. Bir şema yazmak, özellikle çok sayıda özelliğe sahip veri kümeleri için sıkıcı bir görev olabileceğinden, TFDV, açıklayıcı istatistiklere dayalı olarak şemanın ilk sürümünü oluşturmak için bir yöntem sağlar.

Şemayı doğru yapmak önemlidir, çünkü üretim hattımızın geri kalanı TFDV'nin doğru olması için oluşturduğu şemaya güvenecektir. Şema ayrıca veriler için dokümantasyon sağlar ve bu nedenle farklı geliştiriciler aynı veriler üzerinde çalıştığında kullanışlıdır. tfdv.display_schema , çıkarılan şemayı görüntülemek için tfdv.display_schema , böylece onu inceleyebiliriz.

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

Hata için değerlendirme verilerini kontrol edin

Şimdiye kadar sadece eğitim verilerine bakıyorduk. Değerlendirme verilerimizin, aynı şemayı kullanması da dahil olmak üzere eğitim verilerimizle tutarlı olması önemlidir. Değerlendirme verilerinin, sayısal özelliklerimiz için eğitim verilerimizle kabaca aynı değer aralıklarına ait örnekleri içermesi de önemlidir, böylece değerlendirme sırasında kayıp yüzeyini kapsamımız, eğitim sırasında olduğu gibi kabaca aynıdır. Aynısı kategorik özellikler için de geçerlidir. Aksi takdirde, kayıp yüzeyimizin bir kısmını değerlendirmediğimiz için değerlendirme sırasında belirlenemeyen eğitim sorunlarımız olabilir.

  • Her özelliğin artık hem eğitim hem de değerlendirme veri kümeleri için istatistikler içerdiğine dikkat edin.
  • Grafiklerin artık hem eğitim hem de değerlendirme veri kümelerinin üst üste yerleştirildiğine dikkat edin, bu da onları karşılaştırmayı kolaylaştırır.
  • Grafiklerin artık günlük veya varsayılan doğrusal ölçeklerle birleştirilebilen bir yüzde görünümü içerdiğine dikkat edin.
  • trip_miles için ortalama ve medyanın eğitim için değerlendirme veri kümelerine göre farklı olduğuna dikkat edin. Bu sorunlara neden olur mu?
  • Vay canına, maksimum tips eğitim için değerlendirme veri kümelerine göre çok farklı. Bu sorunlara neden olur mu?
  • Sayısal Özellikler grafiğinde genişlet seçeneğine tıklayın ve günlük ölçeğini seçin. trip_seconds özelliğini inceleyin ve maks. Değerlendirme, kayıp yüzeyinin bazı kısımlarını gözden kaçıracak mı?
# 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')

Değerlendirme anormalliklerini kontrol edin

Değerlendirme veri kümemiz eğitim veri kümemizdeki şemayla eşleşiyor mu? Bu, özellikle kabul edilebilir değerlerin aralığını belirlemek istediğimiz kategorik özellikler için önemlidir.

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

Şemadaki değerlendirme anormalliklerini düzeltin

Oops! Değerlendirme verilerimizde company için eğitim verilerimizde bulunmayan bazı yeni değerlerimiz var gibi görünüyor. Ayrıca payment_type için yeni bir payment_type . Bunlar anormallikler olarak düşünülmelidir, ancak onlar hakkında ne yapmaya karar verdik, verilerle ilgili alan bilgimize bağlıdır. Bir anormallik gerçekten bir veri hatasını gösteriyorsa, temeldeki veriler düzeltilmelidir. Aksi takdirde, eval veri kümesine değerleri dahil etmek için şemayı güncelleyebiliriz.

Değerlendirme veri kümemizi değiştirmediğimiz sürece her şeyi düzeltemeyiz, ancak şemada rahatlıkla kabul ettiğimiz şeyleri düzeltebiliriz. Bu, belirli özellikler için neyin anormallik olup olmadığı konusundaki görüşümüzü gevşetmenin yanı sıra, şemamızı kategorik özellikler için eksik değerleri içerecek şekilde güncellemeyi içerir. TFDV, neyi düzeltmemiz gerektiğini keşfetmemizi sağladı.

Şimdi bu düzeltmeleri yapalım ve ardından bir kez daha gözden geçirelim.

# 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, şuna bak! Eğitim ve değerlendirme verilerinin artık tutarlı olduğunu doğruladık! Teşekkürler TFDV;)

Şema Ortamları

Ayrıca bu örnek için bir 'sunum' veri kümesini ayırdık, bu yüzden onu da kontrol etmeliyiz. Varsayılan olarak, bir ardışık düzen içindeki tüm veri kümeleri aynı şemayı kullanmalıdır, ancak genellikle istisnalar vardır. Örneğin, denetimli öğrenmede, veri kümemize etiketler eklememiz gerekir, ancak modeli çıkarım için sunduğumuzda etiketler dahil edilmeyecektir. Bazı durumlarda hafif şema varyasyonlarının tanıtılması gerekir.

Ortamlar , bu tür gereksinimleri ifade etmek için kullanılabilir. Özellikle, şemadaki özellikler, default_environment , in_environment ve not_in_environment kullanılarak bir dizi in_environment not_in_environment .

Örneğin, bu veri kümesinde tips özelliği eğitim etiketi olarak dahil edilmiştir, ancak sunum verilerinde eksiktir. Ortam belirtilmezse, bir anormallik olarak görünecektir.

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

Aşağıdaki tips özelliğiyle ilgileneceğiz. Ayrıca, şemamızın bir FLOAT beklediği yolculuk saniyelerimizde bir INT değerimiz var. TFDV, bu farkın farkına varmamızı sağlayarak, eğitim ve hizmet için verilerin üretilme biçimindeki tutarsızlıkları ortaya çıkarmaya yardımcı olur. Model performansı zarar görene kadar, bazen felaketle sonuçlanana kadar böyle sorunların farkında olmamak çok kolaydır. Önemli bir sorun olabilir veya olmayabilir, ancak her durumda bu daha fazla araştırma için bir neden olmalıdır.

Bu durumda, INT değerlerini FLOAT'lara güvenli bir şekilde dönüştürebiliriz, bu nedenle TFDV'ye türü çıkarmak için şemamızı kullanmasını söylemek istiyoruz. Bunu şimdi yapalım.

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

Şimdi sadece (bizim etiketimiz olan) bir anormallik olarak görünen ('Sütun düştü') tips özelliğine sahibiz. Elbette sunum verilerimizde etiketlerin olmasını beklemiyoruz, bu yüzden TFDV'ye bunu göz ardı etmesini söyleyelim.

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

Kayma ve çarpıklığı kontrol edin

TFDV, bir veri kümesinin şemada belirlenen beklentilere uygun olup olmadığını kontrol etmenin yanı sıra, sapma ve çarpıklığı tespit etmek için işlevler de sağlar. TFDV, şemada belirtilen sapma / çarpıklık karşılaştırıcılarına dayalı olarak farklı veri kümelerinin istatistiklerini karşılaştırarak bu kontrolü gerçekleştirir.

Drift

Sapma tespiti, kategorik özellikler için ve birbirini izleyen veri aralıkları arasında (yani, farklı eğitim verileri günleri arasında olduğu gibi, aralık N ve aralık N + 1 arasında) desteklenir. Sürüklenmeyi L-sonsuz mesafe cinsinden ifade ederiz ve eşik mesafesini ayarlayabilirsiniz, böylece sürüklenme kabul edilebilir olandan daha yüksek olduğunda uyarılar alırsınız. Doğru mesafeyi ayarlamak, genellikle alan bilgisi ve deneysellik gerektiren yinelemeli bir süreçtir.

Eğim

TFDV, verilerinizdeki üç farklı türde çarpıklığı algılayabilir - şema eğriliği, özellik eğriliği ve dağılım eğriliği.

Şema Eğriltme

Eğitim ve sunum verileri aynı şemaya uymadığında şema çarpıklığı oluşur. Hem eğitim hem de sunum verilerinin aynı şemaya uyması beklenir. İkisi arasında beklenen herhangi bir sapma (etiket özelliğinin yalnızca eğitim verilerinde mevcut olması, ancak hizmette olmaması gibi) şemadaki ortamlar alanı aracılığıyla belirtilmelidir.

Özellik Eğriliği

Özellik eğriliği, bir modelin eğitim verdiği özellik değerleri, sunum sırasında gördüğü özellik değerlerinden farklı olduğunda oluşur. Örneğin, bu şu durumlarda olabilir:

  • Eğitim ve sunum zamanı arasında bazı özellik değerleri sağlayan bir veri kaynağı değiştirilir
  • Eğitim ve sunum arasında özellikler oluşturmak için farklı mantık vardır. Örneğin, iki kod yolundan yalnızca birinde bazı dönüşümler uygularsanız.

Dağılım Eğrisi

Dağılım çarpıklığı, eğitim veri kümesinin dağıtımı, sunum veri kümesinin dağıtımından önemli ölçüde farklı olduğunda ortaya çıkar. Dağıtım çarpıklığının temel nedenlerinden biri, eğitim veri kümesini oluşturmak için farklı kod veya farklı veri kaynakları kullanmaktır. Diğer bir neden, üzerinde eğitim almak için sunum verilerinin temsili olmayan bir alt örneğini seçen hatalı bir örnekleme mekanizmasıdır.

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

Bu örnekte bir miktar sapma görüyoruz, ancak bu, belirlediğimiz eşiğin oldukça altında.

Şemayı dondur

Şema incelendiğine ve küratörlüğünü yaptığına göre, "donmuş" durumunu yansıtmak için onu bir dosyada saklayacağız.

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

TFDV ne zaman kullanılır?

Burada yaptığımız gibi, TFDV'yi sadece eğitim hattınızın başlangıcına uygun olarak düşünmek kolaydır, ancak aslında birçok kullanım alanı vardır. İşte birkaç tane daha:

  • Aniden kötü özellikler almaya başlamadığımızdan emin olmak için çıkarım için yeni verileri doğrulama
  • Modelimizin karar yüzeyinin bu kısmında eğitim aldığından emin olmak için çıkarım için yeni verileri doğrulama
  • Verilerimizi dönüştürdükten ve özellik mühendisliğini yaptıktan sonra (muhtemelen TensorFlow Transform kullanarak) yanlış bir şey yapmadığımızdan emin olmak için doğrulama