Как создать добавить столбцы (т.е. функции) на tf.Dataset? - PullRequest
0 голосов
/ 10 апреля 2020

ВОПРОС

Очень часто требуется обогатить необработанный набор данных производными функциями. Т.е. новые столбцы нужно создавать из уже существующих. Как это сделать эффективным (и предпочтительно на месте ) способом с tf.Dataset?

PS: я попытался поиграться с tf.data.Dataset.map(), tf.data.Dataset.apply() и tf.map(), но не могу найти правильный синтаксис, который соответствует тому, что я иллюстрирую ниже.

МИНИМАЛЬНЫЙ РАБОЧИЙ ПРИМЕР

Чтобы показать, что я хочу сделать, я буду использовать pandas 'apply(). Например, я пытаюсь добавить функцию длиной embark_town в набор данных Titani c.

import pandas as pd
import tensorflow as tf # v. 2.0+

# Load the Titanic dataset
source = tf.keras.utils.get_file(
    "train.csv", 
    "https://storage.googleapis.com/tf-datasets/titanic/train.csv")

# Only select two features and one target for this example.
dataset = tf.data.experimental.make_csv_dataset(
    source, batch_size=5, label_name="survived", 
    select_columns=["embark_town", "age", "survived"],
    num_epochs=1, ignore_errors=True, shuffle=False)

# Add the derived feature `embark_town_len` via pandas.
batch, _ = next(iter(dataset))
batch = pd.DataFrame(batch)

print("Raw data:")
print(batch)

batch['embark_town_len'] = batch.apply(lambda x: len(x["embark_town"]), axis=1)

print("\nEnriched data:")
print(batch)

, которая создает

Raw data:
    age     embark_town
0  22.0  b'Southampton'
1  38.0    b'Cherbourg'
2  26.0  b'Southampton'
3  35.0  b'Southampton'
4  28.0   b'Queenstown'

Enriched data:
    age     embark_town  embark_town_len
0  22.0  b'Southampton'               11
1  38.0    b'Cherbourg'                9
2  26.0  b'Southampton'               11
3  35.0  b'Southampton'               11
4  28.0   b'Queenstown'               10

Примечание. что хотя я использую pandas 'apply() здесь, то, что я действительно ищу, это то, что работает непосредственно на весь tf.Dataset, а не просто пакет в нем.

1 Ответ

0 голосов
/ 11 апреля 2020

Предполагая tensorflow 2.0:

import tensorflow as tf
cities_ds = tf.data.Dataset.from_tensor_slices(["Rome","Brussels"])
ages_ds = tf.data.Dataset.from_tensor_slices([5,7])
ds = tf.data.Dataset.zip((cities_ds, ages_ds)) 
ds = ds.map(lambda city, age: (city, age, tf.strings.length(city)))
for i in ds:
  print(i[0].numpy(), i[1].numpy(), i[2].numpy())
...