7-bo‘lim

Chiziqli regressiya

Eng sodda va eng muhim model - chiziqli regressiya qanday ishlaydi, gradient tushish va koeffitsiyentlarni talqin qilish.

🕑 15 daqiqa o‘qish 📄 926 so‘z 👁 5 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. G'oya
  2. Xato funksiyasi
  3. Birinchi model
  4. Metrikalarni tushunish
  5. MAE yoki RMSE?
  6. Gradient tushish
  7. Qoldiqlarni tahlil qilish
  8. Koeffitsiyentlarni talqin qilish
  9. Bir belgidan ko'p belgiga
  10. Chiziqli regressiyaning shartlari
  11. To'liq misol
  12. Xulosa

Chiziqli regressiya - mashinali o'qitishning "salom, dunyo" si. Sodda, tez va tushunarli. Ko'p amaliy vazifalarda u yetarli bo'ladi.

G'oya #

Ma'lumot nuqtalari orasidan eng mos to'g'ri chiziq o'tkazamiz.

Maydon (m2) Narx Model eng yaxshi chiziqni topadi Yashil chiziqlar - xatolar (qoldiqlar) Ularning kvadratlari yig'indisi eng kichik y = w · x + b w - qiyalik, b - kesishma
Maqsad - xatolar kvadratlari yig'indisini minimallashtirish

Formula:

Natija
bashorat = w1 · maydon + w2 · xonalar + ... + b
  • w - vazn (koeffitsiyent): har bir belgi qanchalik muhim
  • b - kesishma (bias): boshlang'ich qiymat

Modelning vazifasi - eng yaxshi w va b ni topish.

Xato funksiyasi #

Model qanchalik xato qilayotganini o'lchash kerak:

Natija
MSE = (1/n) · Σ (haqiqiy - bashorat)²
Nima uchun kvadrat?
  1. Manfiy xatolar musbatlarni yo'q qilmaydi (+10 va -10 nolga aylanmaydi)
  2. Katta xatolar ko'proq jazolanadi - 10 lik xato 1 lik xatodan 100 barobar yomonroq hisoblanadi
  3. Matematik qulaylik - hosila oson hisoblanadi

Birinchi model #

Python
import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score

np.random.seed(42)

# Ma'lumot
n = 200
maydon = np.random.uniform(40, 150, n)
narx = maydon * 8.5 + np.random.normal(0, 70, n) + 120

X = maydon.reshape(-1, 1)
y = narx

X_oqitish, X_sinov, y_oqitish, y_sinov = train_test_split(
    X, y, test_size=0.2, random_state=42
)

# O'qitish
model = LinearRegression()
model.fit(X_oqitish, y_oqitish)

print(f"Koeffitsiyent (w): {model.coef_[0]:.2f}")
print(f"Kesishma (b):      {model.intercept_:.2f}")
Natija
Koeffitsiyent (w): 8.43
Kesishma (b):      126.85

Model haqiqiy qiymatlarni (8.5 va 120) deyarli topdi.

Python
bashorat = model.predict(X_sinov)

print(f"MSE:  {mean_squared_error(y_sinov, bashorat):.1f}")
print(f"RMSE: {np.sqrt(mean_squared_error(y_sinov, bashorat)):.1f}")
print(f"R2:   {r2_score(y_sinov, bashorat):.3f}")
Natija
MSE:  4821.3
RMSE: 69.4
R2:   0.936

Metrikalarni tushunish #

MetrikaMa'nosiYaxshi qiymat
MSEXatolar kvadratlari o'rtachasiKichikroq
RMSEMSE ning ildizi - nishon birligidaKichikroq
MAEXatolar modullari o'rtachasiKichikroq
Model tushuntirgan tarqoqlik ulushi1 ga yaqin
RMSE ni qanday talqin qilish kerak?

RMSE = 69.4 degani: model o'rtacha 69 mln so'mga xato qiladi.

Bu ko'pmi yoki kammi? Nishonning o'rtachasi bilan solishtiring:

Python
print(f"O'rtacha narx: {y.mean():.0f}")
print(f"Nisbiy xato:   {69.4 / y.mean() * 100:.1f}%")
Natija
O'rtacha narx: 927
Nisbiy xato:   7.5%

7.5% xato - uy narxini bashorat qilish uchun juda yaxshi natija.

R² nimani anglatadi?
Ma'nosi
1.0Mukammal - barcha nuqtalar chiziqda
0.9Model tarqoqlikning 90 foizini tushuntiradi
0.0Model o'rtacha qiymatdan yaxshiroq emas
ManfiyModel o'rtachadan yomonroq

R² manfiy chiqsa - modelda jiddiy muammo bor.

MAE yoki RMSE? #

Python
from sklearn.metrics import mean_absolute_error

print(f"MAE:  {mean_absolute_error(y_sinov, bashorat):.1f}")
print(f"RMSE: {np.sqrt(mean_squared_error(y_sinov, bashorat)):.1f}")
Natija
MAE:  55.2
RMSE: 69.4
Qaysi birini tanlash?
  • MAE - barcha xatolarga bir xil qaraydi, chetdagi qiymatlarga chidamli
  • RMSE - katta xatolarni ko'proq jazolaydi

"Bitta katta xato o'nta kichik xatodan yomonroqmi?" degan savolga javobingizga qarab tanlang.

Uy narxida: 500 mln lik bitta xato 50 mln lik o'nta xatodan yomonroq → RMSE.

Gradient tushish #

Model eng yaxshi w va b ni qanday topadi?

Gradient tushish - eng past nuqtani qidirish Vazn (w) Xato (MSE) boshlang'ich minimum Har bir qadamda 1. Xatoni hisoblash 2. Qaysi tomon pastga - aniqlash 3. Shu tomonga kichik qadam 4. Takrorlash
Qadam kattaligi "o'qitish tezligi" deb ataladi
Python
def gradient_tushish(X, y, tezlik=0.0001, qadamlar=1000):
    n = len(X)
    w = 0.0
    b = 0.0

    for qadam in range(qadamlar):
        bashorat = w * X + b
        xato = bashorat - y

        # Hosilalar
        dw = (2 / n) * np.sum(xato * X)
        db = (2 / n) * np.sum(xato)

        # Yangilash
        w -= tezlik * dw
        b -= tezlik * db

        if qadam % 200 == 0:
            mse = np.mean(xato ** 2)
            print(f"Qadam {qadam:4d}: w={w:6.2f}  b={b:6.2f}  MSE={mse:9.1f}")

    return w, b


w, b = gradient_tushish(maydon, narx)
Natija
Qadam    0: w=  1.85  b=  0.02  MSE= 923417.3
Qadam  200: w=  8.98  b=  0.94  MSE=   6248.1
Qadam  400: w=  8.94  b=  1.82  MSE=   6212.4
Qadam  600: w=  8.89  b=  2.68  MSE=   6178.9
Qadam  800: w=  8.85  b=  3.52  MSE=   6147.5
LinearRegression gradient tushish ishlatmaydi

scikit-learn ning LinearRegression aniq matematik formula bilan javobni bir zumda topadi (eng kichik kvadratlar usuli).

Gradient tushish esa katta ma'lumotda va neyron tarmoqlarda kerak - u yerda aniq formula yo'q.

SGDRegressor esa gradient tushishni ishlatadi.

O'qitish tezligi juda muhim
TezlikNatija
Juda kichikJuda sekin yaqinlashadi
To'g'riSilliq va tez yaqinlashadi
Juda kattaSakraydi, minimumni o'tkazib yuboradi
Haddan tashqariXato cheksizlikka ketadi (NaN)

MSE o'rniga nan ko'rsangiz - tezlikni kamaytiring.

Qoldiqlarni tahlil qilish #

Model to'g'ri ishlayotganini tekshirishning eng yaxshi usuli:

Python
qoldiqlar = y_sinov - bashorat

import matplotlib.pyplot as plt

fig, oyna = plt.subplots(1, 2, figsize=(12, 4))

oyna[0].scatter(bashorat, qoldiqlar, alpha=0.6)
oyna[0].axhline(0, color="red", linestyle="--")
oyna[0].set_xlabel("Bashorat")
oyna[0].set_ylabel("Qoldiq")
oyna[0].set_title("Qoldiqlar taqsimoti")

oyna[1].hist(qoldiqlar, bins=25, color="steelblue", edgecolor="white")
oyna[1].set_title("Qoldiqlar gistogrammasi")

plt.tight_layout()
plt.show()
Qoldiqlar grafigi nimani ko'rsatadi Yaxshi: tasodifiy tarqalgan Model tuzilmani to'liq o'zlashtirgan Yomon: naqsh bor Bog'liqlik chiziqli emas - egri model kerak Qoldiqlarda naqsh ko'rsangiz - model biror narsani o'tkazib yuborgan
Bu grafik chiziqli model mos kelishini tekshirishning eng yaxshi usuli

Koeffitsiyentlarni talqin qilish #

Python
uylar = pd.DataFrame({
    "maydon":  np.random.uniform(40, 150, 300),
    "xonalar": np.random.randint(1, 5, 300),
    "yosh":    np.random.randint(0, 40, 300),
})
uylar["narx"] = (
    uylar["maydon"] * 8
    + uylar["xonalar"] * 25
    - uylar["yosh"] * 4
    + np.random.normal(0, 40, 300)
    + 100
)

X = uylar[["maydon", "xonalar", "yosh"]]
y = uylar["narx"]

model = LinearRegression()
model.fit(X, y)

for belgi, vazn in zip(X.columns, model.coef_):
    print(f"{belgi:10s}: {vazn:7.2f}")
print(f"{'kesishma':10s}: {model.intercept_:7.2f}")
Natija
maydon    :    8.01
xonalar   :   24.63
yosh      :   -3.94
kesishma  :  100.85
Talqin
  • Maydon 1 m2 ga oshsa, narx 8 mln so'mga oshadi
  • Xona soni 1 ta oshsa, narx 24.6 mln so'mga oshadi
  • Uy 1 yosh kattalashsa, narx 3.9 mln so'mga kamayadi

Bu chiziqli regressiyaning eng katta afzalligi: natija tushunarli. Bankka "nima uchun kredit rad etildi?" degan savolga javob berish mumkin.

Koeffitsiyentlarni solishtirish uchun masshtablang
Python
maydon:   8.01     xonalar: 24.63

"Xonalar muhimroq" deb xulosa qilish noto'g'ri - ular turli birliklarda o'lchanadi.

Muhimlikni solishtirish uchun avval masshtablang:

Python
from sklearn.preprocessing import StandardScaler

X_masshtab = StandardScaler().fit_transform(X)
model.fit(X_masshtab, y)
# endi koeffitsiyentlarni solishtirish mumkin

Bir belgidan ko'p belgiga #

Python
# Bitta belgi
model_1 = LinearRegression().fit(uylar[["maydon"]], y)
print(f"Faqat maydon:  R2 = {model_1.score(uylar[['maydon']], y):.3f}")

# Uchta belgi
model_3 = LinearRegression().fit(X, y)
print(f"Uchta belgi:   R2 = {model_3.score(X, y):.3f}")
Natija
Faqat maydon:  R2 = 0.891
Uchta belgi:   R2 = 0.978

Chiziqli regressiyaning shartlari #

Model qachon ishlamaydi?
ShartBuzilsa nima bo'ladi
Bog'liqlik chiziqliModel naqshni topa olmaydi
Belgilar bir-biriga bog'liq emasKoeffitsiyentlar beqaror bo'ladi
Xatolar bir xil tarqalganBashorat ishonchsiz
Chetdagi qiymatlar kamChiziq buzilib ketadi

Chiziqli bo'lmagan bog'liqlik uchun keyingi bo'limda polinomial regressiya ni ko'ramiz.

Python
# Multikollinearlikni tekshirish
print(X.corr().round(2))

Agar ikki belgi orasida korrelyatsiya 0.9 dan yuqori bo'lsa - bittasini olib tashlang.

To'liq misol #

Python
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler

X_oqitish, X_sinov, y_oqitish, y_sinov = train_test_split(
    X, y, test_size=0.2, random_state=42
)

quvur = Pipeline([
    ("masshtab", StandardScaler()),
    ("model", LinearRegression()),
])

quvur.fit(X_oqitish, y_oqitish)

bashorat_oqitish = quvur.predict(X_oqitish)
bashorat_sinov   = quvur.predict(X_sinov)

print(f"O'qitish R2: {r2_score(y_oqitish, bashorat_oqitish):.3f}")
print(f"Sinov R2:    {r2_score(y_sinov, bashorat_sinov):.3f}")
print(f"Sinov RMSE:  {np.sqrt(mean_squared_error(y_sinov, bashorat_sinov)):.1f}")
Natija
O'qitish R2: 0.979
Sinov R2:    0.976
Sinov RMSE:  41.2
Ikkala R² yaqin - bu yaxshi

O'qitish va sinov natijalari yaqin bo'lsa, model umumlashtira olyapti.

Agar o'qitishda 0.99, sinovda 0.60 bo'lsa - bu qayta o'qitish (overfitting). 16-bo'limda batafsil ko'ramiz.

Amaliy topshiriq
  1. Sun'iy ma'lumot yarating: y = 3x + 5 + shovqin.
  2. LinearRegression bilan modelni o'qiting.
  3. Topilgan coef_ va intercept_ haqiqiy qiymatlarga yaqinmi?
  4. Shovqin darajasini oshiring va R² qanday o'zgarishini kuzating.
  5. MSE, RMSE, MAE va R² ni hisoblang.
  6. Qoldiqlar grafigini chizing - naqsh bormi?
  7. Gradient tushish funksiyasini o'zingiz yozing.
  8. O'qitish tezligini 0.01 qiling - nima bo'ladi?
  9. Uch belgili model quring va koeffitsiyentlarni talqin qiling.
  10. Masshtablashdan oldin va keyin koeffitsiyentlarni solishtiring.

Xulosa #

  • Chiziqli regressiya nuqtalar orasidan eng mos chiziqni topadi.
  • Formula: y = w1·x1 + w2·x2 + ... + b.
  • MSE xatolar kvadratlari o'rtachasi - katta xatolarni ko'proq jazolaydi.
  • RMSE nishon bilan bir xil birlikda - talqin qilish oson.
  • model tushuntirgan tarqoqlik ulushi; manfiy bo'lsa - jiddiy muammo.
  • Gradient tushish - xatoni bosqichma-bosqich kamaytirish usuli.
  • O'qitish tezligi juda katta bo'lsa model yaqinlashmaydi.
  • Qoldiqlar grafigi modelning mosligini tekshirishning eng yaxshi usuli.
  • Koeffitsiyentlar talqin qilinadi - bu chiziqli modelning katta afzalligi.
  • Koeffitsiyentlarni solishtirish uchun avval masshtablang.

Keyingi bo'limda chiziqli bo'lmagan bog'liqliklar bilan ishlaymiz.

Xatolik topdingizmi?

Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.