Минимальные рабочие примеры
Рассмотрим следующий 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
?