Qaror daraxti

Qaror daraxti
Ushbu bobda biz sizga qanday qilib "Qaror daraxti"ni yasashni ko‘rsatamiz. Qarorlar daraxti - bu oqim diagrammasi va oldingi tajribaga asoslanib qaror qabul qilishingizga yordam beradi.
Misolda, bir kishi komediya tomoshasiga borish kerakmi yoki yo‘qmi, qaror qabul qilishga harakat qiladi.
Yaxshiyamki, namunali odamimiz har safar shaharda komediya ko‘rsatuvi bo‘lsa, ro‘yxatdan o‘tadi va hajvchi haqida ma’lumotni ro‘yxatdan o‘tkazadi, shuningdek, u bor yoki yo‘qligini ham ro‘yxatdan o‘tkazadi.
| Yosh | Tajriba | Daraja | Millati | Go |
| 36 | 10 | 9 | UK | NO |
| 42 | 12 | 4 | USA | NO |
| 23 | 4 | 6 | N | NO |
| 52 | 4 | 4 | USA | NO |
| 43 | 21 | 8 | USA | YES |
| 44 | 14 | 5 | UK | NO |
| 66 | 3 | 7 | N | YES |
| 35 | 14 | 9 | UK | YES |
| 52 | 13 | 7 | N | YES |
| 35 | 5 | 9 | N | YES |
| 24 | 3 | 5 | USA | NO |
| 18 | 3 | 7 | UK | YES |
| 45 | 9 | 9 | UK | YES |
Endi, ushbu ma’lumotlar to‘plamiga asoslanib, Python har qanday yangi shoularga tashrif buyurishga arziydimi yoki yo‘qligini hal qilish uchun ishlatilishi mumkin bo‘lgan qarorlar daraxtini yaratishi mumkin.
U qanday ishlaydi?
Birinchidan, ma’lumotlar to‘plamini pandalar bilan o‘qing:
Misol
Ma’lumotlar to‘plamini o‘qing va chop eting:
import pandas
df = pandas.read_csv("data.csv")
print(df)
Qaror daraxtini yaratish uchun barcha ma’lumotlar sonli bo‘lishi kerak.
"Milliyat" va "O‘tish" sonli bo‘lmagan ustunlarni raqamli qiymatlarga aylantirishimiz kerak.
Pandas map() usuliga ega bo‘lib, u qiymatlarni qanday aylantirish haqida ma’lumotga ega dictionary oladi.
{'UK': 0, 'USA': 1, 'N': 2}
"Buyuk Britaniya" qiymatlarini 0 ga, "AQSh" ni 1 ga va "N" ni 2 ga aylantiradi.
Misol
String qiymatlarini raqamli qiymatlarga o‘zgartiring:
d = {'UK': 0, 'USA': 1, 'N': 2}
df['Nationality'] = df['Nationality'].map(d)
d = {'YES': 1, 'NO': 0}
df['Go'] = df['Go'].map(d)
print(df)
Keyin xususiyat ustunlarini maqsadli ustundan ajratishimiz kerak.
Xususiyat ustunlari biz bashorat qilishga harakat qiladigan ustunlar, maqsadli ustun esa biz taxmin qilmoqchi bo‘lgan qiymatlar ustunidir.
Misol
X - xususiyat ustunlari, y - maqsad ustun:
features = ['Age', 'Experience', 'Rank', 'Nationality']
X = df[features]
y = df['Go']
print(X)
print(y)
Endi biz haqiqiy qaror daraxtini yaratishimiz mumkin, uni tafsilotlarimizga moslashtiramiz. Bizga kerak bo‘lgan modullarni import qilishdan boshlang:
Misol
Qarorlar daraxtini yaratish va ko‘rsatish:
import pandas
from sklearn import tree
from sklearn.tree import DecisionTreeClassifier
import matplotlib.pyplot as plt
df = pandas.read_csv("data.csv")
d = {'UK': 0, 'USA': 1, 'N': 2}
df['Nationality'] = df['Nationality'].map(d)
d = {'YES': 1, 'NO': 0}
df['Go'] = df['Go'].map(d)
features = ['Age', 'Experience', 'Rank', 'Nationality']
X = df[features]
y = df['Go']
dtree = DecisionTreeClassifier()
dtree = dtree.fit(X, y)
tree.plot_tree(dtree, feature_names=features)
Natija tushuntirildi
Qarorlar daraxti komediyachini ko‘rishni xohlash yoki qilmaslik ehtimolini hisoblash uchun oldingi qarorlaringizdan foydalanadi.
Keling, qaror daraxtining turli jihatlarini o‘qib chiqamiz:

Daraja
Rank <= 6.56,5 yoki undan past darajaga ega bo‘lgan har bir komediyachi True strelkasi (chapda), qolganlari esa False strelkasi (o‘ngda) bo‘lishini anglatadi.
gini = 0.497 bo‘linish sifatiga ishora qiladi va har doim 0,0 dan 0,5 gacha bo‘lgan raqam bo‘lib, bu yerda 0,0 barcha namunalar bir xil natijaga erishganligini va 0,5 bo‘linish aynan o‘rtada amalga oshirilganligini bildiradi.
samples = 13 qarorning shu nuqtasida 13 nafar komediyachi qolganligini bildiradi, bularning barchasi birinchi qadam bo‘lgani uchun.
value = [6, 7] shuni anglatadiki, bu 13 nafar komediyachidan 6 nafari "YO‘Q", 7 nafari "GO" oladi.
Jini
Namunalarni ajratishning ko‘plab usullari mavjud, biz ushbu qo‘llanmada GINI usulidan foydalanamiz.
Gini usuli quyidagi formuladan foydalanadi:
Gini = 1 - (x/n)2 - (y/n)2
Bu yerda x - ijobiy javoblar soni ("GO"), n - namunalar soni va y - salbiy javoblar soni ("YO‘Q"), bu bizga ushbu hisobni beradi:
1 - (7 / 13)2 - (6 / 13)2 = 0.497

Keyingi bosqichda ikkita quti, 6,5 yoki undan past darajali komediyachilar uchun bitta quti va qolganlari bilan bitta quti mavjud.
To‘g‘ri - 5 komediyachi shu erda tugaydi:
gini = 0.0 barcha namunalar bir xil natijaga erishganligini bildiradi.
samples = 5 bu filialda 5 nafar komediyachi qolganligini bildiradi (6,5 yoki undan past darajali 5 komediyachi).
value = [5, 0]5 ta "YO‘Q", 0 esa "GO" ni olishini bildiradi.
False - 8 komediyachi davom etadi:
Millati
Nationality <= 0.5 millati qiymati 0,5 dan kam bo‘lgan komediyachilar chapdagi strelka (ya’ni Buyuk Britaniyadan kelgan barchani anglatadi) va qolganlari o‘ngdagi o‘qni kuzatib borishini anglatadi.
gini = 0.219 namunalarning taxminan 22% bir yo‘nalishda ketishini anglatadi.
samples = 8 bu filialda 8 ta komediyachi qolganligini bildiradi (6,5 dan yuqori 8 komediyachi).
value = [1, 7] shuni anglatadiki, bu 8 nafar komediyachidan 1 nafari "YO‘Q" va 7 nafari "GO" oladi.

To‘g‘ri - 4 komediyachi davom etadi:
Yosh
Age <= 35.535,5 va undan kichik yoshdagi komediyachilar chapdagi o‘qni, qolganlari esa o‘ngdagi o‘qni kuzatib borishini anglatadi.
gini = 0.375 namunalarning taxminan 37,5% bir yo‘nalishda ketishini anglatadi.
samples = 4 bu filialda 4 nafar komediyachi qolganligini bildiradi (Buyuk Britaniyadan 4 nafar komediyachi).
value = [1, 3] shuni anglatadiki, bu 4 nafar komediyachidan 1 nafari "YO‘Q" va 3 nafari "GO" oladi.
False - 4 Komediyachi shu erda tugaydi:
gini = 0.0 barcha namunalar bir xil natijaga erishganligini bildiradi.
samples = 4 bu filialda 4 nafar komediyachi qolganligini bildiradi (4 nafar komediyachi Buyuk Britaniyadan emas).
value = [0, 4] shuni anglatadiki, bu 4 nafar komediyachidan 0 nafari "YO‘Q" va 4 nafari "GO" oladi.

To‘g‘ri - 2 komediyachi shu erda tugaydi:
gini = 0.0 barcha namunalar bir xil natijaga erishganligini bildiradi.
samples = 2 bu filialda 2 nafar komediyachi qolganligini bildiradi (2 nafar 35,5 yosh va undan kichik).
value = [0, 2] shuni anglatadiki, bu 2 ta komediyachidan 0 nafari "YO‘Q" va 2 nafari "GO" oladi.
False - 2 Komediyachi Davom etadi:
Tajriba
Experience <= 9.5 shuni anglatadiki, 9,5 yil yoki undan kam tajribaga ega komediyachilar chapdagi o‘qni, qolganlari esa o‘ngdagi o‘qni kuzatib boradilar.
gini = 0.5 namunalarning 50% bir yo‘nalishda ketishini anglatadi.
samples = 2 bu filialda 2 nafar komediyachi qolganligini bildiradi (35,5 yoshdan katta 2 nafar komediyachi).
value = [1, 1] shuni anglatadiki, bu 2 nafar komediyachidan 1 nafari "YO‘Q" va 1 nafari "GO" oladi.

To‘g‘ri - 1 komediyachi shu erda tugaydi:
gini = 0.0 barcha namunalar bir xil natijaga erishganligini bildiradi.
samples = 1 bu filialda 1 nafar komediyachi qolganligini bildiradi (9,5 yil va undan kam tajribaga ega 1 nafar komediyachi).
value = [0, 1]0 "YO‘Q" va 1 "GO" olishini bildiradi.
False - 1 komediyachi shu yerda tugaydi:
gini = 0.0 barcha namunalar bir xil natijaga erishganligini bildiradi.
samples = 1 bu filialda 1 nafar komediyachi qolganligini bildiradi (9,5 yildan ortiq tajribaga ega 1 nafar komediyachi).
value = [1, 0]1 "YO‘Q" va 0 "GO" olishini bildiradi.
Qiymatlarni bashorat qilish
Biz qarorlar daraxtidan yangi qiymatlarni bashorat qilish uchun foydalanishimiz mumkin.
Misol: 40 yoshli amerikalik komediyachi, 10 yillik tajribaga ega va komediya reytingi 7 bo‘lgan shouni ko‘rishim kerakmi?
Misol
Yangi qiymatlarni bashorat qilish uchun tahmin() usulidan foydalaning:
print(dtree.predict([[40, 10, 7, 1]]))
Misol
Agar komediya darajasi 6 bo‘lsa, javob nima bo‘lar edi?
print(dtree.predict([[40, 10, 6, 1]]))
Turli natijalar
Agar siz uni bir xil ma’lumotlar bilan oziqlantirsangiz ham, agar siz uni yetarlicha marta ishlatsangiz, qarorlar daraxti sizga turli xil natijalar berishini ko‘rasiz.
Buning sababi, Qaror daraxti bizga 100% aniq javob bermaydi. Bu natija ehtimoliga asoslanadi va javob har xil bo‘ladi.
W3Schools Pathfinder
Yutuqlaringizni kuzating – bu bepul!
