Pohon Regresi Vs Pohon Klasifikasi
Pendahuluan
Perbedaan Pohon Regresi dan Pohon Klasifikasi
Pohon regresi sering disebut sebagai regression tree sedangkan pohon klasifikasi sering disebut sebagai clasification tree. Pohon ini sering disebut sebagai decision tree
Pohon regresi dan pohon klasifikasi ini termasuk ke dalam keluarga Supervised machine learning yaitu pemodelan dimana di dalam data ada yang disebut sebagai variabel input dan ada variabel2 yang disebut sebagai output.Tugas dari teknik permodelan Supervised machine learning adalah mencari model yang menghubungkan paling baik atau paling optimal antara variabel input (prediktor) dan variabel output (target). Variabel output (target) tersedia di dalam data yang kita miliki.
Variabel output (target) terdiri dari 2 jenis/tipe, yaitu:
- Numerik (Bilangan)
Menggambarkan besar kecilnya variabel tersebut.
Misalnya memprediksi nilai tukar dolar terhadap rupiah, memprediksi berapa jarak (km atau mill) yang dapat ditempuh suatu kendaraan untuk setiap liter bahan bakar yang dikonsumsi, memprediksi kandungan lemak (miligram) pada (100 gram) bahan makanan
Untuk output (target) dengan tipe numerik, pemodelan yang digunakan dikenal sebagai pemodelan regresi.Dalam Supervised machine learning, dikenal dengan istilah pohon regresi.
- Kategorik
Misalnya memprediksi kejadian gagal bayar kredit (good/bad), memprediksi kondisi kesehatan seseorang (sangat baik, biasa saja, buruk), memprediksi terjangkitnya suatu penyakit tertentu (sakit atau tidak sakit), memprediksi keberhasilan siswa menyelesaikan study nya (lulus atau tidak, berhasil atau tidak).
Untuk output (target) dengan tipe kategorik (bisa 2 atau lebih kategori), pemodelan yang digunakan dikenal sebagai pemodelan klasifikasi.Dalam Supervised machine learning, dikenal dengan istilah pohon klasifikasi.
Pemodelan berbasis pada partisi data yang dikenal sebagai pemodelan berbasis pohon. Ada 2 jenis pemodelan berbasis pohon yang disebut sebagai pohon regresi dan pohon klasifikasi. Beberapa orang menyebut kedua pendekatan tersebut sebagai decision tree.
Sehingga, perbedaan pohon regresi dan pohon klasifikasi:
Pohon regresi (regression tree) menggunakan variabel output (target) dengan tipe numerik sedangkan pohon klasifikasi (classification tree) menggunakan variabel output (target) dengan tipe kategorik (bisa 2 atau lebih kategori)
Pohon regresi menggunakan Kriteria/penentuan split (pemisahan) berbasis variance atau MSE (penurunan variance atau MSE yang paling besar) dari subset2 atau simpul2 data yang dihasilkan sedangkan pohon klasifikasi berbasis pada keragaman kelasnya yang sering diukur dengan menggunakan entropy atau gini (penurunan entropy atau gini index yang optimum/maksimal).
Pohon Regresi
Pendahuluan
Dimulai belajar dasarnya terlebih dahulu.
- Import file csv yang telah diberikan menjadi suatu R-dataframe yang berisi dua kolom, y dan x
sainsdata12 <- read.csv("D:\\Kuliah S2 IPB\\Bahan Kuliah\\Semester 1 SSD 2020\\05 Sains Data\\R\\UAS\\sainsdata12.csv", header = TRUE)
head(sainsdata12)## x y
## 1 8.077661 11.684700
## 2 7.576725 -2.232529
## 3 10.523224 42.717622
## 4 5.563832 30.102320
## 5 9.685493 -3.348269
## 6 9.837707 29.480056
- Hasilkan scatter plot
library(ggplot2)
library(ggpubr)
plot( x = sainsdata12$x, y = sainsdata12$y, pch = 19, cex = 0.8, frame = FALSE ) Dari gambar di atas terlihat bahwa hubungan antara peubah X dan peubah Y tidak linier. Salah satu metode untuk mengeksplorasi data tidak linier adalah Piecewise Constant (Step Function). Bagaimana cara memperoleh titik-titik knot yang terbaik?
- Berapa nilai rata-rata dari kolom y?
mean(sainsdata12$y) #rata2 kolom y## [1] 49.29424
- Berapa nilai jumlah kuadrat dari kolom y
sum(sainsdata12$y^2) #jumlah kuadrat y## [1] 398671.1
- Berapa nilai jumlah kuadrat terkoreksi dari y?
RSS <- sum((sainsdata12$y-mean(sainsdata12$y))^2) #jumlah kuadrat terkoreksi y= sigma((y-ybar)^2)
#RS adalah ukuran variasi dari residual/ukuran variasi dari data/y pada daerah partisi
#Ingat var(y)= sigma((y-ybar)^2)/n-1
#Pohon regresi mencari titik pemisah sehingga RSS menjadi minimum.
RSS## [1] 155678.9
Dalam Metode piecewise constant (step function), bagaimana mencari knot/titik terbaik?
Pemikiran intuitif:
Sampel space dibagi menjadi j bagian. RSS : Residual Sum of Square.
Menghitung rata2 tiap bagian:
mean(sainsdata12$y[sainsdata12$x<=8])## [1] 12.08564
mean(sainsdata12$y[sainsdata12$x>8&sainsdata12$x<=12])## [1] 38.59729
mean(sainsdata12$y[sainsdata12$x>12])## [1] 99.52497
RSS untuk gambar sebelah kiri= 46311,43, gambar sebelah kanan = 18433.77. Proses pencarian yang optimal akan sangat mahal secara komputasi. Solusi: Recursive Binary Splitting. Caranya?
Ilustrasi:
Var(y) = sigma(yi-ybar)^2/(n-1) RSS = sigma(yi-ybar)^2 RSS merupakan ukuran variasi dari residual. Ukuran variasi dari data y pada “partisi”. Pohon regresi meminimumkan varians.Jika RSS minimum, maka partisi homogen. Jadi dalam setiap partisi (kotak) nilai y nya homogen.Makin ke bawah pohonnya, maka y nya makin homogen.
Algoritma Recursive Binary Splitting > Mencari titik pemisah sedemikian rupa sehingga RSS nya menjadi minimum.
Jika kita punya data, tentunya x nya tidak cuma satu. Misal: y: harga rumah, x1: luas rumah, x2= jarak rumah ke angkutan umum. Tahap: 1. Setiap x dicari RSS nya lalu dibandingkan yang terbaik2 dari setiap x tadi. 2. Ulangi tahap 1 3. stop jika di dalam simpul data sedikit (misal ditentukan minimal n = 4) atau jika kedalaman/tinggi pohon terlalu besar (ditentukan berapa kedalam/tingginya/depth pohon maksimal, misal 6).
Tahapan umum proses partisi/penyekatan(splitting)
Cari batas partisi/sekatan terbaik untuk masing-masing variabel prediktor. (penurunan SSE Terbesar).
Bandingkan partisi terbaik dari semua variabel prediktor. pilih yang paling baik (RSS paling kecil. mana yang membuat SSE turun sebesar-besarnya?).
Lakukan penyekatan berdasarkan variabel yang dihasilkan pada langkah ke-2.
Lakukan tahap 1-2-3 untuk setiap simpul sampai tercapai kriteria penghentian algoritma.
Aturan penghentian algoritma partisi/splitting
Algoritma splitting akan berhenti jika tercapai salah satu dari kriteria berikut:
Simpul hanya berisi amatan yang sedikit. Pada fungsi rpart() ditentukan menggunakan opsi minsplit (berapa banyaknya data dalam satu simpul) dan minbucket (berapa hasilnya data dalam satu simpul jika di split).
Pohon sudah terlalu besar. Pada fungsi rpart() ditentukan menggunakan fungsi maxdepth (berapa kedalaman maksimum dari pohon yang dibangun)
Ilustrasi
Menilai Kebaikan Hasil Prediksi
- MAPE (Mean Absolute Percentage Error)
- RMSEP
- MAD
- Gunakan data lain untuk melakukan penilaian! ==> validasi, validasi silang (Gunakan DATA TESTING, bukan DATA TRAINING)
Optimasi Hyperparameter
Bentuk akhir dari model yang dihasilkan algoritma regression tree tergantung pada hyperparameter antara lain:
minsplit
minbucket
maxdepth
cp (complexity parameter)
Minsplit, minibucket,dan cp kecil menghasilkan pohon yang tumbuh besar, sehingga model semakin kompleks.
Maxdepth besar menghasilkan pohon yang tumbuh besar dan model semakin kompleks.
Ilustrasi hyperparameter
Jika minsplit=100, pohonnya lebih besar (ada 10 split) sedangkan jika minsplit=150 (ada 7 split).
Model yang kompleks akan membuat eror di data training lebih kecil sedangkan jika dilakukan di data testing, akan ada titik optimal sehingga erornya makin besar (overfit: terlalu fit untuk data testing)
Proses membuat pohon regresi
Dalam dokumen ini diberikan ilustrasi penggunaan R untuk menjalankan algoritma recursive partition untuk menghasilkan pohon regresi (regression tree). Ilustrasi akan diberikan mulai dari proses mengimport data menjadi dataframe, melakukan eksplorasi sederhana, membuat model pohon regresi berdasarkan data training, hingga mengevaluasi ketepatan prediksinya menggunakan data testing.
Data yang digunakan adalah data banyaknya kontainer yang dilayani Terminal JICT dan rata-rata Dwelling Time-nya setiap hari.
Y: rata-rata DT (Dwelling Time) (hari)
X1: % peti kemas jalur hijai
x2: % peti kemas kategori prenotification
x3: % peti kemas kategori MITA
Import Data
setwd("D:\\Kuliah S2 IPB\\Bahan Kuliah\\Semester 1 SSD 2020\\05 Sains Data\\R\\UAS\\")
data <- read.csv("jict.csv")Sebelum lebih jauh bekerja dengan data, kita perlu mengetahui informasi dasar dari data yang kita miliki. Informasi dasar tersebut meliputi ukuran/banyaknya data dan nama-nama kolom atau variabel yang ada di dalamnya.
FUngsi dim() dapat digunakan untuk menampilkan berapa banyak baris dan kolom pada dataframe kita, dan fungsi colnames() dapat digunakan untuk menampilkan nama-nama kolom pada data.
dim(data)## [1] 872 19
colnames(data)## [1] "jumlah_kontainer" "NON.MITA" "MITA"
## [4] "HIJAU" "MERAH" "KUNING"
## [7] "NON" "BORDER" "POST.BORDER"
## [10] "BORDER_POST.BORDER" "lartas.N" "lartas.Y"
## [13] "lartas.NA" "KARANTINA.TUMBUHAN" "KARANTINA.HEWAN"
## [16] "KARANTINA.IKAN" "PRENO" "NON_PRENO"
## [19] "avg_dt"
Tampak bahwa ada sebanyak 872 baris pada data dengan kolom sebanyak 19 buah. Nama-nama kolom sudah diberikan oleh output di atas.
Menyiapkan Variabel Baru
Sebelum melakukan pemodelan, ada beberapa variabel baru yang dibuat yaitu persentase kontainer yang dilayani yang tergolong pada kategori MITA, PRENO, LARTAS, KARANTINA, JALUR HIJAU, dan JALUR MERAH. Berikut cara memperoleh variabel baru tersebut.
data$p.mita <- data$MITA /data$jumlah_kontainer
data$p.preno <- data$PRENO/data$jumlah_kontainer
data$p.merah <- data$MERAH/data$jumlah_kontainer
data$p.hijau <- data$HIJAU/data$jumlah_kontainer
data$p.lartas <- data$lartas.Y/data$jumlah_kontainer
data$p.karantina <-(data$KARANTINA.HEWAN+data$KARANTINA.IKAN+
data$KARANTINA.TUMBUHAN)/data$jumlah_kontainerMelihat Pola Hubungan antara Prediktor dengan Variabel Respon
Kemudian, eksplorasi data kita awali dengan melihat hubungan antara peubah prediktor dengan peubah respon. Yang akan menjadi peubah respon adalah rata-rata dwelling time (“avg_dt”), sedangkan variabel persentase berbagai jenis kontainer akan dijadikan variabel prediktor.
Di bawah ini cara memperoleh scatter plot antara prediktor dan respon. Sebagai ilustrasi hanya Persentase Kontainer PRENO dan JALUR HIJAU yang dibuat scatter plotnya.
plot(data$p.preno, data$avg_dt, ylim=c(0,8))plot(data$p.hijau, data$avg_dt, ylim=c(0,8))Cara lain untuk melihat hubungan di atas adalah dengan menggunakan boxplot, namun prediktornya perlu di-kategorikan terlebih dahulu. Berikut ini prosesnya.
k.preno <- cut(data$p.preno, breaks=c(0, 0.2, 0.3, 0.4, 0.5,
0.6, 0.7, 1))
boxplot(data$avg_dt ~ k.preno, ylim=c(0,8))k.hijau <- cut(data$p.hijau, breaks=c(0.6, 0.8, 0.85,
0.9, 0.95, 1))
boxplot(data$avg_dt ~ k.hijau, ylim=c(0,8))Nampak jelas bahwa semakin besar persentase kontainer PRENO dan JALUR HIJAU, rata-rata DT cenderung semakin kecil.
Membagi Data Menjadi Dua Bagian - Training & Testing
Proses pemodelan akan diawali dengan membagi data menjadi dua bagian secara acak, yaitu data latih (training set) dan data uji (testing set). Data latih adalah data yang akan digunakan untuk melakukan pemodelan, sedangkan data uji adalah data untuk melihat kinerja prediksinya.
Di bawwah ini adalah perintah untuk mengambil secara acak 600 baris untuk disimpan pada data training dan sisanya disimpan pada data testing.
set.seed(100)
acak <- sample(1:nrow(data), 600)
data.training <- data[acak,]
data.testing <- data[-acak,]Ada dua dataframe baru yang dihasilkan dari perintah di atas yaitu data.training dan data.testing, yang banyaknya baris untuk masing-masing dapat diperoleh sebagai berikut.
dim(data.training)## [1] 600 25
dim(data.testing)## [1] 272 25
Membuat model Pohon Regresi
Selanjutnya kita dapat menjalankan algoritma pohon regresi menggunakan fungsi rpart() yang tersedia pada package dengan nama yang sama yaitu rpart.
Pada fungsi ini kita tinggal menyebutkan dataframe yang digunakan sebagai sumber data yaitu data.training. Ekspresi avg_dt ~ p.mita+p.preno+ p.merah + p.hijau + p.lartas+ p.karantina+jumlah_kontainer memiliki makna bahwa variabel target-nya adalah “avg_dt” dan variabel yang disebutkan digunakan sebagai prediktor. Antar variabel prediktor dipisahkan dengan tanda “+”.
library(rpart)
pohon <- rpart(data=data.training, avg_dt ~ p.mita+p.preno+
p.merah + p.hijau + p.lartas+
p.karantina+jumlah_kontainer,
control=rpart.control(cp=0, minsplit=100))Hasil dari pemodelan di atas tersimpan pada objek dengan nama pohon yang berisi model pohon regresi yang dihasilkan.
Perintah di bawah ini dapat digunakan untuk menampilkan pohon yang terbentuk. Terlihat bahwa partisi pertama adalah menggunakan variabel “p.preno”.
pohon## n= 600
##
## node), split, n, deviance, yval
## * denotes terminal node
##
## 1) root 600 2778.64100 3.149017
## 2) p.preno>=0.2034935 533 1281.19700 2.921501
## 4) p.preno>=0.4713983 248 154.58760 2.555363
## 8) p.hijau>=0.8814856 201 116.18250 2.422040
## 16) p.preno>=0.5527603 105 80.42338 2.260381
## 32) p.karantina>=0.06734603 63 12.83620 2.180000 *
## 33) p.karantina< 0.06734603 42 66.56956 2.380952 *
## 17) p.preno< 0.5527603 96 30.01377 2.598854 *
## 9) p.hijau< 0.8814856 47 19.55296 3.125532 *
## 5) p.preno< 0.4713983 285 1064.43400 3.240105
## 10) p.karantina< 0.1866407 252 166.17790 3.089087
## 20) p.hijau>=0.9087217 125 43.62584 2.746960
## 40) p.preno>=0.3471257 64 20.20406 2.589219 *
## 41) p.preno< 0.3471257 61 20.15853 2.912459 *
## 21) p.hijau< 0.9087217 127 93.51969 3.425827
## 42) p.mita>=0.1742588 88 52.79086 3.273750 *
## 43) p.mita< 0.1742588 39 34.10136 3.768974 *
## 11) p.karantina>=0.1866407 33 848.62070 4.393333 *
## 3) p.preno< 0.2034935 67 1250.37000 4.958955 *
Menggambar Pohon Regresi
Guna memudahkan melihat pohon klasifikasi yang terbentuk, kita dapat menggunakan fungsi rpart.plot() seperti di bawah ini.
library(rpart.plot)
rpart.plot(pohon, box.palette="RdBu", shadow.col="gray", nn=TRUE)Mengevaluasi Kebaikan Model (menghitung MAPE)
Bagaimana kualitas prediksinya? Berikut ini adalah proses untuk menghasilkan beberapa ukuran kinerja berdasarkan prediksinya di data testing, yaitu dengan menggunakan ukuran MAPE (mean absolute percentage error), yang diperoleh sebesar 28.5%.
prediksi <- predict(pohon, data.testing)
MAPE <- mean(abs(prediksi-data.testing$avg_dt)/data.testing$avg_dt)*100
MAPE## [1] 28.53151
Pengenalan Random Forest
Di bawah ini proses menjalankan algoritma Random Forest di R dan menghitung kinerja prediksinya, dan diperoleh MAPE sebesar 25.8%.
library(randomForest)## randomForest 4.6-14
## Type rfNews() to see new features/changes/bug fixes.
##
## Attaching package: 'randomForest'
## The following object is masked from 'package:ggplot2':
##
## margin
forest <- randomForest(data=data.training, avg_dt ~ p.mita+p.preno+
p.merah + p.hijau + p.lartas+
p.karantina+jumlah_kontainer,
ntree=500)prediksi.forest <- predict(forest, data.testing)
MAPE <- mean(abs(prediksi.forest-data.testing$avg_dt)/data.testing$avg_dt)*100
MAPE## [1] 25.79675
Pohon Klasifikasi
Pendahuluan
Bentuk dan komponen pohon klasifikasi:
Bentuk umum dari pohon klasifikasi terdiri dari:
- Simpul/node yang biasa bentuk lingkaran atau ovale atau kotak. Masing-masing simpul dihubungkan oleh cabang/branch. Simpul terdiri dari berbagai macam: simpul akar/root node yaitu simpul yang paling atas, simpul antara/intermediate node yaitu simpul yang berada di tengah yang akan terbagi lagi menjadi simpul2 yang lain, dan simpul akhir/terminal node=leaf yaitu simpul yang tidak lagi dipartisi/dibagi.
Setiap simpul mewakili suatu dataset atau sub-dataset.Data dari dua simpul yang berada di bawah suatu simpul jika digabungkan maka isinya sama dengan simpul di atasnya.
- cabang/branch: yang menghubungkan simpul-simpul. Suatu cabang merepresentasikan aturan partisi/penyekatan/pembagian.
Ilustrasi Pohon Klasifikasi
Simpul paling atas terdiri dari 200 amatan, dimana 90 amatan masuk dalam kategori pembeli sedangkan 110 amatan lainnya termasuk dalam kategori tidak membeli. Branch/cabang pertama terpartisi menjadi apakah income nya <5 juta atau >= 5 juta. Dua simpul level pertama masing-masing terdiri dari 120 amatan dan 80 amatan yang totalnya sebanyak 200 amatan (sama dengan simpul atas paling atas/di atasnya), begitu juga dengan jumlah amatan untuk pembeli dan tidak sama dengan simpul atasnya.
Apa Kegunaan:
- Memprediksi Kelas Individu Baru
Sebagai contoh diketahui seseorang berjenis kelamin perempuan, tidak menikah, income nya 7 juta. Dari pohon, terlihat bahwa termasuk pada simbul kanan (cabang pertama), cabang kedua bergerak ke kiri, dan cabang ketiga bergerak ke kanan. Simpul akhir: beli ada 4 dan tidak beli ada 8 sehingga orang tersebut memiliki peluang untuk membeli sebesar 4/8 atau 50%.
- Mengidentifikasi karakteristik dari segmen tertentu
Misal segmen pembeli produk. Dominasi orang yang membeli? Kita beri warna hijau untuk cabang yang didominasi oleh pembeli dan warna pink untuk yang didominasi dengan orang yang tidak membeli. Kemudian, kita melakukan karakterisasi untuk orang yang membeli: orang yang income >= 5juta, jenis kelamin perempuan, dan sudah menikah.
Algoritma Dasar Pembentukan Pohon Klasifikasi (Classification Tree)
Tahapan umum proses partisi/penyekatan (splitting) dalam pohon klasifikasi yang diawali dengan simpul akar yang paling atas:
- Cari batas partisi/batas penyekatan terbaik untuk masing-masing variabel prediktor.Jika kita mempunyai 50 variabel prediktor, maka pada tahap 1 dilakukan sebanyak 50 kali.Setiap variabel, untuk mendapatkan sekatan terbaik digunakan information gain.
#Fungsi Information Gain
InformationGain <- function(n.awal,n1.awal, n.bag1, n1.bag1){
p1.awal <- n1.awal/n.awal
p2.awal <- 1-p1.awal
ED.awal <- (-p1.awal*log2(p1.awal))-(p2.awal*log2(p2.awal))
p1.bag1 <- n1.bag1/n.bag1
p2.bag1 <- 1-p1.bag1
ED.bag1 <- (-p1.bag1*log2(p1.bag1))-(p2.bag1*log2(p2.bag1))
n.bag2 <- n.awal- n.bag1
n1.bag2 <- n1.awal- n1.bag1
p1.bag2 <- n1.bag2/n.bag2
p2.bag2 <- 1-p1.bag2
ED.bag2 <- (-p1.bag2*log2(p1.bag2))-(p2.bag2*log2(p2.bag2))
IG <- ED.awal - ((n.bag1/n.awal)*ED.bag1)-((n.bag2/n.awal)*ED.bag2)
return(IG)
}Dari partisi terbaik di masing-masing variabel prediktor, dilakukan pembandingkan semua partisi terbaik dari variabel prediktor tadi mana yang memberikan partisi terbaik berdasarkan kriteria information gain.
Lakukan penyekatan/partisi berdasarkan variabel yang dihasilkan pada langkah ke-2.
Lakukan tahapan 1,2,3 di atas untuk setiap simpul sampai tercapai kriteria penghentian algoritma.
- Aturan penghentian algoritma partisi/splitting*
Algoritma splitting akan berhenti jika tercapai salah satu dari kriteria berikut:
Semua amatan pada simpul hanya terdiri atas satu kelas variabel respon saja. Misalnya Semuanya yes atau semuanya No.
Semua amatan pada simpul memiliki nilai variabel prediktor yang sama. Misalnya semuanya usianya sama 20 tahun, jenis kelamin sama, pekerjaan sama.
Simpul hanya berisi amatan yang sedikit. Pada fungsi
rpart()ditentukan menggunakan opsiminsplitdanminbucketPohon yang dihasilkan sudah terlalu besar. Pada fungsi
rpart()ditentukan menggunakan fungsimaxdepth(berapa banyak level yang digunakan untuk membangun model)
Ilustrasi
Tahap 1:
Mencari pemisahan partisi terbaik untuk variabel PENDIDIKAN. Kemungkinan partisi: 1 Rendah vs Sedang,Tinggi
#Rendah vs Sedang,Tinggi
InformationGain(10, 6,3,2)## [1] 0.005802149
2 Rendah Sedang vs Tinggi
#Rendah Sedang vs Tinggi
InformationGain(10, 6,6,4)## [1] 0.01997309
Partisi terbaik adalah yang kedua karena mempunyai information gain yang lebih tinggi atau paling besar.
Mencari pemisahan partisi terbaik untuk variabel USIA. Kemungkinan partisi: 1 Usia <= 30 vs Usia>30
#Usia <= 30 vs Usia>30
InformationGain(10, 6,2,1)## [1] 0.007403392
2 Usia <= 35 vs Usia>35
#Usia <= 35 vs Usia>35
InformationGain(10,6,4,1)## [1] 0.2564259
2 Usia <= 40 vs Usia>40
#Usia <= 40 vs Usia>40
InformationGain(10,6,8,4)## [1] NaN
Partisi terbaik adalah yang kedua karena mempunyai information gain yang lebih tinggi atau paling besar.
Tahap 2:
Membandingkan variabel pemisah antara PENDIDIKAN dan USIA.
Terbaik untuk PENDIDIKAN: Rendah Sedang vs Tinggi dengan IG=0.01997309
Terbaik untuk USIA: Usia <= 35 vs Usia>35 dengan IG= 0.2564259
Information Gain tertinggi adalah USIA. Maka dipilih variabel USIA pada partisi pertama.
Tahap 3 Melakukan penyekatan simpul berdasarkan USIA (dengan batas 35 tahun). Ada simpul baru yang diperoleh dan tahap 1,2,3 diulang untuk simpul tersebut.
Optimasi Hyperparameter
Tahapan lain yang perlu dipertimbangkan dalam melakukan model klasifikasi adalah Optimasi Hyperparameter, misalnya minsplit, minbucket, maxdepth.
Dalam optimasi hyperparameter dilakukan proses mengubah nilai minsplit, minbucket, dsb ( mana yang terbaik) pada proses validasi silang untuk memperoleh model dengan akurasi terbaik.
Ukuran akurasi antara lain:
correct rate
sensitivity
specificity
precision
F1-Score
AUC (Area Under ROC Curve)
Pemodelan Prediktif Pohon Klasifikasi
Pada dokumen ini akan dipaparkan bagaimana penggunaan R untuk melakukan pemodelan prediktif menggunakan pohon klasifikasi (classification tree).
Yang akan didiskusikan antara lain adalah:
memperoleh model pohon klasifikasi menggunakan fungsi rpart()
menggambar pohon klasifikasi yang diperoleh
-melakukan prediksi terhadap amatan baru menggunakan model pohon klasifikasi yang telah didapatkan
beberapa hyperparameter dari pohon klasifikasi
optimasi hyperparameter
Import Data
Data yang akan digunakan sebagai ilustrasi adalah data lowbwt.csv yang diperoleh dari buku Applied Logistic Regression karya Hosmer dan Lemeshow.
Data ini memuat variabel-variabel:
id: Identification Code
low: Low birth weight (1: >= 2500, 2: < 2500 g)
age: Age of mother (Years)
lwt: Weight of mother at last menstrual period (Pounds)
race: Race (1: White, 2: Black, 3: Other)
smoke: Smoking status during pregnancy (1: No, 2: Yes)
ptl: History of premature labor (1: None, 2: One, 3: Two, etc)
ht: History of hypertension (1: No, 2: Yes)
ui: Presence of Uterine irritability (1: No, 2: Yes)
ftv: Number of physician visits during the first trimester (1: None, 2: One, 3: Two, etc)
bwt: Recorded birth weight (Grams)
Kita mulai dengan mengimport data menjadi dataframe di R, dengan cara berikut:
data <- read.csv("D:\\Kuliah S2 IPB\\Bahan Kuliah\\Semester 1 SSD 2020\\05 Sains Data\\R\\UAS\\lowbwt.csv", header = TRUE)
head(data)## X id low age lwt race smoke ptl ht ui ftv bwt
## 1 1 4 < 2500 g 28 120 Other Yes One No Yes None 709
## 2 2 10 < 2500 g 29 130 White No None No Yes Two, etc. 1021
## 3 3 11 < 2500 g 34 187 Black Yes None Yes No None 1135
## 4 4 13 < 2500 g 25 105 Other No One Yes No None 1330
## 5 5 15 < 2500 g 25 85 Other No None No Yes None 1474
## 6 6 16 < 2500 g 27 150 Other No None No No None 1588
Model Pohon Klasifikasi
Andaikan saja kita ingin melakukan pemodelan pohon klasifikasi dengan variabel target/respon adalah “low” dan variabel prediktornya: * lwt * smoke * ht * ui
Fungsi yang dapat digunakan untuk memperoleh model pohon klasifikasi adalah rpart() yang ada pada package rpart. Pada fungsi itu kita harus menambahkan opsi method = ‘class’ sehingga fungsi akan mengenali variabel respon sebagai variabel kategorik dan algoritma rpart (recursive partition) akan menghasilkan pohon klasifikasi. Sebagai catatan, untuk variabel respon yang numerik, rpart juga dapat menjalankan algoritma untuk menghasilkan pohon regresi.
Berikut ini program untuk menghasilkan pohon klasifikasinya. Perhatikan cara penulisan modelnya, yang serupa dengan cara penulisan model regresi di fungsi lm() maupun glm() dan fungsi-fungsi lainnya.
Opsi minsplit=30 mengandung pengertian bahwa jika ada node yang berukuran kurang dari 30 amatan maka algoritma dihentikan. Kita pending dulu pembahasan mengenai cp dan akan diskusikan selanjutnya. Sementara ini kita gunakan cp=0.
library(rpart)
pohon <- rpart(low ~ lwt + smoke + ht + ui, data=data,
method='class',
control=rpart.control(minsplit = 30, cp=0))Model yang diperoleh, disimpan dalam objek dengan nama pohon yang kalau dilihat isinya adalah sebagai berikut:
pohon## n= 189
##
## node), split, n, loss, yval, (yprob)
## * denotes terminal node
##
## 1) root 189 59 >= 2500 g (0.3121693 0.6878307)
## 2) lwt< 106 37 17 < 2500 g (0.5405405 0.4594595)
## 4) lwt>=100.5 13 4 < 2500 g (0.6923077 0.3076923) *
## 5) lwt< 100.5 24 11 >= 2500 g (0.4583333 0.5416667) *
## 3) lwt>=106 152 39 >= 2500 g (0.2565789 0.7434211)
## 6) ui=Yes 20 10 < 2500 g (0.5000000 0.5000000) *
## 7) ui=No 132 29 >= 2500 g (0.2196970 0.7803030)
## 14) ht=Yes 10 4 < 2500 g (0.6000000 0.4000000) *
## 15) ht=No 122 23 >= 2500 g (0.1885246 0.8114754) *
Jika kita perhatikan dengan seksama hasil tersebut kita dapat membayangkan bentuknya kira-kira sebagai berikut. Rootnode berisi 189 amatan terbagi menjadi dua dengan aturan apakah lwt<106 atau lwt>106. Node dengan lwt<106 berisi 37 amatan, dan node lwt >=106 berisi 152 amatan.
Selanjutnya node lwt<36 terbagi menjadi dua yaitu apakah lwt>=100 dan lwt<100 yang masing-masing berisi 13 dan 24 amatan. KEduanya tidak lagi terpisah, yang salah satu alasannya karena kita stop dengan opsi minsplit=30. Keduanya berisi kurang dari 30 amatan sehingga tidak dilanjutkan lagi pemisahan oleh rpart dan menjadi terminal node.
Perhatikan angka lain yang diberikan… misal pada root node. Seperti yang diberikan pada baris awal output:
node), split, n, loss, yval, (yprob)
nilai 189 adalah n, nilai 59 adalah frekuensi amatan yang salah klasifikasi, >= 2500 atau yval adalah prediksi pada node tersebut yaitu kelas yang dominan, dan (0.3121693 0.6878307) masing-masing adalah proporsi dari yang “< 2500g” dan “>= 2500 g”. Yang lebih dominan adalah yang “>= 2500 g”, sehingga itu yang muncul pada yval.
Tentu saja akan lebih mudah mengetahui bentuk pohon klasifikasi yang terbentuk dengan cara visualisasi yang lebih baik. Berikut ini akan diberikan salah satu cara menggambar pohon klasifikasi yang telah diperoleh.
Menggambar Pohon Klasifikasi
Fungsi yang dapat digunakan untuk visualisasi pohon klasifikasi adalah rpart.plot() yang ada pada package rpart.plot. Kita tinggal menyebutkan nama modelnya dan opsi nomor pilihan apa saja yang ingin ditampilkan di setiap node.
Opsi extra=4 meminta fungsi menampilkan proporsi dari masing-masing kelas variabel target dan kelas apa yang dominan. Berikut ini ilustrasinya.
#install.packages("rpart.plot")
library(rpart.plot)
rpart.plot(pohon, extra=4)Melakukan Prediksi menggunakan Pohon Klasifikasi
Pohon yang diperoleh selanjutnya dapat digunakan untuk melakukan prediksi kejadian apakah bayi lahir dengan berat badan rendah (< 2500 g) ataukah normal (>= 2500 g).
Misalnya saja ada seorang ibu dengan informasi berikut:
lwt = 140 smoke = “Yes” ht = “No” ui = “No” maka mengikuti pohon yang ada pertama akan dicek apakah lwt<106? Jika ya, ambil jalur kiri. Jika tidak, ambil jalur kanan. Karena lwt = 140 maka berarti ambil jalur kanan.
Selanjutnya ketemu dengan pertanyaan apakah ui=“Yes”? Jika ya, ambil jalur kiri. Jika tidak, ambil jalur kanan. Karena untuk data kita ui=“No”, tidak “Yes”, maka ambil jalur kanan.
Kemudian bertemu dengan pertanyaan apakah ht=“Yes”? Jika ya, ambil jalur kiri. Jika tidak, ambil jalur kanan. Data kita memiliki nilai ht=“No”, maka ambil jalur kanan.
Sekarang kita ketemu dengan terminal node, dan diprediksi memiliki Peluang(< 2500 g) = 0.19 dan Peluang (>= 2500 g) = 0.81. Dengan menggunakan threshold peluang 0.5, amatan ini akan diprediksi memiliki bayi dengan berat tergolong “>= 2500 g” seperti yang ada pada label terminal node-nya.
Terminal node yang berwarna hijau menunjukkan kalau prediksinya adalah “>= 2500 g”. Semakin gelap hijaunya, semakin tinggi peluangnya. Sedangkan untuk kelas sebaliknya, “< 2500 g”, terminal node diberikan warna biru.
Menggunakan R, kita dapat melakukan prediksi menggunakan fungsi predict dengan input nama model dan data yang diprediksi. Pastikan data yang diprediksi berupa dataframe dengan nama-nama variabel sama dengan nama yang ada pada model.
Berikut contoh melakukan prediksi pada individu dengan data lwt = 140, smoke = “Yes”, ht = “No”, ui=“No”.
bayi.baru <- data.frame(lwt = 140, smoke = "Yes", ht = "No", ui="No")
predict(pohon, bayi.baru)## < 2500 g >= 2500 g
## 1 0.1885246 0.8114754
Beberapa hyperparameter dari pohon klasifikasi
Kita telah melihat bagaimana pohon yang dihasilkan pada saat kita gunakan opsi minsplit=30. Minsplit adalah salah satu hyperparameter pada algoritma pohon klasifikasi dan perlu kita tentukan di awal.
Seperti yang telah dijelaskan, minsplit adalah opsi untuk menentukan berapa ukuran node minimal yang diperbolehkan untuk melakukan splitting/pemisahan. Dengan opsi minsplit=30 maka node-node yang berisi kurang dari 30 amatan tidak akan dilanjutkan proses splitting-nya dan algoritma berhenti.
Seandainya nilai minsplit kita perkecil, maka kita akan memperoleh pohon yang lebih kompleks, karena node yang sedikit isinya masih boleh untuk di-split. Berikut tampilan pohon dengan minsplit=10.
pohon10 <- rpart(low ~ lwt + smoke + ht + ui, data=data,
method='class',
control=rpart.control(minsplit = 10, cp=0))
rpart.plot(pohon10, extra=4)Selain minsplit, ada juga beberapa opsi/hyperparameter lain, diantaranya:
Opsi Keterangan
minsplit: the minimum number of observations that must exist in a node in order for a split to be attempted. Default = 20.
minbucket: the minimum number of observations in any terminal node. If only one of minbucket or minsplit is specified, the code either sets minsplit to minbucket*3 or minbucket to minsplit/3, as appropriate.
maxdepth: Set the maximum depth of any node of the final tree, with the root node counted as depth 0. Default = 30.
Optimasi Hyperparameter
Berapa nilai hyperparameter minsplit yang sebaiknya kita gunakan?
Untuk menjawabnya kita bisa menerapkan proses validasi atau validasi silang dengan cara melakukan percobaan beberapa kali pembuatan pohon klasifikasi dengan minsplit yang berbeda dan kita tentukan mana yang optimal.
library(caret)## Loading required package: lattice
set.seed(100)
akurasi.semua <- NULL
for(ulangan in 1:30){
acak <- createDataPartition(data$low, p=0.7, list=FALSE)
data.training <- data[acak,]
data.testing <- data[-acak,]
for (k in 1:40){
pohon <- rpart(low ~ lwt + smoke + ht + ui
+ age +ptl + ftv,
data=data.training,
method='class',
control=rpart.control(minsplit = k, cp=0))
prediksi.prob <- predict(pohon, data.testing)
prediksi <- ifelse(prediksi.prob > 0.5, ">= 2500 g", "< 2500 g")[,2]
akurasi <- mean(prediksi == data.testing$low)
akurasi.semua <- rbind(akurasi.semua, c(k, akurasi))
}
}
mean.akurasi <- tapply(akurasi.semua[,2], akurasi.semua[,1], mean)
plot(names(mean.akurasi),mean.akurasi, type="b", xlab="minsplit", ylab="rata-rata akurasi data testing") Menggunakan rata-rata dari 30 kali ulangan, tampaknya minsplit yang optimal adalah 25.
Karenanya, untuk memperoleh model akhir selanjutnya pada data ini gunakan seluruh data dengan minsplit=25.
Entropy
Entropy dan Information Gain yang berguna dalam proses pembentukan pohon klasifikasi (classification tree).
Ilustrasi Entropy:
Andaikan kita punya sebuah dataset D yang terdiri dari dua kelas (YA dan TIDAK). Persentase YA adalah p1, Persentase TIDAK adalah p2,maka p1 + p2 = 1. Maka Entropy adalah E(D) = -p1log2p1 - p2log2p2
#Fungsi Entropy
entropy <- function(n,n1){
p1 <- n1/n
p2 <- 1-p1
ED <- (-p1*log2(p1))-(p2*log2(p2))
return(ED)
}
#Contoh Penggunaan
entropy(10,9)## [1] 0.4689956
Misalnya:
Entropy nilainya akan semakin besar jika proporsi antara ya dan tidak seimbang atau mendekati setengah. Dengan kata lain, entropy akan semakin kecil jika proporsi antara ya dan tidak mendekati nol atau mendekati 100%.
Bentuk kurva entropy:
Information Gain
Entropy dan Information Gain yang berguna dalam proses pembentukan pohon klasifikasi (classification tree).
Ilustrasi Information Gain:
Andaikan kita punya sebuah dataset D dipecah/disekat/dipartisi menjadi dua bagian, yaitu D1 dan D2. Dari sini kita dapat menghitung entropy untuk masing-masing D, baik untuk dataset D maupun bagian D1 dan D2.
Information Gain adalah selisih antara entropy dataset awal E(D) dengan rata-rata terboboti dari entropi masing-masing bagian yaitu E(D1) dan E(D2).
#Fungsi Information Gain
InformationGain <- function(n.awal,n1.awal, n.bag1, n1.bag1){
p1.awal <- n1.awal/n.awal
p2.awal <- 1-p1.awal
ED.awal <- (-p1.awal*log2(p1.awal))-(p2.awal*log2(p2.awal))
p1.bag1 <- n1.bag1/n.bag1
p2.bag1 <- 1-p1.bag1
ED.bag1 <- (-p1.bag1*log2(p1.bag1))-(p2.bag1*log2(p2.bag1))
n.bag2 <- n.awal- n.bag1
n1.bag2 <- n1.awal- n1.bag1
p1.bag2 <- n1.bag2/n.bag2
p2.bag2 <- 1-p1.bag2
ED.bag2 <- (-p1.bag2*log2(p1.bag2))-(p2.bag2*log2(p2.bag2))
IG <- ED.awal - ((n.bag1/n.awal)*ED.bag1)-((n.bag2/n.awal)*ED.bag2)
return(IG)
}
#contoh:
InformationGain(10, 7,4,2)## [1] 0.09127745
Misalnya:
Information Gain bernilai besar artinya partisi yang dilakukan menghasilkan dataset yang lebih homogen, lebih “pure”.
Ilustrasi:
Information Gain berdasarkan gender lebih besar dibandingkan information gain jika dipartisi berdasarkan kelompok umur. Dengan kata lain, setiap partisi berdasarkan gender memiliki kelas Ya/Tidak lebih homogen. Misalnya, di kelompok perempuan semuanya kelas “Tidak” dan di kelompok laki-laki mayoritas kelas “Ya” (83%).
Information gain dapat menjadi kriteria untuk menentukan partisi terbaik pada proses pembentukan pohon klasifikasi (classification tree).
Referensi
Sartono, B.. (March 28, 2020). Pohon Klasifikasi. Retrieved from https://rpubs.com/bagusco/pohon
Sartono, B.. (September 29, 2020). Pohon Regresi. Retrieved from https://rpubs.com/bagusco/regressiontree
P12 STA581_Sains Data, Mahasiswa Pascasarjana Statistika dan Sains Data,IPB University, reniamelia@apps.ipb.ac.id↩︎