6-bo‘lim

Ma'lumotni tayyorlash

Bo'sh qiymatlar, chetdagi qiymatlar, toifali belgilarni kodlash, masshtablash va o'qitish/sinov ga bo'lish.

🕑 18 daqiqa o‘qish 📄 1 185 so‘z 👁 5 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Nima uchun bu eng muhim bosqich?
  2. Namuna ma'lumot
  3. 1. Muammolarni aniqlash
  4. 2. Bo'sh qiymatlar
  5. Strategiyalar
  6. 3. Chetdagi qiymatlar
  7. Nima qilish kerak?
  8. 4. Toifali belgilarni kodlash
  9. One-hot kodlash
  10. Tartibli kodlash
  11. Ko'p toifali ustunlar
  12. 5. Masshtablash
  13. 6. O'qitish va sinov to'plamlariga bo'lish
  14. Sizib chiqish muammosi
  15. Stratifikatsiya
  16. 7. Pipeline - hammasini birlashtirish
  17. Yangi belgilar yaratish
  18. Tayyorlash tekshiruv ro'yxati
  19. Xulosa

Bu bo'lim - butun darslikning eng muhim qismi. Model sifati ko'p jihatdan shu bosqichga bog'liq.

Nima uchun bu eng muhim bosqich? #

Amaliy nisbat
BosqichVaqt ulushi
Ma'lumot yig'ish20%
Tozalash va tayyorlash50%
Model tanlash va o'qitish15%
Baholash va sozlash10%
Deploy5%

Yaxshi tayyorlangan ma'lumot bilan oddiy model, yomon ma'lumot bilan murakkab modeldan ancha yaxshi ishlaydi.

Namuna ma'lumot #

Python
import pandas as pd
import numpy as np

np.random.seed(42)

uylar = pd.DataFrame({
    "maydon":   [65, 90, np.nan, 45, 78, 110, 55, 5000, 82, 95],
    "xonalar":  [2, 3, 4, 1, 3, 4, 2, 3, 3, 3],
    "tuman":    ["Chilonzor", "Sergeli", "Chilonzor", None, "Yunusobod",
                 "Sergeli", "Chilonzor", "Yunusobod", "Sergeli", "Chilonzor"],
    "holati":   ["yangi", "o'rta", "eski", "o'rta", "yangi",
                 "yangi", "eski", "o'rta", "yangi", "o'rta"],
    "yosh":     [12, 5, 30, 25, 3, 1, 40, 8, 4, 15],
    "narx":     [620, 780, 950, 380, 810, 1200, 470, 850, 820, 760],
})

1. Muammolarni aniqlash #

Python
print(uylar.isna().sum())
print(uylar.describe())
Natija
maydon     1
xonalar    0
tuman      1
holati     0
yosh       0
narx       0

            maydon    xonalar       yosh         narx
count     9.000000  10.000000  10.000000    10.000000
mean    624.444444   2.800000  14.300000   764.000000
max    5000.000000   4.000000  40.000000  1200.000000
maydon ning o'rtachasi 624 m2?

Bu aniq xato. max qiymati 5000 - bu kvartira emas.

Sabab bo'lishi mumkin:

  • Kiritishda xato (500 o'rniga 5000)
  • O'lchov birligi boshqa (kv. fut yoki sotix)
  • Sinov ma'lumoti tozalanmagan

Har doim describe() da min va max ni tekshiring.

2. Bo'sh qiymatlar #

Python
# Ustunlar bo'yicha foiz
bosh_foiz = (uylar.isna().sum() / len(uylar) * 100).round(1)
print(bosh_foiz[bosh_foiz > 0])

Strategiyalar #

StrategiyaQachonKod
Qatorni o'chirishBo'shlar 5% dan kamdropna()
Ustunni o'chirishUstunning 50%+ bo'shdrop(columns=...)
O'rtacha bilanSonli, simmetrikfillna(mean())
Mediana bilanSonli, chetdagi qiymatlar borfillna(median())
Moda bilanToifalifillna(mode()[0])
Doimiy qiymatBo'shlik ma'nolifillna("nomalum")
Model bilanMuhim belgi, ko'p bo'shliqKNNImputer
Python
from sklearn.impute import SimpleImputer

# Sonli ustunlar - mediana bilan
sonli_toldiruvchi = SimpleImputer(strategy="median")
uylar[["maydon"]] = sonli_toldiruvchi.fit_transform(uylar[["maydon"]])

# Toifali ustunlar - eng ko'p uchraydigan bilan
toifali_toldiruvchi = SimpleImputer(strategy="most_frequent")
uylar[["tuman"]] = toifali_toldiruvchi.fit_transform(uylar[["tuman"]])

print(uylar.isna().sum().sum())
Natija
0
Mediana o'rtachadan ishonchliroq
Python
qiymatlar = [60, 65, 70, 75, 5000]

print(np.mean(qiymatlar))     # 1054.0 - buzilgan
print(np.median(qiymatlar))   # 70.0  - ishonchli

Bitta chetdagi qiymat o'rtachani butunlay buzadi, medianaga esa deyarli ta'sir qilmaydi.

"Bo'sh" belgisi ham ma'lumot

Ba'zan bo'shlikning o'zi foydali signal bo'ladi:

  • "Daromad" ustuni bo'sh → foydalanuvchi ko'rsatishni istamagan
  • "Oxirgi xarid sanasi" bo'sh → hech qachon xarid qilmagan

Bunday holatda yangi ustun qo'shing:

Python
uylar["maydon_bosh_edi"] = uylar["maydon"].isna().astype(int)

3. Chetdagi qiymatlar #

IQR usuli bilan chetdagi qiymatlarni topish Q1 Mediana Q3 IQR = Q3 - Q1 Q1 - 1.5×IQR Q3 + 1.5×IQR chetda chetda Chegaradan tashqaridagi qiymatlar tekshirishga muhtoj
1.5 koeffitsienti - kelishuv, uni o'zgartirish mumkin
Python
def chetdagilarni_top(malumot, ustun, koeffitsiyent=1.5):
    q1 = malumot[ustun].quantile(0.25)
    q3 = malumot[ustun].quantile(0.75)
    iqr = q3 - q1

    quyi = q1 - koeffitsiyent * iqr
    yuqori = q3 + koeffitsiyent * iqr

    return malumot[(malumot[ustun] < quyi) | (malumot[ustun] > yuqori)]


chetdagilar = chetdagilarni_top(uylar, "maydon")
print(chetdagilar[["maydon", "narx"]])
Natija
   maydon  narx
7  5000.0   850

Nima qilish kerak? #

QarorQachon
TuzatishAniq kiritish xatosi (5000 → 500)
O'chirishXato ekani aniq, kam sonli
QoldirishHaqiqiy va muhim (masalan, firibgarlik aniqlashda)
ChegaralashTa'sirini kamaytirish kerak
Python
# Chegaralash (winsorization)
quyi = uylar["maydon"].quantile(0.01)
yuqori = uylar["maydon"].quantile(0.99)
uylar["maydon"] = uylar["maydon"].clip(quyi, yuqori)

# O'chirish
uylar = uylar[uylar["maydon"] < 500]
Chetdagi qiymatni o'ylamasdan o'chirmang

Firibgarlikni aniqlash tizimida aynan chetdagi qiymatlar eng muhim ma'lumot hisoblanadi. Ularni o'chirsangiz, model hech qachon firibgarlikni topa olmaydi.

Har doim so'rang: "bu xatomi yoki haqiqiy hodisami?"

4. Toifali belgilarni kodlash #

Modellar faqat raqamlar bilan ishlaydi.

One-hot kodlash #

Tartibsiz toifalar uchun.

Python
kodlangan = pd.get_dummies(uylar, columns=["tuman"], drop_first=True, dtype=int)
print(kodlangan.filter(like="tuman").head())
Natija
   tuman_Sergeli  tuman_Yunusobod
0              0                0
1              1                0
2              0                0
3              0                1
drop_first=True nima uchun?

Uch tuman uchun ikkita ustun yetarli: ikkalasi ham 0 bo'lsa, demak uchinchi tuman.

Bu "dummy tuzoq" (multikollinearlik) muammosini oldini oladi. Chiziqli modellarda muhim, daraxtlarda esa farq qilmaydi.

Tartibli kodlash #

Toifalar orasida tabiiy tartib bo'lganda.

Python
tartib = {"eski": 0, "o'rta": 1, "yangi": 2}
uylar["holati_kod"] = uylar["holati"].map(tartib)

print(uylar[["holati", "holati_kod"]].head())
Natija
  holati  holati_kod
0  yangi           2
1  o'rta           1
2   eski           0
Tartibsiz toifaga raqam bermang
Python
# XATO
uylar["tuman_kod"] = uylar["tuman"].map({
    "Chilonzor": 1, "Sergeli": 2, "Yunusobod": 3
})

Model buni "Yunusobod > Sergeli > Chilonzor" deb tushunadi va "Chilonzor + Yunusobod = 2 × Sergeli" degan ma'nosiz xulosa chiqaradi.

Tartibsiz toifalar uchun faqat one-hot.

Ko'p toifali ustunlar #

Python
# 500 ta noyob shahar bo'lsa - one-hot 500 ta ustun yaratadi
print(uylar["shahar"].nunique())

# Yechim 1: eng ko'p uchraydiganlarni qoldirish
eng_kop = uylar["shahar"].value_counts().nlargest(10).index
uylar["shahar"] = uylar["shahar"].where(
    uylar["shahar"].isin(eng_kop), "boshqa"
)

# Yechim 2: nishon bo'yicha kodlash
ortacha_narx = uylar.groupby("shahar")["narx"].mean()
uylar["shahar_kod"] = uylar["shahar"].map(ortacha_narx)
Nishon bo'yicha kodlash - ehtiyot bo'ling

shahar_kod nishondan hisoblanadi. Agar buni butun ma'lumotda qilsangiz - ma'lumot sizib chiqadi (data leakage) va model sinovda haqiqatdan yaxshiroq ko'rinadi.

Uni faqat o'qitish to'plamida hisoblang.

5. Masshtablash #

Nima uchun masshtablash kerak? Masshtablashsiz maydon: 45 ... 120 narx: 380 ... 1200 xonalar: 1 ... 4 Masofa hisoblashda narx hukmron xonalar deyarli e'tiborga olinmaydi Masshtablangan maydon: -1.2 ... 1.8 narx: -1.5 ... 1.9 xonalar: -1.4 ... 1.3 Barcha belgilar teng ta'sir qiladi Model to'g'ri o'rganadi KNN, SVM, neyron tarmoq va PCA uchun masshtablash majburiy
Daraxtlarga asoslangan modellarga masshtablash kerak emas
Python
from sklearn.preprocessing import StandardScaler, MinMaxScaler, RobustScaler

# Standartlashtirish: o'rtacha 0, standart og'ish 1
standart = StandardScaler()
X_standart = standart.fit_transform(X)

# Min-max: [0, 1] oralig'iga
minmax = MinMaxScaler()
X_minmax = minmax.fit_transform(X)

# Robust: mediana va IQR asosida - chetdagi qiymatlarga chidamli
robust = RobustScaler()
X_robust = robust.fit_transform(X)
UsulFormulaQachon
StandardScaler(x - o'rtacha) / og'ishOdatiy holat
MinMaxScaler(x - min) / (max - min)Chegara kerak bo'lsa
RobustScaler(x - mediana) / IQRChetdagi qiymatlar ko'p
Qaysi modellar uchun kerak?
KerakKerak emas
KNNQaror daraxti
SVMRandom Forest
Neyron tarmoqGradient Boosting
Chiziqli regressiya (regularizatsiya bilan)Naive Bayes
PCA, K-means

Sabab: birinchi guruh masofa yoki koeffitsiyent bilan ishlaydi, ikkinchisi esa faqat "kattami-kichikmi" deb solishtiradi.

6. O'qitish va sinov to'plamlariga bo'lish #

Bu eng muhim qadam.

Python
from sklearn.model_selection import train_test_split

X = kodlangan.drop(columns=["narx"])
y = kodlangan["narx"]

X_oqitish, X_sinov, y_oqitish, y_sinov = train_test_split(
    X, y,
    test_size=0.2,        # 20% sinov uchun
    random_state=42,      # takrorlanuvchanlik
)

print(f"O'qitish: {X_oqitish.shape[0]} namuna")
print(f"Sinov:    {X_sinov.shape[0]} namuna")
Sinov to'plamiga "qaramang"

Sinov to'plami - imtihon. Modelni unda o'qitish yoki uni ko'rib qaror qabul qilish - imtihondan oldin javoblarni ko'rish bilan barobar.

Natijada model qog'ozda ajoyib, amalda esa yomon ishlaydi.

Sizib chiqish muammosi #

Python
# XATO: butun ma'lumotda masshtablash
X_masshtab = standart.fit_transform(X)
X_oqitish, X_sinov = train_test_split(X_masshtab, ...)

Bu yerda StandardScaler sinov to'plamining o'rtachasini ham ko'rgan - ma'lumot sizib chiqdi.

Python
# TO'G'RI: avval bo'lish, keyin masshtablash
X_oqitish, X_sinov, y_oqitish, y_sinov = train_test_split(X, y, test_size=0.2)

standart = StandardScaler()
X_oqitish = standart.fit_transform(X_oqitish)   # fit + transform
X_sinov   = standart.transform(X_sinov)         # faqat transform
fit_transform va transform O'qitish to'plami fit_transform(X_oqitish) 1. O'rtacha va og'ishni hisoblab yodda saqlaydi 2. Ma'lumotni o'zgartiradi Sinov to'plami transform(X_sinov) Yodda saqlangan o'rtacha va og'ish bilan faqat o'zgartiradi parametrlar Sinov to'plamida fit qilish - ma'lumot sizib chiqishi (data leakage)
Bu qoida barcha tayyorlash bosqichlariga tegishli

Stratifikatsiya #

Klassifikatsiyada toifalar nisbatini saqlash:

Python
X_oqitish, X_sinov, y_oqitish, y_sinov = train_test_split(
    X, y, test_size=0.2, random_state=42,
    stratify=y,        # toifalar nisbati ikkalasida bir xil bo'ladi
)
Nomutanosib ma'lumotda majburiy

Agar 1000 namunadan faqat 30 tasi "firibgarlik" bo'lsa, stratify siz sinov to'plamiga tasodifan bitta ham firibgarlik tushmasligi mumkin.

7. Pipeline - hammasini birlashtirish #

Python
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.impute import SimpleImputer

sonli_ustunlar  = ["maydon", "xonalar", "yosh"]
toifali_ustunlar = ["tuman", "holati"]

sonli_quvur = Pipeline([
    ("toldirish", SimpleImputer(strategy="median")),
    ("masshtab", StandardScaler()),
])

toifali_quvur = Pipeline([
    ("toldirish", SimpleImputer(strategy="most_frequent")),
    ("kodlash", OneHotEncoder(handle_unknown="ignore", drop="first")),
])

tayyorlovchi = ColumnTransformer([
    ("sonli", sonli_quvur, sonli_ustunlar),
    ("toifali", toifali_quvur, toifali_ustunlar),
])

X_oqitish_tayyor = tayyorlovchi.fit_transform(X_oqitish)
X_sinov_tayyor   = tayyorlovchi.transform(X_sinov)
Pipeline nima uchun eng yaxshi yechim?
  1. Sizib chiqishdan himoya - fit faqat o'qitish to'plamida bajariladi
  2. Takrorlanuvchanlik - barcha qadamlar bir joyda yozilgan
  3. Deploy uchun qulay - butun quvurni bitta fayl sifatida saqlaysiz
  4. Kross-validatsiya bilan to'g'ri ishlaydi - har bir bo'linishda qaytadan fit qilinadi

17-bo'limda buni chuqurroq ko'ramiz.

Yangi belgilar yaratish #

Ba'zan mavjud belgilardan foydaliroq yangisini yasash mumkin:

Python
uylar["narx_m2"]      = uylar["narx"] / uylar["maydon"]
uylar["xona_maydoni"] = uylar["maydon"] / uylar["xonalar"]
uylar["yangi_uy"]     = (uylar["yosh"] < 5).astype(int)

# Sana ustunidan
uylar["oy"]       = uylar["sana"].dt.month
uylar["hafta_kun"] = uylar["sana"].dt.dayofweek
uylar["dam_olish"] = (uylar["hafta_kun"] >= 5).astype(int)
Belgi muhandisligi

Bu soha "feature engineering" deb ataladi va ko'pincha model tanlashdan ko'proq foyda beradi.

Yaxshi belgi domen bilimidan tug'iladi: "uy narxi metroga yaqinlikka bog'liq" degan bilim metroga_masofa belgisini yaratishga olib keladi.

Tayyorlash tekshiruv ro'yxati #

Modelni o'qitishdan oldin
QadamBajarildi
info() va describe() ko'rildi
Bo'sh qiymatlar hal qilindi
Chetdagi qiymatlar tekshirildi
Takrorlanuvchi qatorlar o'chirildi
Toifali belgilar kodlandi
O'qitish/sinov ga bo'lindi
Masshtablash bo'lgandan keyin qilindi
Nishon ustuni X da qolmagani tekshirildi
Sizib chiqish yo'qligi tekshirildi
Eng ko'p uchraydigan xato
Python
X = uylar          # narx ham ichida qoldi!
y = uylar["narx"]

Model 100% aniqlik ko'rsatadi - chunki javob kirishda turibdi. Har doim tekshiring:

Python
assert "narx" not in X.columns
Amaliy topshiriq
  1. Yuqoridagi uylar jadvalini yarating.
  2. isna().sum() bilan bo'sh qiymatlarni toping.
  3. maydon ni mediana, tuman ni moda bilan to'ldiring.
  4. IQR usuli bilan chetdagi qiymatlarni toping va qaror qabul qiling.
  5. tuman ni one-hot, holati ni tartibli kodlang.
  6. narx_m2 va yangi_uy belgilarini yarating.
  7. train_test_split bilan 80/20 ga bo'ling.
  8. StandardScaler ni to'g'ri tartibda qo'llang.
  9. Xato tartibda ham qilib ko'ring va farqni tushuntiring.
  10. Butun jarayonni Pipeline va ColumnTransformer bilan qayta yozing.

Xulosa #

  • Ma'lumot tayyorlash - loyihaning eng ko'p vaqt oladigan va eng muhim bosqichi.
  • Bo'sh qiymatlar uchun har bir ustunga alohida strategiya kerak.
  • Mediana chetdagi qiymatlarga o'rtachadan chidamliroq.
  • Chetdagi qiymatni o'chirishdan oldin "xatomi yoki haqiqiy?" deb so'rang.
  • Tartibsiz toifalar uchun faqat one-hot, tartibli uchun map.
  • Masshtablash KNN, SVM, neyron tarmoq va PCA uchun majburiy.
  • Har doim avval bo'ling, keyin masshtablang.
  • fit_transform faqat o'qitishda, transform sinovda.
  • stratify=y nomutanosib toifalarda majburiy.
  • Pipeline sizib chiqishdan himoya qiladi va deploy ni osonlashtiradi.

Keyingi bo'limda birinchi haqiqiy modelni quramiz.

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.