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
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=Truedaje te same wartości. - VIF_j = 1 / (1 − R²_j), R²_j z
LinearRegressioncechy 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), potokStandardScaler→ 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)zstatsmodels.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
RidgelubRidgeCV; 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
- Belsley D. A., Kuh E., Welsch R. E. „Regression Diagnostics: Identifying Influential Data and Sources of Collinearity”, Wiley, 1980.
- Hoerl A. E., Kennard R. W. „Ridge Regression: Biased Estimation for Nonorthogonal Problems”, Technometrics 12(1), 1970, s. 55–67. https://doi.org/10.1080/00401706.1970.10488634
- Fox J., Monette G. „Generalized Collinearity Diagnostics”, Journal of the American Statistical Association 87(417), 1992, s. 178–183. https://doi.org/10.1080/01621459.1992.10475190
- Efron B., Hastie T., Johnstone I., Tibshirani R. „Least Angle Regression”, Annals of Statistics 32(2), 2004, s. 407–499 (źródło zbioru Diabetes). https://doi.org/10.1214/009053604000000067
- James G., Witten D., Hastie T., Tibshirani R. „An Introduction to Statistical Learning”, 2nd ed., Springer, 2021, rozdz. 3.3.3.
- Dokumentacja statsmodels,
variance_inflation_factor: https://www.statsmodels.org/stable/generated/statsmodels.stats.outliers_influence.variance_inflation_factor.html
Czy to było pomocne?
Dzięki! To pomaga nam poprawiać Atlas.