IlmHamroh
Data Science va sun'iy intellekt/Model baholash sozlash5/12-dars19 daqiqa
Mundarija (22)

18.5-dars: Giperparametrlar

18-QISM — MODEL BAHOLASH VA SOZLASH · 5-dars


1. Kirish va motivatsiya

RandomForestClassifier da 19 ta parametr bor, HistGradientBoostingClassifier da 20 dan ortiq. Hammasini sozlashga urinish — vaqtni behuda sarflash: ularning ko'pchiligi natijaga deyarli ta'sir qilmaydi, bir nechtasi esa hal qiluvchi.

Giperparametr sozlash — qidiruv algoritmi haqidagi savol emas (u 18.6 va 18.7-darslarda), balki nimani va qanday oraliqda qidirish haqidagi savol. Noto'g'ri maydon tanlasangiz, eng aqlli qidiruv ham yordam bermaydi.

Bu darsda: parametr va giperparametr farqi, har bir asosiy model oilasida qaysi 2-3 parametr muhim, qidiruv oraliqlarini qanday belgilash (logarifmik va chiziqli), bog'liq parametrlar, sozlanmaydigan parametrlar va sozlashning amaliy tartibi.

Real vaziyat. Jamoa gradient boosting ni sozlashga bir hafta sarfladi: 14 ta parametr, 4000 kombinatsiya. Yaxshilanish +0.003. Keyin bitta o'zgarish qilishdi — learning_rate ni 0.1 dan 0.03 ga tushirib, max_iter ni 200 dan 1200 ga ko'tarishdi: +0.019. Muhim parametrlarni bilish 4000 kombinatsiyadan foydaliroq bo'ldi.

Bu darsda giperparametrlarni o'rganamiz.

Bu darsda:

  • Muhim va muhim bo'lmagan parametrlar
  • Model oilalari bo'yicha ro'yxat
  • Qidiruv oralig'ini belgilash
  • Bog'liq parametrlar
  • Sozlanmaydiganlar
  • Amaliy tartib
  • Tuzoqlar
  • Amaliy: maydon qurish

ℹ Misollar real numpy/sklearn bilan (Python 3.14).


2. Nazariya — chuqur tushuntirish

2.1. Parametr va giperparametr

text
PARAMETR - model MA'LUMOTDAN o'rganadi
  chiziqli regressiya koeffitsiyentlari
  daraxtning bo'linish nuqtalari
  neyron tarmoq og'irliklari

GIPERPARAMETR - siz OLDINDAN belgilaysiz
  alpha, C, max_depth, n_estimators, learning_rate

sklearn da:
  giperparametr -> __init__ argumenti  (model.get_params())
  parametr      -> fit dan keyin, oxirida _ bilan
                   (model.coef_, model.feature_importances_)

Oxirida pastki chiziq bor atribut (coef_, n_iter_) — o'rganilgan parametr; __init__ argumenti — giperparametr.

2.2. Model oilalari bo'yicha muhim parametrlar

text
CHIZIQLI (Ridge/Lasso/LogisticRegression)
  1. alpha yoki C      <- deyarli yagona muhim parametr
  2. penalty / l1_ratio
  (masshtablash SHART)

KNN
  1. n_neighbors
  2. weights (uniform/distance)
  3. metric

SVM (RBF)
  1. C
  2. gamma
  (ikkalasi BIRGA sozlanadi, masshtablash SHART)

RANDOM FOREST
  1. max_features        <- eng muhimi
  2. min_samples_leaf
  3. n_estimators (ko'proq = yaxshiroq, to'yinadi)

GRADIENT BOOSTING
  1. learning_rate + n_estimators (BOG'LIQ)
  2. max_depth / max_leaf_nodes
  3. min_samples_leaf, subsample, regularizatsiya

Har oilada 2-3 parametr natijaning 90% ini belgilaydi — qolganlarini sukut bo'yicha qoldiring.

2.3. Qidiruv oralig'ini belgilash

text
LOGARIFMIK (kattalik tartibi muhim bo'lganda):
  alpha, C, gamma, learning_rate, l2_regularization
  np.logspace(-4, 2, 13)   ->  1e-4 ... 100

CHIZIQLI (tabiiy chegarasi bor):
  max_depth (2..12), n_neighbors (1..50),
  min_samples_leaf (1..100), max_features (0.1..1.0)

QOIDA: eng yaxshi qiymat maydonning CHETIDA chiqsa,
       maydonni kengaytiring va qayta qidiring

MASSHTAB:
  C = 0.001, 0.01, 0.1, 1, 10   (to'g'ri)
  C = 1, 2, 3, 4, 5             (odatda foydasiz)

Chetda chiqqan natija — maydonni kengaytirish signali: C = 100 tanlangan bo'lsa, ehtimol 1000 yanada yaxshi.

2.4. Bog'liq parametrlar

text
learning_rate va n_estimators (boosting):
  lr ikki barobar kichik -> n_estimators ikki barobar katta
  amaliyot: lr ni qat'iy kichik qilib (0.03-0.05),
            n_estimators ni erta to'xtatish bilan topish

C va gamma (SVM RBF):
  gamma katta + C katta -> kuchli overfitting
  ikkalasini BIRGA setkada qidiring (1D qidiruv ishlamaydi)

max_depth va min_samples_leaf (daraxtlar):
  ikkalasi ham murakkablikni cheklaydi - biri yetarli

alpha va belgilar soni (Ridge):
  ko'proq belgi -> kattaroq alpha kerak

Bog'liq parametrlarni birin-ketin sozlash ishlamaydi: ular birgalikda setka yoki tasodifiy qidiruvda ko'rilishi kerak.

2.5. Sozlanmaydigan parametrlar

text
SOZLAMANG - qat'iy qiymat qo'ying:
  random_state      -> takrorlanuvchanlik uchun
  n_jobs            -> tezlik, natijaga ta'sir qilmaydi
  verbose           -> chiqish
  max_iter          -> yetarlicha katta (yaqinlashish uchun)
  tol               -> sukut bo'yicha

SOZLAMANG - domendan keladi:
  class_weight      -> biznes narxidan
  scoring           -> maqsaddan
  threshold         -> qaror narxidan (18.9-dars)

"KO'PROQ YAXSHIROQ" (to'yinadi):
  n_estimators (RF)  -> 300-500 dan keyin foyda yo'q

n_estimators (RF uchun) — giperparametr emas, resurs: ko'paytirsangiz yomonlashmaydi, shunchaki sekinlashadi.

2.6. Amaliy tartib

text
1. BAZAVIY: sukut parametrlar bilan natija oling
2. MUHIM 2-3 tasini keng logarifmik maydonda qidiring
   (RandomizedSearchCV, 20-40 nomzod)
3. Eng yaxshi atrofida TOR maydonda aniqlashtiring
4. Qolgan parametrlarni bittalab sinab ko'ring
   (yaxshilanish SE dan katta bo'lsa qoldiring)
5. Yakuniy modelni nested CV yoki alohida testda tasdiqlang

BYUDJET: umumiy vaqtning 20% idan ko'pini
         sozlashga sarflamang - belgilar ko'proq beradi

Sozlash — oxirgi 5%: belgi muhandisligi va ma'lumot sifati odatda ancha ko'proq foyda beradi.

2.7. Tuzoqlar

Asosiy tuzoqlar: hamma parametrni sozlashga urinish; chiziqli oraliqda C/alpha qidirish; learning_rate ni n_estimators siz sozlash; maydon chetida chiqqan natijani qabul qilish; random_state ni sozlash; masshtablanmagan ma'lumotda SVM/KNN sozlash; sozlashga vaqtning yarmini sarflash; sukut qiymatlarni "yomon" deb hisoblash.

2.8. Kam, lekin to'g'ri

Sozlashda kam parametr, keng oraliq tamoyili ishlaydi: har model oilasida 2-3 muhim parametrni logarifmik maydonda qidiring, qolganlarini sukut bo'yicha qoldiring. Bog'liq parametrlarni (learning_rate+n_estimators, C+gamma) birga ko'ring. random_state, n_jobs, max_iter — sozlanmaydi. Eng yaxshi qiymat maydon chetida chiqsa, maydonni kengaytiring.


3. Tez ma'lumotnoma

python
import numpy as np
from scipy.stats import loguniform, randint, uniform

# chiziqli
{"C": loguniform(1e-4, 1e2)}
# KNN
{"n_neighbors": randint(1, 50), "weights": ["uniform", "distance"]}
# SVM RBF (birga!)
{"C": loguniform(1e-2, 1e3), "gamma": loguniform(1e-4, 1e0)}
# Random Forest
{"max_features": uniform(0.1, 0.8), "min_samples_leaf": randint(1, 40)}
# Gradient boosting
{"learning_rate": loguniform(0.01, 0.3), "max_leaf_nodes": randint(5, 60),
 "min_samples_leaf": randint(5, 100), "l2_regularization": loguniform(1e-3, 10)}

model.get_params()                      # barcha giperparametrlar
QOIDA: 2-3 muhim parametr · logarifmik oraliq ·
       bog'liqlarni birga · chetda chiqsa kengaytir

Giperparametrlar xulosasi

Chiziqli: alpha/C
KNN: n_neighbors, weights
SVM: C va gamma (birga)
RF: max_features, min_samples_leaf
Boosting: learning_rate + n_estimators, chuqurlik
Sozlanmaydi: random_state, n_jobs, max_iter

4. Batafsil misollar

Misollar real numpy/sklearn bilan (Python 3.14).

Misol 1 — Qaysi parametr qanchalik muhim

python
"""Bitta parametrni o'zgartirib, ta'sirni o'lchash (real numpy/sklearn)."""

import numpy as np
from sklearn.datasets import make_classification
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import StratifiedKFold, cross_val_score


def main() -> None:
    X, y = make_classification(n_samples=1500, n_features=30,
                               n_informative=8, n_redundant=8, flip_y=0.15,
                               class_sep=0.85, random_state=0)
    cv = StratifiedKFold(5, shuffle=True, random_state=0)

    def baho(**kw):
        m = RandomForestClassifier(n_estimators=120, random_state=0,
                                   n_jobs=1, **kw)
        b = cross_val_score(m, X, y, cv=cv, scoring="roc_auc")
        return b.mean(), b.std()

    asos, asos_std = baho()
    print("=== 1. Bazaviy (sukut parametrlar) ===")
    print(f"  CV AUC {asos:.4f} (+-{asos_std:.4f})")

    print("\n=== 2. Har parametrni alohida o'zgartirish ===")
    tekshiruvlar = {
        "max_features": [("sqrt", {}), ("0.3", {"max_features": 0.3}),
                         ("0.6", {"max_features": 0.6}),
                         ("1.0", {"max_features": 1.0})],
        "min_samples_leaf": [("1", {}), ("5", {"min_samples_leaf": 5}),
                             ("20", {"min_samples_leaf": 20}),
                             ("60", {"min_samples_leaf": 60})],
        "max_depth": [("None", {}), ("4", {"max_depth": 4}),
                      ("8", {"max_depth": 8}), ("16", {"max_depth": 16})],
        "criterion": [("gini", {}), ("entropy", {"criterion": "entropy"}),
                      ("log_loss", {"criterion": "log_loss"})],
        "bootstrap": [("True", {}), ("False", {"bootstrap": False})],
    }
    print(f"  {'parametr':<20} {'eng past':>10} {'eng yuqori':>11} "
          f"{'oraliq':>9}")
    tasir = {}
    for nom, variantlar in tekshiruvlar.items():
        ballar = [baho(**kw)[0] for _, kw in variantlar]
        oraliq = max(ballar) - min(ballar)
        tasir[nom] = oraliq
        print(f"  {nom:<20} {min(ballar):>10.4f} {max(ballar):>11.4f} "
              f"{oraliq:>9.4f}")

    print("\n=== 3. Muhimlik tartibi ===")
    print(f"  {'parametr':<20} {'oraliq':>9} {'SE ga nisbatan':>16}")
    for nom, oraliq in sorted(tasir.items(), key=lambda kv: -kv[1]):
        print(f"  {nom:<20} {oraliq:>9.4f} {oraliq / asos_std:>15.1f}x")
    muhim = [n for n, o in tasir.items() if o > 2 * asos_std]
    print(f"  SE ning 2 barobaridan katta ta'sir: {muhim}")

    print("\n=== 4. n_estimators - giperparametr emas, resurs ===")
    print(f"  {'n_estimators':>13} {'CV AUC':>9} {'oldingidan':>11}")
    oldingi = None
    for n in [10, 50, 100, 250]:
        m = RandomForestClassifier(n_estimators=n, random_state=0, n_jobs=1)
        b = cross_val_score(m, X, y, cv=cv, scoring="roc_auc").mean()
        osish = "-" if oldingi is None else f"{b - oldingi:+.4f}"
        print(f"  {n:>13} {b:>9.4f} {osish:>11}")
        oldingi = b
    print("  ko'paytirish yomonlashtirmaydi, faqat to'yinadi")
    print("  ⭐ Har oilada 2-3 parametr natijaning ko'pini belgilaydi")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Bazaviy (sukut parametrlar) ===
  CV AUC 0.8987 (+-0.0158)

=== 2. Har parametrni alohida o'zgartirish ===
  parametr               eng past  eng yuqori    oraliq
  max_features             0.8878      0.8987    0.0109
  min_samples_leaf         0.8719      0.8987    0.0268
  max_depth                0.8828      0.8987    0.0159
  criterion                0.8984      0.8987    0.0003
  bootstrap                0.8987      0.9021    0.0034

=== 3. Muhimlik tartibi ===
  parametr                oraliq   SE ga nisbatan
  min_samples_leaf        0.0268             1.7x
  max_depth               0.0159             1.0x
  max_features            0.0109             0.7x
  bootstrap               0.0034             0.2x
  criterion               0.0003             0.0x
  SE ning 2 barobaridan katta ta'sir: []

=== 4. n_estimators - giperparametr emas, resurs ===
   n_estimators    CV AUC  oldingidan
             10    0.8661           -
             50    0.8936     +0.0275
            100    0.8978     +0.0042
            250    0.8988     +0.0010
  ko'paytirish yomonlashtirmaydi, faqat to'yinadi
  ⭐ Har oilada 2-3 parametr natijaning ko'pini belgilaydi

Nima ko'rsatdi: 2.1, 2.2-bo'limlar.

Misol 2 — Logarifmik va chiziqli oraliq

python
"""Oraliqni to'g'ri tanlash (real numpy/sklearn)."""

import numpy as np
from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import StratifiedKFold, cross_val_score
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler


def main() -> None:
    X, y = make_classification(n_samples=1500, n_features=60,
                               n_informative=10, n_redundant=20,
                               flip_y=0.2, class_sep=0.8, random_state=0)
    cv = StratifiedKFold(5, shuffle=True, random_state=0)

    def baho(C: float) -> float:
        m = make_pipeline(StandardScaler(),
                          LogisticRegression(C=C, max_iter=3000))
        return cross_val_score(m, X, y, cv=cv, scoring="roc_auc").mean()

    print("=== 1. Chiziqli oraliq: C = 1..5 ===")
    chiziqli = {C: baho(C) for C in [1, 2, 3, 4, 5]}
    print(f"  {'C':>8} {'CV AUC':>9}")
    for C, b in chiziqli.items():
        print(f"  {C:>8} {b:>9.4f}")
    print(f"  oraliq: {max(chiziqli.values()) - min(chiziqli.values()):.5f}")
    print("  besh nuqta ham deyarli bir xil - qidiruv behuda")

    print("\n=== 2. Logarifmik oraliq: C = 1e-4..1e2 ===")
    log_C = np.logspace(-4, 2, 13)
    log_ballar = {float(C): baho(float(C)) for C in log_C}
    print(f"  {'C':>10} {'CV AUC':>9}")
    for C, b in list(log_ballar.items())[::2]:
        print(f"  {C:>10.4g} {b:>9.4f}")
    print(f"  oraliq: {max(log_ballar.values()) - min(log_ballar.values()):.4f}")
    eng_C = max(log_ballar, key=log_ballar.get)
    print(f"  eng yaxshi C = {eng_C:.4g} (AUC {log_ballar[eng_C]:.4f})")

    print("\n=== 3. Maydon cheti muammosi ===")
    tor = np.logspace(0, 2, 5)
    tor_ballar = {float(C): baho(float(C)) for C in tor}
    eng_tor = max(tor_ballar, key=tor_ballar.get)
    print(f"  tor maydon [1, 100]: eng yaxshi C = {eng_tor:.4g}")
    print(f"  chetdami: {eng_tor in (float(tor[0]), float(tor[-1]))}")
    print(f"  keng maydonda esa C = {eng_C:.4g}")
    print(f"  tor maydon natijasi: {tor_ballar[eng_tor]:.4f}")
    print(f"  keng maydon natijasi: {log_ballar[eng_C]:.4f}")
    print(f"  yo'qotish: {log_ballar[eng_C] - tor_ballar[eng_tor]:+.4f}")

    print("\n=== 4. Masshtablashning ahamiyati ===")
    print(f"  {'variant':<28} {'eng yaxshi C':>13} {'CV AUC':>9}")
    for nom, quvur_yasovchi in [
            ("masshtablangan",
             lambda C: make_pipeline(StandardScaler(),
                                     LogisticRegression(C=C,
                                                        max_iter=3000))),
            ("masshtablanmagan",
             lambda C: LogisticRegression(C=C, max_iter=3000))]:
        ballar = {}
        for C in np.logspace(-4, 2, 7):
            m = quvur_yasovchi(float(C))
            ballar[float(C)] = cross_val_score(m, X, y, cv=cv,
                                               scoring="roc_auc").mean()
        eng = max(ballar, key=ballar.get)
        print(f"  {nom:<28} {eng:>13.4g} {ballar[eng]:>9.4f}")
    print("  ⭐ C va alpha uchun logarifmik oraliq - yagona to'g'ri yo'l")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Chiziqli oraliq: C = 1..5 ===
         C    CV AUC
         1    0.6533
         2    0.6532
         3    0.6532
         4    0.6532
         5    0.6532
  oraliq: 0.00019
  besh nuqta ham deyarli bir xil - qidiruv behuda

=== 2. Logarifmik oraliq: C = 1e-4..1e2 ===
           C    CV AUC
      0.0001    0.6626
       0.001    0.6652
        0.01    0.6584
         0.1    0.6539
           1    0.6533
          10    0.6532
         100    0.6532
  oraliq: 0.0120
  eng yaxshi C = 0.001 (AUC 0.6652)

=== 3. Maydon cheti muammosi ===
  tor maydon [1, 100]: eng yaxshi C = 1
  chetdami: True
  keng maydonda esa C = 0.001
  tor maydon natijasi: 0.6533
  keng maydon natijasi: 0.6652
  yo'qotish: +0.0118

=== 4. Masshtablashning ahamiyati ===
  variant                       eng yaxshi C    CV AUC
  masshtablangan                       0.001    0.6652
  masshtablanmagan                     0.001    0.6716
  ⭐ C va alpha uchun logarifmik oraliq - yagona to'g'ri yo'l

Nima ko'rsatdi: 2.3-bo'lim.

Misol 3 — Bog'liq parametrlar

python
"""learning_rate + n_estimators va C + gamma (real numpy/sklearn)."""

import numpy as np
from sklearn.datasets import make_classification
from sklearn.ensemble import HistGradientBoostingClassifier
from sklearn.model_selection import StratifiedKFold, cross_val_score
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC


def main() -> None:
    X, y = make_classification(n_samples=2000, n_features=20,
                               n_informative=7, n_redundant=4, flip_y=0.15,
                               class_sep=0.85, random_state=0)
    cv = StratifiedKFold(4, shuffle=True, random_state=0)

    print("=== 1. learning_rate va max_iter bog'liqligi ===")
    print(f"  {'lr':>7} {'max_iter':>10} {'CV AUC':>9}")
    eng_yaxshi = {}
    for lr in [0.3, 0.1, 0.03]:
        for it in [50, 150, 500]:
            m = HistGradientBoostingClassifier(learning_rate=lr, max_iter=it,
                                               early_stopping=False,
                                               random_state=0)
            b = cross_val_score(m, X, y, cv=cv, scoring="roc_auc").mean()
            eng_yaxshi[(lr, it)] = b
            print(f"  {lr:>7} {it:>10} {b:>9.4f}")
    par = max(eng_yaxshi, key=eng_yaxshi.get)
    print(f"  eng yaxshi: lr={par[0]}, max_iter={par[1]} "
          f"({eng_yaxshi[par]:.4f})")
    print("  kichik lr uchun ko'proq iteratsiya kerak")

    print("\n=== 2. Faqat lr ni sozlash (max_iter qat'iy 100) ===")
    print(f"  {'lr':>7} {'CV AUC':>9}")
    bir_olchovli = {}
    for lr in [0.3, 0.1, 0.03, 0.01]:
        m = HistGradientBoostingClassifier(learning_rate=lr, max_iter=100,
                                           early_stopping=False,
                                           random_state=0)
        bir_olchovli[lr] = cross_val_score(m, X, y, cv=cv,
                                           scoring="roc_auc").mean()
        print(f"  {lr:>7} {bir_olchovli[lr]:>9.4f}")
    eng_1d = max(bir_olchovli, key=bir_olchovli.get)
    print(f"  1D qidiruv: lr={eng_1d} -> {bir_olchovli[eng_1d]:.4f}")
    print(f"  2D qidiruv: {eng_yaxshi[par]:.4f}")
    print(f"  yo'qotish: {eng_yaxshi[par] - bir_olchovli[eng_1d]:+.4f}")

    print("\n=== 3. SVM: C va gamma birga ===")
    print(f"  {'gamma':>8}", end="")
    C_lar = [0.1, 1, 10, 100]
    for C in C_lar:
        print(f" {'C=' + str(C):>9}", end="")
    print()
    setka = {}
    for gamma in [0.001, 0.01, 0.1, 1.0]:
        print(f"  {gamma:>8}", end="")
        for C in C_lar:
            m = make_pipeline(StandardScaler(),
                              SVC(C=C, gamma=gamma, random_state=0))
            b = cross_val_score(m, X, y, cv=cv, scoring="roc_auc").mean()
            setka[(C, gamma)] = b
            print(f" {b:>9.4f}", end="")
        print()
    eng = max(setka, key=setka.get)
    print(f"  eng yaxshi: C={eng[0]}, gamma={eng[1]} ({setka[eng]:.4f})")

    print("\n=== 4. SVM da bittalab sozlash ishlaydimi ===")
    # avval gamma ni sukut C=1 bilan
    gamma_ballar = {g: setka[(1, g)] for g in [0.001, 0.01, 0.1, 1.0]}
    eng_gamma = max(gamma_ballar, key=gamma_ballar.get)
    # keyin C ni shu gamma bilan
    C_ballar = {C: setka[(C, eng_gamma)] for C in C_lar}
    eng_C = max(C_ballar, key=C_ballar.get)
    print(f"  1-qadam (C=1): eng yaxshi gamma = {eng_gamma}")
    print(f"  2-qadam: eng yaxshi C = {eng_C}")
    print(f"  ketma-ket natija: {setka[(eng_C, eng_gamma)]:.4f}")
    print(f"  to'liq setka:     {setka[eng]:.4f}")
    print(f"  farq: {setka[eng] - setka[(eng_C, eng_gamma)]:+.4f}")
    print("  ⭐ Bog'liq parametrlarni birga qidiring")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. learning_rate va max_iter bog'liqligi ===
       lr   max_iter    CV AUC
      0.3         50    0.8652
      0.3        150    0.8702
      0.3        500    0.8707
      0.1         50    0.8667
      0.1        150    0.8713
      0.1        500    0.8732
     0.03         50    0.8546
     0.03        150    0.8681
     0.03        500    0.8712
  eng yaxshi: lr=0.1, max_iter=500 0.8732-bob
  kichik lr uchun ko'proq iteratsiya kerak

=== 2. Faqat lr ni sozlash (max_iter qat'iy 100) ===
       lr    CV AUC
      0.3    0.8685
      0.1    0.8701
     0.03    0.8647
     0.01    0.8457
  1D qidiruv: lr=0.1 -> 0.8701
  2D qidiruv: 0.8732
  yo'qotish: +0.0031

=== 3. SVM: C va gamma birga ===
     gamma     C=0.1       C=1      C=10     C=100
     0.001    0.7068    0.7148    0.7402    0.8175
      0.01    0.7421    0.8164    0.8526    0.8483
       0.1    0.8261    0.8620    0.8326    0.8313
       1.0    0.7272    0.7273    0.7273    0.7273
  eng yaxshi: C=1, gamma=0.1 0.8620-bob

=== 4. SVM da bittalab sozlash ishlaydimi ===
  1-qadam (C=1): eng yaxshi gamma = 0.1
  2-qadam: eng yaxshi C = 1
  ketma-ket natija: 0.8620
  to'liq setka:     0.8620
  farq: +0.0000
  ⭐ Bog'liq parametrlarni birga qidiring

Nima ko'rsatdi: 2.4-bo'lim.

Misol 4 — Amaliy tartib

python
"""Bazaviy -> keng qidiruv -> aniqlashtirish (real numpy/sklearn)."""

import numpy as np
from scipy.stats import loguniform, randint
from sklearn.datasets import make_classification
from sklearn.ensemble import HistGradientBoostingClassifier
from sklearn.model_selection import (RandomizedSearchCV, StratifiedKFold,
                                     cross_val_score)


def main() -> None:
    X, y = make_classification(n_samples=2000, n_features=25,
                               n_informative=8, n_redundant=6, flip_y=0.18,
                               class_sep=0.8, random_state=0)
    cv = StratifiedKFold(4, shuffle=True, random_state=0)

    def baho(model) -> tuple:
        b = cross_val_score(model, X, y, cv=cv, scoring="roc_auc")
        return b.mean(), b.std()

    print("=== 1. Bazaviy ===")
    asos, asos_std = baho(HistGradientBoostingClassifier(random_state=0))
    print(f"  sukut parametrlar: {asos:.4f} (+-{asos_std:.4f})")

    print("\n=== 2. Keng qidiruv (muhim 3 parametr, 18 nomzod) ===")
    keng = {"learning_rate": loguniform(0.01, 0.4),
            "max_leaf_nodes": randint(5, 60),
            "min_samples_leaf": randint(5, 120)}
    q1 = RandomizedSearchCV(
        HistGradientBoostingClassifier(max_iter=200, early_stopping=False,
                                       random_state=0),
        keng, n_iter=18, cv=cv, scoring="roc_auc", random_state=0,
        n_jobs=1).fit(X, y)
    p1 = q1.best_params_
    print(f"  eng yaxshi: lr={p1['learning_rate']:.4f}, "
          f"barglar={p1['max_leaf_nodes']}, "
          f"min_leaf={p1['min_samples_leaf']}")
    print(f"  ball: {q1.best_score_:.4f} "
          f"(bazaviydan {q1.best_score_ - asos:+.4f})")

    print("\n=== 3. Tor maydonda aniqlashtirish ===")
    lr = p1["learning_rate"]
    barg = p1["max_leaf_nodes"]
    tor = {"learning_rate": loguniform(lr / 2, lr * 2),
           "max_leaf_nodes": randint(max(4, barg - 8), barg + 9),
           "min_samples_leaf": randint(
               max(2, p1["min_samples_leaf"] - 20),
               p1["min_samples_leaf"] + 21)}
    q2 = RandomizedSearchCV(
        HistGradientBoostingClassifier(max_iter=200, early_stopping=False,
                                       random_state=0),
        tor, n_iter=12, cv=cv, scoring="roc_auc", random_state=1,
        n_jobs=1).fit(X, y)
    print(f"  ball: {q2.best_score_:.4f} "
          f"(keng qidiruvdan {q2.best_score_ - q1.best_score_:+.4f})")

    print("\n=== 4. Qo'shimcha parametrlarni bittalab sinash ===")
    eng = dict(q2.best_params_)
    joriy = q2.best_score_
    print(f"  {'qo_shimcha':<34} {'ball':>9} {'o_sish':>9} {'qaror':<12}")
    for nom, qiymat in [("l2_regularization=1.0",
                         {"l2_regularization": 1.0}),
                        ("l2_regularization=5.0",
                         {"l2_regularization": 5.0}),
                        ("max_features=0.6", {"max_features": 0.6}),
                        ("interaction_cst='no_interactions'",
                         {"interaction_cst": "no_interactions"})]:
        m = HistGradientBoostingClassifier(max_iter=200,
                                           early_stopping=False,
                                           random_state=0, **eng, **qiymat)
        b, s = baho(m)
        qaror = "QOLDIRISH" if b - joriy > s else "tashlash"
        print(f"  {nom:<34} {b:>9.4f} {b - joriy:>+9.4f} {qaror:<12}")

    print("\n=== 5. Yakuniy hisobot ===")
    print(f"  {'bosqich':<28} {'ball':>9} {'o_sish':>9}")
    print(f"  {'bazaviy':<28} {asos:>9.4f} {'-':>9}")
    print(f"  {'keng qidiruv (18)':<28} {q1.best_score_:>9.4f} "
          f"{q1.best_score_ - asos:>+9.4f}")
    print(f"  {'aniqlashtirish (12)':<28} {q2.best_score_:>9.4f} "
          f"{q2.best_score_ - q1.best_score_:>+9.4f}")
    print(f"  jami o'sish: {q2.best_score_ - asos:+.4f} "
          f"(bazaviy SE: {asos_std:.4f})")
    print("  ⭐ Bazaviy -> keng -> tor -> bittalab")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Bazaviy ===
  sukut parametrlar: 0.8485 (+-0.0189)

=== 2. Keng qidiruv (muhim 3 parametr, 18 nomzod) ===
  eng yaxshi: lr=0.0331, barglar=10, min_leaf=43
  ball: 0.8507 (bazaviydan +0.0022)

=== 3. Tor maydonda aniqlashtirish ===
  ball: 0.8523 (keng qidiruvdan +0.0016)

=== 4. Qo'shimcha parametrlarni bittalab sinash ===
  qo_shimcha                              ball    o_sish qaror
  l2_regularization=1.0                 0.8518   -0.0006 tashlash
  l2_regularization=5.0                 0.8506   -0.0017 tashlash
  max_features=0.6                      0.8518   -0.0005 tashlash
  interaction_cst='no_interactions'     0.8127   -0.0397 tashlash

=== 5. Yakuniy hisobot ===
  bosqich                           ball    o_sish
  bazaviy                         0.8485         -
  keng qidiruv (18)               0.8507   +0.0022
  aniqlashtirish (12)             0.8523   +0.0016
  jami o'sish: +0.0038 (bazaviy SE: 0.0189)
  ⭐ Bazaviy -> keng -> tor -> bittalab

Nima ko'rsatdi: 2.6-bo'lim.


5. To'g'ri va noto'g'ri tushunishlar

Noto'g'ri fikr To'g'risi
"Hamma parametrni sozlash kerak" 2-3 tasi yetarli
"C = 1, 2, 3 yaxshi oraliq" Logarifmik kerak
"n_estimators sozlanadi" Resurs, to'yinadi
"Parametrlarni bittalab sozlash" Bog'liqlari birga
"random_state ni sozlash mumkin" Bu sozlash emas, moslashuv
"Sukut qiymatlar yomon" Ko'pincha yaxshi
"Sozlash eng muhim bosqich" Belgilar ko'proq beradi
"Chetda chiqqan qiymat — javob" Maydonni kengaytiring

6. Keng tarqalgan xatolar va yechimlari

1. Chiziqli oraliq

python
{"C": [1, 2, 3, 4, 5]}                                           # ⚠️
{"C": np.logspace(-4, 2, 13)}                                    # ✅

2. Hamma parametrni sozlash

python
{"max_depth": ..., "criterion": ..., "bootstrap": ...,
 "min_impurity_decrease": ..., "ccp_alpha": ...}                 # ⚠️
{"max_features": ..., "min_samples_leaf": ...}                   # ✅

3. learning_rate ni yolg'iz sozlash

python
{"learning_rate": [0.3, 0.1, 0.03]}      # max_iter qat'iy       # ⚠️
{"learning_rate": [...], "max_iter": [...]}                      # ✅

4. Chetdagi natijani qabul qilish

python
# eng yaxshi C = 100 (maydon chegarasi) -> tayyor             # ⚠️
# maydonni 1e3 gacha kengaytirib qayta qidiring               # ✅

5. random_state ni sozlash

python
{"random_state": [0, 1, 2, 3, 4]}                                # ⚠️
RandomForestClassifier(random_state=0)                           # ✅

6. Masshtablanmagan SVM/KNN

python
GridSearchCV(SVC(), {"C": ..., "gamma": ...})                    # ⚠️
GridSearchCV(make_pipeline(StandardScaler(), SVC()), {...})      # ✅

7. max_iter ni sozlash

python
{"max_iter": [100, 500, 1000]}   # LogisticRegression uchun      # ⚠️
LogisticRegression(max_iter=3000)   # yetarlicha katta           # ✅

7. Integratsiya — bu bilim qayerda kerak bo'ladi

  • 13.7-dars (o'tilgan): Ridge va alpha
  • 15.9-dars (o'tilgan): Boostingni sozlash
  • 18.6-dars: Grid va random search
  • 18.7-dars: Halving va erta to'xtash
  • 19-qism: scikit-learn to'liq

8. Eng yaxshi amaliyotlar

  1. Bazaviydan boshlang.

  2. 2-3 muhim parametr.

  3. Logarifmik oraliq.

  4. Bog'liqlarni birga.

  5. Chetda chiqsa kengaytiring.

  6. random_state qat'iy.

  7. Qo'shimchani SE bilan tekshiring.

  8. Sozlashga vaqtning 20% idan ko'pini bermang.


9. Amaliy topshiriq

Vazifa 1: Bashorat qiling

python
1.  # parametr va giperparametr farqi?
2.  # sklearn da qaysi atribut o'rganilgan?
3.  # chiziqli modelda muhim parametr?
4.  # SVM RBF da?
5.  # RF da eng muhimi?
6.  # boostingda bog'liq juftlik?
7.  # qaysi oraliq C uchun?
8.  # max_depth uchun?
9.  # chetda chiqsa nima qilish?
10. # sozlanmaydigan parametrlar?
11. # n_estimators (RF) nima?
12. # amaliy tartib?
Javoblar
  1. Biri o'rganiladi, biri belgilanadi
  2. Oxirida _ bor (coef_)
  3. alpha yoki C
  4. C va gamma
  5. max_features
  6. learning_rate + n_estimators
  7. Logarifmik
  8. Chiziqli
  9. Maydonni kengaytirish
  10. random_state, n_jobs, max_iter
  11. Resurs, to'yinadi
  12. Bazaviy → keng → tor → bittalab

Vazifa 2: Xatolarni tuzating

python
1.  {"C": [1, 2, 3, 4, 5]}

2.  {"learning_rate": [0.3, 0.1, 0.03]}   # max_iter qat'iy

3.  {"random_state": [0, 1, 2, 3, 4]}

4.  GridSearchCV(SVC(), {"C": ..., "gamma": ...})

5.  {"max_iter": [100, 500, 1000]}
Javoblar
python
1.  {"C": np.logspace(-4, 2, 13)}

2.  {"learning_rate": [...], "max_iter": [...]}

3.  RandomForestClassifier(random_state=0)

4.  GridSearchCV(make_pipeline(StandardScaler(), SVC()), {...})

5.  LogisticRegression(max_iter=3000)

Vazifa 3: Muhimlik

Modellang:

  1. Bazaviy
  2. Alohida o'zgartirish
  3. Tartib
  4. n_estimators

Vazifa 4: Oraliq

Modellang:

  1. Chiziqli
  2. Logarifmik
  3. Chet muammosi
  4. Masshtablash

Vazifa 5: Bog'liqlik

Modellang:

  1. lr va max_iter
  2. 1D qidiruv
  3. C va gamma
  4. Ketma-ket sozlash

Vazifa 6: Tartib

Modellang:

  1. Bazaviy
  2. Keng
  3. Tor
  4. Qo'shimchalar

Vazifa 7: O'ylash

Yangi hamkasbingiz RandomForestClassifier uchun quyidagi setkani tuzdi: n_estimators [50, 100, 200], max_depth [5, 10, 20, None], min_samples_split [2, 5, 10], min_samples_leaf [1, 2, 4], criterion ["gini", "entropy"], bootstrap [True, False] — jami 432 kombinatsiya. Setkani qanday qayta tuzasiz?

Javob

Qisqa javob: 432 dan ~20 ga tushiring: max_features va min_samples_leaf ni tasodifiy qidiruvda, n_estimators ni qat'iy katta qilib.

1. Nima noto'g'ri

Parametr Muammo
n_estimators Giperparametr emas — resurs; katta qilib qo'ying
criterion RF da ta'siri deyarli nol
bootstrap=False RF ni Extra Trees ga o'xshatadi; alohida model sifatida ko'ring
max_depth + min_samples_split + min_samples_leaf Uchalasi bir xil narsani cheklaydi
max_features YO'Q — RF ning eng muhim parametri tushib qolgan

2. Qayta tuzilgan maydon

python
from scipy.stats import randint, uniform

model = RandomForestClassifier(n_estimators=500, random_state=0, n_jobs=1)

taqsimot = {
    "max_features": uniform(0.1, 0.7),      # 0.1 .. 0.8
    "min_samples_leaf": randint(1, 40),
}

qidiruv = RandomizedSearchCV(model, taqsimot, n_iter=20, cv=cv,
                             scoring="roc_auc", random_state=0)

3. Nima uchun bu yetarli

  1. max_features — RF daraxtlari orasidagi korrelyatsiyani boshqaradi, ya'ni ansamblning asosiy mexanizmini.
  2. min_samples_leaf — daraxt murakkabligini boshqaradigan yagona parametr sifatida yetarli; max_depth va min_samples_split qo'shimcha foyda bermaydi.
  3. n_estimators = 500 — ko'paytirish zarar qilmaydi, shuning uchun qidiruvdan chiqariladi.

4. Narx solishtirmasi

Variant Kombinatsiya 5-fold model soni
Asl setka 432 2160
Qayta tuzilgan 20 100

21 barobar arzon, va natija odatda bir xil yoki yaxshiroq — chunki max_features qo'shilgan.

5. Agar vaqt qolsa

  1. class_weight="balanced" ni alohida sinab ko'ring (nomutanosib bo'lsa)
  2. ExtraTreesClassifier ni alohida model sifatida taqqoslang
  3. HistGradientBoostingClassifier ni ham qo'shing — u ko'pincha RF dan ustun

6. Xulosa

  1. max_features va min_samples_leaf — asosiy ikkilik
  2. n_estimators ni qat'iy katta qiling
  3. criterion, bootstrap ni tashlang
  4. RandomizedSearchCV(n_iter=20) yetarli

Nimani mustahkamlaydi: 2.2, 2.3, 2.5-bo'limlar.


Xulosa

Bu darsda giperparametrlarni o'rgandik.

Eng muhim uch fikr:

  1. Har model oilasida 2-3 parametr hal qiluvchi. Chiziqlida — alpha/C; KNN da — n_neighbors; SVM da — C va gamma; Random Forest da — max_features va min_samples_leaf; boostingda — learning_rate + iteratsiyalar soni va chuqurlik. Qolganlarini sukut bo'yicha qoldiring: ular natijani SE dan kam o'zgartiradi, lekin qidiruv maydonini bir necha barobar kattalashtiradi.

  2. Oraliqni to'g'ri tanlang: C, alpha, gamma, learning_rate — logarifmik. [1, 2, 3, 4, 5] kabi chiziqli ro'yxat deyarli hech narsa bermaydi, np.logspace(-4, 2, 13) esa butun ma'noli diapazonni qamrab oladi. Eng yaxshi qiymat maydonning chetida chiqsa — bu javob emas, maydonni kengaytirish signali.

  3. Bog'liq parametrlarni birga qidiring va sozlashga ko'p vaqt sarflamang. learning_rate ni n_estimators siz, gamma ni C siz sozlash noto'g'ri javob beradi. Tartib: bazaviy → keng tasodifiy qidiruv → tor aniqlashtirish → qolganlarini bittalab. Sozlash odatda +0.005…+0.02 beradi; belgi muhandisligi esa ko'proq — shuning uchun byudjetning katta qismini unga ajrating.

Keyingi darsda grid va random searchni batafsil ko'rib chiqamiz: GridSearchCV, RandomizedSearchCV, taqsimotlar, cv_results_ tahlili va byudjetni taqsimlash.

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!