3
respostas

Normalizer é a melhor opção para re-escalar os dados?

Normalizer é um método de pré-processamento que normaliza cada uma das linhas da tabela. Isso não faz sentido nenhum nesse exemplo porque de fato o que o algoritmo está fazendo é calcular uma norma para cada linha somando valores que não estão na mesma unidade: colunas que terminam com FREQUENCY são frequências, colunas que terminam com TRX são valores inteiros, enquantos os outros valores estão em valores monetários. O que o algoritmo faz é para cada linha somar frequência + numero inteiro + valor monetário, calcular uma norma e então dividir a linha por essa norma.

Além disso isso faz com que clientes que tenham uma distribuição parecida de features tenham exatamente o mesmo valor normalizado. Esse tipo de normalização privilegia a forma como os atributos são distribuídos, não os seus valores em si. Por ex. Um cliente que gasta 6.000.000 a vista e 4.000.000 parcelado, vai ter EXATAMENTE o mesmo valor normalizado que um cliente que gasta 60 a vista e 40 parcelado, embora exista um oceano de distância entre os dois.

3 respostas

O oceano de distancia vai continuar existindo, re-escalar quer dizer que a distancia entre os valores continuara a mesma.

X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
X_scaled = X_std * (max - min) + min

no teu exemplo assumimos valor maximo a vista é 6000 e o menor 60

X_std = (60-60)/(6000-60)
X_scaled = 0*(1-0)+0

e

X_std = (6000-60)/(6000-60)
X_scaled = 0*(1-0)+0

entao 60 na nova escala vale 0 e 6000 vale 1 agora um novo valor dentro dessa serie (aonde o max é 6000 e o min é 60), vai ficar no intervalo de 0 e 1 ex: 788

X_std = (788-60)/(6000-60)
X_scaled = 0*(1-0)+0

na nova escala x é igual a 0.12255892255

Oi Vagner, tudo bem? Acho que você não entendeu bem meu ponto. Eu entendo sim que o ato de escalar vai guardar a diferença. Isso é verdade. Meu ponto é sobre a função utilizada para escalar neste exemplo, que foi a função normalizer. O que a função normalizer faz é ao invés de normalizar por coluna, ou seja por feature, ele normaliza todos os features de uma mesma linha entre eles mesmo. Isso quer dizer que ele soma itens que tem unidades diferentes. Além disso, ele privilegia as proporções dos features e nessa brincadeira o oceano desaparece, veja bem, se estivermos trabalhando hipoteticamente com 2 features e trabalharmos com 3 linhas, por exemplo

from sklearn.preprocessing import Normalizer
import pandas as pd

dados = pd.DataFrame({'feature1':[600, 6000, 6000000], 'feature2':[400, 4000, 4000000]})
scaler = Normalizer()
dados_escalados = scaler.fit_transform(dados)

Obtemos como output

array([[0.83205029, 0.5547002 ],
       [0.83205029, 0.5547002 ],
       [0.83205029, 0.5547002 ]])

Viu só como o oceano desapareceu? Obtivemos exatamente o mesma valor para os features embora os valores sejam completamente diferentes entre as linhas.

Dá uma olhada nesse link https://datascience.stackexchange.com/questions/45900/when-to-use-standard-scaler-and-when-normalizer

Ola, tudo bem e contigo? Entendi, desculpa. se o normalizer nao esta dando o resultado desejado, provavelmente nao é a melhor forma. A situaçao para a aplicaçao nao é a ideal https://scikit-learn.org/stable/auto_examples/preprocessing/plot_all_scaling.html#sphx-glr-auto-examples-preprocessing-plot-all-scaling-py

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software