Bắt đầu với Xác thực dữ liệu Tensorflow

Xác thực dữ liệu dòng chảy (TFDV) có thể phân tích đào tạo và cung cấp dữ liệu để:

API cốt lõi hỗ trợ từng phần chức năng, với các phương thức tiện lợi được xây dựng trên cùng và có thể được gọi trong ngữ cảnh của sổ ghi chép.

Tính toán thống kê dữ liệu mô tả

TFDV có thể tính toán số liệu thống kê mô tả cung cấp tổng quan nhanh về dữ liệu về các tính năng hiện có và hình dạng của các phân phối giá trị của chúng. Các công cụ như Tổng quan về khía cạnh có thể cung cấp hình ảnh trực quan ngắn gọn về các thống kê này để dễ dàng duyệt qua.

Ví dụ: giả sử path đó trỏ đến một tệp ở định dạng TFRecord (chứa các bản ghi kiểu tensorflow.Example . Ví dụ). Đoạn mã sau minh họa việc tính toán thống kê bằng TFDV:

    stats = tfdv.generate_statistics_from_tfrecord(data_location=path)

Giá trị trả về là bộ đệm giao thức DatasetFeatureSt StatisticsList . Sổ tay ví dụ chứa hình ảnh thống kê bằng cách sử dụng Tổng quan về khía cạnh :

    tfdv.visualize_statistics(stats)

Ảnh chụp màn hình hiển thị số liệu thống kê

Ví dụ trước đó giả định rằng dữ liệu được lưu trữ trong tệp TFRecord . TFDV cũng hỗ trợ định dạng đầu vào CSV, với khả năng mở rộng cho các định dạng phổ biến khác. Bạn có thể tìm thấy các bộ giải mã dữ liệu có sẵn tại đây . Ngoài ra, TFDV cung cấp chức năng tiện ích tfdv.generate_statistics_from_dataframe cho người dùng có dữ liệu trong bộ nhớ được biểu thị dưới dạng DataFrame của gấu trúc.

Ngoài việc tính toán bộ thống kê dữ liệu mặc định, TFDV cũng có thể tính toán số liệu thống kê cho các miền ngữ nghĩa (ví dụ: hình ảnh, văn bản). Để kích hoạt tính toán thống kê miền ngữ nghĩa, hãy chuyển đối tượng tfdv.StatsOptions với enable_semantic_domain_stats được đặt thành True thành tfdv.generate_statistics_from_tfrecord .

Chạy trên Google Cloud

Bên trong, TFDV sử dụng khung xử lý song song dữ liệu của Apache Beam để mở rộng quy mô tính toán thống kê trên các tập dữ liệu lớn. Đối với các ứng dụng muốn tích hợp sâu hơn với TFDV (ví dụ: đính kèm tạo thống kê ở cuối đường dẫn tạo dữ liệu, tạo thống kê cho dữ liệu ở định dạng tùy chỉnh ), API cũng hiển thị Beam PTransform để tạo thống kê.

Để chạy TFDV trên Google Cloud, tệp bánh xe TFDV phải được tải xuống và cung cấp cho nhân viên Dataflow. Tải xuống tệp bánh xe vào thư mục hiện tại như sau:

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

Đoạn mã sau đây cho thấy một ví dụ về việc sử dụng TFDV trên 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)

Trong trường hợp này, proto thống kê đã tạo được lưu trữ trong tệp TFRecord được ghi vào GCS_STATS_OUTPUT_PATH .

LƯU Ý Khi gọi bất kỳ hàm tfdv.generate_statistics_... (ví dụ: tfdv.generate_statistics_from_tfrecord ) trên Google Cloud, bạn phải cung cấp một output_path . Chỉ định Không có có thể gây ra lỗi.

Suy luận một lược đồ trên dữ liệu

Lược đồ mô tả các thuộc tính mong đợi của dữ liệu. Một số thuộc tính này là:

  • những tính năng nào được mong đợi sẽ có mặt
  • loại của họ
  • số lượng giá trị cho một đối tượng địa lý trong mỗi ví dụ
  • sự hiện diện của từng tính năng trên tất cả các ví dụ
  • miền dự kiến ​​của các tính năng.

Tóm lại, lược đồ mô tả các kỳ vọng đối với dữ liệu "đúng" và do đó có thể được sử dụng để phát hiện lỗi trong dữ liệu (mô tả bên dưới). Hơn nữa, cùng một lược đồ có thể được sử dụng để thiết lập Biến đổi dòng chảy cho các phép biến đổi dữ liệu. Lưu ý rằng lược đồ được mong đợi là khá tĩnh, ví dụ, một số tập dữ liệu có thể tuân theo cùng một lược đồ, trong khi số liệu thống kê (được mô tả ở trên) có thể khác nhau trên mỗi tập dữ liệu.

Vì việc viết một lược đồ có thể là một công việc tẻ nhạt, đặc biệt đối với các bộ dữ liệu có nhiều tính năng, TFDV cung cấp một phương pháp để tạo phiên bản ban đầu của lược đồ dựa trên thống kê mô tả:

    schema = tfdv.infer_schema(stats)

Nói chung, TFDV sử dụng phương pháp phỏng đoán bảo toàn để suy ra các thuộc tính dữ liệu ổn định từ thống kê nhằm tránh trang bị quá nhiều lược đồ vào tập dữ liệu cụ thể. Chúng tôi đặc biệt khuyên bạn nên xem lại lược đồ được suy ra và tinh chỉnh nó khi cần thiết , để nắm bắt bất kỳ kiến ​​thức miền nào về dữ liệu mà các nhà khám nghiệm của TFDV có thể đã bỏ lỡ.

Theo mặc định, tfdv.infer_schema suy ra hình dạng của từng đối tượng được yêu cầu, nếu value_count.min bằng value_count.max cho đối tượng này. Đặt đối số infer_feature_shape thành False để tắt suy luận hình dạng.

Bản thân lược đồ được lưu trữ dưới dạng bộ đệm giao thức Lược đồ và do đó có thể được cập nhật / chỉnh sửa bằng cách sử dụng API bộ đệm giao thức tiêu chuẩn. TFDV cũng cung cấp một số phương pháp tiện ích để làm cho các cập nhật này dễ dàng hơn. Ví dụ: giả sử rằng giản đồ chứa đoạn thơ sau để mô tả một loại tính năng chuỗi bắt buộc là payment_type nhận một giá trị duy nhất:

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

Để đánh dấu rằng đối tượng địa lý phải được điền vào ít nhất 50% các ví dụ:

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

Sổ ghi chép ví dụ chứa hình ảnh trực quan đơn giản về lược đồ dưới dạng bảng, liệt kê từng tính năng và các đặc điểm chính của nó khi được mã hóa trong lược đồ.

Ảnh chụp màn hình trực quan hóa giản đồ

Kiểm tra dữ liệu để tìm lỗi

Với một lược đồ, có thể kiểm tra xem một tập dữ liệu có tuân theo các kỳ vọng được đặt trong lược đồ hay không hoặc liệu có tồn tại bất kỳ sự bất thường nào về dữ liệu hay không. Bạn có thể kiểm tra dữ liệu của mình để tìm lỗi (a) trong tổng thể trên toàn bộ tập dữ liệu bằng cách đối sánh số liệu thống kê của tập dữ liệu với lược đồ hoặc (b) bằng cách kiểm tra lỗi trên cơ sở từng ví dụ.

Đối sánh số liệu thống kê của tập dữ liệu với một lược đồ

Để kiểm tra lỗi trong tổng hợp, TFDV đối sánh số liệu thống kê của tập dữ liệu với lược đồ và đánh dấu bất kỳ sự khác biệt nào. Ví dụ:

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

Kết quả là một phiên bản của bộ đệm giao thức Anomalies và mô tả bất kỳ lỗi nào mà số liệu thống kê không phù hợp với lược đồ. Ví dụ: giả sử rằng dữ liệu tại other_path chứa các ví dụ với các giá trị cho loại hình thanh payment_type tính năng bên ngoài miền được chỉ định trong lược đồ.

Điều này tạo ra sự bất thường

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

cho biết rằng giá trị ngoài miền đã được tìm thấy trong thống kê ở <1% giá trị của đối tượng địa lý.

Nếu điều này được mong đợi, thì lược đồ có thể được cập nhật như sau:

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

Nếu sự bất thường thực sự chỉ ra lỗi dữ liệu, thì dữ liệu cơ bản phải được sửa trước khi sử dụng nó để đào tạo.

Các dạng bất thường khác nhau có thể được phát hiện bởi mô-đun này được liệt kê ở đây .

Sổ tay ví dụ chứa hình ảnh đơn giản về các điểm bất thường dưới dạng bảng, liệt kê các đặc điểm nơi lỗi được phát hiện và mô tả ngắn gọn về từng lỗi.

Ảnh chụp màn hình về sự bất thường

Kiểm tra lỗi trên cơ sở từng ví dụ

TFDV cũng cung cấp tùy chọn xác thực dữ liệu trên cơ sở từng ví dụ, thay vì so sánh thống kê trên toàn bộ tập dữ liệu với lược đồ. TFDV cung cấp các chức năng để xác thực dữ liệu trên cơ sở từng ví dụ và sau đó tạo thống kê tóm tắt cho các ví dụ bất thường được tìm thấy. Ví dụ:

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

anomalous_example_stats validate_examples_in_tfrecord _ Bạn có thể sử dụng điều này để xác định số lượng ví dụ trong tập dữ liệu của mình có biểu hiện bất thường nhất định và đặc điểm của những ví dụ đó.

Môi trường giản đồ

Theo mặc định, xác thực giả định rằng tất cả các bộ dữ liệu trong một đường dẫn tuân theo một lược đồ duy nhất. Trong một số trường hợp, việc giới thiệu các biến thể giản đồ nhỏ là cần thiết, chẳng hạn như các tính năng được sử dụng làm nhãn được yêu cầu trong quá trình đào tạo (và cần được xác thực), nhưng bị thiếu trong quá trình cung cấp.

Các môi trường có thể được sử dụng để thể hiện các yêu cầu đó. Đặc biệt, các tính năng trong lược đồ có thể được liên kết với một tập hợp các môi trường sử dụng default_enosystem, in_enosystem và not_in_enosystem.

Ví dụ: nếu tính năng mẹo đang được sử dụng làm nhãn trong đào tạo, nhưng bị thiếu trong dữ liệu phục vụ. Nếu không có môi trường được chỉ định, nó sẽ hiển thị như một sự bất thường.

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

Ảnh chụp màn hình về sự bất thường trong phục vụ

Để khắc phục điều này, chúng tôi cần đặt môi trường mặc định cho tất cả các tính năng thành cả 'ĐÀO TẠO' và 'PHỤC VỤ', đồng thời loại trừ tính năng 'mẹo' khỏi môi trường PHỤC VỤ.

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

Kiểm tra độ lệch và độ lệch của dữ liệu

Ngoài việc kiểm tra xem tập dữ liệu có tuân theo các kỳ vọng được đặt trong lược đồ hay không, TFDV cũng cung cấp các chức năng để phát hiện:

  • lệch giữa dữ liệu đào tạo và phục vụ
  • trôi dạt giữa các ngày khác nhau của dữ liệu đào tạo

TFDV thực hiện kiểm tra này bằng cách so sánh thống kê của các bộ dữ liệu khác nhau dựa trên các bộ so sánh độ lệch / độ lệch được chỉ định trong lược đồ. Ví dụ: để kiểm tra xem có bất kỳ sự sai lệch nào giữa tính năng 'Payment_type' trong tập dữ liệu đào tạo và phục vụ hay không:

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

LƯU Ý Để phát hiện độ lệch cho các đối tượng số, hãy chỉ định một ngưỡng jensen_shannon_divergence thay vì một ngưỡng infinity_norm trong bộ skew_comparator .

Tương tự với việc kiểm tra xem tập dữ liệu có tuân theo các kỳ vọng được đặt trong lược đồ hay không, kết quả cũng là một ví dụ của bộ đệm giao thức Anomalies và mô tả bất kỳ sự sai lệch nào giữa tập dữ liệu đào tạo và phục vụ. Ví dụ: giả sử dữ liệu phục vụ chứa nhiều ví dụ hơn đáng kể với feature payement_type có value Cash , điều này tạo ra sự bất thường nghiêng

   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

Nếu sự bất thường thực sự chỉ ra sự lệch giữa dữ liệu đào tạo và cung cấp, thì cần phải điều tra thêm vì điều này có thể có tác động trực tiếp đến hiệu suất của mô hình.

Sổ tay ví dụ chứa một ví dụ đơn giản về việc kiểm tra các dị thường dựa trên xiên.

Việc phát hiện độ lệch giữa các ngày khác nhau của dữ liệu đào tạo có thể được thực hiện theo cách tương tự

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

LƯU Ý Để phát hiện độ lệch đối với các đối tượng số, hãy chỉ định ngưỡng jensen_shannon_divergence thay vì ngưỡng infinity_norm trong drift_comparator .

Viết trình kết nối dữ liệu tùy chỉnh

Để tính toán thống kê dữ liệu, TFDV cung cấp một số phương pháp thuận tiện để xử lý dữ liệu đầu vào ở các định dạng khác nhau (ví dụ: TFRecord của tf.train.Example , CSV, v.v.). Nếu định dạng dữ liệu của bạn không có trong danh sách này, bạn cần viết trình kết nối dữ liệu tùy chỉnh để đọc dữ liệu đầu vào và kết nối nó với API lõi TFDV để tính toán thống kê dữ liệu.

API lõi TFDV để tính toán thống kê dữ liệu là một Beam PTransform lấy một tập hợp các loạt ví dụ đầu vào (một loạt các ví dụ đầu vào được biểu diễn dưới dạng một Arrow RecordBatch) và xuất ra một PCollection chứa một bộ đệm giao thức DatasetFeatureStatisticsList duy nhất.

Sau khi bạn đã triển khai trình kết nối dữ liệu tùy chỉnh theo lô các ví dụ đầu vào của mình trong Arrow RecordBatch, bạn cần kết nối nó với API tfdv.GenerateStatistics để tính toán thống kê dữ liệu. Lấy ví dụ TFRecord của tf.train.Example . tfx_bsl cung cấp trình kết nối dữ liệu TFExampleRecord và dưới đây là một ví dụ về cách kết nối nó với 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))

Tính toán số liệu thống kê trên các phần dữ liệu

TFDV có thể được định cấu hình để tính toán thống kê trên các phần dữ liệu. Có thể kích hoạt tính năng cắt bằng cách cung cấp các chức năng cắt trong một RecordBatch mũi tên và xuất ra một chuỗi các bộ dạng biểu mẫu (slice key, record batch) . TFDV cung cấp một cách dễ dàng để tạo các hàm cắt dựa trên giá trị tính năng có thể được cung cấp như một phần của tfdv.StatsOptions khi tính toán thống kê.

Khi kích hoạt tính năng cắt, proto DatasetFeatureSt StatisticsList đầu ra chứa nhiều giao thức DatasetFeatureSt Statistics , một cho mỗi lát cắt. Mỗi lát cắt được xác định bằng một tên duy nhất được đặt làm tên tập dữ liệu trong chương trình DatasetFeatureSt Statistics . Theo mặc định, TFDV tính toán số liệu thống kê cho tập dữ liệu tổng thể ngoài các phần đã định cấu hình.

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