Makine Öğrenimi - Karar Ağacı
Karar ağacı
Bu bölümde size nasıl bir "Karar Ağacı" yapacağınızı göstereceğiz. Karar Ağacı bir Akış Şemasıdır ve önceki deneyimlere dayalı kararlar almanıza yardımcı olabilir.
Örnekte, bir kişi bir komedi şovuna gidip gitmeyeceğine karar vermeye çalışacaktır.
Neyse ki örnek kişimiz kasabada her komedi şovu olduğunda kayıt olmuş, komedyen hakkında bazı bilgileri kaydetmiş, gidip gitmediğini de kaydetmiş.
Yaş | Tecrübe etmek | Rütbe | Milliyet | Gitmek |
36 | 10 | 9 | Birleşik Krallık | HAYIR |
42 | 12 | 4 | Amerika Birleşik Devletleri | HAYIR |
23 | 4 | 6 | n | HAYIR |
52 | 4 | 4 | Amerika Birleşik Devletleri | HAYIR |
43 | 21 | 8 | Amerika Birleşik Devletleri | EVET |
44 | 14 | 5 | Birleşik Krallık | HAYIR |
66 | 3 | 7 | n | EVET |
35 | 14 | 9 | Birleşik Krallık | EVET |
52 | 13 | 7 | n | EVET |
35 | 5 | 9 | n | EVET |
24 | 3 | 5 | Amerika Birleşik Devletleri | HAYIR |
18 | 3 | 7 | Birleşik Krallık | EVET |
45 | 9 | 9 | Birleşik Krallık | EVET |
Şimdi, bu veri setine dayanarak Python, herhangi bir yeni şovun katılmaya değer olup olmadığına karar vermek için kullanılabilecek bir karar ağacı oluşturabilir.
O nasıl çalışır?
İlk önce ihtiyacınız olan modülleri içe aktarın ve veri setini pandalarla okuyun:
Örnek
Veri setini okuyun ve yazdırın:
import pandas
from sklearn import tree
import pydotplus
from
sklearn.tree import DecisionTreeClassifier
import matplotlib.pyplot as plt
import matplotlib.image as pltimg
df = pandas.read_csv("shows.csv")
print(df)
Bir karar ağacı yapmak için tüm verilerin sayısal olması gerekir.
Sayısal olmayan 'Milliyet' ve 'Git' sütunlarını sayısal değerlere dönüştürmemiz gerekiyor.
Pandaların, map()
değerlerin nasıl dönüştürüleceği hakkında bilgi içeren bir sözlük alan bir yöntemi vardır.
{'UK': 0, 'USA': 1, 'N': 2}
'UK' değerlerini 0'a, 'USA' değerlerini 1'e ve 'N' değerlerini 2'ye dönüştürmek anlamına gelir.
Örnek
Dize değerlerini sayısal değerlere değiştirin:
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)
Ardından, özellik sütunlarını hedef sütundan ayırmamız gerekir.
Özellik sütunları, tahmin etmeye çalıştığımız sütunlardır ve hedef sütun, tahmin etmeye çalıştığımız değerlerin bulunduğu sütundur.
Örnek
X
özellik sütunları,
y
hedef sütun:
features = ['Age', 'Experience', 'Rank', 'Nationality']
X = df[features]
y = df['Go']
print(X)
print(y)
Artık gerçek karar ağacını oluşturabilir, onu ayrıntılarımıza sığdırabilir ve bilgisayara bir .png dosyası kaydedebiliriz:
Örnek
Bir Karar Ağacı oluşturun, onu bir resim olarak kaydedin ve resmi gösterin:
dtree = DecisionTreeClassifier()
dtree = dtree.fit(X, y)
data =
tree.export_graphviz(dtree, out_file=None, feature_names=features)
graph =
pydotplus.graph_from_dot_data(data)
graph.write_png('mydecisiontree.png')
img=pltimg.imread('mydecisiontree.png')
imgplot = plt.imshow(img)
plt.show()
Sonuç Açıklaması
Karar ağacı, bir komedyeni görmek isteyip istememe ihtimalinizi hesaplamak için önceki kararlarınızı kullanır.
Karar ağacının farklı yönlerini okuyalım:
Rütbe
Rank <= 6.5
6.5 veya daha düşük rütbeli her komedyenin
True
oku (solda) ve geri kalanının False
oku (sağda) izleyeceği anlamına gelir.
gini = 0.497
bölmenin kalitesine atıfta bulunur ve her zaman 0.0 ile 0.5 arasında bir sayıdır; burada 0.0, tüm örneklerin aynı sonucu aldığı anlamına gelir ve 0,5, bölmenin tam olarak ortada yapıldığı anlamına gelir.
samples = 13
Demek ki kararda bu noktada 13 komedyen kaldı ki bu ilk adım olduğu için hepsi bu.
value = [6, 7]
bu 13 komedyenden 6'sının "HAYIR" ve 7'sinin "DEVAM" alacağı anlamına gelir.
cin
Örnekleri bölmenin birçok yolu vardır, bu eğitimde GINI yöntemini kullanıyoruz.
Gini yöntemi şu formülü kullanır:
Gini = 1 - (x/n)2 - (y/n)2
x
Olumlu yanıtların sayısı ("GO")
nerede , n
örnek
y
sayısı ve olumsuz yanıtların sayısı ("HAYIR"), bize bu hesaplamayı verir:
1 - (7 / 13)2 - (6 / 13)2 = 0.497
Bir sonraki adım, 'Rütbesi' 6.5 veya daha düşük olan komedyenler için bir kutu ve geri kalanlarla birlikte bir kutu olmak üzere iki kutu içerir.
True - 5 Komedyen Burada Bitiyor:
gini = 0.0
tüm örneklerin aynı sonucu aldığı anlamına gelir.
samples = 5
bu branşta 5 komedyen kaldığı anlamına gelir (Rütbesi 6.5 veya daha düşük olan 5 komedyen).
value = [5, 0]
5'in "HAYIR" ve 0'ın "DEVAM" alacağı anlamına gelir.
False - 8 Komedyen Devam Ediyor:
Milliyet
Nationality <= 0.5
uyruk değeri 0,5'ten az olan komedyenlerin soldaki oku takip edeceği (yani Birleşik Krallık'tan herkes anlamına gelir) ve geri kalanların sağdaki oku izleyeceği anlamına gelir.
gini = 0.219
örneklerin yaklaşık %22'sinin bir yöne gideceği anlamına gelir.
samples = 8
bu branşta 8 komedyen kaldığı anlamına gelir (8 komedyen 6.5'ten yüksek Rütbeye sahip).
value = [1, 7]
bu 8 komedyenden 1'inin "HAYIR" ve 7'sinin "DEVAM" alacağı anlamına gelir.
True - 4 Komedyen Devam:
Yaş
Age <= 35.5
35,5 yaş ve altındaki komedyenlerin soldaki oku, geri kalanların ise sağdaki oku izleyeceği anlamına gelir.
gini = 0.375
örneklerin yaklaşık %37,5'inin bir yöne gideceği anlamına gelir.
samples = 4
bu branşta 4 komedyen kaldığı anlamına gelir (İngiltere'den 4 komedyen).
value = [1, 3]
bu 4 komedyenden 1'inin "HAYIR" ve 3'ünün "DEVAM" alacağı anlamına gelir.
False - 4 Komedyen Burada Bitiriyor:
gini = 0.0
tüm örneklerin aynı sonucu aldığı anlamına gelir.
samples = 4
bu branşta 4 komedyen kaldığı anlamına gelir (İngiltere'den olmayan 4 komedyen).
value = [0, 4]
bu 4 komedyenden 0'ın "HAYIR" ve 4'ünün "DEVAM" alacağı anlamına gelir.
True - 2 Komedyen Burada Bitiriyor:
gini = 0.0
tüm örneklerin aynı sonucu aldığı anlamına gelir.
samples = 2
bu branşta 2 komedyen kaldığı anlamına gelir (2 komedyen 35.5 yaşında veya daha genç).
value = [0, 2]
bu 2 komedyenden 0'ın "HAYIR" ve 2'sinin "DEVAM" alacağı anlamına gelir.
Yanlış - 2 Komedyen Devam Ediyor:
Tecrübe etmek
Experience <= 9.5
9,5 yıl veya daha az deneyime sahip komedyenlerin soldaki oku, geri kalanların ise sağdaki oku izleyeceği anlamına gelir.
gini = 0.5
örneklerin %50'sinin bir yöne gideceği anlamına gelir.
samples = 2
bu branşta 2 komedyen kaldığı anlamına gelir (2 35,5 yaşından büyük komedyen).
value = [1, 1]
bu 2 komedyenden 1'inin "HAYIR" ve 1'inin "DEVAM" alacağı anlamına gelir.
True - 1 Komedyen Burada Bitiyor:
gini = 0.0
tüm örneklerin aynı sonucu aldığı anlamına gelir.
samples = 1
bu branşta 1 komedyen kaldığı anlamına gelir (1 komedyen 9,5 yıl veya daha az tecrübeli).
value = [0, 1]
0'ın "HAYIR" alacağı ve 1'in "DEVAM" alacağı anlamına gelir.
Yanlış - 1 Komedyen Burada Bitiyor:
gini = 0.0
tüm örneklerin aynı sonucu aldığı anlamına gelir.
samples = 1
bu branşta 1 komedyen kaldığı anlamına gelir (1 komedyen 9,5 yıldan fazla deneyime sahip).
value = [1, 0]
1'in "HAYIR" ve 0'ın "DEVAM" alacağı anlamına gelir.
Tahmin Değerleri
Yeni değerleri tahmin etmek için Karar Ağacını kullanabiliriz.
Örnek: 40 yaşında, 10 yıllık deneyime sahip ve komedi sıralaması 7 olan bir Amerikalı komedyenin oynadığı bir gösteriye gitmeli miyim?
Örnek
Yeni değerleri tahmin etmek için tahmin() yöntemini kullanın:
print(dtree.predict([[40, 10, 7, 1]]))
Örnek
Komedi sıralaması 6 olsaydı cevap ne olurdu?
print(dtree.predict([[40, 10, 6, 1]]))
Farklı Sonuçlar
Karar Ağacı'nı aynı verilerle besleseniz bile yeterince çalıştırırsanız size farklı sonuçlar verdiğini göreceksiniz.
Bunun nedeni, Karar Ağacı'nın bize %100 kesin bir cevap vermemesidir. Bir sonucun olasılığına dayanır ve cevap değişecektir.