TL;DR
Algoritma C4.5 membangun decision tree dengan memilih atribut yang punya gain ratio tertinggi di setiap simpul. Hitungannya tiga tahap: entropy buat ngukur ketidakpastian, information gain buat ngukur pengurangan ketidakpastian setelah data dipecah, lalu gain ratio buat menghukum atribut yang punya terlalu banyak nilai unik. C4.5 adalah pengembangan dari ID3 yang dibuat Ross Quinlan.
Algoritma C4.5 membangun decision tree dengan cara milih atribut yang punya gain ratio tertinggi di tiap simpul. Hitungannya tiga tahap: entropy, information gain, lalu gain ratio.
C4.5 dibuat Ross Quinlan sebagai penerus ID3. Bedanya bukan cuma di rumus pemilihan atribut, tapi juga kemampuan nangani angka kontinu, nilai kosong, dan pemangkasan pohon.
Di bawah ini aku hitung semuanya pakai tangan, pakai data 12 pengajuan kredit UMKM. Angkanya sengaja kecil biar kamu bisa ngikutin tanpa kalkulator ilmiah.
Algoritma C4.5 adalah metode klasifikasi yang menghasilkan pohon keputusan dari data berlabel. Tiap simpul pohon berisi pertanyaan tentang satu atribut, tiap cabang jawaban dari pertanyaan itu, dan tiap daun berisi kelas hasil prediksi. Kelebihannya, hasilnya bisa dibaca sebagai aturan jika-maka tanpa perlu ngerti matematikanya.
Buat kamu yang lagi milih metode buat proyek, C4.5 masuk kelompok klasifikasi. Kelompok metode yang lain aku bahas di metode data mining.
Tiga rumus ini yang dipakai berulang di tiap simpul.
Entropy ngukur seberapa campur aduk isi sebuah kumpulan data. Nilainya 0 kalau semua baris punya label sama, dan 1 kalau labelnya terbagi rata dua kelas.
Entropy(S) = -p1 * log2(p1) - p2 * log2(p2)
Information gain ngukur berapa banyak ketidakpastian yang hilang setelah data dipecah pakai satu atribut.
Gain(S, A) = Entropy(S) - jumlah( (|Sv| / |S|) * Entropy(Sv) )
Split information ngukur seberapa banyak dan seberapa merata atribut itu mecah data.
SplitInfo(S, A) = -jumlah( (|Sv| / |S|) * log2(|Sv| / |S|) )
Gain ratio hasil bagi dua angka terakhir. Ini yang dipakai C4.5 buat milih pemenang.
GainRatio(S, A) = Gain(S, A) / SplitInfo(S, A)
Dataset latihan ngulikdata bernama kredit_umkm berisi 12 pengajuan dengan tiga atribut dan satu label. Label yang diprediksi: status kredit setelah 12 bulan.
| No | lama_usaha | catatan_keuangan | jaminan | status |
|---|---|---|---|---|
| 1 | kurang dari 2 tahun | nggak | ada | macet |
| 2 | kurang dari 2 tahun | nggak | nggak | macet |
| 3 | kurang dari 2 tahun | nggak | nggak | macet |
| 4 | kurang dari 2 tahun | ya | nggak | lancar |
| 5 | 2 sampai 5 tahun | ya | ada | lancar |
| 6 | 2 sampai 5 tahun | ya | ada | lancar |
| 7 | 2 sampai 5 tahun | ya | ada | lancar |
| 8 | 2 sampai 5 tahun | ya | ada | lancar |
| 9 | lebih dari 5 tahun | ya | ada | lancar |
| 10 | lebih dari 5 tahun | nggak | nggak | lancar |
| 11 | lebih dari 5 tahun | nggak | nggak | lancar |
| 12 | lebih dari 5 tahun | ya | nggak | macet |
Total 12 baris: 8 lancar dan 4 macet.
Proporsinya 8/12 lancar dan 4/12 macet.
p(lancar) = 8/12 = 0,6667
p(macet) = 4/12 = 0,3333
Entropy(S) = -0,6667 * log2(0,6667) - 0,3333 * log2(0,3333)
= -0,6667 * (-0,5850) - 0,3333 * (-1,5850)
= 0,3900 + 0,5283
= 0,9183
Angka 0,9183 ini titik awal. Semua atribut bakal dinilai dari seberapa banyak mereka nurunin angka tersebut.
Tiga nilai, masing-masing 4 baris.
kurang dari 2 tahun (4 baris): 1 lancar, 3 macet
Entropy = -0,25*log2(0,25) - 0,75*log2(0,75)
= 0,5000 + 0,3113 = 0,8113
2 sampai 5 tahun (4 baris): 4 lancar, 0 macet
Entropy = 0 (semua labelnya sama)
lebih dari 5 tahun (4 baris): 3 lancar, 1 macet
Entropy = 0,8113
Entropy gabungan = (4/12)*0,8113 + (4/12)*0 + (4/12)*0,8113
= 0,2704 + 0 + 0,2704 = 0,5409
Gain = 0,9183 - 0,5409 = 0,3774
ya (7 baris): 6 lancar, 1 macet -> Entropy = 0,5917
nggak (5 baris): 2 lancar, 3 macet -> Entropy = 0,9710
Entropy gabungan = (7/12)*0,5917 + (5/12)*0,9710
= 0,3452 + 0,4046 = 0,7498
Gain = 0,9183 - 0,7498 = 0,1685
ada (6 baris): 5 lancar, 1 macet -> Entropy = 0,6500
nggak (6 baris): 3 lancar, 3 macet -> Entropy = 1,0000
Entropy gabungan = 0,5*0,6500 + 0,5*1,0000 = 0,8250
Gain = 0,9183 - 0,8250 = 0,0933
Di sinilah C4.5 beda dari ID3. Gain dibagi split information dulu sebelum dibandingkan.
SplitInfo(lama_usaha) = -3 * (4/12) * log2(4/12) = 1,5850
SplitInfo(catatan) = -(7/12)*log2(7/12) - (5/12)*log2(5/12) = 0,9799
SplitInfo(jaminan) = -(6/12)*log2(6/12) - (6/12)*log2(6/12) = 1,0000
| Atribut | Gain | SplitInfo | Gain Ratio |
|---|---|---|---|
| lama_usaha | 0,3774 | 1,5850 | 0,2381 |
| catatan_keuangan | 0,1685 | 0,9799 | 0,1719 |
| jaminan | 0,0933 | 1,0000 | 0,0933 |
Perhatiin jaraknya. Pakai information gain, lama_usaha unggul lebih dari dua kali lipat dari catatan_keuangan. Pakai gain ratio, jaraknya nyusut jadi 0,2381 lawan 0,1719, gara-gara lama_usaha punya tiga nilai sementara catatan cuma dua.
Pemenangnya tetap lama_usaha, jadi dia jadi simpul akar.
Cabang 2 sampai 5 tahun udah murni, semuanya lancar. Cabang itu jadi daun, selesai.
Cabang kurang dari 2 tahun berisi baris 1 sampai 4 dengan entropy 0,8113. Dipecah pakai catatan_keuangan: nilai ya berisi baris 4 (lancar), nilai nggak berisi baris 1, 2, 3 (semuanya macet). Dua-duanya murni, gain-nya penuh 0,8113. Selesai juga.
Cabang lebih dari 5 tahun berisi baris 9 sampai 12 dengan entropy 0,8113. Dipecah pakai catatan_keuangan: nilai nggak berisi baris 10 dan 11 yang dua-duanya lancar, nilai ya berisi baris 9 dan 12 yang masih campur. Baris 9 dan 12 dipisah lagi pakai jaminan, dan langsung murni.
Pohon jadinya:
lama_usaha?
|- 2 sampai 5 tahun -> LANCAR
|- kurang dari 2 tahun
| |- catatan_keuangan = ya -> LANCAR
| |- catatan_keuangan = nggak -> MACET
|- lebih dari 5 tahun
|- catatan_keuangan = nggak -> LANCAR
|- catatan_keuangan = ya
|- jaminan = ada -> LANCAR
|- jaminan = nggak -> MACET
Aturan keempat kelihatan aneh: usaha lama tanpa catatan keuangan kok diprediksi lancar. Itu tanda pohon kekecilan datanya. Cabang tersebut cuma ditopang 2 baris, jadi aturannya belum tentu berlaku di data baru. Di C4.5 beneran, cabang kayak gini yang bakal kena pemangkasan.
Kalau kamu mau ngecek hitungan tanpa Python, spreadsheet cukup. Taruh jumlah kelas positif di B2 dan negatif di C2.
=IFERROR(-B2/(B2+C2)*LOG(B2/(B2+C2),2) - C2/(B2+C2)*LOG(C2/(B2+C2),2), 0)
IFERROR dipasang buat nangani kelompok murni, karena log dari nol bikin error. Buat ngitung jumlah baris per kombinasi atribut, COUNTIFS paling cepat.
Sekarang bandingin hasil hitung tangan tadi sama library.
import pandas as pd
from sklearn.tree import DecisionTreeClassifier, export_text
data = pd.DataFrame({
"lama_usaha": ["<2","<2","<2","<2","2-5","2-5","2-5","2-5",">5",">5",">5",">5"],
"catatan": ["nggak","nggak","nggak","ya","ya","ya","ya","ya","ya","nggak","nggak","ya"],
"jaminan": ["ada","nggak","nggak","nggak","ada","ada","ada","ada","ada","nggak","nggak","nggak"],
"status": ["macet","macet","macet","lancar","lancar","lancar",
"lancar","lancar","lancar","lancar","lancar","macet"]
})
X = pd.get_dummies(data.drop(columns="status"))
y = data["status"]
model = DecisionTreeClassifier(criterion="entropy", random_state=42)
model.fit(X, y)
print(export_text(model, feature_names=list(X.columns)))
Satu hal yang harus kamu tau: DecisionTreeClassifier di scikit-learn memakai varian CART, bukan C4.5. Dia nggak ngitung gain ratio dan cabangnya selalu dua per simpul. Pilihan criterion="entropy" cuma nyamain rumus ketidakpastiannya. Rinciannya ada di dokumentasi scikit-learn.
Jadi kalau skripsimu nulis "algoritma C4.5" tapi kodenya pakai scikit-learn, sebutkan bedanya di bab metodologi. Penguji yang teliti bakal nanya.
ID3 milih atribut pakai information gain, C4.5 pakai gain ratio. C4.5 juga bisa nangani atribut angka kontinu, nilai yang hilang, dan punya tahap pemangkasan pohon. ID3 nggak punya ketiganya.
Basis 2 bikin satuannya jadi bit, dan satu bit mewakili satu pertanyaan ya atau nggak. Data yang terbagi rata dua kelas punya entropy persis 1 bit.
Waktu ada atribut dengan banyak nilai unik. Information gain selalu kasih nilai besar ke kolom kayak id_transaksi, karena tiap kelompoknya otomatis murni. Gain ratio motong nilai atribut semacam itu.
Nggak persis. DecisionTreeClassifier memakai varian CART, jadi dia nggak menghitung gain ratio dan cabangnya selalu dua per simpul.
Buat latihan manual, 10 sampai 15 baris cukup. Buat model yang dipakai beneran, usahakan tiap daun punya minimal 20 sampai 30 baris biar aturannya nggak kebetulan.
Tiga hal yang perlu nempel. Entropy ngukur campur aduknya data, gain ngukur pengurangannya setelah dipecah, gain ratio nghukum atribut yang terlalu banyak nilai.
Coba ulang hitungannya pakai data kamu sendiri, minimal 12 baris, tiga atribut. Hitung tangan dulu, baru bandingin sama Python.
Lanjut baca: KDD vs CRISP-DM vs SEMMA buat nyusun alur proyeknya dari awal sampai dipakai orang.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Kolom datetime nyimpen tanggal, jam, hari, semuanya nempel jadi satu. Accessor .dt di pandas ngeluarin tiap bagian jadi kolom sendiri buat dianalisa.
Nama toko ketik campur huruf besar-kecil, spasi nyasar di ujung, atau kode produk nempel jadi satu. Accessor .str di pandas ngerapiin semua itu tanpa loop.
Model machine learning cuma ngerti angka, bukan teks kayak merah atau biru. get_dummies ngubah kolom kategori jadi kolom 0/1 dalam satu baris kode.