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