Karar ağacı oluşturma

Bu ünitede, karar ağacını eğitmek ve yorumlamak için YDF (Yggdrasil Karar Ormanı) kitaplığını kullanacaksınız.

Bu birim, 🧭 YDF'ye Başlarken eğitiminden esinlenmiştir.

Hazırlıklar

Veri kümesini incelemeden önce şunları 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 Penguenleri veri kümesi

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

  • Chinstrap
  • Gentoo
  • Adelie

Bu bir sınıflandırma sorunudur. Amaç, Palmer's Penguins veri kümesindeki verilere göre penguen türünü tahmin etmektir. Penguenler:

Üç farklı penguen türü.

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

 

Aşağıdaki kod, Palmer Penguenleri veri kümesini belleğe yüklemek için bir pandas işlevini ç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 Penguenleri veri kümesindeki ilk 3 örnek biçimlendirilmiştir:

Tablo 3. Palmer Penguenleri'ndeki 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 3800,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. Sinir ağlarının aksine, karar ormanları tüm bu özellik türlerini 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ümesi olarak 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 hiperparametrelerle karar ağaçlarını eğitme

Hiçbir hiperparametre belirtmeden CART (Classification and Regression Trees) öğrenme algoritması (diğer adıyla öğrenen) ile ilk karar ağacınızı eğitebilirsiniz. Bunun nedeni, ydf.CartLearner öğrenicisinin iyi varsayılan hiperparametre değerleri sağlamasıdır. Bu tür modellerin işleyiş şekli hakkında daha fazla bilgiyi kursun ilerleyen bölümlerinde edineceksiniz.

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

Önceki çağrıda, giriş özellikleri olarak kullanılacak sütunlar belirtilmedi. Bu nedenle, eğitim setindeki her sütun kullanılır. Ayrıca, çağrıda giriş özelliklerinin semantiği (örneğin, sayısal, kategorik, metin) de belirtilmedi. Bu nedenle, özellik semantiği 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'de, her 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österiyor. 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. Tablo 4 ve 5'te, ilk koşulun sonucuna bağlı olarak farklı türlerin olasılığı gösterilmektedir.

Tablo 4. Farklı türlerin olasılığı (bill_depth_mm ≥ 42.3 )

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ığı 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, 42,3 değeri sayısal özelliklere sahip ikili sınıflandırma için tam bölme algoritması kullanılarak bulunmuştur.

bill_depth_mm ≥ 42.3 Doğru ise flipper_length_mm ≥ 207.5'nin Gentooları ve Gentoolar+Adelie'yi neredeyse mükemmel şekilde ayırıp ayıramadığı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

Test doğruluğunun eğitim doğruluğundan yüksek olması nadir olsa da 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. Daha olası bir açıklama ise test veri kümesinin çok küçük olmasıdır (yalnızca 72 örnek). Bu nedenle doğruluk tahmini gürültülüdür.

Uygulamada, 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 adına eğitim ve test işlemine devam ediyoruz.

Model hiperparametrelerini iyileştirme

Bu 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 artırılmış ağaçlar modeli gibi daha güçlü bir öğrenme algoritması kullanın. Bu öğrenme algoritmaları sonraki sayfada açıklanacaktır.

  2. Gözlemlerinizi ve sezgilerinizi kullanarak hiperparametreleri optimize edin. Model geliştirme kılavuzu size yardımcı olabilir.

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

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

Yukarıda gösterilen karar ağacı küçüktür ve 61 örneğin bulunduğu yaprakta Adelie ve Chinstrap etiketlerinin bir karışımı yer alır. Algoritma bu yaprağı neden daha fazla bölmedi? Bunun iki nedeni olabilir:

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

Minimum örnek sayısını 1'e düşürün ve sonuçları inceleyin:

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.

Düğümü daha fazla bölmenin faydalı olup olmadığını görmek için bu yeni modelin test veri kümesindeki kalitesini değerlendiririz:

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

Modelin kalitesi, test doğruluğunun 0,9167'den 0,97222'ye yükselmesiyle arttı. Hiperparametrelerde yapılan bu değişiklik iyi bir fikirdi.

Karar ormanlarının önizlemesi

Hiperparametreleri 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 modeli eğitebilir ve daha iyi sonuçlar elde edip edemeyeceğimizi 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ı genellikle rastgele ormanlar, gradyan artırılmış ağaçlar ve sinir ağları gibi modern makine öğrenimi yöntemlerine kıyasla daha düşük kalitelidir. Ancak karar ağaçları aşağıdaki durumlarda hâlâ 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 kurulması gerektiğinde.
  • Kursun ilerleyen bölümlerinde ele alınacak olan karar ormanları modelinin yorumlanması için bir vekil olarak.