Licensed under the Apache License, Version 2.0 (the "License");


In [ ]:
#@title Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

Загрузка pandas.DataFrame

Note: Вся информация в этом разделе переведена с помощью русскоговорящего Tensorflow сообщества на общественных началах. Поскольку этот перевод не является официальным, мы не гарантируем что он на 100% аккуратен и соответствует официальной документации на английском языке. Если у вас есть предложение как исправить этот перевод, мы будем очень рады увидеть pull request в tensorflow/docs репозиторий GitHub. Если вы хотите помочь сделать документацию по Tensorflow лучше (сделать сам перевод или проверить перевод подготовленный кем-то другим), напишите нам на docs-ru@tensorflow.org list.

Из этого руководства вы узнаете, как загрузить датафрейм Pandas в tf.data.Dataset.

Это руководство использует небольшой датасет предоставленный Фондом сердечных заболеваний кливлендской клиники. В ней несколько сотен строк в формате CSV. Каждая строка описывает пациента, а каждый столбец описывает свойство. Мы используем эту информацию чтобы предсказать имеет ли пациент сердечное заболевание, что в этом датасете является задачей двоичной классификации.

Прочитайте данные используя pandas


In [ ]:
import pandas as pd
import tensorflow as tf

Скачайте файл csv содержащий датасет с пациентами.


In [ ]:
csv_file = tf.keras.utils.get_file('heart.csv', 'https://storage.googleapis.com/applied-dl/heart.csv')

Прочитайте csv файл используя pandas.


In [ ]:
df = pd.read_csv(csv_file)

In [ ]:
df.head()

In [ ]:
df.dtypes

Конвертируйте столбец thal являющийся object в датафрейме в дискретные числовые значения.


In [ ]:
df['thal'] = pd.Categorical(df['thal'])
df['thal'] = df.thal.cat.codes

In [ ]:
df.head()

Загрузите данные используя tf.data.Dataset

Используйте tf.data.Dataset.from_tensor_slices чтобы прочитать значения из датафрейма pandas.

Одним из преимуществ использования tf.data.Dataset является то, что он позволяет вам писать простые высокоэффективные конвейеры данных. Прочитайте руководство по загрузке данных для подробностей.


In [ ]:
target = df.pop('target')

In [ ]:
dataset = tf.data.Dataset.from_tensor_slices((df.values, target.values))

In [ ]:
for feat, targ in dataset.take(5):
  print ('Признаки: {}, Цель: {}'.format(feat, targ))

Поскольку pd.Series реализует протокол __array__ он может быть использован практически везде где вы бы использовали np.array или tf.Tensor.


In [ ]:
tf.constant(df['thal'])

Перемешайте датасет и разбейте его на пакеты.


In [ ]:
train_dataset = dataset.shuffle(len(df)).batch(1)

Создайте и обучите модель


In [ ]:
def get_compiled_model():
  model = tf.keras.Sequential([
    tf.keras.layers.Dense(10, activation='relu'),
    tf.keras.layers.Dense(10, activation='relu'),
    tf.keras.layers.Dense(1, activation='sigmoid')
  ])

  model.compile(optimizer='adam',
                loss='binary_crossentropy',
                metrics=['accuracy'])
  return model

In [ ]:
model = get_compiled_model()
model.fit(train_dataset, epochs=15)

Альтернатива столбцам признаков

Передать словарь в качестве входных данных для модели так же просто, как и создать словарь соответствия слоев tf.keras.layers.Input, применяя любой препроцессинг и складывая их, используя функциональный api. Вы можете использовать это в качестве альтернативы столбцов признаков.


In [ ]:
inputs = {key: tf.keras.layers.Input(shape=(), name=key) for key in df.keys()}
x = tf.stack(list(inputs.values()), axis=-1)

x = tf.keras.layers.Dense(10, activation='relu')(x)
output = tf.keras.layers.Dense(1, activation='sigmoid')(x)

model_func = tf.keras.Model(inputs=inputs, outputs=output)

model_func.compile(optimizer='adam',
                   loss='binary_crossentropy',
                   metrics=['accuracy'])

Простейший способ сохранения структуры столбцов в pd.DataFrame при использовании с tf.data это конвертация pd.DataFrame в dict и сделав срезы этого словаря.


In [ ]:
dict_slices = tf.data.Dataset.from_tensor_slices((df.to_dict('list'), target.values)).batch(16)

In [ ]:
for dict_slice in dict_slices.take(1):
  print (dict_slice)

In [ ]:
model_func.fit(dict_slices, epochs=15)