03 · Nadzorowane · 5 min czytania · aktualizacja
Na czym polega regresja procesem gaussowskim i skąd bierze się jej pasmo niepewności?
W skrócie
Proces gaussowski przewiduje wartość razem z niepewnością. Na pingwinach Palmer pasmo 95% objęło 96 ze 103 ptaków testowych i rośnie poza zakresem danych.
Co to jest
Regresja procesem gaussowskim (Gaussian process regression, GPR) to metoda bayesowska, która zamiast szukać jednego zestawu parametrów modelu zakłada rozkład prawdopodobieństwa nad całymi funkcjami. Zanim zobaczymy dane, mówimy tylko, jak gładkie i jak duże mogą być funkcje. Po obejrzeniu danych zostają te funkcje, które dobrze je tłumaczą.
Wynikiem nie jest pojedyncza krzywa, tylko dwie rzeczy w każdym punkcie: średnia przewidywań i ich odchylenie standardowe. Tam, gdzie danych jest dużo, pasmo niepewności jest wąskie. Tam, gdzie danych brak, wraca do szerokości wynikającej z założeń. To odróżnia GPR od zwykłej regresji, która równie pewnie odpowiada w środku danych i daleko poza nimi.
Proces gaussowski to zbiór zmiennych losowych, z których każda skończona grupa ma łączny rozkład normalny. W praktyce wystarczą dwie funkcje: średnia (zwykle zero albo stała) i jądro k(x, x′), które mówi, jak silnie skorelowane są wartości funkcji w dwóch punktach.
Mechanizm — dlaczego tak działa
Najpopularniejsze jądro to RBF (kwadratowo-wykładnicze): k(x, x′) = σ² · exp(−(x − x′)² / (2ℓ²)). Wariancja σ² ustala, jak daleko funkcja odchodzi od średniej. Skala długości ℓ mówi, na jaką odległość punkty jeszcze „wiedzą” o sobie: dwa punkty oddalone o dużo mniej niż ℓ mają prawie tę samą wartość, oddalone o kilka ℓ — praktycznie niezależne. Do tego dodaje się jądro białego szumu (WhiteKernel), czyli wariancję σ²_n błędu pomiaru, niezależną w każdym punkcie.
Ponieważ wszystko jest normalne, rozkład a posteriori liczy się wzorem, bez próbkowania. Dla n punktów treningowych budujemy macierz K o rozmiarze n × n z wartości jądra i dodajemy σ²_n na przekątnej. Średnia w nowym punkcie x to kᵀ(K + σ²_n I)⁻¹y, a wariancja to k(x, x) − kᵀ(K + σ²_n I)⁻¹k, gdzie k to wektor podobieństw x do punktów treningowych. Drugi wzór wyjaśnia pasmo: od wariancji a priori odejmujemy tyle, ile „wiedzą” bliscy sąsiedzi. Daleko od danych k* jest bliskie zeru, więc nic się nie odejmuje i niepewność wraca do σ².
Hiperparametry (σ², ℓ, σ²_n) dobiera się, maksymalizując brzegową wiarygodność p(y | X), czyli prawdopodobieństwo danych uśrednione po wszystkich funkcjach z rozkładu a priori. Jej logarytm ma składnik dopasowania i karę za złożoność, więc sam równoważy zbyt gładkie i zbyt pofalowane funkcje — bez osobnego zbioru walidacyjnego.
Cena: rozkład Cholesky’ego macierzy n × n kosztuje rzędu n³ operacji, a pamięć rośnie jak n². Kilka tysięcy punktów to rozsądny pułap zwykłej implementacji; większe zbiory wymagają przybliżeń (punkty indukujące, losowe cechy).
Na przykładzie
Dane rzeczywiste: masa ciała pingwinów Palmer w funkcji długości płetwy. Z 342 ptaków 239 trafia do uczenia, 103 do testu. Dopasowana skala długości wynosi 34,5 mm, a odchylenie szumu około 369 g — masa przy tej samej płetwie naprawdę się różni, bo w danych są trzy gatunki i dwie płcie. Błąd średniokwadratowy na teście to 396,8 g, niewiele mniej niż regresja liniowa (406,6 g); zależność jest prawie liniowa. Ważniejsze jest pasmo: przedział średnia ± 1,96 odchylenia objął 96 ze 103 ptaków testowych (93,2%, cel 95%).
Jak pasmo się rozszerza? Niepewność samej krzywej (bez szumu pomiaru) wynosi 37 g przy płetwie 200 mm, 96 g na skraju danych (231 mm), 213 g przy 240 mm i 1169 g przy 300 mm. Średnia daleko poza danymi wraca w stronę średniej z treningu (4208 g): przy 300 mm model przewiduje 4469 g, choć trend sugerowałby dużo więcej. GPR z jądrem RBF nie ekstrapoluje trendu — mówi tylko, że nie wie.
Skala długości narzucona z góry psuje wynik. Przy ℓ = 1 mm logarytm brzegowej wiarygodności spada z −155,7 do −199,0, błąd rośnie do 438,8 g, a pokrycie spada do 89,3%. Przy ℓ = 300 mm spadek jest mały (−162,6), bo na tych danych prawie prosta też pasuje.
Wyraźniej widać to na funkcji sztucznej sin x + 0,3x z szumem o odchyleniu 0,3 (40 punktów na przedziale od 0 do 10). Dopasowanie znajduje ℓ = 1,83 i szum 0,33, błąd względem prawdziwej funkcji 0,178, pokrycie nowych obserwacji 96,0%. Przy ℓ = 0,1 krzywa między punktami wraca do średniej, błąd rośnie do 0,625, a pasmo staje się tak szerokie, że obejmuje 99,5% punktów. Przy ℓ = 10 w obrębie danych jest nieźle (0,217), ale poza nimi model wariuje: w x = 15 przewiduje −37,0 przy prawdziwej wartości 5,15. Nawet dobrze dopasowany model myli się tam (1,90 przy odchyleniu 1,44) — prawda leży poza jego pasmem 95%.
Jak to policzono
- Pingwiny:
data/raw/penguins.csv, 342 ptaki z kompletną długością płetwy i masą.train_test_split(test_size=0.3, random_state=0): 239 i 103. GaussianProcessRegressor(ConstantKernel(1.0) * RBF(10.0, length_scale_bounds=(0.1, 1000)) + WhiteKernel(0.1), normalize_y=True, n_restarts_optimizer=5, random_state=0), scikit-learn 1.9.1, NumPy 2.5.3, SciPy 1.18.1.- Wynik: 1,47² · RBF(ℓ = 34,5) + WhiteKernel(0,200) na znormalizowanym y; odchylenie szumu 0,447 · 824,2 g ≈ 369 g; log brzegowej wiarygodności −155,7. RMSE na teście 396,8 g (
LinearRegression406,6 g); pokrycie 96/103 = 0,932; średnia szerokość pasma 1453 g. - Odchylenie krzywej bez szumu (Cholesky z jądra bez WhiteKernel): 200 mm — 37 g, 231 mm — 96 g, 240 mm — 213 g, 250 mm — 404 g, 270 mm — 837 g, 300 mm — 1169 g. Średnia przewidywań przy 300 mm: 4469 g; odchylenie przewidywań z szumem: 370 g przy 200 mm, 1225 g przy 300 mm.
- Stała ℓ (
length_scale_bounds="fixed", reszta dopasowana): ℓ = 0,3 — LML −224,1, RMSE 444,7 g, pokrycie 0,903; ℓ = 1 — −199,0, 438,8 g, 0,893; ℓ = 300 — −162,6, 399,5 g, 0,932. - Funkcja sztuczna:
numpy.random.default_rng(0), 40 punktów x ~ U(0, 10), y = sin x + 0,3x + N(0; 0,3²); test: 201 punktów siatki z nowym szumem. Dopasowane: 1,23² · RBF(1,83) + WhiteKernel(0,0837), LML −20,8, RMSE względem f 0,178, pokrycie 0,960. ℓ = 0,1: LML −46,6, RMSE 0,625, pokrycie 0,995; ℓ = 10: LML −42,2, RMSE 0,217, pokrycie 0,970, w x = 15 średnia −37,03 (odch. 13,13). Model dopasowany w x = 15: 1,90 (odch. 1,44), prawda 5,15. - Skrypty:
gp.py,gp2.py.
Dane: Palmer Penguins (pingwiny z Antarktydy)
W praktyce
- W scikit-learn:
GaussianProcessRegressor(kernel=C() * RBF() + WhiteKernel(), normalize_y=True, n_restarts_optimizer=5). BezWhiteKernel(alboalpha) model zakłada dane bez szumu i przechodzi przez każdy punkt. - Standaryzuj cechy albo używaj osobnej skali długości dla każdej cechy (
RBF(length_scale=[1.0] * d)), inaczej jedna skala pasuje do żadnej. - Ustaw kilka restartów optymalizatora: brzegowa wiarygodność miewa wiele maksimów, np. „gładka krzywa + duży szum” i „pofalowana krzywa + mały szum”.
- Gdzie to się psuje: ponad kilka tysięcy punktów (koszt n³), wiele cech (odległości tracą sens), ekstrapolacja trendu (RBF wraca do średniej) i szum zależny od x — wtedy pasmo jest za wąskie w jednych miejscach i za szerokie w innych.
- Pasmo jest tak dobre jak założenia. Sprawdzaj pokrycie na zbiorze testowym; gdy potrzebna jest gwarancja, rozważ predykcję konformalną.
- Typowe zastosowania: mała liczba drogich pomiarów, optymalizacja bayesowska hiperparametrów, interpolacja przestrzenna (kriging).
Najczęstsze pytania
- Czym proces gaussowski różni się od regresji jądrowej grzbietowej?
- Średnia przewidywań GPR jest dokładnie taka sama jak w kernel ridge regression z tym samym jądrem i karą równą wariancji szumu. GPR dodaje do tego wariancję przewidywań i sposób doboru hiperparametrów przez brzegową wiarygodność.
- Dlaczego pasmo niepewności rośnie z dala od danych?
- Bo wariancja a posteriori to wariancja a priori minus to, co wnoszą bliskie punkty treningowe. Gdy wszystkie punkty są dalej niż kilka skal długości, ich wkład znika i zostaje pełna niepewność z założeń.
- Czy pasmo 95% zawsze obejmuje 95% nowych punktów?
- Nie. Obejmuje tyle tylko wtedy, gdy założenia są trafne: szum normalny o stałej wariancji i odpowiednie jądro. Na pingwinach wyszło 93,2%, a poza zakresem danych prawdziwa wartość potrafi leżeć poza pasmem.
- Kiedy GPR jest za wolny?
- Gdy punktów jest więcej niż kilka tysięcy. Odwrócenie macierzy n × n kosztuje rzędu n³ operacji, więc dziesięć razy więcej danych to około tysiąc razy dłuższe dopasowanie. Wtedy stosuje się przybliżenia albo inny model.
Źródła
- Rasmussen, C. E., Williams, C. K. I. (2006). Gaussian Processes for Machine Learning. MIT Press, ISBN 978-0-262-18253-9; rozdz. 2 (regresja, algorytm 2.1) i 5 (brzegowa wiarygodność). https://gaussianprocess.org/gpml/
- scikit-learn: „Gaussian Processes” (podręcznik użytkownika,
GaussianProcessRegressor,RBF,WhiteKernel). https://scikit-learn.org/stable/modules/gaussian_process.html - Horst, A. M., Hill, A. P., Gorman, K. B. (2020). palmerpenguins: Palmer Archipelago (Antarctica) penguin data. https://allisonhorst.github.io/palmerpenguins/
Czy to było pomocne?
Dzięki! To pomaga nam poprawiać Atlas.