Karar ağacı oluşturma

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

Bu ünite, 🧭 YDF Başlarken eğitiminden esinlenilmiştir.

Hazırlıklar

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

  1. Yeni bir Colab not defteri oluşturun.
  2. Aşağıdaki kod satırını yeni Colab not defterinize 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'de, üç penguen türünün boyut ölçümlerini içeren Palmer Penguins veri kümesi kullanılmaktadır:

  • Çene Kayışlı
  • Gentoo
  • Adelie

Bu bir sınıflandırma problemidir. Amaç, Palmer'ın Penguins veri kümesindeki verilere dayanarak penguen türünü tahmin etmektir. Penguenler şunlar:

Üç 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çimlendirilmektedir:

Tablo 3. Palmer Penguins'deki ilk 3 örnek

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

Veri kümesinin tamamında sayısal (örneğin, bill_depth_mm), kategorik (ör. island) ve eksik özelliklerin bir karışımı bulunur. Sinir ağlarının aksine karar ormanları tüm bu özellik türlerini yerel olarak destekler. Böylece, tek sıcak kodlama, normalleştirme veya ekstra is_present özelliği yapmanız gerekmez.

Aşağıdaki kod hücresi, veri kümesini bir eğitim grubuna 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

Karar ağaçlarını varsayılan hiperparametrelerle eğitme

İlk karar ağacınızı CART (Sınıflandırma ve Regresyon Ağaçları) öğrenme algoritmasıyla (öğrenci olarak da bilinir) kullanarak herhangi bir hiperparametre belirtmeden eğitebilirsiniz. Bunun nedeni, ydf.CartLearner öğrencisinin iyi varsayılan hiperparametre değerleri sağlamasıdır. Kursun ilerleyen bölümlerinde bu modelin nasıl çalıştığı hakkında daha fazla bilgi edineceksiniz.

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

Önceki çağrı, giriş özelliği olarak kullanılacak sütunları belirtmedi. Bu nedenle, eğitim veri kümesindeki her sütun kullanılır. Çağrı, giriş özelliklerinin anlamını da (örneğin, sayısal, kategorik, metin) belirtmedi. Bu nedenle, özellik semantiği otomatik olarak tahmin edilir.

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

model.plot_tree()

Colab'de, her bir düğümdeki sınıf dağılımı gibi belirli öğelerle ilgili ayrıntıları görüntülemek için fareyi kullanabilirsiniz.

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

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

Colab, kök koşulun 243 örnek içerdiğini göstermektedir. Bununla birlikte, eğitim veri kümesinin 272 örnek içerdiğini hatırlarsınız. Geri kalan 29 örnek ise doğrulama ve ağaç budama işlemleri için otomatik olarak ayrılmıştır.

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

Tablo 4. Aşağıdaki durumlarda farklı türlerin görülme olasılığı: bill_depth_mm ≥ 42.3

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

 

Tablo 5. Şu durumlarda farklı türlerin görülme olasılığı: bill_depth_mm < 42.3

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

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

bill_depth_mm ≥ 42.3 Doğru ise flipper_length_mm ≥ 207.5 ile Gentoos+Adelie'yi neredeyse mükemmel bir şekilde ayırıp ayıramayacağını 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

Nadiren de olsa test doğruluğunun eğitim doğruluğundan daha yüksek olması mümkündür. Bu durumda, test kümesi eğitim kümesinden farklı olabilir. Ancak tren ve test rastgele bölündüğü için bu durum burada geçerli değildir. Test veri kümesinin çok küçük olması (yalnızca 72 örnek) bu durumun daha olası bir açıklamasıdır. Bu nedenle, doğruluk tahmini gürültülüdür.

Pratikte, böyle küçük bir veri kümesinde daha doğru değerlendirme metriği değerleri hesaplanacağından çapraz doğrulama kullanılması tercih edilir. Ancak bu örnekte, basit olması adına bir eğitim ve teste devam ediyoruz.

Model hiper parametrelerini geliştirme

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

  1. Rastgele orman veya gradyan güçlendirilmiş ağaçlar modeli gibi daha güçlü bir öğrenci kullanın. Bu öğrenme algoritmaları sonraki sayfada açıklanmıştır.

  2. Gözlemlerinizi ve araştırmalarınızı kullanarak hiperparametreyi optimize edin. Model iyileştirme kılavuzu faydalı olabilir.

  3. Çok sayıda olası hiperparametreyi otomatik olarak test etmek için hiperparametre ayarını kullanın.

Rastgele orman ve gradyan güçlendirilmiş ağaç algoritmasını henüz görmediğimiz ve örnek sayısı otomatik hiperparametre ayarı yapmak için çok küçük olduğundan modeli manuel olarak iyileştireceksiniz.

Yukarıda gösterilen karar ağacı küçük ve 61 örnekli yaprakta Adelie ve Chinstrap etiketlerinin bir karışımı var. Algoritma neden bu yaprağı daha uzağa bölmedi? Bunun iki nedeni olabilir:

  • Yaprak başına minimum örnek sayısına (varsayılan olarak min_examples=5) ulaşılmış olabilir.
  • Ağaç bölünüp fazla oturmayı önlemek için budanmış olabilir.

Minimum örnek sayısını 1'e indirip 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 fazla bölündü.

Düğümü daha fazla 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

Modelin kalitesi, 0,9167'den 0,97222'ye giden test doğruluğuyla arttı. Hiperparametre değişikliği iyi bir fikirdi.

Karanlık ormanlarda eski fotoğraf

Hiperparametreleri geliştirmeye devam ederek mükemmel bir doğruluğa ulaşabiliriz. Bununla birlikte, bu manuel işlem yerine rastgele orman gibi daha güçlü bir model eğitip bunun daha iyi çalışıp çalışmayacağını görebiliriz.

model = ydf.RandomForestLearner(label=label).train(pandas_train_dataset)
print("Test accuracy: ", model.evaluate(pandas_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 belirtildiği gibi, tek bir karar ağacı genellikle rastgele ormanlar, gradyan destekli ağaçlar ve nöral ağlar gibi modern makine öğrenimi yöntemlerinden daha düşük kaliteye sahiptir. Bununla birlikte, karar ağaçları aşağıdaki durumlarda da yararlıdır:

  • Daha karmaşık yaklaşımları değerlendirmek için basit ve ucuz bir temel olarak.
  • Model kalitesi ile yorumlanabilirlik arasında bir denge olduğunda.
  • Kursun ilerleyen kısımlarında incelenecek karar ormanları modelinin yorumlanmasında bir gösterge olarak kullanabilirsiniz.