Dalam unit ini, Anda akan menggunakan library YDF (Yggdrasil Decision Forest) untuk melatih dan menafsirkan pohon keputusan.
Unit ini terinspirasi dari tutorial 🧭 Memulai YDF.
Persiapan
Sebelum mempelajari set data, lakukan hal berikut:
- Buat notebook Colab baru.
- Instal library YDF dengan menempatkan dan menjalankan baris kode berikut
di notebook Colab baru Anda:
!pip install ydf -U
- Impor library berikut:
import ydf import numpy as np import pandas as pd
Set data Penguin Palmer
Colab ini menggunakan set data Penguin Palmer, yang berisi pengukuran ukuran untuk tiga spesies penguin:
- Chinstrap
- Gentoo
- Adelie
Ini adalah masalah klasifikasi—sasarannya adalah memprediksi spesies penguin berdasarkan data dalam set data Penguin Palmer. Berikut adalah penguin:
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 | seks | tahun | |
---|---|---|---|---|---|---|---|---|
0 | Adelie | Torgersen | 39,1 | 18,7 | 181,0 | 3750,0 | laki-laki | 2007 |
1 | Adelie | Torgersen | 39,5 | 17,4 | 186,0 | 3800,0 | perempuan | 2007 |
2 | Adelie | Torgersen | 40,3 | 18,0 | 195,0 | 3250,0 | perempuan | 2007 |
Set data lengkap berisi campuran fitur numerik (misalnya, bill_depth_mm
), kategoris (misalnya, island
), dan fitur yang tidak ada. Tidak seperti jaringan neural, hutan 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 hierarki keputusan pertama dengan algoritma pembelajaran CART (Hierarki Klasifikasi dan Regresi) (alias pembelajar) tanpa menentukan hyperparameter apa pun.
Hal ini karena pembelajar ydf.CartLearner
memberikan nilai hyperparameter default yang baik. Anda akan mempelajari lebih lanjut cara kerja jenis model ini
nanti dalam kursus.
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 akan digunakan. Panggilan juga tidak menentukan semantik (misalnya, numerik, kategoris, teks) dari fitur input. Oleh karena itu, semantik fitur akan otomatis disimpulkan.
Panggil model.plot_tree()
untuk menampilkan hierarki keputusan yang dihasilkan:
model.plot_tree()
Di Colab, Anda dapat menggunakan mouse untuk menampilkan detail tentang elemen tertentu seperti distribusi class di setiap node.
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. Sisa 29 contoh telah dicadangkan secara otomatis untuk validasi dan pemangkasan hierarki.
Kondisi pertama menguji nilai bill_depth_mm
. Tabel 4 dan 5 menunjukkan kemungkinan berbagai spesies, bergantung pada hasil kondisi pertama.
Tabel 4. Kemungkinan spesies yang 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 algoritma pemisahan persis untuk klasifikasi biner dengan fitur numerik.
Jika bill_depth_mm ≥ 42.3
adalah Benar, pengujian lebih lanjut apakah
flipper_length_mm ≥ 207.5
dapat hampir memisahkan Gentoo dan dari Gentoo+Adelie dengan sempurna.
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
Hal ini jarang terjadi, tetapi mungkin saja akurasi pengujian lebih tinggi daripada akurasi pelatihan. Dalam hal ini, set pengujian mungkin berbeda dari 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 berisi derau.
Dalam praktiknya, untuk set data yang kecil, sebaiknya gunakan validasi silang karena akan menghitung nilai metrik evaluasi yang lebih akurat. Namun, dalam contoh ini, kita melanjutkan dengan pelatihan & pengujian untuk memudahkan.
Meningkatkan hyperparameter model
Model ini adalah satu pohon keputusan yang dilatih dengan nilai hyperparameter default. Untuk mendapatkan prediksi yang lebih baik, Anda dapat:
Gunakan pengalih yang lebih canggih seperti random forest atau model gradient boosted trees. Algoritma pembelajaran tersebut akan dijelaskan di halaman berikutnya.
Mengoptimalkan hyperparameter menggunakan pengamatan dan intuisi Anda. Panduan peningkatan model dapat membantu.
Gunakan penyesuaian hyperparameter untuk menguji secara otomatis sejumlah besar kemungkinan hyperparameter.
Karena kita belum melihat algoritma random forest dan gradient boosted trees, dan karena jumlah contoh terlalu kecil untuk melakukan penyesuaian hyperparameter otomatis, Anda akan meningkatkan model secara manual.
Pohon keputusan yang ditampilkan di atas berukuran kecil, dan node daun dengan 61 contoh berisi campuran label Adelie dan Chinstrap. Mengapa algoritma tidak membagi node 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()
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, kita mengevaluasi kualitas model baru ini pada set data pengujian:
print(model.evaluate(test_dataset).accuracy)
# >> 0.97222
Kualitas model telah meningkat dengan akurasi pengujian dari 0,9167 menjadi 0,97222. Perubahan hyperparameter ini adalah ide yang bagus.
Sebelumnya di hutan keputusan
Dengan terus meningkatkan hyperparameter, kita mungkin dapat mencapai akurasi yang sempurna. Namun, sebagai ganti proses manual ini, kita dapat melatih model yang lebih canggih seperti random forest dan melihat apakah model tersebut berfungsi lebih baik.
model = ydf.RandomForestLearner(label=label).train(train_dataset)
print("Test accuracy: ", model.evaluate(test_dataset).accuracy)
# >> Test accuracy: 0.986111
Akurasi random forest lebih baik daripada hierarki sederhana kita. 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 hutan acak, gradient boosted trees, dan jaringan neural. Namun, pohon keputusan masih berguna dalam kasus berikut:
- Sebagai dasar pengukuran yang sederhana dan murah untuk mengevaluasi pendekatan yang lebih kompleks.
- Jika ada kompromi antara kualitas model dan interpretasi.
- Sebagai proxy untuk interpretasi model hutan keputusan, yang akan dipelajari dalam kursus nanti.