Горячее кодирование с использованием tf.data смешивает столбцы - PullRequest
1 голос
/ 04 февраля 2020

Минимальные рабочие примеры

Рассмотрим следующий CSV-файл (example.csv)

animal,size,weight,category
lion,large,200,mammal
ostrich,large,150,bird
sparrow,small,0.1,bird
whale,large,3000,mammal
bat,small,0.2,mammal
snake,small,1,reptile
condor,medium,12,bird

Цель состоит в том, чтобы преобразовать все категориальные значения в одноразовые кодировки. стандартный способ сделать это в Tensorflow 2.0 - использовать tf.data. Следуя этому примеру, код для работы с вышеуказанным набором данных:

import collections
import tensorflow as tf

# Load the dataset.
dataset = tf.data.experimental.make_csv_dataset(
    'example.csv',
    batch_size=5,
    num_epochs=1,
    shuffle=False)

# Specify the vocabulary for each category.
categories = collections.OrderedDict()
categories['animal'] = ['lion', 'ostrich', 'sparrow', 'whale', 'bat', 'snake', 'condor']
categories['size'] = ['large', 'medium', 'small']
categories['category'] = ['mammal', 'reptile', 'bird']

# Define the categorical feature columns.
categorical_columns = []
for feature, vocab in categories.items():
  cat_col = tf.feature_column.categorical_column_with_vocabulary_list(
        key=feature, vocabulary_list=vocab)
  categorical_columns.append(tf.feature_column.indicator_column(cat_col))

# Retrieve the first batch and apply the one-hot encoding to it.
iterator = iter(dataset)
first_batch = next(iterator)
categorical_layer = tf.keras.layers.DenseFeatures(categorical_columns)

print(categorical_layer(first_batch).numpy())

Вопрос

Запустив код выше, вы получите

[[1. 0. 0. 0. 0. 0. 0. 1. 0. 0. 1. 0. 0.]
 [0. 1. 0. 0. 0. 0. 0. 0. 0. 1. 1. 0. 0.]
 [0. 0. 1. 0. 0. 0. 0. 0. 0. 1. 0. 0. 1.]
 [0. 0. 0. 1. 0. 0. 0. 1. 0. 0. 1. 0. 0.]
 [0. 0. 0. 0. 1. 0. 0. 1. 0. 0. 0. 0. 1.]]

, где он выглядит как два последних столбца size и category были перевернуты, несмотря на тот факт, что categories - это упорядоченный словарь и ранее существовавший порядок столбцов в фактическом наборе данных. Это как если бы tf.feature_column.categorical_column_with_vocabulary_list() сделал некоторую необоснованную сортировку столбцов в алфавитном порядке.

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

1 Ответ

1 голос
/ 05 февраля 2020

Где сортировка?

Сортировка не происходит в tf.feature_column.categorical_column_with_vocabulary_list(). Если вы напечатаете categorical_columns, вы увидите, что столбцы все еще находятся в том порядке, в котором вы добавили их в feature_column:

[
  IndicatorColumn(categorical_column=VocabularyListCategoricalColumn(key='animal', vocabulary_list=('lion', 'ostrich', 'sparrow', 'whale', 'bat', 'snake', 'condor'), dtype=tf.string, default_value=-1, num_oov_buckets=0)),
  IndicatorColumn(categorical_column=VocabularyListCategoricalColumn(key='size', vocabulary_list=('large', 'medium', 'small'), dtype=tf.string, default_value=-1, num_oov_buckets=0)),
  IndicatorColumn(categorical_column=VocabularyListCategoricalColumn(key='category', vocabulary_list=('mammal', 'reptile', 'bird'), dtype=tf.string, default_value=-1, num_oov_buckets=0))
]

Сортировка происходит в tf.keras.layers.DenseFeatures object.

В коде вы можете видеть, где происходит сортировка здесь (Я нашел это, отследив наследование класса от tf.keras.layers.DenseFeatures класс для тензорного потока . python .feature_column.dense_features.DenseFeatures класс для тензорного потока . python .feature_column.feature_column_v2._BaseFeaturesLayer класс * 10fefe_normalize 1021 * функция).

Почему сортируется?

Так почему сортируется? В другом месте в том же файле, содержащем функцию _normalize_feature_columns (которая является функцией сортировки данных), есть аналогичная функция сортировки с этим комментарием:

# Sort the columns so the default collection name is deterministic even if the
# user passes columns from an unsorted collection, such as dict.values().

Я думаю это объяснение относится к тому, почему столбцы сортируются при использовании класса tf.keras.layers.DenseFeatures. Ваши столбцы и данные согласованы, но тензор потока не предполагает, что ввод будет согласованным, поэтому сортирует его, чтобы обеспечить согласованный порядок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...