Karar ağacı oluşturma

Bu birimde, YDF (Yggdrasil Karar Ormanı) kitaplığını kullanarak bir karar ağacı eğitecek ve yorumlayacaksınız.

Bu birim, 🧭 YDF ile Başlama eğitiminden esinlenmiştir.

Hazırlıklar

Veri kümesini incelemeden önce aşağıdakileri yapın:

  1. Yeni bir Colab not defteri oluşturun.
  2. Yeni Colab not defterinize aşağıdaki kod satırını yerleştirip çalıştırarak YDF kitaplığını yükleyin:
    !pip install ydf -U
  3. Aşağıdaki kitaplıkları içe aktarın:
    import ydf
    import numpy as np
    import pandas as pd

Palmer Penguins veri kümesi

Bu Colab'da, üç penguen türünün boyut ölçümlerini içeren Palmer Penguins veri kümesi kullanılır:

  • Çene kayışı
  • Gentoo
  • Adelie

Bu bir sınıflandırma problemidir. Amaç, Palmer's Penguins veri kümesindeki verilere göre penguen türünü tahmin etmektir. Penguenleri aşağıda bulabilirsiniz:

Üç farklı penguen türü.

Şekil 16. Üç farklı penguen türü. Resim: @allisonhorst

 

Aşağıdaki kod, Palmer Penguins veri kümesini belleğe yüklemek için bir pandas işlevi çağırır:

path = "https://storage.googleapis.com/download.tensorflow.org/data/palmer_penguins/penguins.csv"
dataset = pd.read_csv(path)
label = "species"

# Display the first 3 examples.
dataset.head(3)

Aşağıdaki tabloda, Palmer Penguins veri kümesindeki ilk 3 örnek biçimlendirilmiştir:

Tablo 3. Palmer Penguins'daki ilk 3 örnek

tür ada bill_length_mm bill_depth_mm flipper_length_mm body_mass_g seks yıl
0 Adelie Torgersen 39,1 18,7 181,0 3750,0 erkek 2007
1 Adelie Torgersen 39,5 17,4 186,0 3.800,0 kadın 2007
2 Adelie Torgersen 40,3 18,0 195,0 3250,0 kadın 2007

Tam veri kümesi, sayısal (örneğin, bill_depth_mm), kategorik (örneğin, island) ve eksik özelliklerin bir karışımını içerir. Karar ağaçları, sinir ağlarından farklı olarak bu özellik türlerinin tümünü doğal olarak destekler. Bu nedenle tek sıcak kodlama, normalleştirme veya ek is_present özelliği yapmanız gerekmez.

Aşağıdaki kod hücresi, veri kümesini eğitim kümesi ve test kümesine ayırır:

# Use the ~20% of the examples as the testing set
# and the remaining ~80% of the examples as the training set.
np.random.seed(1)
is_test = np.random.rand(len(dataset)) < 0.2

train_dataset = dataset[~is_test]
test_dataset = dataset[is_test]

print("Training examples: ", len(train_dataset))
# >> Training examples: 272

print("Testing examples: ", len(test_dataset))
# >> Testing examples: 72

Varsayılan hiper parametrelerle karar ağacı eğitimi

İlk karar ağacınızı, herhangi bir hiper parametre belirtmeden CART (Sınıflandırma ve Regresyon Ağaçları) öğrenme algoritmasıyla (öğrenen olarak da bilinir) eğitebilirsiniz. Bunun nedeni, ydf.CartLearneröğreneninin iyi varsayılan hiper parametre değerleri sağlamasıdır. Bu tür modellerin işleyiş şekli hakkında daha fazla bilgiyi kursun ilerleyen bölümlerinde bulabilirsiniz.

model = ydf.CartLearner(label=label).train(train_dataset)

Önceki çağrıda, giriş özelliği olarak kullanılacak sütunlar belirtilmedi. Bu nedenle, eğitim veri kümesindeki her sütun kullanılır. Ayrıca, çağrıda giriş özelliklerinin semantiği (ör. sayısal, kategorik, metin) belirtilmemiştir. Bu nedenle, özellik semantikleri otomatik olarak çıkarılır.

Elde edilen karar ağacını görüntülemek için model.plot_tree() işlevini çağırın:

model.plot_tree()

Colab'da, fareyi kullanarak belirli öğelerle ilgili ayrıntıları (ör. her düğümdeki sınıf dağılımı) görüntüleyebilirsiniz.

Varsayılan hiper parametrelerle eğitilmiş bir karar ağacı.

Şekil 17. Varsayılan hiper parametrelerle eğitilmiş bir karar ağacı.

Colab, kök koşulun 243 örnek içerdiğini gösterir. Ancak eğitim veri kümesinin 272 örnek içerdiğini hatırlayabilirsiniz. Kalan 29 örnek, doğrulama ve ağaç budama için otomatik olarak ayrılmıştır.

İlk koşul, bill_depth_mm değerini test eder. 4. ve 5. tablolarda, ilk koşulun sonucuna bağlı olarak farklı türlerin olasılığı gösterilmektedir.

Tablo 4. bill_depth_mm ≥ 42.3 ise farklı türlerin olasılığı

Tür Olasılık
Adelie (kırmızı) %8
Gentoo (mavi) %58
Çene kayışı (yeşil) %36

 

Tablo 5. Farklı türlerin olasılığı (varsa) bill_depth_mm < 42.3

Tür Olasılık
Adelie (kırmızı) %97
Gentoo (mavi) %2
Çene kayışı (yeşil) %0

bill_depth_mm sayısal bir özelliktir. Bu nedenle, sayısal özelliklere sahip ikili sınıflandırma için tam bölme algoritması kullanılarak 42,3 değeri bulundu.

bill_depth_mm ≥ 42.3 doğruysa flipper_length_mm ≥ 207.5'ün Gentoos'u Gentoos+Adelie'den neredeyse mükemmel bir şekilde ayırıp ayıramayacağını daha ayrıntılı bir şekilde test edin.

Aşağıdaki kod, modelin eğitim ve test doğruluğunu sağlar:

train_evaluation = model.evaluate(train_dataset)
print("train accuracy:", train_evaluation.accuracy)
# >> train accuracy:  0.9338

test_evaluation = model.evaluate(test_dataset)
print("test accuracy:", test_evaluation.accuracy)
# >> test accuracy:  0.9167

Test doğruluğunun eğitim doğruluğundan yüksek olması nadir bir durumdur ancak mümkündür. Bu durumda, test veri kümesi eğitim veri kümesinden farklı olabilir. Ancak bu örnekte, eğitim ve test verileri rastgele bölündüğü için bu durum söz konusu değildir. Daha olası bir açıklama, test veri kümesinin çok küçük olması (yalnızca 72 örnek) ve bu nedenle doğruluk tahmininin gürültülü olmasıdır.

Pratikte, bu kadar küçük bir veri kümesi için daha doğru değerlendirme metriği değerleri hesaplayacağından çapraz doğrulama kullanmak tercih edilir. Ancak bu örnekte, basitlik açısından eğitim ve test işlemine devam ediyoruz.

Model hiperparametrelerini iyileştirme

Model, varsayılan hiper parametre değerleriyle eğitilmiş tek bir karar ağacıdır. Daha iyi tahminler elde etmek için:

  1. Rastgele orman veya gradyan destekli ağaçlar modeli gibi daha güçlü bir öğrenici kullanın. Bu öğrenme algoritmaları bir sonraki sayfada açıklanacaktır.

  2. Gözlemlerinizi ve sezgilerinizi kullanarak hiperparametreyi optimize edin. Model iyileştirme kılavuzu bu konuda faydalı olabilir.

  3. Çok sayıda olası hiperparametreyi otomatik olarak test etmek için hiperparametre ayarlama özelliğini kullanın.

Random forest ve gradyan destekli ağaçlar algoritmasını henüz görmediğimiz ve örnek sayısı otomatik hiper parametre ayarı yapmak için çok az olduğu için modeli manuel olarak iyileştireceksiniz.

Yukarıda gösterilen karar ağacı küçüktür ve 61 örneğin bulunduğu yaprak, Adelie ve Chinstrap etiketlerinin bir karışımını içerir. Algoritma bu yaprağı neden daha fazla bölmemiştir? Bunun iki nedeni olabilir:

  • Yaprak başına minimum örnek sayısına (varsayılan olarak min_examples=5) ulaşılmış olabilir.
  • Ağaç, aşırı uyumu önlemek için bölünmüş ve ardından budanmış olabilir.

Minimum örnek sayısını 1'e indirin ve sonuçları görün:

model = ydf.CartLearner(label=label, min_examples=1).train(train_dataset)
model.plot_tree()

min_examples=1 ile eğitilmiş bir karar ağacı.

Şekil 18. min_examples=1 ile eğitilmiş bir karar ağacı.

 

61 örnek içeren yaprak düğüm, birden çok kez daha bölünmüştür.

Nodu daha da bölmenin değerli olup olmadığını görmek için test veri kümesinde bu yeni modelin kalitesini değerlendiririz:

print(model.evaluate(test_dataset).accuracy)
# >> 0.97222

Test doğruluğu 0,9167'den 0,97222'ye çıkarak modelin kalitesi arttı. Bu hiper parametre değişikliği iyi bir fikirdi.

Karar ormanlarının önceki hali

Hiper parametreleri iyileştirmeye devam ederek muhtemelen mükemmel bir doğruluğa ulaşabiliriz. Ancak bu manuel işlem yerine, rastgele orman gibi daha güçlü bir model eğitebilir ve daha iyi çalışıp çalışmadığını görebiliriz.

model = ydf.RandomForestLearner(label=label).train(train_dataset)
print("Test accuracy: ", model.evaluate(test_dataset).accuracy)
# >> Test accuracy: 0.986111

Rastgele ormanın doğruluğu, basit ağacımızdan daha iyidir. Bunun nedenini sonraki sayfalarda öğreneceksiniz.

Kullanım ve sınırlama

Daha önce de belirtildiği gibi, tek bir karar ağacının kalitesi genellikle rastgele ormanlar, gradyan destekli ağaçlar ve sinir ağları gibi modern makine öğrenimi yöntemlerinden daha düşüktür. Ancak karar ağaçlarının aşağıdaki durumlarda hâlâ faydalı olduğu söylenebilir:

  • Daha karmaşık yaklaşımları değerlendirmek için basit ve ucuz bir temel olarak.
  • Model kalitesi ile yorumlanabilirlik arasında bir denge kurulamadığında
  • Karar ormanları modelinin yorumlanması için bir proxy olarak kullanılır. Bu model, kursta daha sonra ele alınacaktır.