18-bo‘lim
Baholash va xato tahlili
Nomutanosib sinflar, precision va recall, F1, chalkashlik matritsasi, chegarani sozlash va model ishonchini tekshirish.
Ushbu bo‘lim mundarijasi
14-bo'limda ko'rdik: 89% umumiy aniqlik bitta sinfning 65% natijasini yashirgan edi. Bu bo'limda modelni to'g'ri baholashni o'rganamiz.
Aniqlik aldashi #
Tibbiy tekshiruv misolini olamiz: 1000 ta sog'lom, 50 ta kasal.
import torch
torch.manual_seed(42)
n_sog, n_kasal = 1000, 50
haqiqiy = torch.cat([torch.zeros(n_sog), torch.ones(n_kasal)]).long()
print("sinf taqsimoti:", torch.bincount(haqiqiy).tolist())
print(f"kasallar ulushi: {n_kasal/(n_sog+n_kasal):.2%}")
dangasa = torch.zeros_like(haqiqiy) # hammasini "sog'lom" deydi
print(f"aniqlik: {(dangasa==haqiqiy).float().mean():.2%}")
sinf taqsimoti: [1000, 50]
kasallar ulushi: 4.76%
aniqlik: 95.24%
95.24% aniqlik - hisobotda ajoyib ko'rinadi. Lekin bu model hech qachon «kasal» demaydi. U bironta ham bemorni topmaydi.
Sinflar nomutanosib bo'lsa (firibgarlik, kasallik, nuqsonli mahsulot), eng katta sinfni aytaveradigan model yuqori aniqlik oladi.
Bunday holatda precision va recall ni hisoblang. Aniqlikni umuman chiqarmaslik ham mumkin.
To'rtta holat #
| Qisqartma | To'liq nomi | Ma'nosi |
|---|---|---|
| TP | True Positive | Kasal edi - kasal dedi (to'g'ri topdi) |
| TN | True Negative | Sog'lom edi - sog'lom dedi (to'g'ri) |
| FP | False Positive | Sog'lom edi - kasal dedi (yolg'on ogohlantirish) |
| FN | False Negative | Kasal edi - sog'lom dedi (o'tkazib yubordi) |
Ulardan uchta o'lchov chiqadi:
| O'lchov | Formula | Savolga javob beradi |
|---|---|---|
| Precision | TP / (TP + FP) | «Kasal dedim - nechtasi rostdan kasal edi?» |
| Recall | TP / (TP + FN) | «Kasallarning nechtasini topdim?» |
| F1 | 2·P·R / (P + R) | Ikkalasining muvozanatli o'rtachasi |
def olchov(haq, bash):
TP = ((bash==1) & (haq==1)).sum().item()
TN = ((bash==0) & (haq==0)).sum().item()
FP = ((bash==1) & (haq==0)).sum().item()
FN = ((bash==0) & (haq==1)).sum().item()
aniq = (TP + TN) / len(haq)
p = TP / (TP + FP) if TP + FP else 0.0
r = TP / (TP + FN) if TP + FN else 0.0
f1 = 2*p*r / (p + r) if p + r else 0.0
return TP, TN, FP, FN, aniq, p, r, f1
Haqiqiy model uchun:
TP=39 FP=71 FN=11 TN=929
aniqlik (accuracy): 92.19%
aniqlik (precision): 35.45%
to'liqlik (recall): 78.00%
F1: 0.4875
Aniqlik 92.19% - dangasa modeldan pastroq. Lekin bu model 50 ta kasalning 39 tasini topdi, dangasa esa bittasini ham topmagan edi.
Bitta son bilan baho berish nega xavfli ekani shu yerda ko'rinadi.
Chegarani sozlash #
Model ehtimol qaytaradi. Uni 0.5 da kesish - shunchaki odat, qonun emas:
for ch in [0.2, 0.3, 0.5, 0.7, 0.9]:
b = (ehtimol >= ch).long()
TP, TN, FP, FN, a, p, r, f1 = olchov(haqiqiy, b)
print(f" {ch:.1f} | {p:7.2%} | {r:6.2%} | {f1:.4f} | {TP:3d} / {n_kasal} | {FP:3d}")
Chegara | Precision | Recall | F1 | Topilgan kasal | Yolg'on ogohlantirish
0.2 | 7.80% | 100.00% | 0.1447 | 50 / 50 | 591
0.3 | 12.66% | 96.00% | 0.2238 | 48 / 50 | 331
0.5 | 35.45% | 78.00% | 0.4875 | 39 / 50 | 71
0.7 | 77.78% | 42.00% | 0.5455 | 21 / 50 | 6
0.9 | 100.00% | 2.00% | 0.0392 | 1 / 50 | 0
Bu jadval butun bo'limning mag'zi.
- Chegara 0.2: barcha 50 ta kasal topildi, lekin 591 ta sog'lom odam bekorga chaqirildi.
- Chegara 0.9: yolg'on ogohlantirish yo'q, lekin 50 tadan atigi 1 tasi topildi.
Modelni qayta o'qitmasdan natijani butunlay o'zgartirish mumkin - faqat bitta sonni surish orqali.
- Saraton skrining: kasalni o'tkazib yuborish falokat, qo'shimcha tekshiruv esa arzon -> past chegara, yuqori recall.
- Spam filtri: muhim xatni spamga tashlash yomon, bitta spam o'tib ketsa - hech nima -> yuqori chegara, yuqori precision.
Chegarani validatsiya to'plamida tanlang, testda emas - aks holda test natijasi haqiqiy bahoni ko'rsatmay qoladi.
Chalkashlik matritsasi #
bashorat: sog'lom kasal
haqiqiy sog'lom 929 71
haqiqiy kasal 11 39
Diagonal - to'g'ri javoblar. Diagonaldan tashqaridagi sonlar esa xatolarning turini ko'rsatadi: 11 ta kasal o'tkazib yuborilgan, 71 ta sog'lom bekorga chaqirilgan.
14-bo'limdagi «Ko'ylak -> Futbolka: 114 marta» ham shu matritsadan olingan edi.
Model o'z xatosini biladimi #
ishonch_t = torch.max(togri, 1 - togri)
ishonch_x = torch.max(xato, 1 - xato)
print(f"to'g'ri javoblarda o'rtacha ishonch: {ishonch_t.mean():.2%}")
print(f"xato javoblarda o'rtacha ishonch: {ishonch_x.mean():.2%}")
to'g'ri javoblarda o'rtacha ishonch: 76.45% (968 ta)
xato javoblarda o'rtacha ishonch: 58.13% (82 ta)
Yaxshi belgi: model xato qilganda kamroq ishonadi. Demak past ishonchli javoblarni odamga uzatish mumkin.
Xato javoblarda ham ishonch yuqori bo'lsa, model kalibrlanmagan deyiladi. 11-bo'limda ko'rgan ortiqcha moslashish aynan shunga olib keladi: model yodlab oladi va hamma narsaga 99% ishonch bildiradi.
Xato tahlili tartibi #
| Qadam | Nima qilinadi |
|---|---|
| 1 | Sinflar bo'yicha aniqlikni chiqarish |
| 2 | Chalkashlik matritsasini qurish |
| 3 | Eng ko'p chalkashgan juftliklarni topish |
| 4 | O'sha juftlikdan bir nechta xato namunani ko'z bilan ko'rish |
| 5 | Sabab: ma'lumotmi, nishon xatomi, model kuchsizligimi |
| 6 | Bitta o'zgarish kiritib, qaytadan o'lchash |
- 1000/50 nomutanosib to'plam yaratib, «hammasi sog'lom» modelining aniqligini hisoblang.
- Nima uchun bu aniqlik aldamchi ekanini tushuntiring.
- TP, TN, FP va FN ni hisoblaydigan funksiya yozing.
- Precision, recall va F1 ni qo'lda hisoblab tekshiring.
- Chegarani 0.2 dan 0.9 gacha o'zgartirib, jadval tuzing.
- Eng yuqori F1 qaysi chegarada ekanini toping.
- Saraton skrining uchun qaysi chegarani tanlashingizni asoslang.
- Spam filtri uchun javobingiz nega boshqacha bo'lishini yozing.
- Chalkashlik matritsasini qurib, xato turlarini ajrating.
- To'g'ri va xato javoblardagi o'rtacha ishonchni solishtiring.
Xulosa #
- Nomutanosib to'plamda aniqlik aldaydi: hech nima qilmaydigan model 95.24% oldi.
- To'rtta holat muhim: TP, TN, FP va FN.
- Precision - «kasal dedim, nechtasi rost edi»; recall - «kasallarning nechtasini topdim».
- F1 ikkalasining muvozanatli o'rtachasi.
- Chegarani o'zgartirish modelni qayta o'qitmasdan natijani tubdan o'zgartiradi.
- Chegara 0.2 da barcha kasallar topildi, lekin 591 ta yolg'on ogohlantirish chiqdi.
- Chegara 0.9 da yolg'on ogohlantirish yo'q, lekin 50 tadan 1 tasi topildi.
- Chegarani tanlash - biznes qarori, uni validatsiya to'plamida qiling.
- Chalkashlik matritsasi xatolarning turini ko'rsatadi, soni emas.
- Model xato qilganda kamroq ishonsa - bu yaxshi; teng ishonsa, model kalibrlanmagan.
Keyingi bo'limda modelni ishlab chiqarishga tayyorlaymiz.
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.