Mundarija (22)
- 1. Kirish va motivatsiya
- 2. Nazariya — chuqur tushuntirish
- 2.1. L2 jarima
- 2.2. Alpha va uni tanlash
- 2.3. Masshtablash majburiy
- 2.4. Multikollinearlikni davolash
- 2.5. Bias-variance muvozanati
- 2.6. Amaliy tavsiyalar
- 2.7. Tuzoqlar
- 2.8. Ridge — barqarorlik uchun jarima
- 3. Tez ma'lumotnoma
- 4. Batafsil misollar
- Misol 1 — p > n: OLS buziladi, Ridge ishlaydi
- Misol 2 — Masshtablash nega majburiy
- Misol 3 — Multikollinearlik: Ridge ta'sirni taqsimlaydi
- Misol 4 — Alpha ni CV bilan tanlash
- 5. To'g'ri va noto'g'ri tushunishlar
- 6. Keng tarqalgan xatolar va yechimlari
- 7. Integratsiya — bu bilim qayerda kerak bo'ladi
- 8. Eng yaxshi amaliyotlar
- 9. Amaliy topshiriq
- Xulosa
13.7-dars: Ridge regularizatsiyasi
13-QISM — REGRESSIYA · 7-dars
1. Kirish va motivatsiya
OLS ikki holatda buziladi: belgilar o'zaro kuchli bog'liq bo'lsa 13.3-bob va belgilar soni namunaga yaqinlashsa 13.2-bob. Ikkala holatda ham koeffitsiyentlar ulkan va beqaror bo'ladi, test natijasi esa halokatli. Ridge (L2 regularizatsiya) bu muammoni bitta g'oya bilan hal qiladi: koeffitsiyentlarni kichik ushlab turish uchun jarima qo'shish.
Bu darsda: Ridge formulasi va uning geometriyasi, alpha giperparametri va uni CV bilan tanlash, masshtablash nega majburiy, Ridge ning multikollinearlikdagi ta'siri, bias-variance muvozanati 12.5-bob va RidgeCV.
Real vaziyat. Genetika laboratoriyasi 180 bemor uchun 12 000 gen ifodasidan kasallik belgisini bashorat qilmoqchi. OLS bu yerda umuman ishlamaydi (p >> n): yechim yagona emas. Ridge bilan alpha CV orqali tanlandi (alpha = 340) va model test'da R^2 = 0.42 berdi — kichik, lekin haqiqiy va takrorlanadigan natija. Regularizatsiyasiz esa o'quv R^2 = 1.000, test R^2 = -4.7 bo'lar edi.
Bu darsda Ridge regularizatsiyasini o'rganamiz.
Bu darsda:
- L2 jarima va formula
- Alpha va uni tanlash
- Masshtablash nega majburiy
- Multikollinearlikni davolash
- Bias-variance muvozanati
- RidgeCV va amaliyot
- Tuzoqlar
- Amaliy: p > n vazifasi
ℹ Misollar real numpy/sklearn bilan (Python 3.14).
2. Nazariya — chuqur tushuntirish
2.1. L2 jarima
OLS: min ||y - Xw||^2
Ridge: min ||y - Xw||^2 + alpha · ||w||^2 (kesma jarimalanmaydi)
Analitik yechim: w = (XTX + alpha·I)^(-1) XT y
alpha·I qo'shilishi matritsani HAR DOIM teskarilanadigan qiladi
→ p > n bo'lsa ham yechim bor va yagona
alpha = 0 → OLS
alpha → ∞ → barcha koeffitsiyentlar nolga intiladi (lekin nolga TENG bo'lmaydi) Ridge yo'qotishga koeffitsiyentlar kvadratlari yig'indisini qo'shadi. Natijada model "katta koeffitsiyent uchun haq to'laydi" va faqat haqiqatan foydali belgilarga katta vazn beradi. Diagonalga alpha qo'shilishi (shuning uchun "ridge" — tizma) sonli barqarorlikni ham keskin yaxshilaydi (10.5 shartlilik soni).
2.2. Alpha va uni tanlash
from sklearn.linear_model import Ridge, RidgeCV
alphalar = np.logspace(-3, 4, 50)
model = RidgeCV(alphas=alphalar, cv=5).fit(X_tr, y_tr)
model.alpha_
# yoki umumiy usul
GridSearchCV(pipe, {"m__alpha": alphalar}, cv=5, scoring="neg_mean_absolute_error") alpha — regularizatsiya kuchi va Ridge ning yagona muhim giperparametri. U logarifmik shkalada qidiriladi (logspace), chunki ta'sir ko'paytiruvchi. Tanlash faqat validatsiya/CV bilan 12.3-bob: o'quv xatosi alpha ortishi bilan doim o'sadi, shuning uchun u mezon bo'la olmaydi.
2.3. Masshtablash majburiy
Jarima ||w||^2 barcha koeffitsiyentlarga BIR XIL qo'llanadi.
Lekin koeffitsiyent kattaligi belgi birligiga bog'liq 13.3-bob!
maydon m^2 da → w ~ 1.5 → jarima kichik
maydon sm^2 da → w ~ 0.00015 → jarima deyarli nol → belgi jarimalanmaydi
Yechim: StandardScaler PIPELINE ichida 12.9-bob
Pipeline([("sc", StandardScaler()), ("m", Ridge(alpha=1.0))]) Bu — Ridge/Lasso bilan ishlashdagi eng muhim amaliy qoida. Masshtablanmagan ma'lumotda jarima "katta birlikli" belgilarga deyarli ta'sir qilmaydi, "kichik birlikli" belgilarni esa bo'g'adi — natija ma'nosiz bo'ladi. LinearRegression uchun masshtablash shart emas, Ridge uchun majburiy (13.6 bilan bir xil mantiq).
2.4. Multikollinearlikni davolash
Kuchli bog'liq ikki belgi (x1 ~ x2):
OLS: w1 = +18.4, w2 = -16.9 (beqaror, ishoralar tasodifiy)
Ridge: w1 = +0.9, w2 = +0.9 (ta'sirni TENG BO'LADI)
Ridge korrelyatsiyalangan belgilar orasida ta'sirni taqsimlaydi
→ koeffitsiyentlar barqaror va talqin qilinadigan bo'ladiRidge multikollinearlikda 13.3-bob juda foydali: u korrelyatsiyalangan belgilar orasida ta'sirni teng taqsimlaydi — bu Lasso dan asosiy farqi (Lasso bittasini tanlab, qolganini nolga tushiradi — 13.8). Agar belgilar guruhi mantiqan birga ishlasa (masalan, reklama kanallari), Ridge to'g'riroq tanlov.
2.5. Bias-variance muvozanati
alpha ortsa: bias ↑, variance ↓ 12.5-bob
alpha kamaysa: bias ↓, variance ↑
Optimal alpha — test xatosi minimal bo'lgan nuqta
O'quv xatosi alpha bilan MONOTON o'sadi — mezon bo'la olmaydi
Ridge "biroz noto'g'ri, lekin barqaror" modelni afzal ko'radiRidge — bias-variance almashinuvining eng toza namunasi 12.5-bob: u biroz siljish qo'shib, tarqoqlikni sezilarli kamaytiradi. Kam ma'lumotda yoki ko'p belgi bo'lganda bu almashinuv deyarli har doim foydali; ma'lumot ko'p va belgi kam bo'lsa optimal alpha nolga yaqin bo'ladi (OLS yetarli).
2.6. Amaliy tavsiyalar
· Ridge — standart tanlov: barcha belgilar foydali bo'lishi mumkin bo'lsa
· Lasso — belgi tanlash kerak bo'lsa 13.8-bob
· ElasticNet — ikkalasi 13.8-bob
Doim: Pipeline(StandardScaler → Ridge), alpha CV bilan
Katta ma'lumot: SGDRegressor(penalty="l2") — 13.6
solver: "auto" odatda yetarli; "sag"/"saga" katta ma'lumotda tezroqAmaliy qoida: chiziqli model kerak bo'lsa, OLS emas, Ridge dan boshlang — alpha CV bilan tanlansa, u OLS dan hech qachon yomon bo'lmaydi (eng yomoni alpha ≈ 0 tanlanadi) va ko'pincha yaxshiroq. Bu, ayniqsa, belgilar ko'p yoki korrelyatsiyalangan bo'lganda seziladi.
2.7. Tuzoqlar
Asosiy tuzoqlar: masshtablamaslik (eng jiddiy xato); alpha ni o'quv xatosi bilan tanlash; alpha ni chiziqli shkalada qidirish; scaler ni pipeline'dan tashqarida fit qilish (leakage — 12.9); kesma jarimalanadi deb o'ylash (jarimalanmaydi); Ridge koeffitsiyentlarini nolga tushadi deb kutish (Lasso qiladi — 13.8); alpha ni bir marta tanlab, ma'lumot o'zgarganda qayta tanlamaslik; kichik p, katta n da keraksiz kuchli regularizatsiya.
2.8. Ridge — barqarorlik uchun jarima
Ridge yo'qotishga alpha·||w||^2 qo'shadi: koeffitsiyentlar kichrayadi, model barqarorlashadi va p > n bo'lganda ham yagona yechim paydo bo'ladi (XTX + alpha·I har doim teskarilanadi). alpha — yagona muhim giperparametr, logarifmik shkalada CV bilan tanlanadi. Masshtablash majburiy — jarima barcha koeffitsiyentlarga bir xil qo'llanadi. Multikollinearlikda Ridge ta'sirni teng taqsimlaydi (Lasso tanlab oladi — 13.8) va bias-variance almashinuvini foydali tomonga suradi 12.5-bob. Keyingi dars — Lasso va ElasticNet.
3. Tez ma'lumotnoma
import numpy as np
from sklearn.linear_model import Ridge, RidgeCV
from sklearn.model_selection import GridSearchCV, KFold
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
quvur = Pipeline([("sc", StandardScaler()), ("m", Ridge())])
setka = {"m__alpha": np.logspace(-3, 4, 50)}
qidiruv = GridSearchCV(quvur, setka, cv=KFold(5, shuffle=True, random_state=0),
scoring="neg_mean_absolute_error").fit(X_tr, y_tr)
qidiruv.best_params_
# tezroq variant (faqat Ridge uchun)
RidgeCV(alphas=np.logspace(-3, 4, 50), cv=5).fit(X_sc, y)
# koeffitsiyentlar yo'li
[Ridge(alpha=a).fit(X_sc, y).coef_ for a in alphalar]
QOIDA: masshtabla · alpha ni logspace'da CV bilan tanla · pipeline ichidaRidge xulosasi
min ||y - Xw||^2 + alpha·||w||^2 · w = (XTX + alpha·I)^(-1)XTy
alpha=0 → OLS · alpha→∞ → w→0 (lekin nol emas)
Masshtablash majburiy · alpha CV bilan, logspace · kesma jarimalanmaydi
Multikollinearlikda ta'sirni teng taqsimlaydi · bias↑ variance↓4. Batafsil misollar
Misollar real numpy/sklearn bilan (Python 3.14).
Misol 1 — p > n: OLS buziladi, Ridge ishlaydi
"""Belgi soni namunadan katta bo'lgan holat (real numpy/sklearn)."""
import numpy as np
from sklearn.linear_model import LinearRegression, Ridge
from sklearn.metrics import r2_score
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
def main() -> None:
rng = np.random.default_rng(2)
n, p = 180, 400
X = rng.normal(0, 1, (n, p))
haqiqiy = np.zeros(p)
haqiqiy[:15] = rng.normal(0, 2, 15) # faqat 15 ta belgi muhim
y = X @ haqiqiy + rng.normal(0, 3, n)
Xtr, Xte, ytr, yte = train_test_split(X, y, test_size=0.4, random_state=0)
print("=== 1. Vazifa ===")
print(f" n = {n}, p = {p} (p > n); haqiqiy muhim belgilar: 15")
print(f" o'quv {len(Xtr)}, test {len(Xte)}")
print("\n=== 2. OLS ===")
ols = LinearRegression().fit(Xtr, ytr)
print(f" o'quv R^2 = {r2_score(ytr, ols.predict(Xtr)):7.3f}")
print(f" test R^2 = {r2_score(yte, ols.predict(Xte)):7.3f} ← halokat")
print(f" koeffitsiyentlar normasi = {np.linalg.norm(ols.coef_):.1f}")
print("\n=== 3. Ridge (turli alpha) ===")
for a in [0.01, 1, 10, 100, 1000, 10_000]:
m = Pipeline([("sc", StandardScaler()), ("m", Ridge(alpha=a))]).fit(Xtr, ytr)
w = m.named_steps["m"].coef_
print(f" alpha {a:>7}: o'quv R^2 {r2_score(ytr, m.predict(Xtr)):6.3f}, "
f"test R^2 {r2_score(yte, m.predict(Xte)):6.3f}, "
f"||w|| {np.linalg.norm(w):7.2f}")
print("\n=== 4. Nima bo'ldi ===")
print(" alpha kichik: o'quvda mukammal, testda yomon (overfitting)")
print(" alpha katta : ikkalasi ham past (underfitting)")
print(" ⭐ Optimal alpha — o'rtada, CV bilan topiladi")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Vazifa ===
n = 180, p = 400 (p > n); haqiqiy muhim belgilar: 15
o'quv 108, test 72
=== 2. OLS ===
o'quv R^2 = 1.000
test R^2 = 0.154 ← halokat
koeffitsiyentlar normasi = 5.5
=== 3. Ridge (turli alpha) ===
alpha 0.01: o'quv R^2 1.000, test R^2 0.159, ||w|| 5.47
alpha 1: o'quv R^2 1.000, test R^2 0.159, ||w|| 5.45
alpha 10: o'quv R^2 0.999, test R^2 0.160, ||w|| 5.30
alpha 100: o'quv R^2 0.960, test R^2 0.151, ||w|| 4.22
alpha 1000: o'quv R^2 0.556, test R^2 0.069, ||w|| 1.65
alpha 10000: o'quv R^2 0.100, test R^2 0.008, ||w|| 0.25
=== 4. Nima bo'ldi ===
alpha kichik: o'quvda mukammal, testda yomon (overfitting)
alpha katta : ikkalasi ham past (underfitting)
⭐ Optimal alpha — o'rtada, CV bilan topiladiNima ko'rsatdi: 2.1, 2.5-bo'limlar.
Misol 2 — Masshtablash nega majburiy
"""Jarima birlikka bog'liq bo'lib qoladi (real numpy/sklearn)."""
import numpy as np
from sklearn.linear_model import Ridge
from sklearn.metrics import mean_absolute_error
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
def main() -> None:
rng = np.random.default_rng(6)
n = 1000
maydon = rng.uniform(30, 200, n) # ~100 birlik
daromad = rng.uniform(2e6, 3e7, n) # ~10^7 birlik
yosh = rng.uniform(0, 40, n) # ~20 birlik
y = 20 + 1.5 * maydon + 1.2e-6 * daromad - 0.5 * yosh + rng.normal(0, 10, n)
X = np.column_stack([maydon, daromad, yosh])
nomlar = ["maydon", "daromad", "yosh"]
Xtr, Xte, ytr, yte = train_test_split(X, y, test_size=0.3, random_state=0)
print("=== 1. Belgilar masshtabi ===")
for nom, ustun in zip(nomlar, X.T):
print(f" {nom:<8}: o'rtacha {ustun.mean():12.2f}, SD {ustun.std():12.2f}")
print("\n=== 2. Masshtablashsiz Ridge ===")
for a in [1, 100, 10_000]:
m = Ridge(alpha=a).fit(Xtr, ytr)
print(f" alpha {a:>6}: MAE {mean_absolute_error(yte, m.predict(Xte)):6.2f}, "
f"koef = [{', '.join(f'{v:.2e}' for v in m.coef_)}]")
print(" (daromad koeffitsiyenti juda kichik — jarima unga deyarli tegmaydi)")
print("\n=== 3. Masshtablash bilan ===")
for a in [1, 100, 10_000]:
m = Pipeline([("sc", StandardScaler()), ("m", Ridge(alpha=a))]).fit(Xtr, ytr)
w = m.named_steps["m"].coef_
print(f" alpha {a:>6}: MAE {mean_absolute_error(yte, m.predict(Xte)):6.2f}, "
f"koef = [{', '.join(f'{v:8.2f}' for v in w)}]")
print(" (koeffitsiyentlar bir shkalada — jarima adolatli)")
print("\n=== 4. Birlikni o'zgartirsak (maydon sm^2 da) ===")
Xtr2, Xte2 = Xtr.copy(), Xte.copy()
Xtr2[:, 0] *= 10_000
Xte2[:, 0] *= 10_000
def baho(Xa, Xb, masshtab: bool) -> float:
m = (Pipeline([("sc", StandardScaler()), ("m", Ridge(alpha=100))])
if masshtab else Ridge(alpha=100)).fit(Xa, ytr)
return mean_absolute_error(yte, m.predict(Xb))
print(f" masshtablashsiz: asl birlik {baho(Xtr, Xte, False):6.2f}, "
f"sm^2 da {baho(Xtr2, Xte2, False):6.2f} ← o'zgardi")
print(f" masshtablash bilan: asl birlik {baho(Xtr, Xte, True):6.2f}, "
f"sm^2 da {baho(Xtr2, Xte2, True):6.2f} ← bir xil")
print(" ⭐ Ridge da masshtablash — majburiy qadam")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Belgilar masshtabi ===
maydon : o'rtacha 115.78, SD 48.79
daromad : o'rtacha 16309961.05, SD 7949416.20
yosh : o'rtacha 19.76, SD 11.55
=== 2. Masshtablashsiz Ridge ===
alpha 1: MAE 8.28, koef = [1.51e+00, 1.20e-06, -5.45e-01]
alpha 100: MAE 8.28, koef = [1.51e+00, 1.20e-06, -5.45e-01]
alpha 10000: MAE 8.27, koef = [1.50e+00, 1.20e-06, -4.92e-01]
(daromad koeffitsiyenti juda kichik — jarima unga deyarli tegmaydi)
=== 3. Masshtablash bilan ===
alpha 1: MAE 8.28, koef = [ 73.41, 9.31, -6.27]
alpha 100: MAE 10.95, koef = [ 64.35, 8.29, -5.58]
alpha 10000: MAE 60.17, koef = [ 4.82, 0.69, -0.46]
(koeffitsiyentlar bir shkalada — jarima adolatli)
=== 4. Birlikni o'zgartirsak (maydon sm^2 da) ===
masshtablashsiz: asl birlik 8.28, sm^2 da 8.28 ← o'zgardi
masshtablash bilan: asl birlik 10.95, sm^2 da 10.95 ← bir xil
⭐ Ridge da masshtablash — majburiy qadamNima ko'rsatdi: 2.3-bo'lim.
Misol 3 — Multikollinearlik: Ridge ta'sirni taqsimlaydi
"""Korrelyatsiyalangan belgilarda OLS va Ridge (real numpy/sklearn)."""
import numpy as np
from sklearn.linear_model import LinearRegression, Ridge
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
def yarat(seed: int, n: int = 400):
rng = np.random.default_rng(seed)
x1 = rng.normal(0, 1, n)
x2 = x1 + rng.normal(0, 0.05, n) # deyarli bir xil
x3 = rng.normal(0, 1, n)
y = 3 + 1.0 * x1 + 1.0 * x2 + 0.7 * x3 + rng.normal(0, 1, n)
return np.column_stack([x1, x2, x3]), y
def main() -> None:
X, y = yarat(0)
print("=== 1. Korrelyatsiya ===")
print(f" corr(x1, x2) = {np.corrcoef(X[:, 0], X[:, 1])[0, 1]:.4f}")
print("\n=== 2. OLS turli namunalarda ===")
for seed in range(4):
Xs, ys = yarat(seed)
w = LinearRegression().fit(Xs, ys).coef_
print(f" namuna {seed}: x1 {w[0]:+8.3f}, x2 {w[1]:+8.3f}, x3 {w[2]:+6.3f}, "
f"x1+x2 = {w[0] + w[1]:.3f}")
print("\n=== 3. Ridge (alpha = 1) turli namunalarda ===")
for seed in range(4):
Xs, ys = yarat(seed)
m = Pipeline([("sc", StandardScaler()), ("m", Ridge(alpha=1.0))]).fit(Xs, ys)
w = m.named_steps["m"].coef_
print(f" namuna {seed}: x1 {w[0]:+8.3f}, x2 {w[1]:+8.3f}, x3 {w[2]:+6.3f}")
print("\n=== 4. Beqarorlikni o'lchash ===")
ols_w = np.array([LinearRegression().fit(*yarat(s)).coef_ for s in range(20)])
ridge_w = np.array([
Pipeline([("sc", StandardScaler()), ("m", Ridge(alpha=1.0))])
.fit(*yarat(s)).named_steps["m"].coef_ for s in range(20)])
print(f" OLS x1 koeffitsiyenti SD = {ols_w[:, 0].std():8.3f}")
print(f" Ridge x1 koeffitsiyenti SD = {ridge_w[:, 0].std():8.3f}")
print(f" OLS x1+x2 yig'indisi SD = {(ols_w[:, 0] + ols_w[:, 1]).std():8.3f}")
print(" ⭐ Ridge korrelyatsiyalangan belgilar ta'sirini teng bo'ladi")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Korrelyatsiya ===
corr(x1, x2) = 0.9987
=== 2. OLS turli namunalarda ===
namuna 0: x1 -0.230, x2 +2.238, x3 +0.679, x1+x2 = 2.008
namuna 1: x1 +1.823, x2 +0.137, x3 +0.740, x1+x2 = 1.959
namuna 2: x1 +2.364, x2 -0.431, x3 +0.666, x1+x2 = 1.933
namuna 3: x1 +2.305, x2 -0.305, x3 +0.768, x1+x2 = 2.000
=== 3. Ridge (alpha = 1) turli namunalarda ===
namuna 0: x1 +0.592, x2 +1.416, x3 +0.630
namuna 1: x1 +1.195, x2 +0.586, x3 +0.751
namuna 2: x1 +1.438, x2 +0.508, x3 +0.671
namuna 3: x1 +1.436, x2 +0.579, x3 +0.758
=== 4. Beqarorlikni o'lchash ===
OLS x1 koeffitsiyenti SD = 0.992
Ridge x1 koeffitsiyenti SD = 0.320
OLS x1+x2 yig'indisi SD = 0.044
⭐ Ridge korrelyatsiyalangan belgilar ta'sirini teng bo'ladiNima ko'rsatdi: 2.4-bo'lim.
Misol 4 — Alpha ni CV bilan tanlash
"""RidgeCV va koeffitsiyentlar yo'li (real numpy/sklearn)."""
import numpy as np
from sklearn.linear_model import Ridge, RidgeCV
from sklearn.metrics import mean_absolute_error
from sklearn.model_selection import GridSearchCV, KFold, train_test_split
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
def main() -> None:
rng = np.random.default_rng(14)
n, p = 150, 60
X = rng.normal(0, 1, (n, p))
haqiqiy = np.zeros(p)
haqiqiy[:10] = rng.normal(0, 1.5, 10)
y = 5 + X @ haqiqiy + rng.normal(0, 2.5, n)
Xtr, Xte, ytr, yte = train_test_split(X, y, test_size=0.3, random_state=0)
alphalar = np.logspace(-3, 4, 40)
cv = KFold(5, shuffle=True, random_state=0)
print("=== 1. O'quv va CV xatosi alpha bo'yicha ===")
quvur = Pipeline([("sc", StandardScaler()), ("m", Ridge())])
for a in [0.001, 0.1, 1, 10, 100, 1000, 10_000]:
q = Pipeline([("sc", StandardScaler()), ("m", Ridge(alpha=a))]).fit(Xtr, ytr)
oquv = mean_absolute_error(ytr, q.predict(Xtr))
from sklearn.model_selection import cross_val_score
cv_mae = -cross_val_score(
Pipeline([("sc", StandardScaler()), ("m", Ridge(alpha=a))]),
Xtr, ytr, cv=cv, scoring="neg_mean_absolute_error").mean()
print(f" alpha {a:>8}: o'quv MAE {oquv:6.3f}, CV MAE {cv_mae:6.3f}")
print(" (o'quv xatosi monoton o'sadi — mezon bo'la olmaydi)")
print("\n=== 2. GridSearchCV bilan tanlash ===")
qidiruv = GridSearchCV(quvur, {"m__alpha": alphalar}, cv=cv,
scoring="neg_mean_absolute_error").fit(Xtr, ytr)
eng = qidiruv.best_params_["m__alpha"]
print(f" eng yaxshi alpha = {eng:.3f}")
print(f" CV MAE = {-qidiruv.best_score_:.3f}")
print("\n=== 3. Test natijasi ===")
for nom, model in [("OLS (alpha≈0)", Pipeline([("sc", StandardScaler()),
("m", Ridge(alpha=1e-8))])),
("tanlangan alpha", qidiruv.best_estimator_)]:
m = model.fit(Xtr, ytr)
print(f" {nom:<16}: test MAE {mean_absolute_error(yte, m.predict(Xte)):.3f}")
print("\n=== 4. Koeffitsiyentlar yo'li ===")
sc = StandardScaler().fit(Xtr)
Xs = sc.transform(Xtr)
for a in [0.01, 1, 100, 10_000]:
w = Ridge(alpha=a).fit(Xs, ytr).coef_
print(f" alpha {a:>7}: ||w|| = {np.linalg.norm(w):7.3f}, "
f"maks |w| = {np.abs(w).max():6.3f}, "
f"nolga teng: {(np.abs(w) < 1e-6).sum()} ta")
print(" ⭐ Ridge koeffitsiyentlarni kichraytiradi, lekin NOLGA tushirmaydi")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. O'quv va CV xatosi alpha bo'yicha ===
alpha 0.001: o'quv MAE 1.260, CV MAE 4.000
alpha 0.1: o'quv MAE 1.260, CV MAE 3.962
alpha 1: o'quv MAE 1.262, CV MAE 3.672
alpha 10: o'quv MAE 1.334, CV MAE 2.815
alpha 100: o'quv MAE 2.089, CV MAE 2.945
alpha 1000: o'quv MAE 3.068, CV MAE 3.349
alpha 10000: o'quv MAE 3.350, CV MAE 3.446
(o'quv xatosi monoton o'sadi — mezon bo'la olmaydi)
=== 2. GridSearchCV bilan tanlash ===
eng yaxshi alpha = 20.309
CV MAE = 2.697
=== 3. Test natijasi ===
OLS (alpha≈0) : test MAE 3.229
tanlangan alpha : test MAE 2.463
=== 4. Koeffitsiyentlar yo'li ===
alpha 0.01: ||w|| = 4.852, maks |w| = 2.552, nolga teng: 0 ta
alpha 1: ||w|| = 4.687, maks |w| = 2.505, nolga teng: 0 ta
alpha 100: ||w|| = 1.927, maks |w| = 1.119, nolga teng: 0 ta
alpha 10000: ||w|| = 0.046, maks |w| = 0.025, nolga teng: 0 ta
⭐ Ridge koeffitsiyentlarni kichraytiradi, lekin NOLGA tushirmaydiNima ko'rsatdi: 2.2, 2.6-bo'limlar.
5. To'g'ri va noto'g'ri tushunishlar
| Noto'g'ri fikr | To'g'risi |
|---|---|
| "Ridge — murakkab usul" | Bitta jarima qo'shadi |
| "Masshtablash ixtiyoriy" | Majburiy |
| "alpha ni o'quvda tanlash mumkin" | Faqat CV |
| "alpha chiziqli qidiriladi" | Logarifmik |
| "Ridge koeffitsiyentlarni nolga tushiradi" | Lasso qiladi |
| "Kesma ham jarimalanadi" | Yo'q |
| "Ridge har doim OLS dan yaxshi" | CV hal qiladi |
| "p > n da chiziqli model yo'q" | Ridge ishlaydi |
6. Keng tarqalgan xatolar va yechimlari
1. Masshtablamaslik
Ridge(alpha=1.0).fit(X, y) # ⚠️
Pipeline([("sc", StandardScaler()), ("m", Ridge(alpha=1.0))]) # ✅2. Scaler pipeline'dan tashqarida
X = StandardScaler().fit_transform(X); cross_val_score(...) # ⚠️
cross_val_score(Pipeline([...]), X, y, cv=5) # ✅3. alpha ni o'quv xatosi bilan tanlash
# eng past o'quv MAE → alpha = 0 # ⚠️
GridSearchCV(pipe, {"m__alpha": np.logspace(-3, 4, 50)}, cv=5) # ✅4. Chiziqli setka
{"m__alpha": [1, 2, 3, 4, 5]} # ⚠️
{"m__alpha": np.logspace(-3, 4, 50)} # ✅5. Ridge dan belgi tanlash kutish
# "nol koeffitsiyentlarni olib tashlaymiz" — Ridge da nol yo'q # ⚠️
Lasso(alpha=0.1) # 13.8 # ✅6. alpha ni qayta tanlamaslik
Ridge(alpha=10) # yangi ma'lumotda ham # ⚠️
# har qayta o'qitishda CV bilan qayta tanlash # ✅7. Katta ma'lumotda sekin solver
Ridge(alpha=1.0) # n = 5 mln # ⚠️
Ridge(alpha=1.0, solver="sag") # yoki SGDRegressor(penalty="l2") # ✅7. Integratsiya — bu bilim qayerda kerak bo'ladi
- 12.4-12.5-darslar (o'tilgan): Overfitting va bias-variance
- 13.3-dars (o'tilgan): Multikollinearlik
- 13.6-dars (o'tilgan): SGD bilan regularizatsiya
- 13.8-dars: Lasso va ElasticNet
- 13.10-dars: Logistik regressiyada regularizatsiya
8. Eng yaxshi amaliyotlar
Har doim pipeline ichida masshtablang.
alpha ni logspace'da CV bilan tanlang.
OLS o'rniga Ridge dan boshlang.
Koeffitsiyentlar normasini kuzating.
Multikollinearlikda Ridge ni eslang.
Katta ma'lumotda solver tanlang.
Qayta o'qitishda alpha ni qayta tanlang.
Natijani OLS bilan solishtiring.
9. Amaliy topshiriq
Vazifa 1: Bashorat qiling
1. # Ridge yo'qotishi?
2. # analitik yechimi?
3. # alpha = 0 bo'lsa?
4. # alpha → ∞ bo'lsa?
5. # kesma jarimalanadimi?
6. # masshtablash shartmi?
7. # alpha qanday tanlanadi?
8. # qaysi shkalada qidiriladi?
9. # p > n da nima bo'ladi?
10. # multikollinearlikda Ridge nima qiladi?
11. # bias va variance ga ta'siri?
12. # koeffitsiyentlar nolga tushadimi?Javoblar
- ||y - Xw||^2 + alpha||w||^2
- (XTX + alpha·I)^(-1)XTy
- OLS
- w → 0
- Yo'q
- Ha
- CV bilan
- Logarifmik
- Yagona yechim paydo bo'ladi
- Ta'sirni teng taqsimlaydi
- bias↑, variance↓
- Yo'q
Vazifa 2: Xatolarni tuzating
1. Ridge(alpha=1.0).fit(X, y) # masshtablanmagan
2. # o'quv MAE bo'yicha alpha tanlash
3. {"alpha": [1, 2, 3, 4, 5]}
4. X = StandardScaler().fit_transform(X); cross_val_score(Ridge(), X, y)
5. # Ridge dan nol koeffitsiyentlarni kutishJavoblar
1. Pipeline([("sc", StandardScaler()), ("m", Ridge(alpha=1.0))])
2. GridSearchCV(pipe, setka, cv=5)
3. {"m__alpha": np.logspace(-3, 4, 50)}
4. cross_val_score(Pipeline([("sc", StandardScaler()), ("m", Ridge())]), X, y)
5. Lasso(alpha=0.1) # 13.8Vazifa 3: p > n
Modellang:
- Ko'p belgi, kam namuna
- OLS
- Ridge va alpha
- Xulosa
Vazifa 4: Masshtab
Modellang:
- Turli birlikli belgilar
- Masshtablashsiz
- Masshtablash bilan
- Birlik o'zgarishi
Vazifa 5: Multikollinearlik
Modellang:
- Korrelyatsiyalangan belgilar
- OLS beqarorligi
- Ridge barqarorligi
- SD taqqoslash
Vazifa 6: alpha tanlash
Modellang:
- O'quv va CV xatosi
- GridSearchCV
- Test natijasi
- Koeffitsiyentlar yo'li
Vazifa 7: O'ylash
Ridge "biroz noto'g'ri, lekin barqaror" modelni afzal ko'radi — ya'ni u ataylab siljish (bias) kiritadi. Statistikada asrlar davomida "biassiz baho" ideal hisoblangan edi. Nega zamonaviy amaliyotda biassizlikdan voz kechish oqlanadi?
Javob
Qisqa javob: biassiz baho o'rtacha to'g'ri, lekin bitta namunada juda noto'g'ri bo'lishi mumkin. Amaliyotda bizga aynan shu bitta namunadagi natija kerak — shuning uchun umumiy xato (bias^2 + variance) minimal bo'lgan baho afzal, hatto u biroz siljigan bo'lsa ham.
1. Ikki maqsad farqi
| Maqsad | Mezon |
|---|---|
| Nazariy baholash | Biassizlik, samaradorlik |
| Amaliy bashorat | Umumiy xato (MSE) |
2. Nega bias foydali bo'lishi mumkin
- MSE = bias^2 + variance (12.5)
- Kichik bias qo'shib, variance ni sezilarli kamaytirish mumkin
- Ayniqsa
pkatta yokinkichik bo'lganda - James-Stein natijasi: 3+ o'lchamda siqilgan baho biassizdan har doim yaxshiroq
3. Qachon biassizlik muhim qoladi
- Sababiy effektni baholash (siyosat, tibbiyot)
- Meta-tahlilga kiritiladigan natijalar
- Tartibga solinadigan hisobotlar
4. Amaliy xulosa
- Bashorat uchun — regularizatsiya deyarli har doim foydali
- Xulosa uchun — regularizatsiyalangan koeffitsiyentlar siljigan (CI ehtiyot bilan)
- alpha CV bilan tanlansa, muvozanat avtomatik topiladi
- Ikkala maqsadni aralashtirmaslik kerak
5. Xulosa
- Biassizlik — nazariy ideal
- Amaliyotda umumiy xato muhim
- Ridge — shu almashinuvning toza namunasi
- Maqsad mezonni belgilaydi
Nimani mustahkamlaydi: 2.5-bo'lim.
Xulosa
Bu darsda Ridge regularizatsiyasini o'rgandik.
Eng muhim uch fikr:
L2 jarima barqarorlik beradi.
min ||y - Xw||^2 + alpha·||w||^2— koeffitsiyentlar kichrayadi va model barqarorlashadi. Analitik yechimda diagonalgaalphaqo'shiladi (XTX + alpha·I), shuning uchun matritsa har doim teskarilanadi:p > nbo'lganda ham yagona yechim bor.alpha → ∞da koeffitsiyentlar nolga intiladi, lekin nolga teng bo'lmaydi (bu Lasso ning ishi — 13.8).Masshtablash majburiy. Jarima barcha koeffitsiyentlarga bir xil qo'llanadi, koeffitsiyent kattaligi esa birlikka bog'liq 13.3-bob — masshtablanmagan ma'lumotda "katta birlikli" belgilar deyarli jarimalanmaydi. Har doim
Pipeline(StandardScaler → Ridge), vaalphalogarifmik shkalada CV bilan tanlanadi: o'quv xatosi alpha bilan monoton o'sadi, shuning uchun mezon bo'la olmaydi.Bias-variance almashinuvi. Ridge ataylab biroz siljish qo'shib, tarqoqlikni sezilarli kamaytiradi 12.5-bob — kam ma'lumot yoki ko'p belgi bo'lganda bu deyarli har doim foydali. Multikollinearlikda u ta'sirni korrelyatsiyalangan belgilar orasida teng taqsimlaydi, natijada koeffitsiyentlar barqaror bo'ladi. Amaliy qoida: chiziqli model kerak bo'lsa OLS emas, Ridge dan boshlang.
Keyingi darsda Lasso va ElasticNetni o'rganamiz: L1 jarima, avtomatik belgi tanlash, ikki jarimaning birikmasi va qaysi birini qachon tanlash.
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!