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

13.1-dars: Chiziqli regressiya

13-QISM — REGRESSIYA · 1-dars


1. Kirish va motivatsiya

Chiziqli regressiya — Data Science'dagi eng qadimgi, eng oddiy va hali ham eng ko'p ishlatiladigan model. Uning kuchi aniqlikda emas: u tushunarli, tez, barqaror va natijasi izohlanadi. Ko'p loyihalarda u baza bo'ladi 12.6-bob, ko'pchiligida esa yakuniy model bo'lib qoladi — chunki murakkabroq modellar sezilarli yaxshilanish bermaydi, lekin tushuntirish qiyinlashadi.

Bu darsda: model shakli va y = w0 + w1 x ma'nosi, eng kichik kvadratlar 10.6-bob va nega aynan kvadratlar, koeffitsiyentlarni qo'lda hisoblash va sklearn bilan solishtirish, qoldiqlar, R^2 ning geometrik ma'nosi va chiziqli modelning qachon yetarli, qachon yetarli emasligi.

Real vaziyat. Ko'chmas mulk agentligi narxni "tajriba bilan" belgilaydi — natijada bir xil uylar turli agentlarda 15% farq bilan e'lon qilinadi. Bitta chiziqli regressiya (maydon, xona, hudud, yosh) MAE ni 21 ming dollardan 12 ming dollarga tushirdi va eng muhimi: har bashoratni tushuntirib berdi ("markazda +38 ming, har m^2 +1.5 ming"). Aynan shu tushuntirish modelni jamoa qabul qilishiga sabab bo'ldi.

Bu darsda chiziqli regressiyani o'rganamiz.

Bu darsda:

  • Model shakli va ma'nosi
  • Eng kichik kvadratlar
  • Koeffitsiyentlarni hisoblash
  • Qoldiqlar va R^2
  • sklearn bilan ishlash
  • Chiziqlilik qachon yetarli
  • Tuzoqlar
  • Amaliy: uy narxi modeli

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


2. Nazariya — chuqur tushuntirish

2.1. Model shakli

text
Bitta belgi:     y = w0 + w1 x + e
Ko'p belgi:      y = w0 + w1 x1 + w2 x2 + ... + wp xp + e
Matritsa shakli: y = Xw + e        (X — n × (p+1), birinchi ustun — birlar)

w0 — kesma (intercept): hamma belgi nol bo'lganda bashorat
w1 — nishab: x bir birlikka oshsa, y qancha o'zgaradi (qolganlari o'zgarmasa)
e  — xato: model tushuntira olmagan qism

Chiziqli regressiya — belgilarning vaznli yig'indisi. "Chiziqli" so'zi koeffitsiyentlarga nisbatan: x^2 yoki log(x) belgilarini qo'shsangiz ham model chiziqli bo'lib qoladi 13.5-bob. Har koeffitsiyent — "boshqalari o'zgarmaganda" shartidagi ta'sir; bu shart ko'pincha unutiladi va noto'g'ri talqinga olib keladi 13.3-bob.

2.2. Eng kichik kvadratlar

text
Maqsad: xatolar kvadratlari yig'indisini minimallashtirish
  SSE(w) = sum (y_i - x_i·w)^2  →  min

Yechim (normal tenglama):  w = (XTX)^(-1) XT y          [10.6]
Amalda: QR yoki SVD orqali (barqarorroq) — np.linalg.lstsq

Nega kvadrat (absolyut emas):
  · yagona, analitik yechim bor
  · normal xato taxminida maksimal ishonchlilik bahosi
  · differensiallanadi (gradient usullari uchun — 13.6)
Narxi: outlierlarga sezgir (13.11 — robust usullar)

Eng kichik kvadratlar (OLS) — qoldiqlar kvadratlarini minimallashtiradi. Bu tanlov qulay (analitik yechim bor) va statistik asosga ega (normal xatoda maksimal ishonchlilik), lekin outlierlarga sezgir: bitta chetlangan nuqta butun chiziqni tortib ketishi mumkin. Amalda np.linalg.lstsq yoki sklearn ishlatiladi — ular teskari matritsani hisoblamaydi, balki SVD/QR bilan barqaror yechadi.

2.3. Bitta belgi uchun formulalar

text
w1 = Cov(x, y) / Var(x) = r × (SD_y / SD_x)
w0 = y_ort - w1 x_ort

Ya'ni: nishab — korrelyatsiyaning masshtablangan ko'rinishi 4.9-bob
Chiziq har doim (x_ort, y_ort) nuqtasidan o'tadi

Bitta belgida regressiya korrelyatsiya bilan bevosita bog'liq 4.9-bob: w1 = r × SD_y/SD_x. Bu bog'liqlik muhim xulosani beradi — chiziqli regressiya chiziqli bog'liqlikni o'lchaydi; korrelyatsiya nol bo'lsa nishab ham nol bo'ladi, garchi kuchli nochiziqli bog'liqlik bo'lishi mumkin (4.9 Anscombe).

2.4. Qoldiqlar va R^2

text
qoldiq:  e_i = y_i - y_bash_i          (haqiqiy - bashorat)
OLS xossalari: sum(e) = 0 va qoldiqlar har bir belgi bilan korrelyatsiyasiz

R^2 = 1 - SSE/SST = tushuntirilgan dispersiya ulushi      12.8-bob
Bitta belgida: R^2 = r^2

Qoldiqlar — modelning tushuntira olmagan qismi va eng muhim diagnostika materiali 13.4-bob. OLS ta'rifi bo'yicha qoldiqlar yig'indisi nol va ular belgilar bilan korrelyatsiyasiz bo'ladi — shuning uchun qoldiqlarda tuzilma ko'rinsa (egrilik, kengayuvchi tarqoqlik), bu model shakli noto'g'ri ekanini bildiradi.

2.5. sklearn bilan ishlash

python
from sklearn.linear_model import LinearRegression

model = LinearRegression().fit(X_train, y_train)
model.coef_          # w1..wp
model.intercept_     # w0
model.predict(X_test)
model.score(X_test, y_test)      # R^2 (ehtiyot: 12.8)

LinearRegression — regularizatsiyasiz OLS; u masshtablashni talab qilmaydi (koeffitsiyentlar birliklarga moslashadi), lekin Ridge/Lasso uchun masshtablash shart 13.7-bob. fit_intercept=False faqat ma'lumot markazlashtirilgan bo'lsa ishlatiladi. Katta p da (belgi soni namunaga yaqin) OLS beqaror bo'ladi — regularizatsiya kerak.

2.6. Chiziqlilik qachon yetarli

text
YETARLI:
  · bog'liqlik taxminan chiziqli yoki monoton va yumshoq
  · belgi soni namunaga nisbatan kichik
  · talqin muhim (tibbiyot, moliya, siyosat)
  · baza model kerak 12.6-bob

YETARSIZ:
  · kuchli nochiziqlik va o'zaro ta'sirlar (daraxtlar/ansambllar yaxshiroq)
  · juda ko'p kategoriya darajalari
  · murakkab tuzilma (rasm, matn, ketma-ketlik)

Chiziqli model kamdan-kam eng aniq, lekin ko'pincha eng foydali: u tez o'qitiladi, oz ma'lumot talab qiladi, barqaror va har bashoratni izohlaydi. Amaliy qoida: har doim chiziqli modeldan boshlang; murakkabroq model uni sezilarli yengmasa (11.1 — farq noaniqlikdan katta bo'lsa), soddasini qoldiring.

2.7. Tuzoqlar

Asosiy tuzoqlar: koeffitsiyentni sababiy deb talqin qilish 4.10-bob; "boshqalari o'zgarmasa" shartini unutish 13.3-bob; outlier ta'sirini sezmaslik 13.11-bob; ekstrapolyatsiya (o'quv diapazonidan tashqarida bashorat); R^2 ni yakka o'qish 12.8-bob; qoldiqlarga qaramaslik 13.4-bob; kategoriyani sonli kod sifatida berish 13.9-bob; multikollinearlik 13.3-bob.

2.8. Eng oddiy model — eng ko'p ishlatiladigan

Chiziqli regressiya: y = w0 + w1x1 + ... + wpxp, koeffitsiyentlar eng kichik kvadratlar bilan topiladi (w = (XTX)^(-1)XTy, amalda SVD/QR orqali). Bitta belgida nishab korrelyatsiyaning masshtablangan ko'rinishi. Model chiziqli deganda koeffitsiyentlarga nisbatan chiziqlilik tushuniladi — x^2, log x belgilarini qo'shish mumkin. Kuchi: tezlik, barqarorlik va talqin qilinishi. Keyingi dars — ko'p o'zgaruvchili regressiya va koeffitsiyentlar geometriyasi.


3. Tez ma'lumotnoma

python
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error, r2_score

model = LinearRegression().fit(X_tr, y_tr)
model.coef_, model.intercept_
p = model.predict(X_te)

# qo'lda (o'quv maqsadida)
Xb = np.column_stack([np.ones(len(X)), X])
w = np.linalg.lstsq(Xb, y, rcond=None)[0]        # barqaror yechim
w_normal = np.linalg.inv(Xb.T @ Xb) @ Xb.T @ y   # normal tenglama (beqaror)

# bitta belgi
w1 = np.cov(x, y, ddof=1)[0, 1] / np.var(x, ddof=1)
w0 = y.mean() - w1 * x.mean()

qoldiq = y - model.predict(X)
QOIDA: bazadan boshla · qoldiqlarga qara · ekstrapolyatsiya qilma · R^2 ni yakka o'qima

Formulalar xulosasi

y = Xw + e · SSE = ||y - Xw||^2 → min · w = (XTX)^(-1)XTy
w1 = r × SD_y/SD_x · w0 = y_ort - w1x_ort · chiziq (x_ort, y_ort) dan o'tadi
R^2 = 1 - SSE/SST · bitta belgida R^2 = r^2 · sum(qoldiq) = 0

4. Batafsil misollar

Misollar real numpy/sklearn bilan (Python 3.14).

Misol 1 — Qo'lda va sklearn bilan: bir xil natija

python
"""Eng kichik kvadratlarni uch usulda hisoblash (real numpy/sklearn)."""

import numpy as np
from sklearn.linear_model import LinearRegression


def main() -> None:
    rng = np.random.default_rng(7)
    n = 300
    maydon = rng.uniform(30, 150, n)
    narx = 12 + 1.45 * maydon + rng.normal(0, 14, n)

    print("=== 1. Formulalar bilan (bitta belgi) ===")
    w1 = np.cov(maydon, narx, ddof=1)[0, 1] / np.var(maydon, ddof=1)
    w0 = narx.mean() - w1 * maydon.mean()
    print(f"  w1 = {w1:.4f}, w0 = {w0:.4f}")
    r = np.corrcoef(maydon, narx)[0, 1]
    print(f"  tekshiruv: r × SD_y/SD_x = "
          f"{r * narx.std(ddof=1) / maydon.std(ddof=1):.4f}")

    print("\n=== 2. lstsq bilan ===")
    Xb = np.column_stack([np.ones(n), maydon])
    w = np.linalg.lstsq(Xb, narx, rcond=None)[0]
    print(f"  w0 = {w[0]:.4f}, w1 = {w[1]:.4f}")

    print("\n=== 3. sklearn bilan ===")
    model = LinearRegression().fit(maydon.reshape(-1, 1), narx)
    print(f"  intercept = {model.intercept_:.4f}, coef = {model.coef_[0]:.4f}")
    print(f"  uchala usul bir xil: "
          f"{np.allclose([w0, w1], [model.intercept_, model.coef_[0]])}")

    print("\n=== 4. Talqin va tekshiruv ===")
    print(f"  har 1 m^2 uchun narx +{w1:.2f} ming")
    print(f"  chiziq (x_ort, y_ort) = ({maydon.mean():.1f}, {narx.mean():.1f}) dan o'tadi: "
          f"{np.isclose(w0 + w1 * maydon.mean(), narx.mean())}")
    qoldiq = narx - (w0 + w1 * maydon)
    print(f"  qoldiqlar yig'indisi = {qoldiq.sum():.10f} (nolga teng)")
    print(f"  R^2 = {1 - (qoldiq**2).sum() / ((narx - narx.mean())**2).sum():.4f}, "
          f"r^2 = {r**2:.4f}")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Formulalar bilan (bitta belgi) ===
  w1 = 1.4196, w0 = 12.8726
  tekshiruv: r × SD_y/SD_x = 1.4196

=== 2. lstsq bilan ===
  w0 = 12.8726, w1 = 1.4196

=== 3. sklearn bilan ===
  intercept = 12.8726, coef = 1.4196
  uchala usul bir xil: True

=== 4. Talqin va tekshiruv ===
  har 1 m^2 uchun narx +1.42 ming
  chiziq (x_ort, y_ort) = (90.5, 141.4) dan o'tadi: True
  qoldiqlar yig'indisi = 0.0000000000 (nolga teng)
  R^2 = 0.9371, r^2 = 0.9371

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

Misol 2 — Nega kvadrat: uchta yo'qotish funksiyasi

python
"""Kvadrat, absolyut va Huber yo'qotishlari qanday chiziq beradi (real numpy/scipy)."""

import numpy as np
from scipy.optimize import minimize


def main() -> None:
    rng = np.random.default_rng(3)
    n = 120
    x = rng.uniform(0, 10, n)
    y = 5 + 2.0 * x + rng.normal(0, 1.5, n)

    print("=== 1. Toza ma'lumot ===")

    def moslash(x, y, tur):
        def yoq(w):
            r = y - (w[0] + w[1] * x)
            if tur == "kvadrat":
                return np.sum(r ** 2)
            if tur == "absolyut":
                return np.sum(np.abs(r))
            d = 1.35                                  # Huber
            kichik = np.abs(r) <= d
            return np.sum(np.where(kichik, 0.5 * r ** 2,
                                   d * (np.abs(r) - 0.5 * d)))
        return minimize(yoq, [0.0, 0.0], method="Nelder-Mead",
                        options={"xatol": 1e-8, "fatol": 1e-8, "maxiter": 5000}).x

    for tur in ["kvadrat", "absolyut", "huber"]:
        w = moslash(x, y, tur)
        print(f"  {tur:<9}: w0 = {w[0]:5.2f}, w1 = {w[1]:5.2f}")
    print("  (haqiqiy: w0 = 5.00, w1 = 2.00 — uchalasi ham yaqin)")

    print("\n=== 2. Beshta outlier qo'shamiz ===")
    x2 = np.append(x, [9.0, 9.2, 9.4, 9.6, 9.8])
    y2 = np.append(y, [60.0, 62.0, 58.0, 65.0, 61.0])
    for tur in ["kvadrat", "absolyut", "huber"]:
        w = moslash(x2, y2, tur)
        print(f"  {tur:<9}: w0 = {w[0]:5.2f}, w1 = {w[1]:5.2f}")

    print("\n=== 3. Nishabning o'zgarishi ===")
    w_toza = moslash(x, y, "kvadrat")
    w_iflos = moslash(x2, y2, "kvadrat")
    print(f"  kvadrat:  {w_toza[1]:.2f} → {w_iflos[1]:.2f} "
          f"({(w_iflos[1] / w_toza[1] - 1):+.0%})")
    a_toza, a_iflos = moslash(x, y, "absolyut"), moslash(x2, y2, "absolyut")
    print(f"  absolyut: {a_toza[1]:.2f} → {a_iflos[1]:.2f} "
          f"({(a_iflos[1] / a_toza[1] - 1):+.0%})")

    print("\n=== 4. Xulosa ===")
    print("  kvadrat — tez va analitik, lekin outlierlarga sezgir")
    print("  ⭐ Outlierlar bo'lsa: robust usullar 13.11-bob")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Toza ma'lumot ===
  kvadrat  : w0 =  4.66, w1 =  2.08
  absolyut : w0 =  4.72, w1 =  2.06
  huber    : w0 =  4.70, w1 =  2.07
  (haqiqiy: w0 = 5.00, w1 = 2.00 — uchalasi ham yaqin)

=== 2. Beshta outlier qo'shamiz ===
  kvadrat  : w0 =  1.96, w1 =  2.88
  absolyut : w0 =  4.60, w1 =  2.10
  huber    : w0 =  4.54, w1 =  2.12

=== 3. Nishabning o'zgarishi ===
  kvadrat:  2.08 → 2.88 (+38%)
  absolyut: 2.06 → 2.10 (+2%)

=== 4. Xulosa ===
  kvadrat — tez va analitik, lekin outlierlarga sezgir
  ⭐ Outlierlar bo'lsa: robust usullar (13.11)

Nima ko'rsatdi: 2.2-bo'lim.

Misol 3 — Qoldiqlar nima deydi

python
"""Qoldiqlar orqali model shaklini tekshirish (real numpy/sklearn)."""

import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score


def main() -> None:
    rng = np.random.default_rng(5)
    n = 400
    x = rng.uniform(1, 20, n)

    holatlar = {
        "chiziqli": 3 + 2.0 * x + rng.normal(0, 3, n),
        "nochiziqli": 3 + 0.35 * x ** 2 + rng.normal(0, 3, n),
        "kengayuvchi": 3 + 2.0 * x + rng.normal(0, 0.45 * x, n),
    }

    print("=== 1. Uch holat uchun R^2 ===")
    for nom, y in holatlar.items():
        m = LinearRegression().fit(x.reshape(-1, 1), y)
        print(f"  {nom:<12}: R^2 = {r2_score(y, m.predict(x.reshape(-1, 1))):.3f}")
    print("  (R^2 yuqori bo'lsa ham model to'g'ri degani emas)")

    print("\n=== 2. Qoldiqlarda tuzilma ===")
    for nom, y in holatlar.items():
        m = LinearRegression().fit(x.reshape(-1, 1), y)
        e = y - m.predict(x.reshape(-1, 1))
        # x bo'yicha 4 chorakda qoldiq o'rtachasi
        chorak = np.quantile(x, [0, 0.25, 0.5, 0.75, 1.0])
        ort = [e[(x >= chorak[i]) & (x <= chorak[i + 1])].mean() for i in range(4)]
        print(f"  {nom:<12}: chorak o'rtachalari "
              f"[{', '.join(f'{v:6.2f}' for v in ort)}]")
    print("  nochiziqli holatda o'rtachalar egri: + - - + (egrilik alomati)")

    print("\n=== 3. Qoldiq tarqoqligi x bo'yicha ===")
    for nom, y in holatlar.items():
        m = LinearRegression().fit(x.reshape(-1, 1), y)
        e = y - m.predict(x.reshape(-1, 1))
        past = e[x < np.median(x)].std()
        yuqori = e[x >= np.median(x)].std()
        print(f"  {nom:<12}: SD past {past:5.2f}, yuqori {yuqori:5.2f}, "
              f"nisbat {yuqori / past:.2f}")
    print("  kengayuvchi holatda nisbat katta — geteroskedastiklik 13.4-bob")

    print("\n=== 4. Tuzatish: x^2 belgisini qo'shish ===")
    y = holatlar["nochiziqli"]
    X2 = np.column_stack([x, x ** 2])
    m2 = LinearRegression().fit(X2, y)
    print(f"  faqat x:      R^2 = "
          f"{r2_score(y, LinearRegression().fit(x.reshape(-1, 1), y).predict(x.reshape(-1, 1))):.3f}")
    print(f"  x va x^2 bilan: R^2 = {r2_score(y, m2.predict(X2)):.3f}")
    print("  ⭐ Qoldiqlar keyingi belgini aytib beradi 13.5-bob")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Uch holat uchun R^2 ===
  chiziqli    : R^2 = 0.929
  nochiziqli  : R^2 = 0.942
  kengayuvchi : R^2 = 0.807
  (R^2 yuqori bo'lsa ham model to'g'ri degani emas)

=== 2. Qoldiqlarda tuzilma ===
  chiziqli    : chorak o'rtachalari [ -0.13,   0.30,  -0.16,  -0.01]
  nochiziqli  : chorak o'rtachalari [  8.15,  -7.52,  -8.56,   7.92]
  kengayuvchi : chorak o'rtachalari [ -0.08,   0.02,   0.17,  -0.11]
  nochiziqli holatda o'rtachalar egri: + - - + (egrilik alomati)

=== 3. Qoldiq tarqoqligi x bo'yicha ===
  chiziqli    : SD past  2.95, yuqori  3.09, nisbat 1.05
  nochiziqli  : SD past 10.10, yuqori 10.06, nisbat 1.00
  kengayuvchi : SD past  2.46, yuqori  7.37, nisbat 3.00
  kengayuvchi holatda nisbat katta — geteroskedastiklik 13.4-bob

=== 4. Tuzatish: x^2 belgisini qo'shish ===
  faqat x:      R^2 = 0.942
  x va x^2 bilan: R^2 = 0.995
  ⭐ Qoldiqlar keyingi belgini aytib beradi (13.5)

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

Misol 4 — Uy narxi: baza, model va talqin

python
"""Chiziqli regressiya to'liq oqimda (real numpy/sklearn)."""

import numpy as np
from sklearn.dummy import DummyRegressor
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error, r2_score
from sklearn.model_selection import train_test_split


def yarat(seed: int = 11, n: int = 1200):
    rng = np.random.default_rng(seed)
    maydon = rng.lognormal(np.log(70), 0.33, n).clip(28, 260)
    xona = np.clip((maydon / 24).round(), 1, 7)
    yosh = rng.integers(0, 45, n).astype(float)
    markaz = (rng.random(n) < 0.3).astype(float)
    narx = (18 + 1.52 * maydon + 4.0 * xona - 0.62 * yosh + 38 * markaz
            + rng.normal(0, 13, n))
    X = np.column_stack([maydon, xona, yosh, markaz])
    return X, narx


def main() -> None:
    X, y = yarat()
    nomlar = ["maydon", "xona", "yosh", "markaz"]
    Xtr, Xte, ytr, yte = train_test_split(X, y, test_size=0.3, random_state=0)

    print("=== 1. Baza ===")
    baza = DummyRegressor(strategy="mean").fit(Xtr, ytr)
    print(f"  o'rtacha: MAE {mean_absolute_error(yte, baza.predict(Xte)):.2f} ming, "
          f"R^2 {r2_score(yte, baza.predict(Xte)):.3f}")

    print("\n=== 2. Chiziqli regressiya ===")
    m = LinearRegression().fit(Xtr, ytr)
    p = m.predict(Xte)
    print(f"  MAE {mean_absolute_error(yte, p):.2f} ming, R^2 {r2_score(yte, p):.3f}")
    print(f"  yaxshilanish: "
          f"{1 - mean_absolute_error(yte, p) / mean_absolute_error(yte, baza.predict(Xte)):.1%}")

    print("\n=== 3. Koeffitsiyentlar (talqin) ===")
    print(f"  kesma: {m.intercept_:.1f} ming")
    for nom, w in zip(nomlar, m.coef_):
        print(f"  {nom:<8}: {w:+7.2f}  (haqiqiy: "
              f"{dict(maydon=1.52, xona=4.0, yosh=-0.62, markaz=38.0)[nom]:+.2f})")
    print("  har koeffitsiyent — 'qolganlari o'zgarmaganda' ta'siri")

    print("\n=== 4. Bitta uy uchun tushuntirish ===")
    uy = Xte[0]
    hissa = m.coef_ * uy
    print(f"  uy: maydon {uy[0]:.0f} m^2, {uy[1]:.0f} xona, {uy[2]:.0f} yosh, "
          f"markaz={uy[3]:.0f}")
    print(f"  kesma {m.intercept_:7.1f}")
    for nom, h in zip(nomlar, hissa):
        print(f"  {nom:<8} {h:+7.1f}")
    print(f"  jami bashorat {m.predict(uy.reshape(1, -1))[0]:7.1f}, "
          f"haqiqiy {yte[0]:7.1f}")
    print("  ⭐ Chiziqli modelning asosiy kuchi — shu jadval")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Baza ===
  o'rtacha: MAE 38.39 ming, R^2 -0.000

=== 2. Chiziqli regressiya ===
  MAE 10.37 ming, R^2 0.932
  yaxshilanish: 73.0%

=== 3. Koeffitsiyentlar (talqin) ===
  kesma: 18.7 ming
  maydon  :   +1.44  (haqiqiy: +1.52)
  xona    :   +5.37  (haqiqiy: +4.00)
  yosh    :   -0.56  (haqiqiy: -0.62)
  markaz  :  +37.66  (haqiqiy: +38.00)
  har koeffitsiyent — 'qolganlari o'zgarmaganda' ta'siri

=== 4. Bitta uy uchun tushuntirish ===
  uy: maydon 42 m^2, 2 xona, 17 yosh, markaz=1
  kesma    18.7
  maydon     +60.8
  xona       +10.7
  yosh        -9.5
  markaz     +37.7
  jami bashorat   118.4, haqiqiy   105.2
  ⭐ Chiziqli modelning asosiy kuchi — shu jadval

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


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

Noto'g'ri fikr To'g'risi
"Chiziqli model eskirgan" Eng ko'p ishlatiladigan
"Chiziqli — faqat to'g'ri chiziq" Koeffitsiyentlarga nisbatan chiziqli
"Koeffitsiyent — sabab" Faqat bog'lanish (4.10)
"R^2 yuqori — model to'g'ri" Qoldiqlarga qarang
"OLS outlierlarga chidamli" Juda sezgir
"Masshtablash shart" OLS uchun emas, Ridge uchun ha
"Normal tenglama eng yaxshi" lstsq (SVD) barqarorroq
"Ekstrapolyatsiya mumkin" Xavfli

6. Keng tarqalgan xatolar va yechimlari

1. Normal tenglamani qo'lda hisoblash

python
w = np.linalg.inv(X.T @ X) @ X.T @ y                              # ⚠️
w = np.linalg.lstsq(X, y, rcond=None)[0]                          # ✅

2. Kesma ustunini unutish

python
np.linalg.lstsq(x.reshape(-1, 1), y)   # kesmasiz                 # ⚠️
np.linalg.lstsq(np.column_stack([np.ones(len(x)), x]), y)         # ✅

3. Qoldiqlarga qaramaslik

python
print("R2:", model.score(X, y))                                   # ⚠️
# qoldiqlarni x bo'yicha ko'rish: tuzilma bormi?                  # ✅

4. Ekstrapolyatsiya

python
model.predict([[500]])                 # o'quvda 30..150 edi      # ⚠️
# diapazonni tekshirib, ogohlantirish berish                      # ✅

5. Sababiy talqin

python
# "markazda bo'lish narxni 38 ming oshiradi"                      # ⚠️
# "markazdagi uylar, qolgan belgilar teng bo'lsa, 38 ming qimmat" # ✅

6. Kategoriyani son sifatida

python
X["hudud"] = [0, 1, 2, 3]              # tartib ma'nosi paydo bo'ldi # ⚠️
pd.get_dummies(X["hudud"], drop_first=True)                       # ✅

7. Outlierni sezmaslik

python
LinearRegression().fit(X, y)           # bitta nuqta hukmron      # ⚠️
# ta'sir o'lchovlari va robust usul 13.11-bob                       # ✅

7. Integratsiya — bu bilim qayerda kerak bo'ladi

  • 4.9-dars (o'tilgan): Korrelyatsiya va nishab
  • 10.6-dars (o'tilgan): Eng kichik kvadratlar matematikasi
  • 12.8-dars (o'tilgan): Regressiya metrikalari
  • 13.2-dars: Ko'p o'zgaruvchili regressiya
  • 13.4-dars: Taxminlar va diagnostika

8. Eng yaxshi amaliyotlar

  1. Bazadan boshlang.

  2. Qoldiqlarga qarang.

  3. lstsq ishlating.

  4. Koeffitsiyentni ehtiyot bilan talqin qiling.

  5. Diapazondan chiqmang.

  6. Outlierlarni tekshiring.

  7. Birlikni yozing.

  8. Soddaroq modelni afzal ko'ring.


9. Amaliy topshiriq

Vazifa 1: Bashorat qiling

python
1.  # chiziqli regressiya tenglamasi?
2.  # "chiziqli" nimaga nisbatan?
3.  # OLS nimani minimallashtiradi?
4.  # normal tenglama formulasi?
5.  # bitta belgida w1 formulasi?
6.  # chiziq qaysi nuqtadan o'tadi?
7.  # qoldiqlar yig'indisi?
8.  # bitta belgida R^2 va r munosabati?
9.  # OLS ning asosiy zaifligi?
10. # LinearRegression masshtablash talab qiladimi?
11. # ekstrapolyatsiya nima?
12. # koeffitsiyent sababiy talqin qilinadimi?
Javoblar
  1. y = w0 + w1x1 + ... + wpxp
  2. Koeffitsiyentlarga
  3. Qoldiqlar kvadratlari yig'indisi
  4. w = (XTX)^(-1)XTy
  5. Cov(x,y)/Var(x)
  6. (x_ort, y_ort)
  7. Nol
  8. R^2 = r^2
  9. Outlierlarga sezgirlik
  10. Yo'q
  11. O'quv diapazonidan tashqarida bashorat
  12. Yo'q

Vazifa 2: Xatolarni tuzating

python
1.  w = np.linalg.inv(X.T @ X) @ X.T @ y

2.  np.linalg.lstsq(x.reshape(-1, 1), y, rcond=None)   # kesma kerak

3.  print("R2 = 0.94 — model to'g'ri")

4.  model.predict([[400]])   # o'quv diapazoni 30..150

5.  # "har qo'shimcha xona narxni 4 ming oshiradi"
Javoblar
python
1.  w = np.linalg.lstsq(X, y, rcond=None)[0]

2.  np.linalg.lstsq(np.column_stack([np.ones(len(x)), x]), y, rcond=None)

3.  # qoldiqlarni tekshiring: tuzilma bormi?

4.  # diapazondan tashqarida — bashorat ishonchsiz

5.  # "xonasi ko'p uylar, maydoni teng bo'lsa, ~4 ming qimmat"

Vazifa 3: Qo'lda hisoblash

Modellang:

  1. Sun'iy ma'lumot
  2. Formulalar bilan w0, w1
  3. lstsq va sklearn
  4. Taqqoslash

Vazifa 4: Yo'qotish funksiyalari

Modellang:

  1. Kvadrat va absolyut
  2. Outlier qo'shish
  3. Nishab o'zgarishi
  4. Xulosa

Vazifa 5: Qoldiqlar

Modellang:

  1. Chiziqli va nochiziqli
  2. Qoldiq tuzilmasi
  3. Tuzatish
  4. R^2 solishtirish

Vazifa 6: To'liq model

Modellang:

  1. Baza
  2. Model
  3. Koeffitsiyentlar
  4. Bitta bashorat tushuntirishi

Vazifa 7: O'ylash

Chuqur o'rganish davrida chiziqli regressiya hali ham banklarda, tibbiyotda va davlat statistikasida asosiy model bo'lib qolmoqda. Bu konservatizmmi yoki ratsional tanlovmi?

Javob

Qisqa javob: ko'p hollarda bu ratsional tanlov: aniqlikdagi kichik yutuq talqin, barqarorlik, tartibga solish talablari va xatolarni tushuntirish qobiliyati bilan almashtirilmaydi.

1. Nega chiziqli model saqlanib qolgan

Sabab Izoh
Talqin Har koeffitsiyent tushuntiriladi (kredit rad etish sababi)
Tartibga solish Ko'p sohada model izohlanishi shart
Barqarorlik Oz ma'lumotda ham ishonchli, drift'ga chidamli
Tezlik Millisekundlarda qayta o'qitiladi
Xato tahlili Muammo qayerdaligini topish oson

2. Qachon bu noto'g'ri tanlov

  • Kuchli nochiziqlik va o'zaro ta'sirlar bor (daraxtlar ancha yaxshi)
  • Ma'lumot ko'p va aniqlik to'g'ridan-to'g'ri pulga aylanadi
  • Belgilar tuzilmali (rasm, matn, signal)

3. O'rta yo'l

  • Chiziqli model + tanlangan nochiziqli belgilar (13.5)
  • Murakkab model + tushuntirish vositalari (SHAP)
  • Ansambl: chiziqli baza + qoldiqni modellash

4. Qanday qaror qilinadi

  1. Ikkalasini ham o'qiting va noaniqlik bilan solishtiring (11.1)
  2. Farq kichik bo'lsa — soddasini oling
  3. Talqin talabini hisobga oling
  4. Qo'llab-quvvatlash narxini unutmang

5. Xulosa

  1. Aniqlik — yagona mezon emas
  2. Chiziqli model ko'p sohada yetarli
  3. Farq sezilarli bo'lsa murakkabroqqa o'ting
  4. Tushuntirish — mahsulotning qismi

Nimani mustahkamlaydi: 2.6-bo'lim.


Xulosa

Bu darsda chiziqli regressiyani o'rgandik.

Eng muhim uch fikr:

  1. Model — vaznli yig'indi. y = w0 + w1x1 + ... + wpxp: har koeffitsiyent "qolganlari o'zgarmaganda" ta'sirni ko'rsatadi. "Chiziqli" so'zi koeffitsiyentlarga nisbatan — x^2 yoki log x belgilarini qo'shsangiz model baribir chiziqli qoladi 13.5-bob.

  2. Eng kichik kvadratlar. Koeffitsiyentlar qoldiqlar kvadratlarini minimallashtirishdan topiladi: w = (XTX)^(-1)XTy (amalda np.linalg.lstsq — SVD orqali barqarorroq). Bitta belgida w1 = r × SD_y/SD_x, chiziq (x_ort, y_ort) dan o'tadi, qoldiqlar yig'indisi nol. Narxi: outlierlarga sezgirlik 13.11-bob.

  3. Qoldiqlar — asosiy diagnostika. R^2 yuqori bo'lgani model to'g'ri degani emas: qoldiqlarda egrilik (nochiziqlik kerak) yoki kengayuvchi tarqoqlik (geteroskedastiklik) ko'rinishi mumkin. Chiziqli model kamdan-kam eng aniq, lekin ko'pincha eng foydali: tez, barqaror va har bashoratni tushuntiradi.

Keyingi darsda ko'p o'zgaruvchili regressiyani o'rganamiz: bir nechta belgi, koeffitsiyentlar geometriyasi, belgilar o'zaro bog'liqligi va model sig'imi.

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
13.1-dars: Chiziqli regressiya — IlmHamroh