Accuracy nega aldaydi
Accuracy nima?
accuracy = to'g'ri javoblar soni / hamma javoblar soni
Bu eng birinchi va eng tushunarli metrika: "100 ta rasmdan 95 tasiga to'g'ri javob berdi". U imtihon bahosiga o'xshaydi, shuning uchun hamma birinchi bo'lib shunga qaraydi. Bu qismda uning qayerda aldashini ko'ramiz.
Model: SGDClassifier
- Bu linear model. U har bir pikselga bitta vazn (weight) beradi. Rasmning scorei = har bir piksel × uning vazni, hammasining yig'indisi. Score musbat bo'lsa, model "5" deydi. Ya'ni model "5 ga xos joylarda siyoh bormi?" deb so'raydi.
- Stochastic Gradient Descent — vaznlarni o'rganish usuli. Butun datasetni birdaniga emas, namunalarni bittadan olib, vaznlarni oz-ozdan to'g'rilaydi. Shuning uchun 60 000 ta rasmda ham tez ishlaydi.
random_state=42— "stochastic" so'zi "tasodifiy" degani: o'qishda namunalar tartibi aralashtiriladi.random_state=42bu aralashtirishni har safar bir xil tartibda qiladi. Shunda kodni qayta ishga tushirsangiz ham, sizdagi raqamlar notebookdagi bilan bir xil chiqadi.
Nega cross_val_score?
Bitta train/test bo'lish bitta tasodifiy natija beradi. Omad kelsa, test ga oson rasmlar tushadi va natija yaxshi chiqadi. Omad kelmasa, aksincha.
cross_val_score(..., cv=3) train ni 3 ta bo'lakka (har biri 20 000 rasm) bo'ladi va 3 marta ishlaydi: ikkita bo'lakda o'qitadi, uchinchisida tekshiradi. Har safar tekshiruv bo'lagi boshqa. Natijada 3 ta baho chiqadi. Ular bir-biriga yaqin bo'lsa, natija barqaror, tasodif emas.
Va eng muhimi: bunda test set ga tegmaymiz.
scoring="accuracy" — har bir bo'lakda accuracy hisoblansin degani.
from sklearn.linear_model import SGDClassifier from sklearn.model_selection import cross_val_score sgd_clf = SGDClassifier(random_state=42) cross_val_score(sgd_clf, X_train, y_train_5, cv=3, scoring="accuracy")
array([0.95035, 0.96035, 0.9604 ])
Uchta baho: 0.950, 0.960, 0.960. O'rtachasi taxminan 0.957. Ya'ni model 100 ta rasmdan taxminan 96 tasiga to'g'ri javob beryapti. Bu juda yaxshi ko'rinadi.
Lekin to'xtab, savol beraylik: 95.7% — bu yaxshimi? Uni nima bilan solishtiramiz?
Baseline: solishtirish uchun eng oddiy model
Har qanday baho faqat solishtirganda ma'noga ega bo'ladi. Imtihonda 95 ball oldingiz. Zo'r! Lekin agar hamma savollarga "ha" deb javob bergan odam ham 90 ball oladigan bo'lsa-chi? Unda 95 ball unchalik zo'r emas: siz "hech narsa o'ylamaslik"dan atigi 5 ball ko'proq oldingiz.
ML da bu "hech narsa o'ylamaydigan" yechim baseline deyiladi. Har qanday model undan sezilarli yaxshi bo'lishi kerak, aks holda model kerak emas.
Classification da eng oddiy baseline: rasmga umuman qaramasdan, hammaga eng ko'p uchraydigan javobni aytish. sklearn da bu DummyClassifier(strategy="most_frequent"). U fit da faqat y ga qaraydi va qaysi klass ko'p ekanini eslab qoladi. X ni (rasmlarni) umuman ishlatmaydi.
Bizda ko'p klass — "5 emas". Demak dummy model hammaga "5 emas" deydi.
from sklearn.dummy import DummyClassifier dummy_clf = DummyClassifier(strategy="most_frequent") cross_val_score(dummy_clf, X_train, y_train_5, cv=3, scoring="accuracy")
array([0.90965, 0.90965, 0.90965])
Hech narsa o'rganmagan model 90.965% oldi. Uchala bo'lakda ham bir xil, chunki u har safar bir xil ish qiladi.
U aslida nima qilganini o'z ko'zimiz bilan ko'ramiz: model 60 000 ta rasmga qanday javob berdi?
dummy_pred = dummy_clf.fit(X_train, y_train_5).predict(X_train) pd.Series(dummy_pred).value_counts()
False 60000 Name: count, dtype: int64
60 000 marta "5 emas" (False). Bitta ham "5" yo'q. Ya'ni 5421 ta haqiqiy 5 ning bittasini ham topmadi. Va shunga qaramay accuracy si 91%.
Nega shunday bo'ladi? Matematik sabab
Accuracy ni ikki klassga bo'lib yozish mumkin:
accuracy = ("5 emas" ulushi) × ("5 emas"lardagi to'g'rilik) + ("5" ulushi) × ("5"lardagi to'g'rilik)
Dummy model uchun:
0.91 × 1.00 + 0.09 × 0.00 = 0.91
- "5 emas"larning hammasiga to'g'ri javob berdi (1.00), chunki hammaga "5 emas" dedi.
- 5 larning bittasiga ham to'g'ri javob bermadi (0.00).
Bu formula sababni to'liq tushuntiradi: accuracy — har bir klassdagi to'g'rilikning, klass hajmi bo'yicha o'rtachasi. Ko'p klass bahoning 91% ini belgilaydi, kam klass atigi 9% ini. Kam klassda butunlay muvaffaqiyatsiz bo'lsangiz ham, bahodan faqat 9 foiz yo'qotasiz.
Kam klass qancha kichik bo'lsa, aldov shuncha kuchli: - 5 lar 9% bo'lsa — hech narsa qilmaydigan model 91% oladi. - Kasallik 1% bo'lsa — "hamma sog'lom" degan model 99% oladi (7-bobda xuddi shuni ko'ramiz). - Firibgarlik 0.17% bo'lsa — "hamma to'lov oddiy" degan model 99.83% oladi.
Bu modellar qog'ozda a'lo, amalda esa nolga teng: ular bitta ham kasalni, bitta ham firibgarni topmaydi. 1-bob boshidagi bank misoli aynan shu.
Bu bizning modelimiz haqida nima deydi?
SGD modelimiz 95.7%, baseline 91%. Model baseline dan yaxshi: baseline 5421 ta xato qiladi, bizning model esa taxminan 2580 ta. Xatolar deyarli ikki baravar kam.
Lekin accuracy eng muhim savolga javob bermaydi: haqiqiy 5 larning nechtasini topdik? Yuqoridagi formulaga qarang: bir xil 95.7% turli modellardan chiqishi mumkin. Biri 5 larning ko'pini topib, "5 emas"larda ko'proq adashadi. Boshqasi "5 emas"larda deyarli adashmaydi, lekin 5 larning ko'pini o'tkazib yuboradi. Accuracy ikkalasiga bir xil baho beradi. 3-bobda bizning model aynan ikkinchi turdan ekanini ko'ramiz: u 5 larning faqat 65% ini topadi.
Accuracy qachon yaxshi metrika?
Ikki shart bajarilsa: 1. Klasslar taxminan teng (masalan, 50% / 50%). 2. Ikki xil xatoning narxi bir xil: "5 ni 5 emas dedi" va "5 emasni 5 dedi" bir xil yomon.
Bu shartlardan biri bajarilmasa, accuracy yolg'iz yetmaydi. Real masalalarda (kasallik, firibgarlik, nuqson) ikkalasi ham ko'pincha bajarilmaydi.
Xulosa: bizga nima kerak?
Bizga qaysi xatolar qilinganini alohida-alohida ko'rsatadigan vosita kerak: - haqiqiy 5 larning nechtasi topildi, nechtasi o'tkazib yuborildi; - model "5" degan rasmlarning nechtasi haqiqatan 5, nechtasi noto'g'ri signal.
Bu vosita — confusion matrix.
Bu bobni bepul o'qidingiz.
Kitob o'rgatadi, lekin sizning kodingiz nega ishlamaganini ayta olmaydi. Kursda uy vazifangiz tekshiriladi.