ML Atlas

05 · Bez nadzoru · 4 min czytania · Interaktywne · aktualizacja

Jakie są najczęstsze błędy przy stosowaniu PCA?

W skrócie

PCA łatwo zepsuć: brak standaryzacji, mylenie wariancji z ważnością, wyciek danych, nadinterpretacja ładunków i liniowość tam, gdzie struktura jest zakrzywiona.

Co to jest

Pułapki PCA to sytuacje, w których analiza głównych składowych liczy się poprawnie, ale prowadzi do błędnych wniosków lub gorszego modelu. PCA odpowiada na jedno, bardzo konkretne pytanie: wzdłuż jakich prostopadłych kierunków dane mają największą wariancję? Kłopoty zaczynają się, gdy ktoś traktuje tę odpowiedź jak odpowiedź na inne pytanie — „które cechy są ważne?”, „co odróżnia klasy?”, „jak naprawdę wygląda struktura danych?”.

Mechanizm — dlaczego tak działa

Skala zamiast treści. Wariancja zależy od jednostek. Cecha mierzona w setkach ma wariancję dziesiątki tysięcy razy większą niż cecha mierzona w ułamkach, więc pierwsza składowa po prostu ją kopiuje. To nie jest odkrycie, tylko artefakt jednostek. Standaryzacja (PCA na macierzy korelacji) zrównuje cechy, ale to też decyzja: zakłada, że każda cecha zasługuje na równy głos.

Wariancja to nie ważność. PCA nie zna celu. Jeśli różnica między klasami leży wzdłuż kierunku o małej wariancji, PCA ją wytnie jako „szum”. Przykład skrajny: dwie wydłużone, równoległe chmury punktów — największa wariancja jest wzdłuż chmur, a separacja w poprzek. Metody nadzorowane (np. LDA) szukają kierunków rozdzielających klasy, a nie rozrzucających dane.

Liniowość. Składowe to proste osie. Dane leżące na zakrzywionej rozmaitości — zwiniętej wstędze, okręgu, zbiorze obrazów cyfr — wymagają wielu składowych, a dwuwymiarowy rzut PCA potrafi nałożyć na siebie zupełnie różne obiekty. Do wizualizacji takich danych lepiej nadają się t-SNE lub UMAP, do kompresji — autoenkodery.

Wyciek danych. Dopasowanie PCA na całym zbiorze przed podziałem na trening i test sprawia, że kierunki „widziały” dane testowe. Efekt bywa mały, ale wynik walidacji jest wtedy optymistycznie zawyżony. PCA powinno być krokiem potoku dopasowywanym w każdej fałdzie osobno.

Nadinterpretacja ładunków. Znak składowej jest arbitralny (w i −w opisują tę samą oś) i potrafi się odwrócić między wersjami biblioteki. Gdy dwie wartości własne są prawie równe, odpowiadające im osie są niestabilne — mała zmiana danych obraca je dowolnie w płaszczyźnie. Nazywanie składowych („oś zamożności”) wymaga sprawdzenia ich stabilności, np. bootstrapem.

Wartości odstające. Wariancja liczy kwadraty odchyleń, więc kilka skrajnych punktów potrafi przekręcić pierwszą składową w swoją stronę.

Na przykładzie

Zbiór Wine: 178 win, 13 cech, trzy odmiany. Bez standaryzacji pierwsza składowa wyjaśnia 99,8% wariancji — i ma ładunek 1,00 przy prolinie. Powód: odchylenie standardowe proliny to ok. 314, a następnej w kolejności cechy (magnezu) ok. 14. „PCA” zredukowało się do wybrania jednej kolumny. Regresja logistyczna na dwóch takich składowych trafia odmianę w 68,1% przypadków (5-krotna walidacja krzyżowa), a na dwóch składowych po standaryzacji — w 95,5%.

Wariancja a przydatność: po standaryzacji pierwsza składowa sama daje 84,9% trafności, ale już trzecia, czwarta czy piąta — po ok. 31–44%, czyli w okolicy zgadywania najliczniejszej klasy (40%). Z kolei nadzorowana analiza dyskryminacyjna (LDA) z dwiema osiami daje 98,3% — tyle samo co wszystkie 13 cech. Liniowość: na zbiorze Digits (1797 obrazów 8×8, 64 piksele) dwie składowe PCA wyjaśniają tylko 28,5% wariancji, a klasyfikator 5 najbliższych sąsiadów na tym rzucie trafia cyfrę w 60,3% przypadków, wobec 96,3% na pełnych 64 pikselach.

Ta ilustracja działa w przeglądarce z włączonym JavaScriptem: PCA na 13 cechach win: bez standaryzacji PC1 wyjaśnia 99,8% wariancji i jest w zasadzie proliną, ze standaryzacją odmiany wyraźnie się rozdzielają.

Dane: Wine (wina z Piemontu) Digits (ręcznie pisane cyfry 8×8)

W praktyce

  • Standaryzuj (StandardScaler) przed PCA, chyba że wszystkie cechy mają wspólną, porównywalną jednostkę.
  • Zawsze w potoku: make_pipeline(StandardScaler(), PCA(...), model) i dopiero to do cross_val_score.
  • Liczbę składowych traktuj jak hiperparametr, gdy PCA jest krokiem przed modelem — nie wybieraj jej tylko po „95% wariancji”.
  • Gdy celem jest rozdzielenie klas, porównaj z LinearDiscriminantAnalysis albo z modelem na pełnych cechach.
  • Sprawdź, czy pierwszej składowej nie ciągnie kilka skrajnych punktów; rozważ odporną kowariancję (MinCovDet, potem jej wektory własne) albo usunięcie skrajnych punktów po sprawdzeniu.
  • Nie porównuj znaków składowych między modelami; porównuj kąty między podprzestrzeniami albo moduły ładunków.

Najczęstsze pytania

Czy PCA poprawia dokładność modelu?
Czasem tak — przy wielu współliniowych cechach i małej próbie, bo zmniejsza wariancję estymatora. Często jednak pogarsza, bo usuwa kierunki o małej wariancji, które mogą rozdzielać klasy. Modele drzewiaste zwykle na PCA tracą, bo obrócone osie mieszają czytelne progi na pojedynczych cechach.
Dlaczego wyniki PCA mają odwrócone znaki w innym programie?
Bo wektor własny jest określony tylko z dokładnością do znaku: w i −w opisują tę samą oś. Różne implementacje i wersje bibliotek wybierają znak inaczej. Interpretuj względne znaki ładunków w obrębie jednej składowej, nie ich bezwzględny kierunek.
Kiedy PCA się nie nadaje?
Gdy struktura danych jest nieliniowa (zakrzywiona rozmaitość), gdy interesuje cię separacja klas, a nie wariancja, gdy cechy są kategoryczne albo gdy potrzebujesz interpretowalnych, oryginalnych zmiennych zamiast ich kombinacji.

Źródła

  • Jolliffe I. T., „Principal Component Analysis”, 2nd ed., Springer 2002.
  • Jolliffe I. T., Cadima J., „Principal component analysis: a review and recent developments”, Philosophical Transactions of the Royal Society A 374, 2016.
  • James G., Witten D., Hastie T., Tibshirani R., „An Introduction to Statistical Learning”, 2nd ed., Springer 2021, rozdz. 12.2.
  • Hastie T., Tibshirani R., Friedman J., „The Elements of Statistical Learning”, 2nd ed., Springer 2009, rozdz. 4.3 (Linear Discriminant Analysis) i 14.5.1 (Principal Components).
  • Dokumentacja scikit-learn, „Decomposing signals in components”: https://scikit-learn.org/stable/modules/decomposition.html

Zobacz też