Path: blob/master/site/pt-br/tutorials/keras/regression.ipynb
25118 views
Copyright 2018 The TensorFlow Authors.
Regressão básica: previsão da eficiência de combustível
Em um problema de regressão, o objetivo é prever a saída de um valor contínuo, como um preço ou uma probabilidade. Compare com um problema de classificação, em que o objetivo é selecionar uma classe em uma lista de classes (por exemplo, quando uma imagem contém uma maçã ou uma laranja, reconhecer qual fruta está presente na imagem).
Este tutorial usa o dataset clássico Auto MPG e demonstra como criar modelos para prever a eficiência de combustível dos automóveis do fim da década de 1970 e início da década de 1980. Para fazer isso, você fornecerá aos modelos uma descrição de diversos automóveis desse período. A descrição incluir vários atributos, como cilindros, cilindradas, cavalos e peso.
Este exemplo usa a API do Keras. Para saber mais, confira os tutoriais e guias do Keras.
Dataset Auto MPG
O dataset está disponível no Repositório de Aprendizado de Máquina da UCI.
Obter os dados
Primeiro, baixe e importe o dataset usando o pandas:
Limpar os dados
O dataset contém alguns valores desconhecidos:
Elimine essas linhas para simplificar este tutorial inicial:
A coluna "Origin"
(origem) armazena uma categoria, não um número. Portanto, a próxima etapa é fazer a codificação one-hot dos valores na coluna com pd.get_dummies.
Observação: você pode configurar tf.keras.Model
para fazer esse tipo de transformação, mas isso foge do escopo deste tutorial. Confira exemplos nos tutoriais Classificar dados estruturados usando camadas de pré-processamento do Keras ou Carregar dados em CSV.
Dividir os dados em datasets de treinamento e teste
Agora, divida o dataset em um conjunto de treinamento e outro de teste. Você usará o conjunto de teste na avaliação final dos modelos.
Avaliar os dados
Confira a distribuição conjunta de alguns pares de colunas do conjunto de treinamento.
A linha superior indica que a eficiência de combustível (MPG, na sigla em inglês) é uma função de todos os outros parâmetros. As outras linhas indicam que são funções uma da outra.
Confira também as estatísticas gerais. Observe como cada característica abrange um intervalo bem diferente:
Separar as características dos rótulos
Separa o valor alvo, o "rótulo", das características. Você treinará o modelo para prever esse rótulo.
Normalização
Na tabela de estatísticas, é fácil ver como os intervalos de cada característica são diferentes:
É uma boa prática normalizar os recursos que usem escalas e intervalos diferentes.
Um motivos dessa importância é porque as características são multiplicadas pelos pesos do modelo. Portanto, a escala das saídas e a escala dos gradientes são afetadas pela escala das entradas.
Embora um modelo talvez possa convergir sem a normalização de características, ela deixa o treinamento muito mais estável.
Observação: não há vantagens em normalizar as características one-hot. Isso é feito aqui por questões de simplicidade. Confira mais detalhes de como usar as camadas de pré-processamento no guia Trabalhando com camadas de pré-processamento e no tutorial Classificar dados estruturados usando camadas de pré-processamento do Keras.
Camada de normalização
tf.keras.layers.Normalization
é uma forma simples e elegante de acrescentar a normalização de características ao seu modelo.
O primeiro passo é criar a camada:
Em seguida, faça a adequação do estado da camada de pré-processamento aos dados chamando Normalization.adapt
:
Calcule a média e a variância., depois armazene-as na camada:
Quando a camada é chamada, retorna os dados de entrada, com cada característica normalizada de forma independente:
Regressão linear
Antes de criar um modelo de rede neural profunda, comece com a regressão linear, usando uma ou várias variáveis.
Regressão linear com uma variável
Comece com uma regressão linear com uma única variável para prever 'MPG'
(milhas por galão) a partir de 'Horsepower'
(cavalos).
Geralmente, fazer o treinamento de um modelo tf.keras
começa pela definição da arquitetura do modelo. Use um modelo tf.keras.Sequential
que representa uma sequência de passos.
Há dois passos no modelo de regressão linear com uma única variável:
Normalize as características de entrada
'Horsepower'
(cavalos) usando a camada de pré-processamentotf.keras.layers.Normalization
.Aplique uma transformação linear () para gerar 1 saída usando uma camada linear (
tf.keras.layers.Dense
).
O número de entradas pode ser definido pelo argumento input_shape
ou automaticamente quando o modelo é executado pela primeira vez.
Primeiro, crie uma array NumPy composto pelas características 'Horsepower'
(cavalos). Em seguida, instancie tf.keras.layers.Normalization
e faça a adequação de seu estado aos dados de horsepower
:
Crie o modelo Sequential do Keras:
Esse modelo preverá 'MPG'
a partir de 'Horsepower'
.
Execute o modelo não treinado para os primeiros 10 valores de 'Horsepower'. A saída não será boa, mas observe que tem o formato esperado – (10, 1)
:
Após criar o modelo, configure o procedimento de treinamento usando o método Model.compile
do Keras. Os argumentos mais importantes a serem compilados são loss
(perda) e optimizer
(otimizador), já que definem o que será otimizado (mean_absolute_error
) e como (usando tf.keras.optimizers.Adam
).
Use Model.fit
do Keras para executar o treinamento com 100 épocas:
Visualize o progresso de treinamento do modelo usando as estatísticas armazenadas no objeto history
(histórico):
Colete os resultados para o conjunto de teste para uso posterior:
Como é uma regressão com uma única variável, é fácil ver as previsões do modelo como uma função da entrada:
Regressão linear com várias entradas
Você pode usar uma configuração quase idêntica para fazer previsões com base em diversas entradas. Esse modelo ainda faz a mesma transformação linear , mas é uma matriz, e é um vetor.
Crie novamente um modelo Sequential do Keras com dois passos, sendo que a primeira camada é o normalizer
(normalizador), (tf.keras.layers.Normalization(axis=-1)
) que você definiu anteriormente e adaptou para todo o dataset:
Quando você faz uma chamada a Model.predict
para um lote de entradas, são produzidas saídasunits=1
para cada exemplo:
Quando você faz uma chamada ao modelo, suas matrizes de peso são construídas. Verifique se os pesos de kernel
(o em ) têm um formato igual a (9, 1)
:
Configure o modelo com Model.compile
do Keras e faça o treinamento com Model.fit
com 100 épocas:
Ao usar todas as entradas nesse modelo de regressão, conseguimos um erro de treinamento e validação bem menor do que horsepower_model
, que tinha uma entrada:
Colete os resultados para o conjunto de teste para uso posterior:
Regressão com uma rede neural profunda (DNN)
Na seção anterior, você implementou dois modelos lineares para entrada única ou diversas entradas.
Agora, você implementará modelos de DNN com uma entrada ou diversas entradas.
O código é basicamente o mesmo, exceto que o modelo é expandido, com a inclusão de algumas camadas não lineares "ocultas". O termo "ocultas" significa apenas que elas não estão ligadas diretamente às entradas ou às saídas.
Esses modelos conterão algumas camadas a mais do que o modelo linear:
A camada de normalização, da mesma forma que anteriormente (com
horsepower_normalizer
para um modelo com uma entrada enormalizer
para um modelo com várias entradas).Duas camadas
Dense
não lineares e ocultas, com a função de ativação ReLU (relu
) não linear.Uma camada
Dense
com uma única saída.
Os dois modelos usarão o mesmo procedimento de treinamento, então o método compile
é incluído na função build_and_compile_model
abaixo.
Regressão usando uma DNN e uma única entrada
Crie um modelo de DNN com apenas 'Horsepower'
(cavalos) como entrada e horsepower_normalizer
(definido anteriormente) como a camada de normalização:
Esse modelo tem bem mais parâmetros que podem ser treinados do que os modelos lineares:
Treine o modelo com Model.fit
do Keras:
Esse modelo tem um desempenho um pouco melhor do que o modelo horsepower_model
linear com uma única entrada:
Se você plotar as previsões como função de 'Horsepower'
(cavalos), notará como esse modelo tem vantagens sobre a não linearidade fornecida pelas camadas ocultas:
Colete os resultados para o conjunto de teste para uso posterior:
Regressão usando uma DNN e várias entradas
Repita o processo anterior usando todas as entradas. O desempenho do modelo aumenta um pouco para o dataset de validação.
Colete os resultados para o conjunto de teste:
Desempenho
Como todos os modelos foram treinados, você pode conferir o desempenho de seus conjuntos de teste:
Esses resultados batem com o erro de validação observado durante o treinamento.
Fazer previsões
Agora, você pode fazer previsões com dnn_model
para o conjunto de testes usando Model.predict
do Keras e conferindo a perda:
Parece que o modelo faz previsões razoavelmente boas.
Agora, confira a distribuição do erro:
Se você estiver contente com o modelo, salve-o para uso posterior com Model.save
:
Se você recarregar o modelo, ele gerará uma saída idêntica:
Conclusão
Este notebook apresentou algumas técnicas para lidar com um problema de regressão. Confira mais algumas dicas que podem ajudar:
Erro Quadrático Médio (EQM) (
tf.keras.losses.MeanSquaredError
) e Erro Absoluto Médio (EMA) (tf.keras.losses.MeanAbsoluteError
) são funções de perda comuns usadas para problemas de regressão. O EMA é menos sensível aos pontos fora da curva. Funções de perda diferentes são usadas para problemas de classificação.De maneira similar, as métricas de avaliação usadas para regressão diferem das usadas para classificação.
Quando características de dados de entrada numérica têm valores com intervalos diferentes, cada característica deve ter sua escala alterada de forma independente para o mesmo intervalo.
O overfitting é um problema comum para modelos de DNN, embora não tenha sido um problema neste tutorial. Consulte mais informações sobre esse tema no tutorial Overfitting e underfitting.