ML Atlas

02 · Dane · 5 min czytania · aktualizacja

Normalizacja czy standaryzacja danych — co wybrać i czym się różnią?

W skrócie

Normalizacja min-max ściska cechę do przedziału 0–1, standaryzacja daje średnią 0 i odchylenie 1. Ważniejsze od wyboru metody jest to, by w ogóle skalować.

Co to jest

Standaryzacja (z-score) przekształca cechę tak, by miała średnią 0 i odchylenie standardowe 1: z = (x − średnia) / odchylenie; normalizacja min-max przesuwa ją do przedziału [0, 1]: x′ = (x − min) / (max − min). Domyślnie wybieraj standaryzację; min-max — gdy algorytm lub dane wymagają ograniczonego zakresu (piksele, wejścia sieci z sigmoidą); skalowanie odporne na wartości odstające (mediana i rozstęp ćwiartkowy) — gdy w danych są skrajne wartości.

W eksperymentach na zbiorach referencyjnych różnica między tymi metodami wynosi zwykle ułamek punktu procentowego, a różnica między skalowaniem a jego brakiem — kilkadziesiąt punktów. Najważniejsza decyzja to więc „skalować czy nie”, a dopiero druga — „jak”.

Uwaga na nazewnictwo: w scikit-learn klasa Normalizer robi coś zupełnie innego — skaluje każdy wiersz (przykład), a nie kolumnę, do długości 1. Normalizacja min-max to MinMaxScaler.

Mechanizm — dlaczego tak działa

Komu skala przeszkadza. Wszystkim metodom, które liczą odległości (kNN, k-średnich, SVM z jądrem RBF), mnożą cechy przez wspólnie karane wagi (regresja z regularyzacją L1 i L2) albo uczą się spadkiem gradientu (sieci neuronowe, regresja logistyczna). Cecha o zakresie tysięcy dominuje odległość i gradient nad cechą o zakresie ułamków. Drzewa decyzyjne i ich zespoły są na skalę obojętne, bo dzielą każdą cechę progiem, a próg przesuwa się razem z przekształceniem monotonicznym.

Czym różnią się metody. Obie są przekształceniami liniowymi, więc nie zmieniają kształtu rozkładu ani korelacji. Różnią się tylko tym, które statystyki wyznaczają skalę. Min-max opiera się na dwóch skrajnych punktach, czyli na najmniej stabilnych statystykach w danych. Jedna wartość odstająca ściska wszystkie pozostałe do wąskiego paska. Standaryzacja opiera się na średniej i odchyleniu, które też są wrażliwe na skrajności, ale mniej. Skalowanie odporne (RobustScaler) używa mediany i rozstępu ćwiartkowego, na które pojedyncze skrajne wartości prawie nie wpływają.

Skala a siła regularyzacji. Po min-max cechy mają małe odchylenie standardowe (w naszych trzech zbiorach mediana 0,14–0,23 zamiast 1), więc model potrzebuje większych wag, a te są mocniej karane. Ta sama wartość C w regresji logistycznej oznacza po min-max silniejszą regularyzację niż po standaryzacji. Dlatego przy zmianie skalera warto ponownie dostroić siłę kary.

Sieci neuronowe. Gradient wobec wag pierwszej warstwy jest proporcjonalny do wartości wejść. Wejścia rzędu setek dają ogromne gradienty dla jednych wag i znikome dla innych, co psuje trening przy każdym rozsądnym współczynniku uczenia. LeCun i in. (1998) zalecali wejścia o średniej bliskiej zeru i podobnej wariancji.

Gdzie liczyć statystyki. Średnią, odchylenie, minimum i maksimum liczy się tylko na danych treningowych i stosuje do walidacyjnych i testowych. Inaczej informacja z testu przecieka do modelu. W walidacji krzyżowej skaler musi być częścią potoku.

Na przykładzie

Trzy zbiory o cechach w bardzo różnych skalach: Wine (odchylenie standardowe cech od 0,124 do 314), Palmer Penguins (od 1,97 mm do 804 g) i Breast Cancer (od 0,003 do 569). Powtarzana walidacja krzyżowa 5 × 10, skaler wewnątrz potoku. Trafność:

Zbiór i modelBez skalowaniaMin-maxStandaryzacjaOdporne (mediana, IQR)
Wine, kNN0,7060,9630,9620,952
Wine, SVM (RBF)0,6830,9860,9810,979
Wine, sieć MLP0,1760,9810,9770,978
Wine, drzewo0,9050,9050,9050,905
Penguins, kNN0,7750,9850,9860,985
Penguins, regresja logistyczna0,9880,9700,9870,983
Breast Cancer, regresja logistyczna0,9510,9660,9770,979
Breast Cancer, SVM (RBF)0,9160,9770,9740,972

Bez skalowania kNN na Wine liczy w praktyce tylko różnicę proliny, a sieć MLP w ogóle się nie uczy: 0,176, gorzej niż model trywialny — nigdy nie wskazuje jednej z trzech odmian. Po dowolnym skalowaniu kNN, SVM i sieć zyskują od 6 do 80 punktów; regresja logistyczna, która przy dużej liczbie iteracji zbiega i bez skalowania, zyskuje najwyżej 2,8 punktu (Breast Cancer, skalowanie odporne; ze standaryzacją 2,6). Drzewo daje 0,905 zawsze. Między trzema skalerami różnice nie przekraczają 1,5 punktu, z jednym wyjątkiem: regresja logistyczna na pingwinach po min-max traci 1,7 punktu — to efekt silniejszej regularyzacji przy domyślnym C=1, nie wada metody.

Wartość odstająca: w Wine ustawiłem prolinę jednego wina na 20-krotność maksimum. Po min-max proliny pozostałych 177 win mieszczą się w paśmie szerokości 0,042 zamiast 1 — cecha praktycznie znika. kNN po min-max spada z 0,963 do 0,947, po standaryzacji z 0,962 do 0,954, a po skalowaniu odpornym ma 0,954 (bez wartości odstającej 0,952) — praktycznie bez zmian.

Dane: Palmer Penguins (pingwiny z Antarktydy) Breast Cancer Wisconsin (diagnostyka raka piersi) Wine (wina z Piemontu)

W praktyce

Reguła wyboru:

  • Domyślnie → standaryzacja w potoku: make_pipeline(StandardScaler(), LogisticRegression()).
  • Wartości odstające lub ciężkie ogony → RobustScaler(), a przy bardzo skośnych cechach (ceny, dochody) najpierw np.log1p albo QuantileTransformer(output_distribution="normal").
  • Potrzebny ograniczony zakres (piksele, cechy rzadkie, wejścia do warstw z sigmoidą) → MinMaxScaler(); dla danych rzadkich MaxAbsScaler(), który nie niszczy zer.
  • Drzewa, las losowy, boosting → skalowanie niepotrzebne.
  • Sieci w PyTorch → standaryzuj wejścia statystykami ze zbioru treningowego: X = (X - mu) / sd; dla obrazów transforms.Normalize(mean, std).
  • Nigdy nie wywołuj scaler.fit na całym zbiorze przed podziałem — skaler dopasowuje się tylko w Pipeline na części treningowej.

Najczęstsze pytania

Czy standaryzacja wymaga rozkładu normalnego?
Nie. Standaryzacja to tylko przesunięcie i zmiana skali; działa dla każdego rozkładu i nie zmienia jego kształtu. Rozkład skośny po standaryzacji wciąż jest skośny. Jeśli zależy Ci na kształcie zbliżonym do normalnego, potrzebne jest przekształcenie nieliniowe (logarytm, Box-Cox, Yeo-Johnson).
Czy trzeba skalować zmienną docelową?
W regresji liniowej i drzewach nie. W sieciach neuronowych przy celu o dużych wartościach (np. ceny w tysiącach) standaryzacja celu stabilizuje trening; przewidywania trzeba potem przeliczyć z powrotem. W scikit-learn robi to `TransformedTargetRegressor`.
Co ze zmiennymi zero-jedynkowymi po kodowaniu kategorii?
Można je zostawić jako 0/1 albo standaryzować razem z resztą — przy regularyzacji wpływa to na siłę kary dla rzadkich kategorii. W praktyce różnice są małe; ważne, by robić to konsekwentnie w potoku.

Źródła

  • Géron A. „Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow”, 3rd ed., O’Reilly 2022, rozdz. 2 (Feature Scaling and Transformation).
  • Kuhn M., Johnson K. „Applied Predictive Modeling”, Springer 2013, rozdz. 3 (Data Pre-processing).
  • LeCun Y., Bottou L., Orr G. B., Müller K.-R. „Efficient BackProp”, w: Neural Networks: Tricks of the Trade, Springer LNCS 1524, 1998.
  • Dokumentacja scikit-learn, „Preprocessing data”: https://scikit-learn.org/stable/modules/preprocessing.html

Zobacz też