Decision Tree
Pendahuluan
Dalam machine learning, kita sering ingin membuat model yang tidak hanya akurat, tetapi juga mudah dijelaskan. Decision Tree menjadi salah satu metode yang sangat baik untuk tujuan ini karena logikanya menyerupai cara manusia mengambil keputusan, yaitu melalui serangkaian pertanyaan.
Contoh pertanyaan yang dapat dimodelkan dengan decision tree:
- Apakah seorang nasabah layak menerima pinjaman?
- Apakah suatu email termasuk spam atau bukan?
- Apakah pelanggan akan membeli suatu produk?
- Apakah pasien termasuk kategori risiko tinggi?
Pada setiap langkah, model akan memilih fitur yang paling baik untuk memisahkan data. Proses ini terus diulang sampai data pada tiap cabang semakin homogen atau sampai aturan penghentian terpenuhi.
Konsep Dasar Decision Tree
Decision tree terdiri dari beberapa komponen utama.
- Root node: simpul pertama yang mewakili pemisahan awal terbaik.
- Internal node: simpul percabangan yang masih membagi data lagi.
- Branch: jalur hasil keputusan dari suatu kondisi.
- Leaf node: simpul akhir yang berisi hasil klasifikasi atau prediksi.
- Feature: atribut yang digunakan untuk memisahkan data.
- Threshold: nilai batas yang digunakan untuk split pada fitur numerik.
Tujuan utama decision tree adalah membentuk kelompok data yang semakin murni, yaitu data dalam satu kelompok semakin didominasi oleh kelas yang sama.
Cara Kerja Decision Tree secara Intuitif
Mulai dari seluruh data
Semua data diletakkan pada simpul awal atau root node.
Evaluasi semua kandidat split
Setiap fitur diuji untuk melihat seberapa baik fitur tersebut memisahkan kelas target.
Pilih split terbaik
Split terbaik adalah split yang menghasilkan data paling homogen setelah dipisahkan.
Bentuk cabang baru
Data dibagi menjadi beberapa subset sesuai hasil split.
Ulangi proses secara rekursif
Pada setiap subset, proses evaluasi split dilakukan lagi sampai kondisi berhenti tercapai.
Hasil akhir berada pada leaf node
Setiap leaf node berisi keputusan akhir, misalnya Ya atau Tidak.
Struktur Decision Tree
Secara umum, bentuk decision tree dapat dibayangkan seperti berikut:
[Apakah Gaji <= 6 juta?]
/ \
Ya Tidak
/ \
[Apakah Umur < 30?] [Tidak Membeli]
/ \
Ya Tidak
/ \
[Membeli] [Tidak Membeli]Pada ilustrasi tersebut:
- simpul paling atas adalah root node,
- pertanyaan di tengah adalah aturan split,
- cabang kiri dan kanan adalah hasil keputusan,
- simpul akhir adalah leaf node yang berisi kelas hasil prediksi.
CART: Classification and Regression Trees
Salah satu algoritma decision tree yang paling populer adalah CART (Classification and Regression Trees).
Karakteristik CART:
- dapat digunakan untuk klasifikasi maupun regresi,
- menghasilkan pohon biner,
- sederhana dan efisien,
- sering dipakai sebagai dasar dari model yang lebih kompleks seperti Random Forest.
Mengapa Perlu Mengukur Impurity?
Saat membangun decision tree, kita perlu menentukan split mana yang paling baik. Untuk itu, kita memerlukan ukuran tingkat ketidakmurnian data dalam suatu node.
Jika suatu node berisi campuran banyak kelas, node tersebut dianggap tidak murni. Sebaliknya, jika hampir semua data dalam node berasal dari kelas yang sama, node tersebut dianggap murni.
Pada CART klasifikasi, ukuran impurity yang umum dipakai adalah Gini Impurity.
Konsep Gini Impurity
Gini Impurity mengukur seberapa besar kemungkinan sebuah data akan salah diklasifikasikan jika kita memilih kelas secara acak berdasarkan proporsi kelas pada node tersebut.
Rumus Gini Impurity untuk sebuah node adalah:
Keterangan variabel:
- = tingkat impurity pada sebuah node
- = jumlah kelas
- = proporsi data pada kelas ke-
Untuk kasus dua kelas, misalnya kelas Ya dan Tidak, rumusnya dapat ditulis sebagai:
Interpretasi:
- jika semua data dalam node berasal dari satu kelas, maka nilai Gini = , artinya node sangat murni,
- semakin besar nilai Gini, semakin campuran isi node tersebut.
Nilai Gini pada Beberapa Kondisi
| Komposisi Kelas | Perhitungan | Nilai Gini |
|---|---|---|
| 100% Ya, 0% Tidak | 0.00 | |
| 80% Ya, 20% Tidak | 0.32 | |
| 50% Ya, 50% Tidak | 0.50 |
Dari tabel tersebut terlihat bahwa nilai impurity terbesar untuk dua kelas terjadi saat proporsi kelas seimbang, yaitu dan .
Gini Split
Saat mengevaluasi sebuah split, kita tidak cukup menghitung Gini pada node induk saja. Kita juga harus menghitung impurity setelah data dibagi ke beberapa cabang.
Rumus Gini Split adalah:
Keterangan variabel:
- = impurity total setelah split
- = jumlah cabang hasil split
- = jumlah data pada cabang ke-
- = jumlah seluruh data pada node sebelum split
- = nilai Gini pada cabang ke-
Split terbaik adalah split dengan nilai paling kecil.
Langkah Sistematis Membuat Decision Tree dengan Gini
Hitung distribusi kelas pada root node
Lihat berapa banyak data untuk masing-masing kelas pada seluruh dataset.
Hitung Gini root
Gunakan rumus Gini untuk mengetahui impurity awal sebelum dilakukan split.
Tentukan kandidat split
Uji setiap fitur yang mungkin digunakan untuk memisahkan data.
Hitung Gini pada masing-masing cabang
Setelah data dibagi, hitung impurity pada setiap subset hasil split.
Hitung Gini Split
Gunakan rata-rata tertimbang berdasarkan jumlah data pada masing-masing cabang.
Bandingkan semua split
Pilih split dengan nilai terkecil.
Ulangi proses pada node berikutnya
Lakukan langkah yang sama secara rekursif sampai node cukup murni atau memenuhi stopping criteria.
Contoh Dataset Sederhana
Agar prosesnya mudah dipahami, perhatikan contoh dataset berikut.
| ID | Umur | Gaji | Beli Produk |
|---|---|---|---|
| 1 | 25 | Rendah | Ya |
| 2 | 35 | Tinggi | Tidak |
| 3 | 28 | Rendah | Ya |
| 4 | 40 | Rendah | Tidak |
| 5 | 32 | Tinggi | Tidak |
| 6 | 23 | Sedang | Ya |
Target klasifikasi adalah Beli Produk dengan dua kelas: Ya dan Tidak.
Langkah 1: Hitung Gini Root
Dari dataset di atas:
- jumlah kelas Ya = 3
- jumlah kelas Tidak = 3
- total data = 6
Maka:
Sehingga nilai Gini root adalah:
Artinya, sebelum split dilakukan, data masih bercampur dan belum murni.
Langkah 2: Evaluasi Split pada Fitur Gaji
Misalkan kita mencoba split berdasarkan fitur Gaji menjadi tiga kelompok:
- Rendah: ID 1, 3, 4
- Sedang: ID 6
- Tinggi: ID 2, 5
Karena CART pada dasarnya menggunakan split biner, pada implementasi nyata kategori dapat dipisahkan menjadi dua grup. Namun untuk pemahaman konsep, distribusi kelas tiap kelompok tetap dapat dianalisis terlebih dahulu.
Kelompok Gaji = Rendah
Komposisi kelas:
- Ya = 2
- Tidak = 1
- Total = 3
Kelompok Gaji = Sedang
Komposisi kelas:
- Ya = 1
- Tidak = 0
- Total = 1
Kelompok Gaji = Tinggi
Komposisi kelas:
- Ya = 0
- Tidak = 2
- Total = 2
Hitung Gini Split untuk Gaji
Nilai ini jauh lebih kecil daripada Gini root, sehingga fitur Gaji cukup baik untuk memisahkan data.
Langkah 3: Evaluasi Split pada Fitur Umur
Sekarang misalkan kita mencoba split sederhana pada fitur Umur dengan threshold .
- Umur < 30: ID 1, 3, 6
- Umur : ID 2, 4, 5
Kelompok Umur < 30
Komposisi kelas:
- Ya = 3
- Tidak = 0
- Total = 3
Kelompok Umur \geq 30
Komposisi kelas:
- Ya = 0
- Tidak = 3
- Total = 3
Hitung Gini Split untuk Umur
Karena nilai split ini adalah , split berdasarkan Umur < 30 lebih baik daripada split berdasarkan Gaji pada contoh data ini.
Langkah 4: Pilih Split Terbaik
Bandingkan hasil kedua fitur:
| Fitur Split | Nilai Gini Split |
|---|---|
| Gaji | 0.222 |
| Umur < 30 | 0.000 |
Maka split terbaik adalah:
Karena hasil split sudah menghasilkan dua node yang sepenuhnya murni, pohon dapat berhenti pada tahap ini.
Bentuk Pohon dari Contoh Perhitungan
[Umur < 30?]
/ \
Ya Tidak
/ \
[Beli] [Tidak Beli]Ini menunjukkan bahwa pada contoh dataset sederhana ini, fitur Umur sudah cukup untuk memisahkan seluruh data secara sempurna.
Stopping Criteria
Dalam praktiknya, decision tree tidak terus membelah data tanpa batas. Ada beberapa aturan penghentian yang umum digunakan.
Klik untuk melihat stopping criteria
- Semua data pada node berasal dari kelas yang sama.
- Tidak ada fitur lagi yang memberikan split yang lebih baik.
- Jumlah data pada node terlalu sedikit.
- Kedalaman pohon telah mencapai batas maksimum.
- Penurunan impurity sangat kecil sehingga split tambahan tidak lagi signifikan.
Kelebihan Decision Tree
- Mudah dipahami dan divisualisasikan.
- Tidak memerlukan normalisasi data dalam banyak kasus.
- Dapat menangani data numerik maupun kategorikal.
- Cocok untuk analisis awal karena interpretatif.
- Dapat menunjukkan aturan keputusan secara eksplisit.
Keterbatasan Decision Tree
- Mudah mengalami overfitting jika pohon terlalu dalam.
- Sangat sensitif terhadap perubahan kecil pada data.
- Split terbaik secara lokal tidak selalu menghasilkan struktur global terbaik.
- Kadang menghasilkan pohon yang kompleks jika data berisik.
Implementasi Python
Berikut contoh implementasi decision tree classification menggunakan scikit-learn.
import pandas as pd
from sklearn.tree import DecisionTreeClassifier, plot_tree
from sklearn.preprocessing import LabelEncoder
import matplotlib.pyplot as plt
# Dataset
Data = {
"Umur": [25, 35, 28, 40, 32, 23],
"Gaji": ["Rendah", "Tinggi", "Rendah", "Rendah", "Tinggi", "Sedang"],
"Beli": ["Ya", "Tidak", "Ya", "Tidak", "Tidak", "Ya"]
}
df = pd.DataFrame(Data)
# Encoding fitur kategorikal
encoder_gaji = LabelEncoder()
encoder_target = LabelEncoder()
df["Gaji"] = encoder_gaji.fit_transform(df["Gaji"])
df["Beli"] = encoder_target.fit_transform(df["Beli"])
# Fitur dan target
X = df[["Umur", "Gaji"]]
y = df["Beli"]
# Model decision tree berbasis gini
model = DecisionTreeClassifier(criterion="gini", random_state=42, max_depth=2)
model.fit(X, y)
# Prediksi contoh
prediksi = model.predict([[27, encoder_gaji.transform(["Rendah"])[0]]])
print("Prediksi:", encoder_target.inverse_transform(prediksi)[0])
# Visualisasi pohon
plt.figure(figsize=(10, 6))
plot_tree(
model,
feature_names=["Umur", "Gaji"],
class_names=encoder_target.classes_,
filled=True
)
plt.show()Membaca Hasil Implementasi
Setelah program dijalankan, perhatikan beberapa hal berikut:
- fitur apa yang dipilih sebagai root node,
- nilai gini pada setiap node,
- jumlah sampel pada setiap node,
- distribusi kelas pada setiap node,
- apakah hasil program konsisten dengan perhitungan manual.
Ringkasan Langkah Manual
Penutup
Decision tree merupakan model klasifikasi yang sangat penting karena memperkenalkan konsep pemisahan data secara bertahap. Dengan memahami struktur pohon, Gini impurity, dan langkah perhitungan manualnya, Anda akan lebih mudah mempelajari model lanjutan seperti Random Forest dan Gradient Boosting.