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

13.11-dars: Robust va kvantil regressiya

13-QISM — REGRESSIYA · 11-dars


1. Kirish va motivatsiya

OLS ning eng jiddiy zaifligi — outlierlarga sezgirlik 13.1-bob: kvadratik yo'qotish bitta chetlangan nuqtaga juda katta vazn beradi. Real ma'lumotda esa chetlangan qiymatlar deyarli har doim bor — o'lchov xatosi, noyob holat, firibgarlik. Robust regressiya shu muammoni hal qiladi; kvantil regressiya esa boshqa savolga javob beradi: "o'rtacha emas, 90-persentil qancha?"

Bu darsda: Huber yo'qotishi va uning epsilon parametri, RANSAC va Theil-Sen, qachon qaysi biri, kvantil regressiya va pinball loss 12.8-bob, bashorat intervallari va bu usullarning narxi.

Real vaziyat. Yetkazib berish xizmati kuryer vaqtini bashorat qiladi. Ma'lumotda 2% yozuv buzilgan (GPS xatosi tufayli 8 soatlik "safar"lar). OLS bu yozuvlardan nishabni 34% ga siljitdi. Huber regressiyasi deyarli o'zgarmadi. Bundan tashqari, mijozga va'da qilish uchun o'rtacha emas, 80-persentil kerak edi — kvantil regressiya (q=0.8) aynan shuni berdi.

Bu darsda robust va kvantil usullarni o'rganamiz.

Bu darsda:

  • Huber yo'qotishi
  • Kvantil regressiya
  • RANSAC va Theil-Sen
  • Qachon qaysi usul
  • Bashorat intervallari
  • Usullarning narxi
  • Tuzoqlar
  • Amaliy: yetkazib berish vaqti

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


2. Nazariya — chuqur tushuntirish

2.1. Huber yo'qotishi

text
Kichik xatolarda kvadratik, katta xatolarda CHIZIQLI:

  L(r) = 0.5 · r^2                  agar |r| <= d
       = d · (|r| - 0.5 · d)        agar |r| > d

d (epsilon) — chegara; sklearn da standart 1.35 (standartlashtirilgan qoldiqda)
  d katta → OLS ga yaqin
  d kichik → MAE ga yaqin (robustroq)

HuberRegressor(epsilon=1.35, alpha=0.0001)   ← masshtablash kerak

Huber — OLS va MAE orasidagi murosa: markazda kvadratik (samarali, silliq), dumlarda chiziqli (outlier ta'sirini cheklaydi). epsilon outlier deb hisoblanadigan chegarani belgilaydi. Bu — amaliyotda eng ko'p ishlatiladigan robust usul, chunki u tez va barqaror.

2.2. Kvantil regressiya

text
Pinball (kvantil) yo'qotish, q uchun:
  L_q(r) = q · r          agar r >= 0   (kam bashorat qilindi)
         = (q - 1) · r    agar r < 0    (ortiq bashorat qilindi)

q = 0.5 → median regressiyasi (MAE) — robust
q = 0.9 → 90-persentil chizig'i

QuantileRegressor(quantile=0.5, alpha=0.0)
GradientBoostingRegressor(loss="quantile", alpha=q)   ← nochiziqli variant

Kvantil regressiya o'rtachani emas, shartli kvantilni modellaydi. Ikki foydasi bor: q = 0.5 (median) robust bahoni beradi; boshqa q lar esa bashorat intervali va asimmetrik narx masalalarini hal qiladi (12.8, 9.10). Muhim xossa: kvantil regressiya geteroskedastiklikni tabiiy ravishda ko'rsatadi — q=0.1 va q=0.9 chiziqlari uzoqlashsa, tarqoqlik o'sib boryapti.

2.3. RANSAC va Theil-Sen

text
RANSAC (RANdom SAmple Consensus):
  1. tasodifiy minimal namuna tanlab model qurish
  2. unga mos keladigan ("inlier") nuqtalarni sanash
  3. eng ko'p inlier bergan modelni saqlash, takrorlash
  → 50% gacha outlier bo'lsa ham ishlaydi; lekin tasodifiy (random_state kerak)

Theil-Sen:
  barcha nuqta juftliklari nishabining MEDIANASI
  → juda robust (29% buzilish nuqtasi), lekin p katta bo'lsa sekin

Buzilish nuqtasi (breakdown point): OLS 0%, Huber ~0%, Theil-Sen 29%, RANSAC ~50%

RANSAC — outlier ulushi katta bo'lganda (masalan, 30-40%) eng kuchli; u outlierlarni butunlay tashlab yuboradi. Theil-Sen — kichik o'lchamli vazifalarda juda ishonchli, lekin hisoblash qimmat. Huber esa outlierlarni tashlamaydi, faqat vaznini kamaytiradi — shuning uchun ularning ulushi katta bo'lsa yetarli bo'lmasligi mumkin.

2.4. Qachon qaysi usul

text
OLS         — outlier yo'q yoki juda kam; eng samarali
HUBER       — 1-10% outlier; standart robust tanlov
RANSAC      — 20-50% outlier; qattiq buzilgan ma'lumot
THEIL-SEN   — kam belgi, yuqori ishonchlilik talabi
KVANTIL q=0.5 — median bashorat kerak; robust va talqin oson
KVANTIL q≠0.5 — asimmetrik narx yoki interval kerak

Avval: outlierlar QAYERDAN kelgan? (o'lchov xatosi / haqiqiy holat) — 13.4

Birinchi savol texnik emas: outlier qayerdan kelgan? O'lchov xatosi bo'lsa — tuzating yoki olib tashlang (hujjatlashtirib); haqiqiy, lekin noyob holat bo'lsa — u modelga kiritilishi kerak (masalan, alohida belgi bilan). Robust usul — oxirgi chora, ma'lumotni tushunish o'rnini bosmaydi.

2.5. Bashorat intervallari

text
Kvantil regressiya bilan:
  q = 0.05 va q = 0.95 modellarini alohida o'qitish → 90% interval

Baholash:
  QAMROV (coverage): interval haqiqatan 90% holatni qamraydimi
  KENGLIK: tor interval yaxshi, lekin qamrov buzilmasligi kerak

Muqobil: konformal bashorat (kafolatlangan qamrov), bootstrap 11.8-bob
Diqqat: kvantil modellari KESISHIB ketishi mumkin (q=0.9 < q=0.5)

Bashorat intervali — ko'p qarorlar uchun nuqtaviy bashoratdan muhimroq 12.8-bob: "45 daqiqa" emas, "80% ehtimol bilan 32-61 daqiqa". Kvantil regressiya buning eng oddiy yo'li. Natijani qamrov bilan tekshiring — nazariy 90% amalda 76% bo'lib chiqishi mumkin.

2.6. Usullarning narxi

text
Robust usullar bepul emas:
  · outlier YO'Q bo'lsa, OLS dan biroz kam samarali (kengroq CI)
  · Huber/kvantil — iterativ, sekinroq
  · RANSAC — tasodifiy, takrorlanuvchanlik uchun random_state
  · Theil-Sen — O(n^2) yoki undan yomon
  · statistik xulosa (p, CI) murakkabroq — bootstrap kerak 11.8-bob

Lekin: outlier bo'lsa — narx arzimas

Robust usullarning samaradorlik narxi kichik: Huber toza normal ma'lumotda OLS ning ~95% samaradorligini saqlaydi. Shuning uchun amaliy qoida: agar ma'lumot manbai ishonchsiz bo'lsa, Huber ni standart qiling — yo'qotish minimal, himoya esa jiddiy.

2.7. Tuzoqlar

Asosiy tuzoqlar: outlierni sababsiz o'chirish 13.4-bob; robust usulni ma'lumotni tushunish o'rniga ishlatish; masshtablamaslik (Huber uchun muhim); RANSAC da random_state qo'ymaslik; kvantil modellarining kesishishini tekshirmaslik; intervalni qamrovsiz e'lon qilish; median regressiyani "o'rtacha" deb hisobot qilish; epsilon ni sinamaslik.

2.8. Robustlik — ishonchsiz ma'lumot uchun

Huber yo'qotishi markazda kvadratik, dumlarda chiziqli — outlier ta'sirini cheklaydi va amaliyotdagi standart robust tanlov (1-10% buzilish uchun). Kuchli buzilishda RANSAC (50% gacha) yoki Theil-Sen (29%) ishlatiladi. Kvantil regressiya boshqa savolga javob beradi: q=0.5 robust median bashorat, q≠0.5 esa asimmetrik narx va bashorat intervallari uchun. Robust usullar ma'lumotni tushunish o'rnini bosmaydi: avval outlier qayerdan kelganini aniqlang. Keyingi dars — amaliyot: to'liq regressiya loyihasi.


3. Tez ma'lumotnoma

python
import numpy as np
from sklearn.linear_model import (HuberRegressor, LinearRegression,
                                  QuantileRegressor, RANSACRegressor, TheilSenRegressor)
from sklearn.metrics import mean_pinball_loss
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler

Pipeline([("sc", StandardScaler()), ("m", HuberRegressor(epsilon=1.35))])
RANSACRegressor(random_state=0).fit(X, y).inlier_mask_
TheilSenRegressor(random_state=0, max_subpopulation=10_000)

# kvantil interval
past = QuantileRegressor(quantile=0.05, alpha=0).fit(X, y)
yuqori = QuantileRegressor(quantile=0.95, alpha=0).fit(X, y)
qamrov = ((y_te >= past.predict(X_te)) & (y_te <= yuqori.predict(X_te))).mean()
QOIDA: avval outlier sababini top · Huber standart · RANSAC ko'p buzilishda · qamrovni o'lcha

Robustlik xulosasi

Huber — kvadratik+chiziqli (epsilon=1.35) · RANSAC — inlier konsensusi
Theil-Sen — juftlik nishablari medianasi · Buzilish nuqtasi: OLS 0%, TS 29%, RANSAC 50%
Kvantil: q=0.5 median (robust), q≠0.5 interval va asimmetrik narx
Narx: outliersiz OLS dan biroz kam samarali — arzimas

4. Batafsil misollar

Misollar real numpy/sklearn bilan (Python 3.14).

Misol 1 — Outlierlar: to'rt usul

python
"""OLS, Huber, RANSAC va Theil-Sen ni solishtirish (real numpy/sklearn)."""

import numpy as np
from sklearn.linear_model import (HuberRegressor, LinearRegression,
                                  RANSACRegressor, TheilSenRegressor)


def yarat(buzuq_ulush: float, seed: int = 5, n: int = 400):
    rng = np.random.default_rng(seed)
    x = rng.uniform(0, 20, n)
    y = 10 + 2.5 * x + rng.normal(0, 2.0, n)
    k = int(buzuq_ulush * n)
    if k:
        idx = rng.choice(n, k, replace=False)
        y[idx] = y[idx] + rng.normal(60, 15, k)         # GPS xatosi kabi
    return x.reshape(-1, 1), y


def nishablar(X, y) -> dict:
    return {
        "OLS": LinearRegression().fit(X, y).coef_[0],
        "Huber": HuberRegressor(epsilon=1.35).fit(X, y).coef_[0],
        "RANSAC": RANSACRegressor(random_state=0).fit(X, y).estimator_.coef_[0],
        "Theil-Sen": TheilSenRegressor(random_state=0,
                                       max_subpopulation=5000).fit(X, y).coef_[0],
    }


def main() -> None:
    print("=== 1. Toza ma'lumot (haqiqiy nishab 2.5) ===")
    X, y = yarat(0.0)
    for nom, w in nishablar(X, y).items():
        print(f"  {nom:<10}: {w:.4f}")

    print("\n=== 2. 5% buzilgan ===")
    X, y = yarat(0.05)
    for nom, w in nishablar(X, y).items():
        print(f"  {nom:<10}: {w:.4f}  (xato {abs(w - 2.5) / 2.5:+.1%})")

    print("\n=== 3. 25% buzilgan ===")
    X, y = yarat(0.25)
    for nom, w in nishablar(X, y).items():
        print(f"  {nom:<10}: {w:.4f}  (xato {abs(w - 2.5) / 2.5:+.1%})")

    print("\n=== 4. Buzilish ulushi bo'yicha ===")
    print(f"  {'ulush':>6} {'OLS':>8} {'Huber':>8} {'RANSAC':>8} {'Theil-Sen':>10}")
    for u in [0.0, 0.05, 0.15, 0.30, 0.45]:
        X, y = yarat(u)
        n = nishablar(X, y)
        print(f"  {u:>6.0%} {n['OLS']:>8.3f} {n['Huber']:>8.3f} "
              f"{n['RANSAC']:>8.3f} {n['Theil-Sen']:>10.3f}")
    print("  ⭐ Buzilish ulushi ortsa, RANSAC eng barqaror qoladi")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Toza ma'lumot (haqiqiy nishab 2.5) ===
  OLS       : 2.4858
  Huber     : 2.4903
  RANSAC    : 2.4906
  Theil-Sen : 2.4847

=== 2. 5% buzilgan ===
  OLS       : 2.6286  (xato +5.1%)
  Huber     : 2.5017  (xato +0.1%)
  RANSAC    : 2.4893  (xato +0.4%)
  Theil-Sen : 2.5154  (xato +0.6%)

=== 3. 25% buzilgan ===
  OLS       : 2.3554  (xato +5.8%)
  Huber     : 2.4995  (xato +0.0%)
  RANSAC    : 2.5069  (xato +0.3%)
  Theil-Sen : 2.5432  (xato +1.7%)

=== 4. Buzilish ulushi bo'yicha ===
   ulush      OLS    Huber   RANSAC  Theil-Sen
      0%    2.486    2.490    2.491      2.485
      5%    2.629    2.502    2.489      2.515
     15%    2.720    2.494    2.475      2.511
     30%    2.475    2.504    2.533      2.576
     45%    2.343    2.347    2.510      2.707
  ⭐ Buzilish ulushi ortsa, RANSAC eng barqaror qoladi

Nima ko'rsatdi: 2.1, 2.3, 2.4-bo'limlar.

Misol 2 — Huber: epsilon va samaradorlik narxi

python
"""Robustlik bepul emas, lekin arzon (real numpy/sklearn)."""

import numpy as np
from sklearn.linear_model import HuberRegressor, LinearRegression


def main() -> None:
    rng = np.random.default_rng(9)
    HAQIQIY = 2.5

    def tajriba(buzuq: float, eps: float, B: int = 200):
        ols, hub = [], []
        for _ in range(B):
            n = 200
            x = rng.uniform(0, 20, n)
            y = 10 + HAQIQIY * x + rng.normal(0, 2.0, n)
            k = int(buzuq * n)
            if k:
                idx = rng.choice(n, k, replace=False)
                y[idx] += rng.normal(60, 15, k)
            X = x.reshape(-1, 1)
            ols.append(LinearRegression().fit(X, y).coef_[0])
            hub.append(HuberRegressor(epsilon=eps, max_iter=500).fit(X, y).coef_[0])
        return np.array(ols), np.array(hub)

    print("=== 1. Toza ma'lumotda samaradorlik narxi ===")
    ols, hub = tajriba(0.0, 1.35)
    print(f"  OLS  : o'rtacha {ols.mean():.4f}, SD {ols.std():.4f}")
    print(f"  Huber: o'rtacha {hub.mean():.4f}, SD {hub.std():.4f}")
    print(f"  Huber ning SD si OLS dan {hub.std() / ols.std():.3f} barobar katta "
          f"(narx ~{(hub.std() / ols.std() - 1) * 100:.1f}%)")

    print("\n=== 2. 8% buzilgan ma'lumotda ===")
    ols, hub = tajriba(0.08, 1.35)
    print(f"  OLS  : o'rtacha {ols.mean():.4f} (siljish "
          f"{ols.mean() - HAQIQIY:+.4f}), SD {ols.std():.4f}")
    print(f"  Huber: o'rtacha {hub.mean():.4f} (siljish "
          f"{hub.mean() - HAQIQIY:+.4f}), SD {hub.std():.4f}")

    print("\n=== 3. epsilon ning ta'siri (8% buzilgan) ===")
    ols8, _ = tajriba(0.08, 1.35, B=100)
    for eps in [1.05, 1.35, 2.0, 5.0, 50.0]:
        _, hub = tajriba(0.08, eps, B=100)
        print(f"  epsilon {eps:>5}: nishab SD {hub.std():.4f}, "
              f"siljish {hub.mean() - HAQIQIY:+.4f}")
    print(f"  taqqoslash uchun OLS nishab SD: {ols8.std():.4f}")
    print("  (bu yerda outlierlar x bo'ylab bir tekis — ular nishabni siljitmaydi,")
    print("   lekin uning TARQOQLIGINI keskin oshiradi; Huber aynan shuni to'xtatadi)")

    print("\n=== 4. O'rtacha kvadratik xato (MSE) taqqoslash ===")
    for buzuq in [0.0, 0.03, 0.10]:
        ols, hub = tajriba(buzuq, 1.35, B=100)
        mse_o = np.mean((ols - HAQIQIY) ** 2)
        mse_h = np.mean((hub - HAQIQIY) ** 2)
        print(f"  {buzuq:>4.0%} buzilgan: OLS MSE {mse_o:.5f}, Huber MSE {mse_h:.5f}, "
              f"nisbat {mse_o / mse_h:6.1f}x")
    print("  ⭐ Toza ma'lumotda narx kichik, buzilganda foyda katta")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Toza ma'lumotda samaradorlik narxi ===
  OLS  : o'rtacha 2.4996, SD 0.0240
  Huber: o'rtacha 2.4996, SD 0.0248
  Huber ning SD si OLS dan 1.034 barobar katta (narx ~3.4%)

=== 2. 8% buzilgan ma'lumotda ===
  OLS  : o'rtacha 2.4885 (siljish -0.0115), SD 0.2066
  Huber: o'rtacha 2.4964 (siljish -0.0036), SD 0.0280

=== 3. epsilon ning ta'siri (8% buzilgan) ===
  epsilon  1.05: nishab SD 0.0313, siljish +0.0016
  epsilon  1.35: nishab SD 0.0305, siljish -0.0057
  epsilon   2.0: nishab SD 0.0304, siljish -0.0051
  epsilon   5.0: nishab SD 0.1842, siljish +0.0023
  epsilon  50.0: nishab SD 0.2011, siljish +0.0138
  taqqoslash uchun OLS nishab SD: 0.1982
  (bu yerda outlierlar x bo'ylab bir tekis — ular nishabni siljitmaydi,
   lekin uning TARQOQLIGINI keskin oshiradi; Huber aynan shuni to'xtatadi)

=== 4. O'rtacha kvadratik xato (MSE) taqqoslash ===
    0% buzilgan: OLS MSE 0.00057, Huber MSE 0.00066, nisbat    0.9x
    3% buzilgan: OLS MSE 0.01746, Huber MSE 0.00087, nisbat   20.1x
   10% buzilgan: OLS MSE 0.05673, Huber MSE 0.00091, nisbat   62.4x
  ⭐ Toza ma'lumotda narx kichik, buzilganda foyda katta

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

Misol 3 — Kvantil regressiya va intervallar

python
"""Shartli kvantillar va bashorat intervali (real numpy/sklearn)."""

import numpy as np
from sklearn.linear_model import QuantileRegressor
from sklearn.metrics import mean_pinball_loss
from sklearn.model_selection import train_test_split


def main() -> None:
    rng = np.random.default_rng(13)
    n = 1500
    masofa = rng.uniform(1, 25, n)
    # tarqoqlik masofa bilan o'sadi (geteroskedastiklik)
    vaqt = 8 + 2.4 * masofa + rng.normal(0, 1.0 + 0.35 * masofa, n)
    X = masofa.reshape(-1, 1)
    Xtr, Xte, ytr, yte = train_test_split(X, vaqt, test_size=0.3, random_state=0)

    print("=== 1. Kvantil chiziqlari ===")
    modellar = {}
    for q in [0.05, 0.25, 0.5, 0.75, 0.95]:
        m = QuantileRegressor(quantile=q, alpha=0.0, solver="highs").fit(Xtr, ytr)
        modellar[q] = m
        print(f"  q = {q:.2f}: kesma {m.intercept_:6.2f}, nishab {m.coef_[0]:.3f}")
    print("  (nishablar farqi — tarqoqlik masofa bilan o'sishini ko'rsatadi)")

    print("\n=== 2. Bashorat intervali (90%) ===")
    past = modellar[0.05].predict(Xte)
    yuqori = modellar[0.95].predict(Xte)
    qamrov = ((yte >= past) & (yte <= yuqori)).mean()
    print(f"  qamrov = {qamrov:.1%} (kerak 90%)")
    print(f"  o'rtacha kenglik = {(yuqori - past).mean():.2f} daqiqa")

    print("\n=== 3. Interval masofa bo'yicha ===")
    for lo, hi in [(1, 6), (6, 14), (14, 25)]:
        mos = (Xte[:, 0] >= lo) & (Xte[:, 0] < hi)
        print(f"  masofa {lo:>2}-{hi:>2} km: kenglik "
              f"{(yuqori[mos] - past[mos]).mean():5.2f}, "
              f"qamrov {((yte[mos] >= past[mos]) & (yte[mos] <= yuqori[mos])).mean():.1%}")

    print("\n=== 4. Pinball loss bilan baholash ===")
    for q in [0.5, 0.9]:
        m = QuantileRegressor(quantile=q, alpha=0.0, solver="highs").fit(Xtr, ytr)
        p_q = m.predict(Xte)
        p_med = modellar[0.5].predict(Xte)
        print(f"  q = {q}: o'z modeli {mean_pinball_loss(yte, p_q, alpha=q):.4f}, "
              f"median modeli {mean_pinball_loss(yte, p_med, alpha=q):.4f}")
    print("  ⭐ Har kvantil o'z modelini talab qiladi")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Kvantil chiziqlari ===
  q = 0.05: kesma   6.57, nishab 1.815
  q = 0.25: kesma   7.38, nishab 2.176
  q = 0.50: kesma   8.08, nishab 2.406
  q = 0.75: kesma   8.49, nishab 2.703
  q = 0.95: kesma   9.35, nishab 2.987
  (nishablar farqi — tarqoqlik masofa bilan o'sishini ko'rsatadi)

=== 2. Bashorat intervali (90%) ===
  qamrov = 87.6% (kerak 90%)
  o'rtacha kenglik = 17.54 daqiqa

=== 3. Interval masofa bo'yicha ===
  masofa  1- 6 km: kenglik  6.54, qamrov 82.3%
  masofa  6-14 km: kenglik 14.92, qamrov 90.3%
  masofa 14-25 km: kenglik 24.89, qamrov 87.9%

=== 4. Pinball loss bilan baholash ===
  q = 0.5: o'z modeli 2.1576, median modeli 2.1576
  q = 0.9: o'z modeli 0.9447, median modeli 2.0532
  ⭐ Har kvantil o'z modelini talab qiladi

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

Misol 4 — Yetkazib berish: to'liq qaror

python
"""Buzilgan ma'lumot + asimmetrik narx (real numpy/sklearn)."""

import numpy as np
from sklearn.linear_model import HuberRegressor, LinearRegression, QuantileRegressor
from sklearn.metrics import mean_absolute_error
from sklearn.model_selection import train_test_split


def yarat(seed: int = 17, n: int = 2000):
    rng = np.random.default_rng(seed)
    masofa = rng.uniform(1, 25, n)
    tirband = rng.beta(2, 3, n)
    vaqt = 8 + 2.2 * masofa + 14 * tirband + rng.normal(0, 3.0, n)
    toza = vaqt.copy()
    # 3% GPS xatosi: vaqt bir necha barobar oshib ketadi
    buzuq = rng.random(n) < 0.03
    vaqt[buzuq] += rng.uniform(120, 300, buzuq.sum())
    X = np.column_stack([masofa, tirband])
    return X, vaqt, toza, buzuq


def main() -> None:
    X, y, toza, buzuq = yarat()
    idx = np.arange(len(X))
    Xtr, Xte, ytr, yte, itr, ite = train_test_split(X, y, idx, test_size=0.3,
                                                    random_state=0)
    toza_te = toza[ite]
    buzuq_te = buzuq[ite]

    print("=== 1. Ma'lumot ===")
    print(f"  {len(X)} safar, buzilgan yozuvlar: {buzuq.sum()} ({buzuq.mean():.1%})")
    print(f"  test'da buzilgan: {buzuq_te.sum()} ta")

    print("\n=== 2. Koeffitsiyentlar (haqiqiy: masofa 2.2, tirband 14) ===")
    ols = LinearRegression().fit(Xtr, ytr)
    hub = HuberRegressor(epsilon=1.35, max_iter=1000).fit(Xtr, ytr)
    print(f"  OLS  : masofa {ols.coef_[0]:.3f}, tirband {ols.coef_[1]:6.2f}")
    print(f"  Huber: masofa {hub.coef_[0]:.3f}, tirband {hub.coef_[1]:6.2f}")

    print("\n=== 3. Toza yozuvlarda aniqlik ===")
    sof = ~buzuq_te
    for nom, m in [("OLS", ols), ("Huber", hub)]:
        print(f"  {nom:<6}: buzilmagan test yozuvlarida MAE "
              f"{mean_absolute_error(toza_te[sof], m.predict(Xte[sof])):.3f} daqiqa")

    print("\n=== 4. Mijozga va'da: 80-persentil ===")
    kv = QuantileRegressor(quantile=0.8, alpha=0.0, solver="highs").fit(Xtr, ytr)
    med = QuantileRegressor(quantile=0.5, alpha=0.0, solver="highs").fit(Xtr, ytr)
    for nom, m in [("median (q=0.5)", med), ("va'da (q=0.8)", kv)]:
        b = m.predict(Xte)
        kech = (toza_te > b).mean()
        print(f"  {nom:<15}: o'rtacha va'da {b.mean():5.1f} daqiqa, "
              f"kech qolish {kech:.1%}")
    print("  ⭐ Robust baho + kvantil va'da = ishonchli xizmat")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Ma'lumot ===
  2000 safar, buzilgan yozuvlar: 63 (3.1%)
  test'da buzilgan: 13 ta

=== 2. Koeffitsiyentlar (haqiqiy: masofa 2.2, tirband 14) ===
  OLS  : masofa 2.191, tirband   5.69
  Huber: masofa 2.199, tirband  13.39

=== 3. Toza yozuvlarda aniqlik ===
  OLS   : buzilmagan test yozuvlarida MAE 7.911 daqiqa
  Huber : buzilmagan test yozuvlarida MAE 2.273 daqiqa

=== 4. Mijozga va'da: 80-persentil ===
  median (q=0.5) : o'rtacha va'da  42.3 daqiqa, kech qolish 48.8%
  va'da (q=0.8)  : o'rtacha va'da  45.1 daqiqa, kech qolish 15.2%
  ⭐ Robust baho + kvantil va'da = ishonchli xizmat

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


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

Noto'g'ri fikr To'g'risi
"Outlierlarni o'chirish kerak" Avval sababini toping
"Huber outlierlarni tashlaydi" Vaznini kamaytiradi
"RANSAC har doim yaxshi" Tasodifiy, ko'p buzilishda
"Robustlik bepul" Kichik samaradorlik narxi
"Median = o'rtacha" Har xil
"Bitta model barcha kvantil uchun" Har kvantil — o'z modeli
"Interval — qamrovsiz" Qamrovni o'lchang
"Huber masshtablashsiz ishlaydi" Masshtablash kerak

6. Keng tarqalgan xatolar va yechimlari

1. Outlierni sababsiz o'chirish

python
df = df[np.abs(z) < 3]                                            # ⚠️
# avval tekshiring: o'lchov xatosimi yoki haqiqiy holat 13.4-bob    # ✅

2. Masshtablamaslik

python
HuberRegressor().fit(X, y)                                        # ⚠️
Pipeline([("sc", StandardScaler()), ("m", HuberRegressor())])     # ✅

3. RANSAC da random_state yo'q

python
RANSACRegressor().fit(X, y)            # har safar boshqa natija  # ⚠️
RANSACRegressor(random_state=0)                                   # ✅

4. Kvantil modellarining kesishishi

python
past, yuqori = q05.predict(X), q95.predict(X)                     # ⚠️
yuqori = np.maximum(yuqori, past)      # yoki monoton usul        # ✅

5. Qamrovsiz interval

python
print(f"interval: {past:.1f}-{yuqori:.1f}")                       # ⚠️
print(f"... (test qamrovi {qamrov:.1%})")                         # ✅

6. Medianni o'rtacha deb hisobot qilish

python
# "o'rtacha yetkazib berish vaqti 34 daqiqa" (q=0.5 modeli)       # ⚠️
# "tipik (median) vaqt 34 daqiqa"                                 # ✅

7. Theil-Sen ni katta ma'lumotda

python
TheilSenRegressor().fit(X, y)          # n = 200000               # ⚠️
TheilSenRegressor(max_subpopulation=10_000)  # yoki Huber         # ✅

7. Integratsiya — bu bilim qayerda kerak bo'ladi

  • 9.10-dars (o'tilgan): Asimmetrik narx
  • 12.8-dars (o'tilgan): Pinball loss va kvantil metrikalari
  • 13.1-dars (o'tilgan): OLS ning outlier sezgirligi
  • 13.4-dars (o'tilgan): Ta'sirli nuqtalar
  • 13.12-dars: To'liq loyiha

8. Eng yaxshi amaliyotlar

  1. Avval outlier sababini aniqlang.

  2. Huber ni standart robust tanlov qiling.

  3. Masshtablashni unutmang.

  4. RANSAC da random_state qo'ying.

  5. Kvantil bilan interval bering.

  6. Qamrovni o'lchang.

  7. Median va o'rtachani chalkashtirmang.

  8. Natijani OLS bilan solishtiring.


9. Amaliy topshiriq

Vazifa 1: Bashorat qiling

python
1.  # Huber yo'qotishi qanday?
2.  # epsilon nima?
3.  # epsilon katta bo'lsa?
4.  # RANSAC qanday ishlaydi?
5.  # RANSAC buzilish nuqtasi?
6.  # Theil-Sen nima?
7.  # pinball loss formulasi?
8.  # q = 0.5 nima beradi?
9.  # interval qanday quriladi?
10. # qamrov nima?
11. # robustlikning narxi?
12. # birinchi savol nima?
Javoblar
  1. Markazda kvadratik, dumlarda chiziqli
  2. Outlier chegarasi
  3. OLS ga yaqinlashadi
  4. Inlier konsensusi
  5. ~50%
  6. Juftlik nishablari medianasi
  7. max(q·r, (q-1)·r)
  8. Median regressiyasi
  9. Ikki kvantil modeli
  10. Interval haqiqatni qamrash ulushi
  11. Kichik samaradorlik yo'qotishi
  12. Outlier qayerdan kelgan?

Vazifa 2: Xatolarni tuzating

python
1.  df = df[np.abs(z) < 3]   # tekshirmasdan

2.  HuberRegressor().fit(X, y)   # masshtablanmagan

3.  RANSACRegressor().fit(X, y)

4.  # "90% interval: 20-60 daqiqa" (qamrov o'lchanmagan)

5.  # q=0.5 modelini "o'rtacha vaqt" deb hisobot qilish
Javoblar
python
1.  # Cook masofasi bilan topib, har birini tekshiring (13.4)

2.  Pipeline([("sc", StandardScaler()), ("m", HuberRegressor())])

3.  RANSACRegressor(random_state=0)

4.  qamrov = ((y >= past) & (y <= yuqori)).mean()

5.  # "median (tipik) vaqt"

Vazifa 3: To'rt usul

Modellang:

  1. Turli buzilish ulushi
  2. To'rt usul
  3. Nishab xatosi
  4. Xulosa

Vazifa 4: Huber narxi

Modellang:

  1. Toza ma'lumot
  2. SD taqqoslash
  3. epsilon ta'siri
  4. MSE

Vazifa 5: Kvantillar

Modellang:

  1. Beshta kvantil
  2. Interval
  3. Qamrov
  4. Pinball loss

Vazifa 6: To'liq qaror

Modellang:

  1. Buzilgan ma'lumot
  2. Robust baho
  3. Kvantil va'da
  4. Hisobot

Vazifa 7: O'ylash

Robust usullar "outlierlarning ta'sirini kamaytiradi" — lekin ba'zi sohalarda aynan outlierlar eng qiziq hodisalar (firibgarlik, nosozlik, bozor inqirozi). Robustlik qachon ma'lumotni yashirishga aylanadi?

Javob

Qisqa javob: robustlik markaziy tendensiyani himoya qiladi; agar sizning savolingiz aynan chekka hodisalar haqida bo'lsa, robust usul noto'g'ri vosita — u qiziqarli qismni tashlab yuboradi.

1. Ikki xil savol

Savol Vosita
"Tipik holat qanday?" Robust regressiya
"Chekka holatlar qanday?" Kvantil (q=0.95+), ekstremal qiymatlar nazariyasi
"Bu kuzatuv anomalmi?" Anomaliya aniqlash (18-qism)
"Anomaliya nega yuz berdi?" Sababiy tahlil, domen

2. Xavf: muhim signalni yo'qotish

  • Firibgarlik — aynan outlier
  • Nosozlik bashorati — kamdan-kam hodisa
  • Moliyaviy risk — dumdagi hodisalar (VaR)
  • Tibbiyotda noyob asoratlar

3. To'g'ri yondashuv

  1. Outlierlarni ajratib tahlil qiling (o'chirmang)
  2. Ular uchun alohida model yoki belgi
  3. Asosiy modelda robust usul + anomaliyalar uchun alohida oqim
  4. Har ikkalasini hisobotda ko'rsating

4. Amaliy shakl

  • Robust model — "normal" rejim uchun
  • Kvantil (q=0.99) — yuqori chegara rejasi
  • Anomaliya aniqlovchi — signal berish uchun
  • Hujjat: qancha kuzatuv qanday sababdan chiqarildi

5. Xulosa

  1. Robustlik — savolga bog'liq tanlov
  2. Chekka hodisalar ba'zan asosiy maqsad
  3. Outlierlarni tashlash emas, ajratish
  4. Ikki oqimni birga saqlang

Nimani mustahkamlaydi: 2.4, 2.7-bo'limlar.


Xulosa

Bu darsda robust va kvantil regressiyani o'rgandik.

Eng muhim uch fikr:

  1. Huber — standart robust tanlov. Yo'qotish markazda kvadratik, |r| > epsilon bo'lganda chiziqli: outlier tashlanmaydi, lekin uning vazni cheklanadi. epsilon katta bo'lsa OLS ga, kichik bo'lsa MAE ga yaqinlashadi. Kuchli buzilishda (20-50%) RANSAC, kam belgili ishonchli baho uchun Theil-Sen.

  2. Kvantil regressiya — boshqa savol. U o'rtachani emas, shartli kvantilni modellaydi: q = 0.5 robust median bashorat, q ≠ 0.5 esa asimmetrik narx (9.10, 12.8) va bashorat intervallari uchun. Har kvantil o'z modelini talab qiladi; intervalni qamrov bilan tekshiring va kvantil chiziqlarining kesishishini nazorat qiling.

  3. Robustlik ma'lumotni tushunish o'rnini bosmaydi. Birinchi savol — outlier qayerdan kelgan? (o'lchov xatosi / haqiqiy noyob holat — 13.4). Robust usullarning samaradorlik narxi kichik (toza ma'lumotda OLS ga yaqin), shuning uchun ma'lumot manbai ishonchsiz bo'lsa Huber ni standart qiling — lekin chekka hodisalar asosiy maqsad bo'lsa, ularni yashirmang, alohida modellang.

Keyingi darsda amaliyot — 13-qismning to'liq regressiya loyihasi: ma'lumotdan hisobotgacha.

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
13.11-dars: Robust va kvantil regressiya — IlmHamroh