6-bo‘lim
Ma'lumotni tayyorlash
Bo'sh qiymatlar, chetdagi qiymatlar, toifali belgilarni kodlash, masshtablash va o'qitish/sinov ga bo'lish.
Ushbu bo‘lim mundarijasi
- Nima uchun bu eng muhim bosqich?
- Namuna ma'lumot
- 1. Muammolarni aniqlash
- 2. Bo'sh qiymatlar
- Strategiyalar
- 3. Chetdagi qiymatlar
- Nima qilish kerak?
- 4. Toifali belgilarni kodlash
- One-hot kodlash
- Tartibli kodlash
- Ko'p toifali ustunlar
- 5. Masshtablash
- 6. O'qitish va sinov to'plamlariga bo'lish
- Sizib chiqish muammosi
- Stratifikatsiya
- 7. Pipeline - hammasini birlashtirish
- Yangi belgilar yaratish
- Tayyorlash tekshiruv ro'yxati
- Xulosa
Bu bo'lim - butun darslikning eng muhim qismi. Model sifati ko'p jihatdan shu bosqichga bog'liq.
Nima uchun bu eng muhim bosqich? #
| Bosqich | Vaqt ulushi |
|---|---|
| Ma'lumot yig'ish | 20% |
| Tozalash va tayyorlash | 50% |
| Model tanlash va o'qitish | 15% |
| Baholash va sozlash | 10% |
| Deploy | 5% |
Yaxshi tayyorlangan ma'lumot bilan oddiy model, yomon ma'lumot bilan murakkab modeldan ancha yaxshi ishlaydi.
Namuna ma'lumot #
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 #
print(uylar.isna().sum())
print(uylar.describe())
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 #
# Ustunlar bo'yicha foiz
bosh_foiz = (uylar.isna().sum() / len(uylar) * 100).round(1)
print(bosh_foiz[bosh_foiz > 0])
Strategiyalar #
| Strategiya | Qachon | Kod |
|---|---|---|
| Qatorni o'chirish | Bo'shlar 5% dan kam | dropna() |
| Ustunni o'chirish | Ustunning 50%+ bo'sh | drop(columns=...) |
| O'rtacha bilan | Sonli, simmetrik | fillna(mean()) |
| Mediana bilan | Sonli, chetdagi qiymatlar bor | fillna(median()) |
| Moda bilan | Toifali | fillna(mode()[0]) |
| Doimiy qiymat | Bo'shlik ma'noli | fillna("nomalum") |
| Model bilan | Muhim belgi, ko'p bo'shliq | KNNImputer |
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())
0
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.
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:
uylar["maydon_bosh_edi"] = uylar["maydon"].isna().astype(int)
3. Chetdagi qiymatlar #
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"]])
maydon narx
7 5000.0 850
Nima qilish kerak? #
| Qaror | Qachon |
|---|---|
| Tuzatish | Aniq kiritish xatosi (5000 → 500) |
| O'chirish | Xato ekani aniq, kam sonli |
| Qoldirish | Haqiqiy va muhim (masalan, firibgarlik aniqlashda) |
| Chegaralash | Ta'sirini kamaytirish kerak |
# 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]
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.
kodlangan = pd.get_dummies(uylar, columns=["tuman"], drop_first=True, dtype=int)
print(kodlangan.filter(like="tuman").head())
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.
tartib = {"eski": 0, "o'rta": 1, "yangi": 2}
uylar["holati_kod"] = uylar["holati"].map(tartib)
print(uylar[["holati", "holati_kod"]].head())
holati holati_kod
0 yangi 2
1 o'rta 1
2 eski 0
# 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 #
# 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)
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 #
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)
| Usul | Formula | Qachon |
|---|---|---|
StandardScaler | (x - o'rtacha) / og'ish | Odatiy holat |
MinMaxScaler | (x - min) / (max - min) | Chegara kerak bo'lsa |
RobustScaler | (x - mediana) / IQR | Chetdagi qiymatlar ko'p |
| Kerak | Kerak emas |
|---|---|
| KNN | Qaror daraxti |
| SVM | Random Forest |
| Neyron tarmoq | Gradient 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.
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'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 #
# 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.
# 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
Stratifikatsiya #
Klassifikatsiyada toifalar nisbatini saqlash:
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
)
Agar 1000 namunadan faqat 30 tasi "firibgarlik" bo'lsa, stratify siz
sinov to'plamiga tasodifan bitta ham firibgarlik tushmasligi mumkin.
7. Pipeline - hammasini birlashtirish #
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)
- Sizib chiqishdan himoya -
fitfaqat o'qitish to'plamida bajariladi - Takrorlanuvchanlik - barcha qadamlar bir joyda yozilgan
- Deploy uchun qulay - butun quvurni bitta fayl sifatida saqlaysiz
- Kross-validatsiya bilan to'g'ri ishlaydi - har bir bo'linishda
qaytadan
fitqilinadi
17-bo'limda buni chuqurroq ko'ramiz.
Yangi belgilar yaratish #
Ba'zan mavjud belgilardan foydaliroq yangisini yasash mumkin:
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)
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 #
| Qadam | Bajarildi |
|---|---|
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 |
X = uylar # narx ham ichida qoldi!
y = uylar["narx"]
Model 100% aniqlik ko'rsatadi - chunki javob kirishda turibdi. Har doim tekshiring:
assert "narx" not in X.columns
- Yuqoridagi
uylarjadvalini yarating. isna().sum()bilan bo'sh qiymatlarni toping.maydonni mediana,tumanni moda bilan to'ldiring.- IQR usuli bilan chetdagi qiymatlarni toping va qaror qabul qiling.
tumanni one-hot,holatini tartibli kodlang.narx_m2vayangi_uybelgilarini yarating.train_test_splitbilan 80/20 ga bo'ling.StandardScalerni to'g'ri tartibda qo'llang.- Xato tartibda ham qilib ko'ring va farqni tushuntiring.
- Butun jarayonni
PipelinevaColumnTransformerbilan 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_transformfaqat o'qitishda,transformsinovda.stratify=ynomutanosib toifalarda majburiy.Pipelinesizib chiqishdan himoya qiladi va deploy ni osonlashtiradi.
Keyingi bo'limda birinchi haqiqiy modelni quramiz.
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.