Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Normalização dos dados de teste

Olá. Fiquei com uma dúvida com relação a como foi feita a normalização dos dados de teste.

Na atividade anterior, foi criada a variável normalizacao, utilizando x_treino para fazer o fit:

normalizacao = MinMaxScaler()
x_treino_normalizado = normalizacao.fit_transform(x_treino)

Nesta atividade, a variável normalizacao foi usada novamente, mas agora para normalizar os dados de teste, usando o método transform, já que o fit foi feito anteriormente:

x_teste_normalizado = normalizacao.transform(x_teste)

Minha dúvida é: normalizacao foi fittada com os dados de x_treino, ou seja, o min e max são calculados com base nesses dados. Quando eu aplico normalizacao.transform para x_teste, não estou correndo o risco de x_teste ter valores de min e max diferentes? Imagina que o max em x_treino era 30. O que acontece se houver um valor de 50 em x_teste?

Ou seja, para normalizar x_teste, eu não deveria criar uma nova variável com MinMaxScaler e fazer o fit_transform usando x_teste?

Edit: Ou talvez o mais correto seria fazer o fit de normalizacao utilizando o x, que contém todas as entradas, tanto de treino quanto de teste?

normalizacao.fit(x)
x_treino_normalizado = normalizacao.transform(x_treino)
x_teste_normalizado = normalizacao.transform(x_teste)

Obrigado!

2 respostas
solução!

Oii, Matheus! Tudo joia?

Agradeço por trazer a dúvida para comunidade, é muito válida e certamente ajudará outros colegas também.

Bom, no processo de normalização, ou qualquer transformação aplicada, deve ser feito com base nos dados de treino e a mesma é então aplicada aos dados de teste. Com isso, é evitado o vazamento de dados (data leakage), onde informações dos dados de teste, que supostamente são desconhecidos, influenciam o treinamento do modelo.

Quando se ajusta (fit) o MinMaxScaler com seus dados de treino, ele aprende os valores mínimo e máximo desses dados. Ao usar o método transform nos dados de teste, ele vai usar os mesmos valores mínimo e máximo aprendidos nos dados de treino para transformar os dados de teste. Ou seja, se seus dados de teste tiverem valores fora desse intervalo, eles serão escalados para um valor menor que 0 ou maior que 1.

Para exemplificar: se o valor máximo em x_treino é 30 e existe um valor de 50 em x_teste, após a transformação esse valor será maior que 1, porque o MinMaxScaler está usando o valor máximo de 30 aprendido nos dados de treino.

Então, por não ser uma boa prática e pelo risco de vazamento de dados, não é indicado ajustar o MinMaxScaler em todo o conjunto de dados.

Espero ter esclarecido a sua dúvida. Continue se dedicando aos estudos como você vem fazendo e compartilhando aqui no fórum, pois é enriquecedor.

Bons estudos, Matheus!

Obrigado Nathalia!

Estou acostumado com o desenvolvimento em Front End, em que eu uso muito a biblioteca d3.js para gerar gráficos. Nela nós também usamos funções para trabalhar com escalas e normalização e lá valores fora do intervalo [0, 1] podem gerar problemas na visualização. Por isso acabei trazendo esse raciocínio para cá, haha.

Agora entendi que isso não traz problema em Machine Learning e ainda fiquei sabendo mais sobre o data leakage, então meu muito obrigado!