Asosiy qismga o'tish

ML nima va qachon kerak

2-bob 15 kod bloki 2578 so'z

Bu bobdagi kod shu fayllar bilan ishlaydio'z kompyuteringizda ishga tushiring

Sahna: qoida o'sib ketdi

Siz ijara agentligida dasturchisiz. Direktor so'radi: "Qaysi kvartira tez ijaraga ketishini oldindan ayta olasanmi?"

Siz o'ylaysiz. Oson — qoida yozaman.

python2 qator
if narx < 500:
    return "tez ketadi"

Ishladi, lekin yaxshi emas. Mebelni ham qo'shasiz:

python2 qator
if narx < 500 and mebel:
    return "tez ketadi"

Keyin tumanni. Keyin metroga masofani. Keyin qavatni. Ikki haftadan keyin kodingiz uzun if zanjiriga aylanadi, hech kim uni tushunmaydi, va yangi tuman qo'shilsa hammasini qaytadan yozish kerak.

Mana shu nuqtada ML kerak bo'ladi.

An'anaviy dasturlash va ML — farqi bitta narsada

python5 qator
import pandas as pd
show(pd.DataFrame([
    {"": "An'anaviy dasturlash", "Siz berasiz": "Ma'lumot + QOIDA", "Kompyuter beradi": "Javob"},
    {"": "Machine Learning", "Siz berasiz": "Ma'lumot + JAVOB", "Kompyuter beradi": "QOIDA"},
]))
Siz berasizKompyuter beradi
An'anaviy dasturlashMa'lumot + QOIDAJavob
Machine LearningMa'lumot + JAVOBQOIDA

Shu ikki qatorda butun ML bor.

An'anaviy dasturlashda qoidani siz yozasiz. ML da siz kompyuterga minglab misol berasiz ("bu kvartira tez ketdi, bu ketmadi") va u qoidani o'zi topadi.

python18 qator
diagramma(
    {
        "Ma'lumot\n(kvartira xususiyatlari)": (0, 0, 3.2, 1.1, "manba"),
        "QOIDA\n(siz yozasiz: if/else)": (0, 1.6, 3.2, 1.1, "qayta"),
        "Javob\n(tez ketadi / ketmaydi)": (0, 3.2, 3.2, 1.1, "saqlash"),
        "Ma'lumot\n(kvartira xususiyatlari) ": (5.2, 0, 3.2, 1.1, "manba"),
        "Javob\n(tarixdan: ketdi / ketmadi)": (5.2, 1.6, 3.2, 1.1, "manba"),
        "QOIDA\n(model o'zi topadi)": (5.2, 3.2, 3.2, 1.1, "xizmat"),
    },
    [
        ("Ma'lumot\n(kvartira xususiyatlari)", "QOIDA\n(siz yozasiz: if/else)"),
        ("QOIDA\n(siz yozasiz: if/else)", "Javob\n(tez ketadi / ketmaydi)"),
        ("Ma'lumot\n(kvartira xususiyatlari) ", "QOIDA\n(model o'zi topadi)"),
        ("Javob\n(tarixdan: ketdi / ketmadi)", "QOIDA\n(model o'zi topadi)"),
    ],
    nom="an_vs_ml.png",
    izoh="Chapda: an'anaviy dasturlash. O'ngda: machine learning. Qoida va javobning o'rni almashgan.",
)

Chapda: an'anaviy dasturlash. O'ngda: machine learning. Qoida va javobning o'rni almashgan.

Chapda: an'anaviy dasturlash. O'ngda: machine learning. Qoida va javobning o'rni almashgan.

Har bir algoritm ortidagi yagona g'oya

Butun kitobda o'nlab algoritm ko'rasiz. Ularning hammasi bitta narsani qiladi:

Y = f(X)

  • X — bilganingiz (xonalar soni, maydon, tuman, metroga masofa)
  • Y — bilmoqchi bo'lganingiz (tez ketadimi)
  • f — ularni bog'laydigan qoida

Linear regression, decision tree, neyron tarmoq — ular faqat f ni qanday shaklda izlashi bilan farq qiladi. Vazifa bir xil.

python8 qator
df = pd.read_csv(DATA / "uy_ijara.csv")
X_misol = df[["xonalar", "maydon_m2", "metro_km", "mebel"]].head(5)
y_misol = df["ijaraga_berildi_30k"].head(5)
print("X — model KO'RADIGAN narsa:")
print(X_misol.to_string(index=False))
print()
print("y — model TOPISHI kerak bo'lgan javob:")
print(y_misol.to_string(index=False))
Chiqish
X — model KO'RADIGAN narsa:
 xonalar  maydon_m2  metro_km  mebel
       2       40.6      1.43      1
       2       55.5      4.18      1
       5      114.0      3.84      1
       3       72.1      2.99      1
       2       46.4      4.58      0

y — model TOPISHI kerak bo'lgan javob:
0
0
0
0
1

Qachon ML kerak — va qachon kerak EMAS

Bu — eng ko'p o'tkazib yuboriladigan savol. Ko'p loyiha shu yerda o'ladi.

python14 qator
show(pd.DataFrame([
    {"Holat": "Qoida oddiy va o'zgarmaydi", "ML kerakmi": "YO'Q",
     "Nega": "`if yosh < 18` — buni model bilan qilish ahmoqlik"},
    {"Holat": "Qoida bor, lekin juda murakkab", "ML kerakmi": "HA",
     "Nega": "Yuzni tanish, matnni tushunish — qo'lda yozilmaydi"},
    {"Holat": "Qoida vaqt o'tib o'zgaradi", "ML kerakmi": "HA",
     "Nega": "Bozor narxi, moda, foydalanuvchi xatti-harakati"},
    {"Holat": "Ma'lumot YO'Q yoki juda kam", "ML kerakmi": "YO'Q",
     "Nega": "100 qator bilan model qurilmaydi — avval ma'lumot yig'ing"},
    {"Holat": "Xato juda qimmat, 100% aniqlik kerak", "ML kerakmi": "EHTIYOT",
     "Nega": "ML hech qachon 100% bermaydi. Odam nazorati kerak"},
    {"Holat": "Nega shunday javob berdi — tushuntirish shart", "ML kerakmi": "EHTIYOT",
     "Nega": "Bank krediti, tibbiyot. Oddiy model tanlang (25-bob SHAP)"},
]))
HolatML kerakmiNega
Qoida oddiy va o'zgarmaydiYO'Q`if yosh < 18` — buni model bilan qilish ahmoqlik
Qoida bor, lekin juda murakkabHAYuzni tanish, matnni tushunish — qo'lda yozilmaydi
Qoida vaqt o'tib o'zgaradiHABozor narxi, moda, foydalanuvchi xatti-harakati
Ma'lumot YO'Q yoki juda kamYO'Q100 qator bilan model qurilmaydi — avval ma'lumot yig'ing
Xato juda qimmat, 100% aniqlik kerakEHTIYOTML hech qachon 100% bermaydi. Odam nazorati kerak
Nega shunday javob berdi — tushuntirish shartEHTIYOTBank krediti, tibbiyot. Oddiy model tanlang (25-bob SHAP)

Birinchi savol "qaysi algoritm" emas

Yangi loyihada birinchi savol: "buni oddiy qoida bilan hal qilsa bo'ladimi?"

Agar ha — qoida yozing. U tezroq, arzonroq, tushunarli va buzilmaydi.

6-bobda biz aynan shuni o'lchaymiz: oddiy qoida ML dan qanchalik orqada.

ML turlari

python8 qator
show(pd.DataFrame([
    {"Turi": "Supervised (nazorat ostida)", "Ma'lumot": "X va y — javoblar BOR",
     "Misol": "Kvartira tez ketadimi; narx qancha", "Kitobda": "4-21-bob"},
    {"Turi": "Unsupervised (nazoratsiz)", "Ma'lumot": "Faqat X — javob YO'Q",
     "Misol": "Mijozlarni guruhlarga bo'lish", "Kitobda": "26-28-bob"},
    {"Turi": "Reinforcement (mustahkamlash)", "Ma'lumot": "Harakat va mukofot",
     "Misol": "O'yin, robot boshqaruvi", "Kitobda": "yo'q (alohida soha)"},
]))
TuriMa'lumotMisolKitobda
Supervised (nazorat ostida)X va y — javoblar BORKvartira tez ketadimi; narx qancha4-21-bob
Unsupervised (nazoratsiz)Faqat X — javob YO'QMijozlarni guruhlarga bo'lish26-28-bob
Reinforcement (mustahkamlash)Harakat va mukofotO'yin, robot boshqaruviyo'q (alohida soha)

Bu kitobning asosiy qismi — supervised. Chunki amaliyotdagi ishlarning ko'pi shunday.

Classification va regression

Supervised ikkiga bo'linadi. Farq faqat y ning turida.

python7 qator
print("Bizning faylda IKKITA target bor — ikki xil vazifa:")
print()
print(f"ijaraga_berildi_30k : {sorted(df.ijaraga_berildi_30k.unique().tolist())}  -> {df.ijaraga_berildi_30k.nunique()} xil qiymat")
print("  => CLASSIFICATION (yorliq bashorat qilish)")
print()
print(f"narx_usd            : {df.narx_usd.min()} .. {df.narx_usd.max()}  -> {df.narx_usd.nunique()} xil qiymat")
print("  => REGRESSION (son bashorat qilish)")
Chiqish
Bizning faylda IKKITA target bor — ikki xil vazifa:

ijaraga_berildi_30k : [0, 1]  -> 2 xil qiymat
  => CLASSIFICATION (yorliq bashorat qilish)

narx_usd            : 225 .. 1515  -> 207 xil qiymat
  => REGRESSION (son bashorat qilish)
python6 qator
show(pd.DataFrame([
    {"": "Classification", "y nima": "Yorliq (toifa)", "Misol": "spam/spam emas, 3 tur gul",
     "Metrika": "accuracy, F1, recall", "Kitobda": "7-9-bob"},
    {"": "Regression", "y nima": "Uzluksiz son", "Misol": "narx, harorat, vaqt",
     "Metrika": "RMSE, MAE, R2", "Kitobda": "14-bob"},
]))
y nimaMisolMetrikaKitobda
ClassificationYorliq (toifa)spam/spam emas, 3 tur gulaccuracy, F1, recall7-9-bob
RegressionUzluksiz sonnarx, harorat, vaqtRMSE, MAE, R214-bob

"Yulduzlar soni 1-5" — bu classification mi, regression mi?

Ikkisi ham bo'lishi mumkin, va bu sizning qaroringiz.

Classification deb olsangiz: model 3 va 4 ni "ikki xil toifa" deb ko'radi, ularning yaqinligini bilmaydi. Regression deb olsangiz: model 3.7 chiqarishi mumkin, va 1 bilan 5 orasidagi masofani tushunadi.

Amalda reyting uchun ko'pincha regression yaxshiroq ishlaydi. Lekin sinab ko'rish kerak — taxmin qilmang, o'lchang.

ML ishining uchta buyrug'i

sklearn dagi hamma model bir xil uch buyruqni tushunadi. Algoritmni almashtirsangiz ham, bu uchta o'zgarmaydi.

python16 qator
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier

son = ["xonalar", "maydon_m2", "metro_km", "mebel"]
X, y = df[son], df["ijaraga_berildi_30k"]
X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.3, random_state=42, stratify=y)

model = DecisionTreeClassifier(max_depth=4, random_state=42)

model.fit(X_tr, y_tr)                       # 1. O'RGAN
bashorat = model.predict(X_te)              # 2. BASHORAT QIL
ball = model.score(X_te, y_te)              # 3. BAHOLA

print(f"fit()     -> model o'rgandi, {len(X_tr)} qatordan")
print(f"predict() -> {len(bashorat)} ta bashorat, masalan: {bashorat[:8].tolist()}")
print(f"score()   -> {ball:.4f}")
Chiqish
fit()     -> model o'rgandi, 840 qatordan
predict() -> 360 ta bashorat, masalan: [0, 1, 0, 0, 1, 1, 1, 1]
score()   -> 0.7417

Modelni almashtiramiz — faqat bitta qator o'zgaradi:

python10 qator
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.neighbors import KNeighborsClassifier

for nom, m in [("DecisionTree", DecisionTreeClassifier(max_depth=4, random_state=42)),
               ("LogisticRegression", LogisticRegression(max_iter=2000)),
               ("RandomForest", RandomForestClassifier(n_estimators=100, random_state=42)),
               ("KNN", KNeighborsClassifier())]:
    m.fit(X_tr, y_tr)
    print(f"  {nom:20s} score = {m.score(X_te, y_te):.4f}")
Chiqish
  DecisionTree         score = 0.7417
  LogisticRegression   score = 0.7639
  RandomForest         score = 0.6806
  KNN                  score = 0.6917

Bu kitobni o'qishning kaliti

fit / predict / score — bu uchta so'z 20 ta algoritm uchun bir xil. Shuning uchun yangi algoritmni o'rganish oson: siz faqat u qanday ishlaydi va qachon mos keladi degan savolga javob izlaysiz. Kod naqshi o'zgarmaydi.

Overfitting: yodlash va tushunish

Yuqoridagi jadvalda DecisionTree da max_depth=4 yozilgan. Nega chegara qo'ydim? Chegarani olib tashlasam nima bo'ladi?

python7 qator
print(f"{'max_depth':>10} {'train ball':>12} {'test ball':>11} {'farq':>8}")
print("-" * 44)
for d in [2, 4, 8, 15, None]:
    m = DecisionTreeClassifier(max_depth=d, random_state=42).fit(X_tr, y_tr)
    tr_b, te_b = m.score(X_tr, y_tr), m.score(X_te, y_te)
    belgi = "   <-- YODLADI" if tr_b - te_b > 0.15 else ""
    print(f"{str(d):>10} {tr_b:>12.4f} {te_b:>11.4f} {tr_b-te_b:>8.4f}{belgi}")
Chiqish
 max_depth   train ball   test ball     farq
--------------------------------------------
         2       0.6952      0.7611  -0.0659
         4       0.7048      0.7417  -0.0369
         8       0.7869      0.7139   0.0730
        15       0.9143      0.6778   0.2365   <-- YODLADI
      None       1.0000      0.6583   0.3417   <-- YODLADI

Chegara olib tashlanganda daraxt train da deyarli mukammal bo'ladi — va test da yomonlashadi.

Bu overfitting: model qoidani o'rganmagan, u javoblarni yodlagan.

python8 qator
show(pd.DataFrame([
    {"Holat": "Underfitting", "Train ball": "PAST", "Test ball": "PAST",
     "Sabab": "Model juda oddiy", "Yechim": "Kuchliroq model, ko'proq xususiyat"},
    {"Holat": "Yaxshi", "Train ball": "Yaxshi", "Test ball": "Yaxshi, yaqin",
     "Sabab": "Muvozanat topilgan", "Yechim": "Shu yerda to'xtaysiz"},
    {"Holat": "Overfitting", "Train ball": "JUDA BALAND", "Test ball": "PAST",
     "Sabab": "Model yodlagan", "Yechim": "Soddalashtirish, regularizatsiya, ko'proq ma'lumot"},
]))
HolatTrain ballTest ballSababYechim
UnderfittingPASTPASTModel juda oddiyKuchliroq model, ko'proq xususiyat
YaxshiYaxshiYaxshi, yaqinMuvozanat topilganShu yerda to'xtaysiz
OverfittingJUDA BALANDPASTModel yodlaganSoddalashtirish, regularizatsiya, ko'proq ma'lumot

Bu — bias-variance tradeoff, va u 11-13-boblarda matematik tomondan ochiladi. Hozir bitta narsani eslab qolsangiz yetarli: train balli test ballidan ancha baland bo'lsa — ishonmang.

Imtihonga o'xshatma

Talaba imtihonga tayyorlanadi. Ikki yo'l bor:

  1. Mavzuni tushunadi -> yangi savolga ham javob beradi
  2. Javoblarni yodlaydi -> aynan o'sha savollarga javob beradi, boshqasiga yo'q

Ikkinchi talaba uyda ishlagan masalalarda 100% oladi (train ball baland), imtihonda yiqiladi (test ball past).

Model ham xuddi shunday. Shuning uchun biz uni ko'rmagan ma'lumotda sinaymiz (5-bob).

Asosiy atamalar

python10 qator
show(pd.DataFrame([
    {"Atama": "Feature (xususiyat)", "Ma'nosi": "Kirish ustuni — X", "Bizda": "xonalar, maydon_m2, tuman"},
    {"Atama": "Target (nishon)", "Ma'nosi": "Bashorat qilinadigan ustun — y", "Bizda": "ijaraga_berildi_30k"},
    {"Atama": "Namuna (sample)", "Ma'nosi": "Bitta qator", "Bizda": "Bitta e'lon"},
    {"Atama": "Label (yorliq)", "Ma'nosi": "Classification dagi target qiymati", "Bizda": "0 yoki 1"},
    {"Atama": "Train", "Ma'nosi": "Model o'rganadigan qism", "Bizda": "840 qator"},
    {"Atama": "Test", "Ma'nosi": "Model ko'rmagan qism", "Bizda": "360 qator"},
    {"Atama": "Hyperparameter", "Ma'nosi": "SIZ qo'yadigan sozlama", "Bizda": "max_depth=4"},
    {"Atama": "Parametr (weight)", "Ma'nosi": "Model O'ZI o'rganadigan son", "Bizda": "koeffitsiyentlar"},
]))
AtamaMa'nosiBizda
Feature (xususiyat)Kirish ustuni — Xxonalar, maydon_m2, tuman
Target (nishon)Bashorat qilinadigan ustun — yijaraga_berildi_30k
Namuna (sample)Bitta qatorBitta e'lon
Label (yorliq)Classification dagi target qiymati0 yoki 1
TrainModel o'rganadigan qism840 qator
TestModel ko'rmagan qism360 qator
HyperparameterSIZ qo'yadigan sozlamamax_depth=4
Parametr (weight)Model O'ZI o'rganadigan sonkoeffitsiyentlar

Hyperparameter va parametr — chalkashtirmang

Parametr — modelning o'zi fit() paytida topadigan son (chiziq koeffitsiyenti, daraxt bo'linish chegarasi).

Hyperparameter — siz fit() dan OLDIN qo'yadigan sozlama (max_depth, n_estimators, C).

Intervyuda eng ko'p so'raladigan juftliklardan biri. 23-bob hyperparameter larni tanlashga bag'ishlangan.

Bugun nima o'rgandik

python8 qator
show(pd.DataFrame([
    {"Tushuncha": "ML ning mohiyati", "Bitta jumla": "Qoidani siz yozmaysiz, model ma'lumotdan topadi"},
    {"Tushuncha": "Y = f(X)", "Bitta jumla": "Hamma algoritm shuni qiladi, faqat f ni boshqacha izlaydi"},
    {"Tushuncha": "Qachon ML kerak emas", "Bitta jumla": "Qoida oddiy bo'lsa yoki ma'lumot kam bo'lsa"},
    {"Tushuncha": "Classification / regression", "Bitta jumla": "Farq faqat y ning turida — yorliq yoki son"},
    {"Tushuncha": "fit / predict / score", "Bitta jumla": "20 ta algoritm uchun bir xil uch buyruq"},
    {"Tushuncha": "Overfitting", "Bitta jumla": "Train baland, test past — model yodlagan"},
]))
TushunchaBitta jumla
ML ning mohiyatiQoidani siz yozmaysiz, model ma'lumotdan topadi
Y = f(X)Hamma algoritm shuni qiladi, faqat f ni boshqacha izlaydi
Qachon ML kerak emasQoida oddiy bo'lsa yoki ma'lumot kam bo'lsa
Classification / regressionFarq faqat y ning turida — yorliq yoki son
fit / predict / score20 ta algoritm uchun bir xil uch buyruq
OverfittingTrain baland, test past — model yodlagan

Keyingi bobda: ma'lumot ko'pincha CSV da emas, ma'lumotlar bazasida bo'ladi. Uni qanday olamiz?

Bu bobni bepul o'qidingiz.

Kitob o'rgatadi, lekin sizning kodingiz nega ishlamaganini ayta olmaydi. Kursda uy vazifangiz tekshiriladi.

Telegramda yozish Narxlar