Path: blob/master/site/pt-br/tutorials/load_data/pandas_dataframe.ipynb
25118 views
Copyright 2019 The TensorFlow Authors.
Licensed under the Apache License, Version 2.0 (the "License");
Carregue um DataFrame do pandas
Este tutorial fornece exemplos de como carregar DataFrames do pandas no TensorFlow.
Você usará um pequeno dataset de cardiopatia oferecido pelo UCI Machine Learning Repository (Repositório de Aprendizado de Máquina da UCI). Há centenas de linhas no CSV. Cada linha representa um paciente, e cada coluna descreve uma característica. Você usará essas informações para prever se um paciente tem cardiopatia, o que é uma tarefa de classificação binária.
Leia os dados usando o pandas
Baixe o arquivo CSV com o dataset de cardiopatia:
Leia o arquivo CSV usando o pandas:
É assim que os dados aparecem:
Você criará modelos para prever o rótulo contido na coluna target
.
Um DataFrame como array
Caso seus dados tenham um datatype uniforme, ou dtype
, você poderá usar um DataFrame do pandas em qualquer lugar que seja possível usar um array do NumPy. Isso funciona porque a classe pandas.DataFrame
é compatível com o protocolo __array__
, e a função tf.convert_to_tensor
do TensorFlow aceita objetos compatíveis com o protocolo.
Obtenha as características numéricas do dataset (pule as características categóricas por enquanto):
O DataFrame pode ser convertido para um array do NumPy usando a propriedade DataFrame.values
ou numpy.array(df)
. Para convertê-lo em um tensor, use tf.convert_to_tensor
:
Em geral, se um objeto pode ser convertido em um tensor com tf.convert_to_tensor
, ele pode ser passado como argumento em qualquer lugar que aceite um tf.Tensor
.
Com Model.fit
Um DataFrame, interpretado como um único tensor, pode ser usado diretamente como um argumento para o método Model.fit
.
Confira abaixo um exemplo do treinamento de um modelo nas características numéricas de um dataset.
A primeira etapa é normalizar os intervalos de entrada. Use uma camada tf.keras.layers.Normalization
para isso.
Para definir a média e o desvio padrão de uma camada antes de executá-la, chame o método Normalization.adapt
:
Chame a camada nas primeiras três linhas do DataFrame para visualizar um exemplo da saída dessa camada:
Use a camada de normalização como a primeira camada de um modelo simples:
Ao passar o DataFrame como o argumento x
para Model.fit
, o Keras trata o DataFrame como faria com um array do NumPy:
Com tf.data
Se você quiser aplicar transformações tf.data
a um DataFrame de dtype
uniforme, o método Dataset.from_tensor_slices
criará um dataset que itera as linhas do DataFrame. Cada linha é inicialmente um vetor de valores. Para treinar um modelo, você precisa de pares (inputs, labels)
, então passe (features, labels)
, e Dataset.from_tensor_slices
retornará os pares de fatias:
Um DataFrame como dicionário
Quando você começa a lidar com dados heterogêneos, não é mais possível tratar o DataFrame como um único array. Os tensores do TensorFlow exigem que todos os elementos tenham o mesmo dtype
.
Portanto, nesse caso, você precisa começar a tratá-lo como um dicionário de colunas, em que cada coluna tem um dtype
uniforme. Um DataFrame é bastante parecido com um dicionário de arrays, então, geralmente você só precisa fazer o casting do DataFrame para um dict do Python. Várias APIs importantes do TensorFlow são compatíveis com dicionários (aninhados) de arrays como entradas.
Os pipelines de entrada do tf.data
lidam com isso muito bem. Todas as operações do tf.data
lidam com dicionários e tuplas automaticamente. Portanto, para criar um dataset de exemplos de dicionário a partir de um DataFrame, basta fazer o casting para um dict antes de fatiar com Dataset.from_tensor_slices
:
Aqui estão os três primeiros exemplos desse dataset:
Dicionários com o Keras
Geralmente, os modelos e as camadas do Keras esperam um único tensor de entrada, mas essas classes podem aceitar e retornar estruturas aninhadas de dicionários, tuplas e tensores. Essas estruturas são conhecidas como "ninhos" (consulte o módulo tf.nest
para mais detalhes).
Há duas maneiras equivalentes de escrever um modelo do Keras que aceita um dicionário como entrada.
1. O estilo subclasse do modelo
Você escreve uma subclasse do tf.keras.Model
(ou tf.keras.Layer
). Você lida diretamente com as entradas e cria as saídas:
Esse modelo pode aceitar um dicionário de colunas ou um dataset de elementos de dicionário para treinamento:
Aqui estão as previsões para os três primeiros exemplos:
2. O estilo funcional do Keras
Você pode treinar o modelo funcional da mesma maneira que a subclasse do modelo:
Exemplo completo
Se você passar um DataFrame heterogêneo para o Keras, cada coluna pode precisar de pré-processamento único. Você pode fazer esse pré-processamento diretamente no DataFrame, mas, para um modelo funcionar corretamente, as entradas precisam ser pré-processadas da mesma maneira. Então, a melhor abordagem é integrar o pré-processamento ao modelo. As camadas de pré-processamento do Keras abrangem várias tarefas comuns.
Crie o head de pré-processamento
Nesse dataset, algumas das características de "número inteiro" nos dados brutos são, na verdade, índices categóricos. Esses índices não são valores numéricos ordenados (confira mais detalhes na descrição do dataset). Como eles não são ordenados, são inadequados para alimentar o modelo diretamente, já que seriam interpretados como ordenados. Para usar essas entradas, será necessário codificá-las, como vetores one-hot ou vetores de embeddings. O mesmo se aplica a características categóricas de strings.
Observação: se você tiver várias características que precisam de pré-processamento idêntico, é mais eficiente concatená-las antes de aplicar o pré-processamento.
Por outro lado, as características binárias geralmente não precisam ser codificadas ou normalizadas.
Comece criando uma lista de características que se enquadram em cada grupo:
O próximo passo é criar um modelo de pré-processamento para aplicar o pré-processamento adequado a cada entrada e concatenar os resultados.
Esta seção usa a API Keras Functional para implementar o pré-processamento. Comece criando um tf.keras.Input
para cada coluna do dataframe:
Para cada entrada, você aplicará algumas transformações usando camadas do Keras e operações do TensorFlow. Cada característica começa como um lote de escalares (shape=(batch,)
). A saída para cada uma deve ser um lote de vetores tf.float32
(shape=(batch, n)
). A última etapa será concatenar todos esses vetores.
Entradas binárias
Como as entradas binárias não precisam de pré-processamento, basta adicionar o eixo do vetor, fazer o casting para float32
e adicioná-las à lista de entradas pré-processadas:
Entradas numéricas
Como na seção anterior, execute essas entradas numéricas em uma camada tf.keras.layers.Normalization
antes de usá-las. A diferença é que, dessa vez, elas são inseridas como um dict. O código abaixo coleta, empilha e passa as características numéricas do DataFrame para o método Normalization.adapt
.
O código abaixo empilha e executa as características numéricas na camada de normalização.
Características categóricas
Para usar as características categóricas, primeiro você precisará codificá-las em vetores ou embeddings binários. Como essas características só contêm um número pequeno de categorias, converta as entradas diretamente para vetores one-hot usando a opção output_mode='one_hot'
, compatível com as camadas tf.keras.layers.StringLookup
e tf.keras.layers.IntegerLookup
.
Confira um exemplo de como essas camadas funcionam:
Para determinar o vocabulário de cada entrada, crie uma camada para converter esse vocabulário em um vetor one-hot:
Monte o head de pré-processamento
Neste ponto, preprocessed
é só uma lista do Python com todos os resultados do pré-processamento, cada um com o formato (batch_size, depth)
:
Concatene todas as características pré-processadas no eixo depth
, para converter cada exemplo de dicionário em um único vetor. O vetor contém características categóricas, numéricas e one-hot categóricas:
Agora, crie um modelo a partir desse cálculo para que possa ser reutilizado:
Para testar o pré-processador, use o accessor DataFrame.iloc para fatiar o primeiro exemplo do DataFrame. Em seguida, faça a conversão para um dicionário e passe o dicionário para o pré-processador. O resultado é um único vetor com as características binárias, numéricas normalizadas e categóricas one-hot, nessa ordem:
Crie e treine um modelo
Agora crie o corpo principal do modelo. Use a mesma configuração que o exemplo anterior: algumas camadas lineares retificadas Dense
e uma camada de saída Dense(1)
para a classificação.
Junte as duas partes usando a API funcional do Keras.
Esse modelo espera um dicionário de entradas. A maneira mais simples de passar os dados é converter o DataFrame em um dict e passar esse dict como o argumento x
para Model.fit
:
Usar tf.data
também funciona: