Regularization: Ridge, Lasso, Elastic Net
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.
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}")
vaznlar: [ 3. -4. 0.5] L2 jarima (kvadratlar yig'indisi): 25.2500 L1 jarima (mutlaq qiymatlar) : 7.5000
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"}, ]))
| Model | Jarima | Vaznlarga ta'siri | Qachon |
|---|---|---|---|
| Ridge | L2: alpha * sum(w^2) | Hammasini KICHIKLASHTIRADI, nolga tushirmaydi | Hamma xususiyat bir oz foydali bo'lsa |
| Lasso | L1: alpha * sum(|w|) | Ba'zilarini AYNAN NOLGA tushiradi | Xususiyat tanlash kerak bo'lsa |
| Elastic Net | L1 va L2 aralashmasi | Ikkisining o'rtasi | Ko'p va o'zaro bog'liq xususiyat bo'lsa |
Avval: scaling bu yerda MAJBURIY
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}")
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)
alphaqiymati 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
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)}")
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.
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))
| Model | xonalar: eng past..eng baland | xonalar tarqalishi | maydon_m2 tarqalishi |
|---|---|---|---|
| Oddiy (LinearRegression) | 54.5 .. 69.6 | 4.73 | 4.49 |
| Ridge (alpha=10) | 62.5 .. 75.8 | 4.1 | 3.77 |
| Ridge (alpha=100) | 82.6 .. 89.1 | 2.13 | 1.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
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}")
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.
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))
Lasso (alpha=1) tanlagan xususiyatlar — 17 ta 83 dan:
| xususiyat | koeffitsiyent |
|---|---|
| maydon_m2 | 143.484 |
| xonalar | 60.1 |
| metro_km | -51.271 |
| mebel | 41.385 |
| qavat | 16.221 |
| metro_km^3 | 11.008 |
| qavat^2 mebel | -8.395 |
| xonalar qavatlar_soni | 6.4 |
| qavat^3 | -4.769 |
| qavat qavatlar_soni | 3.871 |
| maydon_m2 qavat^2 | -3.447 |
| xonalar mebel | 3.177 |
Nega L1 nolga tushiradi, L2 esa tushirmaydi
Sabab jarimaning shaklida.
L2jarimasiw^2— vazn nolga yaqinlashganda hosila ham nolga yaqinlashadi. Ya'ni nolga yaqinlashtiradi, lekin yetib bormaydi.L1jarimasi|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
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}")
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.
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}")
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
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")
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 qoladialpha=5— eng yaxshi nuqta: 6/6 haqiqiy xususiyat saqlanadi, 59/60 shovqin tashlanadi,R2eng balandalpha=20— jarima shunchalik kuchliki, haqiqiy xususiyatlardan ikkitasi ham tashlandialpha=50— 6 tadan faqat 2 tasi qoldi,R2qulab 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:
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}")
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.
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}")
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 kuchliLogisticRegression(C=...)vaSVC(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
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"}, ]))
| Holat | Tanlov |
|---|---|
| Xususiyat kam, hammasi foydali | LinearRegression yoki Ridge(kichik alpha) |
| Xususiyat ko'p, ba'zilari befoyda | Lasso — o'zi tanlaydi |
| Xususiyat ko'p VA o'zaro bog'liq | ElasticNet |
| Koeffitsiyent barqaror bo'lishi kerak | Ridge |
| Qaysi xususiyat muhim ekanini bilish kerak | Lasso (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
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"}, ]))
| Tushuncha | Bitta jumla |
|---|---|
| Regularizatsiya | Cost = 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) |
| ElasticNet | L1 va L2 aralashmasi — bog'liq xususiyatlar uchun |
| Scaling | Regularizatsiyada MAJBURIY — jarima adolatli bo'lishi uchun |
| C va alpha | C = 1/alpha — teskari; C katta = jarima kuchsiz |
| Beqarorlikni tuzatish | Ridge 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.