Algoritmos de Normalização em IA: Min-Max e Z-Score

Introdução à Normalização

Normalização é uma técnica de pré-processamento de dados amplamente utilizada em aprendizado de máquina, com o objetivo principal de ajustar a faixa numérica dos dados para um intervalo específico, geralmente [0, 1] ou [-1, 1], ou de padronizar os dados para que tenham média 0 e desvio padrão 1.

Objetivos da Normalização

Diferentes características em um conjunto de dados podem ser medidas em escalas ou magnitude diferentes, resultando em faixas numéricas que variam significativamente.

Por exemplo, considere um conjunto de dados contendo informações sobre altura e peso, onde a altura é medida em metros (faixa [1.5, 2.0]) e o peso em quilogramas (faixa [45, 120]). Sem normalização, características com maior magnitude numérica terão influência desproporcional no modelo. Neste caso, o peso, por ter valores muito maiores que a altura, poderia causar que o algoritmo de descida de gradiente se tornasse mais sensível às variações de peso, resultando em um modelo tendencioso.

O ojbetivo da normalização é permitir que diferentes dimensões com escalas distintas trabalhem de forma协调 durante o processo de otimização, evitando que algumas dimensões convergiam muito rapidamente ou lentamente durante a descida de gradiente.

Técnicas Comuns de Normalização

Normalização Min-Max

A técnica de Min-Max escala os dados para o intervalo [0, 1], onde o valor máximo do conjunto se torna 1, o valor mínimo se torna 0, e os demais valores são linearmente escalonados com base nesses pontos extremos.

A fórmula matemática é:

X_norm = (x - x_min) / (x_max - x_min)

Onde x é o valor original, x_min é o valor mínimo do conjunto de dados, e x_max é o valor máximo.

A biblioteca scikit-learn fornece uma implementação conveniente desta técnica:

# Aplicando normalização Min-Max
from sklearn.preprocessing import MinMaxScaler
escalador_minmax = MinMaxScaler()
escalador_minmax.fit(X)
X_normalizado = escalador_minmax.transform(X)

Padronização Z-Score

A padronização Z-Score transforma os dados de modo que tenham média 0 e desvio padrão 1, resultando em uma distribuição com formato de curva normal centrada em zero.

A fórmula matemática é:

X_std = (x - μ) / σ

Onde x é o valor original, μ é a média dos dados, e σ é o desvio padrão.

A scikit-learn também oferece uma implementação direta para esta técnica:

# Aplicando padronização Z-Score
from sklearn.preprocessing import StandardScaler
escalador_zscore = StandardScaler()
escalador_zscore.fit(X)
X_padronizado = escalador_zscore.transform(X)

Exemplo Prático com Dataset Diabetes

Implementação com Min-Max

import numpy as np
from sklearn import datasets
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import MinMaxScaler

# Carregando o dataset diabetes
dataset_diabetes = datasets.load_diabetes()

# Descrição das características:
# age: idade em anos
# sex: gênero
# bmi: índice de massa corporal
# bp: pressão arterial média
# s1: colesterol sérico total
# s2: lipoproteína de baixa densidade
# s3: lipoproteína de alta densidade
# s4: razão colesterol total/HDL
# s5: logaritmo do nível de triglicerides séricos
# s6: nível de glicemia

X = dataset_diabetes.data    # características
y = dataset_diabetes.target  # variável alvo

# Dimensões do dataset
n_amostras, n_caracteristicas = X.shape

# Aplicando normalização Min-Max
processador_minmax = MinMaxScaler()
processador_minmax.fit(X)
X = processador_minmax.transform(X)

# Divisão dos dados: 80% para treinamento, 20% para teste
indices = np.arange(n_amostras)
np.random.shuffle(indices)

limite_treinamento = int(0.8 * n_amostras)
X_treinamento, y_treinamento = X[indices[:limite_treinamento]], y[indices[:limite_treinamento]]
X_teste, y_teste = X[indices[limite_treinamento:]], y[indices[limite_treinamento:]]

# Construção do modelo de regressão linear
modelo_regressao = LinearRegression(fit_intercept=True)
modelo_regressao.fit(X_treinamento, y_treinamento)

# Exibindo resultados
print("Coeficientes (W):", modelo_regressao.coef_)
print("Intercepto (b):", modelo_regressao.intercepto_)
print("Desempenho do modelo com Min-Max (quanto mais próximo de 1, melhor):", modelo_regressao.score(X_teste, y_teste))

Implementação com Z-Score

import numpy as np
from sklearn import datasets
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import StandardScaler

# Carregando o dataset diabetes
dataset_diabetes = datasets.load_diabetes()

# Descrição das características:
# age: idade em anos
# sex: gênero
# bmi: índice de massa corporal
# bp: pressão arterial média
# s1: colesterol sérico total
# s2: lipoproteína de baixa densidade
# s3: lipoproteína de alta densidade
# s4: razão colesterol total/HDL
# s5: logaritmo do nível de triglicerides séricos
# s6: nível de glicemia

X = dataset_diabetes.data    # características
y = dataset_diabetes.target  # variável alvo

# Dimensões do dataset
n_amostras, n_caracteristicas = X.shape

# Aplicando padronização Z-Score
processador_zscore = StandardScaler()
processador_zscore.fit(X)
X = processador_zscore.transform(X)

# Divisão dos dados: 80% para treinamento, 20% para teste
indices = np.arange(n_amostras)
np.random.shuffle(indices)

limite_treinamento = int(0.8 * n_amostras)
X_treinamento, y_treinamento = X[indices[:limite_treinamento]], y[indices[:limite_treinamento]]
X_teste, y_teste = X[indices[limite_treinamento:]], y[indices[limite_treinamento:]]

# Construção do modelo de regressão linear
modelo_regressao = LinearRegression(fit_intercept=True)
modelo_regressao.fit(X_treinamento, y_treinamento)

# Exibindo resultados
print("Coeficientes (W):", modelo_regressao.coef_)
print("Intercepto (b):", modelo_regressao.intercepto_)
print("Desempenho do modelo com Z-Score (quanto mais próximo de 1, melhor):", modelo_regressao.score(X_teste, y_teste))

Tags: Normalização de Dados min-max z-score pré-processamento scikit-learn

Publicado em 6-24 16:16