

# Ajustar transformações de machine learning no AWS Glue
<a name="add-job-machine-learning-transform-tuning"></a>

Você pode ajustar suas transformações de machine learning no AWS Glue para aprimorar os resultados de seus trabalhos de limpeza de dados e atender aos seus objetivos. Para melhorar sua transformação, você pode ensiná-la gerando um conjunto de rotulamento, adicionando rótulos e repetindo essas etapas várias vezes até obter os resultados desejados. Você também pode ajustá-las alterando alguns parâmetros de machine learning. 

Para obter mais informações sobre transformações de machine learning, consulte [Correspondência de registros com o FindMatches do AWS Lake Formation](machine-learning.md).

**Topics**
+ [Medições de machine learning](machine-learning-terminology.md)
+ [Escolher entre precisão e recuperação](machine-learning-precision-recall-tradeoff.md)
+ [Decidir entre acurácia e custo](machine-learning-accuracy-cost-tradeoff.md)
+ [Estimação da qualidade das correspondências usando pontuações de confiança de correspondência](match-scoring.md)
+ [Ensinar a transformação Find Matches](machine-learning-teaching.md)

# Medições de machine learning
<a name="machine-learning-terminology"></a>

Para compreender as medições que são usadas para ajustar a transformação de machine learning, você deve estar familiarizado com a seguinte terminologia:

**Verdadeiro positivo (TP)**  
Uma correspondência nos dados que a transformação encontrou corretamente, também denominada como um *acerto*.

**Verdadeiro negativo (TN)**  
Uma falta de correspondência nos dados que a transformação rejeitou corretamente.

**Falsos positivo (FP)**  
Uma falta de correspondência nos dados que a transformação classificou incorretamente como correspondente, também denominada como um *alarme falso*.

**Falso negativo (FN)**  
Uma correspondência nos dados que a transformação não detectou, também denominada como um *erro*.

Para obter mais informações sobre a terminologia de machine learning, consulte [Confusion matrix (em inglês)](https://en.wikipedia.org/wiki/Confusion_matrix) na Wikipédia.

Para ajustar as transformações de machine learning, você pode alterar o valor das seguintes medidas nas **Advanced properties (Propriedades avançadas)** da transformação.
+ **Precision** (Precisão) mede o quão bem a transformação encontra verdadeiros positivos entre o número total de registros que identifica como positivos (verdadeiros positivos e falsos positivos). Para obter mais informações, consulte [Precisão e revocação](https://en.wikipedia.org/wiki/Precision_and_recall) na Wikipédia.
+ A **revocação** mede quão bem a transformação encontra verdadeiros positivos do total de registros nos dados de origem. Para obter mais informações, consulte [Precisão e revocação](https://en.wikipedia.org/wiki/Precision_and_recall) na Wikipédia.
+ A **acurácia** mede quão bem a transformação encontra verdadeiros positivos e verdadeiros negativos. Aumentar a acurácia exige mais recursos de máquina e eleva os custos. Mas isso também resulta em um aumento da revocação. Para obter mais informações, consulte [Accuracy and precision (em inglês)](https://en.wikipedia.org/wiki/Accuracy_and_precision#In_information_systems) na Wikipédia.
+ O **custo** mede quantos recursos de computação (logo, dinheiro) são consumidos para executar a transformação.

# Escolher entre precisão e recuperação
<a name="machine-learning-precision-recall-tradeoff"></a>

Toda transformação `FindMatches` tem um parâmetro `precision-recall`. Você usa esse parâmetro para especificar o seguinte:
+ Caso esteja mais preocupado com a possibilidade da transformação detectar a correspondência de dois registros que, na verdade, não correspondem, favoreça a *precisão*. 
+ Caso esteja mais preocupado com a transformação falhar na detecção de registros que correspondem, favoreça a *revocação*.

Você pode ajustar esse equilíbrio no console do AWS Glue ou usando as operações da API de machine learning do AWS Glue.

**Quando favorecer a precisão**  
Dê preferência para a precisão se você estiver mais preocupado com o risco de `FindMatches` corresponder registros que, na verdade, não correspondem. Para favorecer a precisão, escolha um valor *mais alto* de equilíbrio entre precisão e recall. Com um valor mais alto, a transformação `FindMatches` precisa de mais evidências para decidir se dois registros devem corresponder. A transformação será ajustada para corresponder menos registros.

Por exemplo, suponha que você esteja usando `FindMatches` para detectar itens duplicados em um catálogo de filmes e fornece um valor de precisão-revocação mais alto para a transformação. Se a sua transformação detecta incorretamente que *Star Wars: Uma Nova Esperança* é o mesmo que *Star Wars: O Império Contra-Ataca*, um cliente que procurando *Uma Nova Esperança* poderá ver *O Império Contra-Ataca*. Isso resultaria em uma experiência do cliente insatisfatória. 

No entanto, se a transformação não detectar que *Star Wars: Uma Nova Esperança* e *Star Wars: Episódio IV - Uma Nova Esperança* são o mesmo item, o cliente pode ficar confuso, mas reconhecerá os dois como iguais. Isso seria um erro, mas menos prejudicial que o primeiro caso.

**Quando favorecer a recuperação**  
Dê preferência para a revocação se você estiver mais preocupado com o risco da transformação `FindMatches` não detectar pares de registros que, na verdade, são correspondentes. Para favorecer o recall, escolha um valor *mais baixo* de equilíbrio entre precisão e recall. Com um valor mais baixo, a transformação `FindMatches` precisa de menos evidências para decidir se dois registros devem corresponder. A transformação será ajustada para tender a corresponder mais registros.

Por exemplo, isso pode ser uma prioridade em uma organização de segurança. Suponha que você está comparando a lista de clientes com uma lista de falsificadores, e deve determinar se cada cliente é um falsificador ou não. Você vai usar `FindMatches` para corresponder a lista de falsificadores com a lista de clientes. Sempre que `FindMatches` detectar uma correspondência entre as duas listas, um auditor humano é atribuído para verificar se aquela pessoa é realmente um falsificador. Sua organização pode preferir revocação ao invés de precisão. Ou seja, você prefere que os auditores revisem e rejeitem manualmente os casos nos quais o cliente não é um falsificador à transformação falhar ao identificar se um cliente está na lista de falsificadores.

**Como favorecer tanto a precisão como a recuperação**  
A melhor maneira de aprimorar a precisão e a revocação é rotulando mais dados. Conforme você rotula mais dados, a acurácia geral da transformação `FindMatches` melhora, aprimorando, por sua vez, a precisão e a revocação. No entanto, até com a maior acurácia possível em uma transformação, você sempre precisará experimentar entre favorecer precisão ou revocação, ou manter um valor equilibrado. 

# Decidir entre acurácia e custo
<a name="machine-learning-accuracy-cost-tradeoff"></a>

Cada transformação `FindMatches` contém um parâmetro `accuracy-cost`. Você pode usar esse parâmetro para especificar o seguinte:
+ Caso esteja mais preocupado com a transformação corresponder dois registros corretamente, favoreça a *acurácia*.
+ Caso esteja mais preocupado com o custo ou a velocidade de executar a transformação, favoreça *baixo custo*.

Você pode ajustar esse equilíbrio no console do AWS Glue ou usando as operações da API de machine learning do AWS Glue.

**Quando favorecer a acurácia**  
Dê preferência para a acurácia se você estiver mais preocupado com o risco dos resultados de `find matches` não terem correspondências. Para favorecer a acurácia, escolha um valor de equilíbrio entre acurácia e custo *mais alto*. Com um valor mais alto, a transformação `FindMatches` precisa de mais tempo para fazer uma pesquisa mais aprofundada e corresponder registros corretamente. Observe que esse parâmetro não diminui a probabilidade de erro na correspondência de dois registros que, na verdade, não correspondem. A transformação será ajustada para gastar mais tempo detectando correspondências.

**Quando favorecer o custo**  
Dê preferência para o custo se estiver mais preocupado com os gastos de execução da transformação `find matches` e menos com a quantidade de correspondências encontradas. Para favorecer o custo, escolha um valor de equilíbrio entre acurácia e custo *mais baixo*. Com um valor mais baixo, a transformação `FindMatches` exige menos recursos para ser executada. A transformação será ajustada para tender a detectar menos correspondências. Se os resultados forem aceitáveis ao favorecer baixo custo, use essa configuração.

**Como favorecer tanto a acurácia como o baixo custo**  
A máquina leva mais tempo para determinar se mais pares de registros correspondem. Você pode executar as seguintes ações para reduzir os gastos, mas manter a qualidade: 
+ Elimine registros da fonte de dados que não são relevantes para as correspondências.
+ Elimine colunas da fonte de dados as quais você não tem certeza se são úteis para a identificação de correspondências. Uma boa maneira de decidir isso é eliminando as colunas que você acredita não afetarem sua própria decisão sobre um conjunto de registros ser "o mesmo".

# Estimação da qualidade das correspondências usando pontuações de confiança de correspondência
<a name="match-scoring"></a>

As pontuações de confiança de correspondência fornecem uma estimativa da qualidade das correspondências encontradas pelo FindMatches para distinguir entre registros correspondentes nos quais o modelo de machine learning é altamente confiante, incerto ou improvável. Uma pontuação de confiança na partida ficará entre 0 e 1, onde uma pontuação mais alta significa maior semelhança. O exame das pontuações de confiança da correspondência permite distinguir entre clusters de correspondências em que o sistema é altamente confiante (que você pode decidir mesclar), clusters sobre os quais o sistema é incerto (que você pode decidir que seja revisado por um humano) e clusters que o sistema considera improváveis (que você pode decidir rejeitar).

Você pode querer ajustar seus dados de treinamento em situações em que veja uma pontuação de confiança de correspondência alta, mas determine que não há correspondências ou onde você vê uma pontuação baixa, mas determina que existem, de fato, correspondências.

As pontuações de confiança são particularmente úteis quando há conjuntos de dados industriais de grande porte, nos quais é inviável revisar todas as decisões do FindMatches.

As pontuações de confiança de correspondência estão disponíveis no AWS Glue versão 2.0 ou posterior.

## Geração de pontuações de confiança de correspondência
<a name="specifying-match-scoring"></a>

Você pode gerar pontuações de confiança de correspondência definindo o valor booleano de `computeMatchConfidenceScores` para True (Verdadeiro) ao chamar `FindMatches` ou a API `FindIncrementalMatches`.

O AWS Glue adiciona um novo `column match_confidence_score` para a saída.

## Exemplos de pontuação de correspondência
<a name="match-scoring-examples"></a>

Por exemplo, considere os registros correspondentes a seguir:

**Pontuação >= 0,9**  
Resumo dos registros correspondentes:

```
  primary_id  |   match_id  | match_confidence_score

3281355037663    85899345947   0.9823658302132061
1546188247619    85899345947   0.9823658302132061
```

Detalhes:

![\[Um exemplo de uma tabela de rotas com um gateway da Internet.\]](http://docs.aws.amazon.com/pt_br/glue/latest/dg/images/match_score1.png)


A partir deste exemplo, podemos ver que dois registros são muito semelhantes e compartilham `display_position`, `primary_name`, e `street name`. 

**Pontuação >= 0,8 e pontuação < 0,9**  
Resumo dos registros correspondentes:

```
  primary_id  |   match_id  | match_confidence_score

309237680432     85899345928   0.8309852373674638
3590592666790    85899345928   0.8309852373674638
343597390617     85899345928   0.8309852373674638
249108124906     85899345928   0.8309852373674638
463856477937     85899345928   0.8309852373674638
```

Detalhes:

![\[Um exemplo de uma tabela de rotas com um gateway da Internet.\]](http://docs.aws.amazon.com/pt_br/glue/latest/dg/images/match_score2.png)


A partir deste exemplo, podemos ver que esses registros compartilham o mesmo `primary_name`, e `country`.

**Pontuação >= 0,6 e pontuação < 0,7**  
Resumo dos registros correspondentes:

```
  primary_id  |   match_id  | match_confidence_score

2164663519676    85899345930   0.6971099896480333
 317827595278    85899345930   0.6971099896480333
 472446424341    85899345930   0.6971099896480333
3118146262932    85899345930   0.6971099896480333
 214748380804    85899345930   0.6971099896480333
```

Detalhes:

![\[Um exemplo de uma tabela de rotas com um gateway da Internet.\]](http://docs.aws.amazon.com/pt_br/glue/latest/dg/images/match_score3.png)


A partir deste exemplo, podemos ver que esses registros compartilham somente o mesmo `primary_name`.

Para obter mais informações, consulte:
+ [Etapa 5: adicionar e executar um trabalho com sua transformação de machine learning](machine-learning-transform-tutorial.md#ml-transform-tutorial-add-job)
+ PySpark: [Classe FindMatches](aws-glue-api-crawler-pyspark-transforms-findmatches.md)
+ PySpark: [Classe FindIncrementalMatches](aws-glue-api-crawler-pyspark-transforms-findincrementalmatches.md)
+ Scala: [Classe FindMatches](glue-etl-scala-apis-glue-ml-findmatches.md)
+ Scala: [Classe FindIncrementalMatches](glue-etl-scala-apis-glue-ml-findincrementalmatches.md)

# Ensinar a transformação Find Matches
<a name="machine-learning-teaching"></a>

Cada transformação `FindMatches` precisa ser ensinada para saber o que deve ou não ser considerado como correspondência. Você ensina sua transformação adicionando rótulos a um arquivo e fazendo upload de suas escolhas para o AWS Glue. 

Você pode orquestrar esse rotulamento no console do AWS Glue ou usando as operações da API de machine learning do AWS Glue.

**Quantas vezes devo adicionar rótulos? Quantos rótulos são necessários?**  
As respostas para essas perguntas dependem de você. Você deve avaliar se `FindMatches` está fornecendo o nível de acurácia de que você precisa e se o esforço adicional de rotulamento vale a pena. A melhor maneira de decidir isso é analisando as métricas “Precision (Precisão)”, “Recall (Revocação)” e “Area under the precision recall curve (Área sob a curva de precisão e revocação)” que você pode gerar selecionando **Estimate quality (Estimativa de qualidade)** no console do AWS Glue. Depois de rotular mais conjuntos de tarefas, execute essas métricas novamente e verifique se foram aprimoradas. Caso, depois de rotular alguns conjuntos de tarefas, você não veja uma melhoria na métrica em que está focando, a qualidade da transformação pode ter atingido seu auge.

**Qual é a necessidade de ter ambos os rótulos verdadeiro positivo e verdadeiro negativo?**  
A transformação `FindMatches` precisa de exemplos positivos e negativos para aprender o que você considera como correspondência. Se você estiver rotulando dados de treinamento gerados por `FindMatches` (por exemplo, usando a opção **I do not have labels (Eu não tenho rótulos)**), a transformação `FindMatches` tentará gerar um conjunto de "label set ids" (IDs de conjunto de rótulo) para você. Em cada tarefa, você atribui o mesmo “rótulo” a alguns registros e “rótulos” diferentes a outros registros. Em outras palavras, as tarefas não costumam ser completamente iguais ou completamente diferentes (porém, não há problema se uma tarefa específica for tudo “igual” ou tudo “diferente”).

Se você estiver ensinando a sua transformação `FindMatches` usando a opção **Upload labels from S3 (Fazer upload de rótulos do S3)**, tente incluir os exemplos de registros correspondentes e não correspondentes. Ter apenas um tipo é aceitável. Esses rótulos ajudam a aumentar a acurácia da transformação `FindMatches`, mas você ainda precisa rotular alguns registros que gerou com a opção **Generate labeling file (Gerar arquivo de rotulamento)**.

**Como posso garantir que a transformação faça correspondências conforme ensinei?**  
A transformação `FindMatches` aprende com os rótulos que você fornece, portanto, pode gerar pares de registros que não seguem os rótulos fornecidos. Para garantir que a transformação `FindMatches` siga seus rótulos, selecione **EnforceProvidedLabels** em **FindMatchesParameter**.

**Quais técnicas podem ser usadas quando uma transformação de ML identifica como correspondentes itens que não são uma correspondência verdadeira?**  
Você pode usar as seguintes técnicas:
+ Aumente o valor de `precisionRecallTradeoff`. Isso resultará eventualmente em menos correspondências encontradas, mas também deve dividir seu grande cluster quando atingir um valor alto o suficiente. 
+ Execute as linhas de saída correspondentes aos resultados incorretos e reformate-as como um conjunto de rotulamento (removendo a coluna `match_id` e adicionando uma coluna `labeling_set_id` e `label`). Se necessário, quebre-as (subdivida-as) em vários conjuntos de rotulamento para garantir que o rotulador possa ter todos os conjuntos em mente ao atribuir rótulos. Depois, rotule corretamente os conjuntos correspondentes, faça upload do arquivo de rótulo e anexe-o aos rótulos existentes. Isso pode ajudar a ensinar o transformador sobre o que deve procurar para entender o padrão. 
+ (Avançado) Por fim, observe os dados para ver se há um padrão que você pode detectar, mas o sistema não está observando. Pré-processe esses dados usando funções padrão do AWS Glue para *normalizá-los*. Destaque o que deseja que o algoritmo aprenda separando os dados que você considera importante em suas próprias colunas. Ou crie colunas combinadas de colunas cujos dados são relacionados. 