Skip to content

Decision Tree

Decision Tree adalah algoritma machine learning yang membagi data ke dalam beberapa bagian berdasarkan fitur tertentu, hingga akhirnya menghasilkan keputusan pada bagian akhir pohon. Metode ini populer karena mudah dipahami, mudah divisualisasikan, dan cocok untuk menjelaskan proses pengambilan keputusan secara bertahap.

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).

CART membentuk binary tree, artinya setiap node hanya bercabang menjadi dua bagian. Untuk kasus klasifikasi, CART biasanya memilih split terbaik berdasarkan Gini Impurity.

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:

Gini=1i=1kpi2 Gini = 1 - \sum_{i=1}^{k} p_i^2

Keterangan variabel:

  • GiniGini = tingkat impurity pada sebuah node
  • kk = jumlah kelas
  • pip_i = proporsi data pada kelas ke-ii

Untuk kasus dua kelas, misalnya kelas Ya dan Tidak, rumusnya dapat ditulis sebagai:

Gini=1(pYa2+pTidak2) Gini = 1 - (p_{Ya}^2 + p_{Tidak}^2)

Interpretasi:

  • jika semua data dalam node berasal dari satu kelas, maka nilai Gini = 00, artinya node sangat murni,
  • semakin besar nilai Gini, semakin campuran isi node tersebut.

Nilai Gini pada Beberapa Kondisi

Komposisi KelasPerhitunganNilai Gini
100% Ya, 0% Tidak1(12+02)1 - (1^2 + 0^2)0.00
80% Ya, 20% Tidak1(0.82+0.22)1 - (0.8^2 + 0.2^2)0.32
50% Ya, 50% Tidak1(0.52+0.52)1 - (0.5^2 + 0.5^2)0.50

Dari tabel tersebut terlihat bahwa nilai impurity terbesar untuk dua kelas terjadi saat proporsi kelas seimbang, yaitu 0.50.5 dan 0.50.5.

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:

Ginisplit=j=1mnjnGinij Gini_{split} = \sum_{j=1}^{m} \frac{n_j}{n} Gini_j

Keterangan variabel:

  • GinisplitGini_{split} = impurity total setelah split
  • mm = jumlah cabang hasil split
  • njn_j = jumlah data pada cabang ke-jj
  • nn = jumlah seluruh data pada node sebelum split
  • GinijGini_j = nilai Gini pada cabang ke-jj

Split terbaik adalah split dengan nilai GinisplitGini_{split} 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 GinisplitGini_{split} 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.

IDUmurGajiBeli Produk
125RendahYa
235TinggiTidak
328RendahYa
440RendahTidak
532TinggiTidak
623SedangYa

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:

pYa=36=0.5 p_{Ya} = \frac{3}{6} = 0.5 pTidak=36=0.5 p_{Tidak} = \frac{3}{6} = 0.5

Sehingga nilai Gini root adalah:

Giniroot=1(0.52+0.52) Gini_{root} = 1 - (0.5^2 + 0.5^2) Giniroot=1(0.25+0.25)=0.5 Gini_{root} = 1 - (0.25 + 0.25) = 0.5

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
GiniRendah=1((23)2+(13)2) Gini_{Rendah} = 1 - \left(\left(\frac{2}{3}\right)^2 + \left(\frac{1}{3}\right)^2\right) GiniRendah=1(49+19)=159=490.444 Gini_{Rendah} = 1 - \left(\frac{4}{9} + \frac{1}{9}\right) = 1 - \frac{5}{9} = \frac{4}{9} \approx 0.444

Kelompok Gaji = Sedang

Komposisi kelas:

  • Ya = 1
  • Tidak = 0
  • Total = 1
GiniSedang=1(12+02)=0 Gini_{Sedang} = 1 - (1^2 + 0^2) = 0

Kelompok Gaji = Tinggi

Komposisi kelas:

  • Ya = 0
  • Tidak = 2
  • Total = 2
GiniTinggi=1(02+12)=0 Gini_{Tinggi} = 1 - (0^2 + 1^2) = 0

Hitung Gini Split untuk Gaji

Ginisplit(Gaji)=36(0.444)+16(0)+26(0) Gini_{split}(Gaji) = \frac{3}{6}(0.444) + \frac{1}{6}(0) + \frac{2}{6}(0) Ginisplit(Gaji)=0.222 Gini_{split}(Gaji) = 0.222

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 3030.

  • Umur < 30: ID 1, 3, 6
  • Umur 30\geq 30: ID 2, 4, 5

Kelompok Umur < 30

Komposisi kelas:

  • Ya = 3
  • Tidak = 0
  • Total = 3
Gini<30=1(12+02)=0 Gini_{<30} = 1 - (1^2 + 0^2) = 0

Kelompok Umur \geq 30

Komposisi kelas:

  • Ya = 0
  • Tidak = 3
  • Total = 3
Gini30=1(02+12)=0 Gini_{\geq 30} = 1 - (0^2 + 1^2) = 0

Hitung Gini Split untuk Umur

Ginisplit(Umur<30)=36(0)+36(0) Gini_{split}(Umur<30) = \frac{3}{6}(0) + \frac{3}{6}(0) Ginisplit(Umur<30)=0 Gini_{split}(Umur<30) = 0

Karena nilai split ini adalah 00, split berdasarkan Umur < 30 lebih baik daripada split berdasarkan Gaji pada contoh data ini.

Langkah 4: Pilih Split Terbaik

Bandingkan hasil kedua fitur:

Fitur SplitNilai Gini Split
Gaji0.222
Umur < 300.000

Maka split terbaik adalah:

Umur<30 \text{Umur} < 30

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
  1. Semua data pada node berasal dari kelas yang sama.
  2. Tidak ada fitur lagi yang memberikan split yang lebih baik.
  3. Jumlah data pada node terlalu sedikit.
  4. Kedalaman pohon telah mencapai batas maksimum.
  5. 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

Untuk membangun decision tree secara manual dengan Gini, lakukan urutan berikut: hitung Gini root, uji semua kandidat split, hitung Gini tiap cabang, hitung Gini Split, pilih split terkecil, lalu ulangi proses sampai node cukup murni.

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.