Membuat pohon keputusan (decision tree)

Dalam unit ini, Anda akan menggunakan YDF (Yggdrasil) Decision Forest) melatih dan menafsirkan pohon keputusan.

Unit ini terinspirasi dari 🧭 Memulai YDF tutorial.

Persiapan

Sebelum mempelajari {i>dataset<i}, lakukan hal berikut:

  1. Buat Colab baru notebook.
  2. Instal library YDF dengan menempatkan dan mengeksekusi baris kode berikut di notebook Colab baru Anda:
    !pip install ydf -U
    
  3. Impor library berikut:
    import ydf
    import numpy as np
    import pandas as pd
    

{i>Dataset<i} Palmer Penguins

Colab ini menggunakan Set data Palmer Penguins, yang berisi pengukuran ukuran untuk tiga spesies penguin:

  • Tali Dagu
  • Gentoo
  • Adelie

Ini adalah masalah klasifikasi—tujuannya adalah untuk memprediksi spesies penguin berdasarkan data dalam {i>dataset <i}Palmer's Penguins. Berikut gambar-gambar penguin tersebut:

Tiga penguin yang berbeda
spesies.

Gambar 16. Tiga spesies penguin yang berbeda. Gambar oleh @allisonhorst

 

Kode berikut memanggil objek panda untuk memuat {i>dataset<i} Palmer Penguins ke dalam memori:

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)

Tabel berikut memformat 3 contoh pertama dalam Palmer Penguins {i>dataset<i}:

Tabel 3. 3 contoh pertama pada Penguin Palmer

spesies pulau bill_length_mm bill_depth_mm flipper_length_mm body_mass_g seks tahun
0 Adelie Torgersen 39,1 18,7 181,0 3.750,0 laki-laki 2007
1 Adelie Torgersen 39,5 17,4 186,0 3.800,0 perempuan 2007
2 Adelie Torgersen 40,3 18,0 195,0 3.250,0 perempuan 2007

Set data lengkap berisi campuran angka (misalnya, bill_depth_mm), kategorikal (misalnya, island), dan fitur yang tidak ada. Tidak seperti jaringan neural hutan keputusan mendukung semua jenis fitur ini secara native, sehingga Anda tidak harus melakukan pengkodean one-hot, normalisasi, atau fitur is_present tambahan.

Sel kode berikut membagi set data menjadi set pelatihan dan pengujian ditetapkan:

# 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

Melatih pohon keputusan dengan hyperparameter default

Anda dapat melatih pohon keputusan pertama Anda dengan CART (Klasifikasi dan Algoritma pembelajaran Pohon Regresi) (alias pelajar) tanpa menentukan hyperparameter. Hal itu karena pelajar ydf.CartLearner memberikan nilai default yang baik nilai hyperparameter. Anda akan mempelajari lebih lanjut cara kerja jenis model ini dalam materi ini nanti.

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

Panggilan sebelumnya tidak menentukan kolom yang akan digunakan fitur input. Oleh karena itu, setiap kolom dalam set pelatihan digunakan. Panggilan juga tidak menentukan semantik (misalnya, numerik, kategoris, teks) fitur input. Oleh karena itu, semantik fitur disimpulkan secara otomatis.

Panggil model.plot_tree() untuk menampilkan pohon keputusan yang dihasilkan:

model.plot_tree()

Di Colab, Anda dapat menggunakan mouse untuk menampilkan detail tentang elemen tertentu seperti sebagai distribusi class di setiap node.

Pohon keputusan yang dilatih dengan
hyperparameter.

Gambar 17. Pohon keputusan yang dilatih dengan hyperparameter default.

Colab menunjukkan bahwa kondisi root berisi 243 contoh. Namun, Anda mungkin ingat bahwa {i>dataset<i} pelatihan berisi 272 contoh. 29 sisanya contoh telah disimpan secara otomatis untuk validasi dan pemangkasan pohon.

Kondisi pertama menguji nilai bill_depth_mm. Tabel 4 dan 5 menunjukkan kemungkinan spesies yang berbeda tergantung pada hasil kondisi pertama.

Tabel 4. Kemungkinan spesies berbeda jika bill_depth_mm ≥ 42.3

Spesies Kecenderungan
Adelie (merah) 8%
Gentoo (biru) 58%
Chinstrap (hijau) 36%

 

Tabel 5. Kemungkinan spesies yang berbeda jika bill_depth_mm < 42.3

Spesies Kecenderungan
Adelie (merah) 97%
Gentoo (biru) 2%
Chinstrap (hijau) 0%

bill_depth_mm adalah fitur numerik. Oleh karena itu, nilai 42,3 ditemukan menggunakan pemisahan tepat untuk klasifikasi biner dengan fitur.

Jika bill_depth_mm ≥ 42.3 Benar, uji lebih lanjut apakah flipper_length_mm ≥ 207.5 dapat memisahkan hampir secara sempurna Gentoos dan dari gentoos+Adelie.

Kode berikut memberikan akurasi pelatihan dan pengujian model:

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

Ini jarang, tetapi mungkin terjadi, akurasi pengujian lebih tinggi daripada pelatihan tingkat akurasi. Dalam hal ini, set pengujian mungkin berbeda dari set pelatihan. Namun, hal ini tidak berlaku di sini seperti kereta & tes dipisah secara acak. Penjelasan yang lebih mungkin adalah set data pengujiannya sangat kecil (hanya 72 contoh), sehingga estimasi akurasinya tidak jelas.

Dalam praktiknya, untuk {i>dataset<i} sekecil itu, menggunakan validasi silang akan lebih disukai karena akan menghitung nilai metrik evaluasi yang lebih akurat. Namun, dalam contoh ini, kami melanjutkan dengan pelatihan & pengujian demi kesederhanaan.

Meningkatkan hyperparameter model

Modelnya adalah pohon keputusan tunggal yang dilatih dengan hyperparameter default masing-masing. Untuk mendapatkan prediksi yang lebih baik, Anda dapat:

  1. Gunakan pelajar yang lebih handal, seperti forest acak atau pohon yang didukung gradien model transformer. Algoritma pembelajaran tersebut akan dijelaskan di halaman berikutnya.

  2. Optimalkan hyperparameter menggunakan pengamatan dan intuisi Anda. Tujuan panduan peningkatan kualitas model dapat membantu.

  3. Menggunakan penyesuaian hyperparameter untuk menguji secara otomatis sejumlah besar kemungkinan hyperparameter.

Karena kita belum melihat hutan acak dan pohon yang didukung gradien dan karena jumlah contoh terlalu sedikit untuk melakukan pengujian penyesuaian hyperparameter, Anda akan meningkatkan kualitas model secara manual.

Pohon keputusan yang ditampilkan di atas berukuran kecil, dan daun dengan 61 contoh berisi campuran label Adelie dan Chinstrap. Mengapa algoritma tidak membagi daun ini lebih lanjut? Ada dua kemungkinan alasan:

  • Jumlah minimum sampel per daun (min_examples=5 secara default) dapat memiliki tercapai.
  • Pohon mungkin telah dibagi dan kemudian dipangkas untuk mencegah overfitting.

Kurangi jumlah minimum contoh menjadi 1 dan lihat hasilnya:

model = ydf.CartLearner(label=label, min_examples=1).train(train_dataset)
model.plot_tree()

Pohon keputusan yang dilatih dengan
min_examples=1.

Gambar 18. Pohon keputusan yang dilatih dengan min_examples=1.

 

Node {i>leaf<i} yang berisi 61 contoh telah dibagi lebih lanjut dengan beberapa kali.

Untuk melihat apakah pembagian node lebih lanjut bermanfaat, kami mengevaluasi kualitas model baru ini pada set data pengujian:

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

Kualitas model telah meningkat dengan akurasi pengujian mulai dari 0,9167 hingga 0,97222. Perubahan hyperparameter ini adalah ide bagus.

Hutan keputusan sebelumnya

Dengan terus meningkatkan hyperparameter, kita mungkin bisa mencapai tingkat akurasi. Namun, alih-alih menggunakan proses manual ini, kita dapat melatih model seperti forest acak dan lihat apakah model tersebut berfungsi lebih baik.

model = ydf.RandomForestLearner(label=label).train(pandas_train_dataset)
print("Test accuracy: ", model.evaluate(pandas_test_dataset).accuracy)
# >> Test accuracy: 0.986111

Akurasi forest acak lebih baik daripada pohon sederhana kita. Anda akan pelajari alasannya di halaman berikutnya.

Penggunaan dan batasan

Seperti yang disebutkan sebelumnya, pohon keputusan tunggal sering kali memiliki kualitas yang lebih rendah daripada modern metode machine learning seperti hutan acak, pohon yang ditingkatkan gradien, dan jaringan. Namun, pohon keputusan tetap berguna dalam kasus berikut:

  • Sebagai dasar yang sederhana dan murah untuk mengevaluasi pendekatan yang lebih kompleks.
  • Ketika ada imbal balik antara kualitas model dan penafsiran.
  • Sebagai proxy untuk penafsiran model hutan keputusan, yang materi ini akan dipelajari nanti.