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:
- 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 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:
Ş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.
Ş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:
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.
Gözlemlerinizi ve sezgilerinizi kullanarak hiperparametreleri optimize edin. Model geliştirme kılavuzu size yardımcı olabilir.
Ç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()
Ş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.