18-bo‘lim

Baholash va xato tahlili

Nomutanosib sinflar, precision va recall, F1, chalkashlik matritsasi, chegarani sozlash va model ishonchini tekshirish.

🕑 9 daqiqa o‘qish 📄 718 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Aniqlik aldashi
  2. To'rtta holat
  3. Chegarani sozlash
  4. Chalkashlik matritsasi
  5. Model o'z xatosini biladimi
  6. Xato tahlili tartibi
  7. Xulosa

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.

Python
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%}")
Natija
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.

Nomutanosib to'plamda aniqlik ma'nosiz

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 #

QisqartmaTo'liq nomiMa'nosi
TPTrue PositiveKasal edi - kasal dedi (to'g'ri topdi)
TNTrue NegativeSog'lom edi - sog'lom dedi (to'g'ri)
FPFalse PositiveSog'lom edi - kasal dedi (yolg'on ogohlantirish)
FNFalse NegativeKasal edi - sog'lom dedi (o'tkazib yubordi)

Ulardan uchta o'lchov chiqadi:

O'lchovFormulaSavolga javob beradi
PrecisionTP / (TP + FP)«Kasal dedim - nechtasi rostdan kasal edi?»
RecallTP / (TP + FN)«Kasallarning nechtasini topdim?»
F12·P·R / (P + R)Ikkalasining muvozanatli o'rtachasi
Python
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:

Natija
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:

Python
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}")
Natija
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.

Chegara o'zgarganda precision va recall qarama-qarshi harakatlanadi 100% 50% 0% 0.2 0.3 0.5 0.7 0.9 chegara Precision Recall eng yuqori F1 hech kimni o'tkazib yubormaslik kerak bo'lsa yolg'on ogohlantirish qimmatga tushsa
Chegarani tanlash - texnik emas, biznes qarori
Chegarani masala belgilaydi
  • 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 #

Natija
                 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 #

Python
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%}")
Natija
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.

Agar farq bo'lmasa

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 #

QadamNima qilinadi
1Sinflar bo'yicha aniqlikni chiqarish
2Chalkashlik matritsasini qurish
3Eng ko'p chalkashgan juftliklarni topish
4O'sha juftlikdan bir nechta xato namunani ko'z bilan ko'rish
5Sabab: ma'lumotmi, nishon xatomi, model kuchsizligimi
6Bitta o'zgarish kiritib, qaytadan o'lchash
Amaliy topshiriq
  1. 1000/50 nomutanosib to'plam yaratib, «hammasi sog'lom» modelining aniqligini hisoblang.
  2. Nima uchun bu aniqlik aldamchi ekanini tushuntiring.
  3. TP, TN, FP va FN ni hisoblaydigan funksiya yozing.
  4. Precision, recall va F1 ni qo'lda hisoblab tekshiring.
  5. Chegarani 0.2 dan 0.9 gacha o'zgartirib, jadval tuzing.
  6. Eng yuqori F1 qaysi chegarada ekanini toping.
  7. Saraton skrining uchun qaysi chegarani tanlashingizni asoslang.
  8. Spam filtri uchun javobingiz nega boshqacha bo'lishini yozing.
  9. Chalkashlik matritsasini qurib, xato turlarini ajrating.
  10. 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.

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.