Xác thực dữ liệu TensorFlow (TFDV) có thể phân tích dữ liệu đào tạo và cung cấp để:
tính toán thống kê mô tả,
suy ra một lược đồ ,
phát hiện dữ liệu bất thường .
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 các 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 phân phối giá trị của chúng. Các công cụ như Tổng quan về các khía cạnh có thể cung cấp hình ảnh trực quan ngắn gọn về các số liệu thống kê này để duyệt dễ dàng.
Ví dụ: giả sử rằng path
đó trỏ đến một tệp ở định dạng TFRecord
(chứa các bản ghi thuộc loại tensorflow.Example
). Đoạn mã sau minh họa việc tính toán số liệu thống kê bằng TFDV:
stats = tfdv.generate_statistics_from_tfrecord(data_location=path)
Giá trị được trả về là bộ đệm giao thức DatasetFeatureStatisticsList . Sổ ghi chép ví dụ chứa hình ảnh trực quan về số liệu thống kê bằng cách sử dụng Tổng quan về các khía cạnh :
tfdv.visualize_statistics(stats)
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 một bộ thống kê dữ liệu mặc định, TFDV cũng có thể tính toán thống kê cho các miền ngữ nghĩa (ví dụ: hình ảnh, văn bản). Để cho phép tính toán thống kê miền ngữ nghĩa, hãy chuyển một đố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
Trong nội bộ, 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 bộ 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 ống 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 ví dụ về cách 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_...
nào (ví dụ: tfdv.generate_statistics_from_tfrecord
) trên Google Cloud, bạn phải cung cấp output_path
. Chỉ định Không có thể gây ra lỗi.
Suy ra một lược đồ trên dữ liệu
Lược đồ mô tả các thuộc tính dự kiến của dữ liệu. Một số thuộc tính này là:
- những tính năng dự kiến sẽ có mặt
- loại của họ
- số lượng giá trị cho một tính năng 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ụ
- các lĩnh vực dự kiến của các tính năng.
Nói tóm lại, lược đồ mô tả các kỳ vọng đối với dữ liệu "chính xác" và do đó có thể được sử dụng để phát hiện lỗi trong dữ liệu (được mô tả bên dưới). Ngoài ra, có thể sử dụng cùng một lược đồ để thiết lập Biến đổi TensorFlow cho các chuyển đổi dữ liệu. Lưu ý rằng lược đồ dự kiến sẽ 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 là đố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 số liệu 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 thận trọng để suy ra các thuộc tính dữ liệu ổn định từ số liệu thống kê nhằm tránh khớp quá mức lược đồ với 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 luận và tinh chỉnh lược đồ đó nếu cần , để nắm bắt bất kỳ kiến thức miền nào về dữ liệu mà phương pháp phỏng đoán của TFDV có thể đã bỏ sót.
Theo mặc định, tfdv.infer_schema
phỏng đoán hình dạng của từng đối tượng địa lý được yêu cầu, nếu value_count.min
bằng value_count.max
đối với đối tượng địa lý. Đặt đối số infer_feature_shape
thành Sai để 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 Schema 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 vài phương pháp tiện ích để thực hiện những cập nhật này dễ dàng hơn. Chẳng hạn, giả sử rằng lược đồ chứa khổ thơ sau để mô tả một tính năng chuỗi bắt buộc 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 phổ biến trong í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 một hình ảnh trực quan đơn giản của 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ó như được mã hóa trong lược đồ.
Kiểm tra lỗi dữ liệu
Đưa ra một lược đồ, có thể 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 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 hợp 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 lược đồ
Để kiểm tra lỗi trong tổng hợp, TFDV so khớp số liệu thống kê của tập dữ liệu với giản đồ 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 Bất thường 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ử dữ liệu tại other_path
chứa các ví dụ có giá trị cho đối tượng payment_type
bên ngoài miền được chỉ định trong lược đồ.
Điều này tạo ra một 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ị nằm ngoài miền được tìm thấy trong số liệu thống kê ở < 1% giá trị đố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 sẽ được khắc phục trước khi sử dụng dữ liệu đó để đào tạo.
Các loại 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ổ ghi chép ví dụ chứa một hình ảnh trực quan đơn giản về các điểm bất thường dưới dạng bảng, liệt kê các tính năng nơi phát hiện lỗi và mô tả ngắn về từng lỗi.
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 số liệu thống kê trên toàn 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
mà validate_examples_in_tfrecord
trả về là một bộ đệm giao thức DatasetFeatureStatisticsList trong đó mỗi tập dữ liệu bao gồm một tập hợp các ví dụ thể hiện một điểm bất thường cụ thể. 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 thể hiện sự bất thường đã cho và đặc điểm của những ví dụ đó.
Môi trường giản đồ
Theo mặc định, quá trình xác thực giả định rằng tất cả các bộ dữ liệu trong một quy trình bán hàng đều 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ể lược đồ 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 là bắt buộc trong quá trình đào tạo (và phải được xác thực), nhưng lại bị thiếu trong quá trình cung cấp.
Môi trường có thể được sử dụng để thể hiện các yêu cầu như vậy. Cụ thể, 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 bằng cách sử dụng default_environment, in_environment và not_in_environment.
Ví dụ: nếu tính năng mẹo đang được sử dụng làm nhãn trong quá trình đào tạo nhưng bị thiếu trong dữ liệu phân phối. Nếu không chỉ định môi trường, nó sẽ hiển thị dưới dạng bất thường.
serving_stats = tfdv.generate_statistics_from_tfrecord(data_location=serving_data_path)
serving_anomalies = tfdv.validate_statistics(serving_stats, schema)
Để 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 dữ liệu nghiêng và trôi
Ngoài việc kiểm tra xem tập dữ liệu có phù hợp với kỳ vọng được đặt trong lược đồ hay không, TFDV còn cung cấp các chức năng để phát hiện:
- lệch giữa đào tạo và phục vụ dữ liệu
- 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 số liệu thống kê của các bộ dữ liệu khác nhau dựa trên bộ so sánh độ lệch/độ lệch được chỉ định trong lược đồ. Ví dụ: để kiểm tra xem có bất kỳ sai lệch nào giữa tính năng 'payment_type' trong tập dữ liệu đào tạo và phân phát 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 Ý Định mức vô cực L sẽ chỉ phát hiện độ lệch cho các tính năng phân loại. Thay vì chỉ định ngưỡng infinity_norm
, việc chỉ định ngưỡng jensen_shannon_divergence
trong skew_comparator
sẽ phát hiện độ lệch cho cả đối tượng số và đối tượng phân loại.
Tương tự với việc kiểm tra xem tập dữ liệu có tuân thủ các kỳ vọng được đặt trong lược đồ hay không, kết quả cũng là một phiên bản của bộ đệm giao thức Bất thường và mô tả mọi sai lệch giữa tập dữ liệu đào tạo và tập dữ liệu cung cấp. Ví dụ: giả sử dữ liệu cung cấp chứa nhiều ví dụ hơn đáng kể với tính năng payement_type
có giá trị Cash
, điều này tạo ra sự bất thường về độ lệch
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ự sai lệch giữa dữ liệu đào tạo và dữ liệu phục vụ, thì cần phải điều tra thêm vì điều này có thể tác động trực tiếp đến hiệu suất của mô hình.
Sổ ghi chép ví dụ chứa một ví dụ đơn giản về kiểm tra các điểm bất thường dựa trên độ nghiêng.
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 Ý Định mức vô cực L sẽ chỉ phát hiện độ lệch cho các tính năng phân loại. Thay vì chỉ định ngưỡng infinity_norm
, việc chỉ định ngưỡng jensen_shannon_divergence
trong skew_comparator
sẽ phát hiện độ lệch cho cả đối tượng số và đối tượng phân loại.
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 ở nhiều đị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 số liệu thống kê dữ liệu là Beam PTransform lấy một PCCollection gồm nhiều lô mẫu đầu vào (một lô mẫu đầu vào được biểu diễn dưới dạng Arrow RecordBatch) và xuất một PCollection chứa một bộ đệm giao thức DatasetFeatureStatisticsList
duy nhất.
Khi bạn đã triển khai trình kết nối dữ liệu tùy chỉnh để nhóm các ví dụ đầu vào của bạn trong Arrow RecordBatch, bạn cần kết nối nó với tfdv.GenerateStatistics
API để tính toán thống kê dữ liệu. Lấy TFRecord
của tf.train.Example
ví dụ. tfx_bsl
cung cấp trình kết nối dữ liệu TFExampleRecord và bên dưới là ví dụ về cách kết nối nó với 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))
Tính toán số liệu thống kê trên các lát dữ liệu
TFDV có thể được cấu hình để tính toán số liệu thống kê trên các lát dữ liệu. Có thể kích hoạt tính năng cắt lát bằng cách cung cấp các hàm cắt lấy trong Arrow RecordBatch
và xuất ra một chuỗi các bộ có dạng (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 số liệu thống kê.
Khi tính năng cắt lát được bật, nguyên mẫu DatasetFeatureStatisticsList đầu ra chứa nhiều nguyên mẫu DatasetFeatureStatistics , một nguyên mẫu cho mỗi lát cắt. Mỗi lá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 DatasetFeatureStatistics proto . 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 lát được đị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])