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:
- Yeni bir Colab not defteri oluşturun.
- 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
- 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:
Ş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.
Ş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:
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.
Gözlemlerinizi ve sezgilerinizi kullanarak hiperparametreyi optimize edin. Model iyileştirme kılavuzu bu konuda faydalı olabilir.
Ç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()
Ş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.