7-bo‘lim
Chiziqli regressiya
Eng sodda va eng muhim model - chiziqli regressiya qanday ishlaydi, gradient tushish va koeffitsiyentlarni talqin qilish.
Ushbu bo‘lim mundarijasi
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.
Formula:
bashorat = w1 · maydon + w2 · xonalar + ... + b
w- vazn (koeffitsiyent): har bir belgi qanchalik muhimb- kesishma (bias): boshlang'ich qiymat
Modelning vazifasi - eng yaxshi w va b ni topish.
Xato funksiyasi #
Model qanchalik xato qilayotganini o'lchash kerak:
MSE = (1/n) · Σ (haqiqiy - bashorat)²
- Manfiy xatolar musbatlarni yo'q qilmaydi (+10 va -10 nolga aylanmaydi)
- Katta xatolar ko'proq jazolanadi - 10 lik xato 1 lik xatodan 100 barobar yomonroq hisoblanadi
- Matematik qulaylik - hosila oson hisoblanadi
Birinchi model #
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}")
Koeffitsiyent (w): 8.43
Kesishma (b): 126.85
Model haqiqiy qiymatlarni (8.5 va 120) deyarli topdi.
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}")
MSE: 4821.3
RMSE: 69.4
R2: 0.936
Metrikalarni tushunish #
| Metrika | Ma'nosi | Yaxshi qiymat |
|---|---|---|
| MSE | Xatolar kvadratlari o'rtachasi | Kichikroq |
| RMSE | MSE ning ildizi - nishon birligida | Kichikroq |
| MAE | Xatolar modullari o'rtachasi | Kichikroq |
| R² | Model tushuntirgan tarqoqlik ulushi | 1 ga yaqin |
RMSE = 69.4 degani: model o'rtacha 69 mln so'mga xato qiladi.
Bu ko'pmi yoki kammi? Nishonning o'rtachasi bilan solishtiring:
print(f"O'rtacha narx: {y.mean():.0f}")
print(f"Nisbiy xato: {69.4 / y.mean() * 100:.1f}%")
O'rtacha narx: 927
Nisbiy xato: 7.5%
7.5% xato - uy narxini bashorat qilish uchun juda yaxshi natija.
| R² | Ma'nosi |
|---|---|
1.0 | Mukammal - barcha nuqtalar chiziqda |
0.9 | Model tarqoqlikning 90 foizini tushuntiradi |
0.0 | Model o'rtacha qiymatdan yaxshiroq emas |
| Manfiy | Model o'rtachadan yomonroq |
R² manfiy chiqsa - modelda jiddiy muammo bor.
MAE yoki RMSE? #
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}")
MAE: 55.2
RMSE: 69.4
- 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?
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)
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 ishlatmaydiscikit-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.
| Tezlik | Natija |
|---|---|
| Juda kichik | Juda sekin yaqinlashadi |
| To'g'ri | Silliq va tez yaqinlashadi |
| Juda katta | Sakraydi, minimumni o'tkazib yuboradi |
| Haddan tashqari | Xato cheksizlikka ketadi (NaN) |
MSE o'rniga nan ko'rsangiz - tezlikni kamaytiring.
Qoldiqlarni tahlil qilish #
Model to'g'ri ishlayotganini tekshirishning eng yaxshi usuli:
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()
Koeffitsiyentlarni talqin qilish #
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}")
maydon : 8.01
xonalar : 24.63
yosh : -3.94
kesishma : 100.85
- 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.
maydon: 8.01 xonalar: 24.63
"Xonalar muhimroq" deb xulosa qilish noto'g'ri - ular turli birliklarda o'lchanadi.
Muhimlikni solishtirish uchun avval masshtablang:
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 #
# 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}")
Faqat maydon: R2 = 0.891
Uchta belgi: R2 = 0.978
Chiziqli regressiyaning shartlari #
| Shart | Buzilsa nima bo'ladi |
|---|---|
| Bog'liqlik chiziqli | Model naqshni topa olmaydi |
| Belgilar bir-biriga bog'liq emas | Koeffitsiyentlar beqaror bo'ladi |
| Xatolar bir xil tarqalgan | Bashorat ishonchsiz |
| Chetdagi qiymatlar kam | Chiziq buzilib ketadi |
Chiziqli bo'lmagan bog'liqlik uchun keyingi bo'limda polinomial regressiya ni ko'ramiz.
# Multikollinearlikni tekshirish
print(X.corr().round(2))
Agar ikki belgi orasida korrelyatsiya 0.9 dan yuqori bo'lsa -
bittasini olib tashlang.
To'liq misol #
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}")
O'qitish R2: 0.979
Sinov R2: 0.976
Sinov RMSE: 41.2
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.
- Sun'iy ma'lumot yarating:
y = 3x + 5 + shovqin. LinearRegressionbilan modelni o'qiting.- Topilgan
coef_vaintercept_haqiqiy qiymatlarga yaqinmi? - Shovqin darajasini oshiring va R² qanday o'zgarishini kuzating.
- MSE, RMSE, MAE va R² ni hisoblang.
- Qoldiqlar grafigini chizing - naqsh bormi?
- Gradient tushish funksiyasini o'zingiz yozing.
- O'qitish tezligini
0.01qiling - nima bo'ladi? - Uch belgili model quring va koeffitsiyentlarni talqin qiling.
- 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.
- R² 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.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
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.