Path: blob/master/site/pt-br/tfx/tutorials/transform/census.ipynb
25118 views
Copyright 2020 The TensorFlow Authors.
Pré-processamento de dados com o TensorFlow Transform
O componente de engenharia de características do TensorFlow Extended (TFX)
Este exemplo de notebook colab fornece um exemplo um pouco mais avançado de como o TensorFlow Transform (tf.Transform
) pode ser usado para pré-processar dados usando exatamente o mesmo código para treinar um modelo e servir inferências em produção.
O TensorFlow Transform é uma biblioteca para pré-processamento de dados de entrada para TensorFlow, incluindo a criação de características que exigem um passo completo do dataset de treinamento. Por exemplo, usando o TensorFlow Transform você poderia:
Normalizar um valor de entrada usando a média e o desvio padrão
Converter strings em inteiros gerando um vocabulário sobre todos os valores de entrada
Converter números de ponto flutuante em números inteiros atribuindo-os a intervalos, com base na distribuição de dados observada
O TensorFlow tem suporte integrado para manipulações em um único exemplo ou num lote de exemplos. O tf.Transform
estende esses recursos para oferecer suporte a passos completos em todo o dataset de treinamento.
A saída do tf.Transform
é exportada como um grafo do TensorFlow que você pode usar para treinamento e serviço. Usar o mesmo grafo para treinamento e serviço pode evitar desvios, uma vez que as mesmas transformações são aplicadas em ambos os estágios.
Ponto chave: para entender o tf.Transform
e como ele funciona com o Apache Beam, você precisará saber um pouco sobre o próprio Apache Beam. O Guia de programação do Beam é um ótimo lugar para começar.
##O que estamos fazendo neste exemplo
Neste exemplo, processaremos um dataset amplamente utilizado contendo dados de censo e treinaremos um modelo para fazer a classificação. Ao longo do caminho estaremos transformando os dados usando o tf.Transform
.
Ponto-chave: como modelador e desenvolvedor, pense em como esses dados são usados e nos possíveis benefícios e danos que as previsões de um modelo podem causar. Um modelo como este poderia reforçar um viés social e disparidades. Uma determinada característica é relevante para o problema que você quer resolver ou será que ela vai introduzir um viés? Para mais informações, leia sobre Equidade em ML.
Observação: o TensorFlow Model Analysis é uma ferramenta poderosa para entender o quão bem seu modelo faz previsões para vários segmentos de seus dados, incluindo a compreensão de como seu modelo pode reforçar preconceitos e disparidades sociais.
Instale o TensorFlow Transform
Importações e variáveis globais
Primeiro importe o que precisamos.
Em seguida, baixe os arquivos de dados:
Dê nomes às colunas
Criaremos algumas listas úteis para referenciar as colunas em nosso dataset.
Aqui está uma rápida visualização dos dados:
Os dados de teste têm 1 linha de cabeçalho que precisa ser ignorada e um "." no final de cada linha.
###Defina nossas características e esquema Vamos definir um esquema com base nos tipos de colunas em nossa entrada. Entre outras coisas, isso ajudará a importá-los corretamente.
[Opcional] Codifique e decodifique protos do tf.train.Example
Este tutorial precisa converter exemplos do dataset de e para protos do tf.train.Example
em alguns lugares.
A função oculta encode_example
abaixo converte um dicionário de recursos do dataset num tf.train.Example
.
Agora você pode converter exemplos de datasets em protos Example
:
Você também pode converter lotes de protos Example serializados de volta para um dicionário de tensores:
Em alguns casos o rótulo não será passado, então a função encode é escrita de forma que o rótulo seja opcional:
Ao criar um proto Example
, ele simplesmente não conterá a chave do rótulo.
###Configuração de hiperparâmetros e manutenção básica
Constantes e hiperparâmetros usados para treinamento.
##Pré-processamento com o tf.Transform
###Crie uma preprocessing_fn do tf.Transform
A função de pré-processamento é o conceito mais importante do tf.Transform. Uma função de pré-processamento é onde a transformação do dataset realmente acontece. Ela recebe e retorna um dicionário de tensores, onde um tensor significa um Tensor
ou SparseTensor
. Existem dois grupos principais de chamadas de API que normalmente formam o coração de uma função de pré-processamento:
Ops do TensorFlow: qualquer função que aceita e retorna tensores, o que geralmente correspondem às ops do TensorFlow. Elas adicionam operações do TensorFlow ao grafo que transforma dados brutos em dados transformados, um vetor de características por vez. Eles serão executados para cada exemplo, tanto durante o treinamento quanto durante o serviço.
Analisadores/mapeadores do Tensorflow Transform: qualquer um dos analisadores/mapeadores fornecidos pelo tf.Transform. Eles também recebem e retornam tensores e normalmente contêm uma combinação de ops do Tensorflow e computações do Beam, mas, ao contrário das ops do TensorFlow, eles são executados apenas no pipeline do Beam durante a análise, exigindo uma passagem completa (full pass) por todo o dataset de treinamento. As computações do Beam rodam apenas uma vez (antes do treinamento, durante a análise) e normalmente fazem uma passagem completa por todo o dataset de treinamento. Criam tensores
tf.constant
, que são adicionados ao grafo. Por exemplo,tft.min
calcula o mínimo de um tensor no dataset de treinamento.
Atenção: Quando você aplica sua função de pré-processamento para servir inferências, as constantes que foram criadas pelos analisadores durante o treinamento não mudam. Se seus dados tiverem componentes de tendência ou sazonalidade, planeje levando isso em consideração.
Aqui está um preprocessing_fn
para este dataset. Ele faz várias coisas:
Usando
tft.scale_to_0_1
, ele redimensiona as caracteristicas numéricas para o intervalo[0,1]
.Usando
tft.compute_and_apply_vocabulary
, ele calcula um vocabulário para cada uma das características categóricas e retorna os IDs inteiros para cada entrada comotf.int64
. Isso se aplica a entradas categóricas de string e inteiro.Ele aplica algumas transformações manuais aos dados usando operações padrão do TensorFlow. Aqui, essas operações são aplicadas ao rótulo, mas também podem transformar as características. As operações do TensorFlow fazem várias coisas:
Eles criam uma tabela de pesquisa para o rótulo (o
tf.init_scope
garante que a tabela seja criada apenas na primeira vez que a função for chamada).Eles normalizam o texto do rótulo.
Eles convertem o rótulo em um one-hot.
Sintaxe
Você está quase pronto para juntar tudo e usar o Apache Beam para executá-lo.
O Apache Beam usa uma sintaxe especial para definir e invocar transformações. Por exemplo, nesta linha:
O método to_this_call
está sendo invocado e passado ao objeto chamado pass_this
, e esta operação será chamada de name this step
num rastreamento de pilha. O resultado da chamada para to_this_call
é retornado em result
. Freqüentemente, você verá estágios de um pipeline encadeados assim:
e como isso começou com um novo pipeline, você pode continuar assim:
Transforme os dados
Agora estamos prontos para começar a transformar nossos dados num pipeline Apache Beam.
Leia os dados usando o leitor CSV
tfxio.CsvTFXIO
(para processar linhas de texto em um pipeline, usetfxio.BeamRecordCsvTFXIO
).Analise e transforme os dados usando
preprocessing_fn
definida acima.Escreva o resultado como um
TFRecord
de protosExample
, que usaremos para treinar um modelo posteriormente
Execute o pipeline:
Encapsule o diretório de saída em um tft.TFTransformOutput
:
Se você olhar no diretório, verá que ele contém três coisas:
Os arquivos de dados
train_transformed
etest_transformed
O diretório
transform_fn
(umtf.saved_model
)O
transformed_metadata
As seções a seguir mostram como usar esses artefatos para treinar um modelo.
##Usando nossos dados pré-processados para treinar um modelo usando tf.keras
Para mostrar como tf.Transform
nos permite usar o mesmo código para treinamento e serviço e, assim, evitar desvios, vamos treinar um modelo. Para treinar nosso modelo e prepará-lo para produção, precisamos criar funções de entrada. A principal diferença entre nossa função de entrada de treinamento e nossa função de entrada de serviço é que os dados de treinamento contêm os rótulos, e os dados de produção não. Os argumentos e retornos também são um pouco diferentes.
###Crie uma função de entrada para treinamento
A execução do pipeline na seção anterior criou arquivos TFRecord
contendo os dados transformados.
O código a seguir usa tf.data.experimental.make_batched_features_dataset
e tft.TFTransformOutput.transformed_feature_spec
para ler esses arquivos de dados como tf.data.Dataset
:
Abaixo você pode ver uma amostra transformada dos dados. Observe como as colunas numéricas, como education-num
e hourd-per-week
são convertidas em números flutuantes com um intervalo de [0,1], e as colunas de string foram convertidas em IDs:
Treine e avalie o modelo
Crie o modelo
Construa os datasets
Treine e avalie o modelo:
Transforme os novos dados
Na seção anterior, o processo de treinamento usou cópias impressas dos dados transformados que foram gerados por tft_beam.AnalyzeAndTransformDataset
na função transform_dataset
.
Para operar com novos dados, você precisará carregar a versão final do preprocessing_fn
que foi salvo por tft_beam.WriteTransformFn
.
O método TFTransformOutput.transform_features_layer
carrega o SavedModel do preprocessing_fn
do diretório de saída.
Aqui está uma função para carregar lotes novos e não processados de um arquivo-fonte:
Carregue o tft.TransformFeaturesLayer
para transformar esses dados com a preprocessing_fn
:
A tft_layer
é inteligente o suficiente para executar a transformação se apenas um subconjunto de características for passado. Por exemplo, se você passar apenas duas características, receberá de volta apenas as versões transformadas dessas características:
Aqui está uma versão mais robusta que elimina características que não estão nas especificações de características e retorna um par (features, label)
se o rótulo estiver nas características fornecidas:
Agora você pode usar o Dataset.map
para aplicar essa transformação dinamicamente a novos dados:
Exporte o modelo
Portanto, você tem um modelo treinado e um método para aplicar preprocessing_fn
a novos dados. Monte-os em um novo modelo que aceite protos tf.train.Example
serializados como entrada.
Crie o modelo e teste-o no lote de exemplos serializados:
Exporte o modelo como um SavedModel:
Recarregue o modelo e teste-o no mesmo lote de exemplos:
##O que fizemos Neste exemplo, usamos tf.Transform
para pré-processar um dataset do censo e treinar um modelo com os dados limpos e transformados. Também criamos uma função de entrada que poderíamos usar ao implantar nosso modelo treinado em um ambiente de produção para realizar inferências. Ao usar o mesmo código para treinamento e inferência, evitamos problemas de desvio de dados. Ao longo do caminho, aprendemos como criar uma transformação do Apache Beam para realizar a transformação necessária para limpar os dados. Também vimos como usar esses dados transformados para treinar um modelo usando tf.keras
. Esta é apenas uma pequena parte do que o TensorFlow Transform é capaz! Nós encorajamos você a mergulhar no tf.Transform
e descobrir o que ele pode fazer por você.
[Opcional] Usando nossos dados pré-processados para treinar um modelo com tf.estimator
Aviso: os Estimators não são recomendados para novos códigos. Os Estimators executam código
v1.Session
, que é mais difícil de escrever corretamente e pode se comportar de forma inesperada, ainda mais quando usado em conjunto com código do TF 2. Os Estimators são abarcados pelas garantias de compatibilidade, mas não recebem mais correções, exceto para vulnerabilidades de segurança. Confira mais detalhes no guia de migração.
###Crie uma função de entrada para treinamento
###Crie uma função de entrada para servir
Vamos criar uma função de entrada que possamos usar em produção e preparar nosso modelo treinado para servir.
###Encapsule os dados de entrada num FeatureColumns Nosso modelo esperará nossos dados em TensorFlow FeatureColumns.
###Treine, avalie e exporte o modelo
###Junte tudo Criamos tudo o que precisamos para pré-processar os dados do censo, treinar um modelo e prepará-lo para servir. Até agora estamos apenas preparando as coisas. É hora de começar a trabalhar!
Observação: role a saída desta célula para ver todo o processo. Os resultados estarão na parte inferior.