Mundarija (22)
- 1. Kirish va motivatsiya
- 2. Nazariya — chuqur tushuntirish
- 2.1. Model shakli
- 2.2. Eng kichik kvadratlar
- 2.3. Bitta belgi uchun formulalar
- 2.4. Qoldiqlar va R^2
- 2.5. sklearn bilan ishlash
- 2.6. Chiziqlilik qachon yetarli
- 2.7. Tuzoqlar
- 2.8. Eng oddiy model — eng ko'p ishlatiladigan
- 3. Tez ma'lumotnoma
- 4. Batafsil misollar
- Misol 1 — Qo'lda va sklearn bilan: bir xil natija
- Misol 2 — Nega kvadrat: uchta yo'qotish funksiyasi
- Misol 3 — Qoldiqlar nima deydi
- Misol 4 — Uy narxi: baza, model va talqin
- 5. To'g'ri va noto'g'ri tushunishlar
- 6. Keng tarqalgan xatolar va yechimlari
- 7. Integratsiya — bu bilim qayerda kerak bo'ladi
- 8. Eng yaxshi amaliyotlar
- 9. Amaliy topshiriq
- Xulosa
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
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
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
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
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^2Qoldiqlar — 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
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
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
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'qimaFormulalar 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) = 04. Batafsil misollar
Misollar real numpy/sklearn bilan (Python 3.14).
Misol 1 — Qo'lda va sklearn bilan: bir xil natija
"""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:
=== 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.9371Nima ko'rsatdi: 2.2, 2.3, 2.4-bo'limlar.
Misol 2 — Nega kvadrat: uchta yo'qotish funksiyasi
"""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:
=== 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
"""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:
=== 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
"""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:
=== 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 jadvalNima 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
w = np.linalg.inv(X.T @ X) @ X.T @ y # ⚠️
w = np.linalg.lstsq(X, y, rcond=None)[0] # ✅2. Kesma ustunini unutish
np.linalg.lstsq(x.reshape(-1, 1), y) # kesmasiz # ⚠️
np.linalg.lstsq(np.column_stack([np.ones(len(x)), x]), y) # ✅3. Qoldiqlarga qaramaslik
print("R2:", model.score(X, y)) # ⚠️
# qoldiqlarni x bo'yicha ko'rish: tuzilma bormi? # ✅4. Ekstrapolyatsiya
model.predict([[500]]) # o'quvda 30..150 edi # ⚠️
# diapazonni tekshirib, ogohlantirish berish # ✅5. Sababiy talqin
# "markazda bo'lish narxni 38 ming oshiradi" # ⚠️
# "markazdagi uylar, qolgan belgilar teng bo'lsa, 38 ming qimmat" # ✅6. Kategoriyani son sifatida
X["hudud"] = [0, 1, 2, 3] # tartib ma'nosi paydo bo'ldi # ⚠️
pd.get_dummies(X["hudud"], drop_first=True) # ✅7. Outlierni sezmaslik
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
Bazadan boshlang.
Qoldiqlarga qarang.
lstsq ishlating.
Koeffitsiyentni ehtiyot bilan talqin qiling.
Diapazondan chiqmang.
Outlierlarni tekshiring.
Birlikni yozing.
Soddaroq modelni afzal ko'ring.
9. Amaliy topshiriq
Vazifa 1: Bashorat qiling
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
- y = w0 + w1x1 + ... + wpxp
- Koeffitsiyentlarga
- Qoldiqlar kvadratlari yig'indisi
- w = (XTX)^(-1)XTy
- Cov(x,y)/Var(x)
- (x_ort, y_ort)
- Nol
- R^2 = r^2
- Outlierlarga sezgirlik
- Yo'q
- O'quv diapazonidan tashqarida bashorat
- Yo'q
Vazifa 2: Xatolarni tuzating
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
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:
- Sun'iy ma'lumot
- Formulalar bilan w0, w1
- lstsq va sklearn
- Taqqoslash
Vazifa 4: Yo'qotish funksiyalari
Modellang:
- Kvadrat va absolyut
- Outlier qo'shish
- Nishab o'zgarishi
- Xulosa
Vazifa 5: Qoldiqlar
Modellang:
- Chiziqli va nochiziqli
- Qoldiq tuzilmasi
- Tuzatish
- R^2 solishtirish
Vazifa 6: To'liq model
Modellang:
- Baza
- Model
- Koeffitsiyentlar
- 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
- Ikkalasini ham o'qiting va noaniqlik bilan solishtiring (11.1)
- Farq kichik bo'lsa — soddasini oling
- Talqin talabini hisobga oling
- Qo'llab-quvvatlash narxini unutmang
5. Xulosa
- Aniqlik — yagona mezon emas
- Chiziqli model ko'p sohada yetarli
- Farq sezilarli bo'lsa murakkabroqqa o'ting
- Tushuntirish — mahsulotning qismi
Nimani mustahkamlaydi: 2.6-bo'lim.
Xulosa
Bu darsda chiziqli regressiyani o'rgandik.
Eng muhim uch fikr:
Model — vaznli yig'indi.
y = w0 + w1x1 + ... + wpxp: har koeffitsiyent "qolganlari o'zgarmaganda" ta'sirni ko'rsatadi. "Chiziqli" so'zi koeffitsiyentlarga nisbatan —x^2yokilog xbelgilarini qo'shsangiz model baribir chiziqli qoladi 13.5-bob.Eng kichik kvadratlar. Koeffitsiyentlar qoldiqlar kvadratlarini minimallashtirishdan topiladi:
w = (XTX)^(-1)XTy(amaldanp.linalg.lstsq— SVD orqali barqarorroq). Bitta belgidaw1 = r × SD_y/SD_x, chiziq(x_ort, y_ort)dan o'tadi, qoldiqlar yig'indisi nol. Narxi: outlierlarga sezgirlik 13.11-bob.Qoldiqlar — asosiy diagnostika.
R^2yuqori 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.
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!