Membuat pohon keputusan (decision tree)

Di unit ini, Anda akan menggunakan pelatihan library YDF (Yggdrasil Decision Forest) dan menafsirkan pohon keputusan.

Unit ini terinspirasi dari tutorial 🧭 YDF Getting Started.

Persiapan

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

  1. Buat notebook Colab baru.
  2. Instal library YDF dengan menempatkan dan menjalankan 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
  • Adelia

Ini adalah masalah klasifikasi—tujuannya adalah untuk memprediksi spesies penguin berdasarkan data di {i>dataset<i} Penguin Palmer. Berikut adalah penguin:

Tiga spesies penguin
yang berbeda.

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

 

Kode berikut memanggil fungsi pandas untuk memuat set data 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 set data Palmer Penguins:

Tabel 3. 3 contoh pertama di Palmer Penguins

spesies pulau bill_length_mm bill_depth_mm flipper_length_mm body_mass_g gender tahun
0 Adelia Torersen 39,1 18,7 181,0 3750,0 laki-laki 2007
1 Adelia Torersen 39,5 17,4 186,0 3800,0 perempuan 2007
2 Adelia Torersen 40,3 18,0 195,0 3250,0 perempuan 2007

Set data lengkap berisi campuran numerik (misalnya, bill_depth_mm), kategori (misalnya, island), dan fitur yang tidak ada. Tidak seperti jaringan neural, forest keputusan mendukung semua jenis fitur ini secara native sehingga Anda tidak perlu melakukan encoding one-hot, normalisasi, atau fitur is_present tambahan.

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

# 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 dengan algoritma pembelajaran CART (Classification and Regression Trees) (alias pelajar) tanpa menentukan hyperparameter apa pun. Hal ini karena pelajar ydf.CartLearner memberikan nilai hyperparameter default yang baik. Anda akan mempelajari lebih lanjut tentang cara kerja jenis model ini nanti di materi ini.

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

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

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 distribusi class di setiap node.

Pohon keputusan yang dilatih dengan hyperparameter default.

Gambar 17. Pohon keputusan yang dilatih dengan hyperparameter default.

Colab menunjukkan bahwa kondisi root berisi 243 contoh. Namun, Anda mungkin ingat bahwa set data pelatihan berisi 272 contoh. 29 contoh lainnya telah dipesan secara otomatis untuk divalidasi dan pemangkasan pohon.

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

Tabel 4. Kemungkinan spesies yang berbeda jika bill_depth_mm ≥ 42.3

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

 

Tabel 5. Kemungkinan spesies yang berbeda jika bill_depth_mm < 42.3

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

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

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

Kode berikut memberikan pelatihan dan pengujian akurasi 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

Meskipun jarang terjadi, akurasi pengujian lebih tinggi daripada akurasi pelatihan. Dalam hal ini, set pengujian mungkin berbeda dengan set pelatihan. Namun, hal ini tidak berlaku di sini karena pelatihan & pengujian dibagi secara acak. Penjelasan yang lebih mungkin adalah set data pengujian sangat kecil (hanya 72 contoh), sehingga estimasi akurasinya tidak stabil.

Dalam praktiknya, untuk set data kecil seperti itu, penggunaan validasi silang akan lebih disukai karena akan menghitung nilai metrik evaluasi yang lebih akurat. Namun, dalam contoh ini, kami melanjutkan dengan pelatihan & pengujian agar lebih mudah.

Meningkatkan kualitas hyperparameter model

Model ini adalah satu pohon keputusan yang dilatih dengan nilai hyperparameter default. Untuk mendapatkan prediksi yang lebih baik, Anda dapat:

  1. Gunakan pelajar yang lebih canggih seperti hutan acak atau model pohon yang ditingkatkan gradien. Algoritma pembelajaran tersebut akan dijelaskan di halaman berikutnya.

  2. Mengoptimalkan hyperparameter menggunakan pengamatan dan intuisi Anda. Panduan peningkatan model dapat membantu.

  3. Gunakan penyesuaian hyperparameter untuk otomatis menguji sejumlah besar kemungkinan hyperparameter.

Karena kita belum melihat algoritma hutan dan gradien yang meningkatkan hierarki secara acak, dan karena jumlah contoh terlalu kecil untuk melakukan penyesuaian hyperparameter otomatis, maka 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 bagian ini lebih lanjut? Ada dua kemungkinan alasan:

  • Jumlah minimum sampel per daun (min_examples=5 secara default) mungkin telah tercapai.
  • Hierarki mungkin telah dibagi, lalu 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 daun yang berisi 61 contoh telah dibagi lebih lanjut beberapa kali.

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

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

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

Sebelumnya dari forest keputusan

Dengan terus meningkatkan hyperparameter, kita mungkin bisa mencapai akurasi yang sempurna. Namun, sebagai ganti proses manual ini, kita dapat melatih model yang lebih canggih seperti forest acak dan melihat 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

Keakuratan hutan acak lebih baik daripada pohon sederhana. Anda akan mempelajari alasannya di halaman berikutnya.

Penggunaan dan batasan

Seperti yang disebutkan sebelumnya, satu pohon keputusan sering kali memiliki kualitas yang lebih rendah daripada metode machine learning modern, seperti forest acak, pohon yang ditingkatkan gradien, dan jaringan neural. Namun, pohon keputusan masih berguna dalam kasus-kasus berikut:

  • Sebagai dasar pengukuran sederhana dan murah untuk mengevaluasi pendekatan yang lebih kompleks.
  • Ketika ada keseimbangan antara kualitas model dan penafsiran.
  • Sebagai proxy untuk interpretasi model forest keputusan, yang akan dipelajari nanti dalam kursus.