Mashq 1: penguins — uchta sinf
Nega bu mashq
Hozirgacha hamma narsa binary edi: ha yoki yo'q, 0 yoki 1. precision_score(y, b) bitta son qaytardi.
Endi uchta sinf bo'ladi. Va siz o'rgangan naqsh buziladi: precision_score xato beradi, confusion matrix 2x2 emas 3x3 bo'ladi, "TP" degan narsa yo'qoladi.
Mana shu — transfer. Naqsh buzilganda nima qilishni o'rganish.
Ma'lumot bilan tanishuv
import pandas as pd pg = pd.read_csv(DATA / "penguins.csv") print("shakli:", pg.shape) print() print(pg.dtypes.to_string()) print() show(pg.head(6))
shakli: (344, 7) species object island object bill_length_mm float64 bill_depth_mm float64 flipper_length_mm float64 body_mass_g float64 sex object
| species | island | bill_length_mm | bill_depth_mm | flipper_length_mm | body_mass_g | sex |
|---|---|---|---|---|---|---|
| Adelie | Torgersen | 39.1 | 18.7 | 181 | 3 750 | Male |
| Adelie | Torgersen | 39.5 | 17.4 | 186 | 3 800 | Female |
| Adelie | Torgersen | 40.3 | 18 | 195 | 3 250 | Female |
| Adelie | Torgersen | NaN | NaN | NaN | NaN | NaN |
| Adelie | Torgersen | 36.7 | 19.3 | 193 | 3 450 | Female |
| Adelie | Torgersen | 39.3 | 20.6 | 190 | 3 650 | Male |
print("Sinflar:") print(pg.species.value_counts().to_string()) print() print("nisbat:") print(pg.species.value_counts(normalize=True).round(3).to_string()) print() yoq = pg.isna().sum() print("Bo'sh qiymatlar:") print(yoq[yoq > 0].to_string())
Sinflar: species Adelie 152 Gentoo 124 Chinstrap 68 nisbat: species Adelie 0.442 Gentoo 0.360 Chinstrap 0.198 Bo'sh qiymatlar: bill_length_mm 2 bill_depth_mm 2 flipper_length_mm 2 body_mass_g 2 sex 11
Topshiriq
0-bobdagi 12 qadamni o'zingiz yuring. Hech kim sizga yo'l ko'rsatmaydi. Daftaringizga quyidagilarni yozib boring:
import pandas as pd show(pd.DataFrame([ {"#": 1, "Yozib qo'yiladigan javob": "Nechta qator, nechta ustun"}, {"#": 2, "Yozib qo'yiladigan javob": "\"Men ___ ni ___ dan bashorat qilaman\" — bitta jumla"}, {"#": 3, "Yozib qo'yiladigan javob": "Vazifa turi: regression / binary / multiclass"}, {"#": 4, "Yozib qo'yiladigan javob": "Target nisbati va BAZA raqami"}, {"#": 5, "Yozib qo'yiladigan javob": "Split qildingizmi? stratify kerakmi?"}, {"#": 6, "Yozib qo'yiladigan javob": "Dummy natijasi"}, {"#": 7, "Yozib qo'yiladigan javob": "Qaysi ustunlarni tashladingiz va NEGA"}, {"#": 8, "Yozib qo'yiladigan javob": "Missing va turlar bilan nima qildingiz"}, {"#": 9, "Yozib qo'yiladigan javob": "Birinchi halol natijangiz"}, {"#": 10, "Yozib qo'yiladigan javob": "Qaysi metrikani tanladingiz va NEGA"}, {"#": 11, "Yozib qo'yiladigan javob": "Xatolar qaysi guruhda to'plangan"}, {"#": 12, "Yozib qo'yiladigan javob": "Qaysi BITTA o'zgarishni qildingiz va natija"}, ]))
| # | Yozib qo'yiladigan javob |
|---|---|
| 1 | Nechta qator, nechta ustun |
| 2 | "Men ___ ni ___ dan bashorat qilaman" — bitta jumla |
| 3 | Vazifa turi: regression / binary / multiclass |
| 4 | Target nisbati va BAZA raqami |
| 5 | Split qildingizmi? stratify kerakmi? |
| 6 | Dummy natijasi |
| 7 | Qaysi ustunlarni tashladingiz va NEGA |
| 8 | Missing va turlar bilan nima qildingiz |
| 9 | Birinchi halol natijangiz |
| 10 | Qaysi metrikani tanladingiz va NEGA |
| 11 | Xatolar qaysi guruhda to'plangan |
| 12 | Qaysi BITTA o'zgarishni qildingiz va natija |
Va eng muhim, 13-savol:
Qaysi gipotezangiz RAD ETILDI?
Agar bitta ham rad etilmagan bo'lsa — siz hech narsani sinab ko'rmadingiz. Qaytib boring.
Ogohlantirishlar — lekin yechim emas
Binary metrikalar ishlamaydi
precision_score(y_te, bashorat) uchta sinfda xato beradi:
ValueError: Target is multiclass but average='binary'
Sizga average= parametri kerak. Qaysi birini tanlaysiz — macro, micro yoki weighted? 7 va 8-bobni qayta o'qing. Sinflar 152 / 124 / 68 — bu teng taqsimot emas.
`sex` ustunida 11 ta bo'sh qiymat
U matn ustun. SimpleImputer(strategy="median") matn bilan ishlamaydi. Nima qilasiz?
Uch yo'l bor va har birining narxi bor. Tanlang va nega tanlaganingizni yozib qo'ying.
Birinchi shubha qayerda bo'lishi kerak
island ustuniga qarang. Uni target bilan groupby qiling. Nima ko'rasiz?
Bu leakage emas — lekin u sizga ma'lumot haqida muhim narsa aytadi.
O'zingizni tekshirish
Avval o'zingiz ishlang. Keyin shu raqamlarga qarang.
from sklearn.model_selection import train_test_split, cross_val_score from sklearn.pipeline import Pipeline from sklearn.compose import ColumnTransformer from sklearn.preprocessing import StandardScaler, OneHotEncoder from sklearn.impute import SimpleImputer from sklearn.linear_model import LogisticRegression from sklearn.dummy import DummyClassifier from sklearn.metrics import accuracy_score, f1_score, confusion_matrix, classification_report son = ["bill_length_mm", "bill_depth_mm", "flipper_length_mm", "body_mass_g"] matn = ["island", "sex"] X, y = pg[son + matn], pg["species"] X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.3, random_state=42, stratify=y) baza = accuracy_score(y_te, DummyClassifier(strategy="most_frequent").fit(X_tr[son], y_tr).predict(X_te[son])) quvur = Pipeline([ ("tayyorla", ColumnTransformer([ ("son", Pipeline([("toldir", SimpleImputer(strategy="median")), ("shkala", StandardScaler())]), son), ("matn", Pipeline([("toldir", SimpleImputer(strategy="most_frequent")), ("kod", OneHotEncoder(handle_unknown="ignore"))]), matn), ])), ("model", LogisticRegression(max_iter=3000)), ]).fit(X_tr, y_tr) b = quvur.predict(X_te) print(f"BAZA (most_frequent): {baza:.4f}") print(f"Model accuracy : {accuracy_score(y_te, b):.4f}") print(f"Model macro F1 : {f1_score(y_te, b, average='macro'):.4f}") print(f"Model weighted F1 : {f1_score(y_te, b, average='weighted'):.4f}") cv = cross_val_score(quvur, X, y, cv=5, scoring="f1_macro") print(f"CV macro F1 : {cv.mean():.4f} ±{cv.std():.4f}")
BAZA (most_frequent): 0.4423 Model accuracy : 0.9904 Model macro F1 : 0.9918 Model weighted F1 : 0.9904 CV macro F1 : 0.9939 ±0.0076
print("3x3 confusion matrix:") sinflar = sorted(y.unique()) cm = confusion_matrix(y_te, b, labels=sinflar) print(pd.DataFrame(cm, index=[f"haqiqat: {s}" for s in sinflar], columns=[f"bashorat: {s}" for s in sinflar]).to_string()) print() print(classification_report(y_te, b, digits=4))
3x3 confusion matrix:
bashorat: Adelie bashorat: Chinstrap bashorat: Gentoo
haqiqat: Adelie 46 0 0
haqiqat: Chinstrap 0 21 0
haqiqat: Gentoo 1 0 36
precision recall f1-score support
Adelie 0.9787 1.0000 0.9892 46
Chinstrap 1.0000 1.0000 1.0000 21
Gentoo 1.0000 0.9730 0.9863 37
accuracy 0.9904 104
macro avg 0.9929 0.9910 0.9918 104
weighted avg 0.9906 0.9904 0.9904 104
print("island ustuni target bilan:") print(pd.crosstab(pg.island, pg.species).to_string())
island ustuni target bilan: species Adelie Chinstrap Gentoo island Biscoe 44 0 124 Dream 56 68 0 Torgersen 52 0 0
Oxirgi jadvalga qarang. Torgersen orolida faqat Adelie yashaydi. Biscoe da Gentoo ustun. Bu — leakage emas, bu haqiqiy geografiya. Shuning uchun island foydali xususiyat, va uni tashlash kerak emas.
Nimani o'rgandingiz
Agar natijangiz juda yuqori chiqqan bo'lsa — hayron bo'lmang. Penguins dataseti oson: sinflar tumshuq va qanot o'lchamlari bilan deyarli to'liq ajraladi.
Bu ham dars: oson datasetda hamma model yaxshi ishlaydi. Modelni taqqoslash uchun qiyin dataset kerak. Keyingi mashq qiyinroq.
Bu bobni bepul o'qidingiz.
Kitob o'rgatadi, lekin sizning kodingiz nega ishlamaganini ayta olmaydi. Kursda uy vazifangiz tekshiriladi.