Google только что выпустил свой новый продукт для сквозной платформы больших данных, TFDV! Одна из самых больших проблем в науке о данных - это решение проблемы качества данных, то есть проверка данных. Давайте посмотрим, как Google справится с этой первой версией и насколько полезна эта новая библиотека.

1. Установка

Довольно стандартный процесс установки через pip, однако убедитесь, что вы предварительно установили несколько зависимостей, чтобы убедиться, что он компилируется без проблем. В моем случае на Ubuntu 16.04 мне не хватало python-dev и python-snappy для повышения производительности. Также хорошо иметь Bazel, если вы начинаете использовать библиотеки TFX.

sudo apt-get install python-dev python-snappy
pip install tensorflow-data-validation

Этот TFDV является довольно новой библиотекой, документация довольно…. existant, поэтому я настоятельно рекомендую вам клонировать репозиторий и посмотреть, какие параметры принимает каждая используемая вами функция.

2. Загрузка данных и создание статистики:

Здесь нет ракетостроения, мы сначала импортируем библиотеку, и первый шаг в анализе / проверке вашего набора данных - это сгенерированная_статистика в вашем наборе данных. Я загружу здесь csv и укажу разделитель, но вместо этого вы также можете загрузить TFRecords. Для удобства здесь оба заголовка определения функции:

import tensorflow_data_validation as tfdv
def generate_statistics_from_csv(
data_location,
column_names = None,
delimiter = ‘,’,
output_path = None,
stats_options = stats_api.StatsOptions(),
pipeline_options = None,):
...
def generate_statistics_from_tfrecord(
data_location,
output_path = None,
stats_options = stats_api.StatsOptions(),
pipeline_options = None,):

Загрузим и сгенерируем нашу статистику:

BASE_DIR = os.getcwd()
DATA_DIR = os.path.join(BASE_DIR, 'data')
TRAIN_DATA = os.path.join(DATA_DIR, 'train.csv')
train_stats = tfdv.generate_statistics_from_csv(TRAIN_DATA, delimiter=';')

Первое, что следует заметить, это то, что эта операция требует значительного объема памяти. Мой набор данных представлял собой csv-файл размером всего 86 МБ, но использование ОЗУ увеличилось почти на 1 ГБ, поэтому убедитесь, что у вас достаточно ОЗУ!

3. Визуализация статистики:

После создания статистики у вас есть 2 варианта визуализации. Либо вы используете Обзор фасетов, который может быть сложно установить в зависимости от вашей платформы, либо вы можете использовать встроенную функцию визуализации TFDV, которая предоставляет точно такую ​​же информацию, что и фасеты:

tfdv.visualize_statistics(stats)

Очень полезно сразу определить, есть ли у вас большой объем недостающих данных, высокое стандартное отклонение и т. Д. однако мне очень нравятся Facets для модуля Dive, который позволяет вам очень наглядно изучить, как выглядит ваш набор данных.

Пока ничего революционного…. но вот главное ...

4. опишите свой набор данных для будущей проверки

Главная особенность TFDV - понятие «схема». Это в основном описание того, как выглядят ваши данные, поэтому вы сопоставляете это описание с новыми поступающими данными и проверяете их… или нет.

Он описывает стандартные характеристики ваших данных, такие как типы данных столбца, наличие / отсутствие данных, ожидаемый диапазон значений.

Вы создаете свою схему на основе набора данных, который считаете эталонным набором данных, и можете повторно использовать его для проверки других наборов той же структуры.

Еще одна интересная особенность заключается в том, что вы можете повторно использовать эту схему в TFTransform для автоматического объявления структуры вашего набора данных.

Здесь все становится проще ... для этого достаточно всего одной строчки кода:

schema = tfdv.infer_schema(train_stats)

Однако команда Tensorflow предлагает предупреждение:

Как правило, TFDV использует консервативную эвристику для вывода стабильных свойств данных из статистики, чтобы избежать переобучения схемы конкретному набору данных. Настоятельно рекомендуется просмотреть предполагаемую схему и при необходимости уточнить ее, чтобы зафиксировать любые знания предметной области о данных, которые эвристика TFDV могла пропустить.

Для хранения вашей схемы TFDV использует библиотеку protobuf, которая становится унифицированным методом для управления вашими статическими данными (структура данных, схема преобразования, замороженные модели…).

Если есть один момент, с которым мы все можем согласиться, так это то, что ни один набор данных не идеален. Знание предметной области важно, когда дело доходит до проверки ваших данных, поэтому автоматический инструмент - это своего рода единорог! Чтобы принять это во внимание, TFDV поставляется с вспомогательными функциями, поэтому вы вручную жестко кодируете правила, которые не должны выводиться из вашего набора данных.
Каждая функция поставляется с набором свойств, к которым вы можете получить доступ и изменить. Например, давайте опишем, что мы хотим, чтобы функция f1 была заполнена по крайней мере в 50% примеров, это достигается этой строкой:

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

Каждая функция состоит из следующих компонентов:
Название функции, Тип, Присутствие, Валентность, Домен.

И каждый компонент затем получает собственное подмножество подкомпонентов. Я не буду перечислять их здесь, но лучший совет, который я могу вам дать, - это проанализировать protobuf схемы, и вы найдете что-то вроде этого:

num_examples:1000000000000000
weighted_num_examples: 1000000000000000
features {
  name: “one_in_a_quadrillion”
  type:INT
  num_stats: {
    common_stats: {
      num_missing: 1
      num_non_missing: 1000000000000000
      min_num_values: 1
      max_num_values: 1
      weighted_common_stats {
        num_non_missing: 1000000000000000
        num_missing: 1
      }
    }
  min: 0.0
  max: 10.0
}

Вы также можете просто отобразить его в своем блокноте следующим образом:

tfdv.display_schema(schema)

5. Подтвердите новые данные.

Ваш «идеальный» обучающий набор теперь описан, но вы продолжаете получать свежие данные каждый день в ETL и ищете способ проверить новый набор, вот ядро ​​TFDV. Используя ранее описанную схему / домен…. он проанализирует ваш новый набор и сообщит о выбросах, отсутствующих или неверных данных.

Я думаю, что изображение, включенное в руководство, является прекрасной иллюстрацией того, как должна выглядеть хорошая цепочка проверки данных конвейера:

Когда вы пытаетесь создать конвейер приема данных для своих моделей, это в основном то, чего вы пытаетесь достичь.

Давайте возьмем новый CSV-файл, загрузим его, сгенерируем статистику и проанализируем для проверки, используя ранее сгенерированную схему:

NEW_DATA = os.path.join(DATA_DIR, 'test.csv')
new_csv_stats = tfdv.generate_statistics_from_csv(NEW_DATA, delimiter=';')
    
anomalies = tfdv.validate_statistics(statistics=new_csv_stats, schema=schema)

Затем вы можете отобразить эти аномалии следующим образом:

tfdv.display_anomalies(anomalies)

И вы получите список, содержащий одно или несколько из следующих сообщений об ошибках, описывающих, какие условия не заполняются новым набором данных, зная ожидаемые условия из схемы:

Integer larger than 1
BYTES type when expected INT type 
BYTES type when expected STRING type 
FLOAT type when expected INT type 
FLOAT type when expected STRING type 
INT type when expected STRING type 
Integer smaller than 1 
STRING type when expected INT type 
Expected a string, but not the string seen 
BYTES type when expected STRING type 
FLOAT type when expected STRING type 
INT type when expected STRING type 
Invalid UTF8 string observed 
Unexpected string values 
The number of values in a given example is too large 
The fraction of examples containing a feature is too small 
The number of examples containing a feature is too small 
The number of values in a given example is too small 
No examples contain the value 
The feature is present as an empty list 
The feature is repeated in an example, but was expected to be a singleton 
There is a float value that is too high
The type is not FLOAT 
There is a float value that is too low 
The feature is supposed to be floats encoded as strings, but there is a string that is not a float 
The feature is supposed to be floats encoded as strings, but it was some other type (INT, BYTES, FLOAT) 
The type is completely unknown 
There is an unexpectedly large integer 
The type was supposed to be INT, but it was not. 
The feature is supposed to be ints encoded as strings, but some string was not an int. 
The type was supposed to be STRING, but it was not. 
There is an unexpectedly small integer
The feature is supposed to be ints encoded as strings, but it was some other type (INT, BYTES, FLOAT) 
Unknown type in stats proto 
There are no stats for a column at all 
There is a new column that is not in the schema. 
Training serving skew issue 
Expected STRING type, but it was FLOAT. 
Expected STRING type, but it was INT. 
Control data is missing (either training data or previous day). 
Treatment data is missing (either scoring data or current day). 
L infinity between treatment and control is high. 
No examples in the span.

Я должен сказать, что был немного разочарован результатом здесь…. Я знаю, что мы говорим только о проверке данных, но указывать на ошибку и не возвращать подмножество, содержащее эти ошибки, немного похоже на незаконченную работу.
Я также знаю, что эта функция довольно дорогая, если вы возьмете годовая лицензия от таких пакетов, как Talend или Alooma, по цене от 10k до 80k usd, вы получите хороший поток для устранения ваших дефектов, но я верю, что TF рано или поздно пойдет по этому пути!

У вас все еще есть еще несколько деталей в столбце «Длинное описание аномалии», так что вы должны быть в порядке с интерпретируемостью того, что у вас есть.

Также приятно то, что если вы считаете, что отклонения от схемы следует ожидать, вы можете легко изменить исходную схему:

tfdv.get_domain(schema, 'f2').value.append('new_unique_value')

6. Адаптация к различным конфигурациям наборов данных:

Возможно, вы захотите проверить свой набор, используя определение схемы, но в зависимости от контекста (в учебном примере мы используем обучение и прогнозирование, то есть метки / без меток) вам может потребоваться игнорировать некоторые условия. Это возможно следующим образом:

# All features are by default in both TRAINING and SERVING environments.
schema.default_environment.append('TRAINING')
schema.default_environment.append('SERVING')

# Specify that labels column is not in SERVING environment.
tfdv.get_feature(schema, 'labels').not_in_environment.append('SERVING')

serving_anomalies_with_env = tfdv.validate_statistics(
        serving_stats, schema, environment='SERVING') 

7. Сравнение различных наборов в средстве визуализации.

Одно изображение говорит само за себя:

Вы получаете преимущества всего вышеперечисленного в одной сравнительной визуализации. Однако вы ограничены двумя наборами:

tfdv.visualize_statistics(lhs_statistics=train_stats, rhs_statistics=test_stats, lhs_name=’TRAIN’, rhs_name=’TEST’)

8. Повторное использование вашей схемы в TF Transform

Как объяснялось ранее, создаваемая вами схема не позволит вам вручную описывать типы ваших функций. Его можно загрузить в TFTransform следующим образом:

feature_spec = schema_utils.schema_as_feature_spec(schema).feature_spec
schema = dataset_schema.from_feature_spec(feature_spec)

9. Заключительное примечание.

Я пропущу компараторы перекоса и смещения, поскольку они являются расширением ранее объясненной логики, и вы можете глубже изучить git, чтобы узнать, как вы хотите использовать эти функции в TFDV. Оба очень полезны!

В заключение, TFDV - это именно то, что он означает, инструмент проверки данных, ни больше ни меньше, который идеально интегрируется с экосистемой Tensorflow, обеспечивая большую автоматизацию для TFTransform и завершая сквозную структуру, которую пытается предоставить Google. для практиков машинного обучения. По-прежнему кажется, что обработка дефектов отсутствует, но, учитывая различные библиотеки, которые были предложены нам, чтобы облегчить наши болевые точки, я считаю, что это скоро! Следующим запланированным выпуском Google является модуль приема данных, затем управление заданиями, оркестровка, мониторинг… как показано в верхней части рисунка ниже.

Вы можете найти полное официальное руководство по TFDV здесь:



Начните с проверки данных Tensorflow | TFX | TensorFlow
Короче говоря, схема описывает ожидания в отношении «правильных
данных и, таким образом, может использоваться для обнаружения ошибок в данных… www.tensorflow.org »