ML Atlas

03 · Nadzorowane · 5 min czytania · aktualizacja

Regresja kwantylowa — jak przewidywać przedziały, a nie tylko średnią?

W skrócie

Regresja kwantylowa przewiduje wybrany kwantyl, np. 0,05 i 0,95, zamiast średniej. Na danych o cukrzycy taki przedział objął 87,3% nowych pacjentów.

Co to jest

Zwykła regresja przewiduje średnią: „pacjent o takich wynikach badań będzie miał przeciętnie taki wynik”. Regresja kwantylowa przewiduje wybrany kwantyl rozkładu wyniku. Kwantyl 0,5 to mediana, kwantyl 0,95 to wartość, poniżej której wynik powinien się znaleźć w 95% przypadków. Dwa modele, dla kwantyli 0,05 i 0,95, dają razem przedział przewidywania, który ma obejmować 90% nowych obserwacji.

Metodę opisali Roger Koenker i Gilbert Bassett w 1978 roku. Zamiast błędu kwadratowego minimalizuje się stratę kwantylową (pinball loss). Model może być liniowy, ale tę samą stratę przyjmują też drzewa wzmacniane gradientowo i sieci neuronowe.

Przedziały z regresji kwantylowej mogą być węższe tam, gdzie wynik jest przewidywalny, i szersze tam, gdzie rozrzut jest duży. Zwykła regresja z przedziałem ± stała szerokość tego nie potrafi.

Mechanizm — dlaczego tak działa

kwantyle zamiast średniejkwantyl 0,95medianakwantyl 0,05strata dlaτ = 0,9za wysokoza nisko: drożejPrzedział między kwantylami jest szerszy tam,gdzie wyniki bardziej się rozrzucają.
Schemat: kwantyle zamiast średniej

Strata kwantylowa dla kwantyla τ i reszty u = y − q wynosi τ·u, gdy u ≥ 0 (przewidywanie za niskie), oraz (τ − 1)·u, gdy u < 0 (za wysokie). Dla τ = 0,9 niedoszacowanie kosztuje 0,9 za jednostkę, a przeszacowanie tylko 0,1. Opłaca się więc przewidywać wysoko — ale nie za wysoko.

Dlaczego minimum wypada akurat w kwantylu? Przesuńmy przewidywanie q o mały krok w górę. Każda obserwacja poniżej q dokłada (1 − τ) do straty, każda powyżej odejmuje τ. Pochodna oczekiwanej straty to więc P(Y < q) − τ. Zeruje się, gdy P(Y < q) = τ, czyli dokładnie w kwantylu τ. Dla τ = 0,5 strata jest połową błędu bezwzględnego, a minimum wypada w medianie.

W regresji liniowej q zależy od cech: q(x) = w·x + b. Minimalizacja sumy strat kwantylowych to zadanie programowania liniowego, które rozwiązuje się dokładnie (w scikit-learn solver HiGHS). Każdy kwantyl ma osobny model, z własnymi współczynnikami.

Gdzie to się psuje. Modele dla różnych τ uczy się niezależnie, więc mogą się przeciąć: dla niektórych x kwantyl 0,05 wypada powyżej mediany. To błąd logiczny; prosta naprawa to posortowanie przewidywań w każdym punkcie (Chernozhukov, Fernández-Val i Galichon, 2010). Druga słabość: na danych treningowych przedział z konstrukcji obejmuje co najmniej deklarowaną część punktów, ale na nowych zwykle mniej, bo model dopasował się do szumu. Tu pomaga predykcja konformalna. Wariant zwany CQR (Romano, Patterson i Candès, 2019) poszerza przedziały kwantylowe o poprawkę z osobnego zbioru kalibracyjnego. Daje to gwarancję pokrycia co najmniej 1 − α, jeśli dane są wymienialne (np. losowane niezależnie z tego samego rozkładu).

Na przykładzie

Najpierw ręcznie. Weźmy 7 pierwszych wartości z danych o cukrzycy: 151, 75, 141, 206, 135, 97, 138. Liczymy stratę kwantylową dla każdego q od 0 do 400 co 0,5. Dla τ = 0,5 minimum wypada w q = 138 — w medianie — ze stratą 13,64. Średnia (134,71) daje stratę 13,92, czyli większą. Dla τ = 0,75 minimum to 151 (szósta wartość po posortowaniu), dla τ = 0,9 — 206, największa wartość. To dokładnie kwantyle próby.

Teraz dane load_diabetes ze scikit-learn: 442 pacjentów, 10 cech (wiek, płeć, BMI, ciśnienie, sześć wyników badań krwi), wynik to miara postępu choroby po roku. Dzielimy dane losowo 70/30 i powtarzamy to 20 razy. Liniowa regresja kwantylowa dla τ = 0,05 i 0,95 daje przedział, który na danych treningowych obejmuje średnio 93,4% pacjentów, w tym 22 leżących dokładnie na jego granicach (rozwiązanie programu liniowego przechodzi przez 11 punktów na każdej granicy). Na danych testowych tylko 87,3% (od 79,0% do 90,2%). To typowy optymizm dopasowania.

Przedział nie ma stałej szerokości. W jednym z podziałów 10% przedziałów ma poniżej 141,2 punktu szerokości, a 10% powyżej 209,2. Szerokość rośnie z przewidywaną medianą (korelacja 0,61). Dla trzeciej części pacjentów z najniższą przewidywaną medianą (średnio 99,5) przedział ma średnio 152,1 punktu, dla trzeciej części z najwyższą (219,1) — 188,8. Rozrzut wyniku jest większy u pacjentów z gorszym rokowaniem.

Porównanie metod na tych samych 20 podziałach (pokrycie testowe, średnia szerokość):

  • liniowa regresja kwantylowa: 87,3%, 170,4;
  • wzmacnianie gradientowe ze stratą kwantylową: 85,3%, 187,0;
  • zwykła regresja liniowa ± 1,645 odchylenia reszt: 89,0%, 178,5;
  • CQR (połowa treningu do dopasowania, połowa do kalibracji): 91,4%, 199,0.

Tylko CQR przekracza 90% — kosztem szerszych przedziałów. Na tych danych prosty przedział z rozkładu normalnego też wypadł nieźle, bo rozrzut zmienia się umiarkowanie. Kwantyle się przecinały: w modelu liniowym średnio 1,0% punktów testowych (najwięcej 3,8%) miało kwantyl 0,05 powyżej mediany albo medianę powyżej kwantyla 0,95; w drzewach 0,2%.

Jak to policzono
  • Dane: sklearn.datasets.load_diabetes(return_X_y=True) — 442 obserwacje, 10 cech (wyskalowanych w pakiecie), wynik od 25 do 346, średnia 152,13. Źródło danych: Efron i in. (2004).
  • Ręcznie: y[0:7] = 151, 75, 141, 206, 135, 97, 138; siatka q od 0 do 400 co 0,5; strata średnia z max(τ·u, (τ − 1)·u). Minimum: τ = 0,5 → 138 (strata 13,643); τ = 0,75 → 151 (11,929); τ = 0,9 → 206 (7,129). Strata τ = 0,5 w średniej 134,71: 13,918. Zgodne z numpy.quantile(…, method="inverted_cdf").
  • Podziały: train_test_split(test_size=0.3, random_state=0…19), 309 treningowych i 133 testowe. Modele: QuantileRegressor(quantile=τ, alpha=0, solver="highs") dla τ = 0,05; 0,5; 0,95; GradientBoostingRegressor(loss="quantile", alpha=τ, n_estimators=200, max_depth=2, learning_rate=0.05, random_state=0); LinearRegression z przedziałem ± 1,645·s, s² = suma kwadratów reszt / (n − 11).
  • CQR: trening dzielony train_test_split(test_size=0.5, random_state=ziarno); wyniki zgodności E = max(q̂₀,₀₅ − y, y − q̂₀,₉₅) na zbiorze kalibracyjnym; poprawka = ⌈(n + 1)·0,9⌉-ta najmniejsza wartość E.
  • Pokrycie testowe, średnia (odch. std.; min–maks): kwantylowa liniowa 0,873 (0,025; 0,790–0,902); drzewa 0,853 (0,042; 0,782–0,917); MNK ± 1,645 s 0,890 (0,024; 0,857–0,970); CQR 0,914 (0,032; 0,850–0,970). Średnia szerokość: 170,4; 187,0; 178,5; 199,0. Pokrycie treningowe kwantylowej liniowej, licząc punkty na granicach (|y − q̂| < 10⁻⁶) jako objęte: 0,934 (0,926–0,942); na każdej granicy leży 11 punktów treningowych, bez nich 0,863. Surowe porównanie liczb zmiennoprzecinkowych daje wynik pośredni (tu 0,907), zależny od błędów zaokrągleń. Strata kwantylowa τ = 0,95 na teście: liniowa 5,69, drzewa 6,82.
  • Szerokość, podział random_state=0: percentyle 10/50/90 — 141,2; 173,4; 209,2; korelacja z przewidywaną medianą 0,61; tercyle przewidywanej mediany: niski 152,1 (mediana 99,5), wysoki 188,8 (219,1).
  • Przecięcia (q̂₀,₀₅ > q̂₀,₅ lub q̂₀,₅ > q̂₀,₉₅): liniowa średnio 0,98% punktów testowych (maks. 3,76%), drzewa 0,19% (maks. 0,75%).
  • Python 3.13, scikit-learn 1.9.1, numpy 2.5.3, scipy 1.18.1.

Dane: Diabetes (progresja cukrzycy)

W praktyce

  • Liniowo: QuantileRegressor(quantile=0.9, alpha=0, solver="highs") w scikit-learn albo statsmodels QuantReg; nieliniowo: GradientBoostingRegressor(loss="quantile", alpha=0.9), w LightGBM objective="quantile".
  • Sprawdzaj pokrycie na danych testowych, nie treningowych. W przykładzie różnica wyniosła 6,2 punktu procentowego.
  • Gdy potrzebna jest gwarancja pokrycia, dołóż kalibrację konformalną (CQR) — kosztuje część danych i szersze przedziały.
  • Przecięte kwantyle napraw sortowaniem przewidywań w każdym punkcie albo ucz wszystkie kwantyle jednym modelem z ograniczeniem kolejności.
  • Skrajne kwantyle (0,01, 0,99) wymagają dużo danych: przy 309 obserwacjach powyżej kwantyla 0,99 leżą średnio 3 punkty.
  • Gdzie się psuje: zmiana rozkładu danych (inny szpital, inny rok) unieważnia pokrycie każdej z tych metod; pokrycie jest średnie po wszystkich przypadkach, a w podgrupach może być dużo gorsze.

Najczęstsze pytania

Czym różni się przedział przewidywania od przedziału ufności?
Przedział ufności dotyczy parametru, np. średniego wyniku dla takich pacjentów, i zwęża się z liczbą danych. Przedział przewidywania dotyczy pojedynczego nowego wyniku i nie spadnie poniżej naturalnego rozrzutu, nawet przy milionie obserwacji. Regresja kwantylowa daje ten drugi.
Dlaczego mediana, a nie średnia?
Mediana jest odporna na wartości odstające: jedna skrajna obserwacja przesuwa średnią, a medianę prawie wcale. W przykładzie z siedmioma liczbami mediana (138) i średnia (134,71) są blisko, ale przy rozkładzie skośnym, jak dochody czy czasy oczekiwania, mogą się mocno różnić.
Czy regresja kwantylowa zastępuje predykcję konformalną?
Nie, uzupełniają się. Kwantyle dają przedziały o zmiennej szerokości, ale bez gwarancji pokrycia na nowych danych. Predykcja konformalna daje gwarancję, ale sama z siebie często stałą szerokość. CQR łączy obie zalety.
Co oznaczają przecinające się kwantyle?
Że modele uczone osobno dla różnych τ nie zgadzają się ze sobą. Zwykle zdarza się to w rzadkich obszarach danych, gdzie modele ekstrapolują. Sortowanie przewidywań usuwa sprzeczność, a według Chernozhukova i współautorów posortowana krzywa nie jest dalej od prawdziwej krzywej kwantyli niż przed sortowaniem.

Źródła

Zobacz też

Predykcja konformalnaPredykcja konformalna ustala szerokość przedziału z błędów na odłożonych danych. Na zbiorze Diabetes przedział 90% pokrył średnio 90,4% pacjentów.Funkcja straty (loss) InteraktywneFunkcja straty mierzy jedną liczbą, jak bardzo przewidywania odbiegają od prawdy; trening ją minimalizuje. Na irysach strata hinge daje 16 wektorów nośnych.Regresja liniowa InteraktywneRegresja liniowa przewiduje liczbę jako ważoną sumę cech plus stałą. Na danych Diabetes sam BMI wyjaśnia R² = 0,34 zmienności, 10 cech — 0,36 na teście.Metryki regresji: MAE, RMSE, R² InteraktywneMAE mierzy przeciętny błąd, RMSE mocniej karze duże pomyłki, a R² mówi, jaką część zmienności model wyjaśnia. Na zbiorze Diabetes regresja liniowa ma R² = 0,36.Wzmacnianie gradientowe InteraktywneWzmacnianie gradientowe dodaje płytkie drzewa, a każde poprawia błędy sumy poprzednich. Na danych Diabetes błąd testowy jest najniższy, 4120, przy 34 drzewach.Analiza reszt InteraktywneReszty to różnice między wartością prawdziwą a przewidywaną. Ich wykres ujawnia nieliniowość, punkty wpływowe i zmienny rozrzut, których metryki nie pokażą.Przedział ufności InteraktywnePrzedział ufności to zakres wyliczony z próby metodą, która w 95% powtórzeń obejmuje prawdziwy parametr. Pokazuje, jak dokładny jest wynik.Wykrywanie wartości odstających InteraktywneWartość odstająca to obserwacja daleka od reszty: błąd albo rzadki, prawdziwy przypadek. W danych Diabetes z-score powyżej 3 oznacza 2 pacjentów, reguła IQR 3.

Na blogu: Tydzień w ML: pandas 3.1, Timestral, konkurs Name That LLM