ML Atlas

03 · Nadzorowane · 5 min czytania · aktualizacja

Współliniowość i VIF — dlaczego skorelowane cechy psują współczynniki regresji?

W skrócie

Współliniowość to sytuacja, gdy cechę da się odtworzyć z innych cech. W zbiorze Diabetes VIF cholesterolu wynosi 59,2: jego waga skacze, a prognozy nie.

Co to jest

Współliniowość (multicollinearity) to sytuacja, w której jedna cecha modelu jest prawie dokładną kombinacją liniową innych cech. Regresja nie potrafi wtedy rozstrzygnąć, której z nich przypisać wpływ, więc jej współczynniki stają się niestabilne: mają ogromne błędy standardowe, a czasem nawet odwrotny znak, niż podpowiada zdrowy rozsądek. Miarą współliniowości jest VIF (variance inflation factor, czynnik inflacji wariancji).

Intuicja: chcesz ustalić, ile do ceny mieszkania dokłada metraż, a ile liczba pokoi. Jeśli w danych każde dodatkowe 20 m² oznacza dokładnie jeden pokój więcej, obie cechy zawsze rosną razem. Wynik da się opisać jako „dużo za metraż, nic za pokoje”, „nic za metraż, dużo za pokoje” albo dowolną mieszanką — każda z nich prognozuje równie dobrze. Dane nie odróżniają tych wersji.

Mechanizm — dlaczego tak działa

kto dostaje zasługę, gdy cechy rosną razemCechy rosną razemmetrażpokojePodział wagiwszystko na metraż → ta samawszystko na pokoje → ta samapo połowie → ta sama prognozaVIF = 1 / (1 − R²)R²: jak dobrze inne cechy przewidują tę cechęWspółliniowość psuje współczynniki, nie prognozy.
Schemat: kto dostaje zasługę, gdy cechy rosną razem

Współczynnik regresji mierzy wpływ cechy przy pozostałych cechach ustalonych. Gdy cecha x_j jest prawie wyznaczona przez inne, w danych prawie nie ma przypadków, w których x_j zmienia się, a reszta stoi w miejscu. Model szacuje więc ten współczynnik z resztki informacji, która zostaje po odjęciu tego, co mówią pozostałe cechy. Mało informacji oznacza duży rozrzut oszacowania.

VIF mierzy to wprost. Regresujemy cechę x_j na wszystkich pozostałych cechach i odczytujemy współczynnik determinacji R²_j. Wtedy VIF_j = 1 / (1 − R²_j). Nazwa jest dosłowna: wariancja oszacowania współczynnika jest VIF_j razy większa, niż gdyby cecha była nieskorelowana z resztą, a błąd standardowy — √VIF_j razy większy. VIF = 1 oznacza brak współliniowości, VIF = 10 (R²_j = 0,9) — przedział ufności około 3,2 raza szerszy.

VIF widzi więcej niż macierz korelacji. Cecha może mieć umiarkowane korelacje z każdą inną z osobna, a mimo to być prawie dokładnie sumą kilku z nich. Korelacja par tego nie pokaże, regresja na wszystkich pozostałych cechach — tak. Belsley, Kuh i Welsch (1980) poszli dalej i zaproponowali wskaźniki uwarunkowania macierzy cech, które wskazują, które grupy cech są ze sobą splecione.

Najważniejsze: współliniowość psuje współczynniki, a nie prognozy. Kombinacja skorelowanych cech, która decyduje o prognozie, jest oszacowana dobrze — niepewna jest tylko jej rozbiórka na poszczególne wagi. Problem pojawia się, gdy interpretujesz współczynniki („wpływ cholesterolu”), testujesz ich istotność albo przenosisz model na dane, w których cechy przestały być skorelowane tak jak w treningu.

Gdzie to się psuje: VIF widzi tylko zależności liniowe, więc nie wykryje cechy, która jest nieliniową funkcją innej (np. x² przy x rozłożonym symetrycznie wokół zera — korelacja wynosi wtedy zero). Wszystkie kolumny kodowania one-hot razem z wyrazem wolnym są idealnie współliniowe (pułapka zmiennych fikcyjnych) i VIF wychodzi nieskończony. Przy cechach wielomianowych (x i x²) wysoki VIF jest z góry wbudowany i często nieszkodliwy — pomaga wtedy wycentrowanie x.

Na przykładzie

Zbiór Diabetes opisuje 442 pacjentów dziesięcioma cechami, w tym sześcioma pomiarami krwi: s1 to cholesterol całkowity, s2 frakcja LDL, s3 HDL, s4 stosunek cholesterolu całkowitego do HDL, s5 logarytm trójglicerydów. Cholesterol całkowity składa się m.in. z LDL i HDL, więc s1 da się odtworzyć z pozostałych cech z R² = 0,983. Jego VIF wynosi 59,2, dla s2 39,2, dla s3 15,4. Wiek, płeć, BMI i ciśnienie mają VIF 1,2–1,5. Korelacja samych s1 i s2 to 0,897 — wysoka, ale dopiero razem z s3 i s5 cholesterol całkowity staje się prawie dokładną kombinacją innych cech.

Skutek widać po losowaniu pacjentów ze zwracaniem (bootstrap). Współczynnik s1 w zwykłej regresji ma odchylenie standardowe 20,0, a jego 95% przedział sięga od −75,7 do +5,4. Współczynnik s2 w 8% losowań jest ujemny, w pozostałych dodatni. Oba skaczą w przeciwnych kierunkach: korelacja ich oszacowań wynosi −0,966, więc suma s1 + s2 ma odchylenie standardowe tylko 6,1. Dla BMI, które z niczym się nie splata, odchylenie wynosi 3,4. Regresja grzbietowa z α = 10 zmniejsza rozrzut s1 i s2 ponad trzykrotnie (do 5,7 i 5,1). Prognozy prawie się nie zmieniają: R² w walidacji krzyżowej to 0,489 dla zwykłej regresji, 0,489 dla ridge i 0,487 po usunięciu s1. Bez s1 największy VIF spada do 7,8.

Jak to policzono
  • Dane: load_diabetes(scaled=False) — 442 pacjentów, 10 cech w oryginalnych jednostkach; VIF jest niezmienny względem skalowania, scaled=True daje te same wartości.
  • VIF_j = 1 / (1 − R²_j), R²_j z LinearRegression cechy j na 9 pozostałych (z wyrazem wolnym): age 1,2; sex 1,3; bmi 1,5; bp 1,5; s1 59,2 (R² 0,983); s2 39,2 (0,974); s3 15,4 (0,935); s4 8,9; s5 10,1; s6 1,5.
  • Korelacje: s1–s2 0,897; s3–s4 −0,738. R² s1 z samych s2 i s3: 0,858; z s2, s3 i s5: 0,981.
  • Po usunięciu s1: VIF s2 2,9, s3 3,7, s4 7,8, s5 2,2, reszta ≤ 1,5.
  • Współczynniki na cechach standaryzowanych, cały zbiór: zwykła regresja s1 −37,7, s2 +22,7; Ridge(alpha=10) s1 −11,3, s2 +1,8.
  • Bootstrap: 1000 losowań ze zwracaniem, np.random.default_rng(0), standaryzacja i dopasowanie w każdym losowaniu. Odchylenie standardowe współczynnika (zwykła regresja / ridge α = 10): s1 20,0 / 5,7; s2 16,0 / 5,1; s3 10,0 / 4,3; s5 8,1 / 3,8; bmi 3,4 / 3,3. Przedział 2,5–97,5 percentyla s1: −75,7 do 5,4. Ujemny współczynnik s2 w 8,4% losowań. Korelacja oszacowań s1 i s2: −0,966; suma s1 + s2: średnio −15,1, odchylenie 6,1.
  • Prognozy: KFold(5, shuffle=True, random_state=0), potok StandardScaler → model; R² 0,489 (zwykła regresja), 0,489 (ridge α = 10), 0,487 (bez s1).
  • Hasło o ridge i lasso podaje dla s1 i s2 inne wagi (−26,5 i +12,4), bo liczy je na 331 pacjentach treningowych, a nie na całym zbiorze — to ta sama niestabilność w praktyce.

Dane: Diabetes (progresja cukrzycy)

W praktyce

  • VIF w statsmodels: variance_inflation_factor(X_const, j) z statsmodels.stats.outliers_influence; macierz musi zawierać kolumnę stałą (sm.add_constant), inaczej R² liczony jest bez wyrazu wolnego i wyniki są zniekształcone. Bez statsmodels: 1 / (1 - LinearRegression().fit(X_bez_j, x_j).score(X_bez_j, x_j)).
  • Gdy liczy się prognoza: zostaw cechy i użyj Ridge lub RidgeCV; współliniowość nie obniży wyniku walidacji.
  • Gdy liczy się interpretacja: usuń jedną z cech niosących to samo (tu s1), połącz je w jedną (sumę, średnią, stosunek) albo zastąp grupę jedną składową PCA.
  • Przy kodowaniu one-hot w modelu z wyrazem wolnym opuść jedną kategorię: OneHotEncoder(drop="first").
  • Ten sam problem dotyka innych modeli, które odwracają macierz kowariancji cech, np. LDA; tam lekarstwem jest ściąganie (shrinkage="auto").

Najczęstsze pytania

Jaki VIF jest za duży?
Nie ma jednej granicy — progi to zwyczaje, nie prawa. VIF powyżej 5 traktuje się zwykle jako sygnał ostrzegawczy, a powyżej 10 jako silną współliniowość. Ważniejsze od progu jest pytanie, czy interpretujesz współczynniki — jeśli nie, nawet VIF 50 może być nieszkodliwy.
Czy współliniowość szkodzi drzewom decyzyjnym i lasom losowym?
Prognozom nie. Cierpi za to interpretacja: ważność cechy rozkłada się między skorelowane cechy, więc każda z nich wygląda na mniej ważną, niż jest cała grupa. Dotyczy to także ważności permutacyjnej i wartości SHAP.
Czy wystarczy sprawdzić macierz korelacji?
Nie. Korelacje par wykrywają tylko splecione pary, a VIF używa wszystkich pozostałych cech naraz. W Diabetes s1 ma z s2 korelację 0,897, ale R² = 0,983 osiąga dopiero razem z innymi pomiarami krwi.
Dlaczego ridge pomaga, a lasso mniej?
Ridge rozkłada wagę między skorelowane cechy mniej więcej po równo i tym samym stabilizuje oszacowania. Lasso z grupy silnie skorelowanych cech wybiera zwykle jedną, a która to będzie, potrafi zmieniać się między próbami — prognoza jest stabilna, wybór cech już nie.
Jak sprawdzić współliniowość cech kategorycznych?
VIF liczy się dla kolumn po zakodowaniu, a dla całej cechy kategorycznej stosuje się uogólniony VIF (GVIF, Fox i Monette, 1992). Prostszy pierwszy krok to tabela kontyngencji par cech i V Cramera z testu chi-kwadrat: wartość bliska 1 oznacza, że jedna cecha prawie wyznacza drugą.

Źródła

Zobacz też