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.
Note: Вся информация в этом разделе переведена с помощью русскоговорящего Tensorflow сообщества на общественных началах. Поскольку этот перевод не является официальным, мы не гарантируем что он на 100% аккуратен и соответствует официальной документации на английском языке. Если у вас есть предложение как исправить этот перевод, мы будем очень рады увидеть pull request в tensorflow/docs репозиторий GitHub. Если вы хотите помочь сделать документацию по Tensorflow лучше (сделать сам перевод или проверить перевод подготовленный кем-то другим), напишите нам на docs-ru@tensorflow.org list.
Из этого руководства вы узнаете, как загрузить датафрейм Pandas в tf.data.Dataset
.
Это руководство использует небольшой датасет предоставленный Фондом сердечных заболеваний кливлендской клиники. В ней несколько сотен строк в формате CSV. Каждая строка описывает пациента, а каждый столбец описывает свойство. Мы используем эту информацию чтобы предсказать имеет ли пациент сердечное заболевание, что в этом датасете является задачей двоичной классификации.
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.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)