Asosiy qismga o'tish

Regularization: Ridge, Lasso, Elastic Net

17-bob 14 kod bloki 3788 so'z

Bu bobdagi kod shu fayllar bilan ishlaydio'z kompyuteringizda ishga tushiring

Sahna: 14-bobda qoldirgan muammo

14-bobning oxirida biz bitta narsani ko'rdik va tuzatmadik. Koeffitsiyentlar train bo'linishiga qarab sakrardi:

random_state xonalar maydon_m2
0 ... ...
42 ... ...

Sabab: xonalar va maydon_m2 korrelyatsiyasi 0.94. Model ikkisidan qaysi biriga "ishonishni" bilmaydi, shuning uchun har bo'linishda boshqacha taqsimlaydi.

Va 14-bobda yana bitta muammo bor edi: polinom darajasi 3 da xususiyatlar soni 83 ga chiqdi va natija yomonlashdi.

Ikkala muammoning yechimi bitta: regularizatsiya.

G'oya: modelga jarima solamiz

12-bobda cost funksiya shunday edi:

Endi ustiga jarima qo'shamiz:

Model endi ikki narsani bir vaqtda qilishi kerak: xatoni kamaytirish va vaznlarni kichik tutish. Natijada u faqat haqiqatan foydali xususiyatlarga katta vazn beradi.

"Vaznlarning kattaligi" nima? 11-bobdagi normalar shu yerda kerak bo'ladi.

python7 qator
import pandas as pd
import numpy as np

w = np.array([3.0, -4.0, 0.5])
print(f"vaznlar: {w}")
print(f"  L2 jarima (kvadratlar yig'indisi): {np.sum(w**2):.4f}")
print(f"  L1 jarima (mutlaq qiymatlar)     : {np.sum(np.abs(w)):.4f}")
Chiqish
vaznlar: [ 3.  -4.   0.5]
  L2 jarima (kvadratlar yig'indisi): 25.2500
  L1 jarima (mutlaq qiymatlar)     : 7.5000
python11 qator
show(pd.DataFrame([
    {"Model": "Ridge", "Jarima": "L2: alpha * sum(w^2)",
     "Vaznlarga ta'siri": "Hammasini KICHIKLASHTIRADI, nolga tushirmaydi",
     "Qachon": "Hamma xususiyat bir oz foydali bo'lsa"},
    {"Model": "Lasso", "Jarima": "L1: alpha * sum(|w|)",
     "Vaznlarga ta'siri": "Ba'zilarini AYNAN NOLGA tushiradi",
     "Qachon": "Xususiyat tanlash kerak bo'lsa"},
    {"Model": "Elastic Net", "Jarima": "L1 va L2 aralashmasi",
     "Vaznlarga ta'siri": "Ikkisining o'rtasi",
     "Qachon": "Ko'p va o'zaro bog'liq xususiyat bo'lsa"},
]))
ModelJarimaVaznlarga ta'siriQachon
RidgeL2: alpha * sum(w^2)Hammasini KICHIKLASHTIRADI, nolga tushirmaydiHamma xususiyat bir oz foydali bo'lsa
LassoL1: alpha * sum(|w|)Ba'zilarini AYNAN NOLGA tushiradiXususiyat tanlash kerak bo'lsa
Elastic NetL1 va L2 aralashmasiIkkisining o'rtasiKo'p va o'zaro bog'liq xususiyat bo'lsa

Avval: scaling bu yerda MAJBURIY

python18 qator
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.linear_model import LinearRegression, Ridge, Lasso, ElasticNet
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler

df = pd.read_csv(DATA / "uy_ijara.csv")
son = ["xonalar", "maydon_m2", "qavat", "qavatlar_soni", "metro_km", "mebel"]
X, y = df[son], df["narx_usd"]
X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.3, random_state=42)

print("Ridge — scaling BILAN va BUSIZ, turli alpha da:")
print(f"{'alpha':>8} {'scaling YO`Q':>14} {'scaling BOR':>13} {'farq':>9}")
print("-" * 48)
for a in [1, 10, 100, 1000, 10000]:
    y1 = cross_val_score(Ridge(alpha=a), X, y, cv=5, scoring="r2").mean()
    y2 = cross_val_score(Pipeline([("sc", StandardScaler()), ("m", Ridge(alpha=a))]),
                         X, y, cv=5, scoring="r2").mean()
    print(f"{a:>8} {y1:>14.4f} {y2:>13.4f} {y2-y1:>+9.4f}")
Chiqish
Ridge — scaling BILAN va BUSIZ, turli alpha da:
   alpha   scaling YO`Q   scaling BOR      farq
------------------------------------------------
       1         0.8759        0.8759   +0.0000
      10         0.8758        0.8758   +0.0000
     100         0.8713        0.8718   +0.0004
    1000         0.8443        0.7553   -0.0890
   10000         0.8097        0.2405   -0.5693

Natija men kutganidan boshqacha chiqdi, shuning uchun uni o'zgartirmasdan qoldiraman.

alpha kichik bo'lganda (1, 10, 100) scaling natijani deyarli o'zgartirmaydi. alpha juda katta bo'lganda esa scaling natijani yomonlashtiradi.

Men bu yerda adashdim — va o'lchov buni ko'rsatdi

Men bu bo'limni "regularizatsiyada scaling majburiy, aks holda natija yomon bo'ladi" deb yozgan edim. O'lchadim — tasdiqlanmadi.

Sabab: scaling qilinmaganda maydon_m2 qiymatlari katta, shuning uchun uning koeffitsiyenti tabiiy ravishda kichik bo'ladi, va sum(w^2) jarimasi unga deyarli tegmaydi. Model shkalalanmagan holatda jarimadan "yashirinib" qoladi.

Shkalalangan holatda esa jarima hamma xususiyatga teng tushadi, shuning uchun katta alpha hammasini birdan bo'g'adi.

Demak scaling nima uchun kerak? Natija uchun emas — adolat uchun:

  • koeffitsiyentlarni o'zaro solishtirish uchun (14-bob)
  • Lasso to'g'ri xususiyat tanlashi uchun (pastda ko'ramiz)
  • alpha qiymati bitta ustunning birligiga bog'liq bo'lib qolmasligi uchun

Qoida o'zgarmaydi: Ridge/Lasso ni StandardScaler bilan ishlatasiz. Lekin sabab "aks holda R2 tushadi" emas.

Ridge: koeffitsiyentlarni jilovlaydi

python10 qator
print(f"{'alpha':>10} {'CV R2':>9} {'±':>7}  {'koeffitsiyentlar (shkalalangan)'}")
print("-" * 92)
for a in [0, 0.1, 1, 10, 100, 1000]:
    m = LinearRegression() if a == 0 else Ridge(alpha=a)
    quvur = Pipeline([("sc", StandardScaler()), ("m", m)])
    b = cross_val_score(quvur, X, y, cv=5, scoring="r2")
    quvur.fit(X_tr, y_tr)
    k = quvur.named_steps["m"].coef_
    nom = "0 (oddiy)" if a == 0 else str(a)
    print(f"{nom:>10} {b.mean():>9.4f} {b.std():>7.4f}  {np.round(k, 1)}")
Chiqish
     alpha     CV R2       ±  koeffitsiyentlar (shkalalangan)
--------------------------------------------------------------------------------------------
 0 (oddiy)    0.8759  0.0091  [ 67.3 142.8   5.7   8.2 -44.   44.1]
       0.1    0.8759  0.0091  [ 67.3 142.7   5.7   8.2 -44.   44.1]
         1    0.8759  0.0091  [ 67.9 142.    5.7   8.2 -44.   44.1]
        10    0.8758  0.0092  [ 72.8 135.9   5.5   8.3 -43.5  43.6]
       100    0.8718  0.0104  [ 86.2 111.5   4.7   8.5 -39.   39.6]
      1000    0.7553  0.0153  [ 63.   66.6   3.6   6.4 -19.4  20.2]

Jadvalni ustunlar bo'yicha o'qing. alpha oshgani sari koeffitsiyentlar kichrayadi — lekin hech biri nolga aylanmaydi.

alpha juda katta bo'lganda model deyarli hamma narsani nolga tortadi va R2 tushadi — ya'ni underfitting boshlanadi.

Ridge 14-bobdagi beqarorlikni tuzatadi

Mana bu — bobning asosiy isboti. 14-bobda koeffitsiyentlar bo'linishdan bo'linishga sakragan edi. O'lchaymiz.

python19 qator
natija = {"Oddiy (LinearRegression)": [], "Ridge (alpha=10)": [], "Ridge (alpha=100)": []}
for rs in [0, 1, 7, 13, 42, 99, 123, 2026]:
    Xa, _, ya, _ = train_test_split(X, y, test_size=0.3, random_state=rs)
    for nom, m in [("Oddiy (LinearRegression)", LinearRegression()),
                   ("Ridge (alpha=10)", Ridge(alpha=10)),
                   ("Ridge (alpha=100)", Ridge(alpha=100))]:
        q = Pipeline([("sc", StandardScaler()), ("m", m)]).fit(Xa, ya)
        natija[nom].append(q.named_steps["m"].coef_[:2])    # xonalar va maydon_m2

qatorlar = []
for nom, lst in natija.items():
    arr = np.array(lst)
    qatorlar.append({
        "Model": nom,
        "xonalar: eng past..eng baland": f"{arr[:,0].min():.1f} .. {arr[:,0].max():.1f}",
        "xonalar tarqalishi": round(float(arr[:, 0].std()), 2),
        "maydon_m2 tarqalishi": round(float(arr[:, 1].std()), 2),
    })
show(pd.DataFrame(qatorlar))
Modelxonalar: eng past..eng balandxonalar tarqalishimaydon_m2 tarqalishi
Oddiy (LinearRegression)54.5 .. 69.64.734.49
Ridge (alpha=10)62.5 .. 75.84.13.77
Ridge (alpha=100)82.6 .. 89.12.131.66

Oxirgi ikki ustunga qarang: alpha oshgani sari koeffitsiyentlarning tarqalishi kamayadi.

Ya'ni Ridge bashorat aniqligini deyarli o'zgartirmaydi, lekin "xonalar narxga qancha ta'sir qiladi" degan savolga barqaror javob beradi. Bu — tushuntirish talab qilinadigan loyihalarda (bank, tibbiyot) juda muhim.

Lasso: xususiyat tanlaydi

python16 qator
from sklearn.preprocessing import PolynomialFeatures

# 14-bobdagi muammoga qaytamiz: polinom 83 xususiyat yaratgan edi
pf = PolynomialFeatures(3, include_bias=False)
print(f"Xususiyatlar: {len(son)} -> {pf.fit_transform(X[:1]).shape[1]}")
print()
print(f"{'alpha':>8} {'CV R2':>9} {'nolga teng koef':>17} {'qolgan xususiyat':>18}")
print("-" * 58)
for a in [0.001, 0.01, 0.1, 1, 10]:
    quvur = Pipeline([("p", pf), ("sc", StandardScaler()),
                      ("m", Lasso(alpha=a, max_iter=50000))])
    b = cross_val_score(quvur, X, y, cv=5, scoring="r2")
    quvur.fit(X_tr, y_tr)
    k = quvur.named_steps["m"].coef_
    nol = int((k == 0).sum())
    print(f"{a:>8} {b.mean():>9.4f} {nol:>13} / {len(k)} {len(k)-nol:>18}")
Chiqish
Xususiyatlar: 6 -> 83

   alpha     CV R2   nolga teng koef   qolgan xususiyat
----------------------------------------------------------
   0.001    0.8707             3 / 83                 80
    0.01    0.8716            12 / 83                 71
     0.1    0.8742            43 / 83                 40
       1    0.8753            66 / 83                 17
      10    0.8681            74 / 83                  9

Mana Lasso ning super kuchi: alpha oshgani sari u koeffitsiyentlarni aynan nolga tushiradi.

Nolga teng koeffitsiyent — ya'ni o'sha xususiyat modelda umuman ishlatilmaydi. Lasso xususiyat tanlashni avtomatik bajaradi.

python8 qator
quvur_l = Pipeline([("p", PolynomialFeatures(3, include_bias=False)),
                    ("sc", StandardScaler()), ("m", Lasso(alpha=1, max_iter=50000))]).fit(X_tr, y_tr)
k = quvur_l.named_steps["m"].coef_
nomlar = quvur_l.named_steps["p"].get_feature_names_out(son)
tirik = pd.DataFrame({"xususiyat": nomlar, "koeffitsiyent": k.round(3)})
tirik = tirik[tirik.koeffitsiyent != 0].sort_values("koeffitsiyent", key=abs, ascending=False)
print(f"Lasso (alpha=1) tanlagan xususiyatlar — {len(tirik)} ta {len(k)} dan:")
show(tirik.head(12))
Chiqish
Lasso (alpha=1) tanlagan xususiyatlar — 17 ta 83 dan:
xususiyatkoeffitsiyent
maydon_m2143.484
xonalar60.1
metro_km-51.271
mebel41.385
qavat16.221
metro_km^311.008
qavat^2 mebel-8.395
xonalar qavatlar_soni6.4
qavat^3-4.769
qavat qavatlar_soni3.871
maydon_m2 qavat^2-3.447
xonalar mebel3.177

Nega L1 nolga tushiradi, L2 esa tushirmaydi

Sabab jarimaning shaklida.

  • L2 jarimasi w^2 — vazn nolga yaqinlashganda hosila ham nolga yaqinlashadi. Ya'ni nolga yaqinlashtiradi, lekin yetib bormaydi.
  • L1 jarimasi |w| — nolda ham hosilasi o'zgarmaydi (±1). Shuning uchun u vaznni nolgacha itaradi va o'sha yerda ushlab turadi.

Geometrik tushuntirish: L2 ning chegarasi doira, L1 ning chegarasi romb. Rombning uchlari o'qlarda — shuning uchun yechim o'sha uchlarda (ya'ni ba'zi koordinatalar nol) bo'lishi ehtimoli yuqori.

Elastic Net: ikkisining o'rtasi

python11 qator
print(f"{'model':<34} {'CV R2':>9} {'±':>7}")
print("-" * 52)
for nom, m in [
    ("LinearRegression (jarima yo'q)", LinearRegression()),
    ("Ridge (alpha=10)", Ridge(alpha=10)),
    ("Lasso (alpha=1)", Lasso(alpha=1, max_iter=50000)),
    ("ElasticNet (l1_ratio=0.5)", ElasticNet(alpha=1, l1_ratio=0.5, max_iter=50000)),
    ("ElasticNet (l1_ratio=0.9)", ElasticNet(alpha=1, l1_ratio=0.9, max_iter=50000)),
]:
    b = cross_val_score(Pipeline([("sc", StandardScaler()), ("m", m)]), X, y, cv=5, scoring="r2")
    print(f"{nom:<34} {b.mean():>9.4f} {b.std():>7.4f}")
Chiqish
model                                  CV R2       ±
----------------------------------------------------
LinearRegression (jarima yo'q)        0.8759  0.0091
Ridge (alpha=10)                      0.8758  0.0092
Lasso (alpha=1)                       0.8758  0.0089
ElasticNet (l1_ratio=0.5)             0.8300  0.0137
ElasticNet (l1_ratio=0.9)             0.8713  0.0102

Bizning ma'lumotda farqlar kichik — chunki xususiyatlar kam (6 ta) va ularning hammasi foydali. Regularizatsiya ko'p va keraksiz xususiyat bo'lganda kuchli ta'sir qiladi.

Shuni ko'rsatamiz: 60 ta shovqin ustuni qo'shamiz.

python15 qator
r = np.random.default_rng(42)
shovqin = pd.DataFrame(r.normal(size=(len(X), 60)),
                       columns=[f"shovqin_{i}" for i in range(60)], index=X.index)
X_shovqinli = pd.concat([X, shovqin], axis=1)
print(f"Xususiyatlar: {X.shape[1]} -> {X_shovqinli.shape[1]} (60 tasi BEFOYDA)")
print()
print(f"{'model':<34} {'CV R2':>9} {'±':>7}")
print("-" * 52)
for nom, m in [
    ("LinearRegression (jarima yo'q)", LinearRegression()),
    ("Ridge (alpha=10)", Ridge(alpha=10)),
    ("Lasso (alpha=1)", Lasso(alpha=1, max_iter=50000)),
]:
    b = cross_val_score(Pipeline([("sc", StandardScaler()), ("m", m)]), X_shovqinli, y, cv=5, scoring="r2")
    print(f"{nom:<34} {b.mean():>9.4f} {b.std():>7.4f}")
Chiqish
Xususiyatlar: 6 -> 66 (60 tasi BEFOYDA)

model                                  CV R2       ±
----------------------------------------------------
LinearRegression (jarima yo'q)        0.8685  0.0095
Ridge (alpha=10)                      0.8687  0.0096
Lasso (alpha=1)                       0.8724  0.0091
python11 qator
print("Lasso shovqinni qanday tozalaydi — alpha ga qarab:")
print(f"{'alpha':>8} {'CV R2':>9} {'haqiqiy saqlandi':>18} {'shovqin saqlandi':>18}")
print("-" * 58)
for a in [0.1, 1, 5, 20, 50]:
    q = Pipeline([("sc", StandardScaler()), ("m", Lasso(alpha=a, max_iter=50000))])
    b = cross_val_score(q, X_shovqinli, y, cv=5, scoring="r2").mean()
    q.fit(X_shovqinli, y)
    k_ = q.named_steps["m"].coef_
    hq = sum(1 for n, v in zip(X_shovqinli.columns, k_) if v != 0 and not n.startswith("shovqin"))
    shv = sum(1 for n, v in zip(X_shovqinli.columns, k_) if v != 0 and n.startswith("shovqin"))
    print(f"{a:>8} {b:>9.4f} {hq:>14} / 6 {shv:>14} / 60")
Chiqish
Lasso shovqinni qanday tozalaydi — alpha ga qarab:
   alpha     CV R2   haqiqiy saqlandi   shovqin saqlandi
----------------------------------------------------------
     0.1    0.8690              6 / 6             56 / 60
       1    0.8724              6 / 6             39 / 60
       5    0.8739              6 / 6              1 / 60
      20    0.8507              4 / 6              0 / 60
      50    0.7491              2 / 6              0 / 60

Mana bu jadval Lasso ni to'g'ri tushuntiradi — va men dastlab yozgan narsa noto'g'ri edi.

Men "Lasso shovqinni o'zi tashlab yuboradi" deb yozib, alpha=1 ni misol qilib oldim. Lekin alpha=1 da Lasso 60 shovqin ustunining 39 tasini saqlab qoldi. Ya'ni ishini bajarmadi.

Haqiqiy manzara:

  • alpha=0.1 — jarima juda kuchsiz, 56/60 shovqin qoladi
  • alpha=5 — eng yaxshi nuqta: 6/6 haqiqiy xususiyat saqlanadi, 59/60 shovqin tashlanadi, R2 eng baland
  • alpha=20 — jarima shunchalik kuchliki, haqiqiy xususiyatlardan ikkitasi ham tashlandi
  • alpha=50 — 6 tadan faqat 2 tasi qoldi, R2 qulab tushdi

"Lasso xususiyat tanlaydi" — yarim haqiqat

Darsliklarda shu jumla ko'p uchraydi va u talabani chalg'itadi. Lasso o'zi tanlamaydi — u alpha ga qarab tanlaydi, alpha ni esa siz topasiz.

Yuqoridagi jadval buni ko'rsatadi: bitta model, besh xil alpha, butunlay boshqa natija.

Shuning uchun LassoCV yoki GridSearchCV (23-bob) majburiy. "Lasso o'zi hal qiladi" degan umid bilan alpha=1 qo'yib ketish ishlamaydi.

alpha ni qanday tanlaysiz

Qo'lda emas — GridSearchCV bilan (23-bob). Lekin sklearn da tayyor variant ham bor:

python12 qator
from sklearn.linear_model import RidgeCV, LassoCV

alphalar = np.logspace(-3, 3, 40)
rcv = Pipeline([("sc", StandardScaler()), ("m", RidgeCV(alphas=alphalar, cv=5))]).fit(X_tr, y_tr)
lcv = Pipeline([("sc", StandardScaler()), ("m", LassoCV(alphas=alphalar, cv=5, max_iter=50000, random_state=42))]).fit(X_tr, y_tr)

print(f"RidgeCV tanlagan alpha : {rcv.named_steps['m'].alpha_:.4f}")
print(f"LassoCV tanlagan alpha : {lcv.named_steps['m'].alpha_:.4f}")
print()
from sklearn.metrics import r2_score
print(f"RidgeCV test R2: {r2_score(y_te, rcv.predict(X_te)):.4f}")
print(f"LassoCV test R2: {r2_score(y_te, lcv.predict(X_te)):.4f}")
Chiqish
RidgeCV tanlagan alpha : 7.0170
LassoCV tanlagan alpha : 0.0702

RidgeCV test R2: 0.8660
LassoCV test R2: 0.8665

`alpha` ni test to'plamida tanlamang

RidgeCV ichida cross-validation bor — u train ichida bo'linadi. Bu to'g'ri.

Agar siz qo'lda for alpha in [...] yozib, har birini test da o'lchab, eng yaxshisini tanlasangiz — siz test to'plamini validation sifatida ishlatdingiz (5-bob). Natijangiz optimistik bo'ladi.

Logistic regression da regularizatsiya

Muhim fakt: LogisticRegression da regularizatsiya sukut bo'yicha yoqilgan.

python13 qator
from sklearn.linear_model import LogisticRegression

yc = df["ijaraga_berildi_30k"]
print("LogisticRegression ning C parametri (C = 1/alpha):")
print(f"{'C':>8} {'jarima kuchi':>14} {'CV F1':>9} {'koef L2 normasi':>17}")
print("-" * 52)
for C in [0.01, 0.1, 1.0, 100.0]:
    q = Pipeline([("sc", StandardScaler()), ("m", LogisticRegression(C=C, max_iter=3000))])
    b = cross_val_score(q, X, yc, cv=5, scoring="f1")
    q.fit(X, yc)
    norma = np.linalg.norm(q.named_steps["m"].coef_)
    kuch = "juda kuchli" if C <= 0.01 else ("kuchli" if C < 1 else ("sukut" if C == 1 else "deyarli yo'q"))
    print(f"{C:>8} {kuch:>14} {b.mean():>9.4f} {norma:>17.4f}")
Chiqish
LogisticRegression ning C parametri (C = 1/alpha):
       C   jarima kuchi     CV F1   koef L2 normasi
----------------------------------------------------
    0.01    juda kuchli    0.7258            0.7005
     0.1         kuchli    0.7252            0.9195
     1.0          sukut    0.7210            0.9819
   100.0   deyarli yo'q    0.7210            0.9930

`C` — bu `alpha` ning TESKARISI

Bu sklearn dagi eng ko'p chalkashtiriladigan joy:

  • Ridge(alpha=...) — alpha katta = jarima kuchli
  • LogisticRegression(C=...) va SVC(C=...) — C katta = jarima KUCHSIZ

C = 1/alpha. Shuning uchun C=0.01 juda kuchli regularizatsiya, C=100 esa deyarli yo'q.

Intervyuda so'raladi, va amalda teskari yozib qo'yish oson.

Qaysi birini tanlaysiz

python8 qator
show(pd.DataFrame([
    {"Holat": "Xususiyat kam, hammasi foydali", "Tanlov": "LinearRegression yoki Ridge(kichik alpha)"},
    {"Holat": "Xususiyat ko'p, ba'zilari befoyda", "Tanlov": "Lasso — o'zi tanlaydi"},
    {"Holat": "Xususiyat ko'p VA o'zaro bog'liq", "Tanlov": "ElasticNet"},
    {"Holat": "Koeffitsiyent barqaror bo'lishi kerak", "Tanlov": "Ridge"},
    {"Holat": "Qaysi xususiyat muhim ekanini bilish kerak", "Tanlov": "Lasso (yoki SHAP — 25-bob)"},
    {"Holat": "Xususiyat > qator soni (m > n)", "Tanlov": "Ridge yoki Lasso — SHART"},
]))
HolatTanlov
Xususiyat kam, hammasi foydaliLinearRegression yoki Ridge(kichik alpha)
Xususiyat ko'p, ba'zilari befoydaLasso — o'zi tanlaydi
Xususiyat ko'p VA o'zaro bog'liqElasticNet
Koeffitsiyent barqaror bo'lishi kerakRidge
Qaysi xususiyat muhim ekanini bilish kerakLasso (yoki SHAP — 25-bob)
Xususiyat > qator soni (m > n)Ridge yoki Lasso — SHART

Oxirgi qator muhim: m > n bo'lganda (masalan 20 000 gen, 200 bemor) oddiy chiziqli regressiya cheksiz ko'p yechim topadi va hammasi train da mukammal bo'ladi. Regularizatsiya bittasini tanlashga majbur qiladi.

Bugun nima o'rgandik

python10 qator
show(pd.DataFrame([
    {"Tushuncha": "Regularizatsiya", "Bitta jumla": "Cost = MSE + alpha * vaznlar jarimasi"},
    {"Tushuncha": "Ridge (L2)", "Bitta jumla": "Hammasini kichiklashtiradi, nolga tushirmaydi"},
    {"Tushuncha": "Lasso (L1)", "Bitta jumla": "Ba'zilarini AYNAN nolga tushiradi — xususiyat tanlaydi"},
    {"Tushuncha": "Nega L1 nolga tushiradi", "Bitta jumla": "|w| ning hosilasi nolda ham o'zgarmaydi (romb vs doira)"},
    {"Tushuncha": "ElasticNet", "Bitta jumla": "L1 va L2 aralashmasi — bog'liq xususiyatlar uchun"},
    {"Tushuncha": "Scaling", "Bitta jumla": "Regularizatsiyada MAJBURIY — jarima adolatli bo'lishi uchun"},
    {"Tushuncha": "C va alpha", "Bitta jumla": "C = 1/alpha — teskari; C katta = jarima kuchsiz"},
    {"Tushuncha": "Beqarorlikni tuzatish", "Bitta jumla": "Ridge koeffitsiyent tarqalishini kamaytiradi"},
]))
TushunchaBitta jumla
RegularizatsiyaCost = MSE + alpha * vaznlar jarimasi
Ridge (L2)Hammasini kichiklashtiradi, nolga tushirmaydi
Lasso (L1)Ba'zilarini AYNAN nolga tushiradi — xususiyat tanlaydi
Nega L1 nolga tushiradi|w| ning hosilasi nolda ham o'zgarmaydi (romb vs doira)
ElasticNetL1 va L2 aralashmasi — bog'liq xususiyatlar uchun
ScalingRegularizatsiyada MAJBURIY — jarima adolatli bo'lishi uchun
C va alphaC = 1/alpha — teskari; C katta = jarima kuchsiz
Beqarorlikni tuzatishRidge koeffitsiyent tarqalishini kamaytiradi

Shu bilan chiziqli modellar tugadi. Keyingi bobda butunlay boshqa g'oya: gradient descent ham, koeffitsiyent ham yo'q. Faqat savollar va javoblar — daraxt.

Bu bobni bepul o'qidingiz.

Kitob o'rgatadi, lekin sizning kodingiz nega ishlamaganini ayta olmaydi. Kursda uy vazifangiz tekshiriladi.

Telegramda yozish Narxlar