Asosiy qismga o'tish

Mashq 1: penguins — uchta sinf

41-bob 6 kod bloki 1321 so'z

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

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

python8 qator
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))
Chiqish
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
speciesislandbill_length_mmbill_depth_mmflipper_length_mmbody_mass_gsex
AdelieTorgersen39.118.71813 750Male
AdelieTorgersen39.517.41863 800Female
AdelieTorgersen40.3181953 250Female
AdelieTorgersenNaNNaNNaNNaNNaN
AdelieTorgersen36.719.31933 450Female
AdelieTorgersen39.320.61903 650Male
python9 qator
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())
Chiqish
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:

python15 qator
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
1Nechta qator, nechta ustun
2"Men ___ ni ___ dan bashorat qilaman" — bitta jumla
3Vazifa turi: regression / binary / multiclass
4Target nisbati va BAZA raqami
5Split qildingizmi? stratify kerakmi?
6Dummy natijasi
7Qaysi ustunlarni tashladingiz va NEGA
8Missing va turlar bilan nima qildingiz
9Birinchi halol natijangiz
10Qaysi metrikani tanladingiz va NEGA
11Xatolar qaysi guruhda to'plangan
12Qaysi 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.

python33 qator
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}")
Chiqish
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
python7 qator
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))
Chiqish
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
python2 qator
print("island ustuni target bilan:")
print(pd.crosstab(pg.island, pg.species).to_string())
Chiqish
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.

Telegramda yozish Narxlar