Bayes usuli
Ushbu metod ba’zida Bayes teoremasi, qoidasi yoki qonuni deb ham nomlanib, ma’lum bir hodisaning sodir bo’lish ehtimoligini topish uchun biz shartli ehtimolikdan foydalanib, ushbu qaralayotgan ehtimolikning boshqa biror bir hodisaga bog’liqligi haqidagi bilimga ega bo’lgan holda shu hodisaning ehtimoligini tasvirlash imkoni bo’ladi. Bu ta’rif, ancha murakkab bo’lib, uni quyidagi sodda ko’rinishdagi masalada o’rganib chiqib keyin umumiy teoramani yozish foydaliroq bo’ladi.
Avvallo shartli ehtimolikning ushbu qoidaga aloqasini yaxshilab o’rganib olaylikda so’ng masalaga o’taylik. Odatda tibbiyotga oida masalalarni keltirish ko’pchilikka mos keladi, chunki o’quvchilarning deyarli hammasi hayotda tibbiyotga muhtoj bo’ladi. Masalan quyidagicha:
Bemorni yoki insoni COVID-19 virusiga tekshirishmiz zarur bo’lsa, u holda ushbu test ijobiy chiqsa, bu narsa shu test topshiruvchi insonda virus borligiga dalolat qiladi. Aks holda, ya’ni salbiy chiqsa, virus asorotlari shu insonda mavjud bo’lmaydi. Bilamizki, buni tekshirishning bir qancha usullari mavjud, jumladan PCR (polymerase chain reaction). Lekin biz bu masalani ishlash uchun bu testdan foydalanmaymiz, chunki ushbu test uchun ma’lum bir sharoitlarga ega laboratoriya kerak bo’ladi. Uning o’rniga biz insondagi ma’lum bir shamollash yoki gripp asoratlaridan foydalanamiz. Bu asoratlar quyidagilar: bemorning isitmasi, tomog’ og’rig’i hamda bosh og’rig’i bor yoki yo’qligi. Endi biz quyidagi jadvalni qaraylik:
Ijobiy |
Salbiy |
Jami |
|
---|---|---|---|
Isitmasi borlar |
30 |
5 |
35 |
Isitmasi yo’qlar |
10 |
55 |
65 |
Jami |
40 |
60 |
100 |
Biz bu jadvaldan quyidagi (shartli) ehtimoliklarni hisoblashimiz mumkin:
“Insonda virus bo’lishi” \(Pr("Ijobiy")=\frac{40}{100}=\frac{2}{5}\);
“Insonda virus yo’qligi” \(Pr("Salbiy")=\frac{60}{100}=\frac{3}{5}\);
“Insonda isitma bo’lishi” \(Pr("Isitma\,bor")=\frac{35}{100}=\frac{7}{20}\);
“Insonda isitma yo’qligi” \(Pr("Isitma\,yo'q")=\frac{65}{100}=\frac{13}{20}\);
“Visurga chalingan insonda isitma bo’lishligi” \(Pr("Isitma\,bor"|"Ijobiy")=\frac{30}{40}=\frac{3}{4}\), ya’ni isitmasi bor bemorlarning 30 tasi virusni yuqtirgan va qolgan virusni yuqtirgan 10 ta odamda esa isitma yo’q. Ushbu ikki hodisa bir-birga chambarchas bog’liq, ya’ni biz agar odam virus yuqtirgan bo’lsa, uning isitmasi bo’lish ehtimoligini topdik. Umumiy xulosa quyidagicha: “virus yuqtirgan odamlarning 75 foizida isitma bor”;
“Isitmasi bor insonda virus bo’lishi” \(Pr("Ijobiy"|"Isitma\,bor")=\frac{30}{35}=\frac{6}{7}\). Bu shartli hodisa oldingi holning teskarisini ifodalaydi, ya’ni “isitmasi bor inson” haqida gap ketyabdi. Odatda bu ikki narsani ko’pchilik bir-biri bilan adashtirishadi. Bu yerda insonning isitmasi bor deb hisoblanadi, lekin oldingisida esa inson virus yuqturgan.;
“Virusga chalinmagan insonda isitma bo’lishligi” \(Pr("Isitma\,bor"|"Salbiy")=\frac{5}{60}=\frac{1}{12}\);
“Isitmasi bor insonda virus bo’lmasligi” \(Pr("Salbiy"|"Isitma\,bor")=\frac{5}{35}=\frac{1}{7}\);
“Virusga chalinmagan insonda isitma yo’qligi” \(Pr("Isitma\,yo'q"|"Salbiy")=\frac{55}{60}=\frac{11}{12}\);
“Isitmasi yo’q insonda virus yo’qligi” \(Pr("Salbiy"|"Isitma\,yo'q")=\frac{55}{65}=\frac{11}{13}\).
Yuqorilardagidan tashqari biz boshqa turdagi ehtimolliklarni ham keltirishimiz mumkin.
Yuqoridagi hodisalarning ehtimoliklaridan birinchi 4 tasi juda sodda bo’lib, biz ularni avvalgi(Ingliz tilida, prior) ehtimollik deb ataymiz. Keyingi 6 tasini esa tushunish bir oz qiyinorq, eng asosiysi ularning joyi almashganda natija ham o’zgarishini anglash muhim. Hamda biz o’rganmoqchi bo’lgan usul va shu usulni qo’loqmoqchi bo’lgan masalamizning asosiy mohiyati quyidagicha: “Agar bemorning isitmasi bor yoki yo’qligi aniq bo’lsa, u holda unda virus bo’lish ehtimolini topishimiz kerak”. Eng muhim e’tiborni qaratadigan nuqta bu yerda “bemorning isitimasi” borligi berilgan. Demak jadvalga ko’ra, agar bemorda isitma bo’lsa, u holda uning virusga chalinganligining ehtimoligi \(\frac{6}{7}\) ekan. Uning teskarisi, ya’ni, agar isitmasi bo’lmasa, u holda uning virusga chalinganligining ehtimoligi \(\frac{10}{65}=\frac{2}{13}\) ekan.
Biz o’tgan mavzuda ehtimollar nazariyasning birlamchi qoidalarini o’rgangan edik. End shu qoidalarni ishga solib Bayes metodini ishlab chiqamiz. Tassavur qilamiz bizga \(A\) va \(B\) hodisalar berilgan. Agar \(B\) hodisa berilgan bo’lsa(ya’ni \(B\) hodisa sodir bo’lgan), u holda \(A\) hodisaning sodir bo’lish ehtimoligi quyidagicha edi:
\begin{equation} Pr(A|B)=\frac{Pr(A\cap B)}{P(B)}, \end{equation} va buni biz shartli ehtimollik deb atadik.
Shunga o’xshash agar \(A\) hodisa berilgan bo’lsa, u holda \(B\) hodisaning sodir bo’lish ehtimoligi quyidagicha bo’ladi:
\begin{equation} Pr(B|A)=\frac{Pr(A\cap B)}{P(A)} \end{equation}
Ikkinchi formuladan \(Pr(A\cap B)\) ni topib birinchi formulaga olib borib qo’ysak, unda quydagi formulaga ega bo’lamiz:
\begin{equation} Pr(A|B)=\frac{Pr(B|A)Pr(A)}{P(B)} \end{equation}
Oxirgi formulani biz Bayes qoidsi deb ataymiz.
Keling endi, yuqoridagi formulani oldingi jadval asosida tuzilgan COVID-19 masalasiga qo’llasak. Hodisalar: \(A="Ijobiy"\) va \(B="Isitma\,bor"\). Quyida ushbu hodisalar asosida ehtimoliklar: \(Pr(A)=\frac{2}{5}\), \(Pr(B)=\frac{7}{20}\), \(Pr(B|A)=\frac{3}{4}\). Natija esa quyidagicha bo’ladi: \(Pr(A|B)=\frac{\frac{3}{4}\frac{2}{5}}{\frac{7}{20}}=\frac{3}{4}\frac{2}{5}\frac{20}{7}=\frac{6}{7}\). Endi isitmasi bor odamning virusga chalinmasligining ehtimoligi esa quyidagicha. Hodisalar va ularning ehtimoligi: \(C="not\,A"\) va \(Pr(not\,A)=\frac{3}{5}\), \(Pr(B|not\,A)=\frac{5}{60}=\frac{1}{12}\). Natija: \(Pr(not\,A|B)=\frac{\frac{1}{12}\frac{3}{5}}{\frac{7}{20}}=\frac{1}{12}\frac{3}{5}\frac{20}{7}=\frac{1}{7}\).
Biz endi ushbu xulosa orqali ehtimolikning eng aosoiy qoidasi bo’lgan, hodisaning ehtimoligi va unga teskari bo’lgan hodisaning ehtimoliklari yig’indisi birga tengligini ko’rishimiz mumkin. Bu yerda \(A= not\, C\), ya’ni “Ijobiy”ning teskarisi “Salbiy”dir. \(Pr(A|B)+Pr(not\,A|B)=\frac{6}{7}+\frac{1}{7}=1\).
Ko’p alomatlar uchun Bayes usuli
Biz bu usulni bitta alomat bo’lgan holdagina o’rgandik, lekin bittadan oshiq alomat bo’lganda bu usul sal boshqacharoq ko’rnishda tasvirlanadi. Quyida yuqoridagi masalani umumiylashtiramiz. Buning uchun quyidagi hodisalarni qisqalik uchun katta lotin harflari bilan belgilab olamiz: \(A="Ijobiy"\), \(B="Isitma\,bor"\) va \(C="Bosh\,og'rig'i\,bor"\). Yodda tuting teskari hodisalarni: \(not\,A="Salbiy"\), \(not\,B="Isitma\,yo'q"\) va \(not\,C="Bosh\,og'rig'i\,yo'q"\). Biz avvalroq “Isitma” bo’yicha jadval keltirgan edik. Shunday jadval “Bosh og’rig’i” uchun quyida keltirilgan:
Ijobiy |
Salbiy |
Jami |
|
---|---|---|---|
Bosh og’rig’i borlar |
35 |
15 |
50 |
Bosh og’rig’i yo’qlar |
5 |
45 |
50 |
Jami |
40 |
60 |
100 |
Bu jadval uchun yuqoridagi kabi hodisalarning ehtimoliklarini yozmasdan hisoblash jarayonida to’g’ridan-to’g’iri ishlatib ketamiz. Keling avval Quyidagi hodisaning shartli ehtimlogini topaylik, ya’ni virus bo’lishning bosh og’rig’iga bog’langan holda.
\begin{equation} Pr(A|C)=\frac{Pr(C|A)Pr(A)}{P(C)}=\frac{\frac{35}{40}\frac{2}{5}}{\frac{1}{2}}=\frac{35}{40}\frac{2}{5}\frac{2}{1}=\frac{7}{10} \end{equation}
Bosh og’rig’i bor insonning virusga chalinmaganligining ehtimoli esa quyidagicha:
\begin{equation} Pr(not\,A|C)=\frac{Pr(C|not\,A)Pr(not\,A)}{P(C)}=\frac{\frac{15}{60}\frac{3}{5}}{\frac{1}{2}}=\frac{15}{60}\frac{3}{5}\frac{2}{1}=\frac{3}{10} \end{equation}
Biz insoning joriy holatini ifodalovchi ikkita hodisa (“Isitma bor” va “Bosh og’rig’i bor”) asosida shu insoni virusga chalinganligi yoki yo’qligini alohida-alohida aniqladik, ular: \(Pr(A|B)=\frac{6}{7}\) va \(Pr(A|C)=\frac{7}{10}\). Ko’rib turganimizdek ikki hodisa asosida biz ikki xil biri ikkinchisiga teng bo’lmagan ehtimoliklarga ega bo’ldik. Biz bu ehtimolliklarni shu ko’rinishida bemorga taqdim eta olmaymiz, chunki ikkisi ikki xil ko’rsatgich berib turibdi. Uning o’rniga biz ikkisini bitta ko’rnishiga o’tkazishimiz zarur bo’ladi. Bu holdagi Bayes usulini ko’p o’zgaruvchili Bayes usuli deb ataymiz. Ushbu usulni biz yuqoridagi kabi keltirib chiqarishning o’rniga to’g’irida-to’g’iri umumiy formulasini keltiramiz. Biz avvalgi misollarda maxrajdagi qiymatni tashlab yuborsak ham natija o’zgarmaydi chunki ular foiz ko’rinishida chiqarish uchun, umuman olgan umumiy natijani olsak ular yuqolib ketadi. Shuni hisobga olib hamda ikki berilgan hodisani (“Isitma bor” va “Bosh og’rig’i bor”) bog’liqsiz deb olib, quyidagicha yozamiz:
\begin{equation} Pr(A|B,C)=Pr(A)Pr(B|A)Pr(C|A) \end{equation}
Virus bo’lmasilining ehtimoli esa
\begin{equation} Pr(not\,A|B,C)=Pr(not\,A)Pr(B|not\,A)Pr(C|not\,A) \end{equation}
Natijani olayotganda biz yuqoridagi ehtimolikllardan kattasini olamiz. Agar natijani foiz ko’rinishida tasvirlash zarur bo’lsa, u holda nisbiy qiymatlarni olishimiz mumkin.
\begin{equation} Pr(A|B,C)=\frac{Pr(A)Pr(B|A)Pr(C|A)}{Pr(A)Pr(B|A)Pr(C|A)+Pr(not\,A)Pr(B|not\,A)Pr(C|not\,A)} \end{equation}
va
\begin{equation} Pr(not\,A|B,C)=\frac{Pr(not\,A)Pr(B|not\,A)Pr(C|not\,A)}{Pr(A)Pr(B|A)Pr(C|A)+Pr(not\,A)Pr(B|not\,A)Pr(C|not\,A)} \end{equation}
Amaliy masala
Ushbu usul ehtimolliklarning mashhur va keng amaliy masalalarida qo’llanilib kelinayotgan usulidir. Bu usul orqali biz agar oldindan biror qo’shimcha berilganga ega bo’lsak, ulardan foydalanib hodisaning sodir bo’lish ehtimolini qayta yangilashimiz mumkin. Bu qo’shimcha berilganlar, masalan raqamlangan rasmlarda har bir raqam uchun nechta rasm borligi bo’lishi mumkin. Bu jarayonni ikki bosqichli eksperiment orqali amalga oshiramiz. Bunda birinchi bosqichdagi ba’zi hodisalarning ehtimoliklarini ikkichi bosqich natijalariga ega bo’lgandan keyin topamiz. Keling buni tushunish uchun quyidagicha namunaviy masala olib, undan so’ng uning dasturini tuzsak.
Namunaviy masala. Ushbu masala tibiyotga oid bo’lib, insonlarda qandli diabet (tanada qand miqdorining keskin oshib yoki kamayib ketishi) kasaligi bor-yo’qligini ularning bergan javoblari asosida bashorat qilishdir. Hammaga ma’lumki butun dunyoda ushbu kassalikdan jabr ko’rayotganlar ko’p. Ba’zida, ayniqsa bizning xalqimizda, ushbu kasallikni vaqtida tekshirtirmay yoki aynan shu kasalikka chalinganiligni aniqlashga ancha vaqt ketishi mumkin. Shuning uchun biz agar ushbu kasalikni soddaroq usullarda aniqlashning imkoni topsak, u holda biz insonlarga yordam bergan bo’lar edik.
Namunaviy to’plam. Ushbu masalaga mos keluvchi to’plam bu Diabetes Health Indicators Dataset. Bu to’plam o’zida 70 692 ta inson va ularga berilgan savollarning javoblarini saqlaydi. Ushbu so’rovnomada jami 22 ta savol bo’lib, ulardan birinchi 21 tasi insoning holatini ifodalovchi ko’rsatgichlar bo’lib, oxirgi 1 tasi esa ushbu insonda qandli diabeti borligi yoki yo’qligini ifodalaydi. Ushbu to’plamning qiymatlaridan ba’zilari quyidagi jadvalda keltirilgan:
[2]:
# Ushbu kod faqat to'plamni chiqarish uchun yozildi
import pandas as pd
import pathlib
path = pathlib.Path().resolve().parent.parent
pd.set_option('display.max_columns', None)
df = pd.read_csv(path / 'datasets' / 'diabetes_5050_pre.csv')
df.head(10)
[2]:
Diab | HBP | HChol | CCheck | BMI | Smok | Str | HDAtt | PAct | Fruit | Veggy | HACon | AHCare | NoDoCost | GHlth | MtHlth | PHlth | DWalk | Sex | Age | Edu | Inc | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 1 | 0 | 1 | 14 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 2 | 5 | 30 | 0 | 1 | 3 | 5 | 7 |
1 | 0 | 1 | 1 | 1 | 14 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 2 | 0 | 0 | 0 | 1 | 11 | 5 | 7 |
2 | 0 | 0 | 0 | 1 | 14 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 10 | 0 | 1 | 12 | 5 | 7 |
3 | 0 | 1 | 1 | 1 | 16 | 1 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | 0 | 2 | 0 | 3 | 0 | 1 | 10 | 5 | 7 |
4 | 0 | 0 | 0 | 1 | 17 | 1 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 7 | 4 | 7 |
5 | 0 | 0 | 0 | 1 | 6 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 7 | 0 | 0 | 0 | 0 | 3 | 6 |
6 | 0 | 0 | 1 | 1 | 14 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 12 | 4 | 5 |
7 | 0 | 0 | 0 | 1 | 19 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 3 | 0 | 0 | 0 | 1 | 5 | 3 | 2 |
8 | 0 | 0 | 0 | 1 | 20 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | 0 | 2 | 0 | 0 | 0 | 0 | 2 | 5 | 7 |
9 | 0 | 0 | 0 | 1 | 15 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 2 | 0 | 6 | 0 | 1 | 5 | 3 | 3 |
Ko’rib turganimizdek yuqoridagi jadvalda jami, 22 ta ustun bor. Ushbu berilganlar to’plamining birinchi alomati bizga maqsadli alomat bo’lib, u so’rovnomaga javob bergan shaxsning diabeti bor yoki yo’qligini bildiradi. Bu yerda 0 diabeti yo’qlarni va 1 diabeti borlarni anglatadi. Qolgan 21 ta alomatning qiymatidan foydalangan holda biz agar boshqa biror so’rovnomada ishtirok etmagan shaxs shu so’rovnomani to’ldirsa, unda diabet bor yoki yo’qligining ehtimoligini topishimiz kerak. Ushbu holda bizning hodisamiz quyidagi ikkita: ‘Diabeti bor’ yoki ‘Diabeti yo’q’. Joriy masalani Bayes usulida ishlash uchun, oldingi masalalardagi kabi bu to’plamni ham ikki qismga ajratib olamiz, uning 80 foizi o’rtgatuvchi va qolgan 20 foizi esa test uchun bo’ladi. Ushbu qismlarga ajaratishni biz oldindan funksiya qilib yozib qo’yganmiz, quyida o’sha ikkita to’plamni xotiraga yuklash kodi keltirilgan.
Qiymatlarga e’tibor bersak, u yerda hech qanday so’zlar bilan ifodalash yo’q. Chunki biz odatda so’zlar bilan yoki gaplar bilan toifali alomatlarning qiymatlarni ifodalashdan ko’ra har bir so’zga yoki gapga shunchaki bitta raqam berib ishni osonlashtiramiz. Masalan, ‘Chekasizmi?’ deyilgan savolga, javob ‘ha’ bo’lsa 1 yoki ‘yo’q’ bo’lsa 0 bilan bu alomatning qiymati berilgan. Bu berilganlar to’plamidagi 21 ta asosiy alomatlardan faqat bittasini (‘Body mass Index’) to’lig’icha olib tashlaymiz, chunki u miqdoriy va Bayes usulining biz o’rgamoqchi bo’lgan turi miqdoriy alomatlar bilan ishlay olmaydi. To’plamda boshqa bu kabi alomatlar bo’lib, ular toifali ko’rinishga o’tazilgan, masalan yoshni toifali ko’rnishda qabul qilsa bo’ladi. Bu kabi berilganlarga qayta ishlov berish usularini kelgusi darslarda ko’rib chiqamiz.
Atama. Biz yuqoridagi namunada so’zlarning va gaplarning o’rniga sonlar yozilganini va uning sababini keltirdik. Ushbu jarayon, ya’ni biror berilganlarni ma’lum bir qoida asosida boshqa ko’rinishga o’tkazish jarayonini Ingliz tilida Encoding deb nomlashadi. Biz esa kodlash deb tarjima qilsak bo’ladi. Ushbu jarayonga teskari bo’lgan jarayoni esa, Ingliz tilida Decoding deb nomlashadi va O’zbek tilida sodda qilib dekodlash desak bo’ladi. Ko’pincha kodlash berilganlarning asl mohiyatini o’zgartirmasdan, uning shaklini o’zgartirishga aytiladi hamda kodlashdan so’ng biz kodlangan berilganlarni odatda tushunmaymiz.
[3]:
# funksiyalarni asosiy kodga qo'shish
from datasets import diabet_train, diabet_test
# ularni chaqirish orqali qiymatlarni yuklash
# funksiyalar ikkita asosiy va maqsadli alomatlarni qaytaradi
# shunign uchun ikki o'zgaruvchi mos ravishda yuklaymiz
x_tr, y_tr = diabet_train()
x_ts, y_ts = diabet_test()
# ularning sonini aniqlash
n_tr = len(x_tr)
n_ts = len(x_ts)
# parameterlarni chiqarish
print("O'rgatuvchi to'plamda: ", n_tr, "ta obyekt bor.")
print("Test to'plamda: ", n_ts, "ta obyekt bor.")
O'rgatuvchi to'plamda: 56553 ta obyekt bor.
Test to'plamda: 14139 ta obyekt bor.
Demak ushbu ikki to’plamda yuqorida ko’rsatilgani kabi sondagi obyektlar mavjud. Endi ushbu to’plamlarning birinchisini bizga berilgan deb tassavur qilamiz hamda algorimtni shu o’rgatuvchi to’plam asosida o’rgatamiz. Keyin esa o’rgatilgan algoritmning qanchalik to’g’iri ishlayotganini test to’plam orqali tekshiramiz. Algoritm bir necha qadamlardan iborat ularni ketma-ket bajarib ketamiz.
1-bosqich. Har bir alomatning maqsad alomatga, ya’ni diabetga qanday ta’sir etayotganining ehtimolini topamiz. Masalan, ‘Chekasizmi?’ deyilgan savolning javob 0 yoki 1 qiymatli. Biz quyidagi 4 ta hodisalarning sonini topishimiz kerak, keyingi kodga qarang: * Chekuvchilardan nechtasida diabet kasaligi bor? * Chekuvchilardan nechtasida diabet kasaligi yo’q? * Chekmaydiganlardan nechtasida diabet kasaligi bor? * Chekmaydiganlardan nechtasida diabet kasaligi yo’q?
[4]:
# Chiqarish uchu
from IPython import display
# o'zgaruvchilar e'loni, boshida hammasi 0 qiymatli
# chunki o'rgatuvchi to'plamdan ularni hisoblashimiz kerak
# chekuvchi va diabet kasaliga chalingan
smoker_diabet = 0
# chekuvchi va diabet kasaliga chalinmanagan
smoker_no_diabet = 0
# chekmaydi va diabet kasaliga chalingan
no_smoker_diabet = 0
#
no_smoker_no_diabet = 0
# takrorlashni sanash uchun o'zgaruvchi
i = 0
# takrorlash
while i < n_tr:
# shartlar: 1) chekuvchi va diabeti bor
# i obyekt indeksi va 3 ushbu alomatning indeksi
if y_tr[i] == 1 and x_tr[i][3] == 1:
smoker_diabet = smoker_diabet + 1
# chekuvchi va diabet kasaliga chalinmanagan
elif y_tr[i] == 0 and x_tr[i][3] == 1:
smoker_no_diabet = smoker_no_diabet + 1
# chekmaydi va diabet kasaliga chalingan
elif y_tr[i] == 1 and x_tr[i][3] == 0:
no_smoker_diabet = no_smoker_diabet + 1
# chekmaydi va diabet kasaliga chalinmanagan
else:
no_smoker_no_diabet = no_smoker_no_diabet + 1
i = i + 1
table = f"""
| |Chekuvchilar soni| Chekmovchilar soni| Jami|
|---|---|---|---|
|Diabetga chalinganlar|{smoker_diabet}|{no_smoker_diabet}|{smoker_diabet + no_smoker_diabet}|
|Diabetga chalinmaganlar|{smoker_no_diabet}|{no_smoker_no_diabet}|{smoker_no_diabet+no_smoker_no_diabet}|
|Jami|{smoker_diabet+smoker_no_diabet}|{no_smoker_diabet+no_smoker_no_diabet}|{no_smoker_diabet+no_smoker_no_diabet + smoker_diabet+smoker_no_diabet}|
"""
display.display_markdown(table, raw=True)
Chekuvchilar soni |
Chekmovchilar soni |
Jami |
|
---|---|---|---|
Diabetga chalinganlar |
14651 |
13644 |
28295 |
Diabetga chalinmaganlar |
12183 |
16075 |
28258 |
Jami |
26834 |
29719 |
56553 |
Ushbu natijalar quyidagi jadvalda foiz ko’rinishida umumiylashtirilgan.
Chekuvchilar soni |
Chekmovchilar soni |
Jami |
|
---|---|---|---|
Diabetga chalinganlar |
0.26 |
0.24 |
0.5 |
Diabetga chalinmaganlar |
0.22 |
0.28 |
0.5 |
Jami |
0.48 |
0.52 |
1 |
Oxirgi jadval asosida biz quyidagi mulohazalarni qilishimiz mumkin:
Agar inson cheksa, u holda uning diabetga chalinganligi ehtimoli 26% (0.26 * 100). Ya’ni chekuvchi odamlarning 26% qandli diabet kasaliga uchragan.
Agar inson chekmasa, u holda uning diabetga chalinganligi ehtimoli 24% (0.24 * 100). Ya’ni chekmaydiganlarning 24% qandli diabet kasaliga uchragan.
Agar inson cheksa, u holda uning diabetga chalinmaganligi ehtimoli 22% (0.22 * 100). Ya’ni chekadigan odamlarning 22% kasalikka chalinmagan.
Agar inson chekmasa, u holda uning diabetga chalinmaganligi ehtimoli 28% (0.28 * 100). Ya’ni chekmaydiganlarning 28% kasalikka chalinmagan.
Biz ushbu xulosalar orqali bizga insonning chekuvchi yoki yo’ligi aytilsa biz, uning diabetga chalinganligi yoki yo’qligini ma’lum bir ehtimollik bilan aytishmiz mumkin. Masalan, cheksa 26 foiz ehtimollik bilan chalingan, aks holda esa 28 foiz ehtimollik bilan chalinmagan. E’tibor qilsak, ushbu raqamlar sal bizga tushunarsiz, ya’ni biz bir hodisaning bo’lishi yoki bo’lasligini quyidagi formula orqali ifodalangan edik:
\begin{equation} Pr(E) = 1 - Pr(not\,E) \end{equation}
bu yerda \(E\) hodisa chalinganligi, \(not\, E\) esa chalinmaganligi, ya’ni \(E\) hodisaning teskarisi. Agar \(E\) va \(not\, E\) hodisalarning ehtimoligi jadvalga ko’ra mos ravishda 0.26 va 0.28 bo’lsa, bu qiymatlar yuqoridagi tenglamani qanoatlantirmaydi. Chunki ushbu sonlar “Checkuvchi” degan ya’na boshqa bir hodisaga, shartli bog’langan. Shunday bo’lsada, biz insonlarga javob sifatida 0 dan 100 gacha bo’lgan sonlarni aytishimiz zarur. Sababi agar biz “Chekuvchi” insonga 26% ni aytsak, u “bu juda past ko’rsatgich” deyishi mumkin. Oldingi mulohazalarni e’tiborga olib, agar “shaxs cheksa” uning diabetga chalinish ehtimoli Bayes qoidasiga ko’ra quyidagicha bo’ladi. Buning uchun quyidagi hodisalarni kiritib olaylik: \(A="Chalingan"\) va \(B="Chekadi"\)
\begin{equation} Pr(A|B)=\frac{Pr(B|A)Pr(A)}{Pr(B)}=\frac{\frac{14651}{28295}\frac{28295}{56553}}{\frac{26834}{56553}}=\frac{14651}{26834}=0.56 \end{equation}
ya’ni agar shaxs cheksa, uning diabet bo’lishining ehtimoli 56 foiz ekan. O’z-o’zidan ko’rinib turibdiki chekmaydigan shaxsning diabetga uchrashi taxminan 44% ekan.
2-bosqich. Bu bosqichda yuqorida topilgan ‘Chekish’ hodisasining qiymatlarni boshqa barcha alomatlar uchun ham topib chiqamiz. Bu ish oldingiga qaraganda sal murakkabor bo’ladi. Chunki “Chekish” alomatida ikki qiymatdan biri bo’lishi mumkin edi, ya’ni ‘Ha’ yoki ‘Yo’q’. Lekin boshqa ba’zi alomatlarda bunday toifalar 30 tagacha yetadi. Shu nuqtai nazardan biz yetarlicha murakkab kod yozishimizga to’g’iri keladi. Ishni osonlashtirish uchun biz ushbu kodning murakkab qismlarini funksiya sidatida
utils.py
fayliga yozib qo’yib, ularni zarur joylarda chaqiramiz. O’quvchilardan esa ushbu funksiyalarni qarab o’rganishini so’rab qolamiz. Ushbu funksiya oldingi kodning umumiy holdagi varainti hisoblanadi. Quyidagi dastur qismi shu funksiyani bitta ‘jins’ alomat uchun yuqoridagi parameterlarni hisoblab chiqadi.
[7]:
array = [0, 0]
i = 0
while i < n_tr:
# if y_tr[i] == 0:
# array[0] += 1
# else:
# array[1] += 1
array[y_tr[i]] += 1
i += 1
array
[7]:
[28258, 28295]
[10]:
counts = [
# diabet emas, diabet
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
]
i = 0
while i < len(x_tr):
counts[x_tr[i][12]][y_tr[i]] += 1
i += 1
categories = ['excellent', 'very good', 'good', 'fair', 'poor']
table = """
| |Diabetga chalinganlar| Diabetga chalinmaganlar| Jami|
|---|---|---|---|
"""
diabet = 0
no_diabet = 0
j = 0
while j < len(counts):
table += f"{categories[j]}|{counts[j][1]}|{counts[j][0]}|{counts[j][0] + counts[j][1]}|\n"
diabet += counts[j][1]
no_diabet += counts[j][0]
j += 1
table += f"Jami|{diabet}|{no_diabet}|{diabet+no_diabet}|\n"
display.display_markdown(table, raw=True)
Diabetga chalinganlar |
Diabetga chalinmaganlar |
Jami |
|
---|---|---|---|
excellent |
935 |
5692 |
6627 |
very good |
5096 |
10872 |
15968 |
good |
10733 |
7949 |
18682 |
fair |
7857 |
2773 |
10630 |
poor |
3674 |
972 |
4646 |
Jami |
28295 |
28258 |
56553 |
[4]:
# funksiyani asosiy kodga qo'shish
from utils import bayes_compute_parameters
# funksiya ikkita qiymat qaytaradi:
# toifalar ro'yxati va ularning ehtimoliklari:
# ikkita diabetga chalinga va chalinmaganlar
# va 3 qiymat qabul qiladi:
# o'rgatuvchi to'plam bilan uning maqsadli alomati
# zarur bo'lgan alomatning indeksi
# 'jins' alomatining indeksi 3 edi
uniques, diabet_probs, no_diabet_probs = bayes_compute_parameters(x_tr, y_tr, 12)
# natijalarni chop qilamiz
i = 0
# takrorlash toifalar sonigacha
while i < len(uniques):
print('Diabet', uniques[i], "-toifa ehtimoligi:", round(diabet_probs[i], 2))
print('No diabet', uniques[i], "-toifa ehtimoligi:", round(no_diabet_probs[i], 2))
i = i + 1
Diabet 2 -toifa ehtimoligi: 0.02
No diabet 2 -toifa ehtimoligi: 0.1
Diabet 1 -toifa ehtimoligi: 0.09
No diabet 1 -toifa ehtimoligi: 0.19
Diabet 3 -toifa ehtimoligi: 0.19
No diabet 3 -toifa ehtimoligi: 0.14
Diabet 4 -toifa ehtimoligi: 0.14
No diabet 4 -toifa ehtimoligi: 0.05
Diabet 0 -toifa ehtimoligi: 0.06
No diabet 0 -toifa ehtimoligi: 0.02
2-bosqichning keyingi qismida esa shu funksiyani har bir alomat uchun qo’llab ularning ham qiymatlarini topamiz. Quyidagi kodga qarang.
[12]:
# funksiyani asosiy kodga qo'shish
from utils import bayes_compute_parameters
# hamma alomatning natijallari saqlash uchun
# o'zgaruvchilar, ular bo'sh har doimgidek
all_uniques = []
all_d_probs = []
all_n_probs = []
# alomatlar sonipractice
n_features = 20
# sanagich
i = 0
# takrorlash alomatlar sonigacha
while i < n_features:
# i-alomat uchun uniques va probs lar hisoblash
uniques, d_probs, no_probs = bayes_compute_parameters(x_tr, y_tr, i)
# natijalarni umumiy ro'yxatlarga qo'shib qo'yish
all_uniques.append(uniques)
all_d_probs.append(d_probs)
all_n_probs.append(no_probs)
i = i + 1
3-bosqich. Ushbu bosqichda mavjud har bir alomat uchun hisoblab chiqilgan parameterlardan foydalanib, test to’plamdagi obyektlarni klassifikatsiya qilamiz. Buning uchun yuqoridagi shartli ehtimollikni ikkita sinf uchun alohida hisoblab chiqamiz, ya’ni
\begin{equation} Pr('Chalingan'|F_1,F_2,\dots, F_{20})=Pr(F_1)\cdot Pr(F_2)\cdot,\dots,\cdot Pr(F_{20}) \end{equation}
hamda
\begin{equation} Pr('Chalinmagan'|F_1,F_2,\dots ,F_{20})=Pr(F_1)\cdot Pr(F_2)\cdot,\dots,\cdot Pr(F_{20}) \end{equation}
Undan so’ng esa, oldingi misoldagi kabi, ikki hodisaning ehtimoliklarini ularning yig’indisiga bo’lish orqali umumiy xulosani chiqaramiz, ya’ni
\begin{equation} Pr('Chalingan'|F_1,F_2,\dots, F_{20})= \end{equation}
\begin{equation*} \frac{Pr('Chalingan'|F_1,F_2,\dots, F_{20})}{Pr('Chalingan'|F_1,F_2,\dots ,F_{20})+Pr('Chalinmagan'|F_1,F_2,\dots ,F_{20})} \end{equation*}
hamda
\begin{equation} Pr('Chalinmagan'|F_1,F_2,\dots, F_{20})= \end{equation}
\begin{equation*} \frac{Pr('Chalinmagan'|F_1,F_2,\dots, F_{20})}{Pr('Chalingan'|F_1,F_2,\dots ,F_{20})+Pr('Chalinmagan'|F_1,F_2,\dots ,F_{20})} \end{equation*}
Shu o’rinda yuqoridagi oxirgi qayta ishlashni mulohaza qilsak. U shunchaki ikki hodisaning ehtimoliklarining bir-biriga nisbatini hisoblash orqali ularning yig’indisini 1 ga tenglaydi. Masalan, bizga 0.3 va 0.6 qiymatlari berilgan bo’lsin, u holda ularning bir-biriga nisbatining yig’indisi 1 ga teng bo’lishi uchun birinchi qiymat \(\frac{0.3}{0.3+0.6}=0.33\) va ikkinchi qiymat esa \(\frac{0.6}{0.3+0.6}=0.67\) bo’ladi. Keyingi kod shu testni bitta obyekt misolida ko’radi va undan keyin esa uni umumiy holda yozamiz.
[15]:
# test qilinadigan obyekt indeks
j = 1200
# ehtimoliklar ko'pyatmasini hisoblash uchun
# p1 => daibet va p2 => diabet emas
# ko'paytmaga 1 ni ko'paytirsak hech nima o'zgarmaydi
# shuning uchun ularning boshlang'ich qiymatlari 1 ga teng
p1 = 1
p2 = 1
i = 0
# alomatlar bo'yicha takrorlash
while i < 20:
# test qilanayotgan j-obyketning
# har bir alomatini olishpractice
curr_val = x_ts[j][i]
# Ikki hodisaning sodir bo'lishining
# shartli ehtimoliklarni olish va
# oldingi alomatlarnikiga ko'paytirish
p1 = p1 * all_d_probs[i][curr_val]
p2 = p2 * all_n_probs[i][curr_val]
i = i + 1
# umumiy ehtimolikni ularning yig'indisiga bo'lish
n_p1 = p1 / (p1 + p2)
n_p2 = p2 / (p1 + p2)
print("Diabet ehtimoli: ", round(n_p1 * 100), '%')
print("Diabet emaslik ehtimoli: ", round(n_p2 * 100), '%')
print("To'g'iri javob: ", end='')
if y_ts[j] == 1:
print('Diabet')
else:
print('Diabet emas')
Diabet ehtimoli: 0 %
Diabet emaslik ehtimoli: 100 %
To'g'iri javob: Diabet emas
Yuqoridagi kodda, biz bitta obyekt uchun o’rgatilgan algoritmni ishlatib ko’rdik va unda natijalar to’g’iri chiqdi, ya’ni 100% aniqlik bilan ushbu obyektning Diabet kasaligiga chalinmaganligi basharot qilindi. Lekin ushbu testni boshqa obyektlar uchun ishlatsak, algoritm xato qilishi mumkin. Bu kabi testlarni siz aziz o’quvchilarga qoldiramizda, test to’plamning barcha obyektlari uchun ushbu kodni qayta yozamiz va bu kod orqali biz algoritmning aniqligini topamiz. Algoritmlarning aniqliklarini baholashning masala turiga va to’plamning holatiga qarab bir nechta usullari bor. Biz ularni hammasi masala turiga qarab zarur joyda o’rganib ketaveramiz. Ulardan klassifikatsiya masalalari uchun eng ko’p qo’llaniladigani bu to’g’iri topilganlar soni umumiy obyektlar soniga bo’lib hisoblash usulidir. Ushbu usulni biz raqamlarni klassifikatsiya qilganda ishlatib o’rgangan edik, lekin umumiy ko’rinishda bermadik. Chunki biz Eng yaqin qo’shni usulini to’lig’icha hamma obyektlar ustida tekshira olmadik. Ushbu turdagi aniqlik usulini hamma sodda qilib, Aniqlik(Accuracy) deb nomlaydi. Ko’pincha bu aniqlik klassifikatsiya masalari uchun ishlatiladi.
\begin{equation} Aniqlik=\frac{To'g'irilar\,soni}{Obyektlar\,soni} \end{equation}
Odatda klassifikatsiya algoritmlari uchun mo’ljallangan aniqlikni baholash usullaring qiymati 0 va 1 oraliqda o’zgaradi. Agar natijani 100 ko’paytirsak unda algoritmning bahosini aynan qaralayotgan to’plam uchun foizlarda ko’rsatish mumkin. Quyida shu usul asosida bizga javoblari berilgan 14139 ta test obyketlarining natijasi keltirilgan.
[16]:
s = 0 # to'g'iri basharot qilingan obyektlar soni
j = 0 # sanagich
while j < n_ts: # takarorlash to obyektlar sonigacha
# j-test obyket uchun bashorat qilish
# har bir alomati bo'yicha ikkita sinfga mos shartli
# ehtimolliklar, ko'paytma uchun boshida 1 ga teng
p1 = 1 # diabet
p2 = 1 # diabet emas
i = 0 # sangich
while i < 20: # alomatlar bo'yicha takrorlash
curr_val = x_ts[j][i] # j-obyektning i-alomatining qiymati
p1 = p1 * all_d_probs[i][curr_val] # j-alomat bo'yicha diabet
p2 = p2 * all_n_probs[i][curr_val] # j-alomat diabet emas
i = i + 1 # sanagichni oshirish alomat bo'yicha
# tassuvr qilamiz boshida chalinmagan deb
pred = 0
# agar diabet sinfining qiymati katta
# bo'lsa, unda chalingan
if p1 > p2:
pred = 1
# bashorat va aniq qiymat teng bo'lsa,
# unda s ni qiymatini oshiramiz
if y_ts[j] == pred:
s = s + 1
j = j + 1 # sagichni oshirish obyekt bo'yicha
print('Aniqlik: ', round(s / n_ts * 100), '%')
Aniqlik: 73 %
Ko’rib turganimizdek, yuqoridagi algoritm 73% aniqlik bilan ishlayabdi. Albatta bu ko’rsatgich ancha past, lekin bizning hozirgi sodda algoritmimiz uchun yaxshi natija hisoblandi. Hamda yuqorida aytib o’tganimizdek har bir sun’iy intellekt algoritmida xatolik bo’ladi. Agar shu xatolik 50% ga yaqin bo’lganda, biz bu algoritmni hech ishlatish uchun tavsiya eta olmasdik. Sababi diabet bo’lish yoki bo’lmaslik hodisalarining tasodifiy bahosi 50%.