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
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);LinearRegressionz 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 albostatsmodelsQuantReg; nieliniowo:GradientBoostingRegressor(loss="quantile", alpha=0.9), w LightGBMobjective="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
- Koenker, R., Bassett, G. (1978). „Regression quantiles”. Econometrica, 46(1), 33–50. https://doi.org/10.2307/1913643
- Romano, Y., Patterson, E., Candès, E. J. (2019). „Conformalized quantile regression”. Advances in Neural Information Processing Systems 32, 3543–3553. arXiv:1905.03222. https://arxiv.org/abs/1905.03222
- Chernozhukov, V., Fernández-Val, I., Galichon, A. (2010). „Quantile and probability curves without crossing”. Econometrica, 78(3), 1093–1125. https://doi.org/10.3982/ECTA7880
- Efron, B., Hastie, T., Johnstone, I., Tibshirani, R. (2004). „Least angle regression”. Annals of Statistics, 32(2), 407–499. https://doi.org/10.1214/009053604000000067
- scikit-learn: dokumentacja
QuantileRegressor. https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.QuantileRegressor.html
Czy to było pomocne?
Dzięki! To pomaga nam poprawiać Atlas.
Zobacz też
Na blogu: Tydzień w ML: pandas 3.1, Timestral, konkurs Name That LLM