Normalizar ou padronizar as variáveis?
Um dos processos muito rotineiros para um Data Science é "colocar as variáveis na mesma página". Mas quando devemos escolher entre normalization, standardization e porque?
A transformação dos seus dados, que já estão tratados, é uma pratica para evitar que seu algoritmo fique enviesado para as variáveis com maior ordem de grandeza.
As duas técnicas tem o mesmo objetivo: transformar todas as variáveis na mesma ordem de grandeza. E a diferença básica é que padronizar as variáveis irá resultar em uma média igual a 0 e um desvio padrão igual a 1. Já normalizar tem como objetivo colocar as variáveis dentro do intervalo de 0 e 1, caso tenha resultado negativo -1 e 1.
Padronizar os dados normalmente é feita usando a fórmula z-score:
Normalizar os dados usando Min-Max:
Se a distribuição não é Gaussiana ou o desvio padrão é muito pequeno, normalizar os dados é uma escolha a ser tomada.
Cuidado com os outliers, alguns artigos irão dizer que normalizar é o melhor método e também encontrará artigos dizendo que padronizar os dados é a opção a ser feita. Como já diz o teorema No Free Lunch, a melhor saída é testar e avaliar o resultado. Isso vale tanto para algoritmos de detecção de outliers, quanto para não suavizar efeitos de outliers em seu dataset. A biblioteca scikit-learn tem alguns exemplos com outliers, vale a pena conferir como fica graficamente.
Assimetria
Basicamente são técnicas que transformam a distribuição em normal das suas variáveis.
As suas variáveis podem estar com 3 tipos de formato, como mostra a figura acima. A figura mostra três gráficos, onde o primeiro da esquerda representa a distribuição normal e já os demais, são distribuições assimétricas.
Existem técnicas específicas para cada caso de assimetria, que servem para transforma a distribuição em normal.
Assimetria positiva, pode ser tratada com as seguintes técnicas: raiz quadrada, raiz cúbica e log.
Assimetria negativa, pode ser tratada com as seguintes técnicas: quadrado, raiz cúbica e log. Entretanto, log tem um fator especial a ser considerado, você deverá criar uma condicional para os casos de valores negativos considerar a seguinte fórmula: -log(abs(-x)) e para os casos 0 deverá somar 1, exemplo: log(0+1), pois log(1) é zero.
Exemplo práticos
Em muitos casos é preciso normalizar|padronizar|escalar mas também no final da modelagem, os números precisam ser interpretáveis. Portanto, é preciso saber fazer a transformação reversa.
O exemplo abaixo, escrito em R, traz um exemplo utilizando a biblioteca escale. Utilizei a fórmula, mas também escrevi a equação com intuito de mostrar como ela funciona.
Já para padronizar as variáveis, utilizamos a função scale()
e caso seja preciso retomar os valores iniciais, a função está descrita abaixo.
Para python, é possível reverter a normalização MinMax seguindo o passo a passo a seguir:
O parâmetro feature_range= (0,1)
é o default que resultará a normalização variando entre 0 e 1. No R é feito da seguinte maneira: rescale(x,c(0,1))
, lembrando que esses valores podem ser definidos da maneira que for mais conveniente para você.
Também é possível conseguir os valores na escala original usando StandardScaler
, já a função Normalizer
dessa biblioteca, não possui a transformação inversa.
Entretanto, existe um parâmetro interessante na função Normalizer
que pode escolher qual métrica de cálculo da distância entre as variáveis que faça sentido ao problema. O parâmetro norm="l2"
que é o default, usa a distância Euclidiana, uma outra alternativa é utilizar a distância Manhattan, norm="l1"
.
De forma simples, uma maneira de exemplificar o momento mais adequado em se utilizar cada uma delas é pensar e uma distância entre dois pontos no Rio de Janeiro. Se é um trajeto de um pássaro, a distância euclidiana é mais conveniente já que pode traçar uma diagonal de um ponto para o outro. Agora, se pensarmos que esses pontos serão percorridos por um humano ou carro que precisa respeitar as ruas e quarteirões o uso da distância Manhattan é mais adequada .
Também não podemos deixar de comentar da transformação log()
, que é muito eficaz e utilizado, já que é a transformação mais simples para normalizar e transformar os valores na escala original, exp()
.
Lembrando que para casos seja necessário passar log()
em um conjunto de variável que contém zero. A melhor saída é considerar uma condicional para os valores iguais a zero, efetuar log(1)
que é igual a zero. Todavia, a transformação log()
não funciona para números negativos.
As principais mensagens que quero deixar…
As transformações são importantes para conseguir que o seu modelo consiga uma acurácia satisfatória. Entretanto, em muitos casos, saber fazer o calculo reverso para o número gerado do modelo seja um valor interpretado, também é fundamental.
Por fim, é aconselhável que seja testado diferentes técnicas e comparar o resultado da acurácia do teste para escolher qual que resultou um melhor fit no seu problema.
Referências
https://www.oreilly.com/library/view/machine-learning-with/9781491989371/ch04.html
https://codefellows.github.io/sea-python-401d5/lectures/rescaling_data.html
https://stats.stackexchange.com/questions/25894/changing-the-scale-of-a-variable-to-0-100
https://medium.com/@zaidalissa/standardization-vs-normalization-da7a3a308c64
https://towardsdatascience.com/normalization-vs-standardization-quantitative-analysis-a91e8a79cebf
https://medium.com/@rrfd/standardize-or-normalize-examples-in-python-e3f174b65dfc