Trasformazione delle Variabili: Normalizzazione Min-Max

Parte (2/3)

Potrebbe interessarti:

Il progetto Python, che comprende gli script mostrati in questo post, e quelli relativi alla creazione dei grafici Matplotlib, è disponibile assieme al corso Fondamenti di Statistica per il ML.

Dimmi di Più

La Normalizzazione Min-Max (Min-Max Scaling) è una tecnica di normalizzazione che trasforma linearmente i dati originali affinché appartengano a un intervallo predefinito. L’applicazione più comune li mappa nell’intervallo $[0,1]$, ma è possibile utilizzare qualsiasi altro intervallo $[A, B]$.

Mentre lo Z-Score non ha limiti teorici (i valori possono assumere qualsiasi valore compreso tra $-\infty$ e $\infty$), la Normalizzazione Min-Max garantisce che ogni osservazione appartenga sempre all’intervallo specificato.

Nel caso più comune, in cui l’intervallo di destinazione è $[0,1]$:

  • il valore minimo della distribuzione viene trasformato in $0$;
  • il valore massimo della distribuzione viene trasformato in $1$;
  • tutti i valori intermedi vengono collocati proporzionalmente tra questi due estremi.

La normalizzazione Min-Max cambia principalmente la scala dei dati, e non cerca di correggere la forma della distribuzione. Quindi non richiede un’assunzione di normalità e, più in generale, non fa particolari assunzioni sulla forma della distribuzione dei dati.

Può essere eseguita in due fasi:

Normalizzazione nell’intervallo [0,1]

Per trasformare un valore $x$ nel corrispondente valore normalizzato $x_{\text{norm}}$, si sottrae il valore minimo e si divide per il campo di variazione della distribuzione (cioè la differenza tra valore massimo e valore minimo):

$$ x_{\text{norm}}=\frac{x-x_{\min}}{x_{\max}-x_{\min}} $$

Ad esempio, la Normalizzazione Min-Max di un dataset di valori nell’intervallo $[100, 900]$ produce il seguente risultato:

Normalizzazione Min-Max

In Python, possiamo normalizzare un campione di dati estratto da una distribuzione nel seguente modo:

import numpy as np

# per la riproducibilità
rng = np.random.default_rng(42)

# estraiamo dei campioni casuali da una distribuzione normale (gaussiana)
# com media 10 e deviazione standard 3.5
mu = 10
sigma = 3.5
x = rng.normal(loc=mu, scale=sigma, size=10_000)
np.set_printoptions(precision=2)
print("primi 5 valori x: ", x[:5])
# primi 5 valori x:  [11.07  6.36 12.63 13.29  3.17]

# Normalizzazione Min-Max nell'intervallo [0, 1]
x_norm = (x - np.min(x)) / (np.max(x) - np.min(x))
print("primi 5 valori normalizzati nel range [0, 1]: ", x_norm[:5])
# primi 5 valori normalizzati nel range [0, 1]:  [0.56 0.4  0.61 0.63 0.29]

Come la standardizzazione Z-Score, anche la Normalizzazione Min-Max è una trasformazione lineare: preserva l’ordine dei dati e le loro posizioni relative all’interno dell’intervallo. Ad esempio, un valore che si trovava esattamente a metà strada tra il minimo e il massimo continuerà a occupare la posizione centrale e assumerà il valore $0.5$ dopo la normalizzazione nell’intervallo $[0, 1]$.

Normalizzazione in un intervallo arbitrario [A, B]

Se si desidera ottenere valori compresi in un diverso intervallo, ad esempio $[-1, 1]$ oppure $[0, 100]$, è sufficiente applicare una seconda trasformazione lineare:

$$ x_{\text{scaled}}=x_{\text{norm}} \cdot (B-A)+A $$

In Python:

import numpy as np
np.set_printoptions(precision=2)

rng = np.random.default_rng(42)
mu, sigma = 10, 3.5
x = rng.normal(loc=mu, scale=sigma, size=10_000)

# Normalizzazione Min-Max nell'intervallo [-10, 10]
x_norm = (x - np.min(x)) / (np.max(x) - np.min(x))
A, B = -10, 10
x_norm2 = x_norm * (B - A) + A
print(f"primi 5 valori normalizzati nel range [{A}, {B}]: ", x_norm2[:5])
# primi 5 valori normalizzati nel range [-10, 10]:  [ 1.16 -2.04  2.22  2.67 -4.21]

Sensibilità agli Outlier

La Normalizzazione Min-Max è fortemente sensibile agli outlier. Poiché la trasformazione utilizza direttamente il valore minimo e il valore massimo del dataset, anche una singola osservazione estremamente piccola o estremamente grande può modificare significativamente l’intervallo di normalizzazione. Di conseguenza, la maggior parte dei dati può essere compressa in una porzione molto ridotta dell’intervallo $[0,1]$, perdendo parte della propria risoluzione numerica:

Normalizzazione Min-Max: Sensibilità agli Outlier

La Normalizzazione nel Machine Learning

Nel Machine Learning, la normalizzazione Min-Max viene usata soprattutto quando l’algoritmo è sensibile alla scala delle feature e può essere utile avere valori in un intervallo prefissato, tipicamente $[0, 1]$.

I casi principali riguardano le Reti Neurali, gli algoritmi di clustering come DBScan, e algoritmi che utilizzano la discesa del gradiente (in questo caso, però, spesso si preferisce la standardizzazione Z-Score).

Al contrario, la normalizzazione Min-Max è generalmente poco utile per gli alberi decisionali e per modelli derivati come Random Forest e Gradient Boosted Trees, perché le suddivisioni dell’albero vengono effettuate considerando una feature alla volta, e dipendono dall’ordinamento dei valori, non dalla loro scala.

E’ importante sottolineare che Min-Max non è necessariamente la scelta predefinita per lo scaling. Questa trasformazione è particolarmente interessante quando vogliamo esplicitamente un intervallo limitato, ad esempio $[0, 1]$.

La standardizzazione (Z-Score) è invece molto comune quando è sufficiente avere feature centrate e su scale comparabili, senza imporre limiti inferiori e superiori.

Caricamento
  • Rendering delle formule LaTeX...